[
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*.{cs,vb}]\ncharset = utf-8\nend_of_line = lf\ncsharp_style_namespace_declarations=file_scoped:suggestion\n\ndotnet_naming_rule.private_or_internal_field_should_be_begin_with__.severity = suggestion\ndotnet_naming_rule.private_or_internal_field_should_be_begin_with__.symbols = private_or_internal_field\ndotnet_naming_rule.private_or_internal_field_should_be_begin_with__.style = begin_with__\n\ndotnet_naming_symbols.private_or_internal_field.applicable_kinds = field\ndotnet_naming_symbols.private_or_internal_field.applicable_accessibilities = internal, private\ndotnet_naming_symbols.private_or_internal_field.required_modifiers = \n\ndotnet_naming_style.begin_with__.required_prefix = _\ndotnet_naming_style.begin_with__.required_suffix = \ndotnet_naming_style.begin_with__.word_separator = \ndotnet_naming_style.begin_with__.capitalization = camel_case\n\n[*.{csproj,props,slnx}]\ncharset = utf-8\nend_of_line = lf\nindent_style = space\nindent_size = 2\n"
  },
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n.editorconfig\ttext eol=lf\n*.cs\ttext eol=lf\n*.csproj\ttext eol=lf\n*.props\ttext eol=lf\n*.sln\ttext eol=lf\n*.slnx\ttext eol=lf\n*.md\ttext eol=lf\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following \n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n# \n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the \n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: ufcpp\n#patreon: # Replace with a single Patreon username\n#open_collective: # Replace with a single Open Collective username\n#ko_fi: # Replace with a single Ko-fi username\n#tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\n#community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\n#liberapay: # Replace with a single Liberapay username\n#issuehunt: # Replace with a single IssueHunt username\n#otechie: # Replace with a single Otechie username\n#custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User-specific files\n*.suo\n*.user\n*.sln.docstates\n*.lock.json\n.vs\nBenchmarkDotNet.Artifacts\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\nbuild/\nbld/\n[Bb]in/\n[Oo]bj/\n\n# Roslyn cache directories\n*.ide/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n#NUNIT\n*.VisualState.xml\nTestResult.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n*_i.c\n*_p.c\n*_i.h\n*.ilk\n*.meta\n*.obj\n*.pch\n*.pdb\n*.pgc\n*.pgd\n*.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opensdf\n*.sdf\n*.cachefile\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding addin-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# TODO: Comment the next line if you want to checkin your web deploy settings \n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# NuGet Packages\n*.nupkg\n# The packages folder can be ignored because of Package Restore\n**/packages/*\n# except build/, which is used as an MSBuild target.\n!**/packages/build/\n# If using the old MSBuild-Integrated Package Restore, uncomment this:\n#!**/packages/repositories.config\n\n# Windows Azure Build Output\ncsx/\n*.build.csdef\n\n# Windows Store app package directory\nAppPackages/\n\n# Others\nsql/\n*.Cache\nClientBin/\n[Ss]tyle[Cc]op.*\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.pfx\n*.publishsettings\nnode_modules/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\n\n# SQL Server files\n*.mdf\n*.ldf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n\n# Microsoft Fakes\nFakesAssemblies/\n"
  },
  {
    "path": "BreakingChanges/.gitignore",
    "content": "*.dll\n"
  },
  {
    "path": "BreakingChanges/BreakingChanges.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22609.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"VS2008_CS3\", \"VS2008_CS3\\VS2008_CS3.csproj\", \"{2C819A49-E770-42EC-A321-32FC4D28E214}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"VS2010_CS4\", \"VS2010_CS4\\VS2010_CS4.csproj\", \"{D18D1AE4-906E-482E-9716-744929638744}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"VS2012_CS5\", \"VS2012_CS5\\VS2012_CS5.csproj\", \"{B1DD6F07-3D4D-4CBD-AB00-BD1CED9741B3}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"VS2015_CS6\", \"VS2015_CS6\\VS2015_CS6.csproj\", \"{77FCE248-EF2D-4D3B-AB10-BC845FA01450}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{2C819A49-E770-42EC-A321-32FC4D28E214}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2C819A49-E770-42EC-A321-32FC4D28E214}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2C819A49-E770-42EC-A321-32FC4D28E214}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2C819A49-E770-42EC-A321-32FC4D28E214}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D18D1AE4-906E-482E-9716-744929638744}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D18D1AE4-906E-482E-9716-744929638744}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D18D1AE4-906E-482E-9716-744929638744}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D18D1AE4-906E-482E-9716-744929638744}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B1DD6F07-3D4D-4CBD-AB00-BD1CED9741B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B1DD6F07-3D4D-4CBD-AB00-BD1CED9741B3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B1DD6F07-3D4D-4CBD-AB00-BD1CED9741B3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B1DD6F07-3D4D-4CBD-AB00-BD1CED9741B3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{77FCE248-EF2D-4D3B-AB10-BC845FA01450}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{77FCE248-EF2D-4D3B-AB10-BC845FA01450}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{77FCE248-EF2D-4D3B-AB10-BC845FA01450}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{77FCE248-EF2D-4D3B-AB10-BC845FA01450}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "BreakingChanges/VS2008_CS3/OverloadResolutionArraysOfPointer.cs",
    "content": "﻿using System.Collections.Generic;\n\n/// <summary>\n/// Changed in VS 2008 SP1\n///\n/// #1 in https://msdn.microsoft.com/en-us/library/cc713578.aspx\n/// Type inference is now included on arrays of pointer types in method overload resolution.\n/// </summary>\nunsafe class OverloadResolutionArraysOfPointer\n{\n    static void Main()\n    {\n        IEnumerable<int*[]> y = null;\n        Test(y);\n    }\n\n    // Selected by Visual C# 2008 SP1.\n    static void Test<S>(IEnumerable<S> x) { System.Console.WriteLine(\"Test<S>(IEnumerable<S> x)\"); }\n\n    // Selected by Visual C# 2005.\n    static void Test(object o) { System.Console.WriteLine(\"Test(object o)\"); }\n}\n"
  },
  {
    "path": "BreakingChanges/VS2008_CS3/ParamsOverride.cs",
    "content": "﻿interface I\n{\n    int this[int[] p] { set; }\n}\n\nclass Base : I\n{\n    // Produces CS0466:\n    int I.this[params int[] p] { set { } }\n}\n\n/// <summary>\n/// Changed in VS 2008 SP1\n/// Can be compiled in: C# 2, 3 (no SP1)\n///\n/// #2 in https://msdn.microsoft.com/en-us/library/cc713578.aspx\n/// Compiler now produces error CS0466 for indexers and properties in addition to methods.\n/// </summary>\n/// <remarks>\n/// For methods, All versions of C# compilers produce CS0466, which meets the specification. This breaking change for indexers is a bug fix.\n/// <code><![CDATA[\n/// interface I\n/// {\n///     void F(int[] p);\n/// }\n/// \n/// class Base : I\n/// {\n///     // Produces CS0466:\n///     void I.F(params int[] p) { }\n/// }\n/// ]]></code>\n///\n/// FYI, it is legal if the indexer is implicitly implemented:\n/// <code><![CDATA[\n/// interface I\n/// {\n///     int this[int[] p] { set; }\n/// }\n/// \n/// class Base : I\n/// {\n///     public int this[params int[] p] { set { } }\n/// }\n/// ]]></code>\n/// </remarks>\nclass ParamsOverride { static void Main() { } }\n"
  },
  {
    "path": "BreakingChanges/VS2008_CS3/VS2008_CS3.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0</TargetFrameworks>\n    <LangVersion>3</LangVersion>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "BreakingChanges/VS2010_CS4/ImplicitConversionCausedByVariance.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\n/// <summary>\n/// Changed in VS 2010\n///\n/// In https://msdn.microsoft.com/en-us/library/vstudio/ee855831.aspx\n/// A new implicit conversion is added for generic interfaces and delegates such as <see cref=\"IEnumerable{T}\"/> and <see cref=\"Func{TResult}\"/>.\n/// </summary>\n/// <remarks>\n/// Type parameter T of <see cref=\"IEnumerable{T}\"/> has been covariant since .NET 4 (VS 2010).\n///\n/// <code><![CDATA[\n/// IEnumerable<string> s;\n///\n/// IEnumerable x = s;         // OK in all versions. IEnumerable<string> is inherited from IEnumerable.\n/// IEnumerable<object> y = s; // OK in .NET 4 or later. string is inherited from object, so IEnumerable<string> can be treated like a subtype of IEnumerable<object> because of covariance.\n/// ]]></code>\n/// </remarks>\nclass ImplicitConversionCausedByVariance\n{\n    public static void Test(IEnumerable e)\n    {\n        Console.WriteLine(\"IEnumerable\");\n    }\n    public static void Test(IEnumerable<object> e)\n    {\n        Console.WriteLine(\"IEnumerable<object>\");\n    }\n    static void Main(string[] args)\n    {\n        Test(new List<string>());\n        // Prints different results.\n        // C# 2008: IEnumerable\n        // C# 2010: IEnumerable<object>\n\n        IEnumerable<string> strings =\n            new List<string>();\n        if (strings is IEnumerable<object>)\n            Console.WriteLine(\"True\");\n        else\n            Console.WriteLine(\"False\");\n        // Prints different results.\n        // C# 2008: False\n        // C# 2010: True\n    }\n}\n"
  },
  {
    "path": "BreakingChanges/VS2010_CS4/VS2010_CS4.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0</TargetFrameworks>\n    <LangVersion>4</LangVersion>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "BreakingChanges/VS2012_CS5/IterationVariableOfForeach.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\n/// <summary>\n/// Changed in VS 2012\n///\n/// In https://msdn.microsoft.com/en-us/library/hh678682(v=vs.110).aspx\n/// You can use the iteration variable of a foreach statement in a lambda expression that’s contained in the body of the loop.\n/// </summary>\nclass IterationVariableOfForeach\n{\n    static void Main()\n    {\n        var methods = new List<Action>();\n        foreach (var word in new string[] { \"hello\", \"world\" })\n        {\n            methods.Add(() => Console.Write(word + \" \"));\n        }\n\n        methods[0]();\n        methods[1]();\n    }\n\n    // Output in Visual Studio 2012: \n    // hello world\n\n    // Output in Visual Studio 2010: \n    // world world\n}\n"
  },
  {
    "path": "BreakingChanges/VS2012_CS5/VS2012_CS5.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0</TargetFrameworks>\n    <LangVersion>5</LangVersion>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "BreakingChanges/VS2015_CS6/CyclicalConstructorChaining.cs",
    "content": "﻿class C\n{\n    public C(int x) : this() { }\n    public C() : this(0) { }\n}\n\n// In C# it is a compile-time error to write a constructor that recursively chains directly to itself\n//class C1\n//{\n//    public C(int x) : this(x + 1) { }\n//}\n\nclass CyclicalConstructorChaining\n{\n    static void Main() { }\n}\n"
  },
  {
    "path": "BreakingChanges/VS2015_CS6/DefiniteAssignment.cs",
    "content": "﻿/// <summary>\n/// Can be compiled in: C# 2, 6\n/// \n/// https://github.com/dotnet/roslyn/blob/master/docs/compilers/CSharp/Definite%20Assignment.md\n/// </summary>\nclass DefiniteAssignment\n{\n    static void Main(string[] args)\n    {\n        int x;\n        if (false && x == 3) // Dev10 does not consider x definitely assigned\n        {\n            x = x + 1;\n        }\n    }\n}\n"
  },
  {
    "path": "BreakingChanges/VS2015_CS6/EnumBaseTypeSystemInt32.cs",
    "content": "﻿enum X : System.Int32\n{\n    A, B, C,\n}\n\n/// <summary>\n/// Can be compiled in: C# 6\n///\n/// Changed: enum base type can be a type expression like System.Int32\n/// </summary>\n/// <remarks>\n/// The ealier versions produce:\n/// error CS1008: Type byte, sbyte, short, ushort, int, uint, long, or ulong expected\n/// </remarks>\nclass EnumBaseTypeSystemInt32 { static void Main() { } }\n"
  },
  {
    "path": "BreakingChanges/VS2015_CS6/FuncOfFuncTypeInference.cs",
    "content": "﻿using System;\n\nclass FuncOfFuncTypeInference\n{\n    static void Main()\n    {\n        X(() => () => 10);\n        Y(() => () => 10);\n    }\n\n    private static int X(Func<Func<int>> f) { return f()(); }\n    private static int X(Func<Func<int?>> f) { return f()() ?? 0; }\n\n    private static int Y(Func<Func<int>> f) { return f()(); }\n    private static double Y(Func<Func<double>> f) { return f()(); }\n}\n"
  },
  {
    "path": "BreakingChanges/VS2015_CS6/InvariantMeaningInBlock.cs",
    "content": "﻿/// <summary>\n/// Can be compiled in: C# 6\n///\n/// https://github.com/dotnet/roslyn/issues/2110\n///\n/// The C# specification had \"invariant meaning\" rule: https://msdn.microsoft.com/en-us/library/aa691351(v=vs.71).aspx\n/// Roslyn has gotten rid of the \"invariant meaning\" rule.\n/// </summary>\nclass InvariantMeaningInBlock\n{\n    double x;\n\n    void F(bool b)\n    {\n        x = 1.0;\n        if (b)\n        {\n            int x;\n            x = 1;\n        }\n    }\n\n#if false\n    // FYI\n    void F1(bool b)\n    {\n        if (b)\n        {\n            int x; // generates CS0136 still in C# 6.0.\n            x = 1;\n        }\n        int x = 1.0;\n    }\n#endif\n\n    static void Main()\n    {\n        var x = new InvariantMeaningInBlock();\n        x.F(true);\n        x.F(false);\n    }\n}\n\n"
  },
  {
    "path": "BreakingChanges/VS2015_CS6/KatakanaMiddleDot.cs",
    "content": "﻿using System;\n\n/// <summary>\n/// Can be compiled in: C# 2, 3, 4, 5\n/// \n/// Breaking Change in C# 6.0, Roslyn new compiler.\n/// Katakana Middle Dot \"・\" (カタカナ中点、中黒、U+30FB) no longer available for identifiers in C# 6.0.\n/// </summary>\n/// <remarks>\n/// Katakana Middle Dot is a Japanese character whose usage is similar to hyphen in English.\n/// Its Unicode class was Pc (Punctuation, Connector) in Unicode 5.1 or older, but it becomes Po (Punctuation, Other).\n/// Pc characters can be used for C# identifiers, but Po cannot.\n/// Looks like Roslyn adopts Unicode 6.0 or newer, so Katakana Middle Dot cannot be used for identifiers in C# 6.0. Java 7 has faced the same problem.\n/// </remarks>\nclass KatakanaMiddleDot\n{\n    static void Main(string[] args)\n    {\n        int x・y = 10;\n        Console.WriteLine(x・y);\n    }\n}"
  },
  {
    "path": "BreakingChanges/VS2015_CS6/VS2015_CS6.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0</TargetFrameworks>\n    <LangVersion>6</LangVersion>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "BreakingChanges/a.cs",
    "content": "﻿using System;\n\ninterface X<in U, out T>\n{\n    Func<U, T> X(Func<T, U> f);\n}\n\nclass P\n{\n    static void Main() { }\n}"
  },
  {
    "path": "BreakingChanges/csc-all.ps1",
    "content": "$sourceCodes = ls *.cs -Recurse | ?{ ($_ -notmatch '\\\\obj\\\\') -and ($_ -notmatch '\\\\Properties\\\\') }\n\nforeach ($src in $sourceCodes)\n{\n    cls\n\n    $x = $src.FullName.Split('\\\\')\n    $name = $x[$x.Length - 2] + '/' + $x[$x.Length - 1]\n    Write-Host $name\n    Write-Host\n\n    .\\read-summary.ps1 $src\n    Write-Host\n\n    .\\csc.ps1 $src\n\n    Write-Host\n    Write-Host [press enter to continue]\n    Read-Host\n}\n\n\n"
  },
  {
    "path": "BreakingChanges/csc.ps1",
    "content": "﻿param([string] $src)\n\n$compilers = @(\n    @{ 'compiler' = $env:windir + '\\Microsoft.NET\\Framework64\\v2.0.50727\\csc.exe'; 'color' = 'DarkCyan' }\n    @{ 'compiler' = $env:windir + '\\Microsoft.NET\\Framework64\\v3.5\\csc.exe'      ; 'color' = 'DarkMagenta' }\n    @{ 'compiler' = $env:windir + '\\Microsoft.NET\\Framework64\\v4.0.30319\\csc.exe'; 'color' = 'DarkGreen' }\n    @{ 'compiler' = ${env:ProgramFiles(x86)} + '\\MSBuild\\12.0\\Bin\\csc.exe'       ; 'color' = 'DarkRed' }\n    @{ 'compiler' = ${env:ProgramFiles(x86)} + '\\MSBuild\\14.0\\Bin\\csc.exe'       ; 'color' = 'DarkYellow' }\n    @{ 'compiler' = ${env:ProgramFiles(x86)} + '\\Microsoft Visual Studio\\2017\\Enterprise\\MSBuild\\15.0\\Bin\\Roslyn\\csc.exe'       ; 'color' = 'DarkBlue' }\n)\n\n$line = '━' * 40\n\nforeach($item in $compilers)\n{\n    . {\n        $line\n\n        . $item.compiler -out:out.exe $src /unsafe+\n\n        if(Test-Path out.exe)\n        {\n            .\\out.exe\n            [void](rm out.exe)\n        }\n    } | Write-Host -ForegroundColor $item.color\n}\n"
  },
  {
    "path": "BreakingChanges/read-summary.ps1",
    "content": "param([string] $src)\n\n$state = 0\n\nGet-Content $src | % {\n    if($state -eq 0)\n    {\n        if($_ -match '\\<summary\\>')\n        {\n            $state = 1\n        }\n    }\n    elseif($state -eq 1)\n    {\n        if($_ -match '\\<\\/summary\\>')\n        {\n            $state = 2\n        }\n        else\n        {\n            $_.Replace('///', '')\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Algorithm.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <Nullable>disable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Algorithm/Algorithm.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.23103.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Algorithm\", \"Algorithm.csproj\", \"{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Algorithm/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Chapters/Algorithm/Collections/ArrayList.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 配列リスト。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  public class ArrayList<T> : IEnumerable<T>\n  {\n    #region フィールド\n\n    T[] data;\n    int count;\n\n    #endregion\n    #region 初期化\n\n    public ArrayList() : this(256) {}\n\n    /// <summary>\n    /// 初期最大容量を指定して初期化。\n    /// </summary>\n    /// <param name=\"capacity\">初期最大容量</param>\n    public ArrayList(int capacity)\n    {\n      this.data = new T[capacity];\n      this.count = 0;\n    }\n\n    #endregion\n    #region プロパティ\n\n    /// <summary>\n    /// 格納されている要素数。\n    /// </summary>\n    public int Count\n    {\n      get { return this.count; }\n    }\n\n    /// <summary>\n    /// i 番目の要素を読み書き。\n    /// </summary>\n    /// <param name=\"i\">読み書き位置</param>\n    /// <returns>読み出した要素</returns>\n    public T this[int i]\n    {\n      get { return this.data[i]; }\n      set { this.data[i] = value; }\n    }\n\n    #endregion\n    #region 挿入・削除\n\n    /// <summary>\n    /// 配列を確保しなおす。\n    /// </summary>\n    /// <remarks>\n    /// 配列長は2倍ずつ拡張していきます。\n    /// </remarks>\n    void Extend()\n    {\n      T[] data = new T[this.data.Length * 2];\n      for (int i = 0; i < this.data.Length; ++i) data[i] = this.data[i];\n      this.data = data;\n    }\n\n    /// <summary>\n    /// i 番目の位置に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"i\">追加位置</param>\n    /// <param name=\"elem\">追加する要素</param>\n    public void Insert(int i, T elem)\n    {\n      if (this.count >= this.data.Length)\n        this.Extend();\n\n      for (int n = this.count; n > i; --n)\n      {\n        this.data[n] = this.data[n - 1];\n      }\n      this.data[i] = elem;\n      ++this.count;\n    }\n\n    /// <summary>\n    /// 末尾に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"elem\">追加する要素</param>\n    public void InsertLast(T elem)\n    {\n      if (this.count >= this.data.Length)\n        this.Extend();\n\n      this.data[this.count] = elem;\n      ++this.count;\n    }\n\n    /// <summary>\n    /// i 番目の要素を削除。\n    /// </summary>\n    /// <param name=\"i\">削除位置</param>\n    public void Erase(int i)\n    {\n      for (int n = i; n < this.count - 1; ++n)\n      {\n        this.data[n] = this.data[n + 1];\n      }\n      --this.count;\n    }\n\n    /// <summary>\n    /// 末尾の要素を削除。\n    /// </summary>\n    public void EraseLast()\n    {\n      --this.count;\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      for (int i = 0; i < this.count; ++i)\n        yield return this.data[i];\n    }\n\n    System.Collections.IEnumerator\n      System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Collections/BinaryTree.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 2分探索木。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  class BinaryTree<T> : ISet<T>\n    where T: IComparable<T>\n  {\n    #region 内部クラス\n\n    /// <summary>\n    /// 2文探索木のノード。\n    /// </summary>\n    public class Node\n    {\n      #region フィールド\n\n      internal T val;\n      internal Node left, right, parent;\n\n      #endregion\n      #region 初期化\n\n      internal Node() : this(default(T), null) { }\n\n      internal Node(T val, Node parent)\n      {\n        this.val = val;\n        this.parent = parent;\n        this.left = this.right = null;\n      }\n\n      #endregion\n      #region プロパティ\n\n      /// <summary>\n      /// 格納している要素を取得。\n      /// </summary>\n      public T Value\n      {\n        get { return this.val; }\n        set { this.val = value; }\n      }\n\n      /// <summary>\n      /// このノードの次のノードを返す。\n      /// （要素の値の小さい順にノードをたどる。）\n      /// </summary>\n      public Node Next\n      {\n        get\n        {\n          Node n = this;\n\n          if (n.right != null)\n            return n.right.Min;\n\n          for (; n.parent != null && n.parent.left != n; n = n.parent) ;\n          return n.parent;\n        }\n      }\n\n      /// <summary>\n      /// このノードの前のノードを返す。\n      /// （要素の値の小さい順にノードをたどる。）\n      /// </summary>\n      public Node Previous\n      {\n        get\n        {\n          Node n = this;\n\n          if (n.left != null)\n            return n.left.Max;\n\n          for (; n.parent != null && n.parent.right != n; n = n.parent) ;\n          return n.parent;\n        }\n      }\n\n      /// <summary>\n      /// このノード以下の部分木中で、最小の要素を持つノード（＝左端ノード）を返す。\n      /// </summary>\n      internal Node Min\n      {\n        get\n        {\n          Node n = this;\n          for (; n.left != null; n = n.left) ;\n          return n;\n        }\n      }\n\n      /// <summary>\n      /// このノード以下の部分木中で、最大の要素を持つノード（＝右端ノード）を返す。\n      /// </summary>\n      internal Node Max\n      {\n        get\n        {\n          Node n = this;\n          for (; n.right != null; n = n.right) ;\n          return n;\n        }\n      }\n\n      #endregion\n      #region デバッグ用\n\n      [System.Diagnostics.Conditional(\"DEBUG\")]\n      virtual public void Output(System.IO.TextWriter writer, int level)\n      {\n        for (int i = 0; i < level; ++i)\n          writer.Write(\"\\t\");\n        writer.Write(\"{0}\\n\", this.val);\n\n        ++level;\n        if (this.left != null) this.left.Output(writer, level);\n        else\n        {\n          for (int i = 0; i < level; ++i)\n            writer.Write(\"\\t\");\n          writer.Write(\"null\\n\");\n        }\n        if (this.right != null) this.right.Output(writer, level);\n        else\n        {\n          for (int i = 0; i < level; ++i)\n            writer.Write(\"\\t\");\n          writer.Write(\"null\\n\");\n        }\n      }\n\n      #endregion\n    }\n\n    #endregion\n    #region フィールド\n\n    /// <summary>\n    /// 根ノード。\n    /// </summary>\n    Node root;\n\n    #endregion\n    #region 初期化\n\n    public BinaryTree()\n    {\n      this.root = null;\n    }\n\n    #endregion\n    #region プロパティ\n\n    /// <summary>\n    /// 木構造を逐次探索する際の始点。\n    /// </summary>\n    public Node Begin\n    {\n      get\n      {\n        if (this.root == null)\n          return this.End;\n        return this.root.Min;\n      }\n    }\n\n    /// <summary>\n    /// 木構造を逐次探索する際の終端（末尾よりも後ろの番兵に当たるノード）。\n    /// </summary>\n    public Node End\n    {\n      get { return null; }\n    }\n\n    #endregion\n    #region 要素の挿入・削除・検索\n\n    /// <summary>\n    /// 新しい要素を挿入する。\n    /// </summary>\n    /// <param name=\"elem\">新しい要素</param>\n    /// <returns>新しい要素を格納するノード</returns>\n    public void Insert(T elem)\n    {\n      if (this.root == null)\n      {\n        this.root = new Node(elem, null);\n        return;\n      }\n\n      Node n = this.root;\n      Node p = null;\n      while (n != null)\n      {\n        p = n;\n        if (n.val.CompareTo(elem) > 0) n = n.left;\n        else n = n.right;\n      }\n\n      n = new Node(elem, p);\n      if (p.val.CompareTo(elem) > 0) p.left = n;\n      else p.right = n;\n    }\n\n    /// <summary>\n    /// n の片方の子は null、もう片方の子は m という前提の元で、\n    /// ノード n の位置を子ノード m で置き換える。\n    /// </summary>\n    /// <param name=\"n\">削除するノード</param>\n    /// <param name=\"m\">置き換える子ノード</param>\n    void Replace(Node n, Node m)\n    {\n      Node p = n.parent;\n      if (m != null) m.parent = p;\n      if (n == this.root) this.root = m;\n      else if (p.left == n) p.left = m;\n      else p.right = m;\n    }\n\n    /// <summary>\n    /// ノード n を削除する。\n    /// </summary>\n    /// <param name=\"n\">削除したいノード</param>\n    public void Erase(Node n)\n    {\n      if (n == null) return;\n\n      if (n.left == null) this.Replace(n, n.right);\n      else if(n.right == null) this.Replace(n, n.left);\n      else\n      {\n        Node m = n.right.Min;\n        n.Value = m.Value;\n        this.Replace(m, m.right);\n      }\n    }\n\n    /// <summary>\n    /// 要素を削除する。\n    /// </summary>\n    /// <param name=\"elem\">削除したい要素</param>\n    public void Erase(T elem)\n    {\n      this.Erase(this.Find(elem));\n    }\n\n    /// <summary>\n    /// ある値を持つノードを検索。\n    /// (同じ値が複数ある場合、最初のノード。)\n    /// 見つからなかった場合は null を返す。\n    /// </summary>\n    /// <param name=\"elem\">探したい要素</param>\n    /// <returns>見つけたノード</returns>\n    public Node Find(T elem)\n    {\n      Node n = this.root;\n      while (n != null)\n      {\n        if (n.val.CompareTo(elem) > 0) n = n.left;\n        else if (n.val.CompareTo(elem) < 0) n = n.right;\n        else break;\n      }\n      return n;\n    }\n\n    public bool Contains(T elem)\n    {\n      return this.Find(elem) != this.End;\n    }\n\n    /// <summary>\n    /// ある値のノードを検索。\n    /// （同じ値を持つノード全部を IEnumerable で一覧として返す。）\n    /// </summary>\n    /// <param name=\"elem\">探したい要素</param>\n    /// <returns>見つけたノード一覧</returns>\n    public IEnumerable<T> FindRange(T elem)\n    {\n      for (Node n = this.Find(elem); n != this.End && n.Value.CompareTo(elem) == 0; n = n.Next)\n        yield return n.Value;\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      for (Node n = this.Begin; n != this.End; n = n.Next)\n        yield return n.Value;\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n    #region デバッグ用\n\n    [System.Diagnostics.Conditional(\"DEBUG\")]\n    public void Output(System.IO.TextWriter writer)\n    {\n      if (this.root != null)\n        this.root.Output(writer, 0);\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Collections/CircularBuffer.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 循環バッファ。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  public class CircularBuffer<T> : IEnumerable<T>\n  {\n    #region フィールド\n\n    T[] data;\n    int top, bottom;\n    int mask;\n\n    #endregion\n    #region 初期化\n\n    public CircularBuffer() : this(256) {}\n\n    /// <summary>\n    /// 初期最大容量を指定して初期化。\n    /// </summary>\n    /// <param name=\"capacity\">初期最大容量</param>\n    public CircularBuffer(int capacity)\n    {\n      capacity = Pow2((uint)capacity);\n      this.data = new T[capacity];\n      this.top = this.bottom = 0;\n      this.mask = capacity - 1;\n    }\n\n    static int Pow2(uint n)\n    {\n      --n;\n      int p = 0;\n      for (; n != 0; n >>= 1) p = (p << 1) + 1;\n      return p + 1;\n    }\n\n    #endregion\n    #region プロパティ\n\n    /// <summary>\n    /// 格納されている要素数。\n    /// </summary>\n    public int Count\n    {\n      get\n      {\n        int count = this.bottom - this.top;\n        if (count < 0) count += this.data.Length;\n        return count;\n      }\n    }\n\n    /// <summary>\n    /// i 番目の要素を読み書き。\n    /// </summary>\n    /// <param name=\"i\">読み書き位置</param>\n    /// <returns>読み出した要素</returns>\n    public T this[int i]\n    {\n      get { return this.data[(i + this.top) & this.mask]; }\n      set { this.data[(i + this.top) & this.mask] = value; }\n    }\n\n    #endregion\n    #region 挿入・削除\n\n    /// <summary>\n    /// 配列を確保しなおす。\n    /// </summary>\n    /// <remarks>\n    /// 配列長は2倍ずつ拡張していきます。\n    /// </remarks>\n    void Extend()\n    {\n      T[] data = new T[this.data.Length * 2];\n      int i = 0;\n      foreach (T elem in this)\n      {\n        data[i] = elem;\n        ++i;\n      }\n      this.top = 0;\n      this.bottom = this.Count;\n      this.data = data;\n      this.mask = data.Length - 1;\n    }\n\n    /// <summary>\n    /// i 番目の位置に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"i\">追加位置</param>\n    /// <param name=\"elem\">追加する要素</param>\n    public void Insert(int i, T elem)\n    {\n      if (this.Count >= this.data.Length - 1)\n        this.Extend();\n\n      if (i < this.Count / 2)\n      {\n        for (int n = 0; n <= i; ++n)\n        {\n          this[n - 1] = this[n];\n        }\n        this.top = (this.top - 1) & this.mask;\n        this[i] = elem;\n      }\n      else\n      {\n        for (int n = this.Count; n > i; --n)\n        {\n          this[n] = this[n - 1];\n        }\n        this[i] = elem;\n        this.bottom = (this.bottom + 1) & this.mask;\n      }\n    }\n\n    /// <summary>\n    /// 先頭に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"elem\">追加する要素</param>\n    public void InsertFirst(T elem)\n    {\n      if (this.Count >= this.data.Length - 1)\n        this.Extend();\n\n      this.top = (this.top - 1) & this.mask;\n      this.data[this.top] = elem;\n    }\n\n    /// <summary>\n    /// 末尾に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"elem\">追加する要素</param>\n    public void InsertLast(T elem)\n    {\n      if (this.Count >= this.data.Length - 1)\n        this.Extend();\n\n      this.data[this.bottom] = elem;\n      this.bottom = (this.bottom + 1) & this.mask;\n    }\n\n    /// <summary>\n    /// i 番目の要素を削除。\n    /// </summary>\n    /// <param name=\"i\">削除位置</param>\n    public void Erase(int i)\n    {\n      for (int n = i; n < this.Count - 1; ++n)\n      {\n        this[n] = this[n + 1];\n      }\n      this.bottom = (this.bottom - 1) & this.mask;\n    }\n\n    /// <summary>\n    /// 先頭の要素を削除。\n    /// </summary>\n    public void EraseFirst()\n    {\n      this.top = (this.top + 1) & this.mask;\n    }\n\n    /// <summary>\n    /// 末尾の要素を削除。\n    /// </summary>\n    public void EraseLast()\n    {\n      this.bottom = (this.bottom - 1) & this.mask;\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      if (this.top <= this.bottom)\n      {\n        for (int i = this.top; i < this.bottom; ++i)\n          yield return this.data[i];\n      }\n      else\n      {\n        for (int i = this.top; i < this.data.Length; ++i)\n          yield return this.data[i];\n        for (int i = 0; i < this.bottom; ++i)\n          yield return this.data[i];\n      }\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Collections/Dictionary.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 辞書。\n  /// </summary>\n  /// <typeparam name=\"TKey\">鍵の型</typeparam>\n  /// <typeparam name=\"TValue\">値の型</typeparam>\n  public interface IDictionary<TKey, TValue>\n    : IEnumerable<KeyValuePair<TKey, TValue>>\n  {\n    /// <summary>\n    /// 新しい要素の挿入。\n    /// </summary>\n    /// <param name=\"key\">新しい要素の鍵</param>\n    /// <param name=\"elem\">新しい要素の値</param>\n    void Insert(TKey key, TValue val);\n\n    /// <summary>\n    /// 要素の削除。\n    /// </summary>\n    /// <param name=\"elem\">削除したい要素</param>\n    void Erase(TKey key);\n\n    /// <summary>\n    /// 要素を含むかどうか。\n    /// </summary>\n    /// <param name=\"elem\">検索したい要素</param>\n    /// <returns>見つかった場合 true</returns>\n    bool Contains(TKey key);\n\n    /// <summary>\n    /// [] を使って値を取り出す。\n    /// </summary>\n    /// <param name=\"key\">鍵</param>\n    /// <returns>値</returns>\n    TValue this[TKey key]\n    {\n      set;\n      get;\n    }\n\n    /// <summary>\n    /// 鍵一覧取得\n    /// </summary>\n    IEnumerable<TKey> Keys { get; }\n\n    /// <summary>\n    /// 値一覧取得\n    /// </summary>\n    IEnumerable<TValue> Values { get; }\n  }\n\n  /// <summary>\n  /// 辞書のエントリー。\n  /// </summary>\n  /// <typeparam name=\"TKey\">鍵の型</typeparam>\n  /// <typeparam name=\"TValue\">値の型</typeparam>\n  internal class Entry<TKey, TValue>\n  {\n    internal TKey key;\n    internal TValue val;\n\n    internal Entry(TKey key) : this(key, default(TValue)) { }\n\n    internal Entry(TKey key, TValue val)\n    {\n      this.key = key;\n      this.val = val;\n    }\n\n    #region object メンバ\n\n    public override int GetHashCode()\n    {\n      return this.key.GetHashCode();\n    }\n\n    public override bool Equals(object obj)\n    {\n      Entry<TKey, TValue> ent = obj as Entry<TKey, TValue>;\n      if (ent == null) return false;\n      return this.key.Equals(ent.key);\n    }\n\n    #endregion\n  }\n\n  /// <summary>\n  /// 辞書のエントリー。\n  /// （SortedArray, Tree 用）\n  /// 鍵が IComparable を実装している必要あり。\n  /// </summary>\n  /// <typeparam name=\"TKey\">鍵の型</typeparam>\n  /// <typeparam name=\"TValue\">値の型</typeparam>\n  internal class ComparableEntry<TKey, TValue>\n    : Entry<TKey, TValue>,\n    IComparable<ComparableEntry<TKey, TValue>>\n    where TKey : IComparable<TKey>\n  {\n    internal ComparableEntry(TKey key) : base(key) { }\n    internal ComparableEntry(TKey key, TValue val) : base(key, val) { }\n\n    #region IComparable<ComparableEntry<TKey,TValue>> メンバ\n\n    public int CompareTo(ComparableEntry<TKey, TValue> other)\n    {\n      return this.key.CompareTo(other.key);\n    }\n\n    #endregion\n  }\n\n  public class HashDictionary<TKey, TValue> : IDictionary<TKey, TValue>\n  {\n    #region フィールド\n\n    HashTable<Entry<TKey, TValue>> table;\n\n    #endregion\n    #region 初期化\n\n    public HashDictionary() : this(256) { }\n\n    public HashDictionary(int capacity)\n    {\n      this.table = new HashTable<Entry<TKey, TValue>>(capacity);\n    }\n\n    #endregion\n    #region IDictionary<TKey,TValue> メンバ\n\n    public void Insert(TKey key, TValue val)\n    {\n      this.table.Insert(new Entry<TKey, TValue>(key, val));\n    }\n\n    public void Erase(TKey key)\n    {\n      this.table.Erase(new Entry<TKey, TValue>(key));\n    }\n\n    public bool Contains(TKey key)\n    {\n      return this.table.Contains(new Entry<TKey, TValue>(key));\n    }\n\n    public TValue this[TKey key]\n    {\n      get\n      {\n        Entry<TKey, TValue> entry = this.table.Find(new Entry<TKey, TValue>(key));\n        if (entry == null) return default(TValue);\n        return entry.val;\n      }\n      set\n      {\n        Entry<TKey, TValue> entry = this.table.Find(new Entry<TKey, TValue>(key));\n        if (entry == null) this.Insert(key, value);\n        else entry.val = value;\n      }\n    }\n\n    public IEnumerable<TKey> Keys\n    {\n      get\n      {\n        foreach (Entry<TKey, TValue> ent in this.table)\n        {\n          yield return ent.key;\n        }\n      }\n    }\n\n    public IEnumerable<TValue> Values\n    {\n      get\n      {\n        foreach (Entry<TKey, TValue> ent in this.table)\n        {\n          yield return ent.val;\n        }\n      }\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()\n    {\n      foreach (Entry<TKey, TValue> ent in this.table)\n      {\n        yield return new KeyValuePair<TKey, TValue>(ent.key, ent.val);\n      }\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n\n  public class SortedDictionary<TKey, TValue> : IDictionary<TKey, TValue>\n    where TKey : IComparable<TKey>\n  {\n    #region フィールド\n\n    SortedArray<ComparableEntry<TKey, TValue>> table;\n\n    #endregion\n    #region 初期化\n\n    public SortedDictionary() : this(256) { }\n\n    public SortedDictionary(int capacity)\n    {\n      this.table = new SortedArray<ComparableEntry<TKey, TValue>>(capacity);\n    }\n\n    #endregion\n    #region IDictionary<TKey,TValue> メンバ\n\n    public void Insert(TKey key, TValue val)\n    {\n      this.table.Insert(new ComparableEntry<TKey, TValue>(key, val));\n    }\n\n    public void Erase(TKey key)\n    {\n      this.table.Erase(new ComparableEntry<TKey, TValue>(key));\n    }\n\n    public bool Contains(TKey key)\n    {\n      return this.table.Contains(new ComparableEntry<TKey, TValue>(key));\n    }\n\n    public TValue this[TKey key]\n    {\n      get\n      {\n        ComparableEntry<TKey, TValue> entry = this.table.Find(new ComparableEntry<TKey, TValue>(key));\n        if (entry == null) return default(TValue);\n        return entry.val;\n      }\n      set\n      {\n        ComparableEntry<TKey, TValue> entry = this.table.Find(new ComparableEntry<TKey, TValue>(key));\n        if (entry == null) this.Insert(key, value);\n        else entry.val = value;\n      }\n    }\n\n    public IEnumerable<TKey> Keys\n    {\n      get\n      {\n        foreach (Entry<TKey, TValue> ent in this.table)\n        {\n          yield return ent.key;\n        }\n      }\n    }\n\n    public IEnumerable<TValue> Values\n    {\n      get\n      {\n        foreach (Entry<TKey, TValue> ent in this.table)\n        {\n          yield return ent.val;\n        }\n      }\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()\n    {\n      foreach (Entry<TKey, TValue> ent in this.table)\n      {\n        yield return new KeyValuePair<TKey, TValue>(ent.key, ent.val);\n      }\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n\n  public class TreeDictionary<TKey, TValue> : IDictionary<TKey, TValue>\n    where TKey : IComparable<TKey>\n  {\n    #region フィールド\n\n    BinaryTree<ComparableEntry<TKey, TValue>> table;\n\n    #endregion\n    #region 初期化\n\n    public TreeDictionary()\n    {\n      this.table = new BinaryTree<ComparableEntry<TKey, TValue>>();\n    }\n\n    #endregion\n    #region IDictionary<TKey,TValue> メンバ\n\n    public void Insert(TKey key, TValue val)\n    {\n      this.table.Insert(new ComparableEntry<TKey, TValue>(key, val));\n    }\n\n    public void Erase(TKey key)\n    {\n      this.table.Erase(new ComparableEntry<TKey, TValue>(key));\n    }\n\n    public bool Contains(TKey key)\n    {\n      return this.table.Contains(new ComparableEntry<TKey, TValue>(key));\n    }\n\n    public TValue this[TKey key]\n    {\n      get\n      {\n        BinaryTree<ComparableEntry<TKey, TValue>>.Node node\n          = this.table.Find(new ComparableEntry<TKey, TValue>(key));\n        if (node == null) return default(TValue);\n        return node.Value.val;\n      }\n      set\n      {\n        BinaryTree<ComparableEntry<TKey, TValue>>.Node node\n          = this.table.Find(new ComparableEntry<TKey, TValue>(key));\n        if (node == null) this.Insert(key, value);\n        else node.Value.val = value;\n      }\n    }\n\n    public IEnumerable<TKey> Keys\n    {\n      get\n      {\n        foreach (Entry<TKey, TValue> ent in this.table)\n        {\n          yield return ent.key;\n        }\n      }\n    }\n\n    public IEnumerable<TValue> Values\n    {\n      get\n      {\n        foreach (Entry<TKey, TValue> ent in this.table)\n        {\n          yield return ent.val;\n        }\n      }\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()\n    {\n      foreach (Entry<TKey, TValue> ent in this.table)\n      {\n        yield return new KeyValuePair<TKey, TValue>(ent.key, ent.val);\n      }\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Collections/ForwardLinkedList.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 片方向連結リスト。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  public class ForwardLinkedList<T> : IEnumerable<T>\n  {\n    #region 内部クラス\n\n    /// <summary>\n    /// 片方向連結リストのノード。\n    /// </summary>\n    public class Node\n    {\n      #region フィールド\n\n      T val;\n      Node next;\n\n      #endregion\n      #region 初期化\n\n      internal Node(T val, Node next)\n      {\n        this.val = val;\n        this.next = next;\n      }\n\n      #endregion\n      #region プロパティ\n\n      /// <summary>\n      /// 格納している要素を取得。\n      /// </summary>\n      public T Value\n      {\n        get { return this.val; }\n        set { this.val = value; }\n      }\n\n      /// <summary>\n      /// 次のノード。\n      /// </summary>\n      public Node Next\n      {\n        get { return this.next; }\n        internal set { this.next = value; }\n      }\n\n      #endregion\n    }\n\n    #endregion\n    #region フィールド\n\n    Node first;\n\n    #endregion\n    #region 初期化\n\n    public ForwardLinkedList()\n    {\n      this.first = null;\n    }\n\n    #endregion\n    #region プロパティ\n\n    /// <summary>\n    /// リストの先頭ノード。\n    /// </summary>\n    public Node First\n    {\n      get { return this.first; }\n    }\n\n    /// <summary>\n    /// 要素の個数。\n    /// </summary>\n    public int Count\n    {\n      get\n      {\n        int i = 0;\n        for(Node n = this.first; n!=null; n=n.Next)\n          ++i;\n        return i;\n      }\n    }\n\n    #endregion\n      #region 挿入・削除\n\n      /// <summary>\n      /// ノード n の後ろに新しい要素を追加。\n      /// </summary>\n      /// <param name=\"n\">要素の挿入位置</param>\n      /// <param name=\"elem\">新しい要素</param>\n      /// <returns>新しく挿入されたノード</returns>\n      public Node InsertAfter(Node n, T elem)\n    {\n      Node m = new Node(elem, n.Next);\n      n.Next = m;\n      return m;\n    }\n\n    /// <summary>\n    /// 先頭に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"elem\">新しい要素</param>\n    /// <returns>新しく挿入されたノード</returns>\n    public Node InsertFirst(T elem)\n    {\n      Node m = new Node(elem, this.first);\n      this.first = m;\n      return m;\n    }\n\n    /// <summary>\n    /// ノード n の後ろの要素を削除。\n    /// </summary>\n    /// <param name=\"n\">要素の削除位置</param>\n    public void EraseAfter(Node n)\n    {\n      if (n != null && n.Next != null)\n        n.Next = n.Next.Next;\n    }\n\n    /// <summary>\n    /// ノード n の自身を削除。\n    /// </summary>\n    /// <param name=\"n\">要素の削除位置</param>\n    /// <returns>削除した要素の次のノード</returns>\n    public Node Erase(Node n)\n    {\n      Node prev = this.first;\n      for (; prev != null && prev.Next != n; prev = prev.Next) ;\n      if (prev == this.first)\n      {\n        this.first = null;\n        return null;\n      }\n      if (prev != null)\n      {\n        this.EraseAfter(prev);\n        return prev.Next;\n      }\n      return null;\n    }\n\n    /// <summary>\n    /// 先頭の要素を削除。\n    /// </summary>\n    public void EraseFirst()\n    {\n      if (this.first != null)\n        this.first = this.first.Next;\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      for (Node n = this.first; n != null; n = n.Next)\n        yield return n.Value;\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Collections/HashTable.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Collections\n{\n  /// <summary>\n  /// ハッシュテーブル。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  class HashTable<T> : ISet<T>\n  {\n    #region 内部クラス\n\n    class Node\n    {\n      internal T val;\n      internal Node next;\n\n      internal Node(T val, Node next)\n      {\n        this.val = val;\n        this.next = next;\n      }\n    }\n\n    #endregion\n    #region フィールド\n\n    Node[] table;\n    int mask;\n\n    #endregion\n    #region 初期化\n\n    public HashTable() : this(256) { }\n\n    public HashTable(int capacity)\n    {\n      capacity = Pow2((uint)capacity);\n      this.mask = capacity - 1;\n      this.table = new Node[capacity];\n    }\n\n    static int Pow2(uint n)\n    {\n      --n;\n      int p = 0;\n      for (; n != 0; n >>= 1) p = (p << 1) + 1;\n      return p + 1;\n    }\n\n    #endregion\n    #region 挿入・削除・検索\n\n    /// <summary>\n    /// 要素の挿入。\n    /// </summary>\n    /// <param name=\"elem\">挿入する要素</param>\n    public void Insert(T elem)\n    {\n      int code = elem.GetHashCode() & this.mask;\n      Node n = this.table[code];\n      Node m = new Node(elem, n);\n      m.next = n;\n      this.table[code] = m;\n    }\n\n    /// <summary>\n    /// 要素の削除。\n    /// </summary>\n    /// <param name=\"elem\">削除する要素</param>\n    public void Erase(T elem)\n    {\n      int code = elem.GetHashCode() & this.mask;\n      Node n = this.table[code];\n\n      if (n == null) return;\n      if (n.next == null)\n        this.table[code] = null;\n\n      while (n.next != null && n.next.val.Equals(elem)) n = n.next;\n      if(n.next != null)\n        n.next = n.next.next;\n    }\n\n    /// <summary>\n    /// テーブル中に要素が含まれているかどうか判別。\n    /// </summary>\n    /// <param name=\"elem\">探したい要素</param>\n    /// <returns>含まれていれば true</returns>\n    public bool Contains(T elem)\n    {\n      int code = elem.GetHashCode() & this.mask;\n      Node n = this.table[code];\n      while (n != null && !n.val.Equals(elem)) n = n.next;\n      return n != null;\n    }\n\n    /// <summary>\n    /// テーブル中の要素を検索。\n    /// </summary>\n    /// <param name=\"elem\">探したい要素</param>\n    /// <returns>含まれていればその要素を、なければ default(T)</returns>\n    public T Find(T elem)\n    {\n      int code = elem.GetHashCode();\n      Node n = this.table[code & this.mask];\n      while (n != null && !n.val.Equals(elem)) n = n.next;\n      if (n == null) return default(T);\n      return n.val;\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      for (int i = 0; i < this.table.Length; ++i)\n        for (Node n = this.table[i]; n != null; n = n.next)\n          yield return n.val;\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Collections/LinkedList.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 双方向連結リスト。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  public class LinkedList<T> : IEnumerable<T>\n  {\n    #region 内部クラス\n\n    /// <summary>\n    /// 連結リストのノード。\n    /// </summary>\n    public class Node\n    {\n      #region フィールド\n\n      T val;\n      Node prev;\n      Node next;\n\n      #endregion\n      #region 初期化\n\n      internal Node(T val, Node prev, Node next)\n      {\n        this.val = val;\n        this.prev = prev;\n        this.next = next;\n      }\n\n      #endregion\n      #region プロパティ\n\n      /// <summary>\n      /// 格納している要素を取得。\n      /// </summary>\n      public T Value\n      {\n        get { return this.val; }\n        set { this.val = value; }\n      }\n\n      /// <summary>\n      /// 次のノード。\n      /// </summary>\n      public Node Next\n      {\n        get { return this.next; }\n        internal set { this.next = value; }\n      }\n\n      /// <summary>\n      /// 次のノード。\n      /// </summary>\n      public Node Previous\n      {\n        get { return this.prev; }\n        internal set { this.prev = value; }\n      }\n\n      #endregion\n    }\n\n    #endregion\n    #region フィールド\n\n    Node dummy;\n\n    #endregion\n    #region 初期化\n\n    public LinkedList()\n    {\n      this.dummy = new Node(default(T), null, null);\n      this.dummy.Next = this.dummy;\n      this.dummy.Previous = this.dummy;\n    }\n\n    #endregion\n    #region プロパティ\n\n    /// <summary>\n    /// リストの先頭ノード。\n    /// </summary>\n    public Node First\n    {\n      get { return this.dummy.Next; }\n    }\n\n    /// <summary>\n    /// リストの末尾ノード。\n    /// </summary>\n    public Node Last\n    {\n      get { return this.dummy.Previous; }\n    }\n\n    /// <summary>\n    /// リストの終端（末尾よりも後ろの番兵に当たるノード）。\n    /// </summary>\n    public Node End\n    {\n      get { return this.dummy; }\n    }\n\n    /// <summary>\n    /// 要素の個数。\n    /// </summary>\n    public int Count\n    {\n      get\n      {\n        int i = 0;\n        for (Node n = this.First; n != this.End; n = n.Next)\n          ++i;\n        return i;\n      }\n    }\n\n    #endregion\n    #region 挿入・削除\n\n    /// <summary>\n    /// ノード n の後ろに新しい要素を追加。\n    /// </summary>\n    /// <param name=\"n\">要素の挿入位置</param>\n    /// <param name=\"elem\">新しい要素</param>\n    /// <returns>新しく挿入されたノード</returns>\n    public Node InsertAfter(Node n, T elem)\n    {\n      Node m = new Node(elem, n, n.Next);\n      n.Next.Previous = m;\n      n.Next = m;\n      return m;\n    }\n\n    /// <summary>\n    /// ノード n の前に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"n\">要素の挿入位置</param>\n    /// <param name=\"elem\">新しい要素</param>\n    /// <returns>新しく挿入されたノード</returns>\n    public Node InsertBefore(Node n, T elem)\n    {\n      Node m = new Node(elem, n.Previous, n);\n      n.Previous.Next = m;\n      n.Previous = m;\n      return m;\n    }\n\n    /// <summary>\n    /// 先頭に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"elem\">新しい要素</param>\n    /// <returns>新しく挿入されたノード</returns>\n    public Node InsertFirst(T elem)\n    {\n      return this.InsertAfter(this.dummy, elem);\n    }\n\n    /// <summary>\n    /// 末尾に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"elem\">新しい要素</param>\n    /// <returns>新しく挿入されたノード</returns>\n    public Node InsertLast(T elem)\n    {\n      return this.InsertBefore(this.dummy, elem);\n    }\n\n    /// <summary>\n    /// ノード n の自身を削除。\n    /// </summary>\n    /// <param name=\"n\">要素の削除位置</param>\n    /// <returns>削除した要素の次のノード</returns>\n    public Node Erase(Node n)\n    {\n      if (n == this.dummy)\n      {\n        return this.dummy;\n      }\n      n.Previous.Next = n.Next;\n      n.Next.Previous = n.Previous;\n      return n.Next;\n    }\n\n    /// <summary>\n    /// 先頭の要素を削除。\n    /// </summary>\n    public void EraseFirst()\n    {\n      this.Erase(this.First);\n    }\n\n    /// <summary>\n    /// 末尾の要素を削除。\n    /// </summary>\n    public void EraseLast()\n    {\n      this.Erase(this.Last);\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      for (Node n = this.First; n != this.End; n = n.Next)\n        yield return n.Value;\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Collections/PriorityQueue.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 優先度付き待ち行列\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  class PriorityQueue<T>\n    where T : IComparable<T>\n  {\n    #region フィールド\n\n    ArrayList<T> buffer;\n\n    #endregion\n    #region 初期化\n\n    public PriorityQueue() { this.buffer = new ArrayList<T>(); }\n    public PriorityQueue(int capacity) { this.buffer = new ArrayList<T>(capacity); }\n\n    #endregion\n    #region ヒープ操作\n\n    /// <summary>\n    /// ヒープ化されている配列リストに新しい要素を追加する。\n    /// </summary>\n    /// <param name=\"array\">対象の配列リスト</param>\n    static void PushHeap(ArrayList<T> array, T elem)\n    {\n      int n = array.Count;\n      array.InsertLast(elem);\n\n      while (n != 0)\n      {\n        int i = (n - 1) / 2;\n        if (array[n].CompareTo(array[i]) > 0)\n        {\n          T tmp = array[n]; array[n] = array[i]; array[i] = tmp;\n        }\n        n = i;\n      }\n    }\n\n    /// <summary>\n    /// ヒープから最大値を削除する。\n    /// </summary>\n    /// <param name=\"array\">対象の配列リスト</param>\n    static void PopHeap(ArrayList<T> array)\n    {\n      int n = array.Count - 1;\n      array[0] = array[n];\n      array.EraseLast();\n\n      for (int i = 0, j; (j = 2 * i + 1) < n; )\n      {\n        if ((j != n - 1) && (array[j].CompareTo(array[j + 1]) < 0))\n          j++;\n        if (array[i].CompareTo(array[j]) < 0)\n        {\n          T tmp = array[j]; array[j] = array[i]; array[i] = tmp;\n        }\n        i = j;\n      }\n    }\n\n    #endregion\n    #region 要素の挿入・削除\n\n    /// <summary>\n    /// 要素のプッシュ。\n    /// </summary>\n    /// <param name=\"elem\">挿入したい要素</param>\n    public void Push(T elem)\n    {\n      PushHeap(this.buffer, elem);\n    }\n\n    /// <summary>\n    /// 要素を1つポップ。\n    /// </summary>\n    /// <remarks>\n    /// 今回の実装では、先頭要素の読み出しと削除は別に行う。\n    /// この Pop では削除のみ。\n    /// 読み出しには Top プロパティを使う。\n    /// </remarks>\n    public void Pop()\n    {\n      PopHeap(this.buffer);\n    }\n\n    /// <summary>\n    /// 先頭要素の読み出し。\n    /// </summary>\n    public T Top\n    {\n      get { return this.buffer[0]; }\n    }\n\n    public int Count\n    {\n      get { return this.buffer.Count; }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Collections/Queue.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Collections\n{\n  /// <summary>\n  /// スタック（FILOバッファ）。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  class Queue<T>\n  {\n    #region フィールド\n\n    CircularBuffer<T> buffer;\n\n    #endregion\n    #region 初期化\n\n    public Queue() { this.buffer = new CircularBuffer<T>(); }\n    public Queue(int capacity) { this.buffer = new CircularBuffer<T>(capacity); }\n\n    #endregion\n    #region 要素の挿入・削除\n\n    /// <summary>\n    /// 要素のエンキュー。\n    /// </summary>\n    /// <param name=\"elem\">挿入したい要素</param>\n    /// <remarks>\n    /// 名前は Stack に合わせて Push にしてある。\n    /// </remarks>\n    public void Push(T elem)\n    {\n      this.buffer.InsertLast(elem);\n    }\n\n    /// <summary>\n    /// 要素を1つデキュー。\n    /// </summary>\n    /// <remarks>\n    /// 名前は Stack に合わせて Pop にしてある。\n    /// 今回の実装では、先頭要素の読み出しと削除は別に行う。\n    /// この Pop では削除のみ。\n    /// 読み出しには Top プロパティを使う。\n    /// </remarks>\n    public void Pop()\n    {\n      this.buffer.EraseFirst();\n    }\n\n    /// <summary>\n    /// 先頭要素の読み出し。\n    /// </summary>\n    public T Top\n    {\n      get { return this.buffer[0]; }\n    }\n\n    public int Count\n    {\n      get { return this.buffer.Count; }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Collections/Set.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Collections\n{\n  /// <summary>\n  /// セット。\n  /// 数学で「集合」と呼ぶ奴。\n  /// 要素の順序には意味がなくて、要素が含まれているかどうかだけが問題。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  interface ISet<T> : IEnumerable<T>\n  {\n    void Insert(T elem);\n    void Erase(T elem);\n    bool Contains(T elem);\n  }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Collections/SortedArray.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace Collections\n{\n  /// <summary>\n  /// ソート済み配列。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  /// <remarks>\n  /// 2分探索できるので、検索は O(log n)。\n  /// ソート済みの状態を保つため、要素の挿入・削除には O(n) 必要。\n  /// </remarks>\n  class SortedArray<T> : ISet<T>\n    where T: IComparable<T>\n  {\n    #region フィールド\n\n    ArrayList<T> buffer;\n\n    #endregion\n    #region 初期化\n\n    public SortedArray() : this(256) { }\n\n    public SortedArray(int capacity)\n    {\n      this.buffer = new ArrayList<T>(capacity);\n    }\n\n    #endregion\n    #region 要素の挿入・削除・検索\n\n    /// <summary>\n    /// 要素の挿入。\n    /// </summary>\n    /// <param name=\"elem\">挿入する要素</param>\n    public void Insert(T elem)\n    {\n      if (this.buffer.Count == 0)\n      {\n        this.buffer.InsertLast(elem);\n        return;\n      }\n\n      int r = this.buffer.Count - 1;\n      int l = 0;\n      int comp;\n      while (l < r)\n      {\n        int m = (r + l) >> 1;\n        comp = this.buffer[m].CompareTo(elem);\n        if (comp > 0) r = m - 1;\n        else if (comp < 0) l = m + 1;\n        else return; // 重複不可\n      }\n\n      comp = this.buffer[l].CompareTo(elem);\n      if(comp < 0)\n        this.buffer.Insert(l + 1, elem);\n      else if(comp > 0)\n        this.buffer.Insert(l, elem);\n    }\n\n    /// <summary>\n    /// 要素の検索。\n    /// </summary>\n    /// <param name=\"elem\">検索する要素</param>\n    /// <returns>要素の位置（見つからなかった場合、配列長）</returns>\n    public int IndexOf(T elem)\n    {\n      if (this.buffer.Count == 0)\n        return 0;\n\n      int r = this.buffer.Count - 1;\n      int l = 0;\n      while (l < r)\n      {\n        int m = (r + l) >> 1;\n        int comp = this.buffer[m].CompareTo(elem);\n        if (comp > 0) r = m - 1;\n        else if (comp < 0) l = m + 1;\n        else return m;\n      }\n\n      if(this.buffer[l].CompareTo(elem) == 0)\n        return l;\n      return this.buffer.Count;\n    }\n\n    /// <summary>\n    /// テーブル中に要素が含まれているかどうか判別。\n    /// </summary>\n    /// <param name=\"elem\">探したい要素</param>\n    /// <returns>含まれていれば true</returns>\n    public bool Contains(T elem)\n    {\n      return this.IndexOf(elem) != this.buffer.Count;\n    }\n\n    /// <summary>\n    /// テーブル中の要素を検索。\n    /// </summary>\n    /// <param name=\"elem\">探したい要素</param>\n    /// <returns>含まれていればその要素を、なければ default(T)</returns>\n    public T Find(T elem)\n    {\n      int i = this.IndexOf(elem);\n      if (i == this.buffer.Count)\n        return default(T);\n      return this.buffer[i];\n    }\n\n    /// <summary>\n    /// 要素の削除。\n    /// </summary>\n    /// <param name=\"elem\">削除する要素</param>\n    public void Erase(T elem)\n    {\n      int i = this.IndexOf(elem);\n      if (i < this.buffer.Count)\n        this.buffer.Erase(i);\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      for (int i = 0; i < this.buffer.Count; ++i)\n        yield return this.buffer[i];\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Collections/Stack.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Collections\n{\n  /// <summary>\n  /// スタック（FILOバッファ）。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  class Stack<T>\n  {\n    #region フィールド\n\n    ArrayList<T> buffer;\n\n    #endregion\n    #region 初期化\n\n    public Stack() { this.buffer = new ArrayList<T>(); }\n    public Stack(int capacity) { this.buffer = new ArrayList<T>(capacity); }\n\n    #endregion\n    #region 要素の挿入・削除\n\n    /// <summary>\n    /// 要素のプッシュ。\n    /// </summary>\n    /// <param name=\"elem\">挿入したい要素</param>\n    public void Push(T elem)\n    {\n      this.buffer.InsertLast(elem);\n    }\n\n    /// <summary>\n    /// 要素を1つポップ。\n    /// </summary>\n    /// <remarks>\n    /// 今回の実装では、先頭要素の読み出しと削除は別に行う。\n    /// この Pop では削除のみ。\n    /// 読み出しには Top プロパティを使う。\n    /// </remarks>\n    public void Pop()\n    {\n      this.buffer.EraseLast();\n    }\n\n    /// <summary>\n    /// 先頭要素の読み出し。\n    /// </summary>\n    public T Top\n    {\n      get { return this.buffer[this.buffer.Count - 1]; }\n    }\n\n    public int Count\n    {\n      get { return this.buffer.Count; }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Algorithm\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Sort/BubbleSort.cs",
    "content": "﻿using System;\n\nnamespace Algorithm.Sort\n{\n    partial class Sort\n    {\n        /// <summary>\n        /// バブルソート。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        public static void BubbleSort<T>(T[] a)\n          where T : IComparable<T>\n        {\n            int n = a.Length;\n            for (int i = 0; i < n - 1; i++)\n                for (int j = n - 1; j > i; j--)\n                    if (a[j].CompareTo(a[j - 1]) < 0)\n                        Swap(ref a[j], ref a[j - 1]);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Sort/BucketSort.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Algorithm.Sort\n{\n    partial class Sort\n    {\n        /// <summary>\n        /// [0, max] の範囲の整数をバケットソート。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        /// <param name=\"max\">配列 a 中の最大値</param>\n        public static void BucketSort(int[] a, int max)\n        {\n            // バケツを用意\n            int[] bucket = new int[max + 1];\n\n            // バケツに値を入れる\n            for (int i = 0; i < a.Length; ++i) ++bucket[a[i]];\n\n            // バケツ中の値の結合\n            for (int j = 0, i = 0; j < bucket.Length; ++j)\n                for (int k = bucket[j]; k != 0; --k, ++i)\n                    a[i] = j;\n        }\n\n        /// <summary>\n        /// [0, max] の範囲の整数をキーに持つデータ構造をバケットソート。\n        /// </summary>\n        /// <typeparam name=\"T\">値の型</typeparam>\n        /// <param name=\"a\">対象の配列</param>\n        /// <param name=\"max\">キーの最大値</param>\n        public static void BucketSort<T>(KeyValuePair<int, T>[] a, int max)\n        {\n            // バケツを用意\n            List<T>[] bucket = new List<T>[max + 1];\n\n            // バケツに値を入れる\n            for (int i = 0; i < a.Length; ++i)\n            {\n                if (bucket[a[i].Key] == null) bucket[a[i].Key] = new List<T>();\n                bucket[a[i].Key].Add(a[i].Value);\n            }\n\n            // バケツ中の値の結合\n            for (int j = 0, i = 0; j < bucket.Length; ++j)\n                if (bucket[j] != null)\n                    foreach (T val in bucket[j])\n                        a[i++] = new KeyValuePair<int, T>(j, val);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Sort/HeapSort.cs",
    "content": "﻿using System;\n\nnamespace Algorithm.Sort\n{\n    partial class Sort\n    {\n        /// <summary>\n        /// ヒープソート。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        public static void HeapSort<T>(T[] a)\n          where T : IComparable<T>\n        {\n            for (int i = 1; i < a.Length; ++i)\n                MakeHeap(a, i);\n            for (int i = a.Length - 1; i >= 0; --i)\n                a[i] = PopHeap(a, i);\n        }\n\n        /// <summary>\n        /// 配列をヒープ化する。\n        /// n - 1 番目までの要素は既にヒープ化されていることを仮定して、\n        /// n 番目の要素をヒープに追加。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        /// <param name=\"n\">要素数</param>\n        static void MakeHeap<T>(T[] a, int n)\n          where T : IComparable<T>\n        {\n            while (n != 0)\n            {\n                int i = (n - 1) / 2;\n                if (a[n].CompareTo(a[i]) > 0) Swap(ref a[n], ref a[i]);\n                n = i;\n            }\n        }\n\n        /// <summary>\n        /// ヒープから最大値を取り出す。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        /// <param name=\"n\">要素数 - 1</param>\n        /// <returns>取り出した最大値</returns>\n        static T PopHeap<T>(T[] a, int n)\n          where T : IComparable<T>\n        {\n            T max = a[0];\n\n            a[0] = a[n];\n\n            for (int i = 0, j; (j = 2 * i + 1) < n;)\n            {\n                if ((j != n - 1) && (a[j].CompareTo(a[j + 1]) < 0)) j++;\n                if (a[i].CompareTo(a[j]) < 0) Swap(ref a[i], ref a[j]);\n                i = j;\n            }\n\n            return max;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Sort/InsertSort.cs",
    "content": "﻿using System;\n\nnamespace Algorithm.Sort\n{\n    partial class Sort\n    {\n        /// <summary>\n        /// 挿入ソート。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        public static void InsertSort<T>(T[] a)\n          where T : IComparable<T>\n        {\n            int n = a.Length;\n            for (int i = 1; i < n; i++)\n                for (int j = i; j >= 1 && a[j - 1].CompareTo(a[j]) > 0; --j)\n                    Swap(ref a[j], ref a[j - 1]);\n        }\n\n        /// <summary>\n        /// 挿入ソート。\n        /// 配列のどこからどこまでをソートするかを指定するバージョン。\n        /// <see cref=\"MergeSort{T}(T[])\"/>, <see cref=\"QuickSort{T}(T[])\"/>\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        /// <param name=\"first\">ソート対象の先頭インデックス</param>\n        /// <param name=\"last\">ソート対象の末尾インデックス</param>\n        static void InsertSort<T>(T[] a, int first, int last)\n          where T : IComparable<T>\n        {\n            for (int i = first + 1; i <= last; i++)\n                for (int j = i; j > first && a[j - 1].CompareTo(a[j]) > 0; --j)\n                    Swap(ref a[j], ref a[j - 1]);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Sort/MergeSort.cs",
    "content": "﻿using System;\n\nnamespace Algorithm.Sort\n{\n    partial class Sort\n    {\n        /// <summary>\n        /// マージソート。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        public static void MergeSort<T>(T[] a)\n          where T : IComparable<T>\n        {\n            T[] work = new T[a.Length / 2];\n            MergeSort(a, 0, a.Length, work);\n        }\n\n        /// <summary>\n        /// マージソート → 挿入ソートに切り替える配列長の閾値。\n        /// </summary>\n        const int MERGE_THREASHOLD = 64;\n\n        /// <summary>\n        /// マージソート。\n        /// 配列のどこからどこまでをソートするかを指定するバージョン。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        /// <param name=\"begin\">ソート対象部分の先頭</param>\n        /// <param name=\"end\">ソート対象部分の末尾＋1</param>\n        /// <param name=\"work\">作業領域。a の 1/2 のサイズが必要。</param>\n        static void MergeSort<T>(T[] a, int begin, int end, T[] work)\n          where T : IComparable<T>\n        {\n            if (end - begin < MERGE_THREASHOLD)\n            {\n                InsertSort(a, begin, end - 1);\n                return;\n            }\n\n            int mid = (begin + end) / 2;\n            MergeSort(a, begin, mid, work);\n            MergeSort(a, mid, end, work);\n            Merge(a, begin, mid, end, work);\n        }\n\n        /// <summary>\n        /// 配列 a の、[begin, mid) の部分と [mid, end) の部分をマージ。\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"a\">マージ対象の配列</param>\n        /// <param name=\"begin1\">aの先頭</param>\n        /// <param name=\"mid\">aの分割点</param>\n        /// <param name=\"end\">aの末尾＋1</param>\n        /// <param name=\"work\">作業領域</param>\n        static void Merge<T>(T[] a, int begin, int mid, int end, T[] work)\n          where T : IComparable<T>\n        {\n            int i, j, k;\n\n            for (i = begin, j = 0; i != mid; ++i, ++j) work[j] = a[i];\n\n            mid -= begin;\n            for (j = 0, k = begin; i != end && j != mid; ++k)\n            {\n                if (a[i].CompareTo(work[j]) < 0)\n                {\n                    a[k] = a[i];\n                    ++i;\n                }\n                else\n                {\n                    a[k] = work[j];\n                    ++j;\n                }\n            }\n\n            for (; i < end; ++i, ++k) a[k] = a[i];\n            for (; j < mid; ++j, ++k) a[k] = work[j];\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Sort/QuickSort.cs",
    "content": "﻿using System;\n\nnamespace Algorithm.Sort\n{\n    partial class Sort\n    {\n        /// <summary>\n        /// クイックソート。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        public static void QuickSort<T>(T[] a)\n          where T : IComparable<T>\n        {\n            QuickSort(a, 0, a.Length - 1);\n        }\n\n        /// <summary>\n        /// クイックソート → 挿入ソートに切り替える配列長の閾値。\n        /// </summary>\n        const int QUICK_THREASHOLD = 64;\n\n        /// <summary>\n        /// クイックソート本体。\n        /// 配列のどこからどこまでをソートするかを指定するバージョン。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        /// <param name=\"first\">ソート対象の先頭インデックス</param>\n        /// <param name=\"last\">ソート対象の末尾インデックス</param>\n        static void QuickSort<T>(T[] a, int first, int last)\n          where T : IComparable<T>\n        {\n            // 要素数が少なくなってきたら挿入ソートに切り替え\n            if (last - first < QUICK_THREASHOLD)\n            {\n                InsertSort(a, first, last);\n                return;\n            }\n\n            // 枢軸決定（配列の先頭、ど真ん中、末尾の3つの値の中央値を使用。）\n            T pivot = Median(a[first], a[(first + last) / 2], a[last]);\n\n            // 左右分割\n            int l = first;\n            int r = last;\n\n            while (l <= r)\n            {\n                while (l < last && a[l].CompareTo(pivot) < 0) l++;\n                while (r > first && a[r].CompareTo(pivot) >= 0) r--;\n                if (l > r) break;\n                Swap(ref a[l], ref a[r]);\n                l++; r--;\n            }\n\n            // 再帰呼び出し\n            QuickSort(a, first, l - 1);\n            QuickSort(a, l, last);\n        }\n\n        /// <summary>\n        /// 3つの値の中央値を求める。\n        /// </summary>\n        /// <param name=\"a\">オペランドa</param>\n        /// <param name=\"b\">オペランドb</param>\n        /// <param name=\"c\">オペランドc</param>\n        /// <returns>中央値</returns>\n        static T Median<T>(T a, T b, T c)\n          where T : IComparable<T>\n        {\n            if (a.CompareTo(b) > 0) Swap(ref a, ref b);\n            if (a.CompareTo(c) > 0) Swap(ref a, ref c);\n            if (b.CompareTo(c) > 0) Swap(ref b, ref c);\n            return b;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Sort/RadixSort.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Algorithm.Sort\n{\n    partial class Sort\n    {\n        /// <summary>\n        /// 基数ソート。\n        /// 概念説明用の簡易版。\n        /// 10進数で3桁(0～999)までしかソートできない。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        /// <param name=\"max\">配列 a 中の最大値</param>\n        public static void RadixSort10(int[] a)\n        {\n            // バケツを用意\n            List<int>[] bucket = new List<int>[10];\n\n            for (int d = 0, r = 1; d < 3; ++d, r *= 10)\n            {\n                // バケツに値を入れる\n                for (int i = 0; i < a.Length; ++i)\n                {\n                    int key = (a[i] / r) % 10; // a[i] の d 桁目だけを取り出す。\n                    if (bucket[key] == null) bucket[key] = new List<int>();\n                    bucket[key].Add(a[i]);\n                }\n\n                // バケツ中の値の結合\n                for (int j = 0, i = 0; j < bucket.Length; ++j)\n                    if (bucket[j] != null)\n                        foreach (int val in bucket[j])\n                            a[i++] = val;\n\n                // バケツを一度空にする\n                for (int j = 0; j < bucket.Length; ++j)\n                    bucket[j] = null;\n            }\n        }\n\n        /// <summary>\n        /// 基数ソート。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        /// <param name=\"max\">配列 a 中の最大値</param>\n        public static void RadixSort(int[] a)\n        {\n            // バケツを用意\n            List<int>[] bucket = new List<int>[256];\n\n            for (int d = 0, logR = 0; d < 4; ++d, logR += 8)\n            {\n                // バケツに値を入れる\n                for (int i = 0; i < a.Length; ++i)\n                {\n                    int key = (a[i] >> logR) & 255; // a[i] を256進 d 桁目だけを取り出す。\n                    if (bucket[key] == null) bucket[key] = new List<int>();\n                    bucket[key].Add(a[i]);\n                }\n\n                // バケツ中の値の結合\n                for (int j = 0, i = 0; j < bucket.Length; ++j)\n                    if (bucket[j] != null)\n                        foreach (int val in bucket[j])\n                            a[i++] = val;\n\n                // バケツを一度空にする\n                for (int j = 0; j < bucket.Length; ++j)\n                    bucket[j] = null;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Sort/SelectSort.cs",
    "content": "﻿using System;\n\nnamespace Algorithm.Sort\n{\n    partial class Sort\n    {\n        /// <summary>\n        /// 選択ソート。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        public static void SelectSort<T>(T[] a)\n          where T : IComparable<T>\n        {\n            int n = a.Length;\n            for (int i = 0; i < n; i++)\n            {\n                int min = i;\n                for (int j = i + 1; j < n; j++)\n                    if (a[min].CompareTo(a[j]) > 0)\n                        min = j;\n                Swap(ref a[i], ref a[min]);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Sort/ShellSort.cs",
    "content": "﻿using System;\n\nnamespace Algorithm.Sort\n{\n    partial class Sort\n    {\n        /// <summary>\n        /// シェルソート。\n        /// </summary>\n        /// <param name=\"a\">対象の配列</param>\n        public static void ShellSort<T>(T[] a)\n          where T : IComparable<T>\n        {\n            int n = a.Length;\n            int h;\n            for (h = 1; h < n / 9; h = h * 3 + 1) ;\n            for (; h > 0; h /= 3)\n                for (int i = h; i < n; i++)\n                    for (int j = i; j >= h && a[j - h].CompareTo(a[j]) > 0; j -= h)\n                        Swap(ref a[j], ref a[j - h]);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Algorithm/Sort/Sort.cs",
    "content": "﻿using System;\n\nnamespace Algorithm.Sort\n{\n    partial class Sort\n    {\n        private static void Swap<T>(ref T t1, ref T t2) where T : IComparable<T>\n        {\n            var t = t1;\n            t1 = t2;\n            t2 = t;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/AllInOne.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28407.52\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Async\", \"Async\", \"{2ED58793-4F5C-43C8-95B2-ACE56426DF10}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Lock\", \"Async\\Lock\\Lock.csproj\", \"{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"TaskLike\", \"Async\\TaskLike\\TaskLike.csproj\", \"{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Data\", \"Data\", \"{F1D776AA-9064-489C-92C4-9671FB7761AA}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Deconstruction\", \"Data\\Deconstruction\\Deconstruction.csproj\", \"{A3E46235-D020-4AEC-918A-F315DA6E9012}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Discards\", \"Data\\Discards\\Discards.csproj\", \"{80197711-36D4-4A93-B75B-3B6DDD4799A7}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"OutVar\", \"Data\\OutVar\\OutVar.csproj\", \"{4A20CE71-0214-4289-A730-0D90C5E009B7}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Tuples\", \"Data\\Tuples\\Tuples.csproj\", \"{9851C940-EF7D-414C-89DC-441A3B22B5B5}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"TypeSwitch\", \"Data\\TypeSwitch\\TypeSwitch.csproj\", \"{A953159C-7BFB-4BF2-897D-45FE4886C2F1}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Event\", \"Event\", \"{4E9F5E97-2C87-4A72-B90C-7B6645EA372B}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"EventDriven\", \"Event\\EventDriven\\EventDriven.csproj\", \"{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Observable\", \"Event\\Observable\\Observable.csproj\", \"{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Functional\", \"Functional\", \"{F3EA519B-5D56-4099-94D7-CB390289D130}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ExtensionMethods\", \"Functional\\ExtensionMethods\\ExtensionMethods.csproj\", \"{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"LocalFunctions\", \"Functional\\LocalFunctions\\LocalFunctions.csproj\", \"{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Interop\", \"Interop\", \"{48EB640A-D40F-433F-ACF7-A6360228DE5C}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"Win32Dll\", \"Interop\\Win32Dll\\Win32Dll.vcxproj\", \"{4C367220-4A86-4F8F-94A4-E303A882EC38}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Unsafe\", \"Interop\\Unsafe\\Unsafe\\Unsafe.csproj\", \"{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"TypedReference\", \"Interop\\TypedReference\\TypedReference.csproj\", \"{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"MemoryManagement\", \"MemoryManagement\", \"{C53EC418-52D5-4539-8926-EFA66AB51C91}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"UninitializedMemory\", \"MemoryManagement\\UninitializedMemory\\UninitializedMemory.vcxproj\", \"{5846FD63-297A-41FE-BDCF-5E1A44418953}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DefaultValue\", \"MemoryManagement\\DefaultValue\\DefaultValue.csproj\", \"{012FD17A-1F55-4BB6-B923-BEF210AD83B1}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Misc\", \"Misc\", \"{A1594DA0-6962-4715-B63D-DD8474D529CE}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Keywords\", \"Misc\\Keywords\\Keywords.csproj\", \"{F324CA0E-2847-4B65-A84B-0350026F563C}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Oop\", \"Oop\", \"{D865F0C6-CEB1-4142-A138-EC0E8A53B23B}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"GenericsSample\", \"Oop\\GenericsSample\\GenericsSample.csproj\", \"{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"InterfaceSample\", \"Oop\\InterfaceSample\\InterfaceSample.csproj\", \"{BFFD4218-2CD6-488E-A01F-77B4DA544F20}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ValueTypeGenerics\", \"Oop\\ValueTypeGenerics\\ValueTypeGenerics.csproj\", \"{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Variance\", \"Oop\\Variance\\Variance.csproj\", \"{491A0653-DCF1-43A9-8589-E5422E7C9279}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"TopLevelAccessibility\", \"TopLevelAccessibility\", \"{168983F2-7C04-43CC-A84D-F815E3BCAF30}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ReferredClassLibrary\", \"Oop\\TopLevelAccessibility\\ReferredClassLibrary\\ReferredClassLibrary.csproj\", \"{56B750BA-36B5-453C-A288-4783C48F9FD4}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ConsoleApplication\", \"Oop\\TopLevelAccessibility\\ConsoleApplication\\ConsoleApplication.csproj\", \"{1E06949A-F394-4BE8-853A-94BBAB8AA836}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Resource\", \"Resource\", \"{E8980CC4-17BE-48D9-ADA1-6ADB28E3E076}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Boxing\", \"Resource\\Boxing\\Boxing.csproj\", \"{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ByRef\", \"Resource\\ByRef\\ByRef.csproj\", \"{DAB14A91-2EB1-493C-A5B9-E846E1299938}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ClassOrStruct\", \"Resource\\ClassOrStruct\\ClassOrStruct.csproj\", \"{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"RecursiveReadOnly\", \"Resource\\RecursiveReadOnly\\RecursiveReadOnly.csproj\", \"{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"RefAndPointer\", \"Resource\\RefAndPointer\\RefAndPointer.csproj\", \"{33541ADA-A350-4C7E-AA45-BA1565A885E1}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Span\", \"Resource\\Span\\Span.csproj\", \"{7236CBC9-6395-4D97-A934-98798CCD5F27}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"StructLayoutSample\", \"Resource\\StructLayoutSample\\StructLayoutSample.csproj\", \"{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"StructPerformance\", \"Resource\\StructPerformance\\StructPerformance.csproj\", \"{4E3E8CFD-6DB9-4D95-845D-1E955796C061}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"WeakReference\", \"Resource\\WeakReference\\WeakReference.csproj\", \"{83481B0E-62A6-4427-B645-FCE090A3F8C3}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Start\", \"Start\", \"{0B4399BF-B82E-437D-BC87-AD363FEC9B4F}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"IdentifierScope\", \"Start\\IdentifierScope\\IdentifierScope.csproj\", \"{183C51EE-B17B-4607-991B-16A01FE5A66E}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Variables\", \"Start\\Variables\\Variables.csproj\", \"{C1933686-B6BC-49A4-87FA-69AAB0C1500B}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"StructuredProgramming\", \"StructuredProgramming\", \"{5D997394-516B-4C50-83F8-49766EE5FD09}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BackportEnumerable\", \"StructuredProgramming\\BackportEnumerable\\BackportEnumerable.csproj\", \"{B63BA635-EA21-4D00-B7C1-2104FCDD169D}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Exceptions\", \"StructuredProgramming\\Exceptions\\Exceptions.csproj\", \"{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Expressions\", \"StructuredProgramming\\Expressions\\Expressions.csproj\", \"{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ExternAliasConsoleApplication\", \"StructuredProgramming\\ExternAliasConsoleApplication\\ExternAliasConsoleApplication.csproj\", \"{134218F9-5B38-4E19-A74D-F05A3F179B53}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Function\", \"StructuredProgramming\\Function\\Function.csproj\", \"{6F24F522-37B0-422E-93F2-F9617C253987}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Inlining\", \"StructuredProgramming\\Inlining\\Inlining.csproj\", \"{575D7157-6997-4BDA-840A-D272EEDBACBD}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Namespaces\", \"StructuredProgramming\\Namespaces\\Namespaces.csproj\", \"{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Params\", \"StructuredProgramming\\Params\\Params.csproj\", \"{9ED86973-D986-40DD-9068-627FE33D9F5A}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Tuples\", \"StructuredProgramming\\Tuples\\Tuples.csproj\", \"{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"LambdaInternal\", \"Functional\\LambdaInternal\\LambdaInternal.csproj\", \"{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DelegateInternal\", \"Functional\\DelegateInternal\\DelegateInternal.csproj\", \"{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Algorithm\", \"Algorithm\", \"{603BF91B-95EB-478E-9CBE-21B85C671BD8}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Algorithm\", \"Algorithm\\Algorithm.csproj\", \"{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Patterns\", \"Data\\Patterns\\Patterns.csproj\", \"{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"NativeLib\", \"Interop\\NativeMemory\\NativeLib\\NativeLib.vcxproj\", \"{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ManagedApp\", \"Interop\\NativeMemory\\ManagedApp\\ManagedApp.csproj\", \"{8522EEF7-9D46-424E-A75B-5F2366228316}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"NativeInterop\", \"Interop\\NativeInterop\\NativeInterop.csproj\", \"{A61313F7-3BEF-4321-B8E3-4E49E71E1502}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"NativeMemory\", \"NativeMemory\", \"{BA683E0C-98ED-402B-9141-1B9DAD7B929A}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"PatternBased\", \"Misc\\PatternBased\\PatternBased.csproj\", \"{3A4328F3-8559-4943-8677-1B31FEE9F739}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"StringInterplation\", \"Start\\StringInterplation\\StringInterplation.csproj\", \"{36830F66-D52D-4294-B393-749FB829342C}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"OverloadResolution\", \"StructuredProgramming\\OverloadResolution\\OverloadResolution\\OverloadResolution.csproj\", \"{4E377107-E269-4A9A-BD67-DA2F437D20E6}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|x64.Build.0 = Release|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|x86.Build.0 = Release|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|x64.Build.0 = Release|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|x86.Build.0 = Release|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|x64.Build.0 = Release|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|x86.Build.0 = Release|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|x64.Build.0 = Release|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|x86.Build.0 = Release|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|x64.Build.0 = Release|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|x86.Build.0 = Release|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|x64.Build.0 = Release|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|x86.Build.0 = Release|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|x64.Build.0 = Release|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|x86.Build.0 = Release|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|x64.Build.0 = Release|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|x86.Build.0 = Release|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|x64.Build.0 = Release|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|x86.Build.0 = Release|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|x64.Build.0 = Release|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|x86.Build.0 = Release|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|x64.Build.0 = Release|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|x86.Build.0 = Release|Any CPU\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|x64.Build.0 = Debug|x64\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|x86.Build.0 = Debug|Win32\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|x64.ActiveCfg = Release|x64\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|x64.Build.0 = Release|x64\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|x86.ActiveCfg = Release|Win32\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|x86.Build.0 = Release|Win32\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|x64.Build.0 = Release|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|x86.Build.0 = Release|Any CPU\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Release|x64.Build.0 = Release|Any CPU\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A}.Release|x86.Build.0 = Release|Any CPU\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|x64.ActiveCfg = Debug|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|x86.Build.0 = Debug|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|x64.ActiveCfg = Release|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|x86.ActiveCfg = Release|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|x86.Build.0 = Release|Win32\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|x64.Build.0 = Release|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|x86.Build.0 = Release|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Release|x64.Build.0 = Release|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Release|x86.Build.0 = Release|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|x64.Build.0 = Release|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|x86.Build.0 = Release|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|x64.Build.0 = Release|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|x86.Build.0 = Release|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|x64.Build.0 = Release|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|x86.Build.0 = Release|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|x64.Build.0 = Release|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|x86.Build.0 = Release|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|x64.Build.0 = Release|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|x86.Build.0 = Release|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|x64.Build.0 = Release|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|x86.Build.0 = Release|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|x64.Build.0 = Release|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|x86.Build.0 = Release|Any CPU\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938}.Release|x64.Build.0 = Release|Any CPU\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938}.Release|x86.Build.0 = Release|Any CPU\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Release|x64.Build.0 = Release|Any CPU\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16}.Release|x86.Build.0 = Release|Any CPU\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Release|x64.Build.0 = Release|Any CPU\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4}.Release|x86.Build.0 = Release|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|x64.Build.0 = Release|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|x86.Build.0 = Release|Any CPU\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27}.Release|x64.Build.0 = Release|Any CPU\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27}.Release|x86.Build.0 = Release|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|x64.Build.0 = Release|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|x86.Build.0 = Release|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|x64.Build.0 = Release|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|x86.Build.0 = Release|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|x64.Build.0 = Release|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|x86.Build.0 = Release|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|x64.Build.0 = Release|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|x86.Build.0 = Release|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|x64.Build.0 = Release|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|x86.Build.0 = Release|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|x64.Build.0 = Release|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|x86.Build.0 = Release|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|x64.Build.0 = Release|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|x86.Build.0 = Release|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|x64.Build.0 = Release|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|x86.Build.0 = Release|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|x64.Build.0 = Release|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|x86.Build.0 = Release|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Release|x64.Build.0 = Release|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Release|x86.Build.0 = Release|Any CPU\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD}.Release|x64.Build.0 = Release|Any CPU\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD}.Release|x86.Build.0 = Release|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|x64.Build.0 = Release|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|x86.Build.0 = Release|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|x64.Build.0 = Release|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|x86.Build.0 = Release|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|x64.Build.0 = Release|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|x86.Build.0 = Release|Any CPU\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Release|x64.Build.0 = Release|Any CPU\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD}.Release|x86.Build.0 = Release|Any CPU\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Release|x64.Build.0 = Release|Any CPU\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638}.Release|x86.Build.0 = Release|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|x64.Build.0 = Release|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1}.Release|x86.Build.0 = Release|Any CPU\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Release|x64.Build.0 = Release|Any CPU\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9}.Release|x86.Build.0 = Release|Any CPU\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|x64.Build.0 = Debug|x64\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|x86.Build.0 = Debug|Win32\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|x64.ActiveCfg = Release|x64\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|x64.Build.0 = Release|x64\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|x86.ActiveCfg = Release|Win32\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|x86.Build.0 = Release|Win32\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316}.Release|x64.Build.0 = Release|Any CPU\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316}.Release|x86.Build.0 = Release|Any CPU\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Release|x64.Build.0 = Release|Any CPU\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502}.Release|x86.Build.0 = Release|Any CPU\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739}.Release|x64.Build.0 = Release|Any CPU\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739}.Release|x86.Build.0 = Release|Any CPU\n\t\t{36830F66-D52D-4294-B393-749FB829342C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{36830F66-D52D-4294-B393-749FB829342C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{36830F66-D52D-4294-B393-749FB829342C}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{36830F66-D52D-4294-B393-749FB829342C}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{36830F66-D52D-4294-B393-749FB829342C}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{36830F66-D52D-4294-B393-749FB829342C}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{36830F66-D52D-4294-B393-749FB829342C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{36830F66-D52D-4294-B393-749FB829342C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{36830F66-D52D-4294-B393-749FB829342C}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{36830F66-D52D-4294-B393-749FB829342C}.Release|x64.Build.0 = Release|Any CPU\n\t\t{36830F66-D52D-4294-B393-749FB829342C}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{36830F66-D52D-4294-B393-749FB829342C}.Release|x86.Build.0 = Release|Any CPU\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6}.Release|x64.Build.0 = Release|Any CPU\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236} = {2ED58793-4F5C-43C8-95B2-ACE56426DF10}\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B} = {2ED58793-4F5C-43C8-95B2-ACE56426DF10}\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012} = {F1D776AA-9064-489C-92C4-9671FB7761AA}\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7} = {F1D776AA-9064-489C-92C4-9671FB7761AA}\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7} = {F1D776AA-9064-489C-92C4-9671FB7761AA}\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5} = {F1D776AA-9064-489C-92C4-9671FB7761AA}\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1} = {F1D776AA-9064-489C-92C4-9671FB7761AA}\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7} = {4E9F5E97-2C87-4A72-B90C-7B6645EA372B}\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429} = {4E9F5E97-2C87-4A72-B90C-7B6645EA372B}\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B} = {F3EA519B-5D56-4099-94D7-CB390289D130}\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3} = {F3EA519B-5D56-4099-94D7-CB390289D130}\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38} = {48EB640A-D40F-433F-ACF7-A6360228DE5C}\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9} = {48EB640A-D40F-433F-ACF7-A6360228DE5C}\n\t\t{FFB96C42-7EF5-4A9D-9D50-DBBD001D840A} = {48EB640A-D40F-433F-ACF7-A6360228DE5C}\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953} = {C53EC418-52D5-4539-8926-EFA66AB51C91}\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1} = {C53EC418-52D5-4539-8926-EFA66AB51C91}\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C} = {A1594DA0-6962-4715-B63D-DD8474D529CE}\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C} = {D865F0C6-CEB1-4142-A138-EC0E8A53B23B}\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20} = {D865F0C6-CEB1-4142-A138-EC0E8A53B23B}\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A} = {D865F0C6-CEB1-4142-A138-EC0E8A53B23B}\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279} = {D865F0C6-CEB1-4142-A138-EC0E8A53B23B}\n\t\t{168983F2-7C04-43CC-A84D-F815E3BCAF30} = {D865F0C6-CEB1-4142-A138-EC0E8A53B23B}\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4} = {168983F2-7C04-43CC-A84D-F815E3BCAF30}\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836} = {168983F2-7C04-43CC-A84D-F815E3BCAF30}\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076}\n\t\t{DAB14A91-2EB1-493C-A5B9-E846E1299938} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076}\n\t\t{F937FF67-EC5A-4F85-8DFC-843EF96FAE16} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076}\n\t\t{B78D2711-96CB-4FA9-BB46-2B61142FA7C4} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076}\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076}\n\t\t{7236CBC9-6395-4D97-A934-98798CCD5F27} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076}\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076}\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076}\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3} = {E8980CC4-17BE-48D9-ADA1-6ADB28E3E076}\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E} = {0B4399BF-B82E-437D-BC87-AD363FEC9B4F}\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B} = {0B4399BF-B82E-437D-BC87-AD363FEC9B4F}\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D} = {5D997394-516B-4C50-83F8-49766EE5FD09}\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57} = {5D997394-516B-4C50-83F8-49766EE5FD09}\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B} = {5D997394-516B-4C50-83F8-49766EE5FD09}\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53} = {5D997394-516B-4C50-83F8-49766EE5FD09}\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987} = {5D997394-516B-4C50-83F8-49766EE5FD09}\n\t\t{575D7157-6997-4BDA-840A-D272EEDBACBD} = {5D997394-516B-4C50-83F8-49766EE5FD09}\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA} = {5D997394-516B-4C50-83F8-49766EE5FD09}\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A} = {5D997394-516B-4C50-83F8-49766EE5FD09}\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185} = {5D997394-516B-4C50-83F8-49766EE5FD09}\n\t\t{7C9B9329-6ADC-4BCB-860A-312F727F0DAD} = {F3EA519B-5D56-4099-94D7-CB390289D130}\n\t\t{D83A7939-277A-4AA6-8EFC-1A0ABEAAD638} = {F3EA519B-5D56-4099-94D7-CB390289D130}\n\t\t{57D965D9-F3CE-4EFE-857C-AFA7B454D9A1} = {603BF91B-95EB-478E-9CBE-21B85C671BD8}\n\t\t{CFBBEA8F-75B8-4952-AD74-8A5997E374B9} = {F1D776AA-9064-489C-92C4-9671FB7761AA}\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A} = {BA683E0C-98ED-402B-9141-1B9DAD7B929A}\n\t\t{8522EEF7-9D46-424E-A75B-5F2366228316} = {BA683E0C-98ED-402B-9141-1B9DAD7B929A}\n\t\t{A61313F7-3BEF-4321-B8E3-4E49E71E1502} = {48EB640A-D40F-433F-ACF7-A6360228DE5C}\n\t\t{BA683E0C-98ED-402B-9141-1B9DAD7B929A} = {48EB640A-D40F-433F-ACF7-A6360228DE5C}\n\t\t{3A4328F3-8559-4943-8677-1B31FEE9F739} = {A1594DA0-6962-4715-B63D-DD8474D529CE}\n\t\t{36830F66-D52D-4294-B393-749FB829342C} = {0B4399BF-B82E-437D-BC87-AD363FEC9B4F}\n\t\t{4E377107-E269-4A9A-BD67-DA2F437D20E6} = {5D997394-516B-4C50-83F8-49766EE5FD09}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {E587F394-82FE-4D5C-AF44-4E1B031AAEAC}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Async/Async.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Lock\", \"Lock\\Lock.csproj\", \"{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TaskLike\", \"TaskLike\\TaskLike.csproj\", \"{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{93D7A6DA-7BD2-48CC-B9FE-FBF0603BE236}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1395B24A-5B30-4312-8D8B-17AD0FF0B64B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Async/Lock/Lock.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>Lock.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Async/Lock/Monitor.cs",
    "content": "﻿namespace Lock.Monitor\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Text;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        static void Main()\n        {\n            const int ThreadNum = 20;\n            const int LoopNum = 20;\n            var num = 0;\n\n            var syncObject = new object();\n\n            Parallel.For(0, ThreadNum, i =>\n            {\n                for (int j = 0; j < LoopNum; j++)\n                {\n                    bool lockTaken = false;\n                    try\n                    {\n                        Monitor.TryEnter(syncObject, ref lockTaken); // ロック取得\n\n                        //↓クリティカルセクション\n                        int tmp = num;\n                        Thread.Sleep(1);\n                        num = tmp + 1;\n                        //↑クリティカルセクション\n                    }\n                    finally\n                    {\n                        if (lockTaken)\n                            Monitor.Exit(syncObject); // ロック解放\n                    }\n                }\n            });\n\n            Console.WriteLine(num);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Async/Lock/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Lock\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Async/TaskLike/Program.cs",
    "content": "﻿namespace TaskLike\n{\n    using System;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        static async ValueTask<int> XAsync(Random r)\n        {\n            if (r.NextDouble() < 0.99)\n            {\n                // 99% ここを通る。\n                // この場合、await が1度もなく、非同期処理にならない。\n                // 非同期処理じゃないのに Task<int> のインスタンスが作られるのはもったいない\n                return 1;\n            }\n\n            // こちら側は本当に非同期処理なので、Task<int> が必要。\n            await Task.Delay(100);\n            return 0;\n        }\n\n        static Task<int>? _cache;\n\n        // キャッシュしてるものなので、少し時間がたてば、確実に完了済みになる。\n        static Task<int> CachedX => _cache ?? (_cache = Task.Run(() => 1));\n\n        // 完了済みだと非同期処理にならない。\n        // 非同期処理じゃないのに Task<int> のインスタンスが作られるのはもったいない\n        static async ValueTask<int> Y() => await CachedX;\n        static async ValueTask<int> Z() => await Y();\n    }\n}\n"
  },
  {
    "path": "Chapters/Async/TaskLike/TaskLike.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\n[AsyncMethodBuilder(typeof(AsyncValueTaskMethodBuilder<>))]\nstruct TaskLike<TResult>\n{\n}\n\nstruct AsyncValueTaskMethodBuilder<TResult>\n{\n    public static AsyncValueTaskMethodBuilder<TResult> Create() => default(AsyncValueTaskMethodBuilder<TResult>);\n    public void Start<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine { }\n    public void SetStateMachine(IAsyncStateMachine stateMachine) { }\n    public void SetResult(TResult result) { }\n    public void SetException(Exception exception) { }\n    public TaskLike<TResult> Task { get; }\n    public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)\n        where TAwaiter : INotifyCompletion\n        where TStateMachine : IAsyncStateMachine\n    { }\n    public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)\n        where TAwaiter : ICriticalNotifyCompletion\n        where TStateMachine : IAsyncStateMachine\n    { }\n}\n\n#if false\nnamespace System.Runtime.CompilerServices\n{\n    sealed class AsyncMethodBuilderAttribute : Attribute\n    {\n        public AsyncMethodBuilderAttribute(Type builderType)\n        {\n            BuilderType = builderType;\n        }\n\n        public Type BuilderType { get; }\n    }\n}\n#endif\n"
  },
  {
    "path": "Chapters/Async/TaskLike/TaskLike.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Blogs/UnityAsync/UnityAsync0Introduction.md",
    "content": "# Unity上でasync/await: はじめに (UnityAsync0Introduction)\n\nたまにはAdvent Calendar参加。\n\nこのブログは[Unity Advent Calendar 2015](http://qiita.com/advent-calendar/2015/unity)の12月1日の記事です。\n\n7月に書いた「[Unity(ゲームエンジン)上で async/await](http://ufcpp.net/blog/2015/07/unityasyncbridge/)」の続報というか進捗。\nあと、補足説明いろいろ。\n\nあれから4か月くらいたったわけでさすがに安定したというか。\nむしろ、大して問題出なかったというか。\n\n以下のコミット履歴を見てのとおり、4か月でコミット79個しかないものの、これでもう安定してたりします。\n\n[https://github.com/OrangeCube/MinimumAsyncBridge/commits/master](https://github.com/OrangeCube/MinimumAsyncBridge/commits/master)\n\nこれが、「最初から安定してるライブラリは不活性に見えて不安がられる」というやつか…\n\nむしろ、IL2CPPの安定を待ってるというか…\n\n長くなりそうなので3部構成になっています:\n\n- [背景](UnityAsync1Background)\n- [現状](UnityAsync2CurrentStatus)\n- [課題と感想](UnityAsync3Retrospective)\n\n"
  },
  {
    "path": "Chapters/Blogs/UnityAsync/UnityAsync1Background.md",
    "content": "# Unity上でasync/await: 背景 (UnityAsync1Background)\n\nまずasync/awaitについて、\n(Unityでない)通常のC#開発の場合がどうとか、\nUnityで何が問題で使えなかったかとか、\nRxとの住み分けとかについて書こうかと思います。\n\n## C# 5.0: async/await の登場\n\nC#界隈で非同期処理がらみの話題がホットになったのはだいたい2010年前後からです。\n\n当時は、\n\n- F# にコンピューテーション式による async ワークフローが登場\n- 本家の[Rx](https://rx.codeplex.com/)\n- これらから少し遅れて、C# 5.0 (async/await)のプレビュー版が登場 \n\nという感じです。\n\n最近になって、Rxを参考にした非同期処理ライブラリが、\n[Java](https://github.com/ReactiveX/RxJava)や\n[JavaScript](https://github.com/Reactive-Extensions/RxJS)などで実装されていて注目されていますが、\nその一方で、C#ではC# 5.0のasync/awaitが主流になりました。\n\n理由はおおむね、\n\n- async/await はプログラミング言語側のサポートが必要\n- async/await が出ることが分かっていたので、それとは違うモデルの Rx の普及にはみな慎重だった\n\nという辺りです。逆に言うと、\n\n- C# のバージョンが古いUnityでは、いまだ[Rx](https://github.com/neuecc/UniRx)にかかる期待は大きい\n- JavaScriptにもES7でasync/awaitが入り、(後述の住み分けはあるものの、それが合う場面では)async/awaitが主流になっていくと思われる\n\nということも言えます。\n\n## async/awaitとRx\n\n今回、「Unityでもasync/awaitを使えるようにしたよ」という話をするわけですが、\nこれでRxはお役御免になるかというとそうでもなくて、Rxの用途は残ります。基本的には、\n\n- async/await: pull型で、1つの値を取りに行く場合に有効\n- Rx: push型で、ストリームデータを送ってもらう場合に有効\n\nという住み分けになります。\n\n例えば、サーバーからデータを受け取るような場合を想定すると、async/awaitがよさそうな場面は\n\n- ログイン時、ユーザーデータを一括で取りたい\n- ユーザーの行動時、即座に決まる範囲で行動の結果を返してもらいたい\n\nRxがよさそうな場面は\n\n- 他のユーザーの行動で、自分が受ける影響をサーバーからpush通知してほしい\n\nとかになります。\n\n![async/awaitが有効な非同期処理](await1.png)\n\n![Rxが有効な非同期処理](await2.png)\n\n## UnityでC# 6.0\n\nUnityの問題は、使っているMonoのバージョンが古いことで、確か2.8系(.NET 3.5/C# 3.0相当、オプション引数とか一部だけC# 4.0機能を先行取り込み)だったはず。\n\nですが、C#は、古いフレームワーク上でも最新の言語機能を使えたりします。\n詳しくは「[C#の言語バージョンと.NET Frameworkバージョン](http://ufcpp.net/study/csharp/cheatsheet/listfxlangversion/)」で書いていますが、\nここで「2.0や3.0で動く」となっている機能は、コンパイラーさえバージョンアップすればUnity上でも使えます。\n\n例えば、C# 6.0の新機能の大半は何もしなくても古いフレームワーク上で動きます。\nCaler Info属性や、`FormattedString` は、簡単なクラスの自作で動かせます。\nasync/await は結構重たいですが、頑張って実装すれば動かせます(これが本稿の主題)。\n\n### コンパイラーの差し替え\n\nC# 6.0コンパイラーを使う方法は大きく分けると2種類あって、\n\n- Unity が使っているコンパイラーを差し替えてしまう(実際にやっている人あり: [Unity C# 5.0 and 6.0 Integration](https://bitbucket.org/alexzzzz/unity-c-5.0-and-6.0-integration/src))\n- ロジックの大部分をUnityの外でコンパイルしてしまう\n\nとなります。\n\nうちは、どのみちロジックの大部分をUnityの外でも使う(データ編集用のデスクトップ アプリや、サーバー上で動かす)ので、\n後者のやり方をしています。\n\nちなみに、C# プロジェクトのVisual Studio上の「ビルド後処理」設定で、\nコンパイルしたDLLをUnity Assetsフォルダー以下にコピーするスクリプトを書いて使っています。\n\n- [CopyDllsAfterBuild](https://github.com/ufcpp/UnityTools/tree/master/CopyDllsAfterBuild)\n\n### Unity に async/await 移植\n\nUnity上でasync/awaitを使おうと思うと、[`Task`クラス](https://msdn.microsoft.com/ja-jp/library/system.threading.tasks.task.aspx)の移植が必要になります。\n\nIL2CPP登場以前だと、そもそも`Task`クラスが内部で使っているいくつかのメソッド、\n例えば[`Interlocked.CompareExchange<T>`](https://msdn.microsoft.com/ja-jp/library/bb297966.aspx)とかが\niOS上(AOTコンパイル)で動かないという問題があって、移植は絶望的でした。\n\nが、IL2CPPが安定してきた今、やってみたら案外あっさり移植できたという状態です。\n\n- [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)\n\n[導入文](UnityAsync0Introduction)でも書いていますが、あっさり動きすぎて、コミットが少なすぎて非アクティブに見える…\n\nまあ、「Minimum」という名前通り、`Task`クラスのうち、async/awaitに必要な部分だけの実装になります。\n例えば、`Run`メソッド(別スレッドで処理を開始する)は実装していません。\nこれに関しては、他の非同期処理ライブラリ(Unityのコルーチンとか、Rxとか)とつないで使う想定です。\n\nちなみに、Rxに対するつなぎ処理も書いています。\n\n- [UniRx.AsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge/tree/master/src/UniRx.AsyncBridge)\n\n`IObservable`に対するawaiter実装になります。\n\n## まとめ\n\nUnity の制限の多くは、Mono 2.8系のAOTコンパイルの制限に起因するものが多いです。\nそれが、IL2CPPが安定してきたことによって少し緩和しています。\n\nC# 3.0に留まる理由もなくなっていて、async/awaitのバックポーティングもうまくいっています。\nその移植したライブラリが以下のものです。\n\n- [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)\n\n"
  },
  {
    "path": "Chapters/Blogs/UnityAsync/UnityAsync2CurrentStatus.md",
    "content": "# Unity上でasync/await: 現状 (UnityAsync2CurrentStatus)\n\n[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)の現状について。\nどのくらいまっとうに動いているか。\n\nちなみに、[7月に書いたとき](http://ufcpp.net/blog/2015/07/unityasyncbridge/)には自分の個人アカウントのリポジトリにコードを置いていましたが、\n今は、[会社アカウント]((https://github.com/OrangeCube/)の方に移っています。\n\n## 実装状況\n\n[背景](UnityAsync1Background)でも説明した通り、`Run`メソッド(別スレッドで処理を開始する)は実装していません。\nここはUnityコルーチンとかRxとつないで使う想定です。\n\n一方で、Minimumと言いつつ、`Delay`、`WhenAll`、`WhenAny`は実装しました。\n\nこれで、実プロジェクトに組み込んで使っていますが、ほぼ要件足りています。\nasync/awaitを使いたい動機が主にサーバーとの通信(I/O非同期)で、スレッド処理(CPU非同期)をあまり必要としていないという背景はありますが。\n\n4か月使ってみて、MinimumAsyncBridge由来の問題に当たって困ったことはほぼないですし、\n困ったのはだいたい実装ミスで、現在では修正済みです。\n\n## IteratorTasksからの移行\n\nうちのプロジェクト、7月までは非同期処理に[IteratorTasks](https://github.com/OrangeCube/IteratorTasks)を使っていました。\n\nIteratorTasksも「`Task`もどき」なので、移行作業、そこまでは苦労しませんでした。必要なのは、\n\n- 名前空間を `IteratorTasks` から `System.Threading.Tasks` に変える\n- `IEnumerator`、`yield return` を `Task`、`await` に変えて回る\n\nを地道にやること。それなりに地道な作業なんですが… バグ修正含めて1・2週間ほど。\n\nもし、IteratorTasksを使っていただけてる方で、この1・2週間ほどの時間は取れないという場合があれば、\nIteratorTasksに対するawaiter実装もあるので、これが使えるかも。\n\n- [IteratorTasks.AsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge/tree/master/src/IteratorTasks.AsyncBridge)\n\n## 本家 Task の完全下位互換\n\n`Run`メソッドみたいに意図して実装していないものをのぞいて、\n本家`Task`クラスと互換性があります。\n\n要するに、完全下位互換。\n[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)を使って動けば、\n.NET 4.5以降では本家`Task`を使って100%動きます\n(逆は、実装していないメソッドを避けないとダメ)。\n\nちなみに、[型フォワーディング](http://ufcpp.net/study/csharp/package/typeforwarding/?p=3#backporting)という仕組みを使っていて、\n\n- .NET 3.5 (Unity)向けライブラリで[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)を使う\n- .NET 4.5向けライブラリで本家`Task`クラスを使う\n- これらのライブラリを混在させて、.NET 4.5向けアプリを書く\n\nというようなこともできます。.NET 4.5向けアプリから[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)を使うと、\n本家`Task`クラスに転送されます。\n\n実際、今作っているゲームは.NET 3.5と4.5混在です。\n\n- ちょっとしたデバッグをコンソール アプリで\n- ボット使った動作テストしたいときにボットをコンソール アプリで\n- 可視化したいデータがあったときにWPFでGUIをちょろっと\n- データの編集ツールはWPF製\n- (基本、サーバー側は外注なので他社、かつ、PHPなものの)一部、CPU酷使しそうな機能はC#で実装\n\nこれらのアプリは全部、Unity上で動かすゲームのロジックを共有しています。\nまた、現在は、これらは全部.NET 4.6にバージョンアップ済みです。\n\n\n### 既知の制限: .NET 4では使えない\n\n.NET 3.5と4.5以上では問題なく動きますが、.NET 4では動きません。\n\nおそらくピンポイントに.NET 4が必要になる(.NET 4は使えるけど4.5以上へのアップグレードはできない)場面はほとんどないと思いますが、一応。\n\nこれは、.NET 4に、async/awaitはできない中途半端なバージョンの`Task`クラスが存在するため、\n型フォワーディングしづらいせいです\n(新規クラスを足すのは簡単。既存クラスにメソッドを追加するのは無理)。\n\n### NuGetパッケージ\n\n[NuGetパッケージ化](https://www.nuget.org/packages/MinimumAsyncBridge/)してあって、\n\n- .NET 3.5 のプロジェクトからこのNuGe パッケージを参照すると、バックポーティング実装が参照される\n- .NET 4.5 のプロジェクトからだと、型フォワーディング実装が参照される\n\nという挙動をします。とりあえず、NuGet経由で参照するとわずらわしい設定不要で、.NET 3.5と4.5の混在ができます。\n\n### UniRx向け型フォワーディング\n\n同じような仕組み、[UniRx](https://github.com/neuecc/UniRx)に対しても使えます。つまり、\n\n- Unity向けライブラリではUniRx使う\n- .NET 4.5向けライブラリでは[本家Rx](https://www.nuget.org/packages/Rx-Main/)を使う\n- これらのライブラリを混在させて使う\n\nとか。とりあえずこの作業やって、Pull Request は出してあったりします。\n\n- [https://github.com/neuecc/UniRx/pull/88](https://github.com/neuecc/UniRx/pull/88)\n\nやったことは、\n\n- 名前空間が `UniRx` になっているところを`System.Reactive`に戻す\n- 意図して本家Rxとは実装変えていた部分を元に戻す(`FirstAsync`→`First`とか)\n- 別途、型フォワーディング用のライブラリを実装\n- 元々のUniRx利用者に影響が出ないように、`#if`分岐\n\nとかです。\n\n### 既知の制限: C# 6.0 がらみ\n\n[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)というかIL2CPP側の問題なんですが、\nIL2CPPを使う場合(つまり、iOSで実行する場合)、ちょっとだけC# 6.0で使えない構文があります。\n\n現状、以下の構文はIL2CPPでのビルドに失敗、あるいは、iOS実行時に実行時例外を起こします。\nasync/awaitの問題というか、だいたいは例外処理がらみの問題です。\n\n- catch finally 内での await は使えない\n- [catch句内での再スロー](http://ufcpp.net/study/csharp/misc_stacktrace.html#rethrow)ができない\n- [例外フィルター](http://ufcpp.net/study/csharp/oo_exception.html#exception-filter)が使えない\n\n## iOS実行・Android実行\n\niOSでの実行は、IL2CPPを使えば動きます。\n\nIL2CPPのバグをいくつか踏み抜いて、Unity 5.2.2では動かなくなっていたりしましたが、\nUnityへのフィードバックの結果、Unity 5.2.3では直っています。\n\n(Unity 5.2.2の時は、ビルドで失敗していました。\nビルドまで成功したら、実行時エラーが出たことはこれまでどのバージョンでもありませんでした。)\n\nちなみに、Android実行では1度も問題出ていません。\n\n## 本家Taskクラスらの劣化\n\n`Run`メソッドを実装していないなど、意図的にそうした部分の他に、いくらか残念な部分があります。\n\n- 一部、多少効率悪いはず\n- 例外のスタックトレース紛失\n\n### 効率\n\n`TaskCompletionSource`クラスとかawaiterの実装などはほぼベタに本家からの移植なので、そんなに差はないはずです。\n\n問題は`Delay`、`WhenAll`、`WhenAny`の実装。\n本家はこの辺りをネイティブ実装していて、\n[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)では別実装で移植しました。\nこの辺りは、本家ほど最適な実装はできないんで、さすがに効率ちょっと悪いはず。\n\n- `Delay`: `System.Threading.Timer`で実装\n- `WhenAll`/`WhenAny`: 複数の`Task`をリスト管理\n  - 本家実装だと同時実行するタスク数がむちゃくちゃ多くてもメモリ食わない実装になってるらしいけど、こっちはしっかりタスク数分のメモリを食う。\n\n### スタックトレース\n\n本家`Task`を使ったasync/awaitの何がすごいって、\nスレッド間でスタックトレース情報を伝搬させて、スタックトレースを追えるようにしていることなんですが。\n\nここはさすがに移植できなかったというか、移植が不可能だったりします。\nこの機能の実現には.NET 4.5で追加された`System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture`が必須です。\n.NET 3.5向けのバックポーティングはできません。\n\nなので、デバッグは本家`Task`よりも少し大変になります(非同期メソッドの呼び出し元が分からなくなったりする)。\n\n## まとめ\n\n[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)、\n実装し始めた当初の予想よりもだいぶあっさりと完成。\n\n- .NET 3.5/4.5混在でも使えます\n  - .NET 4では使えません\n- ほとんど問題起きず、少ない修正で安定してしまいました\n- iOS(IL2CPP)でも動きます\n  - Unity 5.2.2でIL2CPPのバグで一瞬動かなくなっていたものの、5.2.3で修正されました\n- 本家`Task`の完全下位互換です\n  - [MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)で動けば、本家では100%動く\n  - 一部、多少性能的に劣る\n  - スタックトレース紛失で少しデバッグが大変\n"
  },
  {
    "path": "Chapters/Blogs/UnityAsync/UnityAsync3Retrospective.md",
    "content": "# Unity上でasync/await: 課題と感想 (UnityAsync3Retrospective)\n\n[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)化してみてどうかと、\n[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)を作った感想など。\n\n## 作業難易度\n\n[参考にした元](http://referencesource.microsoft.com/)があって、書き換えが必要だった部分もごく少量で、\nほとんどコストかからず移植してます。最初から安定しているのも当たり前で。\n\nまあほんとは、もっと昔から.NETがオープンソースだったら…というのはありますが。\n\nIL2CPPで動かなくて困ったりした時期はありますが、この辺りは、別に`Task`クラスのせいじゃなくてそこかしろでバグだらけだったので。\n\n## 導入した感想\n\nやっぱり普通にC# 5.0のasync/awaitが書けるのはむちゃくちゃ楽です。\n自分だけじゃなく、チーム全体で言っても、かなりの作業が浮いてるんじゃないかと。\n\n途中まで[IteratorTasks](https://github.com/OrangeCube/IteratorTasks)を使っていて、\n途中で[MinimumAsyncBridge](https://github.com/OrangeCube/MinimumAsyncBridge)に移行するのに1・2週間ほど使いましたが、\nその作業分は余裕で取り戻せているのではないかと思います。\n\n何よりも、\n\n- 最新のC#を問題なく使える\n- 「もどき」じゃなく、標準`Task`の完全下位互換で、完全にコード共通化できる\n\nという辺りは非常に大きい。\n\n## Taskクラスの問題\n\nバックポーティング作業をやっていて感じたのは、`Task`クラスの債務がでかすぎるという問題。\n\n`Task`クラスは、以下のような処理を全部担います。\n\n- スレッド(`Task.Run`)\n- I/O完了ポート(非同期API)\n- ハードウェアタイマー(`Task.Delay`)\n- 他とのつなぎ(`TaskCompletionSource`)、C++でいうfuture/promise\n\n全部1つのクラス。他の言語だと、「他とのつなぎ」だけ用意して、\nスレッドとかは別途そいつで軽く包んでるだけなことが多いんですけども。\n.NETのTaskは割かし全部入り。\n\nこのうち、async/awaitを使うだけなら`TaskCompletionSource`だけあれば何とかなるんですよねぇ。\nなのに、そこだけを抜き出して取ってこれない。\nおまけでいろいろ、しかもスレッド関連とかいう難しい処理も持ってこないといけない。\n\n例えば以下のような問題があったり。\n\n- `GetAwaiter`が、.NET 4.5で`Task`クラスに追加されてる\n  - 型フォワーディングの仕組みで、クラスの追加はバック ポーティングできるけど、既存クラスへのメソッド追加は無理\n  - 結果、.NET 3.5と4.5では動くけど、.NET 4では動かないライブラリになってる\n- 非同期メソッドの戻り値が`Task`固定で、インターフェイスとかになってない\n  - インターフェイスになっていれば、独自実装がしやすい\n  - `Task`クラスみたいにでかいものを移植しなくて済む\n\n全部1つでやってるので性能はいいし、利用者視点の利便性はいいとは思います。\nそもそもなぜ非同期処理なんて面倒な事するかというとパフォーマンスを求めてなわけで、\n`Task`実装ではパフォーマンスを妥協できなかったというのはあるようです。\nあと、async/awaitを変に汎用化しようとすると、\nasyncメソッドのオーバーロード解決とかで苦労するらしい(非同期が絡むと型推論が効かなくなったり)。\n利便性劣化に直結。\n\n一方で、`Task`を実装する側、\n例えば.NET Coreで今絶賛クロスプラットフォーム化作業してる方々とか、\nMonoの方々とか、\n今回の僕みたいに独自にバック ポーティングすることにした人にとってはこのでかい実装はほんとに面倒。\n\nC#のasync/awaitはそういうでっかい一枚岩の上に乗っかっちゃってるって意味では将来リスクは結構負っています。\nこの辺りはF#方面の人らは「だからC#はダメだ」とか言ったりするものの。\nここは方向性の違いというか、C#的には「性能と利用者利便性を考えたらTaskに乗るしかなかった」と言われると妥協せざるを得ず。\n\n最近他の言語でもasync/await対応し始めてますけど、それらの言語でも「どこまで汎用化するか」は大きな争点になってるはずです。\nまあ、async/awaitに関してはF#もC#も先駆者なので、負の遺産にはなりやすいかもなぁ(F#はパフォーマンス的にペナルティ結構負ってるはずだし、C#は一枚岩の上に載ってるリスクあり)という気はしなくもないです。\nもっとも、それを心配しないといけなくなるのはまだまだ5年10年先の話だと思いますが。\n\n## まとめ\n\n元コードがあるんであっさり動いて当然。\nただ、もっと最初からオープンだったらわざわざ自分が苦労する必要なかったという気もします。\n\nC# 5.0登場時(アイディアが出たのは5・6年前。RTMが2012年)にも言われていたことではあるんですが、\n`Task`クラスはちょっと債務がでかすぎるよなぁというのは改めて思いました。\n\nまあ、とりあえず安定して動いたし、その結果、かなり開発が楽になったので実装してよかったと思います。\n"
  },
  {
    "path": "Chapters/Data/DataTypes.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28531.58\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Tuples\", \"Tuples\\Tuples.csproj\", \"{9851C940-EF7D-414C-89DC-441A3B22B5B5}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Deconstruction\", \"Deconstruction\\Deconstruction.csproj\", \"{A3E46235-D020-4AEC-918A-F315DA6E9012}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"OutVar\", \"OutVar\\OutVar.csproj\", \"{4A20CE71-0214-4289-A730-0D90C5E009B7}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"TypeSwitch\", \"TypeSwitch\\TypeSwitch.csproj\", \"{A953159C-7BFB-4BF2-897D-45FE4886C2F1}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Discards\", \"Discards\\Discards.csproj\", \"{80197711-36D4-4A93-B75B-3B6DDD4799A7}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Patterns\", \"Patterns\\Patterns.csproj\", \"{8212E7CA-2F62-4D24-92B3-ACA19EFFBD4E}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9851C940-EF7D-414C-89DC-441A3B22B5B5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A3E46235-D020-4AEC-918A-F315DA6E9012}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4A20CE71-0214-4289-A730-0D90C5E009B7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A953159C-7BFB-4BF2-897D-45FE4886C2F1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{80197711-36D4-4A93-B75B-3B6DDD4799A7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8212E7CA-2F62-4D24-92B3-ACA19EFFBD4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8212E7CA-2F62-4D24-92B3-ACA19EFFBD4E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8212E7CA-2F62-4D24-92B3-ACA19EFFBD4E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8212E7CA-2F62-4D24-92B3-ACA19EFFBD4E}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {F6DEAD6E-2EF9-4D4F-847D-D50925152DEB}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Data/Deconstruction/DeconstructMethod.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace Deconstruction.DeconstructMethod\n{\n    class Program\n    {\n        static void Main()\n        {\n            var pair = new KeyValuePair<string, int>(\"one\", 1);\n            var (k, v) = pair;\n            // 以下のようなコードに展開される\n            // string k;\n            // int v;\n            // pair.Deconstruct(out k, out v);\n\n            var tuple = Tuple.Create(\"abc\", 100);\n            var (x, y) = tuple;\n            // 以下のようなコードに展開される\n            // string x;\n            // int y;\n            // tuple.Deconstruct(out x, out y);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Deconstruction/Deconstruction.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>Deconstruction.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Data/Deconstruction/Evaluation.cs",
    "content": "﻿#pragma warning disable CS0219\n\nusing System;\n\nnamespace Deconstruction.Evaluation\n{\n    class Program\n    {\n        static void Main()\n        {\n            var t = (\"abc\", 100);\n\n            FailureSwap();\n            TupleSwap();\n            TupleSwapEval();\n            SideEffect();\n            SideEffectEval();\n        }\n\n        private static void FailureSwap()\n        {\n            var x = 1;\n            var y = 2;\n\n            y = x;\n            x = y; // 上の行で y が書き換わっているので、値の入れ替えにはならない\n\n            Console.WriteLine(x); // 1\n            Console.WriteLine(y); // 1\n\n            // 正しくは以下のように書く\n            // var temp = y;\n            // y = x;\n            // x = temp;\n        }\n\n        private static void TupleSwap()\n        {\n            var x = 1;\n            var y = 2;\n\n            // 分解代入であれば、値の書き換えは同時に起こる\n            (y, x) = (x, y); // 一時的にタプルが作られる\n\n            Console.WriteLine(x); // 2\n            Console.WriteLine(y); // 1\n        }\n\n        private static void TupleSwapEval()\n        {\n            var x = 1;\n            var y = 2;\n\n            // 実際には、同時に書き換わったように見えるように、一時変数が挟まる\n            // (y, x) = (x, y) であれば、以下のように評価されてる\n            var t = (x, y);\n            y = t.Item1;\n            x = t.Item2;\n\n            Console.WriteLine(x); // 2\n            Console.WriteLine(y); // 1\n        }\n\n        private static void SideEffect()\n        {\n            var a = new[] { 0, 1, 2, 3 };\n            var i = 0;\n\n            (a[i++], a[i++]) = (a[i++], a[i++]);\n\n            Console.WriteLine(string.Join(\", \", a)); // 2, 3, 2, 3\n            // つまり、以下の評価を受けてる\n            // (a[0], a[1]) = (a[2], a[3]);\n        }\n\n        private static void SideEffectEval()\n        {\n            var a = new[] { 0, 1, 2, 3 };\n            var i = 0;\n\n            ref var l1 = ref a[i++];\n            ref var l2 = ref a[i++];\n            var r1 = a[i++];\n            var r2 = a[i++];\n\n            l1 = r1;\n            l2 = r2;\n\n            Console.WriteLine(string.Join(\", \", a)); // 2, 3, 2, 3\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Deconstruction/Extensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace Deconstruction\n{\n    static class Extensions\n    {\n        public static void Deconstruct<T, U>(this KeyValuePair<T, U> pair, out T key, out U value)\n        {\n            key = pair.Key;\n            value = pair.Value;\n        }\n\n        public static void Deconstruct<T1, T2>(this Tuple<T1, T2> x, out T1 item1, out T2 item2)\n        {\n            item1 = x.Item1;\n            item2 = x.Item2;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Deconstruction/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace Deconstruction\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            MeaninglessVariable();\n            ManuallyDeconstructed();\n\n            var items = new[] { 1, 2, 3, 4, 5 };\n\n            DeconstractionDeclaration(items);\n            DeconstractionAssingment(items);\n            DeconstractionAssingment();\n            Conversion();\n        }\n\n        private static void Conversion()\n        {\n            // Tally の戻り値は (count, sum) の順\n            var t = Tally(new[] { 1, 2, 3, 4, 5 });\n\n            // sum = t.count, count = t.sum の意味になるので注意が必要\n            (int sum, int count) = t;\n            Console.WriteLine(sum);   // 5\n            Console.WriteLine(count); // 15\n\n            // int → object も int → long も暗黙的に変換可能\n            // なので、分解もでもこの変換が暗黙的に可能\n            (object x, long y) = t;\n        }\n\n        private static void DeconstractionAssingment(int[] items)\n        {\n            {\n                int x, y;\n\n                // 既存の変数を使って分解\n                (x, y) = Tally(items);\n            }\n\n            {\n                var x = 1.0;\n                var y = 5.0;\n\n                for (int i = 0; i < 3; i++)\n                {\n                    (x, y) = ((x + y) / 2, Math.Sqrt(x * y));\n                }\n\n                Console.WriteLine($\"{x}, {y}\");\n            }\n        }\n\n        private static void DeconstractionAssingment()\n        {\n            var a = new[] { 1, 2 };\n\n            // 配列アクセス\n            var b = new int[a.Length];\n            (b[1], b[0]) = (a[0], a[1]);\n\n            // 参照戻り値\n            var c = new int[a.Length];\n            (Mod(c, 5), Mod(c, 8)) = (a[0], a[1]);\n\n            Console.WriteLine(string.Join(\", \", b));\n            Console.WriteLine(string.Join(\", \", c));\n        }\n\n        static ref T Mod<T>(T[] array, int index) => ref array[index % array.Length];\n\n        private static void DeconstractionDeclaration(int[] items)\n        {\n            {\n                // count, sum を宣言しつつ、タプルを分解\n                (int count, int sum) = Tally(items);\n\n                // ↓こう書くとタプル型の変数の宣言\n                // (int count, int sum) t = Tally(items);\n            }\n\n            {\n                // 型推論で count, sum を宣言しつつ、タプルを分解\n                (var count, var sum) = Tally(items);\n\n                // ↓タプルだと var は使えない。これはコンパイル エラー\n                // (var count, var sum) t = Tally(items);\n            }\n\n            {\n                // 部分的に var を使う\n                (var count, long sum) = Tally(items);\n            }\n\n            {\n                // var + (変数リスト)でタプルを分解\n                var (count, sum) = Tally(items);\n            }\n        }\n\n        private static void ManuallyDeconstructed()\n        {\n            // この3行に相当する構文がほしい\n            var x = Tally(new[] { 1, 2, 3, 4, 5 });\n            var count = x.count;\n            var sum = x.sum;\n            // 以後、もう x は使わない\n\n            Console.WriteLine(count);\n            Console.WriteLine(sum);\n        }\n\n        private static void MeaninglessVariable()\n        {\n            var x = Tally(new[] { 1, 2, 3, 4, 5 });\n            Console.WriteLine(x.count);\n            Console.WriteLine(x.sum);\n        }\n\n        static (int count, int sum) Tally(IEnumerable<int> items)\n        {\n            var count = 0;\n            var sum = 0;\n            foreach (var x in items)\n            {\n                sum += x;\n                count++;\n            }\n\n            return (count, sum);\n        }\n\n        static void Statements()\n        {\n            (int x, int y)[] array = new[] { (1, 2), (3, 4) };\n\n            foreach (var (x, y) in array)\n            {\n                Console.WriteLine($\"{x}, {y}\");\n            }\n\n            for ((int i, int j) = (0, 0); i < 10; i++, j--)\n            {\n                Console.WriteLine($\"{i}, {j}\");\n            }\n\n            // ↓RTM までにはできるようになるはず？\n            //var q =\n            //    from (var x, vary) in array\n            //    let (sum, product) = (x + y, x * y)\n            //    select new { sum, product };\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Deconstruction/Summary.cs",
    "content": "﻿namespace Tuples.Deconstruction.Tuples\n{\n    using System;\n    using System.Collections.Generic;\n\n    class Program\n    {\n        // タプルを使って2つの戻り値を返す\n        static (int count, int sum) Tally(IEnumerable<int> items)\n        {\n            var count = 0;\n            var sum = 0;\n            foreach (var x in items)\n            {\n                sum += x;\n                count++;\n            }\n\n            return (count, sum);\n        }\n\n        static void Main()\n        {\n            var data = new[] { 1, 2, 3, 4, 5 };\n            var (count, sum) = Tally(data);\n            Console.WriteLine($\"{sum}/{count}\");\n        }\n    }\n}\n\nnamespace Tuples.Deconstruction.AnyType\n{\n    using System.Collections.Generic;\n\n    class Program\n    {\n        static void Main()\n        {\n            var (key, value) = new KeyValuePair<string, int>(\"one\", 1);\n        }\n    }\n\n    static class Extensions\n    {\n        public static void Deconstruct<T, U>(this KeyValuePair<T, U> pair, out T key, out U value)\n        {\n            key = pair.Key;\n            value = pair.Value;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Deconstruction/Vector2D.cs",
    "content": "﻿namespace Deconstruction._Vector2D\n{\n    using static System.Math;\n\n    struct Radian\n    {\n        public double Value { get; }\n        public Radian(double value) => Value = value;\n    }\n\n    struct Vector2D\n    {\n        public double X { get; }\n        public double Y { get; }\n\n        // コンストラクターは当然、個数が同じでも、型が違えば呼び分けができる\n        public Vector2D(double x, double y) => (X, Y) = (x, y);\n        public Vector2D(double radius, Radian angle)\n            : this(radius * Cos(angle.Value), radius * Sin(angle.Value)) { }\n\n        // 引数の数が同じ Deconstruct が2つある\n        // 片方だけならいいけど、2つあると分解ができなくなる\n        public void Deconstruct(out double x, out double y) => (x, y) = (X, Y);\n#if false\n        public void Deconstruct(out double radius, out Radian angle)\n            => (radius, angle) = (Sqrt(X * X + Y * Y), new Radian(Atan2(Y, X)));\n#endif\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // コンストラクターの呼び分け\n            var p = new Vector2D(1, 2);\n            var q = new Vector2D(10, new Radian(PI / 5));\n\n            // 分解は呼び分けできない\n            (double x, double y) = q; // コンパイル エラー\n#if false\n            (double r, Radian a) = p; // コンパイル エラー\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Deconstruction/Vector3D.cs",
    "content": "﻿using Deconstruction._Vector2D;\n\nnamespace Deconstruction._Vector3D\n{\n    struct Vector3D\n    {\n        public double X { get; }\n        public double Y { get; }\n        public double Z { get; }\n        public Vector3D(double x, double y, double z) => (X, Y, Z) = (x, y, z);\n\n        // 引数の数が違えば大丈夫\n        public void Deconstruct(out double x, out double y, out double z) => (x, y, z) = (X, Y, Z);\n        public void Deconstruct(out double first, out Vector2D rest) => (first, rest) = (X, new Vector2D(Y, Z));\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var p = new Vector3D(1, 2, 3);\n\n            // 分解可能\n            var (first, rest) = p;\n            var (x, y, z) = p;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Discards/Discards.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Data/Discards/Program.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\n\nclass Program\n{\n    static void Main()\n    {\n        var _ = 10;\n        Console.WriteLine(_); // 10 が表示される\n    }\n\n    static void Deconstruct0()\n    {\n        // 商と余りを計算するメソッドがあるけども、ここでは商しか要らない\n        // 要らないので適当な変数 x とかで受ける\n        var (q, x) = DivRem(123, 11);\n\n        // 逆に、余りしか要らない\n        // 要らないから再び適当な変数 x で受けたいけども、x はもう使ってる\n        // しょうがないから x1 とかにしとくか…\n        var (x1, r) = DivRem(123, 11);\n    }\n\n    static (int quotient, int remainder) DivRem(int dividend, int divisor)\n        => (Math.DivRem(dividend, divisor, out var remainder), remainder);\n\n    static void Deconstruct()\n    {\n        // 商と余りを計算するメソッドがあるけども、ここでは商しか要らない\n        // _ を書いたところでは、値を受け取らずに無視する\n        var (q, _) = DivRem(123, 11);\n\n        // 逆に、余りしか要らない\n        // また、本来「var x」とか変数宣言を書くべき場所にも _ だけを書ける\n        (_, var r) = DivRem(123, 11);\n    }\n\n    static void Deconstruct1()\n    {\n        // _ を書いたところでは、値を受け取らずに無視する\n        var (q, _) = DivRem(123, 11);\n\n        // _ は変数にはならないので、スコープを汚さない。別の場所でも再び _ を書ける\n        // また、本来「var x」とか変数宣言を書くべき場所にも _ だけを書ける\n        (_, var r) = DivRem(123, 11);\n    }\n\n    static void Deconstruct2()\n    {\n        // 要らないので適当な変数 x とかで受ける\n        var (q, x) = DivRem(123, 11);\n\n        // 要らないと言いつつ、参照できてしまう\n        Console.WriteLine(x);\n\n        // 要らないものは _ で破棄\n        var (_, r) = DivRem(123, 11);\n\n        // 分解の中に書いた _ は変数にはならない\n        // 以下の行でコンパイル エラーになる(_ は存在しない)\n#if false\n        Console.WriteLine(_);\n#endif\n    }\n\n    static int TypeSwitch(object obj)\n    {\n        switch (obj)\n        {\n            case int[] x: return x.Length;\n            case long[] x: return 2 * x.Length;\n            // int でさえあれば値は問わない\n            case int _: return 1;\n            // 同、long\n            case long _: return 2;\n            case null: return 0;\n            // 以下の行をコメントアウトするとエラーに\n            // 今のところ、case _ は未実装(将来的に予定はあり)\n            //case _:\n            default: throw new ArgumentOutOfRangeException();\n        }\n    }\n\n    // 欲しいのは戻り値だけであって、out 引数で受け取った値は要らない\n    static bool CanParse(string s) => int.TryParse(s, out _);\n\n#if false\n    static void Subscribe(INotifyPropertyChanged source)\n    {\n        // 2個目の _ が「同じ名前被ってる」エラーになる\n        source.PropertyChanged += (_, _) => Console.WriteLine(\"property changed\");\n    }\n\n    static void Subscribe(INotifyPropertyChanged source)\n    {\n        // (予定)C# 8?\n        // 1回も _ を使わなかったら破棄扱い\n        source.PropertyChanged += (_, _) => { };\n\n        // _ を使っているのでこれは引数扱い。同名の別引数は作れない\n        source.PropertyChanged += (_, _1) => Console.WriteLine(_);\n    }\n#endif\n}\n"
  },
  {
    "path": "Chapters/Data/OutVar/OutVar.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>OutVar.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Data/OutVar/Point.cs",
    "content": "﻿namespace OutVar.Point\n{\n    using System;\n\n    struct Point\n    {\n        public int X { get; set; }\n        public int Y { get; set; }\n\n        public void GetCoordinate(out int x, out int y)\n        {\n            x = X;\n            y = Y;\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // x, y のスコープはこのブロック内\n            // この辺りで x, y という名前の変数は作れない\n\n            var p = new Point { X = 1, Y = 2 };\n            p.GetCoordinate(out var x, out var y);\n\n            // 以下のような書き方をしたのと同じ\n            // int x, y;\n            // p.GetCoordinate(out x, out y);\n\n            // この行から下で x, y を使える\n\n            Console.WriteLine($\"{x}, {y}\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/OutVar/Program.cs",
    "content": "﻿namespace OutVar\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n\n        class csharp6\n        {\n            static int? ParseOrDefault(string s)\n            {\n                int x;\n                return int.TryParse(s, out x) ? x : default(int?);\n            }\n        }\n\n        class csharp7int\n        {\n            static int? ParseOrDefault(string s)\n            {\n                return int.TryParse(s, out int x) ? x : default(int?);\n            }\n        }\n\n        class csharp7var\n        {\n            static int? ParseOrDefault(string s)\n            {\n                return int.TryParse(s, out var x) ? x : default(int?);\n            }\n        }\n\n        class csharp7expression\n        {\n            static int? ParseOrDefault(string s) => int.TryParse(s, out var x) ? x : default(int?);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/CallOnce.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Patterns.CallOnce\n{\n    class X\n    {\n        public int Value { get; }\n        public X(int value) => Value = value;\n        public void Deconstruct(out int value) => value = Value;\n    }\n\n    class Program\n    {\n        static int M(X x)\n            => x switch\n        {\n            // 引数の数が同じ位置パターンを3回。\n            // この場合、Deconstruct(out int) の呼び出しは1回にまとめられる。\n            (0) _ => 1,\n            (1) _ => 2,\n            (2) _ => 0,\n            _ => x.Value\n        };\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/ConstantPattern.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Patterns.ConstantPattern\n{\n    class Program\n    {\n        static void Main()\n        {\n        }\n\n        static int M(object x)\n        {\n            switch (x)\n            {\n                // 定数パターン\n                case 0: return 0;\n                // 型パターン\n                case string s: return s.Length;\n                default: return -1;\n            }\n        }\n\n        static int M(object x, int comparand)\n        {\n            switch (x)\n            {\n                // case comparand: とは書けない。\n                // 型パターン + when 句を使う。\n                case int i when i == comparand: return 0;\n                default: return -1;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/DeconstructRemoval.cs",
    "content": "﻿namespace Patterns.DeconstructRemoval\n{\n    using System;\n\n    class X\n    {\n        // Deconstruct に副作用を持たせる\n        public void Deconstruct() => Console.WriteLine(\"Deconstruct()\");\n        public void Deconstruct(out int a)\n        {\n            Console.WriteLine(\"Deconstruct(out int a)\");\n            a = 0;\n        }\n        public void Deconstruct(out int a, out int b)\n        {\n            Console.WriteLine(\"Deconstruct(out int a, out int b)\");\n            (a, b) = (0, 0);\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var x = new X();\n\n            // Deconstruct() がないとコンパイル エラーになるけど、\n            // Deconstruct() は呼ばれない。\n            Console.WriteLine(x is ());\n\n            // Deconstruct(out int) がないとコンパイル エラーになるけど、\n            // Deconstruct(out int) は呼ばれない。\n            Console.WriteLine(x is var (_));\n\n            // Deconstruct(out int, out int) がないとコンパイル エラーになるけど、\n            // Deconstruct(out int, out int) は呼ばれない。\n            Console.WriteLine(x is (_, _));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/DiscardPattern.cs",
    "content": "﻿namespace Patterns.DiscardPattern\n{\n    class Program\n    {\n        static void Main()\n        {\n\n        }\n\n        static int M(object x)\n            => x switch\n            {\n                0 => 0,\n                string s => s.Length,\n                _ => -1\n            };\n    }\n}\n\nnamespace Patterns.DiscardPattern.BreakingChange\n{\n    using System;\n\n    class _Type\n    {\n        class _ { }\n\n        static void M(object x)\n        {\n            Console.WriteLine(x is _); // class _ とのマッチ\n        }\n    }\n\n    class _Constant\n    {\n        const int _ = 0;\n\n        static void M(object x)\n        {\n            switch (x)\n            {\n                case _: // 定数 _ とのマッチ\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/Expressions/Node.cs",
    "content": "﻿namespace Patterns.Expressions\n{\n    public abstract class Node\n    {\n        public static readonly Node X = new Var();\n        public static implicit operator Node(int value) => new Const(value);\n        public static Node operator +(Node left, Node right) => new Add(left, right);\n        public static Node operator *(Node left, Node right) => new Mul(left, right);\n    }\n\n    public class Var : Node { public override string ToString() => \"x\"; }\n\n    public class Const : Node\n    {\n        public int Value { get; }\n        public Const(int value) { Value = value; }\n        public void Deconstruct(out int value) => value = Value;\n        public override string ToString() => Value.ToString();\n    }\n\n    public class Add : Node\n    {\n        public Node Left { get; }\n        public Node Right { get; }\n        public Add(Node left, Node right) => (Left, Right) = (left, right);\n        public void Deconstruct(out Node left, out Node right) => (left, right) = (Left, Right);\n        public override string ToString() => $\"({Left.ToString()} + {Right.ToString()})\";\n    }\n\n    public class Mul : Node\n    {\n        public Node Left { get; }\n        public Node Right { get; }\n        public Mul(Node left, Node right) => (Left, Right) = (left, right);\n        public void Deconstruct(out Node left, out Node right) => (left, right) = (Left, Right);\n        public override string ToString() => $\"{Left.ToString()} * {Right.ToString()}\";\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/Expressions/Program.cs",
    "content": "﻿namespace Patterns.Expressions\n{\n    using System;\n\n    public static class Program\n    {\n        public static int Calculate(this Node n, int x)\n            => n switch\n        {\n            Var _ => x,\n            Const c => c.Value,\n            Add (var l, var r) => l.Calculate(x) + r.Calculate(x),\n            Mul (var l, var r) => l.Calculate(x) * r.Calculate(x),\n            _ => throw new InvalidOperationException()\n        };\n\n        public static Node Simplify(this Node n)\n            => n switch\n        {\n            Add (var l, var r) => (l.Simplify(), r.Simplify()) switch\n            {\n                // 0 を足しても変わらない\n                (Const(0), var r1) => r1,\n                (var l1, Const(0)) => l1,\n                // 他\n                (var l1, var r1) => new Add(l1, r1)\n            },\n            Mul (var l, var r) => (l.Simplify(), r.Simplify()) switch\n            {\n                // 0 を掛けたら 0\n                (Const(0) c, _) => c,\n                (_, Const(0) c) => c,\n                // 1 を掛けても変わらない\n                (Const(1), var r1) => r1,\n                (var l1, Const(1)) => l1,\n                // 他\n                (var l1, var r1) => new Mul(l1, r1)\n            },\n            _ => n\n        };\n\n        public static Node ClassicSimplify(this Node n)\n        {\n            if (n is Add a)\n            {\n                var (l, r) = a;\n                var l1 = l.Simplify();\n                var r1 = r.Simplify();\n\n                { if (l1 is Const c && c.Value == 0) return r1; }\n                { if (r1 is Const c && c.Value == 0) return l1; }\n                return new Add(l1, r1);\n            }\n            if (n is Mul m)\n            {\n                var (l, r) = m;\n                var l1 = l.Simplify();\n                var r1 = r.Simplify();\n\n                {\n                    if (l1 is Const c)\n                    {\n                        if (c.Value == 0) return c;\n                        if (c.Value == 1) return r1;\n                    }\n                }\n                {\n                    if (r1 is Const c)\n                    {\n                        if (c.Value == 0) return c;\n                        if (c.Value == 1) return l1;\n                    }\n                }\n                return new Mul(l1, r1);\n            }\n            return n;\n        }\n\n        static void Main()\n        {\n            var x = Node.X;\n            Console.WriteLine(x * x + 1);\n            Console.WriteLine(((1 * x + 0 * x) * 1).Simplify());\n            Console.WriteLine(((x + 2) * (x + 3)).Calculate(1));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/Line.cs",
    "content": "﻿namespace Patterns\n{\n    public class Line\n    {\n        public Point Start { get; }\n        public Point End { get; }\n        public Line(Point s, Point e) => (Start, End) = (s, e);\n        public void Deconstruct(out Point s, out Point e) => (s, e) = (Start, End);\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/NoOrderGarantee.cs",
    "content": "﻿namespace Patterns.NoOrderGarantee\n{\n    using System;\n\n    enum Type { A, B }\n\n    class X\n    {\n        public Type Type { get; }\n        public X(Type type) => Type = type;\n\n        // それぞれ Type が一致しているときだけ値を取り出せ、そうでなければ例外\n        public int A => Type == Type.A ? 1 : throw new InvalidOperationException();\n        public int B => Type == Type.B ? 2 : throw new InvalidOperationException();\n\n        // 分解でタイプ判定\n        public void Deconstruct(out Type t) => t = Type;\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            Console.WriteLine(M(new X(Type.A)));\n            Console.WriteLine(M(new X(Type.B)));\n        }\n\n        // 以下のコードはたまたま動く可能性はあるものの、C# の言語使用としては保証がない。\n        // Deconstruct よりも先にプロパティのアクセスがあると例外が出ることがある。\n        static int M(X x) => x switch\n        {\n            (Type.A) { A: var a } => a,\n            (Type.B) { B: var b } => b,\n            _ => 0\n        };\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/NonNull.cs",
    "content": "﻿namespace Patterns.NonNull\n{\n    class Program\n    {\n        struct LongLongNamedStruct { }\n\n        void M1(LongLongNamedStruct? x)\n        {\n            // こういう書き方だと null チェックになる。\n            if (x is LongLongNamedStruct nonNull)\n            {\n                // obj が null じゃない時だけここが実行される。\n                // でも、x の型が既知なのに、長いクラス名をわざわざ書くのはしんどい…\n            }\n        }\n\n        void M2(LongLongNamedStruct? x)\n        {\n            // が、var パターンは null にもマッチしちゃう。\n            // (var は「何にでもマッチ」。null でも true になっちゃう。)\n            if (x is var nullable)\n            {\n                // obj が null でもここが実行される。\n            }\n        }\n\n        void M3(LongLongNamedStruct? x)\n        {\n            // (C# 8.0) プロパティ パターンであれば、null チェックを含む。\n            if (x is { } nonNull)\n            {\n                // obj が null じゃない時だけここが実行される。\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/Patterns.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>Patterns.NoOrderGarantee.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Data/Patterns/Point.cs",
    "content": "﻿namespace Patterns\n{\n    public class Point\n    {\n        public int X { get; set; }\n        public int Y { get; set; }\n        public Point(int x = 0, int y = 0) => (X, Y) = (x, y);\n        public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/PositionalPattern.cs",
    "content": "﻿namespace Patterns.PositionalPattern\n{\n    class Program\n    {\n        static void Main()\n        {\n            // 位置指定で構築できるんなら、位置指定でマッチングできるべき\n            var p1 = new Point(1, 2);\n            var r1 = p1 is Point (1, 2);\n\n            // 名前指定で構築できるんなら、名前指定でマッチングできるべき\n            var p2 = new Point(x: 1, y: 2);\n            var r2 = p2 is Point (x: 1, y: 2);\n\n#if false // 実装待ち。C# 8.0 候補には入ってる\n            // 型推論が効く場合に new の後ろの型名は省略可能(になる予定)なら\n            // 型が既知なら型名を省略してマッチングできるべき\n            Point p3 = new (1, 2);\n            var r3 = p2 is (1, 2);\n#endif\n\n            // 階層的に new できるんなら、階層的にマッチングできるべき\n            var line = new Line(new Point(1, 2), new Point(3, 4));\n            var r4 = line is ((1, 2), (3, 4));\n        }\n\n        static int M(Point p)\n            => p switch\n        {\n            (1, 2) => 0,\n            (var x, _) when x > 0 => x,\n            _ => -1\n        };\n\n        static int M1(Point p)\n        {\n            p.Deconstruct(out var x, out var y);\n            if (x is 1 && y is 2) return 0;\n            if (x > 0) return x;\n            return -1;\n        }\n\n        static int ExplicitType(object obj)\n            => obj switch\n        {\n            int i => i,\n            string s => s.Length,\n            Point(var x, var y) => 0,\n            _ => -1\n        };\n\n        static int MixPatterns(object obj)\n            => obj switch\n        {\n            Point (var x, _) { Y: var y } p => x * y\n        };\n\n        static int NamedPattern(Point p)\n            => p switch\n        {\n            (x: 1, y: 2) => 0,\n            (x: var x, y: _) when x > 0 => x,\n            _ => -1\n        };\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/PropertyPattern.cs",
    "content": "﻿namespace Patterns.PropertyPattern\n{\n    class Program\n    {\n        public static void Main()\n        {\n            // 初期化子でプロパティ指定できるんなら、プロパティ指定でマッチングできるべき\n            var p1 = new Point { X = 1, Y = 2 };\n            var r1 = p1 is { X: 1, Y: 2 };\n\n            // 混在で構築できるんなら、混在でマッチングできるべき\n            var p2 = new Point(x: 1) { Y = 2 };\n            var r2 = p2 is (1, _) { Y: 2 };\n        }\n\n        static int M(Point p)\n            => p switch\n        {\n            { X: 1, Y: 2 } => 0,\n            { X: var x, Y: _ } when x > 0 => x,\n            _ => -1\n        };\n\n        static int M1(Point p)\n        {\n            var x = p.X;\n            var y = p.Y;\n            if (x is 1 && y is 2) return 0;\n            if (x > 0) return x;\n            return -1;\n        }\n\n        static int M(object obj)\n            => obj switch\n        {\n            int i => i,\n            string s => s.Length,\n            Point { X: 0, Y: 0 } => 0,\n            Point (_, _) => 1,\n            _ => -1\n        };\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/PropertyPatternField.cs",
    "content": "﻿namespace Patterns.PropertyPatternField\n{\n    using System;\n\n    class X\n    {\n        // (外から見て) get-only なプロパティ\n        public int GetOnly { get; private set; }\n\n        // get/set 可能なプロパティ\n        public int GetSet { get; set; }\n\n        // フィールド\n        public int Field;\n\n        // set-only なプロパティ\n        public int SetOnly { set => GetOnly = value; }\n    }\n\n    class Program\n    {\n        public static void Main()\n        {\n            // オブジェクト初期化子では、set が public なプロパティか readonly ではないフィールドを指定可能\n            var x = new X { GetSet = 1, Field = 2, SetOnly = 3 };\n\n            // プロパティ パターンでは、get が public なプロパティかフィールドを指定可能\n            Console.WriteLine(x is { GetOnly: 3, GetSet: 1, Field: 2 });\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/RecursivePattern.cs",
    "content": "﻿namespace Patterns.RecursivePattern\n{\n    class Program\n    {\n        static int M(object obj)\n            => obj switch\n        {\n            0 => 1,\n            int i => 2,\n            Point (1, _) => 4, // new!\n            Point { X: 2, Y: var y } => y, // new!\n            _ => 0\n        };\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/Tuple.cs",
    "content": "﻿namespace Patterns.Tuple\n{\n    using System.Runtime.CompilerServices;\n\n    class X : ITuple\n    {\n        public object this[int index] => index;\n        public int Length => 2;\n        public void Deconstruct(out int a, out int b) => (a, b) = (0, 1);\n    }\n\n    class Source\n    {\n        public bool TupleSyntax((int a, int b) x) => x is (1, 2);\n        public bool Deconstruct(X x) => x is (1, 2);\n        public bool Object(object x) => x is (1, 2);\n    }\n\n    class Result\n    {\n        // ValueTuple の場合は直接フィールドを参照する。\n        public bool TupleSyntax((int a, int b) x)\n        {\n            return x.a == 1 && x.b == 2;\n        }\n\n        // コンパイル時に Deconstruct メソッドが見つかる場合はそれを使って分解。\n        public bool Deconstruct(X x)\n        {\n            x.Deconstruct(out var a, out var b);\n            return a == 1 && b == 2;\n        }\n\n        // コンパイル時の解決ができない場合、ITuple を実装しているかどうかを見る。\n        // Length とインデクサーを使ってマッチング。\n        public bool Object(object x)\n        {\n            return x is ITuple t\n                && t.Length == 2\n                && t[0] is int a && a == 1\n                && t[1] is int b && b == 1\n                ;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/TupleSwitch.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Patterns\n{\n    class TupleSwitch\n    {\n        int Compare(int? a, int? b)\n        {\n            switch (a, b)\n            {\n                case (a: null, null): return 0;\n                case (int _, null): return -1;\n                case (null, int _): return -1;\n                case (int a1, int b1): return a1.CompareTo(b1);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/TypePattern.cs",
    "content": "﻿namespace Patterns.TypePattern\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            M(1);\n            M(\"abc\");\n            M(new object());\n        }\n\n        static void M(object x)\n        {\n            if (x is int i) Console.WriteLine(\"int \" + i);\n            else if (x is string s) Console.WriteLine(\"string \" + s);\n        }\n\n        static void M1(object x)\n        {\n            if (x is int)\n            {\n                var i = (int)x;\n                Console.WriteLine(\"int \" + i);\n            }\n            else\n            {\n                string s = x as string;\n                if (s != null)\n                {\n                    Console.WriteLine(\"string \" + s);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/TypePatternNull.cs",
    "content": "﻿namespace Patterns.TypePatternNull\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            M(\"abc\"); // matched abc\n            M(null);  // 何も表示されない\n        }\n\n        static void M(string x)\n        {\n            if (x is string s) Console.WriteLine(\"matched \" + s);\n        }\n\n        static void M<T>(T x)\n        {\n            Console.WriteLine(x is null);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/UserDefinedOperator.cs",
    "content": "﻿namespace Patterns.UserDefinedOperator\n{\n    using System;\n\n    class X\n    {\n        // 全てのインスタンスが等しいという挙動。\n        // 当然、x == null も常に true。\n        public static bool operator ==(X a, X b) => true;\n        public static bool operator !=(X a, X b) => false;\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var x = new X();\n\n            // なんでも true なので、== null も true\n            Console.WriteLine(x == null);\n\n            // ユーザー定義の == は見ない。x が本当に null かどうかを見て、false になる\n            Console.WriteLine(x is null);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/VarPattern.cs",
    "content": "﻿namespace Patterns.VarPattern\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            MatchNull();\n            DeclarationExpression();\n        }\n\n        static void DeclarationExpression()\n        {\n            while (Console.ReadLine() is var line && !string.IsNullOrEmpty(line))\n            {\n                Console.WriteLine(line);\n            }\n        }\n\n        static void MatchNull()\n        {\n            string s = null;\n            Console.WriteLine(s is string x); // false\n            Console.WriteLine(s is var y);    // true\n        }\n\n        static int M(object x)\n        {\n            switch(x)\n            {\n                case 0: return 0;\n                case string s: return s.Length;\n                case var other: return other.GetHashCode();\n                // あるいは、変数で受け取る必要がないときは _ にしておけば破棄の意味なる\n                // case var _:\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Patterns/ZeroOneTuple.cs",
    "content": "﻿namespace Patterns.ZeroOneTuple\n{\n    using System;\n\n    class X\n    {\n        public void Deconstruct() { }\n        public void Deconstruct(out int a) => a = 0;\n    }\n\n    class Program\n    {\n        static void Main() => M(new X());\n\n        static void M(X x)\n        {\n            // 0 引数の位置パターン。\n            // Deconstruct() を持っていることが使える条件。\n            if (x is ()) Console.WriteLine(\"Deconstruct()\");\n\n            // 1 引数の位置パターン。\n            // Deconstruct(out T) を持っていることが使える条件。\n            // ただ、キャストの () との区別が難しいらしく、素直に x is (int a) とは書けない。\n            // 前後に余計な var や _ を付ける必要あり。\n            if (x is (int a) _) Console.WriteLine($\"Deconstruct({a})\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Tuples/ErroneousSamples.cs",
    "content": "﻿namespace Tuples.ErroneousSamples\n{\n#if false\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            () noneple;     // ダメ\n            (int x) oneple; // ダメ\n\n            // タプル構文で書けるのは2つ以上だけ\n            (int x, int y) twople; // OK\n\n            // タプル構文でなければ、0-tuple, 1-tuple も作れる\n            ValueTuple none;     // OK\n            ValueTuple<int> one; // OK\n        }\n    }\n#endif\n\n#if false\n    // using でエイリアスを付けることはできない\n    using T = (int x, int y);\n\n    class Program\n    {\n        static void Main()\n        {\n            // var t = new T(1, 2); みたいなのと同じノリでは書けない\n            var t1 = new(int x, int y)(1, 2);\n            var t2 = new(int x, int y) { x = 1, y = 2 };\n        }\n\n        static void M(object obj)\n        {\n            // is 演算子には使えない\n            if(obj is (int x, int y))\n            {\n            }\n        }\n    }\n#endif\n\n#if false\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            var ticks = 100000;\n            // C# 8?\n            DateTime d = new(ticks); // 左辺から型推論して、new DateTime(ticks) が呼ばれる\n        }\n\n        static void M(object obj)\n        {\n            // C# 8?\n            // is T 扱いじゃなくて、パターン マッチングで obj を x, y に分解\n            if (obj is (int x, int y))\n            {\n                Console.WriteLine($\"{x}, {y}\");\n            }\n        }\n    }\n#endif\n}\n"
  },
  {
    "path": "Chapters/Data/Tuples/Implementation.cs",
    "content": "﻿#pragma warning disable 219\n#pragma warning disable 1998\n\nnamespace Tuples.Implementation\n{\n    using System;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        static void Main()\n        {\n            LocalTuple();\n            LocalTupleImpl();\n            //Dynamic();\n            LongTuple();\n            LongTupleImple();\n        }\n\n        private static void LocalTuple()\n        {\n            var t = (x: 3, y: 5);\n            var p = t.x * t.y;\n            var (x, y) = t;\n            Console.WriteLine($\"{x} × {y} = {p}\");\n        }\n\n        private static void LocalTupleImpl()\n        {\n            var t = new ValueTuple<int, int>(3, 5); // (x: 3, y: 5)\n            var p = t.Item1 * t.Item2; // t.x * t.y\n            var x = t.Item1;\n            var y = t.Item2;\n            Console.WriteLine($\"{x} × {y} = {p}\");\n        }\n\n        private static void Dynamic()\n        {\n            // 匿名型は名前が残る\n            var a = new { x = 3, y = 5 };\n            var s1 = Sum(a); // 大丈夫\n            Console.WriteLine(s1);\n\n            // タプル型は名前を紛失する\n            var t = (x: 3, y: 5);\n            var s2 = Sum(t); // x, yという名前が実行時になくてエラーに\n            Console.WriteLine(s2);\n        }\n\n        private static dynamic Sum(dynamic d) => d.x + d.y;\n\n        public (int x, int y) F((int a, int b) t) => (t.a + t.b, t.a - t.b);\n\n#if false\n        [return: TupleElementNames(new[] { \"x\", \"y\" })]\n        public ValueTuple<int, int> F([TupleElementNames(new[] { \"a\", \"b\" })] ValueTuple<int, int> t)\n            => new ValueTuple<int, int>(t.Item1 + t.Item2, t.Item1 - t.Item2);\n#endif\n\n        private static void LongTuple()\n        {\n            var t = (1, 2, 3, 4, 5, 6, 7, 8, 9);\n            Console.WriteLine(t.Item9);\n        }\n\n        private static void LongTupleImple()\n        {\n            var t = new ValueTuple<int, int, int, int, int, int, int, ValueTuple<int, int>>(\n                1, 2, 3, 4, 5, 6, 7, new ValueTuple<int, int>(8, 9));\n            Console.WriteLine(t.Rest.Item2);\n        }\n\n        private static void Onetuple()\n        {\n            var noneple = new ValueTuple();\n            var oneple = new ValueTuple<int>(1);\n\n            // メンバー2個以上はタプル構文を使える\n            var twople = (1, 2); // new ValueTuple<int, int>(1, 2);\n            var threeple = (1, 2, 3); // new ValueTuple<int, int, int>(1, 2, 3);\n        }\n\n#if true\n        // タプルでは0、1は書けない\n        async Task F0() { }\n        async Task<int> F1() => 1;\n        async Task<(int x1, int x2)> F2() => (1, 2);\n        async Task<(int x1, int x2, int x3)> F3() => (1, 2, 3);\n#else\n        // こう書けると統一性があってきれい(C# 7では書けない)\n        async Task<()> F0() { }\n        async Task<(int x1)> F1() => (1);\n        async Task<(int x1, int x2)> F2() => (1, 2);\n        async Task<(int x1, int x2, int x3)> F3() => (1, 2, 3);\n#endif\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Tuples/OutParams.cs",
    "content": "﻿#pragma warning disable 1998\n#pragma warning disable 649\n\nnamespace Tuples.OutParams\n{\n    using System;\n    using System.Threading.Tasks;\n\n    /// <summary>\n    /// 出力引数(C# 6)版\n    /// </summary>\n    class Out6\n    {\n        static void F(Point p)\n        {\n            // 事前に変数を用意しないといけない/var 不可\n            int x, y;\n            // 1個1個 out を付けないといけない\n            Deconstruct(p, out x, out y);\n            Console.WriteLine($\"{x}, {y}\");\n\n            //非同期メソッドには使えない\n        }\n\n        // 1個1個 out を付けないといけない\n        static void Deconstruct(Point p, out int x, out int y)\n        {\n            // 1個1個代入\n            x = p.X;\n            y = p.Y;\n        }\n    }\n\n    /// <summary>\n    /// 出力引数(C# 7)版\n    /// </summary>\n    class Out7\n    {\n        static void F(Point p)\n        {\n            // 変数の事前準備は不要に\n            // でも1個1個 out を付けないといけない\n            Deconstruct(p, out var x, out var y);\n            //Console.WriteLine($\"{x}, {y}\");\n\n            //非同期メソッドには相変わらず使えない\n        }\n\n        // 1個1個 out を付けないといけない\n        static void Deconstruct(Point p, out int x, out int y) => (x, y) = (p.X, p.Y);\n    }\n\n    /// <summary>\n    /// タプル版\n    /// </summary>\n    class Tuple\n    {\n        static async Task F(Point p)\n        {\n            // 1個の var で受け取れる\n            var t1 = Deconstruct(p);\n            Console.WriteLine($\"{t1.x}, {t1.y}\");\n\n            // 何なら分解と併せればもっと書き心地よく書ける\n            var (x, y) = Deconstruct(p);\n            Console.WriteLine($\"{x}, {y}\");\n\n            // 非同期メソッドで使えるのはタプルだけ\n            var t2 = await DeconstructAsync(p);\n            Console.WriteLine($\"{t2.x}, {t2.y}\");\n        }\n\n        static (int x, int y) Deconstruct(Point p) => (p.X, p.Y); // 1個の式で書けて楽\n        static async Task<(int x, int y)> DeconstructAsync(Point p) => (p.X, p.Y);\n    }\n\n    struct Point\n    {\n        public int X;\n        public int Y;\n    }\n\n    /// <summary>\n    /// それでもやっぱり出力引数を使う場面\n    /// </summary>\n    class ButStillOut\n    {\n        // if 内で使うなら bool 1個の戻り値の方が使いやすい\n        static void TryPattern()\n        {\n            var s = Console.ReadLine();\n            if (int.TryParse(s, out var x)) Console.WriteLine(x);\n        }\n\n        // if 内で使うならタプルの方が煩雑\n        static void TuplePattern()\n        {\n            var s = Console.ReadLine();\n            var (success, x) = Parse(s);\n            if (success) Console.WriteLine(x);\n        }\n\n        static (bool success, int value) Parse(string s) => int.TryParse(s, out var x) ? (true, x) : (false, 0);\n\n        // C# 7の is を使って、int? の null チェック\n        static void NullCheckPattern()\n        {\n            var s = Console.ReadLine();\n            if (ParseOrDefault(s) is int x) Console.WriteLine(x);\n        }\n\n        static int? ParseOrDefault(string s) => int.TryParse(s, out var x) ? x : default(int?);\n\n        // これはオーバーロード可能\n        static void F(out int x, out int y) => (x, y) = (1, 2);\n        static void F(out int id, out string name) => (id, name) = (1, \"abc\");\n\n        // 戻り値でのオーバーロードはできない\n        // コンパイル エラーに\n        static (int x, int y) F() => (1, 2);\n#if false\n        static (int id, string name) F() => (1, \"abc\");\n#endif\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Tuples/Overload.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Tuples.Overload\n{\n    class Program\n    {\n        static void Main()\n        {\n\n        }\n\n        // 型違いのタプルでのオーバーロードは可能\n        void F((int x, int y) t) { }\n        void F((int x, string y) t) { }\n\n#if false\n        // 型が一緒で名前だけ違うタプルでのオーバーロードはダメ。コンパイル エラー\n        void G((int x, int y) t) { }\n        void G((int a, int b) t) { }\n#endif\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Tuples/Program.cs",
    "content": "﻿#pragma warning disable 219\n#pragma warning disable 8123\n\nusing System;\nusing System.Collections.Generic;\n\nnamespace Tuples\n{\n    class Sample\n    {\n        private (int x, int y) value;\n        public (int x, int y) GetValue() => value;\n\n        public Sample() { }\n        public Sample(int x, int y)\n        {\n            value = (x, y);\n        }\n    }\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            MemberAccess();\n            Ref();\n            DifferentNames();\n            TypeParameters();\n        }\n\n        private static void LocalDenotation()\n        {\n            var s = new Sample();\n            (int x, int y) t = s.GetValue();\n        }\n\n        private static void TypeInference()\n        {\n            var s = new Sample();\n            var t = s.GetValue();\n        }\n\n#if false\n        // VS 15 RC 以降書けなくなった\n        static void New()\n        {\n            // var t = new T(1, 2); みたいなのと同じノリ\n            var t1 = new (int x, int y) (1, 2);\n\n            // var t = new T { x = 1, y = 2}; みたいなのと同じノリ\n            var t2 = new (int x, int y) { x = 1, y = 2 };\n        }\n#endif\n\n        static void Deconstruct()\n        {\n            var t = (x: 1, y: 2);\n\n            // 分解宣言1\n            (int x1, int y1) = t; // x1, y1 を宣言しつつ、ｔ を分解\n            // 分解宣言2\n            var (x2, y2) = t; // 分解宣言の簡易記法\n\n            // 分解代入\n            int x, y;\n            (x, y) = t; // 分解結果を既存の変数に代入\n        }\n\n        static void Literal()\n        {\n            // メソッド呼び出し時の F(1, 2); みたいなノリ\n            (int x, int y) t1 = (1, 2);\n\n            // メソッド呼び出し時の F(x: 1, y: 2); みたいなノリ\n            var t2 = (x: 1, y: 2);\n        }\n\n        private static void MemberTypeInference()\n        {\n            // これは左辺から型推論が聞くので、null も書ける\n            (string? s, int i) t1 = (null, 1);\n\n#if false\n            // これはダメ。null の型が決まらない。\n            var t2 = (null, 1);\n#endif\n        }\n\n        static void MemberAccess()\n        {\n            var t = (x: 1, y: 2);\n            Console.WriteLine(t.x); // 1\n            Console.WriteLine(t.y); // 2\n\n            // メンバーごとに書き換え可能\n            t.x = 10;\n            t.y = 20;\n            Console.WriteLine(t.x); // 10\n            Console.WriteLine(t.y); // 20\n\n            // タプル自身も書き換え可能\n            t = (100, 200);\n            Console.WriteLine(t.x); // 100\n            Console.WriteLine(t.y); // 200\n        }\n\n        static void Ref()\n        {\n            var t = (x: 1, y: 2);\n            Swap(ref t.x, ref t.y);\n            Console.WriteLine(t.x); // 2\n            Console.WriteLine(t.y); // 1\n        }\n\n        static void Swap<T>(ref T x, ref T y)\n        {\n            var t = x;\n            x = y;\n            y = t;\n        }\n\n        static void DifferentNames()\n        {\n            (int s, int t) t1 = (x: 1, y: 2);\n            Console.WriteLine(t1.s); // 1\n            Console.WriteLine(t1.t); // 2\n\n            (int y, int x) t2 = (x: 1, y: 2);\n            Console.WriteLine(t2.x); // 2\n            Console.WriteLine(t2.y); // 1\n        }\n\n        static void DifferentTypes()\n        {\n            {\n                object x = \"abc\"; // string → object は OK\n                long y = 1; // int → long は OK\n                int? z = 2; // int → int? は OK\n                // ↓\n                (object x, long y, int? z) t = (\"abc\", 1, 2); // OK\n            }\n#if false\n            {\n                string x = 1; // int → string は NG\n                int y = 1L; // long → int は NG\n                int z = default(int?); // int? → int は NG\n                // ↓\n                (string x, int y, int z) t = (1, 1L, default(int?)); // NG\n            }\n#endif\n        }\n\n        static void NestedTuples()\n        {\n            // タプルの入れ子\n            (string a, (int x, int y) b) t1 = (\"abc\", (1, 2));\n            Console.WriteLine(t1.a);   // abc\n            Console.WriteLine(t1.b.x); // 1\n            Console.WriteLine(t1.b.y); // 2\n\n            // 型推論も可能\n            var t2 = (a: \"abc\", b: (x: 1, y: 2));\n        }\n\n        static void TypeParameters()\n        {\n            var dic = new Dictionary<(string s, string t), (int x, int y)>\n            {\n                { (\"a\", \"b\"), (1, 2) },\n                { (\"x\", \"y\"), (4, 8) },\n            };\n\n            Console.WriteLine(dic[(\"a\", \"b\")]); // (1, 2)\n        }\n\n        static void AnonymousMember()\n        {\n            var t1 = (1, 2);\n            Console.WriteLine(t1.Item1); // 1\n            Console.WriteLine(t1.Item2); // 2\n\n            //var t2 = (x: 1, 2); // 次のプレビューにはこれできるようになるはず\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Tuples/Summary.cs",
    "content": "﻿namespace Tuples.Summary\n{\n    using System;\n    using System.Collections.Generic;\n\n    class Program\n    {\n        // タプルを使って2つの戻り値を返す\n        static (int count, int sum) Tally(IEnumerable<int> items)\n        {\n            var count = 0;\n            var sum = 0;\n            foreach (var x in items)\n            {\n                sum += x;\n                count++;\n            }\n\n            return (count, sum);\n        }\n\n        static void Main()\n        {\n            var data = new[] { 1, 2, 3, 4, 5 };\n            var t = Tally(data);\n            Console.WriteLine($\"{t.sum}/{t.count}\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Tuples/Tuples.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>Tuples.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Data/Tuples/ValueTuple.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Runtime.InteropServices;\n\nnamespace Tuples.X\n{\n    [StructLayout(LayoutKind.Auto)]\n    public struct ValueTuple<T1, T2>\n        //: IEquatable<ValueTuple<T1, T2>>, IStructuralEquatable, IStructuralComparable, IComparable, IComparable<ValueTuple<T1, T2>>\n    {\n        public T1 Item1;\n        public T2 Item2;\n\n        public ValueTuple(T1 item1, T2 item2)\n        {\n            Item1 = item1;\n            Item2 = item2;\n        }\n\n        // 後略、インターフェイスのメンバー定義\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/Tuples/ZipSample.cs",
    "content": "﻿namespace Tuples.ZipSample\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    class Program\n    {\n        static void Main()\n        {\n            int[] a1 = new[] { 1, 2, 3 };\n            string[] a2 = new[] { \"a\", \"b\", \"c\" };\n\n            // 配列 ×2のタプルに対して、IEnumerable ×2のタプルの拡張メソッドを呼べる\n            foreach (var (i, s) in (a1, a2).Zip())\n            {\n                Console.WriteLine($\"{i}: {s}\");\n            }\n        }\n    }\n\n    static class TupelExtensions\n    {\n        // IEnumerable ×2 に対する拡張メソッド\n        public static IEnumerable<(T1 x1, T2 x2)> Zip<T1, T2>(this (IEnumerable<T1> items1, IEnumerable<T2> items2) t)\n            => t.items1.Zip(t.items2, (x1, x2) => (x1, x2));\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/Expressions/Calculate.switcha.cs",
    "content": "﻿using System;\n\nnamespace TypeSwitch.Expressions\n{\n    public static partial class NodeExtensions\n    {\n        public static int Calculate(this Node n, int x)\n        {\n            switch (n)\n            {\n                case Var v: return x;\n                case Const c: return c.Value;\n                case Add a: return Calculate(a.Left, x) + Calculate(a.Right, x);\n                case Mul m: return Calculate(m.Left, x) * Calculate(m.Right, x);\n            }\n            throw new ArgumentOutOfRangeException();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/Expressions/Calculate.vritual.cs",
    "content": "﻿namespace TypeSwitch.Expressions\n{\n    abstract partial class Node\n    {\n        public abstract int Calculate(int x);\n    }\n\n    partial class Var\n    {\n        public override int Calculate(int x) => x;\n    }\n\n    partial class Const\n    {\n        public override int Calculate(int x) => Value;\n    }\n\n    partial class Add\n    {\n        public override int Calculate(int x) => Left.Calculate(x) + Right.Calculate(x);\n    }\n\n    partial class Mul\n    {\n        public override int Calculate(int x) => Left.Calculate(x) * Right.Calculate(x);\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/Expressions/Node.cs",
    "content": "﻿namespace TypeSwitch.Expressions\n{\n    public partial class Node { }\n\n    public partial class Var : Node { }\n\n    public partial class Const : Node\n    {\n        public int Value { get; }\n        public Const(int value) { Value = value; }\n    }\n\n    public partial class Add : Node\n    {\n        public Node Left { get; }\n        public Node Right { get; }\n        public Add(Node left, Node right)\n        {\n            Left = left;\n            Right = right;\n        }\n    }\n\n    public partial class Mul : Node\n    {\n        public Node Left { get; }\n        public Node Right { get; }\n        public Mul(Node left, Node right)\n        {\n            Left = left;\n            Right = right;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/Expressions/NodeBuilder.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace TypeSwitch.Expressions\n{\n    partial class Node\n    {\n        public static readonly Node X = new Var();\n        public static implicit operator Node(int v) => new Const(v);\n        public static Node operator+(Node l, Node r) => new Add(l, r);\n        public static Node operator*(Node l, Node r) => new Mul(l, r);\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/Expressions/Program.cs",
    "content": "﻿namespace TypeSwitch.Expressions\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Linq;\n    using System.Text;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        static void Main()\n        {\n            var x = Node.X;\n\n            var expressions = new[]\n            {\n                x * x + 1,\n                2 * x + 3,\n                x * x + 2 * x + 1,\n                5 * x * x * x * x * x + 4 * x * x * x * x + 3 * x * x * x + 2 * x * x + 1,\n            };\n            var values = new[] { 1, 2, 3, 5, 7, 11 };\n\n            WriteResults(expressions, values);\n\n            const int N = 100000;\n            var sw = new Stopwatch();\n\n            sw.Start();\n            for (int i = 0; i < N; i++)\n                foreach (var ex in expressions)\n                    foreach (var v in values)\n                        ex.Calculate(v);\n            sw.Stop();\n            Console.WriteLine(\"virtual method: \" + sw.Elapsed);\n\n            sw.Reset();\n\n            sw.Start();\n            for (int i = 0; i < N; i++)\n                foreach (var ex in expressions)\n                    foreach (var v in values)\n                        NodeExtensions.Calculate(ex, v);\n            sw.Stop();\n            Console.WriteLine(\"type switch   : \" + sw.Elapsed);\n        }\n\n        private static void WriteResults(Node[] expressions, int[] values)\n        {\n            foreach (var ex in expressions)\n            {\n                foreach (var v in values)\n                {\n                    var r = ex.Calculate(v);\n                    Console.WriteLine($\"{ex.ToCsharpCode()} --[x = {v}]-> {r}\");\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/Expressions/ToString.cs",
    "content": "﻿using System;\n\nnamespace TypeSwitch.Expressions\n{\n    public static partial class NodeExtensions\n    {\n        public static string ToCsharpCode(this Node n)\n        {\n            switch (n)\n            {\n                case Var v: return \"x\";\n                case Const c: return c.Value.ToString();\n                case Add a: return a.Left.ToCsharpCode() + \" + \" + a.Right.ToCsharpCode();\n                case Mul m: return m.Left.ToCsharpCode() + \" * \" + m.Right.ToCsharpCode();\n            }\n            throw new ArgumentOutOfRangeException();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/IsSample.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace TypeSwitch\n{\n    class IsSample\n    {\n        static void 型判定のみ(object obj)\n        {\n            // 型判定のみなら、これまでの is 演算子でも十分\n            if (obj is string) Console.WriteLine(\"string\");\n        }\n\n        static void 型変換もしたい(object obj)\n        {\n            // 型変換もしたい\n            if (obj is string)\n            {\n                var s = (string)obj;\n                //↑ isとキャストで2つの別命令を使う。二重処理になってるだけで無駄\n                Console.WriteLine(\"string #\" + s.Length);\n            }\n\n            {\n                // 結局、as 演算子 + null チェックを使うことになる\n                var s = obj as string;\n                if (s != null)\n                {\n                    Console.WriteLine(\"string #\" + s.Length);\n                }\n            }\n        }\n\n        static void TypeSwitch(object obj)\n        {\n            // C# 7での新しい書き方\n            if (obj is string s)\n            {\n                Console.WriteLine(\"string #\" + s.Length);\n            }\n        }\n\n        static void NullCheck()\n        {\n            string x = null!;\n\n            if (x is string)\n            {\n                // x の変数の型は string なのに、is string は false\n                // is 演算子は変数の実行時の中身を見る ＆ null には型がない\n                Console.WriteLine(\"ここは絶対通らない\");\n            }\n        }\n\n        static void F(string nullable)\n        {\n            if (nullable is string nonNull)\n            {\n                Console.WriteLine(nonNull.Length);\n            }\n        }\n\n        static void F(int? x)\n        {\n#if false\n            // C# 6以前の書き方\n            if (x.HasValue)\n            {\n                // この「.Value」が結構うっとおしい\n                Console.WriteLine(x.Value * x.Value);\n            }\n#else\n            if (x is int n)\n            {\n                Console.WriteLine(n * n);\n            }\n#endif\n\n#if false\n            static void F(object obj)\n            {\n                if (obj is string)\n                {\n                    // この中では obj を string 扱いできる言語がある\n                    // C# ではコンパイル エラー\n                    Console.WriteLine(\"string #\" + obj.Length);\n                }\n                else if (obj is int)\n                {\n                    // 同上、int 扱いできる言語がある\n                    // C# ではコンパイル エラー\n                    Console.WriteLine(\"int \" + (obj * obj));\n                }\n            }\n\n            static void F(object x)\n            {\n                if (x is string x)\n                {\n                    // 引数の x とは別に、is 演算子で別の「x」を導入できる言語もある\n                    // C# ではコンパイル エラー\n                    Console.WriteLine(\"string #\" + x.Length);\n                }\n            }\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace TypeSwitch\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/Summary.cs",
    "content": "﻿using System;\n\nnamespace TypeSwitch.Summary\n{\n    class Program\n    {\n        static void F(object obj)\n        {\n            if (obj is string s)\n            {\n                Console.WriteLine(\"string #\" + s.Length);\n            }\n\n            switch (obj)\n            {\n                case 7:\n                    Console.WriteLine(\"7の時だけここに来る\");\n                    break;\n                case int n when n > 0:\n                    Console.WriteLine(\"正の数の時にここに来る \" + n);\n                    // ただし、上から順に判定するので、7 の時には来なくなる\n                    break;\n                case int n:\n                    Console.WriteLine(\"整数の時にここに来る\" + n);\n                    // 同上、0 以下の時にしか来ない\n                    break;\n                default:\n                    Console.WriteLine(\"その他\");\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/SwitchPerformance.cs",
    "content": "﻿namespace SwitchPerformance\n{\n    using System;\n    using System.Diagnostics;\n\n    class Program\n    {\n        static void Main()\n        {\n            var sw = new Stopwatch();\n\n            // bool 型は一番先頭 = 速い\n            object t = true;\n            sw.Start();\n            for (int i = 0; i < 100000; i++) TypeSwitch(t);\n            sw.Stop();\n            Console.WriteLine(\"bool   \" + sw.Elapsed); // かなり速いはず\n\n            // double 型は一番末尾 = 遅い\n            object d = 1.1;\n            sw.Restart();\n            for (int i = 0; i < 100000; i++) TypeSwitch(d);\n            sw.Stop();\n            Console.WriteLine(\"string \" + sw.Elapsed); // 手元の環境では5倍くらい遅かった\n\n            // どの case にもない型。default 句に行く\n            var s = DateTime.UtcNow;\n            sw.Restart();\n            for (int i = 0; i < 100000; i++) TypeSwitch(s);\n            sw.Stop();\n            Console.WriteLine(\"string \" + sw.Elapsed); // 一番最後まで判定するので遅い\n        }\n\n        static int TypeSwitch(object x)\n        {\n            switch (x)\n            {\n                default: return -1; // ちなみに、default 句はどこに書こうと必ず一番最後\n                case bool _: return 0; // 前から順に判定ということは、bool の時が一番早い\n                case sbyte _: return 1;\n                case byte _: return 2;\n                case short _: return 3;\n                case ushort _: return 4;\n                case int _: return 5;\n                case uint _: return 6;\n                case long _: return 7;\n                case ulong _: return 8;\n                case float _: return 9;\n                case double _: return 10; // 逆に double の時は凄く遅い\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/SwitchSample.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace TypeSwitch\n{\n    class SwitchSample\n    {\n        static void F(object obj)\n        {\n            switch (obj)\n            {\n                case string s:\n                    Console.WriteLine(\"string #\" + s.Length);\n                    break;\n                case 7:\n                    Console.WriteLine(\"7の時だけここに来る\");\n                    break;\n                case int n when n > 0:\n                    Console.WriteLine(\"正の数の時にここに来る \" + n);\n                    // ただし、上から順に判定するので、7 の時には来なくなる\n                    break;\n                case int n:\n                    Console.WriteLine(\"整数の時にここに来る\" + n);\n                    // 同上、0 以下の時にしか来ない\n                    break;\n                default:\n                    Console.WriteLine(\"その他\");\n                    break;\n            }\n        }\n\n        static void TypeSwitch(object obj)\n        {\n            switch (obj)\n            {\n                case int n:\n                    Console.WriteLine(\"整数 \" + n);\n                    break;\n                case string s:\n                    Console.WriteLine(\"文字列 \" + s);\n                    break;\n                default:\n                    Console.WriteLine(\"その他\");\n                    break;\n            }\n        }\n\n        static string 値だけでswitch(int n)\n        {\n            switch(n)\n            {\n                case 0: return \"zero\";\n                case 1: return \"one\";\n                case 2: return \"two\";\n                case 3: return \"three\";\n                case 4: return \"four\";\n                case 5: return \"five\";\n                case 6: return \"six\";\n                case 7: return \"seven\";\n                case 8: return \"eight\";\n                case 9: return \"nine\";\n                default: return \"other\";\n            }\n        }\n\n        static string ジャンプテーブル化(int n)\n        {\n            var map = new Dictionary<int, string>\n            {\n                { 0, \"zero\" },\n                { 1, \"one\" },\n                { 2, \"two\" },\n                { 3, \"three\" },\n                { 4, \"four\" },\n                { 5, \"five\" },\n                { 6, \"six\" },\n                { 7, \"seven\" },\n                { 8, \"eight\" },\n                { 9, \"nine\" },\n            };\n\n            if (map.TryGetValue(n, out var s)) return s;\n            else return \"other\";\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/TypeSwitch.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>TypeSwitch.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Data/TypeSwitch/TypeSwitchPerformance.cs",
    "content": "﻿namespace TypeSwitch.TypeSwitchPerformance\n{\n    using System;\n    using System.Diagnostics;\n\n    class Program\n    {\n        static void Main()\n        {\n            var sw = new Stopwatch();\n\n            // bool 型は一番先頭 = 速い\n            object t = true;\n            sw.Start();\n            for (int i = 0; i < 100000; i++) TypeSwitch(t);\n            sw.Stop();\n            Console.WriteLine(\"bool   \" + sw.Elapsed); // かなり速いはず\n\n            // double 型は一番末尾 = 遅い\n            object d = 1.1;\n            sw.Restart();\n            for (int i = 0; i < 100000; i++) TypeSwitch(d);\n            sw.Stop();\n            Console.WriteLine(\"string \" + sw.Elapsed); // 手元の環境では5倍くらい遅かった\n\n            // どの case にもない型。default 句に行く\n            var s = DateTime.UtcNow;\n            sw.Restart();\n            for (int i = 0; i < 100000; i++) TypeSwitch(s);\n            sw.Stop();\n            Console.WriteLine(\"string \" + sw.Elapsed); // 一番最後まで判定するので遅い\n        }\n\n        static int TypeSwitch(object x)\n        {\n            switch (x)\n            {\n                default: return -1; // ちなみに、default 句はどこに書こうと必ず一番最後\n                case bool _: return 0; // 前から順に判定ということは、bool の時が一番早い\n                case sbyte _: return 1;\n                case byte _: return 2;\n                case short _: return 3;\n                case ushort _: return 4;\n                case int _: return 5;\n                case uint _: return 6;\n                case long _: return 7;\n                case ulong _: return 8;\n                case float _: return 9;\n                case double _: return 10; // 逆に double の時は凄く遅い\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/.gitignore",
    "content": "!FluentArithmetic.Nupkg\n!build"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/CodeAwareLibrarySample.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"FluentArithmeticAnalyzer\", \"FluentArithmeticAnalyzer\\FluentArithmeticAnalyzer\\FluentArithmeticAnalyzer.csproj\", \"{F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"FluentArithmeticAnalyzer.Test\", \"FluentArithmeticAnalyzer\\FluentArithmeticAnalyzer.Test\\FluentArithmeticAnalyzer.Test.csproj\", \"{CC884804-54C8-4037-B0F2-5A2FD244E28F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"FluentArithmeticAnalyzer.Vsix\", \"FluentArithmeticAnalyzer\\FluentArithmeticAnalyzer.Vsix\\FluentArithmeticAnalyzer.Vsix.csproj\", \"{F56992C4-EA05-4DBA-95E0-2FF1CA329606}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"FluentArithmetic\", \"FluentArithmetic\\FluentArithmetic.csproj\", \"{CFD35C67-C0D4-4196-92E8-14975FD3A7A1}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CC884804-54C8-4037-B0F2-5A2FD244E28F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CC884804-54C8-4037-B0F2-5A2FD244E28F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CC884804-54C8-4037-B0F2-5A2FD244E28F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CC884804-54C8-4037-B0F2-5A2FD244E28F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F56992C4-EA05-4DBA-95E0-2FF1CA329606}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F56992C4-EA05-4DBA-95E0-2FF1CA329606}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F56992C4-EA05-4DBA-95E0-2FF1CA329606}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F56992C4-EA05-4DBA-95E0-2FF1CA329606}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CFD35C67-C0D4-4196-92E8-14975FD3A7A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CFD35C67-C0D4-4196-92E8-14975FD3A7A1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CFD35C67-C0D4-4196-92E8-14975FD3A7A1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CFD35C67-C0D4-4196-92E8-14975FD3A7A1}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmetic/FluentArithmetic.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{CFD35C67-C0D4-4196-92E8-14975FD3A7A1}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>FluentArithmetic</RootNamespace>\n    <AssemblyName>FluentArithmetic</AssemblyName>\n    <DefaultLanguage>ja-JP</DefaultLanguage>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <TargetFrameworkVersion>v5.0</TargetFrameworkVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <!-- A reference to the entire .NET Framework is automatically included -->\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"FluentExtensions.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\Portable\\$(TargetFrameworkVersion)\\Microsoft.Portable.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmetic/FluentExtensions.cs",
    "content": "﻿namespace FluentArithmetic\n{\n    public static class FluentExtensions\n    {\n        public static int Add(this int x, int y) => x + y;\n        public static int Sub(this int x, int y) => x - y;\n        public static int Mul(this int x, int y) => x * y;\n        public static int Div(this int x, int y) => x / y;\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmetic/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Resources;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"FluentArithmetic\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"FluentArithmetic\")]\n[assembly: AssemblyCopyright(\"Copyright (C)  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n[assembly: NeutralResourcesLanguage(\"ja\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン \n//      ビルド番号\n//      リビジョン\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmetic/project.json",
    "content": "﻿{\n  \"supports\": {},\n  \"dependencies\": {\n    \"Microsoft.NETCore.Portable.Compatibility\": \"1.0.1\",\n    \"NETStandard.Library\": \"1.6.0\"\n  },\n  \"frameworks\": {\n    \"netstandard1.1\": {}\n  }\n}"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/Assembly.cs",
    "content": "﻿[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(\"FluentArithmeticAnalyzer.Test\")]\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/DivByZero/DivByZeroAnalyzer.cs",
    "content": "﻿using System.Collections.Immutable;\nusing System.Linq;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\nusing Microsoft.CodeAnalysis.Diagnostics;\n\nnamespace FluentArithmeticAnalyzer.DivByZero\n{\n    [DiagnosticAnalyzer(LanguageNames.CSharp)]\n    public class DivByZeroAnalyzer : DiagnosticAnalyzer\n    {\n        public const string DiagnosticId = \"DivByZeroAnalyzer\";\n        internal static readonly LocalizableString Title = \"Call 'Div' by 0\";\n        internal static readonly LocalizableString MessageFormat = \"Do not call the 'Div' method with 'y' being 0.\";\n        internal const string Category = \"Correction\";\n\n        internal static DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Error, true);\n\n        public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(Rule);\n\n        public override void Initialize(AnalysisContext context)\n        {\n            context.RegisterSyntaxNodeAction(AnalyzeMethod, SyntaxKind.MethodDeclaration);\n        }\n\n        private void AnalyzeMethod(SyntaxNodeAnalysisContext context)\n        {\n            var invocations = context.Node\n                .DescendantNodes()\n                .OfType<InvocationExpressionSyntax>();\n\n            foreach (var ex in invocations)\n            {\n                var method = ex.GetFluentExtensionsMember(context);\n                if (method == null) continue;\n\n                var literal = ex.GetLiteralArgument();\n                if (literal == null) continue;\n\n                if (method.Name == \"Div\" && literal.Token.ValueText == \"0\")\n                {\n                    var diagnostic = Diagnostic.Create(Rule, literal.GetLocation());\n                    context.ReportDiagnostic(diagnostic);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>11.0</MinimumVisualStudioVersion>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>FluentArithmeticAnalyzer</RootNamespace>\n    <AssemblyName>FluentArithmeticAnalyzer</AssemblyName>\n    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <TargetFrameworkProfile>Profile7</TargetFrameworkProfile>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"Assembly.cs\" />\n    <Compile Include=\"DivByZero\\DivByZeroAnalyzer.cs\" />\n    <Compile Include=\"Literal\\LiteralAnalyzer.cs\" />\n    <Compile Include=\"Literal\\LiteralFix.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"SyntaxExtensions.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <EmbeddedResource Include=\"Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\Portable\\v4.6\\Microsoft.Portable.CSharp.targets\" />\n  <PropertyGroup>\n    <PostBuildEvent>\n    </PostBuildEvent>\n    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>\n  </PropertyGroup>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/Literal/LiteralAnalyzer.cs",
    "content": "﻿using System.Collections.Immutable;\nusing System.Linq;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\nusing Microsoft.CodeAnalysis.Diagnostics;\n\nnamespace FluentArithmeticAnalyzer.Literal\n{\n    [DiagnosticAnalyzer(LanguageNames.CSharp)]\n    public class LiteralAnalyzer : DiagnosticAnalyzer\n    {\n        public const string DiagnosticId = \"LiteralAnalyzer\";\n        internal static readonly LocalizableString Title = \"Arithmetic operation on two literals\";\n        internal static readonly LocalizableString MessageFormat = \"Call the {0} with two literals\";\n        internal const string Category = \"Correction\";\n\n        internal static DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Info, true);\n\n        public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }\n\n        public override void Initialize(AnalysisContext context)\n        {\n            context.RegisterSyntaxNodeAction(AnalyzeMethod, SyntaxKind.MethodDeclaration);\n        }\n\n        private void AnalyzeMethod(SyntaxNodeAnalysisContext context)\n        {\n            var invocations = context.Node\n                .DescendantNodes()\n                .OfType<InvocationExpressionSyntax>();\n\n            foreach (var ex in invocations)\n            {\n                var method = ex.GetFluentExtensionsMember(context);\n                if (method == null) continue;\n\n                var literal = ex.GetLiteralArgument();\n                if (literal == null) continue;\n                if (method.Name == \"Div\" && literal.Token.ValueText == \"0\") continue;\n\n                var obj = ex.GetLiteralExpression();\n                if (obj == null) continue;\n\n                var diagnostic = Diagnostic.Create(Rule, ex.GetLocation(), method.Name);\n                context.ReportDiagnostic(diagnostic);\n            }\n        }\n    }\n}"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/Literal/LiteralFix.cs",
    "content": "﻿using System;\nusing System.Composition;\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CodeFixes;\nusing Microsoft.CodeAnalysis.CodeActions;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\nusing Microsoft.CodeAnalysis.Rename;\nusing Microsoft.CodeAnalysis.Text;\n\nnamespace FluentArithmeticAnalyzer.Literal\n{\n    [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(LiteralFix)), Shared]\n    public class LiteralFix : CodeFixProvider\n    {\n        public sealed override ImmutableArray<string> FixableDiagnosticIds => ImmutableArray.Create(LiteralAnalyzer.DiagnosticId);\n\n        public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;\n\n        public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)\n        {\n            var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken);\n            var expr = root.FindNode(context.Span).FirstAncestorOrSelf<InvocationExpressionSyntax>();\n\n            if (expr != null)\n            {\n                context.RegisterCodeFix(\n                    CodeAction.Create(\"Optimize to one literal\",\n                        c => ChangeToOneLiteral(expr, context.Document, c)),\n                    context.Diagnostics[0]);\n            }\n        }\n\n        private async Task<Document> ChangeToOneLiteral(InvocationExpressionSyntax ex, Document document, CancellationToken cancellationToken)\n        {\n            var literal1 = ex.GetLiteralExpression();\n            if (literal1 == null) return document;\n\n            var literal2 = ex.GetLiteralArgument();\n            if (literal2 == null) return document;\n\n            var x = int.Parse(literal1.Token.ValueText);\n            var y = int.Parse(literal2.Token.ValueText);\n            var newValue = 0;\n\n            switch (ex.GetMemberName())\n            {\n                case \"Add\": newValue = x + y; break;\n                case \"Sub\": newValue = x - y; break;\n                case \"Mul\": newValue = x * y; break;\n                case \"Div\": newValue = x / y; break;\n            }\n\n            var newLiteral = SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(newValue))\n                .WithLeadingTrivia(ex.GetLeadingTrivia())\n                .WithTrailingTrivia(ex.GetTrailingTrivia())\n                ;\n\n            var oldRoot = await document.GetSyntaxRootAsync(cancellationToken);\n            var newRoot = oldRoot.ReplaceNode(ex, newLiteral);\n\n            return document.WithSyntaxRoot(newRoot);\n        }\n    }\n}"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"FluentArithmeticAnalyzer\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"FluentArithmeticAnalyzer\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace FluentArithmeticAnalyzer {\n    using System;\n    using System.Reflection;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"FluentArithmeticAnalyzer.Resources\", typeof(Resources).GetTypeInfo().Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Type names should be all uppercase..\n        /// </summary>\n        internal static string AnalyzerDescription {\n            get {\n                return ResourceManager.GetString(\"AnalyzerDescription\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Type name &apos;{0}&apos; contains lowercase letters.\n        /// </summary>\n        internal static string AnalyzerMessageFormat {\n            get {\n                return ResourceManager.GetString(\"AnalyzerMessageFormat\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Type name contains lowercase letters.\n        /// </summary>\n        internal static string AnalyzerTitle {\n            get {\n                return ResourceManager.GetString(\"AnalyzerTitle\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"AnalyzerDescription\" xml:space=\"preserve\">\n    <value>Type names should be all uppercase.</value>\n    <comment>An optional longer localizable description of the diagnostic.</comment>\n  </data>\n  <data name=\"AnalyzerMessageFormat\" xml:space=\"preserve\">\n    <value>Type name '{0}' contains lowercase letters</value>\n    <comment>The format-able message the diagnostic displays.</comment>\n  </data>\n  <data name=\"AnalyzerTitle\" xml:space=\"preserve\">\n    <value>Type name contains lowercase letters</value>\n    <comment>The title of the diagnostic.</comment>\n  </data>\n</root>"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/SyntaxExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\nusing Microsoft.CodeAnalysis.Diagnostics;\n\nnamespace FluentArithmeticAnalyzer\n{\n    internal static class SyntaxExtensions\n    {\n        public static ISymbol GetFluentExtensionsMember(this InvocationExpressionSyntax expr, SyntaxNodeAnalysisContext context)\n        {\n            var ma = expr.Expression as MemberAccessExpressionSyntax;\n            if (ma == null) return null;\n\n            var method = context.SemanticModel.GetMemberGroup(ma).FirstOrDefault();\n            if (method == null) return null;\n\n            var ct = method.ContainingType;\n            if (ct.ContainingNamespace.Name != \"FluentArithmetic\" || ct.Name != \"FluentExtensions\") return null;\n\n            return method;\n        }\n\n        public static LiteralExpressionSyntax GetLiteralArgument(this InvocationExpressionSyntax expr)\n        {\n            if (expr.ArgumentList == null) return null;\n\n            var args = expr.ArgumentList.Arguments;\n            if (args.Count != 1) return null;\n\n            var arg = args[0].Expression;\n            if (!arg.IsKind(SyntaxKind.NumericLiteralExpression)) return null;\n\n            return arg as LiteralExpressionSyntax;\n        }\n\n        public static LiteralExpressionSyntax GetLiteralExpression(this InvocationExpressionSyntax expr)\n        {\n            var ma = expr.Expression as MemberAccessExpressionSyntax;\n            if (ma == null) return null;\n\n            var obj = ma.Expression;\n            if (!obj.IsKind(SyntaxKind.NumericLiteralExpression)) return null;\n\n            return obj as LiteralExpressionSyntax;\n        }\n\n        public static string GetMemberName(this InvocationExpressionSyntax expr)\n        {\n            var ma = expr.Expression as MemberAccessExpressionSyntax;\n            if (ma == null) return null;\n\n            return ma.Name.Identifier.ValueText;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer/project.json",
    "content": "﻿{\n  \"supports\": {},\n  \"dependencies\": {\n    \"Microsoft.CodeAnalysis.Analyzers\": \"1.1.0\",\n    \"Microsoft.CodeAnalysis.CSharp.Workspaces\": \"1.2.2\"\n  },\n  \"frameworks\": {\n    \".NETPortable,Version=v4.5,Profile=Profile7\": {}\n  }\n}"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/DivByZeroUnitTest.cs",
    "content": "﻿using FluentArithmeticAnalyzer.DivByZero;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CodeFixes;\nusing Microsoft.CodeAnalysis.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing TestHelper;\n\nnamespace FluentArithmeticAnalyzer.Test\n{\n    [TestClass]\n    public class DivByZeroUnitTest : CodeFixVerifier\n    {\n        [TestMethod]\n        public void TestMethod1()\n        {\n            var test = @\"using System;\nusing FluentArithmetic;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        var x = 1.Add(2).Mul(3).Sub(1).Div(4);\n        Console.WriteLine(x);\n    }\n}\n\";\n\n            VerifyCSharpDiagnostic(test);\n        }\n\n        [TestMethod]\n        public void TestMethod2()\n        {\n            var test = @\"using System;\nusing FluentArithmetic;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        var x = 1.Add(2).Mul(3).Sub(1).Div(0);\n        Console.WriteLine(x);\n    }\n}\n\";\n            var expected = new DiagnosticResult\n            {\n                Id = DivByZeroAnalyzer.DiagnosticId,\n                Message = DivByZeroAnalyzer.MessageFormat.ToString(),\n                Severity = DiagnosticSeverity.Error,\n                Locations = new[]\n                {\n                    new DiagnosticResultLocation(\"Test0.cs\", 8, 44)\n                }\n            };\n\n            VerifyCSharpDiagnostic(test, expected);\n        }\n\n        protected override CodeFixProvider GetCSharpCodeFixProvider() => null;\n\n        protected override DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer() => new DivByZeroAnalyzer();\n    }\n}"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/FluentArithmeticAnalyzer.Test.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>8.0.30703</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{CC884804-54C8-4037-B0F2-5A2FD244E28F}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>FluentArithmeticAnalyzer.Test</RootNamespace>\n    <AssemblyName>FluentArithmeticAnalyzer.Test</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.CodeAnalysis, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.CodeAnalysis.Common.1.2.2\\lib\\net45\\Microsoft.CodeAnalysis.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.CodeAnalysis.CSharp, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.CodeAnalysis.CSharp.1.2.2\\lib\\net45\\Microsoft.CodeAnalysis.CSharp.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.CodeAnalysis.CSharp.Workspaces, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.CodeAnalysis.CSharp.Workspaces.1.2.2\\lib\\net45\\Microsoft.CodeAnalysis.CSharp.Workspaces.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.CodeAnalysis.Workspaces, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.CodeAnalysis.Workspaces.Common.1.2.2\\lib\\net45\\Microsoft.CodeAnalysis.Workspaces.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.CodeAnalysis.Workspaces.Desktop, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.CodeAnalysis.Workspaces.Common.1.2.2\\lib\\net45\\Microsoft.CodeAnalysis.Workspaces.Desktop.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Collections.Immutable, Version=1.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\System.Collections.Immutable.1.1.37\\lib\\dotnet\\System.Collections.Immutable.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Composition.AttributedModel, Version=1.0.27.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.Composition.1.0.27\\lib\\portable-net45+win8+wp8+wpa81\\System.Composition.AttributedModel.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Composition.Convention, Version=1.0.27.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.Composition.1.0.27\\lib\\portable-net45+win8+wp8+wpa81\\System.Composition.Convention.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Composition.Hosting, Version=1.0.27.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.Composition.1.0.27\\lib\\portable-net45+win8+wp8+wpa81\\System.Composition.Hosting.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Composition.Runtime, Version=1.0.27.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.Composition.1.0.27\\lib\\portable-net45+win8+wp8+wpa81\\System.Composition.Runtime.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Composition.TypedParts, Version=1.0.27.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\Microsoft.Composition.1.0.27\\lib\\portable-net45+win8+wp8+wpa81\\System.Composition.TypedParts.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Reflection.Metadata, Version=1.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\packages\\System.Reflection.Metadata.1.2.0\\lib\\portable-net45+win8\\System.Reflection.Metadata.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"LiteralUnitTest.cs\" />\n    <Compile Include=\"Verifiers\\CodeFixVerifier.cs\" />\n    <Compile Include=\"Verifiers\\DiagnosticVerifier.cs\" />\n    <Compile Include=\"Helpers\\CodeFixVerifier.Helper.cs\" />\n    <Compile Include=\"Helpers\\DiagnosticResult.cs\" />\n    <Compile Include=\"Helpers\\DiagnosticVerifier.Helper.cs\" />\n    <Compile Include=\"DivByZeroUnitTest.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"app.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\FluentArithmetic\\FluentArithmetic.csproj\">\n      <Project>{cfd35c67-c0d4-4196-92e8-14975fd3a7a1}</Project>\n      <Name>FluentArithmetic</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\FluentArithmeticAnalyzer\\FluentArithmeticAnalyzer.csproj\">\n      <Project>{F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}</Project>\n      <Name>FluentArithmeticAnalyzer</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <Service Include=\"{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Analyzer Include=\"..\\..\\packages\\Microsoft.CodeAnalysis.Analyzers.1.1.0\\analyzers\\dotnet\\cs\\Microsoft.CodeAnalysis.Analyzers.dll\" />\n    <Analyzer Include=\"..\\..\\packages\\Microsoft.CodeAnalysis.Analyzers.1.1.0\\analyzers\\dotnet\\cs\\Microsoft.CodeAnalysis.CSharp.Analyzers.dll\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/Helpers/CodeFixVerifier.Helper.cs",
    "content": "﻿using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CodeActions;\nusing Microsoft.CodeAnalysis.Formatting;\nusing Microsoft.CodeAnalysis.Simplification;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\n\nnamespace TestHelper\n{\n    /// <summary>\n    /// Diagnostic Producer class with extra methods dealing with applying codefixes\n    /// All methods are static\n    /// </summary>\n    public abstract partial class CodeFixVerifier : DiagnosticVerifier\n    {\n        /// <summary>\n        /// Apply the inputted CodeAction to the inputted document.\n        /// Meant to be used to apply codefixes.\n        /// </summary>\n        /// <param name=\"document\">The Document to apply the fix on</param>\n        /// <param name=\"codeAction\">A CodeAction that will be applied to the Document.</param>\n        /// <returns>A Document with the changes from the CodeAction</returns>\n        private static Document ApplyFix(Document document, CodeAction codeAction)\n        {\n            var operations = codeAction.GetOperationsAsync(CancellationToken.None).Result;\n            var solution = operations.OfType<ApplyChangesOperation>().Single().ChangedSolution;\n            return solution.GetDocument(document.Id);\n        }\n\n        /// <summary>\n        /// Compare two collections of Diagnostics,and return a list of any new diagnostics that appear only in the second collection.\n        /// Note: Considers Diagnostics to be the same if they have the same Ids.  In the case of multiple diagnostics with the same Id in a row,\n        /// this method may not necessarily return the new one.\n        /// </summary>\n        /// <param name=\"diagnostics\">The Diagnostics that existed in the code before the CodeFix was applied</param>\n        /// <param name=\"newDiagnostics\">The Diagnostics that exist in the code after the CodeFix was applied</param>\n        /// <returns>A list of Diagnostics that only surfaced in the code after the CodeFix was applied</returns>\n        private static IEnumerable<Diagnostic> GetNewDiagnostics(IEnumerable<Diagnostic> diagnostics, IEnumerable<Diagnostic> newDiagnostics)\n        {\n            var oldArray = diagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray();\n            var newArray = newDiagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray();\n\n            int oldIndex = 0;\n            int newIndex = 0;\n\n            while (newIndex < newArray.Length)\n            {\n                if (oldIndex < oldArray.Length && oldArray[oldIndex].Id == newArray[newIndex].Id)\n                {\n                    ++oldIndex;\n                    ++newIndex;\n                }\n                else\n                {\n                    yield return newArray[newIndex++];\n                }\n            }\n        }\n\n        /// <summary>\n        /// Get the existing compiler diagnostics on the inputted document.\n        /// </summary>\n        /// <param name=\"document\">The Document to run the compiler diagnostic analyzers on</param>\n        /// <returns>The compiler diagnostics that were found in the code</returns>\n        private static IEnumerable<Diagnostic> GetCompilerDiagnostics(Document document) => document.GetSemanticModelAsync().Result.GetDiagnostics();\n\n        /// <summary>\n        /// Given a document, turn it into a string based on the syntax root\n        /// </summary>\n        /// <param name=\"document\">The Document to be converted to a string</param>\n        /// <returns>A string containing the syntax of the Document after formatting</returns>\n        private static string GetStringFromDocument(Document document)\n        {\n            var simplifiedDoc = Simplifier.ReduceAsync(document, Simplifier.Annotation).Result;\n            var root = simplifiedDoc.GetSyntaxRootAsync().Result;\n            root = Formatter.Format(root, Formatter.Annotation, simplifiedDoc.Project.Solution.Workspace);\n            return root.GetText().ToString();\n        }\n    }\n}\n\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/Helpers/DiagnosticResult.cs",
    "content": "﻿using Microsoft.CodeAnalysis;\nusing System;\n\nnamespace TestHelper\n{\n    /// <summary>\n    /// Location where the diagnostic appears, as determined by path, line number, and column number.\n    /// </summary>\n    public struct DiagnosticResultLocation\n    {\n        public DiagnosticResultLocation(string path, int line, int column)\n        {\n            if (line < 0 && column < 0)\n            {\n                throw new ArgumentOutOfRangeException(\"At least one of line and column must be > 0\");\n            }\n            if (line < -1 || column < -1)\n            {\n                throw new ArgumentOutOfRangeException(\"Both line and column must be >= -1\");\n            }\n\n            this.Path = path;\n            this.Line = line;\n            this.Column = column;\n        }\n\n        public string Path;\n        public int Line;\n        public int Column;\n    }\n\n    /// <summary>\n    /// Struct that stores information about a Diagnostic appearing in a source\n    /// </summary>\n    public struct DiagnosticResult\n    {\n        private DiagnosticResultLocation[] locations;\n\n        public DiagnosticResultLocation[] Locations\n        {\n            get\n            {\n                if (this.locations == null)\n                {\n                    this.locations = new DiagnosticResultLocation[] { };\n                }\n                return this.locations;\n            }\n\n            set\n            {\n                this.locations = value;\n            }\n        }\n\n        public DiagnosticSeverity Severity { get; set; }\n\n        public string Id { get; set; }\n\n        public string Message { get; set; }\n\n        public string Path => this.Locations.Length > 0 ? this.Locations[0].Path : \"\";\n\n        public int Line => this.Locations.Length > 0 ? this.Locations[0].Line : -1;\n\n        public int Column => this.Locations.Length > 0 ? this.Locations[0].Column : -1;\n    }\n}"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/Helpers/DiagnosticVerifier.Helper.cs",
    "content": "﻿using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.Diagnostics;\nusing Microsoft.CodeAnalysis.Text;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Linq;\nusing System.Threading;\n\nnamespace TestHelper\n{\n    /// <summary>\n    /// Class for turning strings into documents and getting the diagnostics on them\n    /// All methods are static\n    /// </summary>\n    public abstract partial class DiagnosticVerifier\n    {\n        private static readonly MetadataReference CorlibReference = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);\n        private static readonly MetadataReference SystemCoreReference = MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location);\n        private static readonly MetadataReference CSharpSymbolsReference = MetadataReference.CreateFromFile(typeof(CSharpCompilation).Assembly.Location);\n        private static readonly MetadataReference CodeAnalysisReference = MetadataReference.CreateFromFile(typeof(Compilation).Assembly.Location);\n        private static readonly MetadataReference FluentArithmeticReference = MetadataReference.CreateFromFile(typeof(FluentArithmetic.FluentExtensions).Assembly.Location);\n\n        internal static string DefaultFilePathPrefix = \"Test\";\n        internal static string CSharpDefaultFileExt = \"cs\";\n        internal static string VisualBasicDefaultExt = \"vb\";\n        internal static string CSharpDefaultFilePath = DefaultFilePathPrefix + 0 + \".\" + CSharpDefaultFileExt;\n        internal static string VisualBasicDefaultFilePath = DefaultFilePathPrefix + 0 + \".\" + VisualBasicDefaultExt;\n        internal static string TestProjectName = \"TestProject\";\n\n        #region  Get Diagnostics\n\n        /// <summary>\n        /// Given classes in the form of strings, their language, and an IDiagnosticAnlayzer to apply to it, return the diagnostics found in the string after converting it to a document.\n        /// </summary>\n        /// <param name=\"sources\">Classes in the form of strings</param>\n        /// <param name=\"language\">The language the source classes are in</param>\n        /// <param name=\"analyzer\">The analyzer to be run on the sources</param>\n        /// <returns>An IEnumerable of Diagnostics that surfaced in the source code, sorted by Location</returns>\n        private static Diagnostic[] GetSortedDiagnostics(string[] sources, string language, DiagnosticAnalyzer analyzer) => GetSortedDiagnosticsFromDocuments(analyzer, GetDocuments(sources, language));\n\n        /// <summary>\n        /// Given an analyzer and a document to apply it to, run the analyzer and gather an array of diagnostics found in it.\n        /// The returned diagnostics are then ordered by location in the source document.\n        /// </summary>\n        /// <param name=\"analyzer\">The analyzer to run on the documents</param>\n        /// <param name=\"documents\">The Documents that the analyzer will be run on</param>\n        /// <param name=\"spans\">Optional TextSpan indicating where a Diagnostic will be found</param>\n        /// <returns>An IEnumerable of Diagnostics that surfaced in the source code, sorted by Location</returns>\n        protected static Diagnostic[] GetSortedDiagnosticsFromDocuments(DiagnosticAnalyzer analyzer, Document[] documents)\n        {\n            var projects = new HashSet<Project>();\n            foreach (var document in documents)\n            {\n                projects.Add(document.Project);\n            }\n\n            var diagnostics = new List<Diagnostic>();\n            foreach (var project in projects)\n            {\n                var compilationWithAnalyzers = project.GetCompilationAsync().Result.WithAnalyzers(ImmutableArray.Create(analyzer));\n                var diags = compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync().Result;\n                foreach (var diag in diags)\n                {\n                    if (diag.Location == Location.None || diag.Location.IsInMetadata)\n                    {\n                        diagnostics.Add(diag);\n                    }\n                    else\n                    {\n                        for (int i = 0; i < documents.Length; i++)\n                        {\n                            var document = documents[i];\n                            var tree = document.GetSyntaxTreeAsync().Result;\n                            if (tree == diag.Location.SourceTree)\n                            {\n                                diagnostics.Add(diag);\n                            }\n                        }\n                    }\n                }\n            }\n\n            var results = SortDiagnostics(diagnostics);\n            diagnostics.Clear();\n            return results;\n        }\n\n        /// <summary>\n        /// Sort diagnostics by location in source document\n        /// </summary>\n        /// <param name=\"diagnostics\">The list of Diagnostics to be sorted</param>\n        /// <returns>An IEnumerable containing the Diagnostics in order of Location</returns>\n        private static Diagnostic[] SortDiagnostics(IEnumerable<Diagnostic> diagnostics) => diagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray();\n\n        #endregion\n\n        #region Set up compilation and documents\n        /// <summary>\n        /// Given an array of strings as sources and a language, turn them into a project and return the documents and spans of it.\n        /// </summary>\n        /// <param name=\"sources\">Classes in the form of strings</param>\n        /// <param name=\"language\">The language the source code is in</param>\n        /// <returns>A Tuple containing the Documents produced from the sources and their TextSpans if relevant</returns>\n        private static Document[] GetDocuments(string[] sources, string language)\n        {\n            if (language != LanguageNames.CSharp && language != LanguageNames.VisualBasic)\n            {\n                throw new ArgumentException(\"Unsupported Language\");\n            }\n\n            for (int i = 0; i < sources.Length; i++)\n            {\n                string fileName = language == LanguageNames.CSharp ? \"Test\" + i + \".cs\" : \"Test\" + i + \".vb\";\n            }\n\n            var project = CreateProject(sources, language);\n            var documents = project.Documents.ToArray();\n\n            if (sources.Length != documents.Length)\n            {\n                throw new SystemException(\"Amount of sources did not match amount of Documents created\");\n            }\n\n            return documents;\n        }\n\n        /// <summary>\n        /// Create a Document from a string through creating a project that contains it.\n        /// </summary>\n        /// <param name=\"source\">Classes in the form of a string</param>\n        /// <param name=\"language\">The language the source code is in</param>\n        /// <returns>A Document created from the source string</returns>\n        protected static Document CreateDocument(string source, string language = LanguageNames.CSharp) => CreateProject(new[] { source }, language).Documents.First();\n\n        /// <summary>\n        /// Create a project using the inputted strings as sources.\n        /// </summary>\n        /// <param name=\"sources\">Classes in the form of strings</param>\n        /// <param name=\"language\">The language the source code is in</param>\n        /// <returns>A Project created out of the Documents created from the source strings</returns>\n        private static Project CreateProject(string[] sources, string language = LanguageNames.CSharp)\n        {\n            string fileNamePrefix = DefaultFilePathPrefix;\n            string fileExt = language == LanguageNames.CSharp ? CSharpDefaultFileExt : VisualBasicDefaultExt;\n\n            var projectId = ProjectId.CreateNewId(debugName: TestProjectName);\n\n            var solution = new AdhocWorkspace()\n                .CurrentSolution\n                .AddProject(projectId, TestProjectName, TestProjectName, language)\n                .AddMetadataReference(projectId, CorlibReference)\n                .AddMetadataReference(projectId, SystemCoreReference)\n                .AddMetadataReference(projectId, CSharpSymbolsReference)\n                .AddMetadataReference(projectId, CodeAnalysisReference)\n                .AddMetadataReference(projectId, FluentArithmeticReference);\n\n            int count = 0;\n            foreach (var source in sources)\n            {\n                var newFileName = fileNamePrefix + count + \".\" + fileExt;\n                var documentId = DocumentId.CreateNewId(projectId, debugName: newFileName);\n                solution = solution.AddDocument(documentId, newFileName, SourceText.From(source));\n                count++;\n            }\n            return solution.GetProject(projectId);\n        }\n        #endregion\n    }\n}\n\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/LiteralUnitTest.cs",
    "content": "﻿using FluentArithmeticAnalyzer.Literal;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CodeFixes;\nusing Microsoft.CodeAnalysis.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing TestHelper;\n\nnamespace FluentArithmeticAnalyzer.Test\n{\n    [TestClass]\n    public class LiteralUnitTest : CodeFixVerifier\n    {\n        [TestMethod]\n        public void TestMethod1()\n        {\n            var test = @\"using System;\nusing FluentArithmetic;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        var x = 1.Add(2).Mul(3).Sub(1).Div(4);\n        Console.WriteLine(x);\n    }\n}\n\";\n            var expected = new DiagnosticResult\n            {\n                Id = LiteralAnalyzer.DiagnosticId,\n                Message = string.Format(LiteralAnalyzer.MessageFormat.ToString(), \"Add\"),\n                Severity = DiagnosticSeverity.Info,\n                Locations = new[]\n                {\n                    new DiagnosticResultLocation(\"Test0.cs\", 8, 17)\n                }\n            };\n\n            VerifyCSharpDiagnostic(test, expected);\n\n            var newSource = @\"using System;\nusing FluentArithmetic;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        var x = 3.Mul(3).Sub(1).Div(4);\n        Console.WriteLine(x);\n    }\n}\n\";\n            VerifyCSharpFix(test, newSource);\n        }\n\n        [TestMethod]\n        public void TestMethod2()\n        {\n            var test = @\"using System;\nusing FluentArithmetic;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        var x = 1.Div(0).Mul(3).Sub(1).Div(4);\n        Console.WriteLine(x);\n    }\n}\n\";\n\n            VerifyCSharpDiagnostic(test);\n        }\n\n        protected override CodeFixProvider GetCSharpCodeFixProvider() => new LiteralFix();\n\n        protected override DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer() => new LiteralAnalyzer();\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"FluentArithmeticAnalyzer.Test\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"FluentArithmeticAnalyzer.Test\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/Verifiers/CodeFixVerifier.cs",
    "content": "﻿using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CodeActions;\nusing Microsoft.CodeAnalysis.CodeFixes;\nusing Microsoft.CodeAnalysis.Diagnostics;\nusing Microsoft.CodeAnalysis.Formatting;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\n\nnamespace TestHelper\n{\n    /// <summary>\n    /// Superclass of all Unit tests made for diagnostics with codefixes.\n    /// Contains methods used to verify correctness of codefixes\n    /// </summary>\n    public abstract partial class CodeFixVerifier : DiagnosticVerifier\n    {\n        /// <summary>\n        /// Returns the codefix being tested (C#) - to be implemented in non-abstract class\n        /// </summary>\n        /// <returns>The CodeFixProvider to be used for CSharp code</returns>\n        protected virtual CodeFixProvider GetCSharpCodeFixProvider() => null;\n\n        /// <summary>\n        /// Returns the codefix being tested (VB) - to be implemented in non-abstract class\n        /// </summary>\n        /// <returns>The CodeFixProvider to be used for VisualBasic code</returns>\n        protected virtual CodeFixProvider GetBasicCodeFixProvider() => null;\n\n        /// <summary>\n        /// Called to test a C# codefix when applied on the inputted string as a source\n        /// </summary>\n        /// <param name=\"oldSource\">A class in the form of a string before the CodeFix was applied to it</param>\n        /// <param name=\"newSource\">A class in the form of a string after the CodeFix was applied to it</param>\n        /// <param name=\"codeFixIndex\">Index determining which codefix to apply if there are multiple</param>\n        /// <param name=\"allowNewCompilerDiagnostics\">A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied</param>\n        protected void VerifyCSharpFix(string oldSource, string newSource, int? codeFixIndex = null, bool allowNewCompilerDiagnostics = false)\n        {\n            VerifyFix(LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), GetCSharpCodeFixProvider(), oldSource, newSource, codeFixIndex, allowNewCompilerDiagnostics);\n        }\n\n        /// <summary>\n        /// Called to test a VB codefix when applied on the inputted string as a source\n        /// </summary>\n        /// <param name=\"oldSource\">A class in the form of a string before the CodeFix was applied to it</param>\n        /// <param name=\"newSource\">A class in the form of a string after the CodeFix was applied to it</param>\n        /// <param name=\"codeFixIndex\">Index determining which codefix to apply if there are multiple</param>\n        /// <param name=\"allowNewCompilerDiagnostics\">A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied</param>\n        protected void VerifyBasicFix(string oldSource, string newSource, int? codeFixIndex = null, bool allowNewCompilerDiagnostics = false)\n        {\n            VerifyFix(LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), GetBasicCodeFixProvider(), oldSource, newSource, codeFixIndex, allowNewCompilerDiagnostics);\n        }\n\n        /// <summary>\n        /// General verifier for codefixes.\n        /// Creates a Document from the source string, then gets diagnostics on it and applies the relevant codefixes.\n        /// Then gets the string after the codefix is applied and compares it with the expected result.\n        /// Note: If any codefix causes new diagnostics to show up, the test fails unless allowNewCompilerDiagnostics is set to true.\n        /// </summary>\n        /// <param name=\"language\">The language the source code is in</param>\n        /// <param name=\"analyzer\">The analyzer to be applied to the source code</param>\n        /// <param name=\"codeFixProvider\">The codefix to be applied to the code wherever the relevant Diagnostic is found</param>\n        /// <param name=\"oldSource\">A class in the form of a string before the CodeFix was applied to it</param>\n        /// <param name=\"newSource\">A class in the form of a string after the CodeFix was applied to it</param>\n        /// <param name=\"codeFixIndex\">Index determining which codefix to apply if there are multiple</param>\n        /// <param name=\"allowNewCompilerDiagnostics\">A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied</param>\n        private void VerifyFix(string language, DiagnosticAnalyzer analyzer, CodeFixProvider codeFixProvider, string oldSource, string newSource, int? codeFixIndex, bool allowNewCompilerDiagnostics)\n        {\n            var document = CreateDocument(oldSource, language);\n            var analyzerDiagnostics = GetSortedDiagnosticsFromDocuments(analyzer, new[] { document });\n            var compilerDiagnostics = GetCompilerDiagnostics(document);\n            var attempts = analyzerDiagnostics.Length;\n\n            for (int i = 0; i < attempts; ++i)\n            {\n                var actions = new List<CodeAction>();\n                var context = new CodeFixContext(document, analyzerDiagnostics[0], (a, d) => actions.Add(a), CancellationToken.None);\n                codeFixProvider.RegisterCodeFixesAsync(context).Wait();\n\n                if (!actions.Any())\n                {\n                    break;\n                }\n\n                if (codeFixIndex != null)\n                {\n                    document = ApplyFix(document, actions.ElementAt((int)codeFixIndex));\n                    break;\n                }\n\n                document = ApplyFix(document, actions.ElementAt(0));\n                analyzerDiagnostics = GetSortedDiagnosticsFromDocuments(analyzer, new[] { document });\n\n                var newCompilerDiagnostics = GetNewDiagnostics(compilerDiagnostics, GetCompilerDiagnostics(document));\n\n                //check if applying the code fix introduced any new compiler diagnostics\n                if (!allowNewCompilerDiagnostics && newCompilerDiagnostics.Any())\n                {\n                    // Format and get the compiler diagnostics again so that the locations make sense in the output\n                    document = document.WithSyntaxRoot(Formatter.Format(document.GetSyntaxRootAsync().Result, Formatter.Annotation, document.Project.Solution.Workspace));\n                    newCompilerDiagnostics = GetNewDiagnostics(compilerDiagnostics, GetCompilerDiagnostics(document));\n\n                    Assert.IsTrue(false,\n                        string.Format(\"Fix introduced new compiler diagnostics:\\r\\n{0}\\r\\n\\r\\nNew document:\\r\\n{1}\\r\\n\",\n                            string.Join(\"\\r\\n\", newCompilerDiagnostics.Select(d => d.ToString())),\n                            document.GetSyntaxRootAsync().Result.ToFullString()));\n                }\n\n                //check if there are analyzer diagnostics left after the code fix\n                if (!analyzerDiagnostics.Any())\n                {\n                    break;\n                }\n            }\n\n            //after applying all of the code fixes, compare the resulting string to the inputted one\n            var actual = GetStringFromDocument(document);\n            Assert.AreEqual(newSource, actual);\n        }\n    }\n}"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/Verifiers/DiagnosticVerifier.cs",
    "content": "﻿using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.Diagnostics;\nusing Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace TestHelper\n{\n    /// <summary>\n    /// Superclass of all Unit Tests for DiagnosticAnalyzers\n    /// </summary>\n    public abstract partial class DiagnosticVerifier\n    {\n        #region To be implemented by Test classes\n        /// <summary>\n        /// Get the CSharp analyzer being tested - to be implemented in non-abstract class\n        /// </summary>\n        protected virtual DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer() => null;\n\n        /// <summary>\n        /// Get the Visual Basic analyzer being tested (C#) - to be implemented in non-abstract class\n        /// </summary>\n        protected virtual DiagnosticAnalyzer GetBasicDiagnosticAnalyzer() => null;\n        #endregion\n\n        #region Verifier wrappers\n\n        /// <summary>\n        /// Called to test a C# DiagnosticAnalyzer when applied on the single inputted string as a source\n        /// Note: input a DiagnosticResult for each Diagnostic expected\n        /// </summary>\n        /// <param name=\"source\">A class in the form of a string to run the analyzer on</param>\n        /// <param name=\"expected\"> DiagnosticResults that should appear after the analyzer is run on the source</param>\n        protected void VerifyCSharpDiagnostic(string source, params DiagnosticResult[] expected)\n        {\n            VerifyDiagnostics(new[] { source }, LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), expected);\n        }\n\n        /// <summary>\n        /// Called to test a VB DiagnosticAnalyzer when applied on the single inputted string as a source\n        /// Note: input a DiagnosticResult for each Diagnostic expected\n        /// </summary>\n        /// <param name=\"source\">A class in the form of a string to run the analyzer on</param>\n        /// <param name=\"expected\">DiagnosticResults that should appear after the analyzer is run on the source</param>\n        protected void VerifyBasicDiagnostic(string source, params DiagnosticResult[] expected)\n        {\n            VerifyDiagnostics(new[] { source }, LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), expected);\n        }\n\n        /// <summary>\n        /// Called to test a C# DiagnosticAnalyzer when applied on the inputted strings as a source\n        /// Note: input a DiagnosticResult for each Diagnostic expected\n        /// </summary>\n        /// <param name=\"sources\">An array of strings to create source documents from to run the analyzers on</param>\n        /// <param name=\"expected\">DiagnosticResults that should appear after the analyzer is run on the sources</param>\n        protected void VerifyCSharpDiagnostic(string[] sources, params DiagnosticResult[] expected)\n        {\n            VerifyDiagnostics(sources, LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), expected);\n        }\n\n        /// <summary>\n        /// Called to test a VB DiagnosticAnalyzer when applied on the inputted strings as a source\n        /// Note: input a DiagnosticResult for each Diagnostic expected\n        /// </summary>\n        /// <param name=\"sources\">An array of strings to create source documents from to run the analyzers on</param>\n        /// <param name=\"expected\">DiagnosticResults that should appear after the analyzer is run on the sources</param>\n        protected void VerifyBasicDiagnostic(string[] sources, params DiagnosticResult[] expected)\n        {\n            VerifyDiagnostics(sources, LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), expected);\n        }\n\n        /// <summary>\n        /// General method that gets a collection of actual diagnostics found in the source after the analyzer is run, \n        /// then verifies each of them.\n        /// </summary>\n        /// <param name=\"sources\">An array of strings to create source documents from to run the analyzers on</param>\n        /// <param name=\"language\">The language of the classes represented by the source strings</param>\n        /// <param name=\"analyzer\">The analyzer to be run on the source code</param>\n        /// <param name=\"expected\">DiagnosticResults that should appear after the analyzer is run on the sources</param>\n        private void VerifyDiagnostics(string[] sources, string language, DiagnosticAnalyzer analyzer, params DiagnosticResult[] expected)\n        {\n            var diagnostics = GetSortedDiagnostics(sources, language, analyzer);\n            VerifyDiagnosticResults(diagnostics, analyzer, expected);\n        }\n\n        #endregion\n\n        #region Actual comparisons and verifications\n        /// <summary>\n        /// Checks each of the actual Diagnostics found and compares them with the corresponding DiagnosticResult in the array of expected results.\n        /// Diagnostics are considered equal only if the DiagnosticResultLocation, Id, Severity, and Message of the DiagnosticResult match the actual diagnostic.\n        /// </summary>\n        /// <param name=\"actualResults\">The Diagnostics found by the compiler after running the analyzer on the source code</param>\n        /// <param name=\"analyzer\">The analyzer that was being run on the sources</param>\n        /// <param name=\"expectedResults\">Diagnostic Results that should have appeared in the code</param>\n        private static void VerifyDiagnosticResults(IEnumerable<Diagnostic> actualResults, DiagnosticAnalyzer analyzer, params DiagnosticResult[] expectedResults)\n        {\n            int expectedCount = expectedResults.Count();\n            int actualCount = actualResults.Count();\n\n            if (expectedCount != actualCount)\n            {\n                string diagnosticsOutput = actualResults.Any() ? FormatDiagnostics(analyzer, actualResults.ToArray()) : \"    NONE.\";\n\n                Assert.IsTrue(false,\n                    string.Format(\"Mismatch between number of diagnostics returned, expected \\\"{0}\\\" actual \\\"{1}\\\"\\r\\n\\r\\nDiagnostics:\\r\\n{2}\\r\\n\", expectedCount, actualCount, diagnosticsOutput));\n            }\n\n            for (int i = 0; i < expectedResults.Length; i++)\n            {\n                var actual = actualResults.ElementAt(i);\n                var expected = expectedResults[i];\n\n                if (expected.Line == -1 && expected.Column == -1)\n                {\n                    if (actual.Location != Location.None)\n                    {\n                        Assert.IsTrue(false,\n                            string.Format(\"Expected:\\nA project diagnostic with No location\\nActual:\\n{0}\",\n                            FormatDiagnostics(analyzer, actual)));\n                    }\n                }\n                else\n                {\n                    VerifyDiagnosticLocation(analyzer, actual, actual.Location, expected.Locations.First());\n                    var additionalLocations = actual.AdditionalLocations.ToArray();\n\n                    if (additionalLocations.Length != expected.Locations.Length - 1)\n                    {\n                        Assert.IsTrue(false,\n                            string.Format(\"Expected {0} additional locations but got {1} for Diagnostic:\\r\\n    {2}\\r\\n\",\n                                expected.Locations.Length - 1, additionalLocations.Length,\n                                FormatDiagnostics(analyzer, actual)));\n                    }\n\n                    for (int j = 0; j < additionalLocations.Length; ++j)\n                    {\n                        VerifyDiagnosticLocation(analyzer, actual, additionalLocations[j], expected.Locations[j + 1]);\n                    }\n                }\n\n                if (actual.Id != expected.Id)\n                {\n                    Assert.IsTrue(false,\n                        string.Format(\"Expected diagnostic id to be \\\"{0}\\\" was \\\"{1}\\\"\\r\\n\\r\\nDiagnostic:\\r\\n    {2}\\r\\n\",\n                            expected.Id, actual.Id, FormatDiagnostics(analyzer, actual)));\n                }\n\n                if (actual.Severity != expected.Severity)\n                {\n                    Assert.IsTrue(false,\n                        string.Format(\"Expected diagnostic severity to be \\\"{0}\\\" was \\\"{1}\\\"\\r\\n\\r\\nDiagnostic:\\r\\n    {2}\\r\\n\",\n                            expected.Severity, actual.Severity, FormatDiagnostics(analyzer, actual)));\n                }\n\n                if (actual.GetMessage() != expected.Message)\n                {\n                    Assert.IsTrue(false,\n                        string.Format(\"Expected diagnostic message to be \\\"{0}\\\" was \\\"{1}\\\"\\r\\n\\r\\nDiagnostic:\\r\\n    {2}\\r\\n\",\n                            expected.Message, actual.GetMessage(), FormatDiagnostics(analyzer, actual)));\n                }\n            }\n        }\n\n        /// <summary>\n        /// Helper method to VerifyDiagnosticResult that checks the location of a diagnostic and compares it with the location in the expected DiagnosticResult.\n        /// </summary>\n        /// <param name=\"analyzer\">The analyzer that was being run on the sources</param>\n        /// <param name=\"diagnostic\">The diagnostic that was found in the code</param>\n        /// <param name=\"actual\">The Location of the Diagnostic found in the code</param>\n        /// <param name=\"expected\">The DiagnosticResultLocation that should have been found</param>\n        private static void VerifyDiagnosticLocation(DiagnosticAnalyzer analyzer, Diagnostic diagnostic, Location actual, DiagnosticResultLocation expected)\n        {\n            var actualSpan = actual.GetLineSpan();\n\n            Assert.IsTrue(actualSpan.Path == expected.Path || (actualSpan.Path != null && actualSpan.Path.Contains(\"Test0.\") && expected.Path.Contains(\"Test.\")),\n                string.Format(\"Expected diagnostic to be in file \\\"{0}\\\" was actually in file \\\"{1}\\\"\\r\\n\\r\\nDiagnostic:\\r\\n    {2}\\r\\n\",\n                    expected.Path, actualSpan.Path, FormatDiagnostics(analyzer, diagnostic)));\n\n            var actualLinePosition = actualSpan.StartLinePosition;\n\n            // Only check line position if there is an actual line in the real diagnostic\n            if (actualLinePosition.Line > 0)\n            {\n                if (actualLinePosition.Line + 1 != expected.Line)\n                {\n                    Assert.IsTrue(false,\n                        string.Format(\"Expected diagnostic to be on line \\\"{0}\\\" was actually on line \\\"{1}\\\"\\r\\n\\r\\nDiagnostic:\\r\\n    {2}\\r\\n\",\n                            expected.Line, actualLinePosition.Line + 1, FormatDiagnostics(analyzer, diagnostic)));\n                }\n            }\n\n            // Only check column position if there is an actual column position in the real diagnostic\n            if (actualLinePosition.Character > 0)\n            {\n                if (actualLinePosition.Character + 1 != expected.Column)\n                {\n                    Assert.IsTrue(false,\n                        string.Format(\"Expected diagnostic to start at column \\\"{0}\\\" was actually at column \\\"{1}\\\"\\r\\n\\r\\nDiagnostic:\\r\\n    {2}\\r\\n\",\n                            expected.Column, actualLinePosition.Character + 1, FormatDiagnostics(analyzer, diagnostic)));\n                }\n            }\n        }\n        #endregion\n\n        #region Formatting Diagnostics\n        /// <summary>\n        /// Helper method to format a Diagnostic into an easily readable string\n        /// </summary>\n        /// <param name=\"analyzer\">The analyzer that this verifier tests</param>\n        /// <param name=\"diagnostics\">The Diagnostics to be formatted</param>\n        /// <returns>The Diagnostics formatted as a string</returns>\n        private static string FormatDiagnostics(DiagnosticAnalyzer analyzer, params Diagnostic[] diagnostics)\n        {\n            var builder = new StringBuilder();\n            for (int i = 0; i < diagnostics.Length; ++i)\n            {\n                builder.AppendLine(\"// \" + diagnostics[i].ToString());\n\n                var analyzerType = analyzer.GetType();\n                var rules = analyzer.SupportedDiagnostics;\n\n                foreach (var rule in rules)\n                {\n                    if (rule != null && rule.Id == diagnostics[i].Id)\n                    {\n                        var location = diagnostics[i].Location;\n                        if (location == Location.None)\n                        {\n                            builder.AppendFormat(\"GetGlobalResult({0}.{1})\", analyzerType.Name, rule.Id);\n                        }\n                        else\n                        {\n                            Assert.IsTrue(location.IsInSource,\n                                string.Format(\"Test base does not currently handle diagnostics in metadata locations. Diagnostic in metadata:\\r\\n\", diagnostics[i]));\n\n                            string resultMethodName = diagnostics[i].Location.SourceTree.FilePath.EndsWith(\".cs\") ? \"GetCSharpResultAt\" : \"GetBasicResultAt\";\n                            var linePosition = diagnostics[i].Location.GetLineSpan().StartLinePosition;\n\n                            builder.AppendFormat(\"{0}({1}, {2}, {3}.{4})\",\n                                resultMethodName,\n                                linePosition.Line + 1,\n                                linePosition.Character + 1,\n                                analyzerType.Name,\n                                rule.Id);\n                        }\n\n                        if (i != diagnostics.Length - 1)\n                        {\n                            builder.Append(',');\n                        }\n\n                        builder.AppendLine();\n                        break;\n                    }\n                }\n            }\n            return builder.ToString();\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Collections.Immutable\" publicKeyToken=\"b03f5f7f11d50a3a\" culture=\"neutral\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-1.2.0.0\" newVersion=\"1.2.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n</configuration>"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Test/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Microsoft.CodeAnalysis.Analyzers\" version=\"1.1.0\" targetFramework=\"net46\" />\n  <package id=\"Microsoft.CodeAnalysis.Common\" version=\"1.2.2\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.CodeAnalysis.CSharp\" version=\"1.2.2\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.CodeAnalysis.CSharp.Workspaces\" version=\"1.2.2\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.CodeAnalysis.Workspaces.Common\" version=\"1.2.2\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Composition\" version=\"1.0.27\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"System.Collections\" version=\"4.0.0\" targetFramework=\"net46\" />\n  <package id=\"System.Collections.Immutable\" version=\"1.1.37\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"System.Diagnostics.Debug\" version=\"4.0.0\" targetFramework=\"net46\" />\n  <package id=\"System.Globalization\" version=\"4.0.0\" targetFramework=\"net46\" />\n  <package id=\"System.Linq\" version=\"4.0.0\" targetFramework=\"net46\" />\n  <package id=\"System.Reflection.Metadata\" version=\"1.2.0\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"System.Resources.ResourceManager\" version=\"4.0.0\" targetFramework=\"net46\" />\n  <package id=\"System.Runtime\" version=\"4.0.0\" targetFramework=\"net46\" />\n  <package id=\"System.Runtime.Extensions\" version=\"4.0.0\" targetFramework=\"net46\" />\n  <package id=\"System.Threading\" version=\"4.0.0\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Vsix/FluentArithmeticAnalyzer.Vsix.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectTypeGuids>{82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <ProjectGuid>{F56992C4-EA05-4DBA-95E0-2FF1CA329606}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>FluentArithmeticAnalyzer</RootNamespace>\n    <AssemblyName>FluentArithmeticAnalyzer</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <GeneratePkgDefFile>false</GeneratePkgDefFile>\n    <IncludeAssemblyInVSIXContainer>false</IncludeAssemblyInVSIXContainer>\n    <IncludeDebugSymbolsInVSIXContainer>false</IncludeDebugSymbolsInVSIXContainer>\n    <IncludeDebugSymbolsInLocalVSIXDeployment>false</IncludeDebugSymbolsInLocalVSIXDeployment>\n    <CopyBuildOutputToOutputDirectory>false</CopyBuildOutputToOutputDirectory>\n    <CopyOutputSymbolsToOutputDirectory>false</CopyOutputSymbolsToOutputDirectory>\n    <VSSDKTargetPlatformRegRootSuffix>Roslyn</VSSDKTargetPlatformRegRootSuffix>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartAction>Program</StartAction>\n    <StartProgram>$(DevEnvDir)devenv.exe</StartProgram>\n    <StartArguments>/rootsuffix Roslyn</StartArguments>\n  </PropertyGroup>\n  <ItemGroup>\n    <None Include=\"source.extension.vsixmanifest\">\n      <SubType>Designer</SubType>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\FluentArithmeticAnalyzer\\FluentArithmeticAnalyzer.csproj\">\n      <Project>{F08AC1C8-AA28-49FB-8D92-FF9BE827E75E}</Project>\n      <Name>FluentArithmeticAnalyzer</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\VSSDK\\Microsoft.VsSDK.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/FluentArithmeticAnalyzer/FluentArithmeticAnalyzer.Vsix/source.extension.vsixmanifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PackageManifest Version=\"2.0.0\" xmlns=\"http://schemas.microsoft.com/developer/vsx-schema/2011\" xmlns:d=\"http://schemas.microsoft.com/developer/vsx-schema-design/2011\">\n  <Metadata>\n    <Identity Id=\"FluentArithmeticAnalyzer.Vsix..71b9fcaa-f850-4d22-b5c3-6f4d8b695314\" Version=\"1.0\" Language=\"en-US\" Publisher=\"Nobuyuki\"/>\n    <DisplayName>FluentArithmeticAnalyzer.Vsix</DisplayName>\n    <Description xml:space=\"preserve\">This is a sample diagnostic extension for the .NET Compiler Platform (\"Roslyn\").</Description>\n  </Metadata>\n  <Installation>\n    <InstallationTarget Version=\"[14.0,]\" Id=\"Microsoft.VisualStudio.Pro\" />\n    <InstallationTarget Version=\"[14.0,]\" Id=\"Microsoft.VisualStudio.VSWinDesktopExpress\" />\n    <InstallationTarget Version=\"[14.0,]\" Id=\"Microsoft.VisualStudio.VWDExpress\" />\n    <InstallationTarget Version=\"[14.0,]\" Id=\"Microsoft.VisualStudio.VSWinExpress\" />\n  </Installation>\n  <Dependencies>\n    <Dependency Id=\"Microsoft.Framework.NDP\" DisplayName=\"Microsoft .NET Framework\" d:Source=\"Manual\" Version=\"[4.5,)\" />\n  </Dependencies>\n  <Assets>\n    <Asset Type=\"Microsoft.VisualStudio.MefComponent\" d:Source=\"Project\" d:ProjectName=\"FluentArithmeticAnalyzer\" Path=\"|FluentArithmeticAnalyzer|\"/>\n    <Asset Type=\"Microsoft.VisualStudio.Analyzer\" d:Source=\"Project\" d:ProjectName=\"FluentArithmeticAnalyzer\" Path=\"|FluentArithmeticAnalyzer|\"/>\n  </Assets>\n</PackageManifest>\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/build/FluentArithmetic.nuspec",
    "content": "﻿<?xml version=\"1.0\"?>\n<package xmlns=\"http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd\">\n  <metadata>\n    <id>FluentArithmetic</id>\n    <version>0.1.0</version>\n    <title>Arithmetics with Fluent Inteface</title>\n    <authors>Nobuyuki Iwanaga</authors>\n    <owners>Nobuyuki Iwanaga</owners>\n    <licenseUrl>https://github.com/ufcpp/UfcppSample/blob/master/LICENSE</licenseUrl>\n    <projectUrl>https://github.com/ufcpp/UfcppSample/tree/master/DevEnv/CodeAwareLibrarySample</projectUrl>\n    <requireLicenseAcceptance>false</requireLicenseAcceptance>\n    <summary>A sample package for a Code-Aware library</summary>\n    <description>\n      A sample package for a Code-Aware library.\n      This package includes:\n\n      - FluentArithmetic: arithmetic operations with fluent interfaces, e.g. x.Add(y).\n      - FluentArithmeticAnalyzer: Some analyzers and code fixes for FluentArithmetic.\n    </description>\n    <releaseNotes>Update to netstandard1.1. Remove supporting NuGet 2.X.</releaseNotes>\n    <copyright>Copyright 2015 Nobuyuki Iwanaga</copyright>\n    <tags>sample</tags>\n  </metadata>\n  <files>\n    <file src=\"bin/FluentArithmetic.dll\" target=\"lib\\netstandard1.1\" />\n    <file src=\"bin/FluentArithmeticAnalyzer.dll\" target=\"analyzers\\C#\" />\n  </files>\n</package>\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/build/build.ps1",
    "content": "$msbuild = ls 'C:\\Program Files (x86)\\MSBuild\\14.0\\Bin\\MSBuild.exe'\n\n. $msbuild ..\\CodeAwareLibrarySample.sln /t:rebuild /p:Configuration=Release\n\nif (-not (Test-Path bin)) { mkdir bin }\n\ncp ..\\FluentArithmetic\\bin\\Release\\FluentArithmetic.dll bin\ncp ..\\FluentArithmeticAnalyzer\\FluentArithmeticAnalyzer\\bin\\Release\\FluentArithmeticAnalyzer.dll bin\n\n.\\NuGet.exe pack .\\FluentArithmetic.nuspec\n"
  },
  {
    "path": "Chapters/DevEnv/CodeAwareLibrarySample/build/pack.bat",
    "content": "mkdir bin\nmsbuild\n.\\NuGet.exe pack .\\MinimumAsyncBridge.nuspec -NoPackageAnalysis -OutputDirectory .\n.\\NuGet.exe pack .\\MinimumThreadingBridge.nuspec -NoPackageAnalysis -OutputDirectory .\n.\\NuGet.exe pack .\\MvvmBridge.nuspec -NoPackageAnalysis -OutputDirectory .\n"
  },
  {
    "path": "Chapters/DevEnv/ConsoleApplication1/ConsoleApplication1/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Chapters/DevEnv/ConsoleApplication1/ConsoleApplication1/ConsoleApplication1.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{129EE2CB-ED54-43E9-AEFD-91126B3A8AC3}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ConsoleApplication1</RootNamespace>\n    <AssemblyName>ConsoleApplication1</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Logic.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/ConsoleApplication1/ConsoleApplication1/Logic.cs",
    "content": "﻿namespace ConsoleApplication1\n{\n    class Logic\n    {\n        public int Filter(int x) => x * x;\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/ConsoleApplication1/ConsoleApplication1/Program.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApplication1\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var x = new Logic();\n            Console.WriteLine(x.Filter(10));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/ConsoleApplication1/ConsoleApplication1/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ConsoleApplication1\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApplication1\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"129ee2cb-ed54-43e9-aefd-91126b3a8ac3\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/ConsoleApplication1/ConsoleApplication1.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22823.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApplication1\", \"ConsoleApplication1\\ConsoleApplication1.csproj\", \"{129EE2CB-ED54-43E9-AEFD-91126B3A8AC3}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{129EE2CB-ED54-43E9-AEFD-91126B3A8AC3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{129EE2CB-ED54-43E9-AEFD-91126B3A8AC3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{129EE2CB-ED54-43E9-AEFD-91126B3A8AC3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{129EE2CB-ED54-43E9-AEFD-91126B3A8AC3}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/App/App.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <ProjectGuid>{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}</ProjectGuid>\n    <OutputType>AppContainerExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>App</RootNamespace>\n    <AssemblyName>App</AssemblyName>\n    <DefaultLanguage>ja-JP</DefaultLanguage>\n    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>\n    <TargetPlatformVersion>10.0.10069.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.10069.0</TargetPlatformMinVersion>\n    <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>\n    <EnableDotNetNativeCompatibleProfile>true</EnableDotNetNativeCompatibleProfile>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <PackageCertificateKeyFile>App_TemporaryKey.pfx</PackageCertificateKeyFile>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|ARM'\">\n    <OutputPath>bin\\ARM\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"MainPage.xaml.cs\">\n      <DependentUpon>MainPage.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <AppxManifest Include=\"Package.appxmanifest\">\n      <SubType>Designer</SubType>\n    </AppxManifest>\n    <None Include=\"ApplicationInsights.config\" />\n    <None Include=\"App_TemporaryKey.pfx\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Properties\\Default.rd.xml\" />\n    <Content Include=\"Assets\\Logo.scale-100.png\" />\n    <Content Include=\"Assets\\SmallLogo.scale-100.png\" />\n    <Content Include=\"Assets\\SplashScreen.scale-100.png\" />\n    <Content Include=\"Assets\\StoreLogo.scale-100.png\" />\n    <Content Include=\"Assets\\WideLogo.scale-100.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Page Include=\"MainPage.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n  </ItemGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.ApplicationInsights, Version=0.14.3.177, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.0.14.3-build00177\\lib\\portable-win81+wpa81\\Microsoft.ApplicationInsights.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.ApplicationInsights.Extensibility.Windows, Version=0.14.3.177, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.WindowsApps.0.14.3-build00177\\lib\\win81\\Microsoft.ApplicationInsights.Extensibility.Windows.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.ApplicationInsights.PersistenceChannel, Version=0.14.3.186, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.PersistenceChannel.0.14.3-build00177\\lib\\portable-win81+wpa81\\Microsoft.ApplicationInsights.PersistenceChannel.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Numerics.Vectors, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Numerics.Vectors.4.0.0\\lib\\win8\\System.Numerics.Vectors.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Numerics.Vectors.WindowsRuntime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Numerics.Vectors.4.0.0\\lib\\win8\\System.Numerics.Vectors.WindowsRuntime.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n  <PropertyGroup Condition=\" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' \">\n    <VisualStudioVersion>14.0</VisualStudioVersion>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\Microsoft\\WindowsXaml\\v$(VisualStudioVersion)\\Microsoft.Windows.UI.Xaml.CSharp.targets\" />\n  <Import Project=\"..\\packages\\Microsoft.Diagnostics.Tracing.EventSource.Redist.1.1.16-beta\\build\\portable-net45+win8+wpa81\\Microsoft.Diagnostics.Tracing.EventSource.Redist.targets\" Condition=\"Exists('..\\packages\\Microsoft.Diagnostics.Tracing.EventSource.Redist.1.1.16-beta\\build\\portable-net45+win8+wpa81\\Microsoft.Diagnostics.Tracing.EventSource.Redist.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Microsoft.Diagnostics.Tracing.EventSource.Redist.1.1.16-beta\\build\\portable-net45+win8+wpa81\\Microsoft.Diagnostics.Tracing.EventSource.Redist.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Microsoft.Diagnostics.Tracing.EventSource.Redist.1.1.16-beta\\build\\portable-net45+win8+wpa81\\Microsoft.Diagnostics.Tracing.EventSource.Redist.targets'))\" />\n    <Error Condition=\"!Exists('..\\packages\\Microsoft.ApplicationInsights.0.14.3-build00177\\build\\portable-win81+wpa81\\Microsoft.ApplicationInsights.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Microsoft.ApplicationInsights.0.14.3-build00177\\build\\portable-win81+wpa81\\Microsoft.ApplicationInsights.targets'))\" />\n  </Target>\n  <Import Project=\"..\\packages\\Microsoft.ApplicationInsights.0.14.3-build00177\\build\\portable-win81+wpa81\\Microsoft.ApplicationInsights.targets\" Condition=\"Exists('..\\packages\\Microsoft.ApplicationInsights.0.14.3-build00177\\build\\portable-win81+wpa81\\Microsoft.ApplicationInsights.targets')\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/App/App.xaml",
    "content": "﻿<Application\n    x:Class=\"App.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:local=\"using:App\"\n    RequestedTheme=\"Light\">\n\n</Application>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/App/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.InteropServices.WindowsRuntime;\nusing Windows.ApplicationModel;\nusing Windows.ApplicationModel.Activation;\nusing Windows.Foundation;\nusing Windows.Foundation.Collections;\nusing Windows.UI.Xaml;\nusing Windows.UI.Xaml.Controls;\nusing Windows.UI.Xaml.Controls.Primitives;\nusing Windows.UI.Xaml.Data;\nusing Windows.UI.Xaml.Input;\nusing Windows.UI.Xaml.Media;\nusing Windows.UI.Xaml.Navigation;\n\n// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=402347&clcid=0x409\n\nnamespace App\n{\n    /// <summary>\n    /// Provides application-specific behavior to supplement the default Application class.\n    /// </summary>\n    sealed partial class App : Application\n    {\n        /// <summary>\n        /// Allows tracking page views, exceptions and other telemetry through the Microsoft Application Insights service.\n        /// </summary>\n        public static Microsoft.ApplicationInsights.TelemetryClient TelemetryClient;\n\n        /// <summary>\n        /// Initializes the singleton application object.  This is the first line of authored code\n        /// executed, and as such is the logical equivalent of main() or WinMain().\n        /// </summary>\n        public App()\n        {\n            TelemetryClient = new Microsoft.ApplicationInsights.TelemetryClient();\n\n            this.InitializeComponent();\n            this.Suspending += OnSuspending;\n        }\n\n        /// <summary>\n        /// Invoked when the application is launched normally by the end user.  Other entry points\n        /// will be used such as when the application is launched to open a specific file.\n        /// </summary>\n        /// <param name=\"e\">Details about the launch request and process.</param>\n        protected override void OnLaunched(LaunchActivatedEventArgs e)\n        {\n\n#if DEBUG\n            if (System.Diagnostics.Debugger.IsAttached)\n            {\n                this.DebugSettings.EnableFrameRateCounter = true;\n            }\n#endif\n\n            Frame rootFrame = Window.Current.Content as Frame;\n\n            // Do not repeat app initialization when the Window already has content,\n            // just ensure that the window is active\n            if (rootFrame == null)\n            {\n                // Create a Frame to act as the navigation context and navigate to the first page\n                rootFrame = new Frame();\n\n                rootFrame.NavigationFailed += OnNavigationFailed;\n\n                if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)\n                {\n                    //TODO: Load state from previously suspended application\n                }\n\n                // Place the frame in the current Window\n                Window.Current.Content = rootFrame;\n            }\n\n            if (rootFrame.Content == null)\n            {\n                // When the navigation stack isn't restored navigate to the first page,\n                // configuring the new page by passing required information as a navigation\n                // parameter\n                rootFrame.Navigate(typeof(MainPage), e.Arguments);\n            }\n            // Ensure the current window is active\n            Window.Current.Activate();\n        }\n\n        /// <summary>\n        /// Invoked when Navigation to a certain page fails\n        /// </summary>\n        /// <param name=\"sender\">The Frame which failed navigation</param>\n        /// <param name=\"e\">Details about the navigation failure</param>\n        void OnNavigationFailed(object sender, NavigationFailedEventArgs e)\n        {\n            throw new Exception(\"Failed to load Page \" + e.SourcePageType.FullName);\n        }\n\n        /// <summary>\n        /// Invoked when application execution is being suspended.  Application state is saved\n        /// without knowing whether the application will be terminated or resumed with the contents\n        /// of memory still intact.\n        /// </summary>\n        /// <param name=\"sender\">The source of the suspend request.</param>\n        /// <param name=\"e\">Details about the suspend request.</param>\n        private void OnSuspending(object sender, SuspendingEventArgs e)\n        {\n            var deferral = e.SuspendingOperation.GetDeferral();\n            //TODO: Save application state and stop any background activity\n            deferral.Complete();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/App/ApplicationInsights.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ApplicationInsights xmlns=\"http://schemas.microsoft.com/ApplicationInsights/2013/Settings\">\n  <!-- \n    Learn more about Application Insights configuration with ApplicationInsights.config here: \n    http://go.microsoft.com/fwlink/?LinkID=513840\n    \n    Note: If not present, please add <InstrumentationKey>Your Key</InstrumentationKey> to the top of this file.\n  -->\n  <TelemetryModules>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule, Microsoft.ApplicationInsights\"/>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.Windows.SessionTelemetryModule, Microsoft.ApplicationInsights.Extensibility.Windows\"/>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.Windows.PageViewTelemetryModule, Microsoft.ApplicationInsights.Extensibility.Windows\"/>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.Windows.UnhandledExceptionTelemetryModule, Microsoft.ApplicationInsights.Extensibility.Windows\"/>\n  </TelemetryModules>\n  <TelemetryChannel Type=\"Microsoft.ApplicationInsights.Channel.PersistenceChannel, Microsoft.ApplicationInsights.PersistenceChannel\"/>\n  <ContextInitializers>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.ComponentContextInitializer, Microsoft.ApplicationInsights\"/>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.DeviceContextInitializer, Microsoft.ApplicationInsights\"/>\n  </ContextInitializers>\n  <TelemetryInitializers>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.Windows.UserContextInitializer, Microsoft.ApplicationInsights.Extensibility.Windows\"/>\n  </TelemetryInitializers>\n</ApplicationInsights>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/App/MainPage.xaml",
    "content": "﻿<Page\n    x:Class=\"App.MainPage\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:local=\"using:App\"\n    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n    mc:Ignorable=\"d\">\n\n    <Grid Background=\"{ThemeResource ApplicationPageBackgroundThemeBrush}\">\n\n    </Grid>\n</Page>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/App/MainPage.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.InteropServices.WindowsRuntime;\nusing Windows.Foundation;\nusing Windows.Foundation.Collections;\nusing Windows.UI.Xaml;\nusing Windows.UI.Xaml.Controls;\nusing Windows.UI.Xaml.Controls.Primitives;\nusing Windows.UI.Xaml.Data;\nusing Windows.UI.Xaml.Input;\nusing Windows.UI.Xaml.Media;\nusing Windows.UI.Xaml.Navigation;\n\n// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409\n\nnamespace App\n{\n    /// <summary>\n    /// An empty page that can be used on its own or navigated to within a Frame.\n    /// </summary>\n    public sealed partial class MainPage : Page\n    {\n        public MainPage()\n        {\n            this.InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/App/Package.appxmanifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<Package\n  xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\"\n  xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\"\n  xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"\n  IgnorableNamespaces=\"uap mp\">\n\n  <Identity\n    Name=\"dea03575-d7c2-4f73-aa9a-8f36b70d34d4\"\n    Publisher=\"CN=Nobuyuki\"\n    Version=\"1.0.0.0\" />\n\n  <mp:PhoneIdentity PhoneProductId=\"dea03575-d7c2-4f73-aa9a-8f36b70d34d4\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\"/>\n\n  <Properties>\n    <DisplayName>App</DisplayName>\n    <PublisherDisplayName>Nobuyuki</PublisherDisplayName>\n    <Logo>Assets\\StoreLogo.png</Logo>\n  </Properties>\n\n  <Dependencies>\n    <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.10069.0\" MaxVersionTested=\"10.0.10069.0\" />\n  </Dependencies>\n\n  <Resources>\n    <Resource Language=\"x-generate\"/>\n  </Resources>\n\n  <Applications>\n    <Application Id=\"App\"\n      Executable=\"$targetnametoken$.exe\"\n      EntryPoint=\"App.App\">\n      <uap:VisualElements\n        DisplayName=\"App\"\n        Square150x150Logo=\"Assets\\Logo.png\"\n        Square44x44Logo=\"Assets\\SmallLogo.png\"\n        Description=\"App\"\n        BackgroundColor=\"#464646\">\n        <uap:SplashScreen Image=\"Assets\\SplashScreen.png\" />\n      </uap:VisualElements>\n    </Application>\n  </Applications>\n\n  <Capabilities>\n    <Capability Name=\"internetClient\" />\n  </Capabilities>\n</Package>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/App/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"App\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"App\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: ComVisible(false)]"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/App/Properties/Default.rd.xml",
    "content": "<!--\n    This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most\n    developers. However, you can modify these parameters to modify the behavior of the .NET Native\n    optimizer.\n\n    Runtime Directives are documented at http://go.microsoft.com/fwlink/?LinkID=391919\n\n    To fully enable reflection for App1.MyClass and all of its public/private members\n    <Type Name=\"App1.MyClass\" Dynamic=\"Required All\"/>\n\n    To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32\n    <TypeInstantiation Name=\"App1.AppClass\" Arguments=\"System.Int32\" Activate=\"Required Public\" />\n\n    Using the Namespace directive to apply reflection policy to all the types in a particular namespace\n    <Namespace Name=\"DataClasses.ViewModels\" Seralize=\"All\" />\n-->\n\n<Directives xmlns=\"http://schemas.microsoft.com/netfx/2013/01/metadata\">\n  <Application>\n    <!--\n      An Assembly element with Name=\"*Application*\" applies to all assemblies in\n      the application package. The asterisks are not wildcards.\n    -->\n    <Assembly Name=\"*Application*\" Dynamic=\"Required All\" />\n    \n    \n    <!-- Add your application specific runtime directives here. -->\n\n\n  </Application>\n</Directives>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/App/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Microsoft.ApplicationInsights\" version=\"0.14.3-build00177\" targetFramework=\"win81\" userInstalled=\"true\" />\n  <package id=\"Microsoft.ApplicationInsights.PersistenceChannel\" version=\"0.14.3-build00177\" targetFramework=\"win81\" userInstalled=\"true\" />\n  <package id=\"Microsoft.ApplicationInsights.WindowsApps\" version=\"0.14.3-build00177\" targetFramework=\"win81\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Diagnostics.Tracing.EventSource.Redist\" version=\"1.1.16-beta\" targetFramework=\"win81\" userInstalled=\"true\" />\n  <package id=\"System.Numerics.Vectors\" version=\"4.0.0\" targetFramework=\"win81\" userInstalled=\"true\" />\n</packages>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/ClassLibrary/ClassLibrary.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{AAB3250E-006D-41AF-821D-697875CA7E5D}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibrary</RootNamespace>\n    <AssemblyName>ClassLibrary</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Game.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/ClassLibrary/Game.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ClassLibrary\n{\n    public class Game\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/ClassLibrary/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ClassLibrary\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibrary\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"aab3250e-006d-41af-821d-697875ca7e5d\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/ConsoleApplication/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/ConsoleApplication/ConsoleApplication.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{8FCAF69A-08A0-4792-B98C-72C95D846A58}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ConsoleApplication</RootNamespace>\n    <AssemblyName>ConsoleApplication</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/ConsoleApplication/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ConsoleApplication\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/ConsoleApplication/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ConsoleApplication\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApplication\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"8fcaf69a-08a0-4792-b98c-72c95d846a58\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/Game.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22823.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibrary\", \"ClassLibrary\\ClassLibrary.csproj\", \"{AAB3250E-006D-41AF-821D-697875CA7E5D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WebApplication\", \"WebApplication\\WebApplication.csproj\", \"{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WpfApplication\", \"WpfApplication\\WpfApplication.csproj\", \"{8234D45B-C840-419A-8CF5-24B3094BA050}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"App\", \"App\\App.csproj\", \"{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApplication\", \"ConsoleApplication\\ConsoleApplication.csproj\", \"{8FCAF69A-08A0-4792-B98C-72C95D846A58}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|x64.Build.0 = Release|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{AAB3250E-006D-41AF-821D-697875CA7E5D}.Release|x86.Build.0 = Release|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|x64.Build.0 = Release|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}.Release|x86.Build.0 = Release|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Release|x64.Build.0 = Release|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{8234D45B-C840-419A-8CF5-24B3094BA050}.Release|x86.Build.0 = Release|Any CPU\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|Any CPU.ActiveCfg = Debug|x86\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|ARM.Deploy.0 = Debug|ARM\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|x64.Build.0 = Debug|x64\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|x64.Deploy.0 = Debug|x64\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|x86.Build.0 = Debug|x86\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Debug|x86.Deploy.0 = Debug|x86\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|Any CPU.ActiveCfg = Release|x86\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|ARM.Build.0 = Release|ARM\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|ARM.Deploy.0 = Release|ARM\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|x64.ActiveCfg = Release|x64\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|x64.Build.0 = Release|x64\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|x64.Deploy.0 = Release|x64\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|x86.ActiveCfg = Release|x86\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|x86.Build.0 = Release|x86\n\t\t{FB2EEAD0-2990-4BBB-B61A-1A54965BC678}.Release|x86.Deploy.0 = Release|x86\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|x64.Build.0 = Release|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{8FCAF69A-08A0-4792-B98C-72C95D846A58}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/App_Start/BundleConfig.cs",
    "content": "﻿using System.Web;\nusing System.Web.Optimization;\n\nnamespace WebApplication\n{\n    public class BundleConfig\n    {\n        // バンドルの詳細については、http://go.microsoft.com/fwlink/?LinkId=301862  を参照してください\n        public static void RegisterBundles(BundleCollection bundles)\n        {\n            bundles.Add(new ScriptBundle(\"~/bundles/jquery\").Include(\n                        \"~/Scripts/jquery-{version}.js\"));\n\n            bundles.Add(new ScriptBundle(\"~/bundles/jqueryval\").Include(\n                        \"~/Scripts/jquery.validate*\"));\n\n            // 開発と学習には、Modernizr の開発バージョンを使用します。次に、実稼働の準備が\n            // できたら、http://modernizr.com にあるビルド ツールを使用して、必要なテストのみを選択します。\n            bundles.Add(new ScriptBundle(\"~/bundles/modernizr\").Include(\n                        \"~/Scripts/modernizr-*\"));\n\n            bundles.Add(new ScriptBundle(\"~/bundles/bootstrap\").Include(\n                      \"~/Scripts/bootstrap.js\",\n                      \"~/Scripts/respond.js\"));\n\n            bundles.Add(new StyleBundle(\"~/Content/css\").Include(\n                      \"~/Content/bootstrap.css\",\n                      \"~/Content/site.css\"));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/App_Start/FilterConfig.cs",
    "content": "﻿using System.Web;\nusing System.Web.Mvc;\n\nnamespace WebApplication\n{\n    public class FilterConfig\n    {\n        public static void RegisterGlobalFilters(GlobalFilterCollection filters)\n        {\n            filters.Add(new HandleErrorAttribute());\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/App_Start/IdentityConfig.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Data.Entity;\nusing System.Linq;\nusing System.Security.Claims;\nusing System.Threading.Tasks;\nusing System.Web;\nusing Microsoft.AspNet.Identity;\nusing Microsoft.AspNet.Identity.EntityFramework;\nusing Microsoft.AspNet.Identity.Owin;\nusing Microsoft.Owin;\nusing Microsoft.Owin.Security;\nusing WebApplication.Models;\n\nnamespace WebApplication\n{\n    public class EmailService : IIdentityMessageService\n    {\n        public Task SendAsync(IdentityMessage message)\n        {\n            // 電子メールを送信するには、電子メール サービスをここにプラグインします。\n            return Task.FromResult(0);\n        }\n    }\n\n    public class SmsService : IIdentityMessageService\n    {\n        public Task SendAsync(IdentityMessage message)\n        {\n            // テキスト メッセージを送信するための SMS サービスをここにプラグインします。\n            return Task.FromResult(0);\n        }\n    }\n\n    // このアプリケーションで使用されるアプリケーション ユーザー マネージャーを設定します。UserManager は ASP.NET Identity の中で定義されており、このアプリケーションで使用されます。\n    public class ApplicationUserManager : UserManager<ApplicationUser>\n    {\n        public ApplicationUserManager(IUserStore<ApplicationUser> store)\n            : base(store)\n        {\n        }\n\n        public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) \n        {\n            var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));\n            // ユーザー名の検証ロジックを設定します\n            manager.UserValidator = new UserValidator<ApplicationUser>(manager)\n            {\n                AllowOnlyAlphanumericUserNames = false,\n                RequireUniqueEmail = true\n            };\n\n            // パスワードの検証ロジックを設定します\n            manager.PasswordValidator = new PasswordValidator\n            {\n                RequiredLength = 6,\n                RequireNonLetterOrDigit = true,\n                RequireDigit = true,\n                RequireLowercase = true,\n                RequireUppercase = true,\n            };\n\n            // ユーザー ロックアウトの既定値を設定します。\n            manager.UserLockoutEnabledByDefault = true;\n            manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5);\n            manager.MaxFailedAccessAttemptsBeforeLockout = 5;\n\n            // 2 要素認証プロバイダーを登録します。このアプリケーションでは、Phone and Emails をユーザー検証用コード受け取りのステップとして使用します。\n            // 独自のプロバイダーをプログラミングしてここにプラグインできます。\n            manager.RegisterTwoFactorProvider(\"電話コード\", new PhoneNumberTokenProvider<ApplicationUser>\n            {\n                MessageFormat = \"あなたのセキュリティ コードは {0} です。\"\n            });\n            manager.RegisterTwoFactorProvider(\"電子メール コード\", new EmailTokenProvider<ApplicationUser>\n            {\n                Subject = \"セキュリティ コード\",\n                BodyFormat = \"あなたのセキュリティ コードは {0} です。\"\n            });\n            manager.EmailService = new EmailService();\n            manager.SmsService = new SmsService();\n            var dataProtectionProvider = options.DataProtectionProvider;\n            if (dataProtectionProvider != null)\n            {\n                manager.UserTokenProvider = \n                    new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create(\"ASP.NET Identity\"));\n            }\n            return manager;\n        }\n    }\n\n    // このアプリケーションで使用されるアプリケーション サインイン マネージャーを構成します。\n    public class ApplicationSignInManager : SignInManager<ApplicationUser, string>\n    {\n        public ApplicationSignInManager(ApplicationUserManager userManager, IAuthenticationManager authenticationManager)\n            : base(userManager, authenticationManager)\n        {\n        }\n\n        public override Task<ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user)\n        {\n            return user.GenerateUserIdentityAsync((ApplicationUserManager)UserManager);\n        }\n\n        public static ApplicationSignInManager Create(IdentityFactoryOptions<ApplicationSignInManager> options, IOwinContext context)\n        {\n            return new ApplicationSignInManager(context.GetUserManager<ApplicationUserManager>(), context.Authentication);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/App_Start/RouteConfig.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Mvc;\nusing System.Web.Routing;\n\nnamespace WebApplication\n{\n    public class RouteConfig\n    {\n        public static void RegisterRoutes(RouteCollection routes)\n        {\n            routes.IgnoreRoute(\"{resource}.axd/{*pathInfo}\");\n\n            routes.MapRoute(\n                name: \"Default\",\n                url: \"{controller}/{action}/{id}\",\n                defaults: new { controller = \"Home\", action = \"Index\", id = UrlParameter.Optional }\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/App_Start/Startup.Auth.cs",
    "content": "﻿using System;\nusing Microsoft.AspNet.Identity;\nusing Microsoft.AspNet.Identity.Owin;\nusing Microsoft.Owin;\nusing Microsoft.Owin.Security.Cookies;\nusing Microsoft.Owin.Security.Google;\nusing Owin;\nusing WebApplication.Models;\n\nnamespace WebApplication\n{\n    public partial class Startup\n    {\n        // 認証設定の詳細については、http://go.microsoft.com/fwlink/?LinkId=301864 を参照してください\n        public void ConfigureAuth(IAppBuilder app)\n        {\n            // 1 要求につき 1 インスタンスのみを使用するように DB コンテキスト、ユーザー マネージャー、サインイン マネージャーを構成します。\n            app.CreatePerOwinContext(ApplicationDbContext.Create);\n            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);\n            app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);\n\n            // アプリケーションが Cookie を使用して、サインインしたユーザーの情報を格納できるようにします\n            // また、サードパーティのログイン プロバイダーを使用してログインするユーザーに関する情報を、Cookie を使用して一時的に保存できるようにします\n            // サインイン Cookie の設定\n            app.UseCookieAuthentication(new CookieAuthenticationOptions\n            {\n                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,\n                LoginPath = new PathString(\"/Account/Login\"),\n                Provider = new CookieAuthenticationProvider\n                {\n                    // ユーザーがログインするときにセキュリティ スタンプを検証するように設定します。\n                    // これはセキュリティ機能の 1 つであり、パスワードを変更するときやアカウントに外部ログインを追加するときに使用されます。\n                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(\n                        validateInterval: TimeSpan.FromMinutes(30),\n                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))\n                }\n            });            \n            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);\n\n            // 2 要素認証プロセスの中で 2 つ目の要素を確認するときにユーザー情報を一時的に保存するように設定します。\n            app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5));\n\n            // 2 つ目のログイン確認要素 (電話や電子メールなど) を記憶するように設定します。\n            // このオプションをオンにすると、ログイン プロセスの中の確認の第 2 ステップは、ログインに使用されたデバイスに保存されます。\n            // これは、ログイン時の「このアカウントを記憶する」オプションに似ています。\n            app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie);\n\n            // 次の行のコメントを解除して、サード パーティのログイン プロバイダーを使用したログインを有効にします\n            //app.UseMicrosoftAccountAuthentication(\n            //    clientId: \"\",\n            //    clientSecret: \"\");\n\n            //app.UseTwitterAuthentication(\n            //   consumerKey: \"\",\n            //   consumerSecret: \"\");\n\n            //app.UseFacebookAuthentication(\n            //   appId: \"\",\n            //   appSecret: \"\");\n\n            //app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()\n            //{\n            //    ClientId = \"\",\n            //    ClientSecret = \"\"\n            //});\n        }\n    }\n}"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Content/Site.css",
    "content": "﻿body {\n    padding-top: 50px;\n    padding-bottom: 20px;\n}\n\n/* Set padding to keep content from hitting the edges */\n.body-content {\n    padding-left: 15px;\n    padding-right: 15px;\n}\n\n/* Override the default bootstrap behavior where horizontal description lists \n   will truncate terms that are too long to fit in the left column \n*/\n.dl-horizontal dt {\n    white-space: normal;\n}\n\n/* Set width on the form input elements since they're 100% wide by default */\ninput,\nselect,\ntextarea {\n    max-width: 280px;\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Content/bootstrap.css",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. The notices and licenses below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\n/*! normalize.css v2.1.0 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden] {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 2cm .5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput,\nselect[multiple],\ntextarea {\n  background-image: none;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  border: 0;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16.099999999999998px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #999999;\n}\n\n.text-primary {\n  color: #428bca;\n}\n\n.text-warning {\n  color: #c09853;\n}\n\n.text-danger {\n  color: #b94a48;\n}\n\n.text-success {\n  color: #468847;\n}\n\n.text-info {\n  color: #3a87ad;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n}\n\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\nh1 small,\n.h1 small {\n  font-size: 24px;\n}\n\nh2 small,\n.h2 small {\n  font-size: 18px;\n}\n\nh3 small,\n.h3 small,\nh4 small,\n.h4 small {\n  font-size: 14px;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\ndl {\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\n\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\npre {\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\npre.prettyprint {\n  margin-bottom: 20px;\n}\n\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12,\n.col-sm-1,\n.col-sm-2,\n.col-sm-3,\n.col-sm-4,\n.col-sm-5,\n.col-sm-6,\n.col-sm-7,\n.col-sm-8,\n.col-sm-9,\n.col-sm-10,\n.col-sm-11,\n.col-sm-12,\n.col-md-1,\n.col-md-2,\n.col-md-3,\n.col-md-4,\n.col-md-5,\n.col-md-6,\n.col-md-7,\n.col-md-8,\n.col-md-9,\n.col-md-10,\n.col-md-11,\n.col-md-12,\n.col-lg-1,\n.col-lg-2,\n.col-lg-3,\n.col-lg-4,\n.col-lg-5,\n.col-lg-6,\n.col-lg-7,\n.col-lg-8,\n.col-lg-9,\n.col-lg-10,\n.col-lg-11,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11 {\n  float: left;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 750px;\n  }\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11 {\n    float: left;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 970px;\n  }\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11 {\n    float: left;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1170px;\n  }\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11 {\n    float: left;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n\n.table thead > tr > th,\n.table tbody > tr > th,\n.table tfoot > tr > th,\n.table thead > tr > td,\n.table tbody > tr > td,\n.table tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n\n.table caption + thead tr:first-child th,\n.table colgroup + thead tr:first-child th,\n.table thead:first-child tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-condensed thead > tr > th,\n.table-condensed tbody > tr > th,\n.table-condensed tfoot > tr > th,\n.table-condensed thead > tr > td,\n.table-condensed tbody > tr > td,\n.table-condensed tfoot > tr > td {\n  padding: 5px;\n}\n\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n  background-color: #f5f5f5;\n}\n\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td {\n  background-color: #d0e9c6;\n  border-color: #c9e2b3;\n}\n\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td {\n  background-color: #ebcccc;\n  border-color: #e6c1c7;\n}\n\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td {\n  background-color: #faf2cc;\n  border-color: #f8e5be;\n}\n\n@media (max-width: 768px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n    background-color: #fff;\n  }\n  .table-responsive > .table > thead > tr > th,\n  .table-responsive > .table > tbody > tr > th,\n  .table-responsive > .table > tfoot > tr > th,\n  .table-responsive > .table > thead > tr > td,\n  .table-responsive > .table > tbody > tr > td,\n  .table-responsive > .table > tfoot > tr > td {\n    white-space: nowrap;\n  }\n  .table-responsive > .table-bordered {\n    border: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:first-child,\n  .table-responsive > .table-bordered > tbody > tr > th:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n  .table-responsive > .table-bordered > thead > tr > td:first-child,\n  .table-responsive > .table-bordered > tbody > tr > td:first-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n    border-left: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr > th:last-child,\n  .table-responsive > .table-bordered > tbody > tr > th:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n  .table-responsive > .table-bordered > thead > tr > td:last-child,\n  .table-responsive > .table-bordered > tbody > tr > td:last-child,\n  .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n    border-right: 0;\n  }\n  .table-responsive > .table-bordered > thead > tr:last-child > th,\n  .table-responsive > .table-bordered > tbody > tr:last-child > th,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n  .table-responsive > .table-bordered > thead > tr:last-child > td,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\n.form-control:-moz-placeholder {\n  color: #999999;\n}\n\n.form-control::-moz-placeholder {\n  color: #999999;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\n\n.has-warning .help-block,\n.has-warning .control-label {\n  color: #c09853;\n}\n\n.has-warning .form-control {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n\n.has-warning .input-group-addon {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n\n.has-error .help-block,\n.has-error .control-label {\n  color: #b94a48;\n}\n\n.has-error .form-control {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n\n.has-error .input-group-addon {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n\n.has-success .help-block,\n.has-success .control-label {\n  color: #468847;\n}\n\n.has-success .form-control {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n\n.has-success .input-group-addon {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n\n.form-control-static {\n  padding-top: 7px;\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n       -o-user-select: none;\n          user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\n\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\n\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\n\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm,\n.btn-xs {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n          transition: height 0.35s ease;\n}\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');\n}\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n}\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n\n.glyphicon-briefcase:before {\n  content: \"\\1f4bc\";\n}\n\n.glyphicon-calendar:before {\n  content: \"\\1f4c5\";\n}\n\n.glyphicon-pushpin:before {\n  content: \"\\1f4cc\";\n}\n\n.glyphicon-paperclip:before {\n  content: \"\\1f4ce\";\n}\n\n.glyphicon-camera:before {\n  content: \"\\1f4f7\";\n}\n\n.glyphicon-lock:before {\n  content: \"\\1f512\";\n}\n\n.glyphicon-bell:before {\n  content: \"\\1f514\";\n}\n\n.glyphicon-bookmark:before {\n  content: \"\\1f516\";\n}\n\n.glyphicon-fire:before {\n  content: \"\\1f525\";\n}\n\n.glyphicon-wrench:before {\n  content: \"\\1f527\";\n}\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-bottom: 0 dotted;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0 dotted;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-default .caret {\n  border-top-color: #333333;\n}\n\n.btn-primary .caret,\n.btn-success .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret {\n  border-top-color: #fff;\n}\n\n.dropup .btn-default .caret {\n  border-bottom-color: #333333;\n}\n\n.dropup .btn-primary .caret,\n.dropup .btn-success .caret,\n.dropup .btn-warning .caret,\n.dropup .btn-danger .caret,\n.dropup .btn-info .caret {\n  border-bottom-color: #fff;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 5px 10px;\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified .btn {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group.col {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs.nav-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 5px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #428bca;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n\n.nav .caret {\n  border-top-color: #428bca;\n  border-bottom-color: #428bca;\n}\n\n.nav a:hover .caret {\n  border-top-color: #2a6496;\n  border-bottom-color: #2a6496;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  z-index: 1000;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-collapse .navbar-nav.navbar-left:first-child {\n    margin-left: -15px;\n  }\n  .navbar-collapse .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n  .navbar-collapse .navbar-text:last-child {\n    margin-right: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  z-index: 1030;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\n.navbar-text {\n  float: left;\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e6e6e6;\n}\n\n.navbar-default .navbar-nav > .dropdown > a:hover .caret,\n.navbar-default .navbar-nav > .dropdown > a:focus .caret {\n  border-top-color: #333333;\n  border-bottom-color: #333333;\n}\n\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .open > a .caret,\n.navbar-default .navbar-nav > .open > a:hover .caret,\n.navbar-default .navbar-nav > .open > a:focus .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.navbar-default .navbar-nav > .dropdown > a .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n\n.navbar-default .navbar-link {\n  color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n\n.navbar-inverse .navbar-nav > .open > a .caret,\n.navbar-inverse .navbar-nav > .open > a:hover .caret,\n.navbar-inverse .navbar-nav > .open > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999999;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\n\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.pagination > .disabled > span,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n}\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.label-default {\n  background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n\n.label-primary {\n  background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n\n.label-info {\n  background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n\n.label-warning {\n  background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: inline-block;\n  display: block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\na.thumbnail:hover,\na.thumbnail:focus {\n  border-color: #428bca;\n}\n\n.thumbnail > img {\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #356635;\n}\n\n.alert-info {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #2d6987;\n}\n\n.alert-warning {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.alert-warning hr {\n  border-top-color: #f8e5be;\n}\n\n.alert-warning .alert-link {\n  color: #a47e3c;\n}\n\n.alert-danger {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.alert-danger hr {\n  border-top-color: #e6c1c7;\n}\n\n.alert-danger .alert-link {\n  color: #953b39;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n     -moz-animation: progress-bar-stripes 2s linear infinite;\n      -ms-animation: progress-bar-stripes 2s linear infinite;\n       -o-animation: progress-bar-stripes 2s linear infinite;\n          animation: progress-bar-stripes 2s linear infinite;\n}\n\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading {\n  color: inherit;\n}\n\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n}\n\n.panel-title > a {\n  color: inherit;\n}\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #fbeed5;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #fbeed5;\n}\n\n.panel-danger {\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #eed3d7;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #eed3d7;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\nbody.modal-open,\n.modal-open .navbar-fixed-top,\n.modal-open .navbar-fixed-bottom {\n  margin-right: 15px;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n     -moz-transition: -moz-transform 0.3s ease-out;\n       -o-transition: -o-transform 0.3s ease-out;\n          transition: transform 0.3s ease-out;\n}\n\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n\n.modal-dialog {\n  z-index: 1050;\n  width: auto;\n  padding: 10px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    right: auto;\n    left: 50%;\n    width: 600px;\n    padding-top: 30px;\n    padding-bottom: 30px;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n@media screen and (max-width: 400px) {\n  @-ms-viewport {\n    width: 320px;\n  }\n}\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.visible-xs {\n  display: none !important;\n}\n\ntr.visible-xs {\n  display: none !important;\n}\n\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm {\n  display: none !important;\n}\n\ntr.visible-sm {\n  display: none !important;\n}\n\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md {\n  display: none !important;\n}\n\ntr.visible-md {\n  display: none !important;\n}\n\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg {\n  display: none !important;\n}\n\ntr.visible-lg {\n  display: none !important;\n}\n\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.hidden-xs {\n  display: block !important;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-md {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-md {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n  tr.hidden-md {\n    display: none !important;\n  }\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-md {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print {\n  display: none !important;\n}\n\ntr.visible-print {\n  display: none !important;\n}\n\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\n\n@media print {\n  .visible-print {\n    display: block !important;\n  }\n  tr.visible-print {\n    display: table-row !important;\n  }\n  th.visible-print,\n  td.visible-print {\n    display: table-cell !important;\n  }\n  .hidden-print {\n    display: none !important;\n  }\n  tr.hidden-print {\n    display: none !important;\n  }\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Controllers/AccountController.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing System.Linq;\nusing System.Security.Claims;\nusing System.Threading.Tasks;\nusing System.Web;\nusing System.Web.Mvc;\nusing Microsoft.AspNet.Identity;\nusing Microsoft.AspNet.Identity.Owin;\nusing Microsoft.Owin.Security;\nusing WebApplication.Models;\n\nnamespace WebApplication.Controllers\n{\n    [Authorize]\n    public class AccountController : Controller\n    {\n        private ApplicationSignInManager _signInManager;\n        private ApplicationUserManager _userManager;\n\n        public AccountController()\n        {\n        }\n\n        public AccountController(ApplicationUserManager userManager, ApplicationSignInManager signInManager )\n        {\n            UserManager = userManager;\n            SignInManager = signInManager;\n        }\n\n        public ApplicationSignInManager SignInManager\n        {\n            get\n            {\n                return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();\n            }\n            private set \n            { \n                _signInManager = value; \n            }\n        }\n\n        public ApplicationUserManager UserManager\n        {\n            get\n            {\n                return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();\n            }\n            private set\n            {\n                _userManager = value;\n            }\n        }\n\n        //\n        // GET: /Account/Login\n        [AllowAnonymous]\n        public ActionResult Login(string returnUrl)\n        {\n            ViewBag.ReturnUrl = returnUrl;\n            return View();\n        }\n\n        //\n        // POST: /Account/Login\n        [HttpPost]\n        [AllowAnonymous]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)\n        {\n            if (!ModelState.IsValid)\n            {\n                return View(model);\n            }\n\n            // これは、アカウント ロックアウトの基準となるログイン失敗回数を数えません。\n            // パスワード入力失敗回数に基づいてアカウントがロックアウトされるように設定するには、shouldLockout: true に変更してください。\n            var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);\n            switch (result)\n            {\n                case SignInStatus.Success:\n                    return RedirectToLocal(returnUrl);\n                case SignInStatus.LockedOut:\n                    return View(\"Lockout\");\n                case SignInStatus.RequiresVerification:\n                    return RedirectToAction(\"SendCode\", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });\n                case SignInStatus.Failure:\n                default:\n                    ModelState.AddModelError(\"\", \"無効なログイン試行です。\");\n                    return View(model);\n            }\n        }\n\n        //\n        // GET: /Account/VerifyCode\n        [AllowAnonymous]\n        public async Task<ActionResult> VerifyCode(string provider, string returnUrl, bool rememberMe)\n        {\n            // ユーザーがユーザー名/パスワードまたは外部ログイン経由でログイン済みであることが必要です。\n            if (!await SignInManager.HasBeenVerifiedAsync())\n            {\n                return View(\"Error\");\n            }\n            return View(new VerifyCodeViewModel { Provider = provider, ReturnUrl = returnUrl, RememberMe = rememberMe });\n        }\n\n        //\n        // POST: /Account/VerifyCode\n        [HttpPost]\n        [AllowAnonymous]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> VerifyCode(VerifyCodeViewModel model)\n        {\n            if (!ModelState.IsValid)\n            {\n                return View(model);\n            }\n\n            // 次のコードは、2 要素コードに対するブルート フォース攻撃を防ぎます。\n            // ユーザーが誤ったコードを入力した回数が指定の回数に達すると、ユーザー アカウントは\n            // 指定の時間が経過するまでロックアウトされます。\n            // アカウント ロックアウトの設定は IdentityConfig の中で構成できます。\n            var result = await SignInManager.TwoFactorSignInAsync(model.Provider, model.Code, isPersistent:  model.RememberMe, rememberBrowser: model.RememberBrowser);\n            switch (result)\n            {\n                case SignInStatus.Success:\n                    return RedirectToLocal(model.ReturnUrl);\n                case SignInStatus.LockedOut:\n                    return View(\"Lockout\");\n                case SignInStatus.Failure:\n                default:\n                    ModelState.AddModelError(\"\", \"無効なコード。\");\n                    return View(model);\n            }\n        }\n\n        //\n        // GET: /Account/Register\n        [AllowAnonymous]\n        public ActionResult Register()\n        {\n            return View();\n        }\n\n        //\n        // POST: /Account/Register\n        [HttpPost]\n        [AllowAnonymous]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> Register(RegisterViewModel model)\n        {\n            if (ModelState.IsValid)\n            {\n                var user = new ApplicationUser { UserName = model.Email, Email = model.Email };\n                var result = await UserManager.CreateAsync(user, model.Password);\n                if (result.Succeeded)\n                {\n                    await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);\n                    \n                    // アカウント確認とパスワード リセットを有効にする方法の詳細については、http://go.microsoft.com/fwlink/?LinkID=320771 を参照してください\n                    // このリンクを含む電子メールを送信します\n                    // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);\n                    // var callbackUrl = Url.Action(\"ConfirmEmail\", \"Account\", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);\n                    // await UserManager.SendEmailAsync(user.Id, \"アカウントの確認\", \"このリンクをクリックすることによってアカウントを確認してください <a href=\\\"\" + callbackUrl + \"\\\">こちら</a>\");\n\n                    return RedirectToAction(\"Index\", \"Home\");\n                }\n                AddErrors(result);\n            }\n\n            // ここで問題が発生した場合はフォームを再表示します\n            return View(model);\n        }\n\n        //\n        // GET: /Account/ConfirmEmail\n        [AllowAnonymous]\n        public async Task<ActionResult> ConfirmEmail(string userId, string code)\n        {\n            if (userId == null || code == null)\n            {\n                return View(\"Error\");\n            }\n            var result = await UserManager.ConfirmEmailAsync(userId, code);\n            return View(result.Succeeded ? \"ConfirmEmail\" : \"Error\");\n        }\n\n        //\n        // GET: /Account/ForgotPassword\n        [AllowAnonymous]\n        public ActionResult ForgotPassword()\n        {\n            return View();\n        }\n\n        //\n        // POST: /Account/ForgotPassword\n        [HttpPost]\n        [AllowAnonymous]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)\n        {\n            if (ModelState.IsValid)\n            {\n                var user = await UserManager.FindByNameAsync(model.Email);\n                if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id)))\n                {\n                    // ユーザーが存在しないことや未確認であることを公開しません。\n                    return View(\"ForgotPasswordConfirmation\");\n                }\n\n                // アカウント確認とパスワード リセットを有効にする方法の詳細については、http://go.microsoft.com/fwlink/?LinkID=320771 を参照してください\n                // このリンクを含む電子メールを送信します\n                // string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id);\n                // var callbackUrl = Url.Action(\"ResetPassword\", \"Account\", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);\t\t\n                // await UserManager.SendEmailAsync(user.Id, \"パスワード\", \"のリセット <a href=\\\"\" + callbackUrl + \"\\\">こちら</a> をクリックして、パスワードをリセットしてください\");\n                // return RedirectToAction(\"ForgotPasswordConfirmation\", \"Account\");\n            }\n\n            // ここで問題が発生した場合はフォームを再表示します\n            return View(model);\n        }\n\n        //\n        // GET: /Account/ForgotPasswordConfirmation\n        [AllowAnonymous]\n        public ActionResult ForgotPasswordConfirmation()\n        {\n            return View();\n        }\n\n        //\n        // GET: /Account/ResetPassword\n        [AllowAnonymous]\n        public ActionResult ResetPassword(string code)\n        {\n            return code == null ? View(\"Error\") : View();\n        }\n\n        //\n        // POST: /Account/ResetPassword\n        [HttpPost]\n        [AllowAnonymous]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model)\n        {\n            if (!ModelState.IsValid)\n            {\n                return View(model);\n            }\n            var user = await UserManager.FindByNameAsync(model.Email);\n            if (user == null)\n            {\n                // ユーザーが存在しないことを公開しません。\n                return RedirectToAction(\"ResetPasswordConfirmation\", \"Account\");\n            }\n            var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);\n            if (result.Succeeded)\n            {\n                return RedirectToAction(\"ResetPasswordConfirmation\", \"Account\");\n            }\n            AddErrors(result);\n            return View();\n        }\n\n        //\n        // GET: /Account/ResetPasswordConfirmation\n        [AllowAnonymous]\n        public ActionResult ResetPasswordConfirmation()\n        {\n            return View();\n        }\n\n        //\n        // POST: /Account/ExternalLogin\n        [HttpPost]\n        [AllowAnonymous]\n        [ValidateAntiForgeryToken]\n        public ActionResult ExternalLogin(string provider, string returnUrl)\n        {\n            // 外部ログイン プロバイダーへのリダイレクトを要求します\n            return new ChallengeResult(provider, Url.Action(\"ExternalLoginCallback\", \"Account\", new { ReturnUrl = returnUrl }));\n        }\n\n        //\n        // GET: /Account/SendCode\n        [AllowAnonymous]\n        public async Task<ActionResult> SendCode(string returnUrl, bool rememberMe)\n        {\n            var userId = await SignInManager.GetVerifiedUserIdAsync();\n            if (userId == null)\n            {\n                return View(\"Error\");\n            }\n            var userFactors = await UserManager.GetValidTwoFactorProvidersAsync(userId);\n            var factorOptions = userFactors.Select(purpose => new SelectListItem { Text = purpose, Value = purpose }).ToList();\n            return View(new SendCodeViewModel { Providers = factorOptions, ReturnUrl = returnUrl, RememberMe = rememberMe });\n        }\n\n        //\n        // POST: /Account/SendCode\n        [HttpPost]\n        [AllowAnonymous]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> SendCode(SendCodeViewModel model)\n        {\n            if (!ModelState.IsValid)\n            {\n                return View();\n            }\n\n            // トークンを生成して送信します。\n            if (!await SignInManager.SendTwoFactorCodeAsync(model.SelectedProvider))\n            {\n                return View(\"Error\");\n            }\n            return RedirectToAction(\"VerifyCode\", new { Provider = model.SelectedProvider, ReturnUrl = model.ReturnUrl, RememberMe = model.RememberMe });\n        }\n\n        //\n        // GET: /Account/ExternalLoginCallback\n        [AllowAnonymous]\n        public async Task<ActionResult> ExternalLoginCallback(string returnUrl)\n        {\n            var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();\n            if (loginInfo == null)\n            {\n                return RedirectToAction(\"Login\");\n            }\n\n            // ユーザーが既にログインを持っている場合、この外部ログイン プロバイダーを使用してユーザーをサインインします\n            var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);\n            switch (result)\n            {\n                case SignInStatus.Success:\n                    return RedirectToLocal(returnUrl);\n                case SignInStatus.LockedOut:\n                    return View(\"Lockout\");\n                case SignInStatus.RequiresVerification:\n                    return RedirectToAction(\"SendCode\", new { ReturnUrl = returnUrl, RememberMe = false });\n                case SignInStatus.Failure:\n                default:\n                    // ユーザーがアカウントを持っていない場合、ユーザーにアカウントを作成するよう求めます\n                    ViewBag.ReturnUrl = returnUrl;\n                    ViewBag.LoginProvider = loginInfo.Login.LoginProvider;\n                    return View(\"ExternalLoginConfirmation\", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });\n            }\n        }\n\n        //\n        // POST: /Account/ExternalLoginConfirmation\n        [HttpPost]\n        [AllowAnonymous]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)\n        {\n            if (User.Identity.IsAuthenticated)\n            {\n                return RedirectToAction(\"Index\", \"Manage\");\n            }\n\n            if (ModelState.IsValid)\n            {\n                // 外部ログイン プロバイダーからユーザーに関する情報を取得します\n                var info = await AuthenticationManager.GetExternalLoginInfoAsync();\n                if (info == null)\n                {\n                    return View(\"ExternalLoginFailure\");\n                }\n                var user = new ApplicationUser { UserName = model.Email, Email = model.Email };\n                var result = await UserManager.CreateAsync(user);\n                if (result.Succeeded)\n                {\n                    result = await UserManager.AddLoginAsync(user.Id, info.Login);\n                    if (result.Succeeded)\n                    {\n                        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);\n                        return RedirectToLocal(returnUrl);\n                    }\n                }\n                AddErrors(result);\n            }\n\n            ViewBag.ReturnUrl = returnUrl;\n            return View(model);\n        }\n\n        //\n        // POST: /Account/LogOff\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public ActionResult LogOff()\n        {\n            AuthenticationManager.SignOut();\n            return RedirectToAction(\"Index\", \"Home\");\n        }\n\n        //\n        // GET: /Account/ExternalLoginFailure\n        [AllowAnonymous]\n        public ActionResult ExternalLoginFailure()\n        {\n            return View();\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                if (_userManager != null)\n                {\n                    _userManager.Dispose();\n                    _userManager = null;\n                }\n\n                if (_signInManager != null)\n                {\n                    _signInManager.Dispose();\n                    _signInManager = null;\n                }\n            }\n\n            base.Dispose(disposing);\n        }\n\n        #region ヘルパー\n        // 外部ログインの追加時に XSRF の防止に使用します\n        private const string XsrfKey = \"XsrfId\";\n\n        private IAuthenticationManager AuthenticationManager\n        {\n            get\n            {\n                return HttpContext.GetOwinContext().Authentication;\n            }\n        }\n\n        private void AddErrors(IdentityResult result)\n        {\n            foreach (var error in result.Errors)\n            {\n                ModelState.AddModelError(\"\", error);\n            }\n        }\n\n        private ActionResult RedirectToLocal(string returnUrl)\n        {\n            if (Url.IsLocalUrl(returnUrl))\n            {\n                return Redirect(returnUrl);\n            }\n            return RedirectToAction(\"Index\", \"Home\");\n        }\n\n        internal class ChallengeResult : HttpUnauthorizedResult\n        {\n            public ChallengeResult(string provider, string redirectUri)\n                : this(provider, redirectUri, null)\n            {\n            }\n\n            public ChallengeResult(string provider, string redirectUri, string userId)\n            {\n                LoginProvider = provider;\n                RedirectUri = redirectUri;\n                UserId = userId;\n            }\n\n            public string LoginProvider { get; set; }\n            public string RedirectUri { get; set; }\n            public string UserId { get; set; }\n\n            public override void ExecuteResult(ControllerContext context)\n            {\n                var properties = new AuthenticationProperties { RedirectUri = RedirectUri };\n                if (UserId != null)\n                {\n                    properties.Dictionary[XsrfKey] = UserId;\n                }\n                context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);\n            }\n        }\n        #endregion\n    }\n}"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Controllers/HomeController.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Mvc;\n\nnamespace WebApplication.Controllers\n{\n    public class HomeController : Controller\n    {\n        public ActionResult Index()\n        {\n            return View();\n        }\n\n        public ActionResult About()\n        {\n            ViewBag.Message = \"Your application description page.\";\n\n            return View();\n        }\n\n        public ActionResult Contact()\n        {\n            ViewBag.Message = \"Your contact page.\";\n\n            return View();\n        }\n    }\n}"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Controllers/ManageController.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Web;\nusing System.Web.Mvc;\nusing Microsoft.AspNet.Identity;\nusing Microsoft.AspNet.Identity.Owin;\nusing Microsoft.Owin.Security;\nusing WebApplication.Models;\n\nnamespace WebApplication.Controllers\n{\n    [Authorize]\n    public class ManageController : Controller\n    {\n        private ApplicationSignInManager _signInManager;\n        private ApplicationUserManager _userManager;\n\n        public ManageController()\n        {\n        }\n\n        public ManageController(ApplicationUserManager userManager, ApplicationSignInManager signInManager)\n        {\n            UserManager = userManager;\n            SignInManager = signInManager;\n        }\n\n        public ApplicationSignInManager SignInManager\n        {\n            get\n            {\n                return _signInManager ?? HttpContext.GetOwinContext().Get<ApplicationSignInManager>();\n            }\n            private set \n            { \n                _signInManager = value; \n            }\n        }\n\n        public ApplicationUserManager UserManager\n        {\n            get\n            {\n                return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();\n            }\n            private set\n            {\n                _userManager = value;\n            }\n        }\n\n        //\n        // GET: /Manage/Index\n        public async Task<ActionResult> Index(ManageMessageId? message)\n        {\n            ViewBag.StatusMessage =\n                message == ManageMessageId.ChangePasswordSuccess ? \"パスワードが変更されました。\"\n                : message == ManageMessageId.SetPasswordSuccess ? \"パスワードが設定されました。\"\n                : message == ManageMessageId.SetTwoFactorSuccess ? \"2 要素認証プロバイダーが設定されました。\"\n                : message == ManageMessageId.Error ? \"エラーが発生しました。\"\n                : message == ManageMessageId.AddPhoneSuccess ? \"電話番号が追加されました。\"\n                : message == ManageMessageId.RemovePhoneSuccess ? \"電話番号が削除されました。\"\n                : \"\";\n\n            var userId = User.Identity.GetUserId();\n            var model = new IndexViewModel\n            {\n                HasPassword = HasPassword(),\n                PhoneNumber = await UserManager.GetPhoneNumberAsync(userId),\n                TwoFactor = await UserManager.GetTwoFactorEnabledAsync(userId),\n                Logins = await UserManager.GetLoginsAsync(userId),\n                BrowserRemembered = await AuthenticationManager.TwoFactorBrowserRememberedAsync(userId)\n            };\n            return View(model);\n        }\n\n        //\n        // POST: /Manage/RemoveLogin\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> RemoveLogin(string loginProvider, string providerKey)\n        {\n            ManageMessageId? message;\n            var result = await UserManager.RemoveLoginAsync(User.Identity.GetUserId(), new UserLoginInfo(loginProvider, providerKey));\n            if (result.Succeeded)\n            {\n                var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());\n                if (user != null)\n                {\n                    await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);\n                }\n                message = ManageMessageId.RemoveLoginSuccess;\n            }\n            else\n            {\n                message = ManageMessageId.Error;\n            }\n            return RedirectToAction(\"ManageLogins\", new { Message = message });\n        }\n\n        //\n        // GET: /Manage/AddPhoneNumber\n        public ActionResult AddPhoneNumber()\n        {\n            return View();\n        }\n\n        //\n        // POST: /Manage/AddPhoneNumber\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> AddPhoneNumber(AddPhoneNumberViewModel model)\n        {\n            if (!ModelState.IsValid)\n            {\n                return View(model);\n            }\n            // トークンを生成して送信します。\n            var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), model.Number);\n            if (UserManager.SmsService != null)\n            {\n                var message = new IdentityMessage\n                {\n                    Destination = model.Number,\n                    Body = \"あなたのセキュリティ コード: \" + code\n                };\n                await UserManager.SmsService.SendAsync(message);\n            }\n            return RedirectToAction(\"VerifyPhoneNumber\", new { PhoneNumber = model.Number });\n        }\n\n        //\n        // POST: /Manage/EnableTwoFactorAuthentication\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> EnableTwoFactorAuthentication()\n        {\n            await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), true);\n            var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());\n            if (user != null)\n            {\n                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);\n            }\n            return RedirectToAction(\"Index\", \"Manage\");\n        }\n\n        //\n        // POST: /Manage/DisableTwoFactorAuthentication\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> DisableTwoFactorAuthentication()\n        {\n            await UserManager.SetTwoFactorEnabledAsync(User.Identity.GetUserId(), false);\n            var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());\n            if (user != null)\n            {\n                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);\n            }\n            return RedirectToAction(\"Index\", \"Manage\");\n        }\n\n        //\n        // GET: /Manage/VerifyPhoneNumber\n        public async Task<ActionResult> VerifyPhoneNumber(string phoneNumber)\n        {\n            var code = await UserManager.GenerateChangePhoneNumberTokenAsync(User.Identity.GetUserId(), phoneNumber);\n            // 電話番号を確認するために SMS プロバイダー経由で SMS を送信します。\n            return phoneNumber == null ? View(\"Error\") : View(new VerifyPhoneNumberViewModel { PhoneNumber = phoneNumber });\n        }\n\n        //\n        // POST: /Manage/VerifyPhoneNumber\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> VerifyPhoneNumber(VerifyPhoneNumberViewModel model)\n        {\n            if (!ModelState.IsValid)\n            {\n                return View(model);\n            }\n            var result = await UserManager.ChangePhoneNumberAsync(User.Identity.GetUserId(), model.PhoneNumber, model.Code);\n            if (result.Succeeded)\n            {\n                var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());\n                if (user != null)\n                {\n                    await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);\n                }\n                return RedirectToAction(\"Index\", new { Message = ManageMessageId.AddPhoneSuccess });\n            }\n            // ここに到達した場合は何らかの問題が発生しているので、フォームを再表示します。\n            ModelState.AddModelError(\"\", \"電話番号を確認できませんでした\");\n            return View(model);\n        }\n\n        //\n        // GET: /Manage/RemovePhoneNumber\n        public async Task<ActionResult> RemovePhoneNumber()\n        {\n            var result = await UserManager.SetPhoneNumberAsync(User.Identity.GetUserId(), null);\n            if (!result.Succeeded)\n            {\n                return RedirectToAction(\"Index\", new { Message = ManageMessageId.Error });\n            }\n            var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());\n            if (user != null)\n            {\n                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);\n            }\n            return RedirectToAction(\"Index\", new { Message = ManageMessageId.RemovePhoneSuccess });\n        }\n\n        //\n        // GET: /Manage/ChangePassword\n        public ActionResult ChangePassword()\n        {\n            return View();\n        }\n\n        //\n        // POST: /Manage/ChangePassword\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> ChangePassword(ChangePasswordViewModel model)\n        {\n            if (!ModelState.IsValid)\n            {\n                return View(model);\n            }\n            var result = await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword);\n            if (result.Succeeded)\n            {\n                var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());\n                if (user != null)\n                {\n                    await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);\n                }\n                return RedirectToAction(\"Index\", new { Message = ManageMessageId.ChangePasswordSuccess });\n            }\n            AddErrors(result);\n            return View(model);\n        }\n\n        //\n        // GET: /Manage/SetPassword\n        public ActionResult SetPassword()\n        {\n            return View();\n        }\n\n        //\n        // POST: /Manage/SetPassword\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public async Task<ActionResult> SetPassword(SetPasswordViewModel model)\n        {\n            if (ModelState.IsValid)\n            {\n                var result = await UserManager.AddPasswordAsync(User.Identity.GetUserId(), model.NewPassword);\n                if (result.Succeeded)\n                {\n                    var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());\n                    if (user != null)\n                    {\n                        await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);\n                    }\n                    return RedirectToAction(\"Index\", new { Message = ManageMessageId.SetPasswordSuccess });\n                }\n                AddErrors(result);\n            }\n\n            // ここに到達した場合は何らかの問題が発生しているので、フォームを再表示します。\n            return View(model);\n        }\n\n        //\n        // GET: /Manage/ManageLogins\n        public async Task<ActionResult> ManageLogins(ManageMessageId? message)\n        {\n            ViewBag.StatusMessage =\n                message == ManageMessageId.RemoveLoginSuccess ? \"外部ログインが削除されました。\"\n                : message == ManageMessageId.Error ? \"エラーが発生しました。\"\n                : \"\";\n            var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());\n            if (user == null)\n            {\n                return View(\"Error\");\n            }\n            var userLogins = await UserManager.GetLoginsAsync(User.Identity.GetUserId());\n            var otherLogins = AuthenticationManager.GetExternalAuthenticationTypes().Where(auth => userLogins.All(ul => auth.AuthenticationType != ul.LoginProvider)).ToList();\n            ViewBag.ShowRemoveButton = user.PasswordHash != null || userLogins.Count > 1;\n            return View(new ManageLoginsViewModel\n            {\n                CurrentLogins = userLogins,\n                OtherLogins = otherLogins\n            });\n        }\n\n        //\n        // POST: /Manage/LinkLogin\n        [HttpPost]\n        [ValidateAntiForgeryToken]\n        public ActionResult LinkLogin(string provider)\n        {\n            // 現在のユーザーのログインをリンクするために外部ログイン プロバイダーへのリダイレクトを要求します。\n            return new AccountController.ChallengeResult(provider, Url.Action(\"LinkLoginCallback\", \"Manage\"), User.Identity.GetUserId());\n        }\n\n        //\n        // GET: /Manage/LinkLoginCallback\n        public async Task<ActionResult> LinkLoginCallback()\n        {\n            var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, User.Identity.GetUserId());\n            if (loginInfo == null)\n            {\n                return RedirectToAction(\"ManageLogins\", new { Message = ManageMessageId.Error });\n            }\n            var result = await UserManager.AddLoginAsync(User.Identity.GetUserId(), loginInfo.Login);\n            return result.Succeeded ? RedirectToAction(\"ManageLogins\") : RedirectToAction(\"ManageLogins\", new { Message = ManageMessageId.Error });\n        }\n\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && _userManager != null)\n            {\n                _userManager.Dispose();\n                _userManager = null;\n            }\n\n            base.Dispose(disposing);\n        }\n\n#region ヘルパー\n        // 外部ログインの追加時に XSRF の防止に使用します\n        private const string XsrfKey = \"XsrfId\";\n\n        private IAuthenticationManager AuthenticationManager\n        {\n            get\n            {\n                return HttpContext.GetOwinContext().Authentication;\n            }\n        }\n\n        private void AddErrors(IdentityResult result)\n        {\n            foreach (var error in result.Errors)\n            {\n                ModelState.AddModelError(\"\", error);\n            }\n        }\n\n        private bool HasPassword()\n        {\n            var user = UserManager.FindById(User.Identity.GetUserId());\n            if (user != null)\n            {\n                return user.PasswordHash != null;\n            }\n            return false;\n        }\n\n        private bool HasPhoneNumber()\n        {\n            var user = UserManager.FindById(User.Identity.GetUserId());\n            if (user != null)\n            {\n                return user.PhoneNumber != null;\n            }\n            return false;\n        }\n\n        public enum ManageMessageId\n        {\n            AddPhoneSuccess,\n            ChangePasswordSuccess,\n            SetTwoFactorSuccess,\n            SetPasswordSuccess,\n            RemoveLoginSuccess,\n            RemovePhoneSuccess,\n            Error\n        }\n\n#endregion\n    }\n}"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Global.asax",
    "content": "﻿<%@ Application Codebehind=\"Global.asax.cs\" Inherits=\"WebApplication.MvcApplication\" Language=\"C#\" %>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Global.asax.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.Mvc;\nusing System.Web.Optimization;\nusing System.Web.Routing;\n\nnamespace WebApplication\n{\n    public class MvcApplication : System.Web.HttpApplication\n    {\n        protected void Application_Start()\n        {\n            AreaRegistration.RegisterAllAreas();\n            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);\n            RouteConfig.RegisterRoutes(RouteTable.Routes);\n            BundleConfig.RegisterBundles(BundleTable.Bundles);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Models/AccountViewModels.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\n\nnamespace WebApplication.Models\n{\n    public class ExternalLoginConfirmationViewModel\n    {\n        [Required]\n        [Display(Name = \"電子メール\")]\n        public string Email { get; set; }\n    }\n\n    public class ExternalLoginListViewModel\n    {\n        public string ReturnUrl { get; set; }\n    }\n\n    public class SendCodeViewModel\n    {\n        public string SelectedProvider { get; set; }\n        public ICollection<System.Web.Mvc.SelectListItem> Providers { get; set; }\n        public string ReturnUrl { get; set; }\n        public bool RememberMe { get; set; }\n    }\n\n    public class VerifyCodeViewModel\n    {\n        [Required]\n        public string Provider { get; set; }\n\n        [Required]\n        [Display(Name = \"コード\")]\n        public string Code { get; set; }\n        public string ReturnUrl { get; set; }\n\n        [Display(Name = \"認証情報をこのブラウザーに保存しますか?\")]\n        public bool RememberBrowser { get; set; }\n\n        public bool RememberMe { get; set; }\n    }\n\n    public class ForgotViewModel\n    {\n        [Required]\n        [Display(Name = \"電子メール\")]\n        public string Email { get; set; }\n    }\n\n    public class LoginViewModel\n    {\n        [Required]\n        [Display(Name = \"電子メール\")]\n        [EmailAddress]\n        public string Email { get; set; }\n\n        [Required]\n        [DataType(DataType.Password)]\n        [Display(Name = \"パスワード\")]\n        public string Password { get; set; }\n\n        [Display(Name = \"このアカウントを記憶する\")]\n        public bool RememberMe { get; set; }\n    }\n\n    public class RegisterViewModel\n    {\n        [Required]\n        [EmailAddress]\n        [Display(Name = \"電子メール\")]\n        public string Email { get; set; }\n\n        [Required]\n        [StringLength(100, ErrorMessage = \"{0} の長さは {2} 文字以上である必要があります。\", MinimumLength = 6)]\n        [DataType(DataType.Password)]\n        [Display(Name = \"パスワード\")]\n        public string Password { get; set; }\n\n        [DataType(DataType.Password)]\n        [Display(Name = \"パスワードの確認入力\")]\n        [Compare(\"Password\", ErrorMessage = \"パスワードと確認のパスワードが一致しません。\")]\n        public string ConfirmPassword { get; set; }\n    }\n\n    public class ResetPasswordViewModel\n    {\n        [Required]\n        [EmailAddress]\n        [Display(Name = \"電子メール\")]\n        public string Email { get; set; }\n\n        [Required]\n        [StringLength(100, ErrorMessage = \"{0} の長さは {2} 文字以上である必要があります。\", MinimumLength = 6)]\n        [DataType(DataType.Password)]\n        [Display(Name = \"パスワード\")]\n        public string Password { get; set; }\n\n        [DataType(DataType.Password)]\n        [Display(Name = \"パスワードの確認入力\")]\n        [Compare(\"Password\", ErrorMessage = \"パスワードと確認のパスワードが一致しません。\")]\n        public string ConfirmPassword { get; set; }\n\n        public string Code { get; set; }\n    }\n\n    public class ForgotPasswordViewModel\n    {\n        [Required]\n        [EmailAddress]\n        [Display(Name = \"電子メール\")]\n        public string Email { get; set; }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Models/IdentityModels.cs",
    "content": "﻿using System.Data.Entity;\nusing System.Security.Claims;\nusing System.Threading.Tasks;\nusing Microsoft.AspNet.Identity;\nusing Microsoft.AspNet.Identity.EntityFramework;\n\nnamespace WebApplication.Models\n{\n    // ApplicationUser クラスにプロパティを追加することでユーザーのプロファイル データを追加できます。詳細については、http://go.microsoft.com/fwlink/?LinkID=317594 を参照してください。\n    public class ApplicationUser : IdentityUser\n    {\n        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)\n        {\n            // authenticationType が CookieAuthenticationOptions.AuthenticationType で定義されているものと一致している必要があります\n            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);\n            // ここにカスタム ユーザー クレームを追加します\n            return userIdentity;\n        }\n    }\n\n    public class ApplicationDbContext : IdentityDbContext<ApplicationUser>\n    {\n        public ApplicationDbContext()\n            : base(\"DefaultConnection\", throwIfV1Schema: false)\n        {\n        }\n\n        public static ApplicationDbContext Create()\n        {\n            return new ApplicationDbContext();\n        }\n    }\n}"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Models/ManageViewModels.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing Microsoft.AspNet.Identity;\nusing Microsoft.Owin.Security;\n\nnamespace WebApplication.Models\n{\n    public class IndexViewModel\n    {\n        public bool HasPassword { get; set; }\n        public IList<UserLoginInfo> Logins { get; set; }\n        public string PhoneNumber { get; set; }\n        public bool TwoFactor { get; set; }\n        public bool BrowserRemembered { get; set; }\n    }\n\n    public class ManageLoginsViewModel\n    {\n        public IList<UserLoginInfo> CurrentLogins { get; set; }\n        public IList<AuthenticationDescription> OtherLogins { get; set; }\n    }\n\n    public class FactorViewModel\n    {\n        public string Purpose { get; set; }\n    }\n\n    public class SetPasswordViewModel\n    {\n        [Required]\n        [StringLength(100, ErrorMessage = \"{0} の長さは {2} 文字以上である必要があります。\", MinimumLength = 6)]\n        [DataType(DataType.Password)]\n        [Display(Name = \"新しいパスワード\")]\n        public string NewPassword { get; set; }\n\n        [DataType(DataType.Password)]\n        [Display(Name = \"新しいパスワードの確認入力\")]\n        [Compare(\"NewPassword\", ErrorMessage = \"新しいパスワードと確認のパスワードが一致しません。\")]\n        public string ConfirmPassword { get; set; }\n    }\n\n    public class ChangePasswordViewModel\n    {\n        [Required]\n        [DataType(DataType.Password)]\n        [Display(Name = \"現在のパスワード\")]\n        public string OldPassword { get; set; }\n\n        [Required]\n        [StringLength(100, ErrorMessage = \"{0} の長さは {2} 文字以上である必要があります。\", MinimumLength = 6)]\n        [DataType(DataType.Password)]\n        [Display(Name = \"新しいパスワード\")]\n        public string NewPassword { get; set; }\n\n        [DataType(DataType.Password)]\n        [Display(Name = \"新しいパスワードの確認入力\")]\n        [Compare(\"NewPassword\", ErrorMessage = \"新しいパスワードと確認のパスワードが一致しません。\")]\n        public string ConfirmPassword { get; set; }\n    }\n\n    public class AddPhoneNumberViewModel\n    {\n        [Required]\n        [Phone]\n        [Display(Name = \"電話番号\")]\n        public string Number { get; set; }\n    }\n\n    public class VerifyPhoneNumberViewModel\n    {\n        [Required]\n        [Display(Name = \"コード\")]\n        public string Code { get; set; }\n\n        [Required]\n        [Phone]\n        [Display(Name = \"電話番号\")]\n        public string PhoneNumber { get; set; }\n    }\n\n    public class ConfigureTwoFactorViewModel\n    {\n        public string SelectedProvider { get; set; }\n        public ICollection<System.Web.Mvc.SelectListItem> Providers { get; set; }\n    }\n}"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Project_Readme.html",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n    <meta charset=\"utf-8\" />\n    <title>ユーザーの ASP.NET アプリケーション</title>\n    <style>\n        body {\n            background: #fff;\n            color: #505050;\n            font: 14px 'Segoe UI', tahoma, arial, helvetica, sans-serif;\n            margin: 20px;\n            padding: 0;\n        }\n\n        #header {\n            background: #efefef;\n            padding: 0;\n        }\n\n        h1 {\n            font-size: 48px;\n            font-weight: normal;\n            margin: 0;\n            padding: 0 30px;\n            line-height: 150px;\n        }\n\n        p {\n            font-size: 20px;\n            color: #fff;\n            background: #969696;\n            padding: 0 30px;\n            line-height: 50px;\n        }\n\n        #main {\n            padding: 5px 30px;\n        }\n\n        .section {\n            width: 21.7%;\n            float: left;\n            margin: 0 0 0 4%;\n        }\n\n            .section h2 {\n                font-size: 13px;\n                text-transform: uppercase;\n                margin: 0;\n                border-bottom: 1px solid silver;\n                padding-bottom: 12px;\n                margin-bottom: 8px;\n            }\n\n            .section.first {\n                margin-left: 0;\n            }\n\n                .section.first h2 {\n                    font-size: 24px;\n                    text-transform: none;\n                    margin-bottom: 25px;\n                    border: none;\n                }\n\n                .section.first li {\n                    border-top: 1px solid silver;\n                    padding: 8px 0;\n                }\n\n            .section.last {\n                margin-right: 0;\n            }\n\n        ul {\n            list-style: none;\n            padding: 0;\n            margin: 0;\n            line-height: 20px;\n        }\n\n        li {\n            padding: 4px 0;\n        }\n\n        a {\n            color: #267cb2;\n            text-decoration: none;\n        }\n\n            a:hover {\n                text-decoration: underline;\n            }\n    </style>\n</head>\n<body>\n\n    <div id=\"header\">\n        <h1>ユーザーの ASP.NET アプリケーション</h1>\n        <p>プロジェクトの 作成が完了しました</p>\n    </div>\n\n    <div id=\"main\">\n        <div class=\"section first\">\n            <h2>このアプリケーションの構成:</h2>\n            <ul>\n                <li>[Home]、[About]、[Contact] への基本的なナビゲーションを示したサンプル ページ</li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320754\">Bootstrap</a> を使用したテーマ</li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320755\">認証</a>を選択した場合、登録とサインインの方法を表示</li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320756\">NuGet</a> を使用して管理する ASP.NET 機能</li>\n            </ul>\n        </div>\n\n        <div class=\"section\">\n            <h2>アプリケーションのカスタマイズ</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320757\">ASP.NET MVC を使い始める</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320758\">サイトのテーマを変更する</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320759\">NuGet を使用してライブラリを追加する</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320760\">認証を構成する</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320761\">Web サイト ユーザーの情報をカスタマイズする</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320762\">ソーシャル プロバイダーから情報を取得する</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320763\">ASP.NET Web API を使用して HTTP サービスを追加する</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320764\">Web API をセキュリティで保護する</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320765\">ASP.NET SignalR でリアルタイム Web を追加する</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320766\">Scaffolding を使用してコンポーネントを追加する</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320767\">Browser Link でアプリケーションをテストする</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320768\">プロジェクトを共有する</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section\">\n            <h2>展開</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320769\">アプリケーションの実稼働の準備が整っているか確認する</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320770\">Microsoft Azure</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320771\">ホスティング プロバイダー</a></li>\n            </ul>\n        </div>\n\n        <div class=\"section last\">\n            <h2>ヘルプ</h2>\n            <ul>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320772\">ヘルプ</a></li>\n                <li><a href=\"http://go.microsoft.com/fwlink/?LinkID=320773\">他のテンプレートを入手する</a></li>\n            </ul>\n        </div>\n    </div>\n\n</body>\n</html>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般的情報は、以下の属性セットによって\n// 制御されます。アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更します。\n[assembly: AssemblyTitle(\"WebApplication\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"WebApplication\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、このアセンブリ内の型は\n// COM コンポーネントから参照できなくなります。\n// COM からこのアセンブリ内の型にアクセスする必要がある場合は、その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります。\n[assembly: Guid(\"aacc72b1-f27f-4959-bd3c-0a0528dcc560\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン\n//      ビルド番号\n//      リビジョン\n//\n// すべての値を指定するか、以下のように \"*\" を使用してリビジョンとビルド番号を\n// 既定値にすることができます:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Scripts/bootstrap.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n\n/**\n* bootstrap.js v3.0.0 by @fat and @mdo\n* Copyright 2013 Twitter Inc.\n* http://www.apache.org/licenses/LICENSE-2.0\n*/\nif (!jQuery) { throw new Error(\"Bootstrap requires jQuery\") }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#transitions\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      'WebkitTransition' : 'webkitTransitionEnd'\n    , 'MozTransition'    : 'transitionend'\n    , 'OTransition'      : 'oTransitionEnd otransitionend'\n    , 'transition'       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#alerts\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#buttons\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element = $(element)\n    this.options  = $.extend({}, Button.DEFAULTS, options)\n  }\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d);\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n        .prop('checked', !this.$element.hasClass('active'))\n        .trigger('change')\n      if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active')\n    }\n\n    this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#carousel\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000\n  , pause: 'hover'\n  , wrap: true\n  }\n\n  Carousel.prototype.cycle =  function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition.end) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n\n    if ($next.hasClass('active')) return\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n        .emulateTransitionEnd(600)\n    } else {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#collapse\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this   = $(this), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#dropdowns\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=dropdown]'\n  var Dropdown = function (element) {\n    var $el = $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      $parent.trigger(e = $.Event('show.bs.dropdown'))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown')\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index=0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus() {\n    $(backdrop).remove()\n    $(toggle).each(function (e) {\n      var $parent = getParent($(this))\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown'))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('dropdown')\n\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#modals\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) this.$element.load(this.options.remote)\n  }\n\n  Modal.DEFAULTS = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.escape()\n\n    this.$element.on('click.dismiss.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(document.body) // don't move modals dom position\n      }\n\n      that.$element.show()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.focus().trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var that    = this\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n    var option  = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>'\n  , trigger: 'hover focus'\n  , title: ''\n  , delay: 0\n  , html: false\n  , container: false\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled  = true\n    this.type     = type\n    this.$element = $(element)\n    this.options  = this.getOptions(options)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focus'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay\n      , hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.'+ this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n\n      var $tip = this.tip()\n\n      this.setContent()\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n      this.$element.trigger('shown.bs.' + this.type)\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function(offset, placement) {\n    var replace\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    $tip\n      .offset(offset)\n      .addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.$element.trigger('hidden.bs.' + this.type)\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth\n    , height: el.offsetHeight\n    }, this.$element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#popovers\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.arrow')\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#scrollspy\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#\\w/.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate( targets[i] )\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parents('.active')\n      .removeClass('active')\n\n    var selector = this.selector\n      + '[data-target=\"' + target + '\"],'\n      + this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length)  {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tabs\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab'\n      , relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#affix\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element = $(element)\n    this.affixed  =\n    this.unpin    = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    this.affixed = affix\n    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Scripts/jquery-1.10.2.intellisense.js",
    "content": "﻿/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\nintellisense.annotate(jQuery, {\n  'ajax': function() {\n    /// <signature>\n    ///   <summary>Perform an asynchronous HTTP (Ajax) request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"settings\" type=\"PlainObject\">A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) below for a complete list of all settings.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Perform an asynchronous HTTP (Ajax) request.</summary>\n    ///   <param name=\"settings\" type=\"PlainObject\">A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup().</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'ajaxPrefilter': function() {\n    /// <signature>\n    ///   <summary>Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax().</summary>\n    ///   <param name=\"dataTypes\" type=\"String\">An optional string containing one or more space-separated dataTypes</param>\n    ///   <param name=\"handler(options, originalOptions, jqXHR)\" type=\"Function\">A handler to set default values for future Ajax requests.</param>\n    /// </signature>\n  },\n  'ajaxSetup': function() {\n    /// <signature>\n    ///   <summary>Set default values for future Ajax requests.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A set of key/value pairs that configure the default Ajax request. All options are optional.</param>\n    /// </signature>\n  },\n  'ajaxTransport': function() {\n    /// <signature>\n    ///   <summary>Creates an object that handles the actual transmission of Ajax data.</summary>\n    ///   <param name=\"dataType\" type=\"String\">A string identifying the data type to use</param>\n    ///   <param name=\"handler(options, originalOptions, jqXHR)\" type=\"Function\">A handler to return the new transport object to use with the data type provided in the first argument.</param>\n    /// </signature>\n  },\n  'boxModel': function() {\n    /// <summary>Deprecated in jQuery 1.3 (see jQuery.support). States if the current page, in the user's browser, is being rendered using the W3C CSS Box Model.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'browser': function() {\n    /// <summary>Contains flags for the useragent, read from navigator.userAgent. We recommend against using this property; please try to use feature detection instead (see jQuery.support). jQuery.browser may be moved to a plugin in a future release of jQuery.</summary>\n    /// <returns type=\"PlainObject\" />\n  },\n  'browser.version': function() {\n    /// <summary>The version number of the rendering engine for the user's browser.</summary>\n    /// <returns type=\"String\" />\n  },\n  'Callbacks': function() {\n    /// <signature>\n    ///   <summary>A multi-purpose callbacks list object that provides a powerful way to manage callback lists.</summary>\n    ///   <param name=\"flags\" type=\"String\">An optional list of space-separated flags that change how the callback list behaves.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'contains': function() {\n    /// <signature>\n    ///   <summary>Check to see if a DOM element is a descendant of another DOM element.</summary>\n    ///   <param name=\"container\" type=\"Element\">The DOM element that may contain the other element.</param>\n    ///   <param name=\"contained\" type=\"Element\">The DOM element that may be contained by (a descendant of) the other element.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'cssHooks': function() {\n    /// <summary>Hook directly into jQuery to override how particular CSS properties are retrieved or set, normalize CSS property naming, or create custom properties.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'data': function() {\n    /// <signature>\n    ///   <summary>Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.</summary>\n    ///   <param name=\"element\" type=\"Element\">The DOM element to query for the data.</param>\n    ///   <param name=\"key\" type=\"String\">Name of the data stored.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element.</summary>\n    ///   <param name=\"element\" type=\"Element\">The DOM element to query for the data.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'Deferred': function() {\n    /// <signature>\n    ///   <summary>A constructor function that returns a chainable utility object with methods to register multiple callbacks into callback queues, invoke callback queues, and relay the success or failure state of any synchronous or asynchronous function.</summary>\n    ///   <param name=\"beforeStart\" type=\"Function\">A function that is called just before the constructor returns.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'dequeue': function() {\n    /// <signature>\n    ///   <summary>Execute the next function on the queue for the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element from which to remove and execute a queued function.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    /// </signature>\n  },\n  'each': function() {\n    /// <signature>\n    ///   <summary>A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties.</summary>\n    ///   <param name=\"collection\" type=\"Object\">The object or array to iterate over.</param>\n    ///   <param name=\"callback(indexInArray, valueOfElement)\" type=\"Function\">The function that will be executed on every object.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'error': function() {\n    /// <signature>\n    ///   <summary>Takes a string and throws an exception containing it.</summary>\n    ///   <param name=\"message\" type=\"String\">The message to send out.</param>\n    /// </signature>\n  },\n  'extend': function() {\n    /// <signature>\n    ///   <summary>Merge the contents of two or more objects together into the first object.</summary>\n    ///   <param name=\"target\" type=\"Object\">An object that will receive the new properties if additional objects are passed in or that will extend the jQuery namespace if it is the sole argument.</param>\n    ///   <param name=\"object1\" type=\"Object\">An object containing additional properties to merge in.</param>\n    ///   <param name=\"objectN\" type=\"Object\">Additional objects containing properties to merge in.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Merge the contents of two or more objects together into the first object.</summary>\n    ///   <param name=\"deep\" type=\"Boolean\">If true, the merge becomes recursive (aka. deep copy).</param>\n    ///   <param name=\"target\" type=\"Object\">The object to extend. It will receive the new properties.</param>\n    ///   <param name=\"object1\" type=\"Object\">An object containing additional properties to merge in.</param>\n    ///   <param name=\"objectN\" type=\"Object\">Additional objects containing properties to merge in.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'get': function() {\n    /// <signature>\n    ///   <summary>Load data from the server using a HTTP GET request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"String\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <param name=\"dataType\" type=\"String\">The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html).</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'getJSON': function() {\n    /// <signature>\n    ///   <summary>Load JSON-encoded data from the server using a GET HTTP request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'getScript': function() {\n    /// <signature>\n    ///   <summary>Load a JavaScript file from the server using a GET HTTP request, then execute it.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"success(script, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'globalEval': function() {\n    /// <signature>\n    ///   <summary>Execute some JavaScript code globally.</summary>\n    ///   <param name=\"code\" type=\"String\">The JavaScript code to execute.</param>\n    /// </signature>\n  },\n  'grep': function() {\n    /// <signature>\n    ///   <summary>Finds the elements of an array which satisfy a filter function. The original array is not affected.</summary>\n    ///   <param name=\"array\" type=\"Array\">The array to search through.</param>\n    ///   <param name=\"function(elementOfArray, indexInArray)\" type=\"Function\">The function to process each item against.  The first argument to the function is the item, and the second argument is the index.  The function should return a Boolean value.  this will be the global window object.</param>\n    ///   <param name=\"invert\" type=\"Boolean\">If \"invert\" is false, or not provided, then the function returns an array consisting of all elements for which \"callback\" returns true.  If \"invert\" is true, then the function returns an array consisting of all elements for which \"callback\" returns false.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'hasData': function() {\n    /// <signature>\n    ///   <summary>Determine whether an element has any jQuery data associated with it.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to be checked for data.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'holdReady': function() {\n    /// <signature>\n    ///   <summary>Holds or releases the execution of jQuery's ready event.</summary>\n    ///   <param name=\"hold\" type=\"Boolean\">Indicates whether the ready hold is being requested or released</param>\n    /// </signature>\n  },\n  'inArray': function() {\n    /// <signature>\n    ///   <summary>Search for a specified value within an array and return its index (or -1 if not found).</summary>\n    ///   <param name=\"value\" type=\"Anything\">The value to search for.</param>\n    ///   <param name=\"array\" type=\"Array\">An array through which to search.</param>\n    ///   <param name=\"fromIndex\" type=\"Number\">The index of the array at which to begin the search. The default is 0, which will search the whole array.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n  },\n  'isArray': function() {\n    /// <signature>\n    ///   <summary>Determine whether the argument is an array.</summary>\n    ///   <param name=\"obj\" type=\"Object\">Object to test whether or not it is an array.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isEmptyObject': function() {\n    /// <signature>\n    ///   <summary>Check to see if an object is empty (contains no enumerable properties).</summary>\n    ///   <param name=\"object\" type=\"Object\">The object that will be checked to see if it's empty.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isFunction': function() {\n    /// <signature>\n    ///   <summary>Determine if the argument passed is a Javascript function object.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to test whether or not it is a function.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isNumeric': function() {\n    /// <signature>\n    ///   <summary>Determines whether its argument is a number.</summary>\n    ///   <param name=\"value\" type=\"PlainObject\">The value to be tested.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isPlainObject': function() {\n    /// <signature>\n    ///   <summary>Check to see if an object is a plain object (created using \"{}\" or \"new Object\").</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">The object that will be checked to see if it's a plain object.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'isWindow': function() {\n    /// <signature>\n    ///   <summary>Determine whether the argument is a window.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to test whether or not it is a window.</param>\n    ///   <returns type=\"boolean\" />\n    /// </signature>\n  },\n  'isXMLDoc': function() {\n    /// <signature>\n    ///   <summary>Check to see if a DOM node is within an XML document (or is an XML document).</summary>\n    ///   <param name=\"node\" type=\"Element\">The DOM node that will be checked to see if it's in an XML document.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'makeArray': function() {\n    /// <signature>\n    ///   <summary>Convert an array-like object into a true JavaScript array.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Any object to turn into a native Array.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'map': function() {\n    /// <signature>\n    ///   <summary>Translate all items in an array or object to new array of items.</summary>\n    ///   <param name=\"array\" type=\"Array\">The Array to translate.</param>\n    ///   <param name=\"callback(elementOfArray, indexInArray)\" type=\"Function\">The function to process each item against.  The first argument to the function is the array item, the second argument is the index in array The function can return any value. Within the function, this refers to the global (window) object.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Translate all items in an array or object to new array of items.</summary>\n    ///   <param name=\"arrayOrObject\" type=\"Object\">The Array or Object to translate.</param>\n    ///   <param name=\"callback( value, indexOrKey )\" type=\"Function\">The function to process each item against.  The first argument to the function is the value; the second argument is the index or key of the array or object property. The function can return any value to add to the array. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'merge': function() {\n    /// <signature>\n    ///   <summary>Merge the contents of two arrays together into the first array.</summary>\n    ///   <param name=\"first\" type=\"Array\">The first array to merge, the elements of second added.</param>\n    ///   <param name=\"second\" type=\"Array\">The second array to merge into the first, unaltered.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'noConflict': function() {\n    /// <signature>\n    ///   <summary>Relinquish jQuery's control of the $ variable.</summary>\n    ///   <param name=\"removeAll\" type=\"Boolean\">A Boolean indicating whether to remove all jQuery variables from the global scope (including jQuery itself).</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'noop': function() {\n    /// <summary>An empty function.</summary>\n  },\n  'now': function() {\n    /// <summary>Return a number representing the current time.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'param': function() {\n    /// <signature>\n    ///   <summary>Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An array or object to serialize.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An array or object to serialize.</param>\n    ///   <param name=\"traditional\" type=\"Boolean\">A Boolean indicating whether to perform a traditional \"shallow\" serialization.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'parseHTML': function() {\n    /// <signature>\n    ///   <summary>Parses a string into an array of DOM nodes.</summary>\n    ///   <param name=\"data\" type=\"String\">HTML string to be parsed</param>\n    ///   <param name=\"context\" type=\"Element\">DOM element to serve as the context in which the HTML fragment will be created</param>\n    ///   <param name=\"keepScripts\" type=\"Boolean\">A Boolean indicating whether to include scripts passed in the HTML string</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'parseJSON': function() {\n    /// <signature>\n    ///   <summary>Takes a well-formed JSON string and returns the resulting JavaScript object.</summary>\n    ///   <param name=\"json\" type=\"String\">The JSON string to parse.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'parseXML': function() {\n    /// <signature>\n    ///   <summary>Parses a string into an XML document.</summary>\n    ///   <param name=\"data\" type=\"String\">a well-formed XML string to be parsed</param>\n    ///   <returns type=\"XMLDocument\" />\n    /// </signature>\n  },\n  'post': function() {\n    /// <signature>\n    ///   <summary>Load data from the server using a HTTP POST request.</summary>\n    ///   <param name=\"url\" type=\"String\">A string containing the URL to which the request is sent.</param>\n    ///   <param name=\"data\" type=\"String\">A plain object or string that is sent to the server with the request.</param>\n    ///   <param name=\"success(data, textStatus, jqXHR)\" type=\"Function\">A callback function that is executed if the request succeeds.</param>\n    ///   <param name=\"dataType\" type=\"String\">The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html).</param>\n    ///   <returns type=\"jqXHR\" />\n    /// </signature>\n  },\n  'proxy': function() {\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"function\" type=\"Function\">The function whose context will be changed.</param>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context (this) of the function should be set.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context of the function should be set.</param>\n    ///   <param name=\"name\" type=\"String\">The name of the function whose context will be changed (should be a property of the context object).</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"function\" type=\"Function\">The function whose context will be changed.</param>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context (this) of the function should be set.</param>\n    ///   <param name=\"additionalArguments\" type=\"Anything\">Any number of arguments to be passed to the function referenced in the function argument.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Takes a function and returns a new one that will always have a particular context.</summary>\n    ///   <param name=\"context\" type=\"PlainObject\">The object to which the context of the function should be set.</param>\n    ///   <param name=\"name\" type=\"String\">The name of the function whose context will be changed (should be a property of the context object).</param>\n    ///   <param name=\"additionalArguments\" type=\"Anything\">Any number of arguments to be passed to the function named in the name argument.</param>\n    ///   <returns type=\"Function\" />\n    /// </signature>\n  },\n  'queue': function() {\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed on the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element where the array of queued functions is attached.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"newQueue\" type=\"Array\">An array of functions to replace the current queue contents.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed on the matched element.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element on which to add a queued function.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"callback()\" type=\"Function\">The new function to add to the queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeData': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element from which to remove data.</param>\n    ///   <param name=\"name\" type=\"String\">A string naming the piece of data to remove.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'sub': function() {\n    /// <summary>Creates a new copy of jQuery whose properties and methods can be modified without affecting the original jQuery object.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'support': function() {\n    /// <summary>A collection of properties that represent the presence of different browser features or bugs. Primarily intended for jQuery's internal use; specific properties may be removed when they are no longer needed internally to improve page startup performance.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'trim': function() {\n    /// <signature>\n    ///   <summary>Remove the whitespace from the beginning and end of a string.</summary>\n    ///   <param name=\"str\" type=\"String\">The string to trim.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'type': function() {\n    /// <signature>\n    ///   <summary>Determine the internal JavaScript [[Class]] of an object.</summary>\n    ///   <param name=\"obj\" type=\"PlainObject\">Object to get the internal JavaScript [[Class]] of.</param>\n    ///   <returns type=\"String\" />\n    /// </signature>\n  },\n  'unique': function() {\n    /// <signature>\n    ///   <summary>Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on arrays of DOM elements, not strings or numbers.</summary>\n    ///   <param name=\"array\" type=\"Array\">The Array of DOM elements.</param>\n    ///   <returns type=\"Array\" />\n    /// </signature>\n  },\n  'when': function() {\n    /// <signature>\n    ///   <summary>Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events.</summary>\n    ///   <param name=\"deferreds\" type=\"Deferred\">One or more Deferred objects, or plain JavaScript objects.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n});\n\nvar _1228819969 = jQuery.Callbacks;\njQuery.Callbacks = function(flags) {\nvar _object = _1228819969(flags);\nintellisense.annotate(_object, {\n  'add': function() {\n    /// <signature>\n    ///   <summary>Add a callback or a collection of callbacks to a callback list.</summary>\n    ///   <param name=\"callbacks\" type=\"Array\">A function, or array of functions, that are to be added to the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'disable': function() {\n    /// <summary>Disable a callback list from doing anything more.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'disabled': function() {\n    /// <summary>Determine if the callbacks list has been disabled.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'empty': function() {\n    /// <summary>Remove all of the callbacks from a list.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'fire': function() {\n    /// <signature>\n    ///   <summary>Call all of the callbacks with the given arguments</summary>\n    ///   <param name=\"arguments\" type=\"Anything\">The argument or list of arguments to pass back to the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'fired': function() {\n    /// <summary>Determine if the callbacks have already been called at least once.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'fireWith': function() {\n    /// <signature>\n    ///   <summary>Call all callbacks in a list with the given context and arguments.</summary>\n    ///   <param name=\"context\" type=\"\">A reference to the context in which the callbacks in the list should be fired.</param>\n    ///   <param name=\"args\" type=\"\">An argument, or array of arguments, to pass to the callbacks in the list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n  'has': function() {\n    /// <signature>\n    ///   <summary>Determine whether a supplied callback is in a list</summary>\n    ///   <param name=\"callback\" type=\"Function\">The callback to search for.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'lock': function() {\n    /// <summary>Lock a callback list in its current state.</summary>\n    /// <returns type=\"Callbacks\" />\n  },\n  'locked': function() {\n    /// <summary>Determine if the callbacks list has been locked.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'remove': function() {\n    /// <signature>\n    ///   <summary>Remove a callback or a collection of callbacks from a callback list.</summary>\n    ///   <param name=\"callbacks\" type=\"Array\">A function, or array of functions, that are to be removed from the callback list.</param>\n    ///   <returns type=\"Callbacks\" />\n    /// </signature>\n  },\n});\n\nreturn _object;\n};\nintellisense.redirectDefinition(jQuery.Callbacks, _1228819969);\n\nvar _731531622 = jQuery.Deferred;\njQuery.Deferred = function(func) {\nvar _object = _731531622(func);\nintellisense.annotate(_object, {\n  'always': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is either resolved or rejected.</summary>\n    ///   <param name=\"alwaysCallbacks\" type=\"Function\">A function, or array of functions, that is called when the Deferred is resolved or rejected.</param>\n    ///   <param name=\"alwaysCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'done': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, that are called when the Deferred is resolved.</param>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is resolved.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'fail': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is rejected.</summary>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, that are called when the Deferred is rejected.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">Optional additional functions, or arrays of functions, that are called when the Deferred is rejected.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'isRejected': function() {\n    /// <summary>Determine whether a Deferred object has been rejected.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isResolved': function() {\n    /// <summary>Determine whether a Deferred object has been resolved.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'notify': function() {\n    /// <signature>\n    ///   <summary>Call the progressCallbacks on a Deferred object with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the progressCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'notifyWith': function() {\n    /// <signature>\n    ///   <summary>Call the progressCallbacks on a Deferred object with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the progressCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the progressCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'pipe': function() {\n    /// <signature>\n    ///   <summary>Utility method to filter and/or chain Deferreds.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">An optional function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Utility method to filter and/or chain Deferreds.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">An optional function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <param name=\"progressFilter\" type=\"Function\">An optional function that is called when progress notifications are sent to the Deferred.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'progress': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object generates progress notifications.</summary>\n    ///   <param name=\"progressCallbacks\" type=\"Function\">A function, or array of functions, that is called when the Deferred generates progress notifications.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'promise': function() {\n    /// <signature>\n    ///   <summary>Return a Deferred's Promise object.</summary>\n    ///   <param name=\"target\" type=\"Object\">Object onto which the promise methods have to be attached</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'reject': function() {\n    /// <signature>\n    ///   <summary>Reject a Deferred object and call any failCallbacks with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the failCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'rejectWith': function() {\n    /// <signature>\n    ///   <summary>Reject a Deferred object and call any failCallbacks with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the failCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Array\">An optional array of arguments that are passed to the failCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'resolve': function() {\n    /// <signature>\n    ///   <summary>Resolve a Deferred object and call any doneCallbacks with the given args.</summary>\n    ///   <param name=\"args\" type=\"Object\">Optional arguments that are passed to the doneCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'resolveWith': function() {\n    /// <signature>\n    ///   <summary>Resolve a Deferred object and call any doneCallbacks with the given context and args.</summary>\n    ///   <param name=\"context\" type=\"Object\">Context passed to the doneCallbacks as the this object.</param>\n    ///   <param name=\"args\" type=\"Array\">An optional array of arguments that are passed to the doneCallbacks.</param>\n    ///   <returns type=\"Deferred\" />\n    /// </signature>\n  },\n  'state': function() {\n    /// <summary>Determine the current state of a Deferred object.</summary>\n    /// <returns type=\"String\" />\n  },\n  'then': function() {\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneFilter\" type=\"Function\">A function that is called when the Deferred is resolved.</param>\n    ///   <param name=\"failFilter\" type=\"Function\">An optional function that is called when the Deferred is rejected.</param>\n    ///   <param name=\"progressFilter\" type=\"Function\">An optional function that is called when progress notifications are sent to the Deferred.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is resolved.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is rejected.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add handlers to be called when the Deferred object is resolved, rejected, or still in progress.</summary>\n    ///   <param name=\"doneCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is resolved.</param>\n    ///   <param name=\"failCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred is rejected.</param>\n    ///   <param name=\"progressCallbacks\" type=\"Function\">A function, or array of functions, called when the Deferred notifies progress.</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n});\n\nreturn _object;\n};\nintellisense.redirectDefinition(jQuery.Callbacks, _731531622);\n\nintellisense.annotate(jQuery.Event.prototype, {\n  'currentTarget': function() {\n    /// <summary>The current DOM element within the event bubbling phase.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'data': function() {\n    /// <summary>An optional object of data passed to an event method when the current executing handler is bound.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'delegateTarget': function() {\n    /// <summary>The element where the currently-called jQuery event handler was attached.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'isDefaultPrevented': function() {\n    /// <summary>Returns whether event.preventDefault() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isImmediatePropagationStopped': function() {\n    /// <summary>Returns whether event.stopImmediatePropagation() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'isPropagationStopped': function() {\n    /// <summary>Returns whether event.stopPropagation() was ever called on this event object.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'metaKey': function() {\n    /// <summary>Indicates whether the META key was pressed when the event fired.</summary>\n    /// <returns type=\"Boolean\" />\n  },\n  'namespace': function() {\n    /// <summary>The namespace specified when the event was triggered.</summary>\n    /// <returns type=\"String\" />\n  },\n  'pageX': function() {\n    /// <summary>The mouse position relative to the left edge of the document.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'pageY': function() {\n    /// <summary>The mouse position relative to the top edge of the document.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'preventDefault': function() {\n    /// <summary>If this method is called, the default action of the event will not be triggered.</summary>\n  },\n  'relatedTarget': function() {\n    /// <summary>The other DOM element involved in the event, if any.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'result': function() {\n    /// <summary>The last value returned by an event handler that was triggered by this event, unless the value was undefined.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'stopImmediatePropagation': function() {\n    /// <summary>Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree.</summary>\n  },\n  'stopPropagation': function() {\n    /// <summary>Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event.</summary>\n  },\n  'target': function() {\n    /// <summary>The DOM element that initiated the event.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'timeStamp': function() {\n    /// <summary>The difference in milliseconds between the time the browser created the event and January 1, 1970.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'type': function() {\n    /// <summary>Describes the nature of the event.</summary>\n    /// <returns type=\"String\" />\n  },\n  'which': function() {\n    /// <summary>For key or mouse events, this property indicates the specific key or button that was pressed.</summary>\n    /// <returns type=\"Number\" />\n  },\n});\n\nintellisense.annotate(jQuery.fn, {\n  'add': function() {\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string representing a selector expression to find additional elements to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"elements\" type=\"Array\">One or more elements to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"html\" type=\"String\">An HTML fragment to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"jQuery object \">An existing jQuery object to add to the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add elements to the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string representing a selector expression to find additional elements to add to the set of matched elements.</param>\n    ///   <param name=\"context\" type=\"Element\">The point in the document at which the selector should begin matching; similar to the context argument of the $(selector, context) method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'addBack': function() {\n    /// <signature>\n    ///   <summary>Add the previous set of elements on the stack to the current set, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'addClass': function() {\n    /// <signature>\n    ///   <summary>Adds the specified class(es) to each of the set of matched elements.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more space-separated classes to be added to the class attribute of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Adds the specified class(es) to each of the set of matched elements.</summary>\n    ///   <param name=\"function(index, currentClass)\" type=\"Function\">A function returning one or more space-separated class names to be added to the existing class name(s). Receives the index position of the element in the set and the existing class name(s) as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'after': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, after each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">HTML string, DOM element, or jQuery object to insert after each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, after each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert after each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxComplete': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when Ajax requests complete. This is an AjaxEvent.</summary>\n    ///   <param name=\"handler(event, XMLHttpRequest, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxError': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when Ajax requests complete with an error. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, jqXHR, ajaxSettings, thrownError)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxSend': function() {\n    /// <signature>\n    ///   <summary>Attach a function to be executed before an Ajax request is sent. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, jqXHR, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxStart': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when the first Ajax request begins. This is an Ajax Event.</summary>\n    ///   <param name=\"handler()\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxStop': function() {\n    /// <signature>\n    ///   <summary>Register a handler to be called when all Ajax requests have completed. This is an Ajax Event.</summary>\n    ///   <param name=\"handler()\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'ajaxSuccess': function() {\n    /// <signature>\n    ///   <summary>Attach a function to be executed whenever an Ajax request completes successfully. This is an Ajax Event.</summary>\n    ///   <param name=\"handler(event, XMLHttpRequest, ajaxOptions)\" type=\"Function\">The function to be invoked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'all': function() {\n    /// <summary>Selects all elements.</summary>\n  },\n  'andSelf': function() {\n    /// <summary>Add the previous set of elements on the stack to the current set.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'animate': function() {\n    /// <signature>\n    ///   <summary>Perform a custom animation of a set of CSS properties.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of CSS properties and values that the animation will move toward.</param>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Perform a custom animation of a set of CSS properties.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of CSS properties and values that the animation will move toward.</param>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'animated': function() {\n    /// <summary>Select all elements that are in the progress of an animation at the time the selector is run.</summary>\n  },\n  'append': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the end of each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">DOM element, HTML string, or jQuery object to insert at the end of each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the end of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, html)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert at the end of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'appendTo': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements to the end of the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'attr': function() {\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">The name of the attribute to set.</param>\n    ///   <param name=\"value\" type=\"Number\">A value to set for the attribute.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributes\" type=\"PlainObject\">An object of attribute-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more attributes for the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">The name of the attribute to set.</param>\n    ///   <param name=\"function(index, attr)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old attribute value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'attributeContains': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value containing the a given substring.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeContainsPrefix': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value either equal to a given string or starting with that string followed by a hyphen (-).</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeContainsWord': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value containing a given word, delimited by spaces.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeEndsWith': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value ending exactly with a given string. The comparison is case sensitive.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeEquals': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value exactly equal to a certain value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeHas': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute, with any value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    /// </signature>\n  },\n  'attributeMultiple': function() {\n    /// <signature>\n    ///   <summary>Matches elements that match all of the specified attribute filters.</summary>\n    ///   <param name=\"attributeFilter1\" type=\"String\">An attribute filter.</param>\n    ///   <param name=\"attributeFilter2\" type=\"String\">Another attribute filter, reducing the selection even more</param>\n    ///   <param name=\"attributeFilterN\" type=\"String\">As many more attribute filters as necessary</param>\n    /// </signature>\n  },\n  'attributeNotEqual': function() {\n    /// <signature>\n    ///   <summary>Select elements that either don't have the specified attribute, or do have the specified attribute but not with a certain value.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'attributeStartsWith': function() {\n    /// <signature>\n    ///   <summary>Selects elements that have the specified attribute with a value beginning exactly with a given string.</summary>\n    ///   <param name=\"attribute\" type=\"String\">An attribute name.</param>\n    ///   <param name=\"value\" type=\"String\">An attribute value. Can be either an unquoted single word or a quoted string.</param>\n    /// </signature>\n  },\n  'before': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, before each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">HTML string, DOM element, or jQuery object to insert before each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, before each element in the set of matched elements.</summary>\n    ///   <param name=\"function\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert before each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'bind': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more DOM event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"preventBubble\" type=\"Boolean\">Setting the third argument to false will attach a function that prevents the default action from occurring and stops the event from bubbling. The default is true.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements.</summary>\n    ///   <param name=\"events\" type=\"Object\">An object containing one or more DOM event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'blur': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"blur\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"blur\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'button': function() {\n    /// <summary>Selects all button elements and elements of type button.</summary>\n  },\n  'change': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"change\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"change\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'checkbox': function() {\n    /// <summary>Selects all elements of type checkbox.</summary>\n  },\n  'checked': function() {\n    /// <summary>Matches all elements that are checked.</summary>\n  },\n  'child': function() {\n    /// <signature>\n    ///   <summary>Selects all direct child elements specified by \"child\" of elements specified by \"parent\".</summary>\n    ///   <param name=\"parent\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"child\" type=\"String\">A selector to filter the child elements.</param>\n    /// </signature>\n  },\n  'children': function() {\n    /// <signature>\n    ///   <summary>Get the children of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'class': function() {\n    /// <signature>\n    ///   <summary>Selects all elements with the given class.</summary>\n    ///   <param name=\"class\" type=\"String\">A class to search for. An element can have multiple classes; only one of them must match.</param>\n    /// </signature>\n  },\n  'clearQueue': function() {\n    /// <signature>\n    ///   <summary>Remove from the queue all items that have not yet been run.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'click': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"click\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"click\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'clone': function() {\n    /// <signature>\n    ///   <summary>Create a deep copy of the set of matched elements.</summary>\n    ///   <param name=\"withDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers should be copied along with the elements. As of jQuery 1.4, element data will be copied as well.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Create a deep copy of the set of matched elements.</summary>\n    ///   <param name=\"withDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers and data should be copied along with the elements. The default value is false. *In jQuery 1.5.0 the default value was incorrectly true; it was changed back to false in 1.5.1 and up.</param>\n    ///   <param name=\"deepWithDataAndEvents\" type=\"Boolean\">A Boolean indicating whether event handlers and data for all children of the cloned element should be copied. By default its value matches the first argument's value (which defaults to false).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'closest': function() {\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <param name=\"context\" type=\"Element\">A DOM element within which a matching element may be found. If no context is passed in then the context of the jQuery set will be used instead.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"jQuery object\" type=\"jQuery\">A jQuery object to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>For each element in the set, get the first element that matches the selector by testing the element itself and traversing up through its ancestors in the DOM tree.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'contains': function() {\n    /// <signature>\n    ///   <summary>Select all elements that contain the specified text.</summary>\n    ///   <param name=\"text\" type=\"String\">A string of text to look for. It's case sensitive.</param>\n    /// </signature>\n  },\n  'contents': function() {\n    /// <summary>Get the children of each element in the set of matched elements, including text and comment nodes.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'context': function() {\n    /// <summary>The DOM node context originally passed to jQuery(); if none was passed then context will likely be the document.</summary>\n    /// <returns type=\"Element\" />\n  },\n  'css': function() {\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">A CSS property name.</param>\n    ///   <param name=\"value\" type=\"Number\">A value to set for the property.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">A CSS property name.</param>\n    ///   <param name=\"function(index, value)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more CSS properties for the set of matched elements.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of property-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'data': function() {\n    /// <signature>\n    ///   <summary>Store arbitrary data associated with the matched elements.</summary>\n    ///   <param name=\"key\" type=\"String\">A string naming the piece of data to set.</param>\n    ///   <param name=\"value\" type=\"Object\">The new data value; it can be any Javascript type including Array or Object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Store arbitrary data associated with the matched elements.</summary>\n    ///   <param name=\"obj\" type=\"Object\">An object of key-value pairs of data to update.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'dblclick': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"dblclick\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"dblclick\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'delay': function() {\n    /// <signature>\n    ///   <summary>Set a timer to delay execution of subsequent items in the queue.</summary>\n    ///   <param name=\"duration\" type=\"Number\">An integer indicating the number of milliseconds to delay execution of the next item in the queue.</param>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'delegate': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more space-separated JavaScript event types, such as \"click\" or \"keydown,\" or custom event names.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing one or more space-separated JavaScript event types, such as \"click\" or \"keydown,\" or custom event names.</param>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector to filter the elements that trigger the event.</param>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'dequeue': function() {\n    /// <signature>\n    ///   <summary>Execute the next function on the queue for the matched elements.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'descendant': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are descendants of a given ancestor.</summary>\n    ///   <param name=\"ancestor\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"descendant\" type=\"String\">A selector to filter the descendant elements.</param>\n    /// </signature>\n  },\n  'detach': function() {\n    /// <signature>\n    ///   <summary>Remove the set of matched elements from the DOM.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector expression that filters the set of matched elements to be removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'die': function() {\n    /// <signature>\n    ///   <summary>Remove event handlers previously attached using .live() from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or keydown.</param>\n    ///   <param name=\"handler\" type=\"String\">The function that is no longer to be executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove event handlers previously attached using .live() from the elements.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more event types, such as click or keydown and their corresponding functions that are no longer to be executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'disabled': function() {\n    /// <summary>Selects all elements that are disabled.</summary>\n  },\n  'each': function() {\n    /// <signature>\n    ///   <summary>Iterate over a jQuery object, executing a function for each matched element.</summary>\n    ///   <param name=\"function(index, Element)\" type=\"Function\">A function to execute for each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'element': function() {\n    /// <signature>\n    ///   <summary>Selects all elements with the given tag name.</summary>\n    ///   <param name=\"element\" type=\"String\">An element to search for. Refers to the tagName of DOM nodes.</param>\n    /// </signature>\n  },\n  'empty': function() {\n    /// <summary>Select all elements that have no children (including text nodes).</summary>\n  },\n  'enabled': function() {\n    /// <summary>Selects all elements that are enabled.</summary>\n  },\n  'end': function() {\n    /// <summary>End the most recent filtering operation in the current chain and return the set of matched elements to its previous state.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'eq': function() {\n    /// <signature>\n    ///   <summary>Select the element at index n within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index of the element to match.</param>\n    /// </signature>\n    /// <signature>\n    ///   <summary>Select the element at index n within the matched set.</summary>\n    ///   <param name=\"-index\" type=\"Number\">Zero-based index of the element to match, counting backwards from the last element.</param>\n    /// </signature>\n  },\n  'error': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"error\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"error\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'even': function() {\n    /// <summary>Selects even elements, zero-indexed.  See also odd.</summary>\n  },\n  'fadeIn': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements by fading them to opaque.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeOut': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements by fading them to transparent.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeTo': function() {\n    /// <signature>\n    ///   <summary>Adjust the opacity of the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"Number\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"opacity\" type=\"Number\">A number between 0 and 1 denoting the target opacity.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Adjust the opacity of the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"Number\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"opacity\" type=\"Number\">A number between 0 and 1 denoting the target opacity.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'fadeToggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements by animating their opacity.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements by animating their opacity.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'file': function() {\n    /// <summary>Selects all elements of type file.</summary>\n  },\n  'filter': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for each element in the set. this is the current DOM element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that match the selector or pass the function's test.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'find': function() {\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">A jQuery object to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'finish': function() {\n    /// <signature>\n    ///   <summary>Stop the currently-running animation, remove all queued animations, and complete all animations for the matched elements.</summary>\n    ///   <param name=\"queue\" type=\"String\">The name of the queue in which to stop animations.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'first': function() {\n    /// <summary>Selects the first matched element.</summary>\n  },\n  'first-child': function() {\n    /// <summary>Selects all elements that are the first child of their parent.</summary>\n  },\n  'first-of-type': function() {\n    /// <summary>Selects all elements that are the first among siblings of the same element name.</summary>\n  },\n  'focus': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focus\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focus\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'focusin': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusin\" event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusin\" event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'focusout': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusout\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"focusout\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'get': function() {\n    /// <signature>\n    ///   <summary>Retrieve the DOM elements matched by the jQuery object.</summary>\n    ///   <param name=\"index\" type=\"Number\">A zero-based integer indicating which element to retrieve.</param>\n    ///   <returns type=\"Element, Array\" />\n    /// </signature>\n  },\n  'gt': function() {\n    /// <signature>\n    ///   <summary>Select all elements at an index greater than index within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index.</param>\n    /// </signature>\n  },\n  'has': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element.</summary>\n    ///   <param name=\"contained\" type=\"Element\">A DOM element to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hasClass': function() {\n    /// <signature>\n    ///   <summary>Determine whether any of the matched elements are assigned the given class.</summary>\n    ///   <param name=\"className\" type=\"String\">The class name to search for.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'header': function() {\n    /// <summary>Selects all elements that are headers, like h1, h2, h3 and so on.</summary>\n  },\n  'height': function() {\n    /// <signature>\n    ///   <summary>Set the CSS height of every matched element.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer representing the number of pixels, or an integer with an optional unit of measure appended (as a string).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the CSS height of every matched element.</summary>\n    ///   <param name=\"function(index, height)\" type=\"Function\">A function returning the height to set. Receives the index position of the element in the set and the old height as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hidden': function() {\n    /// <summary>Selects all elements that are hidden.</summary>\n  },\n  'hide': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'hover': function() {\n    /// <signature>\n    ///   <summary>Bind two handlers to the matched elements, to be executed when the mouse pointer enters and leaves the elements.</summary>\n    ///   <param name=\"handlerIn(eventObject)\" type=\"Function\">A function to execute when the mouse pointer enters the element.</param>\n    ///   <param name=\"handlerOut(eventObject)\" type=\"Function\">A function to execute when the mouse pointer leaves the element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'html': function() {\n    /// <signature>\n    ///   <summary>Set the HTML contents of each element in the set of matched elements.</summary>\n    ///   <param name=\"htmlString\" type=\"String\">A string of HTML to set as the content of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the HTML contents of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, oldhtml)\" type=\"Function\">A function returning the HTML content to set. Receives the           index position of the element in the set and the old HTML value as arguments.           jQuery empties the element before calling the function;           use the oldhtml argument to reference the previous content.           Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'id': function() {\n    /// <signature>\n    ///   <summary>Selects a single element with the given id attribute.</summary>\n    ///   <param name=\"id\" type=\"String\">An ID to search for, specified via the id attribute of an element.</param>\n    /// </signature>\n  },\n  'image': function() {\n    /// <summary>Selects all elements of type image.</summary>\n  },\n  'index': function() {\n    /// <signature>\n    ///   <summary>Search for a given element from among the matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector representing a jQuery collection in which to look for an element.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Search for a given element from among the matched elements.</summary>\n    ///   <param name=\"element\" type=\"jQuery\">The DOM element or first element within the jQuery object to look for.</param>\n    ///   <returns type=\"Number\" />\n    /// </signature>\n  },\n  'init': function() {\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression</param>\n    ///   <param name=\"context\" type=\"jQuery\">A DOM Element, Document, or jQuery to use as context</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"elementArray\" type=\"Array\">An array containing a set of DOM elements to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">A plain object to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to clone.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'innerHeight': function() {\n    /// <summary>Get the current computed height for the first element in the set of matched elements, including padding but not border.</summary>\n    /// <returns type=\"Integer\" />\n  },\n  'innerWidth': function() {\n    /// <summary>Get the current computed width for the first element in the set of matched elements, including padding but not border.</summary>\n    /// <returns type=\"Integer\" />\n  },\n  'input': function() {\n    /// <summary>Selects all input, textarea, select and button elements.</summary>\n  },\n  'insertAfter': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements after the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'insertBefore': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements before the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'is': function() {\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for the set of elements. It accepts one argument, index, which is the element's index in the jQuery collection.Within the function, this refers to the current DOM element.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"jQuery object\" type=\"Object\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments.</summary>\n    ///   <param name=\"element\" type=\"Element\">An element to match the current set of elements against.</param>\n    ///   <returns type=\"Boolean\" />\n    /// </signature>\n  },\n  'jquery': function() {\n    /// <summary>A string containing the jQuery version number.</summary>\n    /// <returns type=\"String\" />\n  },\n  'keydown': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keydown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keydown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'keypress': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keypress\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keypress\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'keyup': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keyup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"keyup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'lang': function() {\n    /// <signature>\n    ///   <summary>Selects all elements of the specified language.</summary>\n    ///   <param name=\"language\" type=\"String\">A language code.</param>\n    /// </signature>\n  },\n  'last': function() {\n    /// <summary>Selects the last matched element.</summary>\n  },\n  'last-child': function() {\n    /// <summary>Selects all elements that are the last child of their parent.</summary>\n  },\n  'last-of-type': function() {\n    /// <summary>Selects all elements that are the last among siblings of the same element name.</summary>\n  },\n  'length': function() {\n    /// <summary>The number of elements in the jQuery object.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'live': function() {\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown.\" As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown.\" As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler for all elements which match the current selector, now and in the future.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">A plain object of one or more JavaScript event types and functions to execute for them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'load': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"load\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"load\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'lt': function() {\n    /// <signature>\n    ///   <summary>Select all elements at an index less than index within the matched set.</summary>\n    ///   <param name=\"index\" type=\"Number\">Zero-based index.</param>\n    /// </signature>\n  },\n  'map': function() {\n    /// <signature>\n    ///   <summary>Pass each element in the current matched set through a function, producing a new jQuery object containing the return values.</summary>\n    ///   <param name=\"callback(index, domElement)\" type=\"Function\">A function object that will be invoked for each element in the current set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mousedown': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousedown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousedown\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseenter': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseleave': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mousemove': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousemove\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mousemove\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseout': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseout\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseout\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseover': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseover\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseover\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'mouseup': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"mouseup\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'multiple': function() {\n    /// <signature>\n    ///   <summary>Selects the combined results of all the specified selectors.</summary>\n    ///   <param name=\"selector1\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"selector2\" type=\"String\">Another valid selector.</param>\n    ///   <param name=\"selectorN\" type=\"String\">As many more valid selectors as you like.</param>\n    /// </signature>\n  },\n  'next': function() {\n    /// <signature>\n    ///   <summary>Get the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'next adjacent': function() {\n    /// <signature>\n    ///   <summary>Selects all next elements matching \"next\" that are immediately preceded by a sibling \"prev\".</summary>\n    ///   <param name=\"prev\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"next\" type=\"String\">A selector to match the element that is next to the first selector.</param>\n    /// </signature>\n  },\n  'next siblings': function() {\n    /// <signature>\n    ///   <summary>Selects all sibling elements that follow after the \"prev\" element, have the same parent, and match the filtering \"siblings\" selector.</summary>\n    ///   <param name=\"prev\" type=\"String\">Any valid selector.</param>\n    ///   <param name=\"siblings\" type=\"String\">A selector to filter elements that are the following siblings of the first selector.</param>\n    /// </signature>\n  },\n  'nextAll': function() {\n    /// <signature>\n    ///   <summary>Get all following siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'nextUntil': function() {\n    /// <signature>\n    ///   <summary>Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching following sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching following sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'not': function() {\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"elements\" type=\"Array\">One or more DOM elements to remove from the matched set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A function used as a test for each element in the set. this is the current DOM element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove elements from the set of matched elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to match the current set of elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'nth-child': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-child(even), :nth-child(4n) )</param>\n    /// </signature>\n  },\n  'nth-last-child': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent, counting from the last element to the first.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) )</param>\n    /// </signature>\n  },\n  'nth-last-of-type': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth-child of their parent, counting from the last element to the first.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with the last one (1), the string even or odd, or an equation ( eg. :nth-last-of-type(even), :nth-last-of-type(4n) )</param>\n    /// </signature>\n  },\n  'nth-of-type': function() {\n    /// <signature>\n    ///   <summary>Selects all elements that are the nth child of their parent in relation to siblings with the same element name.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-of-type(even), :nth-of-type(4n) )</param>\n    /// </signature>\n  },\n  'odd': function() {\n    /// <summary>Selects odd elements, zero-indexed.  See also even.</summary>\n  },\n  'off': function() {\n    /// <signature>\n    ///   <summary>Remove an event handler.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, or just namespaces, such as \"click\", \"keydown.myPlugin\", or \".myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector which should match the one originally passed to .on() when attaching event handlers.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A handler function previously attached for the event(s), or the special value false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove an event handler.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object where the string keys represent one or more space-separated event types and optional namespaces, and the values represent handler functions previously attached for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector which should match the one originally passed to .on() when attaching event handlers.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'offset': function() {\n    /// <signature>\n    ///   <summary>Set the current coordinates of every element in the set of matched elements, relative to the document.</summary>\n    ///   <param name=\"coordinates\" type=\"PlainObject\">An object containing the properties top and left, which are integers indicating the new top and left coordinates for the elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the current coordinates of every element in the set of matched elements, relative to the document.</summary>\n    ///   <param name=\"function(index, coords)\" type=\"Function\">A function to return the coordinates to set. Receives the index of the element in the collection as the first argument and the current coordinates as the second argument. The function should return an object with the new top and left properties.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'offsetParent': function() {\n    /// <summary>Get the closest ancestor element that is positioned.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'on': function() {\n    /// <signature>\n    ///   <summary>Attach an event handler function for one or more events to the selected elements.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event is triggered.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach an event handler function for one or more events to the selected elements.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event occurs.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'one': function() {\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"String\">A string containing one or more JavaScript event types, such as \"click\" or \"submit,\" or custom event names.</param>\n    ///   <param name=\"data\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"String\">One or more space-separated event types and optional namespaces, such as \"click\" or \"keydown.myPlugin\".</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event is triggered.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Attach a handler to an event for the elements. The handler is executed at most once per element.</summary>\n    ///   <param name=\"events\" type=\"PlainObject\">An object in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s).</param>\n    ///   <param name=\"selector\" type=\"String\">A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element.</param>\n    ///   <param name=\"data\" type=\"Anything\">Data to be passed to the handler in event.data when an event occurs.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'only-child': function() {\n    /// <summary>Selects all elements that are the only child of their parent.</summary>\n  },\n  'only-of-type': function() {\n    /// <summary>Selects all elements that have no siblings with the same element name.</summary>\n  },\n  'outerHeight': function() {\n    /// <signature>\n    ///   <summary>Get the current computed height for the first element in the set of matched elements, including padding, border, and optionally margin. Returns an integer (without \"px\") representation of the value or null if called on an empty set of elements.</summary>\n    ///   <param name=\"includeMargin\" type=\"Boolean\">A Boolean indicating whether to include the element's margin in the calculation.</param>\n    ///   <returns type=\"Integer\" />\n    /// </signature>\n  },\n  'outerWidth': function() {\n    /// <signature>\n    ///   <summary>Get the current computed width for the first element in the set of matched elements, including padding and border.</summary>\n    ///   <param name=\"includeMargin\" type=\"Boolean\">A Boolean indicating whether to include the element's margin in the calculation.</param>\n    ///   <returns type=\"Integer\" />\n    /// </signature>\n  },\n  'parent': function() {\n    /// <signature>\n    ///   <summary>Get the parent of each element in the current set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'parents': function() {\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'parentsUntil': function() {\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching ancestor elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching ancestor elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'password': function() {\n    /// <summary>Selects all elements of type password.</summary>\n  },\n  'position': function() {\n    /// <summary>Get the current coordinates of the first element in the set of matched elements, relative to the offset parent.</summary>\n    /// <returns type=\"Object\" />\n  },\n  'prepend': function() {\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.</summary>\n    ///   <param name=\"content\" type=\"jQuery\">DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements.</param>\n    ///   <param name=\"content\" type=\"jQuery\">One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Insert content, specified by the parameter, to the beginning of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, html)\" type=\"Function\">A function that returns an HTML string, DOM element(s), or jQuery object to insert at the beginning of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prependTo': function() {\n    /// <signature>\n    ///   <summary>Insert every element in the set of matched elements to the beginning of the target.</summary>\n    ///   <param name=\"target\" type=\"jQuery\">A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the beginning of the element(s) specified by this parameter.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prev': function() {\n    /// <signature>\n    ///   <summary>Get the immediately preceding sibling of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prevAll': function() {\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'prevUntil': function() {\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to indicate where to stop matching preceding sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM node or jQuery object indicating where to stop matching preceding sibling elements.</param>\n    ///   <param name=\"filter\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'promise': function() {\n    /// <signature>\n    ///   <summary>Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished.</summary>\n    ///   <param name=\"type\" type=\"String\">The type of queue that needs to be observed.</param>\n    ///   <param name=\"target\" type=\"PlainObject\">Object onto which the promise methods have to be attached</param>\n    ///   <returns type=\"Promise\" />\n    /// </signature>\n  },\n  'prop': function() {\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to set.</param>\n    ///   <param name=\"value\" type=\"Boolean\">A value to set for the property.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"properties\" type=\"PlainObject\">An object of property-value pairs to set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set one or more properties for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to set.</param>\n    ///   <param name=\"function(index, oldPropertyValue)\" type=\"Function\">A function returning the value to set. Receives the index position of the element in the set and the old property value as arguments. Within the function, the keyword this refers to the current element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'pushStack': function() {\n    /// <signature>\n    ///   <summary>Add a collection of DOM elements onto the jQuery stack.</summary>\n    ///   <param name=\"elements\" type=\"Array\">An array of elements to push onto the stack and make into a new jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add a collection of DOM elements onto the jQuery stack.</summary>\n    ///   <param name=\"elements\" type=\"Array\">An array of elements to push onto the stack and make into a new jQuery object.</param>\n    ///   <param name=\"name\" type=\"String\">The name of a jQuery method that generated the array of elements.</param>\n    ///   <param name=\"arguments\" type=\"Array\">The arguments that were passed in to the jQuery method (for serialization).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'queue': function() {\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed, once for each matched element.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"newQueue\" type=\"Array\">An array of functions to replace the current queue contents.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Manipulate the queue of functions to be executed, once for each matched element.</summary>\n    ///   <param name=\"queueName\" type=\"String\">A string containing the name of the queue. Defaults to fx, the standard effects queue.</param>\n    ///   <param name=\"callback( next )\" type=\"Function\">The new function to add to the queue, with a function to call that will dequeue the next item.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'radio': function() {\n    /// <summary>Selects all  elements of type radio.</summary>\n  },\n  'ready': function() {\n    /// <signature>\n    ///   <summary>Specify a function to execute when the DOM is fully loaded.</summary>\n    ///   <param name=\"handler\" type=\"Function\">A function to execute after the DOM is ready.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'remove': function() {\n    /// <signature>\n    ///   <summary>Remove the set of matched elements from the DOM.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector expression that filters the set of matched elements to be removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeAttr': function() {\n    /// <signature>\n    ///   <summary>Remove an attribute from each element in the set of matched elements.</summary>\n    ///   <param name=\"attributeName\" type=\"String\">An attribute to remove; as of version 1.7, it can be a space-separated list of attributes.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeClass': function() {\n    /// <signature>\n    ///   <summary>Remove a single class, multiple classes, or all classes from each element in the set of matched elements.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more space-separated classes to be removed from the class attribute of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a single class, multiple classes, or all classes from each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, class)\" type=\"Function\">A function returning one or more space-separated class names to be removed. Receives the index position of the element in the set and the old class value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeData': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"name\" type=\"String\">A string naming the piece of data to delete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-stored piece of data.</summary>\n    ///   <param name=\"list\" type=\"String\">An array or space-separated string naming the pieces of data to delete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'removeProp': function() {\n    /// <signature>\n    ///   <summary>Remove a property for the set of matched elements.</summary>\n    ///   <param name=\"propertyName\" type=\"String\">The name of the property to remove.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'replaceAll': function() {\n    /// <signature>\n    ///   <summary>Replace each target element with the set of matched elements.</summary>\n    ///   <param name=\"target\" type=\"String\">A selector expression indicating which element(s) to replace.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'replaceWith': function() {\n    /// <signature>\n    ///   <summary>Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.</summary>\n    ///   <param name=\"newContent\" type=\"jQuery\">The content to insert. May be an HTML string, DOM element, or jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Replace each element in the set of matched elements with the provided new content and return the set of elements that was removed.</summary>\n    ///   <param name=\"function\" type=\"Function\">A function that returns content with which to replace the set of matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'reset': function() {\n    /// <summary>Selects all elements of type reset.</summary>\n  },\n  'resize': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"resize\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"resize\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'root': function() {\n    /// <signature>\n    ///   <summary>Selects the element that is the root of the document.</summary>\n    ///   <param name=\"index\" type=\"String\">The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-last-child(even), :nth-last-child(4n) )</param>\n    /// </signature>\n  },\n  'scroll': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"scroll\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"scroll\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'scrollLeft': function() {\n    /// <signature>\n    ///   <summary>Set the current horizontal position of the scroll bar for each of the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer indicating the new position to set the scroll bar to.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'scrollTop': function() {\n    /// <signature>\n    ///   <summary>Set the current vertical position of the scroll bar for each of the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer indicating the new position to set the scroll bar to.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'select': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"select\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"select\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'selected': function() {\n    /// <summary>Selects all elements that are selected.</summary>\n  },\n  'selector': function() {\n    /// <summary>A selector representing selector originally passed to jQuery().</summary>\n    /// <returns type=\"String\" />\n  },\n  'serialize': function() {\n    /// <summary>Encode a set of form elements as a string for submission.</summary>\n    /// <returns type=\"String\" />\n  },\n  'serializeArray': function() {\n    /// <summary>Encode a set of form elements as an array of names and values.</summary>\n    /// <returns type=\"Array\" />\n  },\n  'show': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'siblings': function() {\n    /// <signature>\n    ///   <summary>Get the siblings of each element in the set of matched elements, optionally filtered by a selector.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression to match elements against.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'size': function() {\n    /// <summary>Return the number of elements in the jQuery object.</summary>\n    /// <returns type=\"Number\" />\n  },\n  'slice': function() {\n    /// <signature>\n    ///   <summary>Reduce the set of matched elements to a subset specified by a range of indices.</summary>\n    ///   <param name=\"start\" type=\"Number\">An integer indicating the 0-based position at which the elements begin to be selected. If negative, it indicates an offset from the end of the set.</param>\n    ///   <param name=\"end\" type=\"Number\">An integer indicating the 0-based position at which the elements stop being selected. If negative, it indicates an offset from the end of the set. If omitted, the range continues until the end of the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideDown': function() {\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideToggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'slideUp': function() {\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Hide the matched elements with a sliding motion.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'stop': function() {\n    /// <signature>\n    ///   <summary>Stop the currently-running animation on the matched elements.</summary>\n    ///   <param name=\"clearQueue\" type=\"Boolean\">A Boolean indicating whether to remove queued animation as well. Defaults to false.</param>\n    ///   <param name=\"jumpToEnd\" type=\"Boolean\">A Boolean indicating whether to complete the current animation immediately. Defaults to false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Stop the currently-running animation on the matched elements.</summary>\n    ///   <param name=\"queue\" type=\"String\">The name of the queue in which to stop animations.</param>\n    ///   <param name=\"clearQueue\" type=\"Boolean\">A Boolean indicating whether to remove queued animation as well. Defaults to false.</param>\n    ///   <param name=\"jumpToEnd\" type=\"Boolean\">A Boolean indicating whether to complete the current animation immediately. Defaults to false.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'submit': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"submit\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"submit\" JavaScript event, or trigger that event on an element.</summary>\n    ///   <param name=\"eventData\" type=\"PlainObject\">An object containing data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'target': function() {\n    /// <summary>Selects the target element indicated by the fragment identifier of the document's URI.</summary>\n  },\n  'text': function() {\n    /// <signature>\n    ///   <summary>Set the content of each element in the set of matched elements to the specified text.</summary>\n    ///   <param name=\"textString\" type=\"String\">A string of text to set as the content of each matched element.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the content of each element in the set of matched elements to the specified text.</summary>\n    ///   <param name=\"function(index, text)\" type=\"Function\">A function returning the text content to set. Receives the index position of the element in the set and the old text value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'toArray': function() {\n    /// <summary>Retrieve all the DOM elements contained in the jQuery set, as an array.</summary>\n    /// <returns type=\"Array\" />\n  },\n  'toggle': function() {\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"options\" type=\"PlainObject\">A map of additional options to pass to the method.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"duration\" type=\"\">A string or number determining how long the animation will run.</param>\n    ///   <param name=\"easing\" type=\"String\">A string indicating which easing function to use for the transition.</param>\n    ///   <param name=\"complete\" type=\"Function\">A function to call once the animation is complete.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Display or hide the matched elements.</summary>\n    ///   <param name=\"showOrHide\" type=\"Boolean\">A Boolean indicating whether to show or hide the elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'toggleClass': function() {\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more class names (separated by spaces) to be toggled for each element in the matched set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"className\" type=\"String\">One or more class names (separated by spaces) to be toggled for each element in the matched set.</param>\n    ///   <param name=\"switch\" type=\"Boolean\">A Boolean (not just truthy/falsy) value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"switch\" type=\"Boolean\">A boolean value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument.</summary>\n    ///   <param name=\"function(index, class, switch)\" type=\"Function\">A function that returns class names to be toggled in the class attribute of each element in the matched set. Receives the index position of the element in the set, the old class value, and the switch as arguments.</param>\n    ///   <param name=\"switch\" type=\"Boolean\">A boolean value to determine whether the class should be added or removed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'trigger': function() {\n    /// <signature>\n    ///   <summary>Execute all handlers and behaviors attached to the matched elements for the given event type.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"extraParameters\" type=\"PlainObject\">Additional parameters to pass along to the event handler.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Execute all handlers and behaviors attached to the matched elements for the given event type.</summary>\n    ///   <param name=\"event\" type=\"Event\">A jQuery.Event object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'triggerHandler': function() {\n    /// <signature>\n    ///   <summary>Execute all handlers attached to an element for an event.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"extraParameters\" type=\"Array\">An array of additional parameters to pass along to the event handler.</param>\n    ///   <returns type=\"Object\" />\n    /// </signature>\n  },\n  'unbind': function() {\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">The function that is to be no longer executed.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as click or submit.</param>\n    ///   <param name=\"false\" type=\"Boolean\">Unbinds the corresponding 'return false' function that was bound using .bind( eventType, false ).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a previously-attached event handler from the elements.</summary>\n    ///   <param name=\"event\" type=\"Object\">A JavaScript event object as passed to an event handler.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'undelegate': function() {\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown\"</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"eventType\" type=\"String\">A string containing a JavaScript event type, such as \"click\" or \"keydown\"</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute at the time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A selector which will be used to filter the event results.</param>\n    ///   <param name=\"events\" type=\"PlainObject\">An object of one or more event types and previously bound functions to unbind from them.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements.</summary>\n    ///   <param name=\"namespace\" type=\"String\">A string containing a namespace to unbind all events from.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'unload': function() {\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"unload\" JavaScript event.</summary>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute when the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Bind an event handler to the \"unload\" JavaScript event.</summary>\n    ///   <param name=\"eventData\" type=\"Object\">A plain object of data that will be passed to the event handler.</param>\n    ///   <param name=\"handler(eventObject)\" type=\"Function\">A function to execute each time the event is triggered.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'unwrap': function() {\n    /// <summary>Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place.</summary>\n    /// <returns type=\"jQuery\" />\n  },\n  'val': function() {\n    /// <signature>\n    ///   <summary>Set the value of each element in the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Array\">A string of text or an array of strings corresponding to the value of each matched element to set as selected/checked.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the value of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, value)\" type=\"Function\">A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'visible': function() {\n    /// <summary>Selects all elements that are visible.</summary>\n  },\n  'width': function() {\n    /// <signature>\n    ///   <summary>Set the CSS width of each element in the set of matched elements.</summary>\n    ///   <param name=\"value\" type=\"Number\">An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string).</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Set the CSS width of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index, width)\" type=\"Function\">A function returning the width to set. Receives the index position of the element in the set and the old width as arguments. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrap': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around each element in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"jQuery\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A callback function returning the HTML content or jQuery object to wrap around the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrapAll': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around all elements in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"jQuery\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n  'wrapInner': function() {\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around the content of each element in the set of matched elements.</summary>\n    ///   <param name=\"wrappingElement\" type=\"String\">An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the content of the matched elements.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Wrap an HTML structure around the content of each element in the set of matched elements.</summary>\n    ///   <param name=\"function(index)\" type=\"Function\">A callback function which generates a structure to wrap around the content of the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n});\n\nintellisense.annotate(window, {\n  '$': function() {\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"selector\" type=\"String\">A string containing a selector expression</param>\n    ///   <param name=\"context\" type=\"jQuery\">A DOM Element, Document, or jQuery to use as context</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"element\" type=\"Element\">A DOM element to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"elementArray\" type=\"Array\">An array containing a set of DOM elements to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"object\" type=\"PlainObject\">A plain object to wrap in a jQuery object.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n    /// <signature>\n    ///   <summary>Accepts a string containing a CSS selector which is then used to match a set of elements.</summary>\n    ///   <param name=\"jQuery object\" type=\"PlainObject\">An existing jQuery object to clone.</param>\n    ///   <returns type=\"jQuery\" />\n    /// </signature>\n  },\n});\n\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Scripts/jquery-1.10.2.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * jQuery JavaScript Library v1.10.2\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03T13:48Z\n */\n(function( window, undefined ) {\n\n// Can't do this because several apps including ASP.NET trace\n// the stack via arguments.caller.callee and Firefox dies if\n// you try to trace through \"use strict\" call chains. (#13335)\n// Support: Firefox 18+\n//\"use strict\";\nvar\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// Support: IE<10\n\t// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`\n\tcore_strundefined = typeof undefined,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tlocation = window.location,\n\tdocument = window.document,\n\tdocElem = document.documentElement,\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$,\n\n\t// [[Class]] -> type pairs\n\tclass2type = {},\n\n\t// List of deleted data cache ids, so we can reuse them\n\tcore_deletedIds = [],\n\n\tcore_version = \"1.10.2\",\n\n\t// Save a reference to some core methods\n\tcore_concat = core_deletedIds.concat,\n\tcore_push = core_deletedIds.push,\n\tcore_slice = core_deletedIds.slice,\n\tcore_indexOf = core_deletedIds.indexOf,\n\tcore_toString = class2type.toString,\n\tcore_hasOwn = class2type.hasOwnProperty,\n\tcore_trim = core_version.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,\n\n\t// Used for splitting on whitespace\n\tcore_rnotwhite = /\\S+/g,\n\n\t// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\n\n\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\n\n\t// JSON RegExp\n\trvalidchars = /^[\\],:{}\\s]*$/,\n\trvalidbraces = /(?:^|:|,)(?:\\s*\\[)+/g,\n\trvalidescape = /\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,\n\trvalidtokens = /\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,\n\n\t// Matches dashed string for camelizing\n\trmsPrefix = /^-ms-/,\n\trdashAlpha = /-([\\da-z])/gi,\n\n\t// Used by jQuery.camelCase as callback to replace()\n\tfcamelCase = function( all, letter ) {\n\t\treturn letter.toUpperCase();\n\t},\n\n\t// The ready event handler\n\tcompleted = function( event ) {\n\n\t\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\n\t\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\n\t\t\tdetach();\n\t\t\tjQuery.ready();\n\t\t}\n\t},\n\t// Clean-up method for dom ready events\n\tdetach = function() {\n\t\tif ( document.addEventListener ) {\n\t\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\t\twindow.removeEventListener( \"load\", completed, false );\n\n\t\t} else {\n\t\t\tdocument.detachEvent( \"onreadystatechange\", completed );\n\t\t\twindow.detachEvent( \"onload\", completed );\n\t\t}\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: core_version,\n\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && (match[1] || !context) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[1] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\n\n\t\t\t\t\t// scripts is true for back-compat\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[2] );\n\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t\tthis[0] = elem;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.context = document;\n\t\t\t\t\tthis.selector = selector;\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis.context = this[0] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( jQuery.isFunction( selector ) ) {\n\t\t\treturn rootjQuery.ready( selector );\n\t\t}\n\n\t\tif ( selector.selector !== undefined ) {\n\t\t\tthis.selector = selector.selector;\n\t\t\tthis.context = selector.context;\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t},\n\n\t// Start with an empty selector\n\tselector: \"\",\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn core_slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\t\treturn num == null ?\n\n\t\t\t// Return a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\t\tret.context = this.context;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t}));\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar src, copyIsArray, copy, name, options, clone,\n\t\ttarget = arguments[0] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\n\t\ttarget = {};\n\t}\n\n\t// extend jQuery itself if only one argument is passed\n\tif ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend({\n\t// Unique for each copy of jQuery on the page\n\t// Non-digits removed to match rinlinejQuery\n\texpando: \"jQuery\" + ( core_version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Hold (or release) the ready event\n\tholdReady: function( hold ) {\n\t\tif ( hold ) {\n\t\t\tjQuery.readyWait++;\n\t\t} else {\n\t\t\tjQuery.ready( true );\n\t\t}\n\t},\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\n\t\tif ( !document.body ) {\n\t\t\treturn setTimeout( jQuery.ready );\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\n\t\t// Trigger any bound ready events\n\t\tif ( jQuery.fn.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\n\n\t// See test/unit/core.js for details concerning isFunction.\n\t// Since version 1.3, DOM methods and functions like alert\n\t// aren't supported. They return false on IE (#2968).\n\tisFunction: function( obj ) {\n\t\treturn jQuery.type(obj) === \"function\";\n\t},\n\n\tisArray: Array.isArray || function( obj ) {\n\t\treturn jQuery.type(obj) === \"array\";\n\t},\n\n\tisWindow: function( obj ) {\n\t\t/* jshint eqeqeq: false */\n\t\treturn obj != null && obj == obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn String( obj );\n\t\t}\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\tvar key;\n\n\t\t// Must be an Object.\n\t\t// Because of IE, we also have to check the presence of the constructor property.\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\t// Not own constructor property must be Object\n\t\t\tif ( obj.constructor &&\n\t\t\t\t!core_hasOwn.call(obj, \"constructor\") &&\n\t\t\t\t!core_hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Handle iteration over inherited properties before own properties.\n\t\tif ( jQuery.support.ownLast ) {\n\t\t\tfor ( key in obj ) {\n\t\t\t\treturn core_hasOwn.call( obj, key );\n\t\t\t}\n\t\t}\n\n\t\t// Own properties are enumerated firstly, so to speed up,\n\t\t// if last one is own, then all properties are own.\n\t\tfor ( key in obj ) {}\n\n\t\treturn key === undefined || core_hasOwn.call( obj, key );\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// keepScripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, keepScripts ) {\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tkeepScripts = context;\n\t\t\tcontext = false;\n\t\t}\n\t\tcontext = context || document;\n\n\t\tvar parsed = rsingleTag.exec( data ),\n\t\t\tscripts = !keepScripts && [];\n\n\t\t// Single tag\n\t\tif ( parsed ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\t\tif ( scripts ) {\n\t\t\tjQuery( scripts ).remove();\n\t\t}\n\t\treturn jQuery.merge( [], parsed.childNodes );\n\t},\n\n\tparseJSON: function( data ) {\n\t\t// Attempt to parse using the native JSON parser first\n\t\tif ( window.JSON && window.JSON.parse ) {\n\t\t\treturn window.JSON.parse( data );\n\t\t}\n\n\t\tif ( data === null ) {\n\t\t\treturn data;\n\t\t}\n\n\t\tif ( typeof data === \"string\" ) {\n\n\t\t\t// Make sure leading/trailing whitespace is removed (IE can't handle it)\n\t\t\tdata = jQuery.trim( data );\n\n\t\t\tif ( data ) {\n\t\t\t\t// Make sure the incoming data is actual JSON\n\t\t\t\t// Logic borrowed from http://json.org/json2.js\n\t\t\t\tif ( rvalidchars.test( data.replace( rvalidescape, \"@\" )\n\t\t\t\t\t.replace( rvalidtokens, \"]\" )\n\t\t\t\t\t.replace( rvalidbraces, \"\")) ) {\n\n\t\t\t\t\treturn ( new Function( \"return \" + data ) )();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tjQuery.error( \"Invalid JSON: \" + data );\n\t},\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\ttry {\n\t\t\tif ( window.DOMParser ) { // Standard\n\t\t\t\ttmp = new DOMParser();\n\t\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t\t} else { // IE\n\t\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\n\t\t\t\txml.async = \"false\";\n\t\t\t\txml.loadXML( data );\n\t\t\t}\n\t\t} catch( e ) {\n\t\t\txml = undefined;\n\t\t}\n\t\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\t// Workarounds based on findings by Jim Driscoll\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\n\tglobalEval: function( data ) {\n\t\tif ( data && jQuery.trim( data ) ) {\n\t\t\t// We use execScript on Internet Explorer\n\t\t\t// We use an anonymous function so that context is window\n\t\t\t// rather than jQuery in Firefox\n\t\t\t( window.execScript || function( data ) {\n\t\t\t\twindow[ \"eval\" ].call( window, data );\n\t\t\t} )( data );\n\t\t}\n\t},\n\n\t// Convert dashed to camelCase; used by the css and data modules\n\t// Microsoft forgot to hump their vendor prefix (#9572)\n\tcamelCase: function( string ) {\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n\t},\n\n\tnodeName: function( elem, name ) {\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\t},\n\n\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Use native String.trim function wherever possible\n\ttrim: core_trim && !core_trim.call(\"\\uFEFF\\xA0\") ?\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\tcore_trim.call( text );\n\t\t} :\n\n\t\t// Otherwise use our own trimming functionality\n\t\tfunction( text ) {\n\t\t\treturn text == null ?\n\t\t\t\t\"\" :\n\t\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArraylike( Object(arr) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcore_push.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\tvar len;\n\n\t\tif ( arr ) {\n\t\t\tif ( core_indexOf ) {\n\t\t\t\treturn core_indexOf.call( arr, elem, i );\n\t\t\t}\n\n\t\t\tlen = arr.length;\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t// Skip accessing in sparse arrays\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\n\t\t\t\t\treturn i;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\t\t} else {\n\t\t\twhile ( second[j] !== undefined ) {\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\n\t\t\t}\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn core_concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// Bind a function to a context, optionally partially applying any\n\t// arguments.\n\tproxy: function( fn, context ) {\n\t\tvar args, proxy, tmp;\n\n\t\tif ( typeof context === \"string\" ) {\n\t\t\ttmp = fn[ context ];\n\t\t\tcontext = fn;\n\t\t\tfn = tmp;\n\t\t}\n\n\t\t// Quick check to determine if target is callable, in the spec\n\t\t// this throws a TypeError, but we will just return undefined.\n\t\tif ( !jQuery.isFunction( fn ) ) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\t// Simulated bind\n\t\targs = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );\n\t\t};\n\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\t\treturn proxy;\n\t},\n\n\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\t\tvar i = 0,\n\t\t\tlength = elems.length,\n\t\t\tbulk = key == null;\n\n\t\t// Sets many values\n\t\tif ( jQuery.type( key ) === \"object\" ) {\n\t\t\tchainable = true;\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t\t}\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\tchainable = true;\n\n\t\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\t\traw = true;\n\t\t\t}\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations run against the entire set\n\t\t\t\tif ( raw ) {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\n\t\t\t\t// ...except when executing function values\n\t\t\t\t} else {\n\t\t\t\t\tbulk = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: function() {\n\t\treturn ( new Date() ).getTime();\n\t},\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations.\n\t// Note: this method belongs to the css module but it's needed here for the support module.\n\t// If support gets modularized, this method should be moved back to the css module.\n\tswap: function( elem, options, callback, args ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.apply( elem, args || [] );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\n\t}\n});\n\njQuery.ready.promise = function( obj ) {\n\tif ( !readyList ) {\n\n\t\treadyList = jQuery.Deferred();\n\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t// Standards-based browsers support DOMContentLoaded\n\t\t} else if ( document.addEventListener ) {\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\n\t\t// If IE event model is used\n\t\t} else {\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.attachEvent( \"onload\", completed );\n\n\t\t\t// If IE and not a frame\n\t\t\t// continually check to see if the document is ready\n\t\t\tvar top = false;\n\n\t\t\ttry {\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\n\t\t\t} catch(e) {}\n\n\t\t\tif ( top && top.doScroll ) {\n\t\t\t\t(function doScrollCheck() {\n\t\t\t\t\tif ( !jQuery.isReady ) {\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\n\t\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// detach all dom ready events\n\t\t\t\t\t\tdetach();\n\n\t\t\t\t\t\t// and execute any waiting functions\n\t\t\t\t\t\tjQuery.ready();\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || type !== \"function\" &&\n\t\t( length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj );\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n/*!\n * Sizzle CSS Selector Engine v1.10.2\n * http://sizzlejs.com/\n *\n * Copyright 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03\n */\n(function( window, undefined ) {\n\nvar i,\n\tsupport,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\tsortInput,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\n\tMAX_NEGATIVE = 1 << 31,\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:([*^$|!~]?=)\" + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t//   then not containing pseudos/brackets,\n\t//   then attribute selectors/non-parenthetical expressions,\n\t//   then anything else\n\t// These preferences are here to reduce the number of selectors\n\t//   needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trsibling = new RegExp( whitespace + \"*[+~]\" ),\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trescape = /'|\\\\/g,\n\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t};\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\t\tif ( elem && elem.parentNode ) {\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key += \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created div and expects a boolean result\n */\nfunction assert( fn ) {\n\tvar div = document.createElement(\"div\");\n\n\ttry {\n\t\treturn !!fn( div );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( div.parentNode ) {\n\t\t\tdiv.parentNode.removeChild( div );\n\t\t}\n\t\t// release memory in IE\n\t\tdiv = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = attrs.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Detect xml\n * @param {Element|Object} elem An element or a document\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar doc = node ? node.ownerDocument || node : preferredDoc,\n\t\tparent = doc.defaultView;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent.attachEvent && parent !== parent.top ) {\n\t\tparent.attachEvent( \"onbeforeunload\", function() {\n\t\t\tsetDocument();\n\t\t});\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)\n\tsupport.attributes = assert(function( div ) {\n\t\tdiv.className = \"i\";\n\t\treturn !div.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( div ) {\n\t\tdiv.appendChild( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\tdiv.innerHTML = \"<div class='a'></div><div class='a i'></div>\";\n\n\t\t// Support: Safari<4\n\t\t// Catch class over-caching\n\t\tdiv.firstChild.className = \"i\";\n\t\t// Support: Opera<10\n\t\t// Catch gEBCN failure to find non-leading classes\n\t\treturn div.getElementsByClassName(\"i\").length === 2;\n\t});\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( div ) {\n\t\tdocElem.appendChild( div ).id = expando;\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\n\t});\n\n\t// ID find and filter\n\tif ( support.getById ) {\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [m] : [];\n\t\t\t}\n\t\t};\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t} else {\n\t\t// Support: IE6/7\n\t\t// getElementById is not reliable as a find shortcut\n\t\tdelete Expr.find[\"ID\"];\n\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See http://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( div ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// http://bugs.jquery.com/ticket/12359\n\t\t\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Support: Opera 10-12/IE8\n\t\t\t// ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type attribute is restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"t\", \"\" );\n\n\t\t\tif ( div.querySelectorAll(\"[t^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tdiv.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( div ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( div, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = docElem.compareDocumentPosition ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn doc;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch(e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val === undefined ?\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull :\n\t\tval;\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\tfor ( ; (node = elem[i]); i++ ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (see #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[5] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] && match[4] !== undefined ) {\n\t\t\t\tmatch[2] = match[4];\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": function( elem ) {\n\t\t\treturn elem.disabled === false;\n\t\t},\n\n\t\t\"disabled\": function( elem ) {\n\t\t\treturn elem.disabled === true;\n\t\t},\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\nfunction tokenize( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( tokens = [] );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n}\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tcheckNonElements = base && dir === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t\tcachedruns = ++matcherCachedRuns;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\t}\n\treturn cached;\n};\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\n\t);\n\treturn results;\n}\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome<14\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( div1 ) {\n\t// Should return 1, but returns 4 (following)\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( div ) {\n\tdiv.innerHTML = \"<a href='#'></a>\";\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( div ) {\n\tdiv.innerHTML = \"<input/>\";\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( div ) {\n\treturn div.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn (val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\telem[ name ] === true ? name.toLowerCase() : null;\n\t\t}\n\t});\n}\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t});\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\t\t// Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\n\t\t\t\t\t(function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t})( arguments );\n\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\n\t\t\t\tif ( !memory ) {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\t\t\t\t// action, add listener, listener list, final state\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\t\t\t\t\tvar action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t}).promise();\n\t\t\t\t},\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Keep pipe for back-compat\n\t\tpromise.pipe = promise.then;\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 3 ];\n\n\t\t\t// promise[ done | fail | progress ] = list.add\n\t\t\tpromise[ tuple[1] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(function() {\n\t\t\t\t\t// state = [ resolved | rejected ]\n\t\t\t\t\tstate = stateString;\n\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\n\t\t\t}\n\n\t\t\t// deferred[ resolve | reject | notify ]\n\t\t\tdeferred[ tuple[0] ] = function() {\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\n\t\t});\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\n\t\tvar i = 0,\n\t\t\tresolveValues = core_slice.call( arguments ),\n\t\t\tlength = resolveValues.length,\n\n\t\t\t// the count of uncompleted subordinates\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\n\n\t\t\t// Update function for both resolve and progress values\n\t\t\tupdateFunc = function( i, contexts, values ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tcontexts[ i ] = this;\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\n\t\t\t\t\t} else if ( !( --remaining ) ) {\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t},\n\n\t\t\tprogressValues, progressContexts, resolveContexts;\n\n\t\t// add listeners to Deferred subordinates; treat others as resolved\n\t\tif ( length > 1 ) {\n\t\t\tprogressValues = new Array( length );\n\t\t\tprogressContexts = new Array( length );\n\t\t\tresolveContexts = new Array( length );\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\n\t\t\t\t\tresolveValues[ i ].promise()\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\n\t\t\t\t} else {\n\t\t\t\t\t--remaining;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// if we're not waiting on anything, resolve the master\n\t\tif ( !remaining ) {\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\n\t\t}\n\n\t\treturn deferred.promise();\n\t}\n});\njQuery.support = (function( support ) {\n\n\tvar all, a, input, select, fragment, opt, eventName, isSupported, i,\n\t\tdiv = document.createElement(\"div\");\n\n\t// Setup\n\tdiv.setAttribute( \"className\", \"t\" );\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// Finish early in limited (non-browser) environments\n\tall = div.getElementsByTagName(\"*\") || [];\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\n\tif ( !a || !a.style || !all.length ) {\n\t\treturn support;\n\t}\n\n\t// First batch of tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild( document.createElement(\"option\") );\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\n\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\n\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\tsupport.getSetAttribute = div.className !== \"t\";\n\n\t// IE strips leading whitespace when .innerHTML is used\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\n\n\t// Make sure that tbody elements aren't automatically inserted\n\t// IE will insert them into empty tables\n\tsupport.tbody = !div.getElementsByTagName(\"tbody\").length;\n\n\t// Make sure that link elements get serialized correctly by innerHTML\n\t// This requires a wrapper element in IE\n\tsupport.htmlSerialize = !!div.getElementsByTagName(\"link\").length;\n\n\t// Get the style information from getAttribute\n\t// (IE uses .cssText instead)\n\tsupport.style = /top/.test( a.getAttribute(\"style\") );\n\n\t// Make sure that URLs aren't manipulated\n\t// (IE normalizes it by default)\n\tsupport.hrefNormalized = a.getAttribute(\"href\") === \"/a\";\n\n\t// Make sure that element opacity exists\n\t// (IE uses filter instead)\n\t// Use a regex to work around a WebKit issue. See #5145\n\tsupport.opacity = /^0.5/.test( a.style.opacity );\n\n\t// Verify style float existence\n\t// (IE uses styleFloat instead of cssFloat)\n\tsupport.cssFloat = !!a.style.cssFloat;\n\n\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\n\tsupport.checkOn = !!input.value;\n\n\t// Make sure that a selected-by-default option has a working selected property.\n\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\tsupport.optSelected = opt.selected;\n\n\t// Tests for enctype support on a form (#6743)\n\tsupport.enctype = !!document.createElement(\"form\").enctype;\n\n\t// Makes sure cloning an html5 element does not cause problems\n\t// Where outerHTML is undefined, this still works\n\tsupport.html5Clone = document.createElement(\"nav\").cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\n\n\t// Will be defined later\n\tsupport.inlineBlockNeedsLayout = false;\n\tsupport.shrinkWrapBlocks = false;\n\tsupport.pixelPosition = false;\n\tsupport.deleteExpando = true;\n\tsupport.noCloneEvent = true;\n\tsupport.reliableMarginRight = true;\n\tsupport.boxSizingReliable = true;\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Support: IE<9\n\ttry {\n\t\tdelete div.test;\n\t} catch( e ) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\t// Check if we can trust getAttribute(\"value\")\n\tinput = document.createElement(\"input\");\n\tinput.setAttribute( \"value\", \"\" );\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\n\n\t// Check if an input maintains its value after becoming a radio\n\tinput.value = \"t\";\n\tinput.setAttribute( \"type\", \"radio\" );\n\tsupport.radioValue = input.value === \"t\";\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"checked\", \"t\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild( input );\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE<9\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\n\tif ( div.attachEvent ) {\n\t\tdiv.attachEvent( \"onclick\", function() {\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\n\t\tdiv.cloneNode( true ).click();\n\t}\n\n\t// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)\n\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\tfor ( i in { submit: true, change: true, focusin: true }) {\n\t\tdiv.setAttribute( eventName = \"on\" + i, \"t\" );\n\n\t\tsupport[ i + \"Bubbles\" ] = eventName in window || div.attributes[ eventName ].expando === false;\n\t}\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\t// Support: IE<9\n\t// Iteration over object's inherited properties before its own.\n\tfor ( i in jQuery( support ) ) {\n\t\tbreak;\n\t}\n\tsupport.ownLast = i !== \"0\";\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, marginDiv, tds,\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[0];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\n\n\t\tbody.appendChild( container ).appendChild( div );\n\n\t\t// Support: IE8\n\t\t// Check if table cells still have offsetWidth/Height when they are set\n\t\t// to display:none and there are still other visible table cells in a\n\t\t// table row; if so, offsetWidth/Height are not reliable for use when\n\t\t// determining if an element has been hidden directly using\n\t\t// display:none (it is still safe to use offsets if a parent element is\n\t\t// hidden; don safety goggles and see bug #4512 for more information).\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\n\n\t\ttds[ 0 ].style.display = \"\";\n\t\ttds[ 1 ].style.display = \"none\";\n\n\t\t// Support: IE8\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\tsupport.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );\n\n\t\t// Check box-sizing and margin behavior.\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.style.cssText = \"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\";\n\n\t\t// Workaround failing boxSizing test due to offsetWidth returning wrong value\n\t\t// with some non-1 values of body zoom, ticket #13543\n\t\tjQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {\n\t\t\tsupport.boxSizing = div.offsetWidth === 4;\n\t\t});\n\n\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. (#3333)\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = div.appendChild( document.createElement(\"div\") );\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tif ( typeof div.style.zoom !== core_strundefined ) {\n\t\t\t// Support: IE<8\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );\n\n\t\t\t// Support: IE6\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = ( div.offsetWidth !== 3 );\n\n\t\t\tif ( support.inlineBlockNeedsLayout ) {\n\t\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\n\t\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\n\t\t\t\t// Support: IE<8\n\t\t\t\tbody.style.zoom = 1;\n\t\t\t}\n\t\t}\n\n\t\tbody.removeChild( container );\n\n\t\t// Null elements to avoid leaks in IE\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tall = select = fragment = opt = a = input = null;\n\n\treturn support;\n})({});\n\nvar rbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ){\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar ret, thisCache,\n\t\tinternalKey = jQuery.expando,\n\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\n\t\t// can't GC object references properly across the DOM-JS boundary\n\t\tisNode = elem.nodeType,\n\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\n\t\t// attached directly to the object so GC can occur automatically\n\t\tcache = isNode ? jQuery.cache : elem,\n\n\t\t// Only defining an ID for JS objects if its cache already exists allows\n\t\t// the code to shortcut on the same path as a DOM node with no cache\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\n\n\t// Avoid doing any more work than we need to when trying to get data on an\n\t// object that has no data at all\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === \"string\" ) {\n\t\treturn;\n\t}\n\n\tif ( !id ) {\n\t\t// Only DOM nodes need a new unique ID for each element since their data\n\t\t// ends up in the global cache\n\t\tif ( isNode ) {\n\t\t\tid = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++;\n\t\t} else {\n\t\t\tid = internalKey;\n\t\t}\n\t}\n\n\tif ( !cache[ id ] ) {\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\n\t\t// is serialized using JSON.stringify\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\n\t}\n\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\n\t// shallow copied over onto the existing cache\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\n\t\tif ( pvt ) {\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\n\t\t} else {\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\n\t\t}\n\t}\n\n\tthisCache = cache[ id ];\n\n\t// jQuery data() is stored in a separate object inside the object's internal data\n\t// cache in order to avoid key collisions between internal data and user-defined\n\t// data.\n\tif ( !pvt ) {\n\t\tif ( !thisCache.data ) {\n\t\t\tthisCache.data = {};\n\t\t}\n\n\t\tthisCache = thisCache.data;\n\t}\n\n\tif ( data !== undefined ) {\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\n\t}\n\n\t// Check for both converted-to-camel and non-converted data property names\n\t// If a data property was specified\n\tif ( typeof name === \"string\" ) {\n\n\t\t// First Try to find as-is property data\n\t\tret = thisCache[ name ];\n\n\t\t// Test for null|undefined property data\n\t\tif ( ret == null ) {\n\n\t\t\t// Try to find the camelCased property\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\n\t\t}\n\t} else {\n\t\tret = thisCache;\n\t}\n\n\treturn ret;\n}\n\nfunction internalRemoveData( elem, name, pvt ) {\n\tif ( !jQuery.acceptData( elem ) ) {\n\t\treturn;\n\t}\n\n\tvar thisCache, i,\n\t\tisNode = elem.nodeType,\n\n\t\t// See jQuery.data for more information\n\t\tcache = isNode ? jQuery.cache : elem,\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\n\n\t// If there is already no cache entry for this object, there is no\n\t// purpose in continuing\n\tif ( !cache[ id ] ) {\n\t\treturn;\n\t}\n\n\tif ( name ) {\n\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\n\n\t\tif ( thisCache ) {\n\n\t\t\t// Support array or space separated string names for data keys\n\t\t\tif ( !jQuery.isArray( name ) ) {\n\n\t\t\t\t// try the string as a key before any manipulation\n\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\tname = [ name ];\n\t\t\t\t} else {\n\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\n\t\t\t\t\tname = jQuery.camelCase( name );\n\t\t\t\t\tif ( name in thisCache ) {\n\t\t\t\t\t\tname = [ name ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = name.split(\" \");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If \"name\" is an array of keys...\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\n\t\t\t\t// keys will be converted to camelCase.\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\n\t\t\t\t// both plain key and camelCase key. #12786\n\t\t\t\t// This will only penalize the array argument path.\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete thisCache[ name[i] ];\n\t\t\t}\n\n\t\t\t// If there is no data left in the cache, we want to continue\n\t\t\t// and let the cache object itself get destroyed\n\t\t\tif ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\t// See jQuery.data for more information\n\tif ( !pvt ) {\n\t\tdelete cache[ id ].data;\n\n\t\t// Don't destroy the parent cache unless the internal data object\n\t\t// had been the only thing left in it\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Destroy the cache\n\tif ( isNode ) {\n\t\tjQuery.cleanData( [ elem ], true );\n\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\n\t/* jshint eqeqeq: false */\n\t} else if ( jQuery.support.deleteExpando || cache != cache.window ) {\n\t\t/* jshint eqeqeq: true */\n\t\tdelete cache[ id ];\n\n\t// When all else fails, null\n\t} else {\n\t\tcache[ id ] = null;\n\t}\n}\n\njQuery.extend({\n\tcache: {},\n\n\t// The following elements throw uncatchable exceptions if you\n\t// attempt to add expando properties to them.\n\tnoData: {\n\t\t\"applet\": true,\n\t\t\"embed\": true,\n\t\t// Ban all objects except for Flash (which handle expandos)\n\t\t\"object\": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\n\t},\n\n\thasData: function( elem ) {\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\n\t\treturn !!elem && !isEmptyDataObject( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name );\n\t},\n\n\t// For internal use only.\n\t_data: function( elem, name, data ) {\n\t\treturn internalData( elem, name, data, true );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\treturn internalRemoveData( elem, name, true );\n\t},\n\n\t// A method for determining if a DOM node can handle the data expando\n\tacceptData: function( elem ) {\n\t\t// Do not set data on non-element because it will not be cleared (#8335).\n\t\tif ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];\n\n\t\t// nodes accept data unless otherwise specified; rejection can be conditional\n\t\treturn !noData || noData !== true && elem.getAttribute(\"classid\") === noData;\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar attrs, name,\n\t\t\tdata = null,\n\t\t\ti = 0,\n\t\t\telem = this[0];\n\n\t\t// Special expections of .data basically thwart jQuery.access,\n\t\t// so implement the relevant behavior ourselves\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = jQuery.data( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\n\t\t\t\t\tattrs = elem.attributes;\n\t\t\t\t\tfor ( ; i < attrs.length; i++ ) {\n\t\t\t\t\t\tname = attrs[i].name;\n\n\t\t\t\t\t\tif ( name.indexOf(\"data-\") === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each(function() {\n\t\t\t\tjQuery.data( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn arguments.length > 1 ?\n\n\t\t\t// Sets one value\n\t\t\tthis.each(function() {\n\t\t\t\tjQuery.data( this, key, value );\n\t\t\t}) :\n\n\t\t\t// Gets one value\n\t\t\t// Try to fetch any internally stored data first\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeData( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\n\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = data === \"true\" ? true :\n\t\t\t\t\tdata === \"false\" ? false :\n\t\t\t\t\tdata === \"null\" ? null :\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\n\t\t\t\t\t+data + \"\" === data ? +data :\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\n\t\t\t\t\t\tdata;\n\t\t\t} catch( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tjQuery.data( elem, key, data );\n\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\n\treturn data;\n}\n\n// checks a cache object for emptiness\nfunction isEmptyDataObject( obj ) {\n\tvar name;\n\tfor ( name in obj ) {\n\n\t\t// if the public data object is empty, the private is still empty\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( name !== \"toJSON\" ) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\njQuery.extend({\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = jQuery._data( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\n\t\t\t\tjQuery._removeData( elem, key );\n\t\t\t})\n\t\t});\n\t}\n});\n\njQuery.fn.extend({\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[0], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t});\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t});\n\t},\n\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile( i-- ) {\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n});\nvar nodeHook, boolHook,\n\trclass = /[\\t\\r\\n\\f]/g,\n\trreturn = /\\r/g,\n\trfocusable = /^(?:input|select|textarea|button|object)$/i,\n\trclickable = /^(?:a|area)$/i,\n\truseDefault = /^(?:checked|selected)$/i,\n\tgetSetAttribute = jQuery.support.getSetAttribute,\n\tgetSetInput = jQuery.support.input;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t});\n\t},\n\n\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\tname = jQuery.propFix[ name ] || name;\n\t\treturn this.each(function() {\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\n\t\t\ttry {\n\t\t\t\tthis[ name ] = undefined;\n\t\t\t\tdelete this[ name ];\n\t\t\t} catch( e ) {}\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = jQuery.trim( cur );\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telem.className = value ? jQuery.trim( cur ) : \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value;\n\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( jQuery.isFunction( value ) ) {\n\t\t\treturn this.each(function( i ) {\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( core_rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\n\t\t\t\t\t// check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( type === core_strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\n\tval: function( value ) {\n\t\tvar ret, hooks, isFunction,\n\t\t\telem = this[0];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\treturn typeof ret === \"string\" ?\n\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\n\t\t\t\t\t// handle cases where value is null/undef or number\n\t\t\t\t\tret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tisFunction = jQuery.isFunction( value );\n\n\t\treturn this.each(function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( isFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\t\t\t} else if ( jQuery.isArray( val ) ) {\n\t\t\t\tval = jQuery.map(val, function ( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// Use proper attribute retrieval(#6932, #12072)\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\t\t\t\t\telem.text;\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length,\n\t\t\t\t\ti = index < 0 ?\n\t\t\t\t\t\tmax :\n\t\t\t\t\t\tone ? index : 0;\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\t\t\t\t\tif ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === core_strundefined ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// All attributes are lowercase\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\tname = name.toLowerCase();\n\t\t\thooks = jQuery.attrHooks[ name ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name, propName,\n\t\t\ti = 0,\n\t\t\tattrNames = value && value.match( core_rnotwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( (name = attrNames[i++]) ) {\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\n\t\t\t\t// Boolean attributes get special treatment (#10870)\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\n\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate)\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\n\t\t\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t\t}\n\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\n\t\t\t\t} else {\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\treturn tabindex ?\n\t\t\t\t\tparseInt( tabindex, 10 ) :\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\n\t\t\t\t\t\t0 :\n\t\t\t\t\t\t-1;\n\t\t\t}\n\t\t}\n\t}\n});\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\n\t\t\t// IE<8 needs the *property* name\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\n\n\t\t// Use defaultChecked and defaultSelected for oldIE\n\t\t} else {\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\n\t\t}\n\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;\n\n\tjQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar fn = jQuery.expr.attrHandle[ name ],\n\t\t\t\tret = isXML ?\n\t\t\t\t\tundefined :\n\t\t\t\t\t/* jshint eqeqeq: false */\n\t\t\t\t\t(jQuery.expr.attrHandle[ name ] = undefined) !=\n\t\t\t\t\t\tgetter( elem, name, isXML ) ?\n\n\t\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\t\tnull;\n\t\t\tjQuery.expr.attrHandle[ name ] = fn;\n\t\t\treturn ret;\n\t\t} :\n\t\tfunction( elem, name, isXML ) {\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] ?\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\t\t};\n});\n\n// fix oldIE attroperties\nif ( !getSetInput || !getSetAttribute ) {\n\tjQuery.attrHooks.value = {\n\t\tset: function( elem, value, name ) {\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\n\t\t\t\t// Does not return so that setAttribute is also used\n\t\t\t\telem.defaultValue = value;\n\t\t\t} else {\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\n\t\t\t}\n\t\t}\n\t};\n}\n\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\nif ( !getSetAttribute ) {\n\n\t// Use this for any attribute in IE6/7\n\t// This fixes almost every IE6/7 issue\n\tnodeHook = {\n\t\tset: function( elem, value, name ) {\n\t\t\t// Set the existing or create a new attribute node\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\tif ( !ret ) {\n\t\t\t\telem.setAttributeNode(\n\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tret.value = value += \"\";\n\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\n\t\t\treturn name === \"value\" || value === elem.getAttribute( name ) ?\n\t\t\t\tvalue :\n\t\t\t\tundefined;\n\t\t}\n\t};\n\tjQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords =\n\t\t// Some attributes are constructed with empty-string values when not defined\n\t\tfunction( elem, name, isXML ) {\n\t\t\tvar ret;\n\t\t\treturn isXML ?\n\t\t\t\tundefined :\n\t\t\t\t(ret = elem.getAttributeNode( name )) && ret.value !== \"\" ?\n\t\t\t\t\tret.value :\n\t\t\t\t\tnull;\n\t\t};\n\tjQuery.valHooks.button = {\n\t\tget: function( elem, name ) {\n\t\t\tvar ret = elem.getAttributeNode( name );\n\t\t\treturn ret && ret.specified ?\n\t\t\t\tret.value :\n\t\t\t\tundefined;\n\t\t},\n\t\tset: nodeHook.set\n\t};\n\n\t// Set contenteditable to false on removals(#10429)\n\t// Setting to empty string throws an error as an invalid value\n\tjQuery.attrHooks.contenteditable = {\n\t\tset: function( elem, value, name ) {\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\n\t\t}\n\t};\n\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\n\t// This is for removals\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\n\t\tjQuery.attrHooks[ name ] = {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\n\n// Some attributes require a special call on IE\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !jQuery.support.hrefNormalized ) {\n\t// href/src property should get the full normalized URL (#10299/#12915)\n\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\n\t\tjQuery.propHooks[ name ] = {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.getAttribute( name, 4 );\n\t\t\t}\n\t\t};\n\t});\n}\n\nif ( !jQuery.support.style ) {\n\tjQuery.attrHooks.style = {\n\t\tget: function( elem ) {\n\t\t\t// Return undefined in the case of empty string\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\n\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\n\t\t\treturn elem.style.cssText || undefined;\n\t\t},\n\t\tset: function( elem, value ) {\n\t\t\treturn ( elem.style.cssText = value + \"\" );\n\t\t}\n\t};\n}\n\n// Safari mis-reports the default selected property of an option\n// Accessing the parent's selectedIndex property fixes it\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t};\n}\n\njQuery.each([\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n});\n\n// IE6/7 call enctype encoding\nif ( !jQuery.support.enctype ) {\n\tjQuery.propFix.enctype = \"encoding\";\n}\n\n// Radios and checkboxes getter/setter\njQuery.each([ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( jQuery.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !jQuery.support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\t// Support: Webkit\n\t\t\t// \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\nvar rformElems = /^(?:input|select|textarea)$/i,\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\t\tvar tmp, events, t, handleObjIn,\n\t\t\tspecial, eventHandle, handleObj,\n\t\t\thandlers, type, namespaces, origType,\n\t\t\telemData = jQuery._data( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !(events = elemData.events) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !(eventHandle = elemData.handle) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n\t\t\t\t\tundefined;\n\t\t\t};\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\n\t\t\teventHandle.elem = elem;\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend({\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join(\".\")\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !(handlers = events[ type ]) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\t// Bind the global event handler to the element\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\n\n\t\t\t\t\t} else if ( elem.attachEvent ) {\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t\t// Nullify elem to prevent memory leaks in IE\n\t\telem = null;\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\t\tvar j, handleObj, tmp,\n\t\t\torigCount, t, events,\n\t\t\tspecial, handlers, type,\n\t\t\tnamespaces, origType,\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\n\n\t\tif ( !elemData || !(events = elemData.events) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( core_rnotwhite ) || [\"\"];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\n\t\t\ttype = origType = tmp[1];\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdelete elemData.handle;\n\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\n\t\t\t// so use it instead of delete\n\t\t\tjQuery._removeData( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\t\tvar handle, ontype, cur,\n\t\t\tbubbleType, special, tmp, i,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = core_hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = core_hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\n\n\t\tcur = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf(\".\") >= 0 ) {\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split(\".\");\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join(\".\");\n\t\tevent.namespace_re = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\n\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\t\t\t\t\ttry {\n\t\t\t\t\t\telem[ type ]();\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\n\t\t\t\t\t}\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\tdispatch: function( event ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tevent = jQuery.event.fix( event );\n\n\t\tvar i, ret, handleObj, matched, j,\n\t\t\thandlerQueue = [],\n\t\t\targs = core_slice.call( arguments ),\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[0] = event;\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\n\t\t\t\t\t\t\t.apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar sel, handleObj, matches, i,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\t/* jshint eqeqeq: false */\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\n\t\t\t\t/* jshint eqeqeq: true */\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\n\t\t\t\t\tmatches = [];\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matches[ sel ] ) {\n\t\t\t\t\t\t\tmatches.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matches.length ) {\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\tfix: function( event ) {\n\t\tif ( event[ jQuery.expando ] ) {\n\t\t\treturn event;\n\t\t}\n\n\t\t// Create a writable copy of the event object and normalize some properties\n\t\tvar i, prop, copy,\n\t\t\ttype = event.type,\n\t\t\toriginalEvent = event,\n\t\t\tfixHook = this.fixHooks[ type ];\n\n\t\tif ( !fixHook ) {\n\t\t\tthis.fixHooks[ type ] = fixHook =\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\n\t\t\t\t{};\n\t\t}\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\n\n\t\tevent = new jQuery.Event( originalEvent );\n\n\t\ti = copy.length;\n\t\twhile ( i-- ) {\n\t\t\tprop = copy[ i ];\n\t\t\tevent[ prop ] = originalEvent[ prop ];\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// Fix target property (#1925)\n\t\tif ( !event.target ) {\n\t\t\tevent.target = originalEvent.srcElement || document;\n\t\t}\n\n\t\t// Support: Chrome 23+, Safari?\n\t\t// Target should not be a text node (#504, #13143)\n\t\tif ( event.target.nodeType === 3 ) {\n\t\t\tevent.target = event.target.parentNode;\n\t\t}\n\n\t\t// Support: IE<9\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\n\t\tevent.metaKey = !!event.metaKey;\n\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\n\n\tfixHooks: {},\n\n\tkeyHooks: {\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\n\t\t\t// Add which for key events\n\t\t\tif ( event.which == null ) {\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tmouseHooks: {\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar body, eventDoc, doc,\n\t\t\t\tbutton = original.button,\n\t\t\t\tfromElement = original.fromElement;\n\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\n\t\t\t\teventDoc = event.target.ownerDocument || document;\n\t\t\t\tdoc = eventDoc.documentElement;\n\t\t\t\tbody = eventDoc.body;\n\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\n\t\t\t}\n\n\t\t\t// Add relatedTarget, if necessary\n\t\t\tif ( !event.relatedTarget && fromElement ) {\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\n\t\t\t}\n\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\t\t// Note: button is not normalized, so don't use it\n\t\t\tif ( !event.which && button !== undefined ) {\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\n\t\t\t}\n\n\t\t\treturn event;\n\t\t}\n\t},\n\n\tspecial: {\n\t\tload: {\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.focus();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t// Support: IE<9\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\n\t\t\t\t\t\t// let .trigger() run the handlers\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Even when returnValue equals to undefined Firefox will still show alert\n\t\t\t\tif ( event.result !== undefined ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true,\n\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = document.removeEventListener ?\n\tfunction( elem, type, handle ) {\n\t\tif ( elem.removeEventListener ) {\n\t\t\telem.removeEventListener( type, handle, false );\n\t\t}\n\t} :\n\tfunction( elem, type, handle ) {\n\t\tvar name = \"on\" + type;\n\n\t\tif ( elem.detachEvent ) {\n\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\n\t\t\tif ( typeof elem[ name ] === core_strundefined ) {\n\t\t\t\telem[ name ] = null;\n\t\t\t}\n\n\t\t\telem.detachEvent( name, handle );\n\t\t}\n\t};\n\njQuery.Event = function( src, props ) {\n\t// Allow instantiation without the 'new' keyword\n\tif ( !(this instanceof jQuery.Event) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||\n\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If preventDefault exists, run it on the original event\n\t\tif ( e.preventDefault ) {\n\t\t\te.preventDefault();\n\n\t\t// Support: IE\n\t\t// Otherwise set the returnValue property of the original event to false\n\t\t} else {\n\t\t\te.returnValue = false;\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\t\tif ( !e ) {\n\t\t\treturn;\n\t\t}\n\t\t// If stopPropagation exists, run it on the original event\n\t\tif ( e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\n\t\t// Support: IE\n\t\t// Set the cancelBubble property of the original event to true\n\t\te.cancelBubble = true;\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n});\n\n// IE submit delegation\nif ( !jQuery.support.submitBubbles ) {\n\n\tjQuery.event.special.submit = {\n\t\tsetup: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\n\t\t\t\tvar elem = e.target,\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\n\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\n\t\t\t\t\t\tevent._submit_bubble = true;\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t\t// return undefined since we don't need an event listener\n\t\t},\n\n\t\tpostDispatch: function( event ) {\n\t\t\t// If form was submitted by the user, bubble the event up the tree\n\t\t\tif ( event._submit_bubble ) {\n\t\t\t\tdelete event._submit_bubble;\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\t// Only need this for delegated form submit events\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\n\t\t\tjQuery.event.remove( this, \"._submit\" );\n\t\t}\n\t};\n}\n\n// IE change delegation and checkbox/radio fix\nif ( !jQuery.support.changeBubbles ) {\n\n\tjQuery.event.special.change = {\n\n\t\tsetup: function() {\n\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\n\t\t\t\t\t\t\tthis._just_changed = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\n\t\t\t\t\t\t\tthis._just_changed = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\n\t\t\t\tvar elem = e.target;\n\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\thandle: function( event ) {\n\t\t\tvar elem = event.target;\n\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\n\t\t\t}\n\t\t},\n\n\t\tteardown: function() {\n\t\t\tjQuery.event.remove( this, \"._change\" );\n\n\t\t\treturn !rformElems.test( this.nodeName );\n\t\t}\n\t};\n}\n\n// Create \"bubbling\" focus and blur events\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t});\n}\n\njQuery.fn.extend({\n\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\n\t\tvar type, origFn;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t});\n\t},\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each(function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t});\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[0];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n});\nvar isSimple = /^.[^:#\\[\\.,]*$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\trneedsContext = jQuery.expr.match.needsContext,\n\t// methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend({\n\tfind: function( selector ) {\n\t\tvar i,\n\t\t\tret = [],\n\t\t\tself = this,\n\t\t\tlen = self.length;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}) );\n\t\t}\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\n\t\treturn ret;\n\t},\n\n\thas: function( target ) {\n\t\tvar i,\n\t\t\ttargets = jQuery( target, this ),\n\t\t\tlen = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tret = [],\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\n\t\t\t\tjQuery( selectors, context || this.context ) :\n\t\t\t\t0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\n\t\t\t\t// Always skip document fragments\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\n\t\t\t\t\tpos.index(cur) > -1 :\n\n\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\n\n\t\t\t\t\tcur = ret.push( cur );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );\n\t},\n\n\t// Determine the position of an element within\n\t// the matched set of elements\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn jQuery.inArray(\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[0] : elem, this );\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( jQuery.unique(all) );\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\n\t\t);\n\t}\n});\n\nfunction sibling( cur, dir ) {\n\tdo {\n\t\tcur = cur[ dir ];\n\t} while ( cur && cur.nodeType !== 1 );\n\n\treturn cur;\n}\n\njQuery.each({\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\n\t\t\telem.contentDocument || elem.contentWindow.document :\n\t\t\tjQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar ret = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tret = jQuery.filter( selector, ret );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tret = jQuery.unique( ret );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tret = ret.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tvar elem = elems[ 0 ];\n\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\t\treturn elem.nodeType === 1;\n\t\t\t}));\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\tcur = elem[ dir ];\n\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\n\t\t\tif ( cur.nodeType === 1 ) {\n\t\t\t\tmatched.push( cur );\n\t\t\t}\n\t\t\tcur = cur[dir];\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar r = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tr.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn r;\n\t}\n});\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( jQuery.isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\t/* jshint -W018 */\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t});\n\n\t}\n\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t});\n\n\t}\n\n\tif ( typeof qualifier === \"string\" ) {\n\t\tif ( isSimple.test( qualifier ) ) {\n\t\t\treturn jQuery.filter( qualifier, elements, not );\n\t\t}\n\n\t\tqualifier = jQuery.filter( qualifier, elements );\n\t}\n\n\treturn jQuery.grep( elements, function( elem ) {\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;\n\t});\n}\nfunction createSafeFragment( document ) {\n\tvar list = nodeNames.split( \"|\" ),\n\t\tsafeFrag = document.createDocumentFragment();\n\n\tif ( safeFrag.createElement ) {\n\t\twhile ( list.length ) {\n\t\t\tsafeFrag.createElement(\n\t\t\t\tlist.pop()\n\t\t\t);\n\t\t}\n\t}\n\treturn safeFrag;\n}\n\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\n\trleadingWhitespace = /^\\s+/,\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trtbody = /<tbody/i,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\tmanipulation_rcheckableType = /^(?:checkbox|radio)$/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\n\t\tparam: [ 1, \"<object>\", \"</object>\" ],\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\n\t\t_default: jQuery.support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\"  ]\n\t},\n\tsafeFragment = createSafeFragment( document ),\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\n\nwrapMap.optgroup = wrapMap.option;\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t});\n\t},\n\n\tprepend: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t});\n\t},\n\n\tbefore: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t});\n\t},\n\n\tafter: function() {\n\t\treturn this.domManip( arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t});\n\t},\n\n\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\n\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t}\n\n\t\t\t// Remove any remaining nodes\n\t\t\twhile ( elem.firstChild ) {\n\t\t\t\telem.removeChild( elem.firstChild );\n\t\t\t}\n\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\n\t\t\t// Support: IE<9\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\n\t\t\t\telem.options.length = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function () {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t});\n\t},\n\n\thtml: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar elem = this[0] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined ) {\n\t\t\t\treturn elem.nodeType === 1 ?\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\n\t\t\t\t\tundefined;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&\n\t\t\t\t( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [\"\", \"\"] )[1].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor (; i < l; i++ ) {\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\telem = this[i] || {};\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar\n\t\t\t// Snapshot the DOM in case .domManip sweeps something relevant into its fragment\n\t\t\targs = jQuery.map( this, function( elem ) {\n\t\t\t\treturn [ elem.nextSibling, elem.parentNode ];\n\t\t\t}),\n\t\t\ti = 0;\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\tvar next = args[ i++ ],\n\t\t\t\tparent = args[ i++ ];\n\n\t\t\tif ( parent ) {\n\t\t\t\t// Don't use the snapshot next if it has moved (#13810)\n\t\t\t\tif ( next && next.parentNode !== parent ) {\n\t\t\t\t\tnext = this.nextSibling;\n\t\t\t\t}\n\t\t\t\tjQuery( this ).remove();\n\t\t\t\tparent.insertBefore( elem, next );\n\t\t\t}\n\t\t// Allow new content to include elements from the context set\n\t\t}, true );\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn i ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback, allowIntersection ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = core_concat.apply( [], args );\n\n\t\tvar first, node, hasScripts,\n\t\t\tscripts, doc, fragment,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[0],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction || !( l <= 1 || typeof value !== \"string\" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[0] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback, allowIntersection );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[i], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Hope ajax is available...\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Fix #11809: Avoid leaking memory\n\t\t\t\tfragment = first = null;\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t}\n});\n\n// Support: IE<8\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, \"tr\" ) ?\n\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\n\t\telem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = (jQuery.find.attr( elem, \"type\" ) !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\tif ( match ) {\n\t\telem.type = match[1];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar elem,\n\t\ti = 0;\n\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\n\t\treturn;\n\t}\n\n\tvar type, i, l,\n\t\toldData = jQuery._data( src ),\n\t\tcurData = jQuery._data( dest, oldData ),\n\t\tevents = oldData.events;\n\n\tif ( events ) {\n\t\tdelete curData.handle;\n\t\tcurData.events = {};\n\n\t\tfor ( type in events ) {\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t}\n\t\t}\n\t}\n\n\t// make the cloned public data object a copy from the original\n\tif ( curData.data ) {\n\t\tcurData.data = jQuery.extend( {}, curData.data );\n\t}\n}\n\nfunction fixCloneNodeIssues( src, dest ) {\n\tvar nodeName, e, data;\n\n\t// We do not need to do anything for non-Elements\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\tnodeName = dest.nodeName.toLowerCase();\n\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\n\tif ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {\n\t\tdata = jQuery._data( dest );\n\n\t\tfor ( e in data.events ) {\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\n\t\t}\n\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\n\t\tdest.removeAttribute( jQuery.expando );\n\t}\n\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\n\t\tdisableScript( dest ).text = src.text;\n\t\trestoreScript( dest );\n\n\t// IE6-10 improperly clones children of object elements using classid.\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\n\t} else if ( nodeName === \"object\" ) {\n\t\tif ( dest.parentNode ) {\n\t\t\tdest.outerHTML = src.outerHTML;\n\t\t}\n\n\t\t// This path appears unavoidable for IE9. When cloning an object\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\n\t\t// If the src has innerHTML and the destination does not,\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\n\t\tif ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\n\t\t\tdest.innerHTML = src.innerHTML;\n\t\t}\n\n\t} else if ( nodeName === \"input\" && manipulation_rcheckableType.test( src.type ) ) {\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\n\t\t// a checked appearance if the defaultChecked value isn't also set\n\n\t\tdest.defaultChecked = dest.checked = src.checked;\n\n\t\t// IE6-7 get confused and end up setting the value of a cloned\n\t\t// checkbox/radio button to an empty string instead of \"on\"\n\t\tif ( dest.value !== src.value ) {\n\t\t\tdest.value = src.value;\n\t\t}\n\n\t// IE6-8 fails to return the selected option to the default selected\n\t// state when cloning options\n\t} else if ( nodeName === \"option\" ) {\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\n\n\t// IE6-8 fails to set the defaultValue to the correct value when\n\t// cloning other types of input fields\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\njQuery.each({\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\ti = 0,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone(true);\n\t\t\tjQuery( insert[i] )[ original ]( elems );\n\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\n\t\t\tcore_push.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\nfunction getAll( context, tag ) {\n\tvar elems, elem,\n\t\ti = 0,\n\t\tfound = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\ttypeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\tundefined;\n\n\tif ( !found ) {\n\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\n\t\t\t\tfound.push( elem );\n\t\t\t} else {\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], found ) :\n\t\tfound;\n}\n\n// Used in buildFragment, fixes the defaultChecked property\nfunction fixDefaultChecked( elem ) {\n\tif ( manipulation_rcheckableType.test( elem.type ) ) {\n\t\telem.defaultChecked = elem.checked;\n\t}\n}\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar destElements, node, clone, i, srcElements,\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\tif ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\n\t\t\tclone = elem.cloneNode( true );\n\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\n\t\t} else {\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\n\t\t}\n\n\t\tif ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\t// Fix all IE cloning issues\n\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\n\t\t\t\tif ( destElements[i] ) {\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\n\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\tdestElements = srcElements = node = null;\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar j, elem, contains,\n\t\t\ttmp, tag, tbody, wrap,\n\t\t\tl = elems.length,\n\n\t\t\t// Ensure a safe fragment\n\t\t\tsafe = createSafeFragment( context ),\n\n\t\t\tnodes = [],\n\t\t\ti = 0;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[1].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\n\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[0];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Manually add leading whitespace removed by IE\n\t\t\t\t\tif ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\n\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\n\t\t\t\t\tif ( !jQuery.support.tbody ) {\n\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\n\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\ttmp.firstChild :\n\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\n\t\t\t\t\t\t\t\ttmp :\n\t\t\t\t\t\t\t\t0;\n\n\t\t\t\t\t\tj = elem && elem.childNodes.length;\n\t\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\n\t\t\t\t\t\t\t\telem.removeChild( tbody );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\n\t\t\t\t\ttmp.textContent = \"\";\n\n\t\t\t\t\t// Fix #12392 for oldIE\n\t\t\t\t\twhile ( tmp.firstChild ) {\n\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remember the top-level container for proper cleanup\n\t\t\t\t\ttmp = safe.lastChild;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fix #11356: Clear elements from fragment\n\t\tif ( tmp ) {\n\t\t\tsafe.removeChild( tmp );\n\t\t}\n\n\t\t// Reset defaultChecked for any radios and checkboxes\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\n\t\tif ( !jQuery.support.appendChecked ) {\n\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\n\t\t}\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttmp = null;\n\n\t\treturn safe;\n\t},\n\n\tcleanData: function( elems, /* internal */ acceptData ) {\n\t\tvar elem, type, id, data,\n\t\t\ti = 0,\n\t\t\tinternalKey = jQuery.expando,\n\t\t\tcache = jQuery.cache,\n\t\t\tdeleteExpando = jQuery.support.deleteExpando,\n\t\t\tspecial = jQuery.event.special;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\n\n\t\t\t\tid = elem[ internalKey ];\n\t\t\t\tdata = id && cache[ id ];\n\n\t\t\t\tif ( data ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\n\t\t\t\t\tif ( cache[ id ] ) {\n\n\t\t\t\t\t\tdelete cache[ id ];\n\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\n\t\t\t\t\t\t// we must handle all of these cases\n\t\t\t\t\t\tif ( deleteExpando ) {\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\n\n\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== core_strundefined ) {\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem[ internalKey ] = null;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcore_deletedIds.push( id );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t_evalUrl: function( url ) {\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: \"GET\",\n\t\t\tdataType: \"script\",\n\t\t\tasync: false,\n\t\t\tglobal: false,\n\t\t\t\"throws\": true\n\t\t});\n\t}\n});\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\tif ( this[0] ) {\n\t\t\t// The elements to wrap the target around\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\n\n\t\t\tif ( this[0].parentNode ) {\n\t\t\t\twrap.insertBefore( this[0] );\n\t\t\t}\n\n\t\t\twrap.map(function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\n\t\t\t\t\telem = elem.firstChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t}).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( jQuery.isFunction( html ) ) {\n\t\t\treturn this.each(function(i) {\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t});\n\t},\n\n\twrap: function( html ) {\n\t\tvar isFunction = jQuery.isFunction( html );\n\n\t\treturn this.each(function(i) {\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\n\t\t});\n\t},\n\n\tunwrap: function() {\n\t\treturn this.parent().each(function() {\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t\t}\n\t\t}).end();\n\t}\n});\nvar iframe, getStyles, curCSS,\n\tralpha = /alpha\\([^)]*\\)/i,\n\tropacity = /opacity\\s*=\\s*([^)]*)/,\n\trposition = /^(top|right|bottom|left)$/,\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = { BODY: \"block\" },\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\n\t\treturn name;\n\t}\n\n\t// check for vendor prefixed names\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\n\t\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\t// isHidden might be called from jQuery#filter function;\n\t// in that case, element will be second argument\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem, hidden,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\t\t\t// Reset the inline display of this element to learn if it is\n\t\t\t// being hidden by cascaded rules or not\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\n\t\t\t\telem.style.display = \"\";\n\t\t\t}\n\n\t\t\t// Set elements which have been overridden with display: none\n\t\t\t// in a stylesheet to whatever the default browser style is\n\t\t\t// for such an element\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\n\t\t\tif ( !values[ index ] ) {\n\t\t\t\thidden = isHidden( elem );\n\n\t\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\t\tjQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of most of the elements in a second loop\n\t// to avoid the constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.access( this, function( elem, name, value ) {\n\t\t\tvar len, styles,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( jQuery.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t},\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( isHidden( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t});\n\t}\n});\n\njQuery.extend({\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {\n\t\t// normalize float css property\n\t\t\"float\": jQuery.support.cssFloat ? \"cssFloat\" : \"styleFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = jQuery.camelCase( name ),\n\t\t\tstyle = elem.style;\n\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"px\";\n\t\t\t}\n\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\n\t\t\tif ( !jQuery.support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\n\t\t\t\t// Wrapped to prevent IE from throwing errors when 'invalid' values are provided\n\t\t\t\t// Fixes bug #5509\n\t\t\t\ttry {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t} catch(e) {}\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar num, val, hooks,\n\t\t\torigName = jQuery.camelCase( name );\n\n\t\t// Make sure that we're working with the right name\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\n\n\t\t// gets hook for the prefixed version\n\t\t// followed by the unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t//convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\n// NOTE: we've included the \"window\" in window.getComputedStyle\n// because jsdom on node.js will break without it.\nif ( window.getComputedStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn window.getComputedStyle( elem, null );\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar width, minWidth, maxWidth,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\n\t\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\n\t\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\tif ( computed ) {\n\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\tret = jQuery.style( elem, name );\n\t\t\t}\n\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t\t// Remember the original values\n\t\t\t\twidth = style.width;\n\t\t\t\tminWidth = style.minWidth;\n\t\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t\t// Put in the new values to get a computed value out\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\t\tret = computed.width;\n\n\t\t\t\t// Revert the changed values\n\t\t\t\tstyle.width = width;\n\t\t\t\tstyle.minWidth = minWidth;\n\t\t\t\tstyle.maxWidth = maxWidth;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n} else if ( document.documentElement.currentStyle ) {\n\tgetStyles = function( elem ) {\n\t\treturn elem.currentStyle;\n\t};\n\n\tcurCSS = function( elem, name, _computed ) {\n\t\tvar left, rs, rsLeft,\n\t\t\tcomputed = _computed || getStyles( elem ),\n\t\t\tret = computed ? computed[ name ] : undefined,\n\t\t\tstyle = elem.style;\n\n\t\t// Avoid setting ret to empty string here\n\t\t// so we don't default to auto\n\t\tif ( ret == null && style && style[ name ] ) {\n\t\t\tret = style[ name ];\n\t\t}\n\n\t\t// From the awesome hack by Dean Edwards\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\n\t\t// If we're not dealing with a regular pixel number\n\t\t// but a number that has a weird ending, we need to convert it to pixels\n\t\t// but not position css attributes, as those are proportional to the parent element instead\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\tleft = style.left;\n\t\t\trs = elem.runtimeStyle;\n\t\t\trsLeft = rs && rs.left;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = elem.currentStyle.left;\n\t\t\t}\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\n\t\t\tret = style.pixelLeft + \"px\";\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.left = left;\n\t\t\tif ( rsLeft ) {\n\t\t\t\trs.left = rsLeft;\n\t\t\t}\n\t\t}\n\n\t\treturn ret === \"\" ? \"auto\" : ret;\n\t};\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\n\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\n\t\t// Otherwise initialize for horizontal or vertical properties\n\t\tname === \"width\" ? 1 : 0,\n\n\t\tval = 0;\n\n\tfor ( ; i < 4; i += 2 ) {\n\t\t// both box models exclude margin, so add it if we want it\n\t\tif ( extra === \"margin\" ) {\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\tif ( isBorderBox ) {\n\t\t\t// border-box includes padding, so remove it if we want content\n\t\t\tif ( extra === \"content\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// at this point, extra isn't border nor margin, so remove border\n\t\t\tif ( extra !== \"margin\" ) {\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t} else {\n\t\t\t// at this point, extra isn't content, so add padding\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// at this point, extra isn't content nor padding, so add border\n\t\t\tif ( extra !== \"padding\" ) {\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\treturn val;\n}\n\nfunction getWidthOrHeight( elem, name, extra ) {\n\n\t// Start with offset property, which is equivalent to the border-box value\n\tvar valueIsBorderBox = true,\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\n\t\tstyles = getStyles( elem ),\n\t\tisBorderBox = jQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\n\tif ( val <= 0 || val == null ) {\n\t\t// Fall back to computed then uncomputed css if necessary\n\t\tval = curCSS( elem, name, styles );\n\t\tif ( val < 0 || val == null ) {\n\t\t\tval = elem.style[ name ];\n\t\t}\n\n\t\t// Computed unit is not pixels. Stop here and return.\n\t\tif ( rnumnonpx.test(val) ) {\n\t\t\treturn val;\n\t\t}\n\n\t\t// we need the check for style in case a browser which returns unreliable values\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\n\t\tvalueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );\n\n\t\t// Normalize \"\", auto, and prepare for extra\n\t\tval = parseFloat( val ) || 0;\n\t}\n\n\t// use the active box-sizing model to add/subtract irrelevant styles\n\treturn ( val +\n\t\taugmentWidthOrHeight(\n\t\t\telem,\n\t\t\tname,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles\n\t\t)\n\t) + \"px\";\n}\n\n// Try to determine the default display value of an element\nfunction css_defaultDisplay( nodeName ) {\n\tvar doc = document,\n\t\tdisplay = elemdisplay[ nodeName ];\n\n\tif ( !display ) {\n\t\tdisplay = actualDisplay( nodeName, doc );\n\n\t\t// If the simple way fails, read from inside an iframe\n\t\tif ( display === \"none\" || !display ) {\n\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe ||\n\t\t\t\tjQuery(\"<iframe frameborder='0' width='0' height='0'/>\")\n\t\t\t\t.css( \"cssText\", \"display:block !important\" )\n\t\t\t).appendTo( doc.documentElement );\n\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\n\t\t\tdoc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;\n\t\t\tdoc.write(\"<!doctype html><html><body>\");\n\t\t\tdoc.close();\n\n\t\t\tdisplay = actualDisplay( nodeName, doc );\n\t\t\tiframe.detach();\n\t\t}\n\n\t\t// Store the correct default display\n\t\telemdisplay[ nodeName ] = display;\n\t}\n\n\treturn display;\n}\n\n// Called ONLY from within css_defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\t\tdisplay = jQuery.css( elem[0], \"display\" );\n\telem.remove();\n\treturn display;\n}\n\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\n\tjQuery.cssHooks[ name ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\n\t\t\t\t// however, it must have a current display style that would benefit from this\n\t\t\t\treturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar styles = extra && getStyles( elem );\n\t\t\treturn setPositiveNumber( elem, value, extra ?\n\t\t\t\taugmentWidthOrHeight(\n\t\t\t\t\telem,\n\t\t\t\t\tname,\n\t\t\t\t\textra,\n\t\t\t\t\tjQuery.support.boxSizing && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\t\tstyles\n\t\t\t\t) : 0\n\t\t\t);\n\t\t}\n\t};\n});\n\nif ( !jQuery.support.opacity ) {\n\tjQuery.cssHooks.opacity = {\n\t\tget: function( elem, computed ) {\n\t\t\t// IE uses filters for opacity\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\n\t\t\t\tcomputed ? \"1\" : \"\";\n\t\t},\n\n\t\tset: function( elem, value ) {\n\t\t\tvar style = elem.style,\n\t\t\t\tcurrentStyle = elem.currentStyle,\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\n\n\t\t\t// IE has trouble with opacity if it does not have layout\n\t\t\t// Force it by setting the zoom level\n\t\t\tstyle.zoom = 1;\n\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\n\t\t\t// if value === \"\", then remove inline opacity #12685\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\n\t\t\t\t\tstyle.removeAttribute ) {\n\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\n\t\t\t\tstyle.removeAttribute( \"filter\" );\n\n\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// otherwise, set new filter values\n\t\t\tstyle.filter = ralpha.test( filter ) ?\n\t\t\t\tfilter.replace( ralpha, opacity ) :\n\t\t\t\tfilter + \" \" + opacity;\n\t\t}\n\t};\n}\n\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\t\t\tcomputed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\t// Support: Opera <= 12.12\n\t\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\t\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\n\t\t\t(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\n\t};\n}\n\n// These hooks are used by animate to expand properties\njQuery.each({\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( !rmargin.test( prefix ) ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n});\nvar r20 = /%20/g,\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\njQuery.fn.extend({\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map(function(){\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t})\n\t\t.filter(function(){\n\t\t\tvar type = this.type;\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !manipulation_rcheckableType.test( type ) );\n\t\t})\n\t\t.map(function( i, elem ){\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\treturn val == null ?\n\t\t\t\tnull :\n\t\t\t\tjQuery.isArray( val ) ?\n\t\t\t\t\tjQuery.map( val, function( val ){\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t\t}) :\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t}).get();\n\t}\n});\n\n//Serialize an array of form elements or a set of\n//key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, value ) {\n\t\t\t// If value is a function, invoke it and return its value\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\n\t\t};\n\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\n\tif ( traditional === undefined ) {\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t});\n\n\t} else {\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\n};\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n});\n\njQuery.fn.extend({\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t},\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\tajax_nonce = jQuery.now(),\n\n\tajax_rquery = /\\?/,\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\trurl = /^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,\n\n\t// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat(\"*\");\n\n// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[0] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t});\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar deep, key,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\njQuery.fn.load = function( url, params, callback ) {\n\tif ( typeof url !== \"string\" && _load ) {\n\t\treturn _load.apply( this, arguments );\n\t}\n\n\tvar selector, response, type,\n\t\tself = this,\n\t\toff = url.indexOf(\" \");\n\n\tif ( off >= 0 ) {\n\t\tselector = url.slice( off, url.length );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( jQuery.isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax({\n\t\t\turl: url,\n\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\n\t\t\ttype: type,\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t}).done(function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ){\n\tjQuery.fn[ type ] = function( fn ){\n\t\treturn this.on( type, fn );\n\t};\n});\n\njQuery.extend({\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: ajaxLocation,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": jQuery.parseJSON,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar // Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers as string\n\t\t\tresponseHeadersString,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\ttransport,\n\t\t\t// Response headers\n\t\t\tresponseHeaders,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( state === 2 ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tvar lname = name.toLowerCase();\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( !state ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\n\t\tjqXHR.success = jqXHR.done;\n\t\tjqXHR.error = jqXHR.fail;\n\n\t\t// Remove hash character (#7531: and string promotion)\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( core_rnotwhite ) || [\"\"];\n\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\n\t\tif ( s.crossDomain == null ) {\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\n\t\t\ts.crossDomain = !!( parts &&\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\n\t\t\t);\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( state === 2 ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\tfireGlobals = s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\tcacheURL = s.url;\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// If data is available, append data to url\n\t\t\tif ( s.data ) {\n\t\t\t\tcacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add anti-cache in url if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\ts.url = rts.test( cacheURL ) ?\n\n\t\t\t\t\t// If there is already a '_' parameter, set its value\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + ajax_nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ajax_nonce++;\n\t\t\t}\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\n\t\t\tjqXHR[ i ]( s[ i ] );\n\t\t}\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = setTimeout(function() {\n\t\t\t\t\tjqXHR.abort(\"timeout\");\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tstate = 1;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\t\t\t\t// Propagate exception as error if not done\n\t\t\t\tif ( state < 2 ) {\n\t\t\t\t\tdone( -1, e );\n\t\t\t\t// Simply rethrow otherwise\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Called once\n\t\t\tif ( state === 2 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// State is \"done\" now\n\t\t\tstate = 2;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\tclearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// We extract error from statusText\n\t\t\t\t// then normalize statusText and status for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n});\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\t\t// shift arguments if data argument was omitted\n\t\tif ( jQuery.isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t});\n\t};\n});\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\tvar firstDataType, ct, finalDataType, type,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n});\n\n// Handle cache's special case and global\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t\ts.global = false;\n\t}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function(s) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\n\t\tvar script,\n\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\n\n\t\treturn {\n\n\t\t\tsend: function( _, callback ) {\n\n\t\t\t\tscript = document.createElement(\"script\");\n\n\t\t\t\tscript.async = true;\n\n\t\t\t\tif ( s.scriptCharset ) {\n\t\t\t\t\tscript.charset = s.scriptCharset;\n\t\t\t\t}\n\n\t\t\t\tscript.src = s.url;\n\n\t\t\t\t// Attach handlers for all browsers\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\n\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\n\n\t\t\t\t\t\t// Handle memory leak in IE\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\n\n\t\t\t\t\t\t// Remove the script\n\t\t\t\t\t\tif ( script.parentNode ) {\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Dereference the script\n\t\t\t\t\t\tscript = null;\n\n\t\t\t\t\t\t// Callback if not abort\n\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\thead.insertBefore( script, head.firstChild );\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( script ) {\n\t\t\t\t\tscript.onload( undefined, true );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup({\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( ajax_nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n});\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( ajax_rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[\"script json\"] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always(function() {\n\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\t\t\t\t// make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t});\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n});\nvar xhrCallbacks, xhrSupported,\n\txhrId = 0,\n\t// #5280: Internet Explorer will keep connections alive if we don't abort on unload\n\txhrOnUnloadAbort = window.ActiveXObject && function() {\n\t\t// Abort all pending requests\n\t\tvar key;\n\t\tfor ( key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]( undefined, true );\n\t\t}\n\t};\n\n// Functions to create xhrs\nfunction createStandardXHR() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch( e ) {}\n}\n\nfunction createActiveXHR() {\n\ttry {\n\t\treturn new window.ActiveXObject(\"Microsoft.XMLHTTP\");\n\t} catch( e ) {}\n}\n\n// Create the request object\n// (This is still attached to ajaxSettings for backward compatibility)\njQuery.ajaxSettings.xhr = window.ActiveXObject ?\n\t/* Microsoft failed to properly\n\t * implement the XMLHttpRequest in IE7 (can't request local files),\n\t * so we use the ActiveXObject when it is available\n\t * Additionally XMLHttpRequest can be disabled in IE7/IE8 so\n\t * we need a fallback.\n\t */\n\tfunction() {\n\t\treturn !this.isLocal && createStandardXHR() || createActiveXHR();\n\t} :\n\t// For all other browsers, use the standard XMLHttpRequest object\n\tcreateStandardXHR;\n\n// Determine support properties\nxhrSupported = jQuery.ajaxSettings.xhr();\njQuery.support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nxhrSupported = jQuery.support.ajax = !!xhrSupported;\n\n// Create transport if the browser can provide an xhr\nif ( xhrSupported ) {\n\n\tjQuery.ajaxTransport(function( s ) {\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\n\t\tif ( !s.crossDomain || jQuery.support.cors ) {\n\n\t\t\tvar callback;\n\n\t\t\treturn {\n\t\t\t\tsend: function( headers, complete ) {\n\n\t\t\t\t\t// Get a new xhr\n\t\t\t\t\tvar handle, i,\n\t\t\t\t\t\txhr = s.xhr();\n\n\t\t\t\t\t// Open the socket\n\t\t\t\t\t// Passing null username, generates a login popup on Opera (#2865)\n\t\t\t\t\tif ( s.username ) {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async, s.username, s.password );\n\t\t\t\t\t} else {\n\t\t\t\t\t\txhr.open( s.type, s.url, s.async );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Apply custom fields if provided\n\t\t\t\t\tif ( s.xhrFields ) {\n\t\t\t\t\t\tfor ( i in s.xhrFields ) {\n\t\t\t\t\t\t\txhr[ i ] = s.xhrFields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Override mime type if needed\n\t\t\t\t\tif ( s.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\t\txhr.overrideMimeType( s.mimeType );\n\t\t\t\t\t}\n\n\t\t\t\t\t// X-Requested-With header\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\t\tif ( !s.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t\t}\n\n\t\t\t\t\t// Need an extra try/catch for cross domain requests in Firefox 3\n\t\t\t\t\ttry {\n\t\t\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch( err ) {}\n\n\t\t\t\t\t// Do send the request\n\t\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\t\txhr.send( ( s.hasContent && s.data ) || null );\n\n\t\t\t\t\t// Listener\n\t\t\t\t\tcallback = function( _, isAbort ) {\n\t\t\t\t\t\tvar status, responseHeaders, statusText, responses;\n\n\t\t\t\t\t\t// Firefox throws exceptions when accessing properties\n\t\t\t\t\t\t// of an xhr when a network error occurred\n\t\t\t\t\t\t// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)\n\t\t\t\t\t\ttry {\n\n\t\t\t\t\t\t\t// Was never called and is aborted or complete\n\t\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\n\n\t\t\t\t\t\t\t\t// Only called once\n\t\t\t\t\t\t\t\tcallback = undefined;\n\n\t\t\t\t\t\t\t\t// Do not keep as active anymore\n\t\t\t\t\t\t\t\tif ( handle ) {\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\n\t\t\t\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t\t\t\tdelete xhrCallbacks[ handle ];\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If it's an abort\n\t\t\t\t\t\t\t\tif ( isAbort ) {\n\t\t\t\t\t\t\t\t\t// Abort it manually if needed\n\t\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\n\t\t\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tresponses = {};\n\t\t\t\t\t\t\t\t\tstatus = xhr.status;\n\t\t\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\n\n\t\t\t\t\t\t\t\t\t// When requesting binary data, IE6-9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText (#11426)\n\t\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\n\t\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\n\t\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\n\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\n\t\t\t\t\t\t\t\t\t} catch( e ) {\n\t\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\n\t\t\t\t\t\t\t\t\t\tstatusText = \"\";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\n\n\t\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\n\t\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\n\t\t\t\t\t\t\t\t\t// can do given current implementations)\n\t\t\t\t\t\t\t\t\tif ( !status && s.isLocal && !s.crossDomain ) {\n\t\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\n\t\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\n\t\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\n\t\t\t\t\t\t\t\t\t\tstatus = 204;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch( firefoxAccessException ) {\n\t\t\t\t\t\t\tif ( !isAbort ) {\n\t\t\t\t\t\t\t\tcomplete( -1, firefoxAccessException );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Call complete if needed\n\t\t\t\t\t\tif ( responses ) {\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, responseHeaders );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( !s.async ) {\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\n\t\t\t\t\t\tsetTimeout( callback );\n\t\t\t\t\t} else {\n\t\t\t\t\t\thandle = ++xhrId;\n\t\t\t\t\t\tif ( xhrOnUnloadAbort ) {\n\t\t\t\t\t\t\t// Create the active xhrs callbacks list if needed\n\t\t\t\t\t\t\t// and attach the unload handler\n\t\t\t\t\t\t\tif ( !xhrCallbacks ) {\n\t\t\t\t\t\t\t\txhrCallbacks = {};\n\t\t\t\t\t\t\t\tjQuery( window ).unload( xhrOnUnloadAbort );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// Add to list of active xhrs callbacks\n\t\t\t\t\t\t\txhrCallbacks[ handle ] = callback;\n\t\t\t\t\t\t}\n\t\t\t\t\t\txhr.onreadystatechange = callback;\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\t\tabort: function() {\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tcallback( undefined, true );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t});\n}\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\n\n\t\t\t// we're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\t\t\t// don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t}),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\n\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t} else {\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\tanimation = deferred.promise({\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length ; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// resolve when we played the last frame\n\t\t\t\t// otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length ; index++ ) {\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t})\n\t);\n\n\t// attach callbacks from options\n\treturn animation.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = jQuery.camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( jQuery.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweener: function( props, callback ) {\n\t\tif ( jQuery.isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.split(\" \");\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length ; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\n\t\t}\n\t}\n});\n\nfunction defaultPrefilter( elem, props, opts ) {\n\t/* jshint validthis: true */\n\tvar prop, value, toggle, tween, hooks, oldfire,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = jQuery._data( elem, \"fxshow\" );\n\n\t// handle queue: false promises\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always(function() {\n\t\t\t// doing this makes sure that the complete handler will be called\n\t\t\t// before this completes\n\t\t\tanim.always(function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\t// height/width overflow pass\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\n\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE does not\n\t\t// change the overflow attribute when overflowX and\n\t\t// overflowY are set to the same value\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Set display property to inline-block for height/width\n\t\t// animations on inline elements that are having width/height animated\n\t\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t// inline-level elements accept inline-block;\n\t\t\t// block-level elements need to be inline with layout\n\t\t\tif ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === \"inline\" ) {\n\t\t\t\tstyle.display = \"inline-block\";\n\n\t\t\t} else {\n\t\t\t\tstyle.zoom = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tif ( !jQuery.support.shrinkWrapBlocks ) {\n\t\t\tanim.always(function() {\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t\t});\n\t\t}\n\t}\n\n\n\t// show/hide pass\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.exec( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\tif ( !jQuery.isEmptyObject( orig ) ) {\n\t\tif ( dataShow ) {\n\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\thidden = dataShow.hidden;\n\t\t\t}\n\t\t} else {\n\t\t\tdataShow = jQuery._data( elem, \"fxshow\", {} );\n\t\t}\n\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\n\t\tif ( toggle ) {\n\t\t\tdataShow.hidden = !hidden;\n\t\t}\n\t\tif ( hidden ) {\n\t\t\tjQuery( elem ).show();\n\t\t} else {\n\t\t\tanim.done(function() {\n\t\t\t\tjQuery( elem ).hide();\n\t\t\t});\n\t\t}\n\t\tanim.done(function() {\n\t\t\tvar prop;\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\n\t\t\tfor ( prop in orig ) {\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t}\n\t\t});\n\t\tfor ( prop in orig ) {\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\n\t\t\tif ( !( prop in dataShow ) ) {\n\t\t\t\tdataShow[ prop ] = tween.start;\n\t\t\t\tif ( hidden ) {\n\t\t\t\t\ttween.end = tween.start;\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || \"swing\";\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\n\t\t\t// available and use plain properties where available\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9\n// Panic based approach to setting things on disconnected nodes\n\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n});\n\njQuery.fn.extend({\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\n\n\t\t\t// animate to the value specified\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = jQuery._data( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// start the next in the queue if the last step wasn't forced\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\n\t\t\t// but only if they were gotoEnd\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t});\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each(function() {\n\t\t\tvar index,\n\t\t\t\tdata = jQuery._data( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t});\n\t}\n});\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\tattrs = { height: type },\n\t\ti = 0;\n\n\t// if we include width, step value is 1 to do all cssExpand values,\n\t// if we don't include width, step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth? 1 : 0;\n\tfor( ; i < 4 ; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\n// Generate shortcuts for custom animations\njQuery.each({\n\tslideDown: genFx(\"show\"),\n\tslideUp: genFx(\"hide\"),\n\tslideToggle: genFx(\"toggle\"),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n});\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tjQuery.isFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\n\t};\n\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\n\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( jQuery.isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p*Math.PI ) / 2;\n\t}\n};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ttimers = jQuery.timers,\n\t\ti = 0;\n\n\tfxNow = jQuery.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\t\t// Checks the timer has not already been removed\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tif ( timer() && jQuery.timers.push( timer ) ) {\n\t\tjQuery.fx.start();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar docElem, win,\n\t\tbox = { top: 0, left: 0 },\n\t\telem = this[ 0 ],\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure it's not a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn box;\n\t}\n\n\t// If we don't have gBCR, just use 0,0 rather than error\n\t// BlackBerry 5, iOS 3 (original iPhone)\n\tif ( typeof elem.getBoundingClientRect !== core_strundefined ) {\n\t\tbox = elem.getBoundingClientRect();\n\t}\n\twin = getWindow( doc );\n\treturn {\n\t\ttop: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),\n\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\n\t};\n};\n\njQuery.offset = {\n\n\tsetOffset: function( elem, options, i ) {\n\t\tvar position = jQuery.css( elem, \"position\" );\n\n\t\t// set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tvar curElem = jQuery( elem ),\n\t\t\tcurOffset = curElem.offset(),\n\t\t\tcurCSSTop = jQuery.css( elem, \"top\" ),\n\t\t\tcurCSSLeft = jQuery.css( elem, \"left\" ),\n\t\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) && jQuery.inArray(\"auto\", [curCSSTop, curCSSLeft]) > -1,\n\t\t\tprops = {}, curPosition = {}, curTop, curLeft;\n\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( jQuery.isFunction( options ) ) {\n\t\t\toptions = options.call( elem, i, curOffset );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\n\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset,\n\t\t\tparentOffset = { top: 0, left: 0 },\n\t\t\telem = this[ 0 ];\n\n\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\t\t} else {\n\t\t\t// Get *real* offsetParent\n\t\t\toffsetParent = this.offsetParent();\n\n\t\t\t// Get correct offsets\n\t\t\toffset = this.offset();\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\n\t\t\t\tparentOffset = offsetParent.offset();\n\t\t\t}\n\n\t\t\t// Add offsetParent borders\n\t\t\tparentOffset.top  += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\n\t\treturn {\n\t\t\ttop:  offset.top  - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\n\t\t};\n\t},\n\n\toffsetParent: function() {\n\t\treturn this.map(function() {\n\t\t\tvar offsetParent = this.offsetParent || docElem;\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\") === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = /Y/.test( prop );\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.access( this, function( elem, method, val ) {\n\t\t\tvar win = getWindow( elem );\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\n\t\t\t\t\twin.document.documentElement[ method ] :\n\t\t\t\t\telem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length, null );\n\t};\n});\n\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ?\n\t\telem :\n\t\telem.nodeType === 9 ?\n\t\t\telem.defaultView || elem.parentWindow :\n\t\t\tfalse;\n}\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\n\t\t// margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\n\t\t};\n\t});\n});\n// Limit scope pollution from any deprecated API\n// (function() {\n\n// The number of elements contained in the matched element set\njQuery.fn.size = function() {\n\treturn this.length;\n};\n\njQuery.fn.andSelf = jQuery.fn.addBack;\n\n// })();\nif ( typeof module === \"object\" && module && typeof module.exports === \"object\" ) {\n\t// Expose jQuery as module.exports in loaders that implement the Node\n\t// module pattern (including browserify). Do not create the global, since\n\t// the user will be storing it themselves locally, and globals are frowned\n\t// upon in the Node module world.\n\tmodule.exports = jQuery;\n} else {\n\t// Otherwise expose jQuery to the global object as usual\n\twindow.jQuery = window.$ = jQuery;\n\n\t// Register as a named AMD module, since jQuery can be concatenated with other\n\t// files that may use define, but not via a proper concatenation script that\n\t// understands anonymous AMD modules. A named AMD is safest and most robust\n\t// way to register. Lowercase jquery is used because AMD module names are\n\t// derived from file names, and jQuery is normally delivered in a lowercase\n\t// file name. Do this after creating the global so that if an AMD module wants\n\t// to call noConflict to hide this version of jQuery, it will work.\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( \"jquery\", [], function () { return jQuery; } );\n\t}\n}\n\n})( window );\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Scripts/jquery.validate-vsdoc.js",
    "content": "﻿/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*\n* This file has been commented to support Visual Studio Intellisense.\n* You should not use this file at runtime inside the browser--it is only\n* intended to be used only for design-time IntelliSense.  Please use the\n* standard jQuery library for all production use.\n*\n* Comment version: 1.11.1\n*/\n\n/*\n* Note: While Microsoft is not the author of this file, Microsoft is\n* offering you a license subject to the terms of the Microsoft Software\n* License Terms for Microsoft ASP.NET Model View Controller 3.\n* Microsoft reserves all other rights. The notices below are provided\n* for informational purposes only and are not the license terms under\n* which Microsoft distributed this file.\n*\n* jQuery Validation Plugin - v1.11.1 - 2/4/2013\n* https://github.com/jzaefferer/jquery-validation\n* Copyright (c) 2013 Jörn Zaefferer; Licensed MIT\n*\n*/\n\n(function($) {\n\n$.extend($.fn, {\n\t// http://docs.jquery.com/Plugins/Validation/validate\n\tvalidate: function( options ) {\n\t\t/// <summary>\n\t\t/// Validates the selected form. This method sets up event handlers for submit, focus,\n\t\t/// keyup, blur and click to trigger validation of the entire form or individual\n\t\t/// elements. Each one can be disabled, see the onxxx options (onsubmit, onfocusout,\n\t\t/// onkeyup, onclick). focusInvalid focuses elements when submitting a invalid form.\n\t\t/// </summary>\n\t\t/// <param name=\"options\" type=\"Object\">\n\t\t/// A set of key/value pairs that configure the validate. All options are optional.\n\t\t/// </param>\n\n\t\t// if nothing is selected, return nothing; can't chain anyway\n\t\tif (!this.length) {\n\t\t\toptions && options.debug && window.console && console.warn( \"nothing selected, can't validate, returning nothing\" );\n\t\t\treturn;\n\t\t}\n\n\t\t// check if a validator for this form was already created\n\t\tvar validator = $.data(this[0], 'validator');\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\t\t\n\t\tvalidator = new $.validator( options, this[0] );\n\t\t$.data(this[0], 'validator', validator); \n\t\t\n\t\tif ( validator.settings.onsubmit ) {\n\t\t\n\t\t\t// allow suppresing validation by adding a cancel class to the submit button\n\t\t\tthis.find(\"input, button\").filter(\".cancel\").click(function() {\n\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t});\n\t\t\t\n\t\t\t// when a submitHandler is used, capture the submitting button\n\t\t\tif (validator.settings.submitHandler) {\n\t\t\t\tthis.find(\"input, button\").filter(\":submit\").click(function() {\n\t\t\t\t\tvalidator.submitButton = this;\n\t\t\t\t});\n\t\t\t}\n\t\t\n\t\t\t// validate the form on submit\n\t\t\tthis.submit( function( event ) {\n\t\t\t\tif ( validator.settings.debug )\n\t\t\t\t\t// prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\n\t\t\t\tfunction handle() {\n\t\t\t\t\tif ( validator.settings.submitHandler ) {\n\t\t\t\t\t\tif (validator.submitButton) {\n\t\t\t\t\t\t\t// insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t\t\tvar hidden = $(\"<input type='hidden'/>\").attr(\"name\", validator.submitButton.name).val(validator.submitButton.value).appendTo(validator.currentForm);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalidator.settings.submitHandler.call( validator, validator.currentForm );\n\t\t\t\t\t\tif (validator.submitButton) {\n\t\t\t\t\t\t\t// and clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t// prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\treturn validator;\n\t},\n\t// http://docs.jquery.com/Plugins/Validation/valid\n\tvalid: function() {\n\t\t/// <summary>\n\t\t/// Checks if the selected form is valid or if all selected elements are valid.\n\t\t/// validate() needs to be called on the form before checking it using this method.\n\t\t/// </summary>\n\t\t/// <returns type=\"Boolean\" />\n\n        if ( $(this[0]).is('form')) {\n            return this.validate().form();\n        } else {\n            var valid = true;\n            var validator = $(this[0].form).validate();\n            this.each(function() {\n\t\t\t\tvalid &= validator.element(this);\n            });\n            return valid;\n        }\n    },\n\t// attributes: space seperated list of attributes to retrieve and remove\n\tremoveAttrs: function(attributes) {\n\t\t/// <summary>\n\t\t/// Remove the specified attributes from the first matched element and return them.\n\t\t/// </summary>\n\t\t/// <param name=\"attributes\" type=\"String\">\n\t\t/// A space-seperated list of attribute names to remove.\n\t\t/// </param>\n\n\t\tvar result = {},\n\t\t\t$element = this;\n\t\t$.each(attributes.split(/\\s/), function(index, value) {\n\t\t\tresult[value] = $element.attr(value);\n\t\t\t$element.removeAttr(value);\n\t\t});\n\t\treturn result;\n\t},\n\t// http://docs.jquery.com/Plugins/Validation/rules\n\trules: function(command, argument) {\n\t\t/// <summary>\n\t\t/// Return the validations rules for the first selected element.\n\t\t/// </summary>\n\t\t/// <param name=\"command\" type=\"String\">\n\t\t/// Can be either \"add\" or \"remove\".\n\t\t/// </param>\n\t\t/// <param name=\"argument\" type=\"\">\n\t\t/// A list of rules to add or remove.\n\t\t/// </param>\n\n\t\tvar element = this[0];\n\t\t\n\t\tif (command) {\n\t\t\tvar settings = $.data(element.form, 'validator').settings;\n\t\t\tvar staticRules = settings.rules;\n\t\t\tvar existingRules = $.validator.staticRules(element);\n\t\t\tswitch(command) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend(existingRules, $.validator.normalizeRule(argument));\n\t\t\t\tstaticRules[element.name] = existingRules;\n\t\t\t\tif (argument.messages)\n\t\t\t\t\tsettings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif (!argument) {\n\t\t\t\t\tdelete staticRules[element.name];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tvar filtered = {};\n\t\t\t\t$.each(argument.split(/\\s/), function(index, method) {\n\t\t\t\t\tfiltered[method] = existingRules[method];\n\t\t\t\t\tdelete existingRules[method];\n\t\t\t\t});\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\t\t\n\t\tvar data = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.metadataRules(element),\n\t\t\t$.validator.classRules(element),\n\t\t\t$.validator.attributeRules(element),\n\t\t\t$.validator.staticRules(element)\n\t\t), element);\n\t\t\n\t\t// make sure required is at front\n\t\tif (data.required) {\n\t\t\tvar param = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend({required: param}, data);\n\t\t}\n\t\t\n\t\treturn data;\n\t}\n});\n\n// Custom selectors\n$.extend($.expr[\":\"], {\n\t// http://docs.jquery.com/Plugins/Validation/blank\n\tblank: function(a) {return !$.trim(\"\" + a.value);},\n\t// http://docs.jquery.com/Plugins/Validation/filled\n\tfilled: function(a) {return !!$.trim(\"\" + a.value);},\n\t// http://docs.jquery.com/Plugins/Validation/unchecked\n\tunchecked: function(a) {return !a.checked;}\n});\n\n// constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n$.validator.format = function(source, params) {\n\t/// <summary>\n\t/// Replaces {n} placeholders with arguments.\n\t/// One or more arguments can be passed, in addition to the string template itself, to insert\n\t/// into the string.\n\t/// </summary>\n\t/// <param name=\"source\" type=\"String\">\n\t/// The string to format.\n\t/// </param>\n\t/// <param name=\"params\" type=\"String\">\n\t/// The first argument to insert, or an array of Strings to insert\n\t/// </param>\n\t/// <returns type=\"String\" />\n\n\tif ( arguments.length == 1 ) \n\t\treturn function() {\n\t\t\tvar args = $.makeArray(arguments);\n\t\t\targs.unshift(source);\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\tif ( arguments.length > 2 && params.constructor != Array  ) {\n\t\tparams = $.makeArray(arguments).slice(1);\n\t}\n\tif ( params.constructor != Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each(params, function(i, n) {\n\t\tsource = source.replace(new RegExp(\"\\\\{\" + i + \"\\\\}\", \"g\"), n);\n\t});\n\treturn source;\n};\n\n$.extend($.validator, {\n\t\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusInvalid: true,\n\t\terrorContainer: $( [] ),\n\t\terrorLabelContainer: $( [] ),\n\t\tonsubmit: true,\n\t\tignore: [],\n\t\tignoreTitle: false,\n\t\tonfocusin: function(element) {\n\t\t\tthis.lastActive = element;\n\t\t\t\t\n\t\t\t// hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup && !this.blockFocusCleanup ) {\n\t\t\t\tthis.settings.unhighlight && this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\tthis.addWrapper(this.errorsFor(element)).hide();\n\t\t\t}\n\t\t},\n\t\tonfocusout: function(element) {\n\t\t\tif ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {\n\t\t\t\tthis.element(element);\n\t\t\t}\n\t\t},\n\t\tonkeyup: function(element) {\n\t\t\tif ( element.name in this.submitted || element == this.lastElement ) {\n\t\t\t\tthis.element(element);\n\t\t\t}\n\t\t},\n\t\tonclick: function(element) {\n\t\t\t// click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted )\n\t\t\t\tthis.element(element);\n\t\t\t// or option elements, check parent select in that case\n\t\t\telse if (element.parentNode.name in this.submitted)\n\t\t\t\tthis.element(element.parentNode);\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\t$(element).addClass(errorClass).removeClass(validClass);\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\t$(element).removeClass(errorClass).addClass(validClass);\n\t\t}\n\t},\n\n\t// http://docs.jquery.com/Plugins/Validation/Validator/setDefaults\n\tsetDefaults: function(settings) {\n\t\t/// <summary>\n\t\t/// Modify default settings for validation.\n\t\t/// Accepts everything that Plugins/Validation/validate accepts.\n\t\t/// </summary>\n\t\t/// <param name=\"settings\" type=\"Options\">\n\t\t/// Options to set as default.\n\t\t/// </param>\n\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tcreditcard: \"Please enter a valid credit card number.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\taccept: \"Please enter a value with a valid extension.\",\n\t\tmaxlength: $.validator.format(\"Please enter no more than {0} characters.\"),\n\t\tminlength: $.validator.format(\"Please enter at least {0} characters.\"),\n\t\trangelength: $.validator.format(\"Please enter a value between {0} and {1} characters long.\"),\n\t\trange: $.validator.format(\"Please enter a value between {0} and {1}.\"),\n\t\tmax: $.validator.format(\"Please enter a value less than or equal to {0}.\"),\n\t\tmin: $.validator.format(\"Please enter a value greater than or equal to {0}.\")\n\t},\n\t\n\tautoCreateRanges: false,\n\t\n\tprototype: {\n\t\t\n\t\tinit: function() {\n\t\t\tthis.labelContainer = $(this.settings.errorLabelContainer);\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);\n\t\t\tthis.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\t\t\t\n\t\t\tvar groups = (this.groups = {});\n\t\t\t$.each(this.settings.groups, function(key, value) {\n\t\t\t\t$.each(value.split(/\\s/), function(index, name) {\n\t\t\t\t\tgroups[name] = key;\n\t\t\t\t});\n\t\t\t});\n\t\t\tvar rules = this.settings.rules;\n\t\t\t$.each(rules, function(key, value) {\n\t\t\t\trules[key] = $.validator.normalizeRule(value);\n\t\t\t});\n\t\t\t\n\t\t\tfunction delegate(event) {\n\t\t\t\tvar validator = $.data(this[0].form, \"validator\"),\n\t\t\t\t\teventType = \"on\" + event.type.replace(/^validate/, \"\");\n\t\t\t\tvalidator.settings[eventType] && validator.settings[eventType].call(validator, this[0] );\n\t\t\t}\n\t\t\t$(this.currentForm)\n\t\t\t\t.validateDelegate(\":text, :password, :file, select, textarea\", \"focusin focusout keyup\", delegate)\n\t\t\t\t.validateDelegate(\":radio, :checkbox, select, option\", \"click\", delegate);\n\n\t\t\tif (this.settings.invalidHandler)\n\t\t\t\t$(this.currentForm).bind(\"invalid-form.validate\", this.settings.invalidHandler);\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Validator/form\n\t\tform: function() {\n\t\t\t/// <summary>\n\t\t\t/// Validates the form, returns true if it is valid, false otherwise.\n\t\t\t/// This behaves as a normal submit event, but returns the result.\n\t\t\t/// </summary>\n\t\t\t/// <returns type=\"Boolean\" />\n\n\t\t\tthis.checkForm();\n\t\t\t$.extend(this.submitted, this.errorMap);\n\t\t\tthis.invalid = $.extend({}, this.errorMap);\n\t\t\tif (!this.valid())\n\t\t\t\t$(this.currentForm).triggerHandler(\"invalid-form\", [this]);\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\t\t\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {\n\t\t\t\tthis.check( elements[i] );\n\t\t\t}\n\t\t\treturn this.valid(); \n\t\t},\n\t\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Validator/element\n\t\telement: function( element ) {\n\t\t\t/// <summary>\n\t\t\t/// Validates a single element, returns true if it is valid, false otherwise.\n\t\t\t/// This behaves as validation on blur or keyup, but returns the result.\n\t\t\t/// </summary>\n\t\t\t/// <param name=\"element\" type=\"Selector\">\n\t\t\t/// An element to validate, must be inside the validated form.\n\t\t\t/// </param>\n\t\t\t/// <returns type=\"Boolean\" />\n\n\t\t\telement = this.clean( element );\n\t\t\tthis.lastElement = element;\n\t\t\tthis.prepareElement( element );\n\t\t\tthis.currentElements = $(element);\n\t\t\tvar result = this.check( element );\n\t\t\tif ( result ) {\n\t\t\t\tdelete this.invalid[element.name];\n\t\t\t} else {\n\t\t\t\tthis.invalid[element.name] = true;\n\t\t\t}\n\t\t\tif ( !this.numberOfInvalids() ) {\n\t\t\t\t// Hide error containers on last error\n\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn result;\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Validator/showErrors\n\t\tshowErrors: function(errors) {\n\t\t\t/// <summary>\n\t\t\t/// Show the specified messages.\n\t\t\t/// Keys have to refer to the names of elements, values are displayed for those elements, using the configured error placement.\n\t\t\t/// </summary>\n\t\t\t/// <param name=\"errors\" type=\"Object\">\n\t\t\t/// One or more key/value pairs of input names and messages.\n\t\t\t/// </param>\n\n\t\t\tif(errors) {\n\t\t\t\t// add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = [];\n\t\t\t\tfor ( var name in errors ) {\n\t\t\t\t\tthis.errorList.push({\n\t\t\t\t\t\tmessage: errors[name],\n\t\t\t\t\t\telement: this.findByName(name)[0]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function(element) {\n\t\t\t\t\treturn !(element.name in errors);\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.settings.showErrors\n\t\t\t\t? this.settings.showErrors.call( this, this.errorMap, this.errorList )\n\t\t\t\t: this.defaultShowErrors();\n\t\t},\n\t\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Validator/resetForm\n\t\tresetForm: function() {\n\t\t\t/// <summary>\n\t\t\t/// Resets the controlled form.\n\t\t\t/// Resets input fields to their original value (requires form plugin), removes classes\n\t\t\t/// indicating invalid elements and hides error messages.\n\t\t\t/// </summary>\n\n\t\t\tif ( $.fn.resetForm )\n\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\tthis.submitted = {};\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tthis.elements().removeClass( this.settings.errorClass );\n\t\t},\n\t\t\n\t\tnumberOfInvalids: function() {\n\t\t\t/// <summary>\n\t\t\t/// Returns the number of invalid fields.\n\t\t\t/// This depends on the internal validator state. It covers all fields only after\n\t\t\t/// validating the complete form (on submit or via $(\"form\").valid()). After validating\n\t\t\t/// a single element, only that element is counted. Most useful in combination with the\n\t\t\t/// invalidHandler-option.\n\t\t\t/// </summary>\n\t\t\t/// <returns type=\"Number\" />\n\n\t\t\treturn this.objectLength(this.invalid);\n\t\t},\n\t\t\n\t\tobjectLength: function( obj ) {\n\t\t\tvar count = 0;\n\t\t\tfor ( var i in obj )\n\t\t\t\tcount++;\n\t\t\treturn count;\n\t\t},\n\t\t\n\t\thideErrors: function() {\n\t\t\tthis.addWrapper( this.toHide ).hide();\n\t\t},\n\t\t\n\t\tvalid: function() {\n\t\t\treturn this.size() == 0;\n\t\t},\n\t\t\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\t\t\n\t\tfocusInvalid: function() {\n\t\t\tif( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$(this.findLastActive() || this.errorList.length && this.errorList[0].element || [])\n\t\t\t\t\t.filter(\":visible\")\n\t\t\t\t\t.focus()\n\t\t\t\t\t// manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger(\"focusin\");\n\t\t\t\t} catch(e) {\n\t\t\t\t\t// ignore IE throwing errors when focusing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep(this.errorList, function(n) {\n\t\t\t\treturn n.element.name == lastActive.name;\n\t\t\t}).length == 1 && lastActive;\n\t\t},\n\t\t\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {};\n\t\t\t\n\t\t\t// select all valid inputs inside the form (no submit or reset buttons)\n\t\t\t// workaround $Query([]).add until http://dev.jquery.com/ticket/2114 is solved\n\t\t\treturn $([]).add(this.currentForm.elements)\n\t\t\t.filter(\":input\")\n\t\t\t.not(\":submit, :reset, :image, [disabled]\")\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter(function() {\n\t\t\t\t!this.name && validator.settings.debug && window.console && console.error( \"%o has no name assigned\", this);\n\t\t\t\n\t\t\t\t// select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( this.name in rulesCache || !validator.objectLength($(this).rules()) )\n\t\t\t\t\treturn false;\n\t\t\t\t\n\t\t\t\trulesCache[this.name] = true;\n\t\t\t\treturn true;\n\t\t\t});\n\t\t},\n\t\t\n\t\tclean: function( selector ) {\n\t\t\treturn $( selector )[0];\n\t\t},\n\t\t\n\t\terrors: function() {\n\t\t\treturn $( this.settings.errorElement + \".\" + this.settings.errorClass, this.errorContext );\n\t\t},\n\t\t\n\t\treset: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $([]);\n\t\t\tthis.toHide = $([]);\n\t\t\tthis.currentElements = $([]);\n\t\t},\n\t\t\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\t\t\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor(element);\n\t\t},\n\t\n\t\tcheck: function( element ) {\n\t\t\telement = this.clean( element );\n\t\t\t\n\t\t\t// if radio/checkbox, validate first element in group instead\n\t\t\tif (this.checkable(element)) {\n\t\t\t    element = this.findByName(element.name).not(this.settings.ignore)[0];\n\t\t\t}\n\t\t\t\n\t\t\tvar rules = $(element).rules();\n\t\t\tvar dependencyMismatch = false;\n\t\t\tfor (var method in rules) {\n\t\t\t\tvar rule = { method: method, parameters: rules[method] };\n\t\t\t\ttry {\n\t\t\t\t\tvar result = $.validator.methods[method].call( this, element.value.replace(/\\r/g, \"\"), element, rule.parameters );\n\t\t\t\t\t\n\t\t\t\t\t// if a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result == \"dependency-mismatch\" ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\t\t\t\t\t\n\t\t\t\t\tif ( result == \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor(element) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t\tthis.settings.debug && window.console && console.log(\"exception occured when checking element \" + element.id\n\t\t\t\t\t\t + \", check the '\" + rule.method + \"' method\", e);\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (dependencyMismatch)\n\t\t\t\treturn;\n\t\t\tif ( this.objectLength(rules) )\n\t\t\t\tthis.successList.push(element);\n\t\t\treturn true;\n\t\t},\n\t\t\n\t\t// return the custom message for the given element and validation method\n\t\t// specified in the element's \"messages\" metadata\n\t\tcustomMetaMessage: function(element, method) {\n\t\t\tif (!$.metadata)\n\t\t\t\treturn;\n\t\t\t\n\t\t\tvar meta = this.settings.meta\n\t\t\t\t? $(element).metadata()[this.settings.meta]\n\t\t\t\t: $(element).metadata();\n\t\t\t\n\t\t\treturn meta && meta.messages && meta.messages[method];\n\t\t},\n\t\t\n\t\t// return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[name];\n\t\t\treturn m && (m.constructor == String\n\t\t\t\t? m\n\t\t\t\t: m[method]);\n\t\t},\n\t\t\n\t\t// return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor(var i = 0; i < arguments.length; i++) {\n\t\t\t\tif (arguments[i] !== undefined)\n\t\t\t\t\treturn arguments[i];\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\t\t\n\t\tdefaultMessage: function( element, method) {\n\t\t\treturn this.findDefined(\n\t\t\t\tthis.customMessage( element.name, method ),\n\t\t\t\tthis.customMetaMessage( element, method ),\n\t\t\t\t// title is never undefined, so handle empty string as undefined\n\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t$.validator.messages[method],\n\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t);\n\t\t},\n\t\t\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule.method ),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\tif ( typeof message == \"function\" ) {\n\t\t\t\tmessage = message.call(this, rule.parameters, element);\n\t\t\t} else if (theregex.test(message)) {\n\t\t\t\tmessage = jQuery.format(message.replace(theregex, '{$1}'), rule.parameters);\n\t\t\t}\t\t\t\n\t\t\tthis.errorList.push({\n\t\t\t\tmessage: message,\n\t\t\t\telement: element\n\t\t\t});\n\t\t\t\n\t\t\tthis.errorMap[element.name] = message;\n\t\t\tthis.submitted[element.name] = message;\n\t\t},\n\t\t\n\t\taddWrapper: function(toToggle) {\n\t\t\tif ( this.settings.wrapper )\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\treturn toToggle;\n\t\t},\n\t\t\n\t\tdefaultShowErrors: function() {\n\t\t\tfor ( var i = 0; this.errorList[i]; i++ ) {\n\t\t\t\tvar error = this.errorList[i];\n\t\t\t\tthis.settings.highlight && this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif (this.settings.success) {\n\t\t\t\tfor ( var i = 0; this.successList[i]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.settings.unhighlight) {\n\t\t\t\tfor ( var i = 0, elements = this.validElements(); elements[i]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\t\t\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not(this.invalidElements());\n\t\t},\n\t\t\n\t\tinvalidElements: function() {\n\t\t\treturn $(this.errorList).map(function() {\n\t\t\t\treturn this.element;\n\t\t\t});\n\t\t},\n\t\t\n\t\tshowLabel: function(element, message) {\n\t\t\tvar label = this.errorsFor( element );\n\t\t\tif ( label.length ) {\n\t\t\t\t// refresh error/success class\n\t\t\t\tlabel.removeClass().addClass( this.settings.errorClass );\n\t\t\t\n\t\t\t\t// check if we have a generated label, replace the message then\n\t\t\t\tlabel.attr(\"generated\") && label.html(message);\n\t\t\t} else {\n\t\t\t\t// create label\n\t\t\t\tlabel = $(\"<\" + this.settings.errorElement + \"/>\")\n\t\t\t\t\t.attr({\"for\":  this.idOrName(element), generated: true})\n\t\t\t\t\t.addClass(this.settings.errorClass)\n\t\t\t\t\t.html(message || \"\");\n\t\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\t\t// make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tlabel = label.hide().show().wrap(\"<\" + this.settings.wrapper + \"/>\").parent();\n\t\t\t\t}\n\t\t\t\tif ( !this.labelContainer.append(label).length )\n\t\t\t\t\tthis.settings.errorPlacement\n\t\t\t\t\t\t? this.settings.errorPlacement(label, $(element) )\n\t\t\t\t\t\t: label.insertAfter(element);\n\t\t\t}\n\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\tlabel.text(\"\");\n\t\t\t\ttypeof this.settings.success == \"string\"\n\t\t\t\t\t? label.addClass( this.settings.success )\n\t\t\t\t\t: this.settings.success( label );\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add(label);\n\t\t},\n\t\t\n\t\terrorsFor: function(element) {\n\t\t\tvar name = this.idOrName(element);\n    \t\treturn this.errors().filter(function() {\n\t\t\t\treturn $(this).attr('for') == name;\n\t\t\t});\n\t\t},\n\t\t\n\t\tidOrName: function(element) {\n\t\t\treturn this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn /radio|checkbox/i.test(element.type);\n\t\t},\n\t\t\n\t\tfindByName: function( name ) {\n\t\t\t// select by name and filter by form for performance over form.find(\"[name=...]\")\n\t\t\tvar form = this.currentForm;\n\t\t\treturn $(document.getElementsByName(name)).map(function(index, element) {\n\t\t\t\treturn element.form == form && element.name == name && element  || null;\n\t\t\t});\n\t\t},\n\t\t\n\t\tgetLength: function(value, element) {\n\t\t\tswitch( element.nodeName.toLowerCase() ) {\n\t\t\tcase 'select':\n\t\t\t\treturn $(\"option:selected\", element).length;\n\t\t\tcase 'input':\n\t\t\t\tif( this.checkable( element) )\n\t\t\t\t\treturn this.findByName(element.name).filter(':checked').length;\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\t\n\t\tdepend: function(param, element) {\n\t\t\treturn this.dependTypes[typeof param]\n\t\t\t\t? this.dependTypes[typeof param](param, element)\n\t\t\t\t: true;\n\t\t},\n\t\n\t\tdependTypes: {\n\t\t\t\"boolean\": function(param, element) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function(param, element) {\n\t\t\t\treturn !!$(param, element.form).length;\n\t\t\t},\n\t\t\t\"function\": function(param, element) {\n\t\t\t\treturn param(element);\n\t\t\t}\n\t\t},\n\t\t\n\t\toptional: function(element) {\n\t\t\treturn !$.validator.methods.required.call(this, $.trim(element.value), element) && \"dependency-mismatch\";\n\t\t},\n\t\t\n\t\tstartRequest: function(element) {\n\t\t\tif (!this.pending[element.name]) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\tthis.pending[element.name] = true;\n\t\t\t}\n\t\t},\n\t\t\n\t\tstopRequest: function(element, valid) {\n\t\t\tthis.pendingRequest--;\n\t\t\t// sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif (this.pendingRequest < 0)\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\tdelete this.pending[element.name];\n\t\t\tif ( valid && this.pendingRequest == 0 && this.formSubmitted && this.form() ) {\n\t\t\t\t$(this.currentForm).submit();\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if (!valid && this.pendingRequest == 0 && this.formSubmitted) {\n\t\t\t\t$(this.currentForm).triggerHandler(\"invalid-form\", [this]);\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\t\t\n\t\tpreviousValue: function(element) {\n\t\t\treturn $.data(element, \"previousValue\") || $.data(element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, \"remote\" )\n\t\t\t});\n\t\t}\n\t\t\n\t},\n\t\n\tclassRuleSettings: {\n\t\trequired: {required: true},\n\t\temail: {email: true},\n\t\turl: {url: true},\n\t\tdate: {date: true},\n\t\tdateISO: {dateISO: true},\n\t\tdateDE: {dateDE: true},\n\t\tnumber: {number: true},\n\t\tnumberDE: {numberDE: true},\n\t\tdigits: {digits: true},\n\t\tcreditcard: {creditcard: true}\n\t},\n\t\n\taddClassRules: function(className, rules) {\n\t\t/// <summary>\n\t\t/// Add a compound class method - useful to refactor common combinations of rules into a single\n\t\t/// class.\n\t\t/// </summary>\n\t\t/// <param name=\"name\" type=\"String\">\n\t\t/// The name of the class rule to add\n\t\t/// </param>\n\t\t/// <param name=\"rules\" type=\"Options\">\n\t\t/// The compound rules\n\t\t/// </param>\n\n\t\tclassName.constructor == String ?\n\t\t\tthis.classRuleSettings[className] = rules :\n\t\t\t$.extend(this.classRuleSettings, className);\n\t},\n\t\n\tclassRules: function(element) {\n\t\tvar rules = {};\n\t\tvar classes = $(element).attr('class');\n\t\tclasses && $.each(classes.split(' '), function() {\n\t\t\tif (this in $.validator.classRuleSettings) {\n\t\t\t\t$.extend(rules, $.validator.classRuleSettings[this]);\n\t\t\t}\n\t\t});\n\t\treturn rules;\n\t},\n\t\n\tattributeRules: function(element) {\n\t\tvar rules = {};\n\t\tvar $element = $(element);\n\n\t\tfor (var method in $.validator.methods) {\n\t\t\tvar value = $element.attr(method);\n\t\t\tif (value) {\n\t\t\t\trules[method] = value;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs\n\t\tif (rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength)) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\t\t\n\t\treturn rules;\n\t},\n\t\n\tmetadataRules: function(element) {\n\t\tif (!$.metadata) return {};\n\t\t\n\t\tvar meta = $.data(element.form, 'validator').settings.meta;\n\t\treturn meta ?\n\t\t\t$(element).metadata()[meta] :\n\t\t\t$(element).metadata();\n\t},\n\t\n\tstaticRules: function(element) {\n\t\tvar rules = {};\n\t\tvar validator = $.data(element.form, 'validator');\n\t\tif (validator.settings.rules) {\n\t\t\trules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\t\n\tnormalizeRules: function(rules, element) {\n\t\t// handle dependency check\n\t\t$.each(rules, function(prop, val) {\n\t\t\t// ignore rule when param is explicitly false, eg. required:false\n\t\t\tif (val === false) {\n\t\t\t\tdelete rules[prop];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (val.param || val.depends) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch (typeof val.depends) {\n\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\tkeepRule = !!$(val.depends, element.form).length;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"function\":\n\t\t\t\t\t\tkeepRule = val.depends.call(element, element);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (keepRule) {\n\t\t\t\t\trules[prop] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\tdelete rules[prop];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t\n\t\t// evaluate parameters\n\t\t$.each(rules, function(rule, parameter) {\n\t\t\trules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;\n\t\t});\n\t\t\n\t\t// clean number parameters\n\t\t$.each(['minlength', 'maxlength', 'min', 'max'], function() {\n\t\t\tif (rules[this]) {\n\t\t\t\trules[this] = Number(rules[this]);\n\t\t\t}\n\t\t});\n\t\t$.each(['rangelength', 'range'], function() {\n\t\t\tif (rules[this]) {\n\t\t\t\trules[this] = [Number(rules[this][0]), Number(rules[this][1])];\n\t\t\t}\n\t\t});\n\t\t\n\t\tif ($.validator.autoCreateRanges) {\n\t\t\t// auto-create ranges\n\t\t\tif (rules.min && rules.max) {\n\t\t\t\trules.range = [rules.min, rules.max];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif (rules.minlength && rules.maxlength) {\n\t\t\t\trules.rangelength = [rules.minlength, rules.maxlength];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\t\t\n\t\t// To support custom messages in metadata ignore rule methods titled \"messages\"\n\t\tif (rules.messages) {\n\t\t\tdelete rules.messages;\n\t\t}\n\t\t\n\t\treturn rules;\n\t},\n\t\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function(data) {\n\t\tif( typeof data == \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each(data.split(/\\s/), function() {\n\t\t\t\ttransformed[this] = true;\n\t\t\t});\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\t\n\t// http://docs.jquery.com/Plugins/Validation/Validator/addMethod\n\taddMethod: function(name, method, message) {\n\t\t/// <summary>\n\t\t/// Add a custom validation method. It must consist of a name (must be a legal javascript \n\t\t/// identifier), a javascript based function and a default string message.\n\t\t/// </summary>\n\t\t/// <param name=\"name\" type=\"String\">\n\t\t/// The name of the method, used to identify and referencing it, must be a valid javascript\n\t\t/// identifier\n\t\t/// </param>\n\t\t/// <param name=\"method\" type=\"Function\">\n\t\t/// The actual method implementation, returning true if an element is valid\n\t\t/// </param>\n\t\t/// <param name=\"message\" type=\"String\" optional=\"true\">\n\t\t/// (Optional) The default message to display for this method. Can be a function created by \n\t\t/// jQuery.validator.format(value). When undefined, an already existing message is used \n\t\t/// (handy for localization), otherwise the field-specific messages have to be defined.\n\t\t/// </param>\n\n\t\t$.validator.methods[name] = method;\n\t\t$.validator.messages[name] = message != undefined ? message : $.validator.messages[name];\n\t\tif (method.length < 3) {\n\t\t\t$.validator.addClassRules(name, $.validator.normalizeRule(name));\n\t\t}\n\t},\n\n\tmethods: {\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/required\n\t\trequired: function(value, element, param) {\n\t\t\t// check if dependency is met\n\t\t\tif ( !this.depend(param, element) )\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\tswitch( element.nodeName.toLowerCase() ) {\n\t\t\tcase 'select':\n\t\t\t\t// could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $(element).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\tcase 'input':\n\t\t\t\tif ( this.checkable(element) )\n\t\t\t\t\treturn this.getLength(value, element) > 0;\n\t\t\tdefault:\n\t\t\t\treturn $.trim(value).length > 0;\n\t\t\t}\n\t\t},\n\t\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/remote\n\t\tremote: function(value, element, param) {\n\t\t\tif ( this.optional(element) )\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t\n\t\t\tvar previous = this.previousValue(element);\n\t\t\tif (!this.settings.messages[element.name] )\n\t\t\t\tthis.settings.messages[element.name] = {};\n\t\t\tprevious.originalMessage = this.settings.messages[element.name].remote;\n\t\t\tthis.settings.messages[element.name].remote = previous.message;\n\t\t\t\n\t\t\tparam = typeof param == \"string\" && {url:param} || param; \n\t\t\t\n\t\t\tif ( this.pending[element.name] ) {\n\t\t\t\treturn \"pending\";\n\t\t\t}\n\t\t\tif ( previous.old === value ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = value;\n\t\t\tvar validator = this;\n\t\t\tthis.startRequest(element);\n\t\t\tvar data = {};\n\t\t\tdata[element.name] = value;\n\t\t\t$.ajax($.extend(true, {\n\t\t\t\turl: param,\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: \"validate\" + element.name,\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tsuccess: function(response) {\n\t\t\t\t\tvalidator.settings.messages[element.name].remote = previous.originalMessage;\n\t\t\t\t\tvar valid = response === true;\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tvar submitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.prepareElement(element);\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push(element);\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar errors = {};\n\t\t\t\t\t\tvar message = response || validator.defaultMessage(element, \"remote\");\n\t\t\t\t\t\terrors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;\n\t\t\t\t\t\tvalidator.showErrors(errors);\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest(element, valid);\n\t\t\t\t}\n\t\t\t}, param));\n\t\t\treturn \"pending\";\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/minlength\n\t\tminlength: function(value, element, param) {\n\t\t\treturn this.optional(element) || this.getLength($.trim(value), element) >= param;\n\t\t},\n\t\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/maxlength\n\t\tmaxlength: function(value, element, param) {\n\t\t\treturn this.optional(element) || this.getLength($.trim(value), element) <= param;\n\t\t},\n\t\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/rangelength\n\t\trangelength: function(value, element, param) {\n\t\t\tvar length = this.getLength($.trim(value), element);\n\t\t\treturn this.optional(element) || ( length >= param[0] && length <= param[1] );\n\t\t},\n\t\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/min\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional(element) || value >= param;\n\t\t},\n\t\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/max\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional(element) || value <= param;\n\t\t},\n\t\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/range\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional(element) || ( value >= param[0] && value <= param[1] );\n\t\t},\n\t\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/email\n\t\temail: function(value, element) {\n\t\t\t// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/\n\t\t\treturn this.optional(element) || /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?$/i.test(value);\n\t\t},\n\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/url\n\t\turl: function(value, element) {\n\t\t\t// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/\n\t\t\treturn this.optional(element) || /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i.test(value);\n\t\t},\n        \n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/date\n\t\tdate: function(value, element) {\n\t\t\treturn this.optional(element) || !/Invalid|NaN/.test(new Date(value));\n\t\t},\n\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/dateISO\n\t\tdateISO: function(value, element) {\n\t\t\treturn this.optional(element) || /^\\d{4}[\\/-]\\d{1,2}[\\/-]\\d{1,2}$/.test(value);\n\t\t},\n\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/number\n\t\tnumber: function(value, element) {\n\t\t\treturn this.optional(element) || /^-?(?:\\d+|\\d{1,3}(?:,\\d{3})+)(?:\\.\\d+)?$/.test(value);\n\t\t},\n\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/digits\n\t\tdigits: function(value, element) {\n\t\t\treturn this.optional(element) || /^\\d+$/.test(value);\n\t\t},\n\t\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/creditcard\n\t\t// based on http://en.wikipedia.org/wiki/Luhn\n\t\tcreditcard: function(value, element) {\n\t\t\tif ( this.optional(element) )\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t// accept only digits and dashes\n\t\t\tif (/[^0-9-]+/.test(value))\n\t\t\t\treturn false;\n\t\t\tvar nCheck = 0,\n\t\t\t\tnDigit = 0,\n\t\t\t\tbEven = false;\n\n\t\t\tvalue = value.replace(/\\D/g, \"\");\n\n\t\t\tfor (var n = value.length - 1; n >= 0; n--) {\n\t\t\t\tvar cDigit = value.charAt(n);\n\t\t\t\tvar nDigit = parseInt(cDigit, 10);\n\t\t\t\tif (bEven) {\n\t\t\t\t\tif ((nDigit *= 2) > 9)\n\t\t\t\t\t\tnDigit -= 9;\n\t\t\t\t}\n\t\t\t\tnCheck += nDigit;\n\t\t\t\tbEven = !bEven;\n\t\t\t}\n\n\t\t\treturn (nCheck % 10) == 0;\n\t\t},\n\t\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/accept\n\t\taccept: function(value, element, param) {\n\t\t\tparam = typeof param == \"string\" ? param.replace(/,/g, '|') : \"png|jpe?g|gif\";\n\t\t\treturn this.optional(element) || value.match(new RegExp(\".(\" + param + \")$\", \"i\")); \n\t\t},\n\t\t\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/equalTo\n\t\tequalTo: function(value, element, param) {\n\t\t\t// bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\t// TODO find a way to bind the event just once, avoiding the unbind-rebind overhead\n\t\t\tvar target = $(param).unbind(\".validate-equalTo\").bind(\"blur.validate-equalTo\", function() {\n\t\t\t\t$(element).valid();\n\t\t\t});\n\t\t\treturn value == target.val();\n\t\t}\n\t\t\n\t}\n\t\n});\n\n// deprecated, use $.validator.format instead\n$.format = $.validator.format;\n\n})(jQuery);\n\n// ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() \n;(function($) {\n\tvar pendingRequests = {};\n\t\t// Use a prefilter if available (1.5+)\n\tif ( $.ajaxPrefilter ) {\n\t\t$.ajaxPrefilter(function(settings, _, xhr) {\n\t\t    var port = settings.port;\n\t\t    if (settings.mode == \"abort\") {\n\t\t\t    if ( pendingRequests[port] ) {\n\t\t\t\t    pendingRequests[port].abort();\n\t\t\t    }\t\t\t\tpendingRequests[port] = xhr;\n\t\t    }\n\t    });\n\t} else {\n\t\t// Proxy ajax\n\t\tvar ajax = $.ajax;\n\t\t$.ajax = function(settings) {\n\t\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\t\tif (mode == \"abort\") {\n\t\t\t\tif ( pendingRequests[port] ) {\n\t\t\t\t\tpendingRequests[port].abort();\n\t\t\t\t}\n\n\t\t\t    return (pendingRequests[port] = ajax.apply(this, arguments));\n\t\t    }\n\t\t    return ajax.apply(this, arguments);\n\t    };\n    }\n})(jQuery);\n\n// provides cross-browser focusin and focusout events\n// IE has native support, in other browsers, use event caputuring (neither bubbles)\n\n// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation\n// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target \n;(function($) {\n\t// only implement if not provided by jQuery core (since 1.4)\n\t// TODO verify if jQuery 1.4's implementation is compatible with older jQuery special-event APIs\n\tif (!jQuery.event.special.focusin && !jQuery.event.special.focusout && document.addEventListener) {\n\t\t$.each({\n\t\t\tfocus: 'focusin',\n\t\t\tblur: 'focusout'\t\n\t\t}, function( original, fix ){\n\t\t\t$.event.special[fix] = {\n\t\t\t\tsetup:function() {\n\t\t\t\t\tthis.addEventListener( original, handler, true );\n\t\t\t\t},\n\t\t\t\tteardown:function() {\n\t\t\t\t\tthis.removeEventListener( original, handler, true );\n\t\t\t\t},\n\t\t\t\thandler: function(e) {\n\t\t\t\t\targuments[0] = $.event.fix(e);\n\t\t\t\t\targuments[0].type = fix;\n\t\t\t\t\treturn $.event.handle.apply(this, arguments);\n\t\t\t\t}\n\t\t\t};\n\t\t\tfunction handler(e) {\n\t\t\t\te = $.event.fix(e);\n\t\t\t\te.type = fix;\n\t\t\t\treturn $.event.handle.call(this, e);\n\t\t\t}\n\t\t});\n\t};\n\t$.extend($.fn, {\n\t\tvalidateDelegate: function(delegate, type, handler) {\n\t\t\treturn this.bind(type, function(event) {\n\t\t\t\tvar target = $(event.target);\n\t\t\t\tif (target.is(delegate)) {\n\t\t\t\t\treturn handler.apply(target, arguments);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n})(jQuery);\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Scripts/jquery.validate.js",
    "content": "﻿/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n * jQuery Validation Plugin 1.11.1\n *\n * http://bassistance.de/jquery-plugins/jquery-plugin-validation/\n * http://docs.jquery.com/Plugins/Validation\n *\n * Copyright 2013 Jörn Zaefferer\n * Released under the MIT license:\n *   http://www.opensource.org/licenses/mit-license.php\n */\n\n(function($) {\n\n$.extend($.fn, {\n\t// http://docs.jquery.com/Plugins/Validation/validate\n\tvalidate: function( options ) {\n\n\t\t// if nothing is selected, return nothing; can't chain anyway\n\t\tif ( !this.length ) {\n\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// check if a validator for this form was already created\n\t\tvar validator = $.data( this[0], \"validator\" );\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\n\t\t// Add novalidate tag if HTML5.\n\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\n\t\tvalidator = new $.validator( options, this[0] );\n\t\t$.data( this[0], \"validator\", validator );\n\n\t\tif ( validator.settings.onsubmit ) {\n\n\t\t\tthis.validateDelegate( \":submit\", \"click\", function( event ) {\n\t\t\t\tif ( validator.settings.submitHandler ) {\n\t\t\t\t\tvalidator.submitButton = event.target;\n\t\t\t\t}\n\t\t\t\t// allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\tif ( $(event.target).hasClass(\"cancel\") ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\n\t\t\t\t// allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\tif ( $(event.target).attr(\"formnovalidate\") !== undefined ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// validate the form on submit\n\t\t\tthis.submit( function( event ) {\n\t\t\t\tif ( validator.settings.debug ) {\n\t\t\t\t\t// prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t\tfunction handle() {\n\t\t\t\t\tvar hidden;\n\t\t\t\t\tif ( validator.settings.submitHandler ) {\n\t\t\t\t\t\tif ( validator.submitButton ) {\n\t\t\t\t\t\t\t// insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t\t\thidden = $(\"<input type='hidden'/>\").attr(\"name\", validator.submitButton.name).val( $(validator.submitButton).val() ).appendTo(validator.currentForm);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalidator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\tif ( validator.submitButton ) {\n\t\t\t\t\t\t\t// and clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn validator;\n\t},\n\t// http://docs.jquery.com/Plugins/Validation/valid\n\tvalid: function() {\n\t\tif ( $(this[0]).is(\"form\")) {\n\t\t\treturn this.validate().form();\n\t\t} else {\n\t\t\tvar valid = true;\n\t\t\tvar validator = $(this[0].form).validate();\n\t\t\tthis.each(function() {\n\t\t\t\tvalid = valid && validator.element(this);\n\t\t\t});\n\t\t\treturn valid;\n\t\t}\n\t},\n\t// attributes: space seperated list of attributes to retrieve and remove\n\tremoveAttrs: function( attributes ) {\n\t\tvar result = {},\n\t\t\t$element = this;\n\t\t$.each(attributes.split(/\\s/), function( index, value ) {\n\t\t\tresult[value] = $element.attr(value);\n\t\t\t$element.removeAttr(value);\n\t\t});\n\t\treturn result;\n\t},\n\t// http://docs.jquery.com/Plugins/Validation/rules\n\trules: function( command, argument ) {\n\t\tvar element = this[0];\n\n\t\tif ( command ) {\n\t\t\tvar settings = $.data(element.form, \"validator\").settings;\n\t\t\tvar staticRules = settings.rules;\n\t\t\tvar existingRules = $.validator.staticRules(element);\n\t\t\tswitch(command) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend(existingRules, $.validator.normalizeRule(argument));\n\t\t\t\t// remove messages from rules, but allow them to be set separetely\n\t\t\t\tdelete existingRules.messages;\n\t\t\t\tstaticRules[element.name] = existingRules;\n\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\tsettings.messages[element.name] = $.extend( settings.messages[element.name], argument.messages );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif ( !argument ) {\n\t\t\t\t\tdelete staticRules[element.name];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tvar filtered = {};\n\t\t\t\t$.each(argument.split(/\\s/), function( index, method ) {\n\t\t\t\t\tfiltered[method] = existingRules[method];\n\t\t\t\t\tdelete existingRules[method];\n\t\t\t\t});\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\n\t\tvar data = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.classRules(element),\n\t\t\t$.validator.attributeRules(element),\n\t\t\t$.validator.dataRules(element),\n\t\t\t$.validator.staticRules(element)\n\t\t), element);\n\n\t\t// make sure required is at front\n\t\tif ( data.required ) {\n\t\t\tvar param = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend({required: param}, data);\n\t\t}\n\n\t\treturn data;\n\t}\n});\n\n// Custom selectors\n$.extend($.expr[\":\"], {\n\t// http://docs.jquery.com/Plugins/Validation/blank\n\tblank: function( a ) { return !$.trim(\"\" + $(a).val()); },\n\t// http://docs.jquery.com/Plugins/Validation/filled\n\tfilled: function( a ) { return !!$.trim(\"\" + $(a).val()); },\n\t// http://docs.jquery.com/Plugins/Validation/unchecked\n\tunchecked: function( a ) { return !$(a).prop(\"checked\"); }\n});\n\n// constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n$.validator.format = function( source, params ) {\n\tif ( arguments.length === 1 ) {\n\t\treturn function() {\n\t\t\tvar args = $.makeArray(arguments);\n\t\t\targs.unshift(source);\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\t}\n\tif ( arguments.length > 2 && params.constructor !== Array  ) {\n\t\tparams = $.makeArray(arguments).slice(1);\n\t}\n\tif ( params.constructor !== Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each(params, function( i, n ) {\n\t\tsource = source.replace( new RegExp(\"\\\\{\" + i + \"\\\\}\", \"g\"), function() {\n\t\t\treturn n;\n\t\t});\n\t});\n\treturn source;\n};\n\n$.extend($.validator, {\n\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusInvalid: true,\n\t\terrorContainer: $([]),\n\t\terrorLabelContainer: $([]),\n\t\tonsubmit: true,\n\t\tignore: \":hidden\",\n\t\tignoreTitle: false,\n\t\tonfocusin: function( element, event ) {\n\t\t\tthis.lastActive = element;\n\n\t\t\t// hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup && !this.blockFocusCleanup ) {\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.addWrapper(this.errorsFor(element)).hide();\n\t\t\t}\n\t\t},\n\t\tonfocusout: function( element, event ) {\n\t\t\tif ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {\n\t\t\t\tthis.element(element);\n\t\t\t}\n\t\t},\n\t\tonkeyup: function( element, event ) {\n\t\t\tif ( event.which === 9 && this.elementValue(element) === \"\" ) {\n\t\t\t\treturn;\n\t\t\t} else if ( element.name in this.submitted || element === this.lastElement ) {\n\t\t\t\tthis.element(element);\n\t\t\t}\n\t\t},\n\t\tonclick: function( element, event ) {\n\t\t\t// click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\tthis.element(element);\n\t\t\t}\n\t\t\t// or option elements, check parent select in that case\n\t\t\telse if ( element.parentNode.name in this.submitted ) {\n\t\t\t\tthis.element(element.parentNode);\n\t\t\t}\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName(element.name).addClass(errorClass).removeClass(validClass);\n\t\t\t} else {\n\t\t\t\t$(element).addClass(errorClass).removeClass(validClass);\n\t\t\t}\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName(element.name).removeClass(errorClass).addClass(validClass);\n\t\t\t} else {\n\t\t\t\t$(element).removeClass(errorClass).addClass(validClass);\n\t\t\t}\n\t\t}\n\t},\n\n\t// http://docs.jquery.com/Plugins/Validation/Validator/setDefaults\n\tsetDefaults: function( settings ) {\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tcreditcard: \"Please enter a valid credit card number.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\tmaxlength: $.validator.format(\"Please enter no more than {0} characters.\"),\n\t\tminlength: $.validator.format(\"Please enter at least {0} characters.\"),\n\t\trangelength: $.validator.format(\"Please enter a value between {0} and {1} characters long.\"),\n\t\trange: $.validator.format(\"Please enter a value between {0} and {1}.\"),\n\t\tmax: $.validator.format(\"Please enter a value less than or equal to {0}.\"),\n\t\tmin: $.validator.format(\"Please enter a value greater than or equal to {0}.\")\n\t},\n\n\tautoCreateRanges: false,\n\n\tprototype: {\n\n\t\tinit: function() {\n\t\t\tthis.labelContainer = $(this.settings.errorLabelContainer);\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $(this.currentForm);\n\t\t\tthis.containers = $(this.settings.errorContainer).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\n\t\t\tvar groups = (this.groups = {});\n\t\t\t$.each(this.settings.groups, function( key, value ) {\n\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\tvalue = value.split(/\\s/);\n\t\t\t\t}\n\t\t\t\t$.each(value, function( index, name ) {\n\t\t\t\t\tgroups[name] = key;\n\t\t\t\t});\n\t\t\t});\n\t\t\tvar rules = this.settings.rules;\n\t\t\t$.each(rules, function( key, value ) {\n\t\t\t\trules[key] = $.validator.normalizeRule(value);\n\t\t\t});\n\n\t\t\tfunction delegate(event) {\n\t\t\t\tvar validator = $.data(this[0].form, \"validator\"),\n\t\t\t\t\teventType = \"on\" + event.type.replace(/^validate/, \"\");\n\t\t\t\tif ( validator.settings[eventType] ) {\n\t\t\t\t\tvalidator.settings[eventType].call(validator, this[0], event);\n\t\t\t\t}\n\t\t\t}\n\t\t\t$(this.currentForm)\n\t\t\t\t.validateDelegate(\":text, [type='password'], [type='file'], select, textarea, \" +\n\t\t\t\t\t\"[type='number'], [type='search'] ,[type='tel'], [type='url'], \" +\n\t\t\t\t\t\"[type='email'], [type='datetime'], [type='date'], [type='month'], \" +\n\t\t\t\t\t\"[type='week'], [type='time'], [type='datetime-local'], \" +\n\t\t\t\t\t\"[type='range'], [type='color'] \",\n\t\t\t\t\t\"focusin focusout keyup\", delegate)\n\t\t\t\t.validateDelegate(\"[type='radio'], [type='checkbox'], select, option\", \"click\", delegate);\n\n\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t$(this.currentForm).bind(\"invalid-form.validate\", this.settings.invalidHandler);\n\t\t\t}\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Validator/form\n\t\tform: function() {\n\t\t\tthis.checkForm();\n\t\t\t$.extend(this.submitted, this.errorMap);\n\t\t\tthis.invalid = $.extend({}, this.errorMap);\n\t\t\tif ( !this.valid() ) {\n\t\t\t\t$(this.currentForm).triggerHandler(\"invalid-form\", [this]);\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = (this.currentElements = this.elements()); elements[i]; i++ ) {\n\t\t\t\tthis.check( elements[i] );\n\t\t\t}\n\t\t\treturn this.valid();\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Validator/element\n\t\telement: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\t\t\tthis.lastElement = element;\n\t\t\tthis.prepareElement( element );\n\t\t\tthis.currentElements = $(element);\n\t\t\tvar result = this.check( element ) !== false;\n\t\t\tif ( result ) {\n\t\t\t\tdelete this.invalid[element.name];\n\t\t\t} else {\n\t\t\t\tthis.invalid[element.name] = true;\n\t\t\t}\n\t\t\tif ( !this.numberOfInvalids() ) {\n\t\t\t\t// Hide error containers on last error\n\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn result;\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Validator/showErrors\n\t\tshowErrors: function( errors ) {\n\t\t\tif ( errors ) {\n\t\t\t\t// add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = [];\n\t\t\t\tfor ( var name in errors ) {\n\t\t\t\t\tthis.errorList.push({\n\t\t\t\t\t\tmessage: errors[name],\n\t\t\t\t\t\telement: this.findByName(name)[0]\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\treturn !(element.name in errors);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t} else {\n\t\t\t\tthis.defaultShowErrors();\n\t\t\t}\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Validator/resetForm\n\t\tresetForm: function() {\n\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t$(this.currentForm).resetForm();\n\t\t\t}\n\t\t\tthis.submitted = {};\n\t\t\tthis.lastElement = null;\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tthis.elements().removeClass( this.settings.errorClass ).removeData( \"previousValue\" );\n\t\t},\n\n\t\tnumberOfInvalids: function() {\n\t\t\treturn this.objectLength(this.invalid);\n\t\t},\n\n\t\tobjectLength: function( obj ) {\n\t\t\tvar count = 0;\n\t\t\tfor ( var i in obj ) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\thideErrors: function() {\n\t\t\tthis.addWrapper( this.toHide ).hide();\n\t\t},\n\n\t\tvalid: function() {\n\t\t\treturn this.size() === 0;\n\t\t},\n\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\n\t\tfocusInvalid: function() {\n\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$(this.findLastActive() || this.errorList.length && this.errorList[0].element || [])\n\t\t\t\t\t.filter(\":visible\")\n\t\t\t\t\t.focus()\n\t\t\t\t\t// manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger(\"focusin\");\n\t\t\t\t} catch(e) {\n\t\t\t\t\t// ignore IE throwing errors when focusing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep(this.errorList, function( n ) {\n\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t}).length === 1 && lastActive;\n\t\t},\n\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {};\n\n\t\t\t// select all valid inputs inside the form (no submit or reset buttons)\n\t\t\treturn $(this.currentForm)\n\t\t\t.find(\"input, select, textarea\")\n\t\t\t.not(\":submit, :reset, :image, [disabled]\")\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter(function() {\n\t\t\t\tif ( !this.name && validator.settings.debug && window.console ) {\n\t\t\t\t\tconsole.error( \"%o has no name assigned\", this);\n\t\t\t\t}\n\n\t\t\t\t// select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( this.name in rulesCache || !validator.objectLength($(this).rules()) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trulesCache[this.name] = true;\n\t\t\t\treturn true;\n\t\t\t});\n\t\t},\n\n\t\tclean: function( selector ) {\n\t\t\treturn $(selector)[0];\n\t\t},\n\n\t\terrors: function() {\n\t\t\tvar errorClass = this.settings.errorClass.replace(\" \", \".\");\n\t\t\treturn $(this.settings.errorElement + \".\" + errorClass, this.errorContext);\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $([]);\n\t\t\tthis.toHide = $([]);\n\t\t\tthis.currentElements = $([]);\n\t\t},\n\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor(element);\n\t\t},\n\n\t\telementValue: function( element ) {\n\t\t\tvar type = $(element).attr(\"type\"),\n\t\t\t\tval = $(element).val();\n\n\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\treturn $(\"input[name='\" + $(element).attr(\"name\") + \"']:checked\").val();\n\t\t\t}\n\n\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\treturn val.replace(/\\r/g, \"\");\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\tcheck: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\n\t\t\tvar rules = $(element).rules();\n\t\t\tvar dependencyMismatch = false;\n\t\t\tvar val = this.elementValue(element);\n\t\t\tvar result;\n\n\t\t\tfor (var method in rules ) {\n\t\t\t\tvar rule = { method: method, parameters: rules[method] };\n\t\t\t\ttry {\n\n\t\t\t\t\tresult = $.validator.methods[method].call( this, val, element, rule.parameters );\n\n\t\t\t\t\t// if a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result === \"dependency-mismatch\" ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\n\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor(element) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t}\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( dependencyMismatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.objectLength(rules) ) {\n\t\t\t\tthis.successList.push(element);\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t// return the custom message for the given element and validation method\n\t\t// specified in the element's HTML5 data attribute\n\t\tcustomDataMessage: function( element, method ) {\n\t\t\treturn $(element).data(\"msg-\" + method.toLowerCase()) || (element.attributes && $(element).attr(\"data-msg-\" + method.toLowerCase()));\n\t\t},\n\n\t\t// return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[name];\n\t\t\treturn m && (m.constructor === String ? m : m[method]);\n\t\t},\n\n\t\t// return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor(var i = 0; i < arguments.length; i++) {\n\t\t\t\tif ( arguments[i] !== undefined ) {\n\t\t\t\t\treturn arguments[i];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\n\t\tdefaultMessage: function( element, method ) {\n\t\t\treturn this.findDefined(\n\t\t\t\tthis.customMessage( element.name, method ),\n\t\t\t\tthis.customDataMessage( element, method ),\n\t\t\t\t// title is never undefined, so handle empty string as undefined\n\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t$.validator.messages[method],\n\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t);\n\t\t},\n\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule.method ),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\tmessage = message.call(this, rule.parameters, element);\n\t\t\t} else if (theregex.test(message)) {\n\t\t\t\tmessage = $.validator.format(message.replace(theregex, \"{$1}\"), rule.parameters);\n\t\t\t}\n\t\t\tthis.errorList.push({\n\t\t\t\tmessage: message,\n\t\t\t\telement: element\n\t\t\t});\n\n\t\t\tthis.errorMap[element.name] = message;\n\t\t\tthis.submitted[element.name] = message;\n\t\t},\n\n\t\taddWrapper: function( toToggle ) {\n\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t}\n\t\t\treturn toToggle;\n\t\t},\n\n\t\tdefaultShowErrors: function() {\n\t\t\tvar i, elements;\n\t\t\tfor ( i = 0; this.errorList[i]; i++ ) {\n\t\t\t\tvar error = this.errorList[i];\n\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif ( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif ( this.settings.success ) {\n\t\t\t\tfor ( i = 0; this.successList[i]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[i] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[i]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[i], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not(this.invalidElements());\n\t\t},\n\n\t\tinvalidElements: function() {\n\t\t\treturn $(this.errorList).map(function() {\n\t\t\t\treturn this.element;\n\t\t\t});\n\t\t},\n\n\t\tshowLabel: function( element, message ) {\n\t\t\tvar label = this.errorsFor( element );\n\t\t\tif ( label.length ) {\n\t\t\t\t// refresh error/success class\n\t\t\t\tlabel.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\t\t\t\t// replace message on existing label\n\t\t\t\tlabel.html(message);\n\t\t\t} else {\n\t\t\t\t// create label\n\t\t\t\tlabel = $(\"<\" + this.settings.errorElement + \">\")\n\t\t\t\t\t.attr(\"for\", this.idOrName(element))\n\t\t\t\t\t.addClass(this.settings.errorClass)\n\t\t\t\t\t.html(message || \"\");\n\t\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\t\t// make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tlabel = label.hide().show().wrap(\"<\" + this.settings.wrapper + \"/>\").parent();\n\t\t\t\t}\n\t\t\t\tif ( !this.labelContainer.append(label).length ) {\n\t\t\t\t\tif ( this.settings.errorPlacement ) {\n\t\t\t\t\t\tthis.settings.errorPlacement(label, $(element) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlabel.insertAfter(element);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\tlabel.text(\"\");\n\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\tlabel.addClass( this.settings.success );\n\t\t\t\t} else {\n\t\t\t\t\tthis.settings.success( label, element );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add(label);\n\t\t},\n\n\t\terrorsFor: function( element ) {\n\t\t\tvar name = this.idOrName(element);\n\t\t\treturn this.errors().filter(function() {\n\t\t\t\treturn $(this).attr(\"for\") === name;\n\t\t\t});\n\t\t},\n\n\t\tidOrName: function( element ) {\n\t\t\treturn this.groups[element.name] || (this.checkable(element) ? element.name : element.id || element.name);\n\t\t},\n\n\t\tvalidationTargetFor: function( element ) {\n\t\t\t// if radio/checkbox, validate first element in group instead\n\t\t\tif ( this.checkable(element) ) {\n\t\t\t\telement = this.findByName( element.name ).not(this.settings.ignore)[0];\n\t\t\t}\n\t\t\treturn element;\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn (/radio|checkbox/i).test(element.type);\n\t\t},\n\n\t\tfindByName: function( name ) {\n\t\t\treturn $(this.currentForm).find(\"[name='\" + name + \"']\");\n\t\t},\n\n\t\tgetLength: function( value, element ) {\n\t\t\tswitch( element.nodeName.toLowerCase() ) {\n\t\t\tcase \"select\":\n\t\t\t\treturn $(\"option:selected\", element).length;\n\t\t\tcase \"input\":\n\t\t\t\tif ( this.checkable( element) ) {\n\t\t\t\t\treturn this.findByName(element.name).filter(\":checked\").length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\n\t\tdepend: function( param, element ) {\n\t\t\treturn this.dependTypes[typeof param] ? this.dependTypes[typeof param](param, element) : true;\n\t\t},\n\n\t\tdependTypes: {\n\t\t\t\"boolean\": function( param, element ) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function( param, element ) {\n\t\t\t\treturn !!$(param, element.form).length;\n\t\t\t},\n\t\t\t\"function\": function( param, element ) {\n\t\t\t\treturn param(element);\n\t\t\t}\n\t\t},\n\n\t\toptional: function( element ) {\n\t\t\tvar val = this.elementValue(element);\n\t\t\treturn !$.validator.methods.required.call(this, val, element) && \"dependency-mismatch\";\n\t\t},\n\n\t\tstartRequest: function( element ) {\n\t\t\tif ( !this.pending[element.name] ) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\tthis.pending[element.name] = true;\n\t\t\t}\n\t\t},\n\n\t\tstopRequest: function( element, valid ) {\n\t\t\tthis.pendingRequest--;\n\t\t\t// sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t}\n\t\t\tdelete this.pending[element.name];\n\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {\n\t\t\t\t$(this.currentForm).submit();\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if (!valid && this.pendingRequest === 0 && this.formSubmitted) {\n\t\t\t\t$(this.currentForm).triggerHandler(\"invalid-form\", [this]);\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\n\t\tpreviousValue: function( element ) {\n\t\t\treturn $.data(element, \"previousValue\") || $.data(element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, \"remote\" )\n\t\t\t});\n\t\t}\n\n\t},\n\n\tclassRuleSettings: {\n\t\trequired: {required: true},\n\t\temail: {email: true},\n\t\turl: {url: true},\n\t\tdate: {date: true},\n\t\tdateISO: {dateISO: true},\n\t\tnumber: {number: true},\n\t\tdigits: {digits: true},\n\t\tcreditcard: {creditcard: true}\n\t},\n\n\taddClassRules: function( className, rules ) {\n\t\tif ( className.constructor === String ) {\n\t\t\tthis.classRuleSettings[className] = rules;\n\t\t} else {\n\t\t\t$.extend(this.classRuleSettings, className);\n\t\t}\n\t},\n\n\tclassRules: function( element ) {\n\t\tvar rules = {};\n\t\tvar classes = $(element).attr(\"class\");\n\t\tif ( classes ) {\n\t\t\t$.each(classes.split(\" \"), function() {\n\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t$.extend(rules, $.validator.classRuleSettings[this]);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn rules;\n\t},\n\n\tattributeRules: function( element ) {\n\t\tvar rules = {};\n\t\tvar $element = $(element);\n\t\tvar type = $element[0].getAttribute(\"type\");\n\n\t\tfor (var method in $.validator.methods) {\n\t\t\tvar value;\n\n\t\t\t// support for <input required> in both html5 and older browsers\n\t\t\tif ( method === \"required\" ) {\n\t\t\t\tvalue = $element.get(0).getAttribute(method);\n\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\t\t\t\t// force non-HTML5 browsers to return bool\n\t\t\t\tvalue = !!value;\n\t\t\t} else {\n\t\t\t\tvalue = $element.attr(method);\n\t\t\t}\n\n\t\t\t// convert the value to a number for number inputs, and for text for backwards compability\n\t\t\t// allows type=\"date\" and others to be compared as strings\n\t\t\tif ( /min|max/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\t\tvalue = Number(value);\n\t\t\t}\n\n\t\t\tif ( value ) {\n\t\t\t\trules[method] = value;\n\t\t\t} else if ( type === method && type !== 'range' ) {\n\t\t\t\t// exception: the jquery validate 'range' method\n\t\t\t\t// does not test for the html5 'range' type\n\t\t\t\trules[method] = true;\n\t\t\t}\n\t\t}\n\n\t\t// maxlength may be returned as -1, 2147483647 (IE) and 524288 (safari) for text inputs\n\t\tif ( rules.maxlength && /-1|2147483647|524288/.test(rules.maxlength) ) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\tdataRules: function( element ) {\n\t\tvar method, value,\n\t\t\trules = {}, $element = $(element);\n\t\tfor (method in $.validator.methods) {\n\t\t\tvalue = $element.data(\"rule-\" + method.toLowerCase());\n\t\t\tif ( value !== undefined ) {\n\t\t\t\trules[method] = value;\n\t\t\t}\n\t\t}\n\t\treturn rules;\n\t},\n\n\tstaticRules: function( element ) {\n\t\tvar rules = {};\n\t\tvar validator = $.data(element.form, \"validator\");\n\t\tif ( validator.settings.rules ) {\n\t\t\trules = $.validator.normalizeRule(validator.settings.rules[element.name]) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeRules: function( rules, element ) {\n\t\t// handle dependency check\n\t\t$.each(rules, function( prop, val ) {\n\t\t\t// ignore rule when param is explicitly false, eg. required:false\n\t\t\tif ( val === false ) {\n\t\t\t\tdelete rules[prop];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( val.param || val.depends ) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch (typeof val.depends) {\n\t\t\t\tcase \"string\":\n\t\t\t\t\tkeepRule = !!$(val.depends, element.form).length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"function\":\n\t\t\t\t\tkeepRule = val.depends.call(element, element);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( keepRule ) {\n\t\t\t\t\trules[prop] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\tdelete rules[prop];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// evaluate parameters\n\t\t$.each(rules, function( rule, parameter ) {\n\t\t\trules[rule] = $.isFunction(parameter) ? parameter(element) : parameter;\n\t\t});\n\n\t\t// clean number parameters\n\t\t$.each(['minlength', 'maxlength'], function() {\n\t\t\tif ( rules[this] ) {\n\t\t\t\trules[this] = Number(rules[this]);\n\t\t\t}\n\t\t});\n\t\t$.each(['rangelength', 'range'], function() {\n\t\t\tvar parts;\n\t\t\tif ( rules[this] ) {\n\t\t\t\tif ( $.isArray(rules[this]) ) {\n\t\t\t\t\trules[this] = [Number(rules[this][0]), Number(rules[this][1])];\n\t\t\t\t} else if ( typeof rules[this] === \"string\" ) {\n\t\t\t\t\tparts = rules[this].split(/[\\s,]+/);\n\t\t\t\t\trules[this] = [Number(parts[0]), Number(parts[1])];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif ( $.validator.autoCreateRanges ) {\n\t\t\t// auto-create ranges\n\t\t\tif ( rules.min && rules.max ) {\n\t\t\t\trules.range = [rules.min, rules.max];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif ( rules.minlength && rules.maxlength ) {\n\t\t\t\trules.rangelength = [rules.minlength, rules.maxlength];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function( data ) {\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each(data.split(/\\s/), function() {\n\t\t\t\ttransformed[this] = true;\n\t\t\t});\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\n\t// http://docs.jquery.com/Plugins/Validation/Validator/addMethod\n\taddMethod: function( name, method, message ) {\n\t\t$.validator.methods[name] = method;\n\t\t$.validator.messages[name] = message !== undefined ? message : $.validator.messages[name];\n\t\tif ( method.length < 3 ) {\n\t\t\t$.validator.addClassRules(name, $.validator.normalizeRule(name));\n\t\t}\n\t},\n\n\tmethods: {\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/required\n\t\trequired: function( value, element, param ) {\n\t\t\t// check if dependency is met\n\t\t\tif ( !this.depend(param, element) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\t\t\t\t// could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $(element).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\t}\n\t\t\tif ( this.checkable(element) ) {\n\t\t\t\treturn this.getLength(value, element) > 0;\n\t\t\t}\n\t\t\treturn $.trim(value).length > 0;\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/email\n\t\temail: function( value, element ) {\n\t\t\t// contributed by Scott Gonzalez: http://projects.scottsplayground.com/email_address_validation/\n\t\t\treturn this.optional(element) || /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i.test(value);\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/url\n\t\turl: function( value, element ) {\n\t\t\t// contributed by Scott Gonzalez: http://projects.scottsplayground.com/iri/\n\t\t\treturn this.optional(element) || /^(https?|s?ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i.test(value);\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/date\n\t\tdate: function( value, element ) {\n\t\t\treturn this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString());\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/dateISO\n\t\tdateISO: function( value, element ) {\n\t\t\treturn this.optional(element) || /^\\d{4}[\\/\\-]\\d{1,2}[\\/\\-]\\d{1,2}$/.test(value);\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/number\n\t\tnumber: function( value, element ) {\n\t\t\treturn this.optional(element) || /^-?(?:\\d+|\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test(value);\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/digits\n\t\tdigits: function( value, element ) {\n\t\t\treturn this.optional(element) || /^\\d+$/.test(value);\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/creditcard\n\t\t// based on http://en.wikipedia.org/wiki/Luhn\n\t\tcreditcard: function( value, element ) {\n\t\t\tif ( this.optional(element) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\t// accept only spaces, digits and dashes\n\t\t\tif ( /[^0-9 \\-]+/.test(value) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar nCheck = 0,\n\t\t\t\tnDigit = 0,\n\t\t\t\tbEven = false;\n\n\t\t\tvalue = value.replace(/\\D/g, \"\");\n\n\t\t\tfor (var n = value.length - 1; n >= 0; n--) {\n\t\t\t\tvar cDigit = value.charAt(n);\n\t\t\t\tnDigit = parseInt(cDigit, 10);\n\t\t\t\tif ( bEven ) {\n\t\t\t\t\tif ( (nDigit *= 2) > 9 ) {\n\t\t\t\t\t\tnDigit -= 9;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tnCheck += nDigit;\n\t\t\t\tbEven = !bEven;\n\t\t\t}\n\n\t\t\treturn (nCheck % 10) === 0;\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/minlength\n\t\tminlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element);\n\t\t\treturn this.optional(element) || length >= param;\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/maxlength\n\t\tmaxlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element);\n\t\t\treturn this.optional(element) || length <= param;\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/rangelength\n\t\trangelength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength($.trim(value), element);\n\t\t\treturn this.optional(element) || ( length >= param[0] && length <= param[1] );\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/min\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional(element) || value >= param;\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/max\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional(element) || value <= param;\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/range\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional(element) || ( value >= param[0] && value <= param[1] );\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/equalTo\n\t\tequalTo: function( value, element, param ) {\n\t\t\t// bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\t// TODO find a way to bind the event just once, avoiding the unbind-rebind overhead\n\t\t\tvar target = $(param);\n\t\t\tif ( this.settings.onfocusout ) {\n\t\t\t\ttarget.unbind(\".validate-equalTo\").bind(\"blur.validate-equalTo\", function() {\n\t\t\t\t\t$(element).valid();\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn value === target.val();\n\t\t},\n\n\t\t// http://docs.jquery.com/Plugins/Validation/Methods/remote\n\t\tremote: function( value, element, param ) {\n\t\t\tif ( this.optional(element) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\n\t\t\tvar previous = this.previousValue(element);\n\t\t\tif (!this.settings.messages[element.name] ) {\n\t\t\t\tthis.settings.messages[element.name] = {};\n\t\t\t}\n\t\t\tprevious.originalMessage = this.settings.messages[element.name].remote;\n\t\t\tthis.settings.messages[element.name].remote = previous.message;\n\n\t\t\tparam = typeof param === \"string\" && {url:param} || param;\n\n\t\t\tif ( previous.old === value ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = value;\n\t\t\tvar validator = this;\n\t\t\tthis.startRequest(element);\n\t\t\tvar data = {};\n\t\t\tdata[element.name] = value;\n\t\t\t$.ajax($.extend(true, {\n\t\t\t\turl: param,\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: \"validate\" + element.name,\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\tvalidator.settings.messages[element.name].remote = previous.originalMessage;\n\t\t\t\t\tvar valid = response === true || response === \"true\";\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tvar submitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.prepareElement(element);\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push(element);\n\t\t\t\t\t\tdelete validator.invalid[element.name];\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar errors = {};\n\t\t\t\t\t\tvar message = response || validator.defaultMessage( element, \"remote\" );\n\t\t\t\t\t\terrors[element.name] = previous.message = $.isFunction(message) ? message(value) : message;\n\t\t\t\t\t\tvalidator.invalid[element.name] = true;\n\t\t\t\t\t\tvalidator.showErrors(errors);\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest(element, valid);\n\t\t\t\t}\n\t\t\t}, param));\n\t\t\treturn \"pending\";\n\t\t}\n\n\t}\n\n});\n\n// deprecated, use $.validator.format instead\n$.format = $.validator.format;\n\n}(jQuery));\n\n// ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n(function($) {\n\tvar pendingRequests = {};\n\t// Use a prefilter if available (1.5+)\n\tif ( $.ajaxPrefilter ) {\n\t\t$.ajaxPrefilter(function( settings, _, xhr ) {\n\t\t\tvar port = settings.port;\n\t\t\tif ( settings.mode === \"abort\" ) {\n\t\t\t\tif ( pendingRequests[port] ) {\n\t\t\t\t\tpendingRequests[port].abort();\n\t\t\t\t}\n\t\t\t\tpendingRequests[port] = xhr;\n\t\t\t}\n\t\t});\n\t} else {\n\t\t// Proxy ajax\n\t\tvar ajax = $.ajax;\n\t\t$.ajax = function( settings ) {\n\t\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\t\tif ( mode === \"abort\" ) {\n\t\t\t\tif ( pendingRequests[port] ) {\n\t\t\t\t\tpendingRequests[port].abort();\n\t\t\t\t}\n\t\t\t\tpendingRequests[port] = ajax.apply(this, arguments);\n\t\t\t\treturn pendingRequests[port];\n\t\t\t}\n\t\t\treturn ajax.apply(this, arguments);\n\t\t};\n\t}\n}(jQuery));\n\n// provides delegate(type: String, delegate: Selector, handler: Callback) plugin for easier event delegation\n// handler is only called when $(event.target).is(delegate), in the scope of the jquery-object for event.target\n(function($) {\n\t$.extend($.fn, {\n\t\tvalidateDelegate: function( delegate, type, handler ) {\n\t\t\treturn this.bind(type, function( event ) {\n\t\t\t\tvar target = $(event.target);\n\t\t\t\tif ( target.is(delegate) ) {\n\t\t\t\t\treturn handler.apply(target, arguments);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n}(jQuery));\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Scripts/jquery.validate.unobtrusive.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*!\n** Unobtrusive validation support library for jQuery and jQuery Validate\n** Copyright (C) Microsoft Corporation. All rights reserved.\n*/\n\n/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */\n/*global document: false, jQuery: false */\n\n(function ($) {\n    var $jQval = $.validator,\n        adapters,\n        data_validation = \"unobtrusiveValidation\";\n\n    function setValidationValues(options, ruleName, value) {\n        options.rules[ruleName] = value;\n        if (options.message) {\n            options.messages[ruleName] = options.message;\n        }\n    }\n\n    function splitAndTrim(value) {\n        return value.replace(/^\\s+|\\s+$/g, \"\").split(/\\s*,\\s*/g);\n    }\n\n    function escapeAttributeValue(value) {\n        // As mentioned on http://api.jquery.com/category/selectors/\n        return value.replace(/([!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n    }\n\n    function getModelPrefix(fieldName) {\n        return fieldName.substr(0, fieldName.lastIndexOf(\".\") + 1);\n    }\n\n    function appendModelPrefix(value, prefix) {\n        if (value.indexOf(\"*.\") === 0) {\n            value = value.replace(\"*.\", prefix);\n        }\n        return value;\n    }\n\n    function onError(error, inputElement) {  // 'this' is the form element\n        var container = $(this).find(\"[data-valmsg-for='\" + escapeAttributeValue(inputElement[0].name) + \"']\"),\n            replaceAttrValue = container.attr(\"data-valmsg-replace\"),\n            replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;\n\n        container.removeClass(\"field-validation-valid\").addClass(\"field-validation-error\");\n        error.data(\"unobtrusiveContainer\", container);\n\n        if (replace) {\n            container.empty();\n            error.removeClass(\"input-validation-error\").appendTo(container);\n        }\n        else {\n            error.hide();\n        }\n    }\n\n    function onErrors(event, validator) {  // 'this' is the form element\n        var container = $(this).find(\"[data-valmsg-summary=true]\"),\n            list = container.find(\"ul\");\n\n        if (list && list.length && validator.errorList.length) {\n            list.empty();\n            container.addClass(\"validation-summary-errors\").removeClass(\"validation-summary-valid\");\n\n            $.each(validator.errorList, function () {\n                $(\"<li />\").html(this.message).appendTo(list);\n            });\n        }\n    }\n\n    function onSuccess(error) {  // 'this' is the form element\n        var container = error.data(\"unobtrusiveContainer\"),\n            replaceAttrValue = container.attr(\"data-valmsg-replace\"),\n            replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;\n\n        if (container) {\n            container.addClass(\"field-validation-valid\").removeClass(\"field-validation-error\");\n            error.removeData(\"unobtrusiveContainer\");\n\n            if (replace) {\n                container.empty();\n            }\n        }\n    }\n\n    function onReset(event) {  // 'this' is the form element\n        var $form = $(this),\n            key = '__jquery_unobtrusive_validation_form_reset';\n        if ($form.data(key)) {\n            return;\n        }\n        // Set a flag that indicates we're currently resetting the form.\n        $form.data(key, true);\n        try {\n            $form.data(\"validator\").resetForm();\n        } finally {\n            $form.removeData(key);\n        }\n\n        $form.find(\".validation-summary-errors\")\n            .addClass(\"validation-summary-valid\")\n            .removeClass(\"validation-summary-errors\");\n        $form.find(\".field-validation-error\")\n            .addClass(\"field-validation-valid\")\n            .removeClass(\"field-validation-error\")\n            .removeData(\"unobtrusiveContainer\")\n            .find(\">*\")  // If we were using valmsg-replace, get the underlying error\n                .removeData(\"unobtrusiveContainer\");\n    }\n\n    function validationInfo(form) {\n        var $form = $(form),\n            result = $form.data(data_validation),\n            onResetProxy = $.proxy(onReset, form),\n            defaultOptions = $jQval.unobtrusive.options || {},\n            execInContext = function (name, args) {\n                var func = defaultOptions[name];\n                func && $.isFunction(func) && func.apply(form, args);\n            }\n\n        if (!result) {\n            result = {\n                options: {  // options structure passed to jQuery Validate's validate() method\n                    errorClass: defaultOptions.errorClass || \"input-validation-error\",\n                    errorElement: defaultOptions.errorElement || \"span\",\n                    errorPlacement: function () {\n                        onError.apply(form, arguments);\n                        execInContext(\"errorPlacement\", arguments);\n                    },\n                    invalidHandler: function () {\n                        onErrors.apply(form, arguments);\n                        execInContext(\"invalidHandler\", arguments);\n                    },\n                    messages: {},\n                    rules: {},\n                    success: function () {\n                        onSuccess.apply(form, arguments);\n                        execInContext(\"success\", arguments);\n                    }\n                },\n                attachValidation: function () {\n                    $form\n                        .off(\"reset.\" + data_validation, onResetProxy)\n                        .on(\"reset.\" + data_validation, onResetProxy)\n                        .validate(this.options);\n                },\n                validate: function () {  // a validation function that is called by unobtrusive Ajax\n                    $form.validate();\n                    return $form.valid();\n                }\n            };\n            $form.data(data_validation, result);\n        }\n\n        return result;\n    }\n\n    $jQval.unobtrusive = {\n        adapters: [],\n\n        parseElement: function (element, skipAttach) {\n            /// <summary>\n            /// Parses a single HTML element for unobtrusive validation attributes.\n            /// </summary>\n            /// <param name=\"element\" domElement=\"true\">The HTML element to be parsed.</param>\n            /// <param name=\"skipAttach\" type=\"Boolean\">[Optional] true to skip attaching the\n            /// validation to the form. If parsing just this single element, you should specify true.\n            /// If parsing several elements, you should specify false, and manually attach the validation\n            /// to the form when you are finished. The default is false.</param>\n            var $element = $(element),\n                form = $element.parents(\"form\")[0],\n                valInfo, rules, messages;\n\n            if (!form) {  // Cannot do client-side validation without a form\n                return;\n            }\n\n            valInfo = validationInfo(form);\n            valInfo.options.rules[element.name] = rules = {};\n            valInfo.options.messages[element.name] = messages = {};\n\n            $.each(this.adapters, function () {\n                var prefix = \"data-val-\" + this.name,\n                    message = $element.attr(prefix),\n                    paramValues = {};\n\n                if (message !== undefined) {  // Compare against undefined, because an empty message is legal (and falsy)\n                    prefix += \"-\";\n\n                    $.each(this.params, function () {\n                        paramValues[this] = $element.attr(prefix + this);\n                    });\n\n                    this.adapt({\n                        element: element,\n                        form: form,\n                        message: message,\n                        params: paramValues,\n                        rules: rules,\n                        messages: messages\n                    });\n                }\n            });\n\n            $.extend(rules, { \"__dummy__\": true });\n\n            if (!skipAttach) {\n                valInfo.attachValidation();\n            }\n        },\n\n        parse: function (selector) {\n            /// <summary>\n            /// Parses all the HTML elements in the specified selector. It looks for input elements decorated\n            /// with the [data-val=true] attribute value and enables validation according to the data-val-*\n            /// attribute values.\n            /// </summary>\n            /// <param name=\"selector\" type=\"String\">Any valid jQuery selector.</param>\n\n            // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one\n            // element with data-val=true\n            var $selector = $(selector),\n                $forms = $selector.parents()\n                                  .addBack()\n                                  .filter(\"form\")\n                                  .add($selector.find(\"form\"))\n                                  .has(\"[data-val=true]\");\n\n            $selector.find(\"[data-val=true]\").each(function () {\n                $jQval.unobtrusive.parseElement(this, true);\n            });\n\n            $forms.each(function () {\n                var info = validationInfo(this);\n                if (info) {\n                    info.attachValidation();\n                }\n            });\n        }\n    };\n\n    adapters = $jQval.unobtrusive.adapters;\n\n    adapters.add = function (adapterName, params, fn) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\n        /// <param name=\"params\" type=\"Array\" optional=\"true\">[Optional] An array of parameter names (strings) that will\n        /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and\n        /// mmmm is the parameter name).</param>\n        /// <param name=\"fn\" type=\"Function\">The function to call, which adapts the values from the HTML\n        /// attributes into jQuery Validate rules and/or messages.</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        if (!fn) {  // Called with no params, just a function\n            fn = params;\n            params = [];\n        }\n        this.push({ name: adapterName, params: params, adapt: fn });\n        return this;\n    };\n\n    adapters.addBool = function (adapterName, ruleName) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\n        /// the jQuery Validate validation rule has no parameter values.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\n        /// <param name=\"ruleName\" type=\"String\" optional=\"true\">[Optional] The name of the jQuery Validate rule. If not provided, the value\n        /// of adapterName will be used instead.</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        return this.add(adapterName, function (options) {\n            setValidationValues(options, ruleName || adapterName, true);\n        });\n    };\n\n    adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\n        /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and\n        /// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\n        /// <param name=\"minRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you only\n        /// have a minimum value.</param>\n        /// <param name=\"maxRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you only\n        /// have a maximum value.</param>\n        /// <param name=\"minMaxRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you\n        /// have both a minimum and maximum value.</param>\n        /// <param name=\"minAttribute\" type=\"String\" optional=\"true\">[Optional] The name of the HTML attribute that\n        /// contains the minimum value. The default is \"min\".</param>\n        /// <param name=\"maxAttribute\" type=\"String\" optional=\"true\">[Optional] The name of the HTML attribute that\n        /// contains the maximum value. The default is \"max\".</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        return this.add(adapterName, [minAttribute || \"min\", maxAttribute || \"max\"], function (options) {\n            var min = options.params.min,\n                max = options.params.max;\n\n            if (min && max) {\n                setValidationValues(options, minMaxRuleName, [min, max]);\n            }\n            else if (min) {\n                setValidationValues(options, minRuleName, min);\n            }\n            else if (max) {\n                setValidationValues(options, maxRuleName, max);\n            }\n        });\n    };\n\n    adapters.addSingleVal = function (adapterName, attribute, ruleName) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\n        /// the jQuery Validate validation rule has a single value.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>\n        /// <param name=\"attribute\" type=\"String\">[Optional] The name of the HTML attribute that contains the value.\n        /// The default is \"val\".</param>\n        /// <param name=\"ruleName\" type=\"String\" optional=\"true\">[Optional] The name of the jQuery Validate rule. If not provided, the value\n        /// of adapterName will be used instead.</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        return this.add(adapterName, [attribute || \"val\"], function (options) {\n            setValidationValues(options, ruleName || adapterName, options.params[attribute]);\n        });\n    };\n\n    $jQval.addMethod(\"__dummy__\", function (value, element, params) {\n        return true;\n    });\n\n    $jQval.addMethod(\"regex\", function (value, element, params) {\n        var match;\n        if (this.optional(element)) {\n            return true;\n        }\n\n        match = new RegExp(params).exec(value);\n        return (match && (match.index === 0) && (match[0].length === value.length));\n    });\n\n    $jQval.addMethod(\"nonalphamin\", function (value, element, nonalphamin) {\n        var match;\n        if (nonalphamin) {\n            match = value.match(/\\W/g);\n            match = match && match.length >= nonalphamin;\n        }\n        return match;\n    });\n\n    if ($jQval.methods.extension) {\n        adapters.addSingleVal(\"accept\", \"mimtype\");\n        adapters.addSingleVal(\"extension\", \"extension\");\n    } else {\n        // for backward compatibility, when the 'extension' validation method does not exist, such as with versions\n        // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for\n        // validating the extension, and ignore mime-type validations as they are not supported.\n        adapters.addSingleVal(\"extension\", \"extension\", \"accept\");\n    }\n\n    adapters.addSingleVal(\"regex\", \"pattern\");\n    adapters.addBool(\"creditcard\").addBool(\"date\").addBool(\"digits\").addBool(\"email\").addBool(\"number\").addBool(\"url\");\n    adapters.addMinMax(\"length\", \"minlength\", \"maxlength\", \"rangelength\").addMinMax(\"range\", \"min\", \"max\", \"range\");\n    adapters.addMinMax(\"minlength\", \"minlength\").addMinMax(\"maxlength\", \"minlength\", \"maxlength\");\n    adapters.add(\"equalto\", [\"other\"], function (options) {\n        var prefix = getModelPrefix(options.element.name),\n            other = options.params.other,\n            fullOtherName = appendModelPrefix(other, prefix),\n            element = $(options.form).find(\":input\").filter(\"[name='\" + escapeAttributeValue(fullOtherName) + \"']\")[0];\n\n        setValidationValues(options, \"equalTo\", element);\n    });\n    adapters.add(\"required\", function (options) {\n        // jQuery Validate equates \"required\" with \"mandatory\" for checkbox elements\n        if (options.element.tagName.toUpperCase() !== \"INPUT\" || options.element.type.toUpperCase() !== \"CHECKBOX\") {\n            setValidationValues(options, \"required\", true);\n        }\n    });\n    adapters.add(\"remote\", [\"url\", \"type\", \"additionalfields\"], function (options) {\n        var value = {\n            url: options.params.url,\n            type: options.params.type || \"GET\",\n            data: {}\n        },\n            prefix = getModelPrefix(options.element.name);\n\n        $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {\n            var paramName = appendModelPrefix(fieldName, prefix);\n            value.data[paramName] = function () {\n                var field = $(options.form).find(\":input\").filter(\"[name='\" + escapeAttributeValue(paramName) + \"']\");\n                // For checkboxes and radio buttons, only pick up values from checked fields.\n                if (field.is(\":checkbox\")) {\n                    return field.filter(\":checked\").val() || field.filter(\":hidden\").val() || '';\n                }\n                else if (field.is(\":radio\")) {\n                    return field.filter(\":checked\").val() || '';\n                }\n                return field.val();\n            };\n        });\n\n        setValidationValues(options, \"remote\", value);\n    });\n    adapters.add(\"password\", [\"min\", \"nonalphamin\", \"regex\"], function (options) {\n        if (options.params.min) {\n            setValidationValues(options, \"minlength\", options.params.min);\n        }\n        if (options.params.nonalphamin) {\n            setValidationValues(options, \"nonalphamin\", options.params.nonalphamin);\n        }\n        if (options.params.regex) {\n            setValidationValues(options, \"regex\", options.params.regex);\n        }\n    });\n\n    $(function () {\n        $jQval.unobtrusive.parse(document);\n    });\n}(jQuery));"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Scripts/modernizr-2.6.2.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton; http://www.modernizr.com/license/\n *\n * Includes matchMedia polyfill; Copyright (c) 2010 Filament Group, Inc; http://opensource.org/licenses/MIT\n *\n * Includes material adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js; Copyright 2009-2012 by contributors; http://opensource.org/licenses/MIT\n *\n * Includes material from css-support; Copyright (c) 2005-2012 Diego Perini; https://github.com/dperini/css-support/blob/master/LICENSE\n *\n * NUGET: END LICENSE TEXT */\n\n/*!\n * Modernizr v2.6.2\n * www.modernizr.com\n *\n * Copyright (c) Faruk Ates, Paul Irish, Alex Sexton\n * Available under the BSD and MIT licenses: www.modernizr.com/license/\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in\n * the current UA and makes the results available to you in two ways:\n * as properties on a global Modernizr object, and as classes on the\n * <html> element. This information allows you to progressively enhance\n * your pages with a granular level of control over the experience.\n *\n * Modernizr has an optional (not included) conditional resource loader\n * called Modernizr.load(), based on Yepnope.js (yepnopejs.com).\n * To get a build that includes Modernizr.load(), as well as choosing\n * which tests to include, go to www.modernizr.com/download/\n *\n * Authors        Faruk Ates, Paul Irish, Alex Sexton\n * Contributors   Ryan Seddon, Ben Alman\n */\n\nwindow.Modernizr = (function( window, document, undefined ) {\n\n    var version = '2.6.2',\n\n    Modernizr = {},\n\n    /*>>cssclasses*/\n    // option for enabling the HTML classes to be added\n    enableClasses = true,\n    /*>>cssclasses*/\n\n    docElement = document.documentElement,\n\n    /**\n     * Create our \"modernizr\" element that we do most feature tests on.\n     */\n    mod = 'modernizr',\n    modElem = document.createElement(mod),\n    mStyle = modElem.style,\n\n    /**\n     * Create the input element for various Web Forms feature tests.\n     */\n    inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,\n\n    /*>>smile*/\n    smile = ':)',\n    /*>>smile*/\n\n    toString = {}.toString,\n\n    // TODO :: make the prefixes more granular\n    /*>>prefixes*/\n    // List of property values to set for css tests. See ticket #21\n    prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),\n    /*>>prefixes*/\n\n    /*>>domprefixes*/\n    // Following spec is to expose vendor-specific style properties as:\n    //   elem.style.WebkitBorderRadius\n    // and the following would be incorrect:\n    //   elem.style.webkitBorderRadius\n\n    // Webkit ghosts their properties in lowercase but Opera & Moz do not.\n    // Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+\n    //   erik.eae.net/archives/2008/03/10/21.48.10/\n\n    // More here: github.com/Modernizr/Modernizr/issues/issue/21\n    omPrefixes = 'Webkit Moz O ms',\n\n    cssomPrefixes = omPrefixes.split(' '),\n\n    domPrefixes = omPrefixes.toLowerCase().split(' '),\n    /*>>domprefixes*/\n\n    /*>>ns*/\n    ns = {'svg': 'http://www.w3.org/2000/svg'},\n    /*>>ns*/\n\n    tests = {},\n    inputs = {},\n    attrs = {},\n\n    classes = [],\n\n    slice = classes.slice,\n\n    featureName, // used in testing loop\n\n\n    /*>>teststyles*/\n    // Inject element with style element and some CSS rules\n    injectElementWithStyles = function( rule, callback, nodes, testnames ) {\n\n      var style, ret, node, docOverflow,\n          div = document.createElement('div'),\n          // After page load injecting a fake body doesn't work so check if body exists\n          body = document.body,\n          // IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.\n          fakeBody = body || document.createElement('body');\n\n      if ( parseInt(nodes, 10) ) {\n          // In order not to give false positives we create a node for each test\n          // This also allows the method to scale for unspecified uses\n          while ( nodes-- ) {\n              node = document.createElement('div');\n              node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n              div.appendChild(node);\n          }\n      }\n\n      // <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed\n      // when injected with innerHTML. To get around this you need to prepend the 'NoScope' element\n      // with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.\n      // msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx\n      // Documents served as xml will throw if using &shy; so use xml friendly encoded version. See issue #277\n      style = ['&#173;','<style id=\"s', mod, '\">', rule, '</style>'].join('');\n      div.id = mod;\n      // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n      // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n      (body ? div : fakeBody).innerHTML += style;\n      fakeBody.appendChild(div);\n      if ( !body ) {\n          //avoid crashing IE8, if background image is used\n          fakeBody.style.background = '';\n          //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible\n          fakeBody.style.overflow = 'hidden';\n          docOverflow = docElement.style.overflow;\n          docElement.style.overflow = 'hidden';\n          docElement.appendChild(fakeBody);\n      }\n\n      ret = callback(div, rule);\n      // If this is done after page load we don't want to remove the body so check if body exists\n      if ( !body ) {\n          fakeBody.parentNode.removeChild(fakeBody);\n          docElement.style.overflow = docOverflow;\n      } else {\n          div.parentNode.removeChild(div);\n      }\n\n      return !!ret;\n\n    },\n    /*>>teststyles*/\n\n    /*>>mq*/\n    // adapted from matchMedia polyfill\n    // by Scott Jehl and Paul Irish\n    // gist.github.com/786768\n    testMediaQuery = function( mq ) {\n\n      var matchMedia = window.matchMedia || window.msMatchMedia;\n      if ( matchMedia ) {\n        return matchMedia(mq).matches;\n      }\n\n      var bool;\n\n      injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {\n        bool = (window.getComputedStyle ?\n                  getComputedStyle(node, null) :\n                  node.currentStyle)['position'] == 'absolute';\n      });\n\n      return bool;\n\n     },\n     /*>>mq*/\n\n\n    /*>>hasevent*/\n    //\n    // isEventSupported determines if a given element supports the given event\n    // kangax.github.com/iseventsupported/\n    //\n    // The following results are known incorrects:\n    //   Modernizr.hasEvent(\"webkitTransitionEnd\", elem) // false negative\n    //   Modernizr.hasEvent(\"textInput\") // in Webkit. github.com/Modernizr/Modernizr/issues/333\n    //   ...\n    isEventSupported = (function() {\n\n      var TAGNAMES = {\n        'select': 'input', 'change': 'input',\n        'submit': 'form', 'reset': 'form',\n        'error': 'img', 'load': 'img', 'abort': 'img'\n      };\n\n      function isEventSupported( eventName, element ) {\n\n        element = element || document.createElement(TAGNAMES[eventName] || 'div');\n        eventName = 'on' + eventName;\n\n        // When using `setAttribute`, IE skips \"unload\", WebKit skips \"unload\" and \"resize\", whereas `in` \"catches\" those\n        var isSupported = eventName in element;\n\n        if ( !isSupported ) {\n          // If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element\n          if ( !element.setAttribute ) {\n            element = document.createElement('div');\n          }\n          if ( element.setAttribute && element.removeAttribute ) {\n            element.setAttribute(eventName, '');\n            isSupported = is(element[eventName], 'function');\n\n            // If property was created, \"remove it\" (by setting value to `undefined`)\n            if ( !is(element[eventName], 'undefined') ) {\n              element[eventName] = undefined;\n            }\n            element.removeAttribute(eventName);\n          }\n        }\n\n        element = null;\n        return isSupported;\n      }\n      return isEventSupported;\n    })(),\n    /*>>hasevent*/\n\n    // TODO :: Add flag for hasownprop ? didn't last time\n\n    // hasOwnProperty shim by kangax needed for Safari 2.0 support\n    _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;\n\n    if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {\n      hasOwnProp = function (object, property) {\n        return _hasOwnProperty.call(object, property);\n      };\n    }\n    else {\n      hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */\n        return ((property in object) && is(object.constructor.prototype[property], 'undefined'));\n      };\n    }\n\n    // Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js\n    // es5.github.com/#x15.3.4.5\n\n    if (!Function.prototype.bind) {\n      Function.prototype.bind = function bind(that) {\n\n        var target = this;\n\n        if (typeof target != \"function\") {\n            throw new TypeError();\n        }\n\n        var args = slice.call(arguments, 1),\n            bound = function () {\n\n            if (this instanceof bound) {\n\n              var F = function(){};\n              F.prototype = target.prototype;\n              var self = new F();\n\n              var result = target.apply(\n                  self,\n                  args.concat(slice.call(arguments))\n              );\n              if (Object(result) === result) {\n                  return result;\n              }\n              return self;\n\n            } else {\n\n              return target.apply(\n                  that,\n                  args.concat(slice.call(arguments))\n              );\n\n            }\n\n        };\n\n        return bound;\n      };\n    }\n\n    /**\n     * setCss applies given styles to the Modernizr DOM node.\n     */\n    function setCss( str ) {\n        mStyle.cssText = str;\n    }\n\n    /**\n     * setCssAll extrapolates all vendor-specific css strings.\n     */\n    function setCssAll( str1, str2 ) {\n        return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));\n    }\n\n    /**\n     * is returns a boolean for if typeof obj is exactly type.\n     */\n    function is( obj, type ) {\n        return typeof obj === type;\n    }\n\n    /**\n     * contains returns a boolean for if substr is found within str.\n     */\n    function contains( str, substr ) {\n        return !!~('' + str).indexOf(substr);\n    }\n\n    /*>>testprop*/\n\n    // testProps is a generic CSS / DOM property test.\n\n    // In testing support for a given CSS property, it's legit to test:\n    //    `elem.style[styleName] !== undefined`\n    // If the property is supported it will return an empty string,\n    // if unsupported it will return undefined.\n\n    // We'll take advantage of this quick test and skip setting a style\n    // on our modernizr element, but instead just testing undefined vs\n    // empty string.\n\n    // Because the testing of the CSS property names (with \"-\", as\n    // opposed to the camelCase DOM properties) is non-portable and\n    // non-standard but works in WebKit and IE (but not Gecko or Opera),\n    // we explicitly reject properties with dashes so that authors\n    // developing in WebKit or IE first don't end up with\n    // browser-specific content by accident.\n\n    function testProps( props, prefixed ) {\n        for ( var i in props ) {\n            var prop = props[i];\n            if ( !contains(prop, \"-\") && mStyle[prop] !== undefined ) {\n                return prefixed == 'pfx' ? prop : true;\n            }\n        }\n        return false;\n    }\n    /*>>testprop*/\n\n    // TODO :: add testDOMProps\n    /**\n     * testDOMProps is a generic DOM property test; if a browser supports\n     *   a certain property, it won't return undefined for it.\n     */\n    function testDOMProps( props, obj, elem ) {\n        for ( var i in props ) {\n            var item = obj[props[i]];\n            if ( item !== undefined) {\n\n                // return the property name as a string\n                if (elem === false) return props[i];\n\n                // let's bind a function\n                if (is(item, 'function')){\n                  // default to autobind unless override\n                  return item.bind(elem || obj);\n                }\n\n                // return the unbound function or obj or value\n                return item;\n            }\n        }\n        return false;\n    }\n\n    /*>>testallprops*/\n    /**\n     * testPropsAll tests a list of DOM properties we want to check against.\n     *   We specify literally ALL possible (known and/or likely) properties on\n     *   the element including the non-vendor prefixed one, for forward-\n     *   compatibility.\n     */\n    function testPropsAll( prop, prefixed, elem ) {\n\n        var ucProp  = prop.charAt(0).toUpperCase() + prop.slice(1),\n            props   = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');\n\n        // did they call .prefixed('boxSizing') or are we just testing a prop?\n        if(is(prefixed, \"string\") || is(prefixed, \"undefined\")) {\n          return testProps(props, prefixed);\n\n        // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])\n        } else {\n          props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');\n          return testDOMProps(props, prefixed, elem);\n        }\n    }\n    /*>>testallprops*/\n\n\n    /**\n     * Tests\n     * -----\n     */\n\n    // The *new* flexbox\n    // dev.w3.org/csswg/css3-flexbox\n\n    tests['flexbox'] = function() {\n      return testPropsAll('flexWrap');\n    };\n\n    // The *old* flexbox\n    // www.w3.org/TR/2009/WD-css3-flexbox-20090723/\n\n    tests['flexboxlegacy'] = function() {\n        return testPropsAll('boxDirection');\n    };\n\n    // On the S60 and BB Storm, getContext exists, but always returns undefined\n    // so we actually have to call getContext() to verify\n    // github.com/Modernizr/Modernizr/issues/issue/97/\n\n    tests['canvas'] = function() {\n        var elem = document.createElement('canvas');\n        return !!(elem.getContext && elem.getContext('2d'));\n    };\n\n    tests['canvastext'] = function() {\n        return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));\n    };\n\n    // webk.it/70117 is tracking a legit WebGL feature detect proposal\n\n    // We do a soft detect which may false positive in order to avoid\n    // an expensive context creation: bugzil.la/732441\n\n    tests['webgl'] = function() {\n        return !!window.WebGLRenderingContext;\n    };\n\n    /*\n     * The Modernizr.touch test only indicates if the browser supports\n     *    touch events, which does not necessarily reflect a touchscreen\n     *    device, as evidenced by tablets running Windows 7 or, alas,\n     *    the Palm Pre / WebOS (touch) phones.\n     *\n     * Additionally, Chrome (desktop) used to lie about its support on this,\n     *    but that has since been rectified: crbug.com/36415\n     *\n     * We also test for Firefox 4 Multitouch Support.\n     *\n     * For more info, see: modernizr.github.com/Modernizr/touch.html\n     */\n\n    tests['touch'] = function() {\n        var bool;\n\n        if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {\n          bool = true;\n        } else {\n          injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {\n            bool = node.offsetTop === 9;\n          });\n        }\n\n        return bool;\n    };\n\n\n    // geolocation is often considered a trivial feature detect...\n    // Turns out, it's quite tricky to get right:\n    //\n    // Using !!navigator.geolocation does two things we don't want. It:\n    //   1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513\n    //   2. Disables page caching in WebKit: webk.it/43956\n    //\n    // Meanwhile, in Firefox < 8, an about:config setting could expose\n    // a false positive that would throw an exception: bugzil.la/688158\n\n    tests['geolocation'] = function() {\n        return 'geolocation' in navigator;\n    };\n\n\n    tests['postmessage'] = function() {\n      return !!window.postMessage;\n    };\n\n\n    // Chrome incognito mode used to throw an exception when using openDatabase\n    // It doesn't anymore.\n    tests['websqldatabase'] = function() {\n      return !!window.openDatabase;\n    };\n\n    // Vendors had inconsistent prefixing with the experimental Indexed DB:\n    // - Webkit's implementation is accessible through webkitIndexedDB\n    // - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB\n    // For speed, we don't test the legacy (and beta-only) indexedDB\n    tests['indexedDB'] = function() {\n      return !!testPropsAll(\"indexedDB\", window);\n    };\n\n    // documentMode logic from YUI to filter out IE8 Compat Mode\n    //   which false positives.\n    tests['hashchange'] = function() {\n      return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);\n    };\n\n    // Per 1.6:\n    // This used to be Modernizr.historymanagement but the longer\n    // name has been deprecated in favor of a shorter and property-matching one.\n    // The old API is still available in 1.6, but as of 2.0 will throw a warning,\n    // and in the first release thereafter disappear entirely.\n    tests['history'] = function() {\n      return !!(window.history && history.pushState);\n    };\n\n    tests['draganddrop'] = function() {\n        var div = document.createElement('div');\n        return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);\n    };\n\n    // FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10\n    // will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.\n    // FF10 still uses prefixes, so check for it until then.\n    // for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/\n    tests['websockets'] = function() {\n        return 'WebSocket' in window || 'MozWebSocket' in window;\n    };\n\n\n    // css-tricks.com/rgba-browser-support/\n    tests['rgba'] = function() {\n        // Set an rgba() color and check the returned value\n\n        setCss('background-color:rgba(150,255,150,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba');\n    };\n\n    tests['hsla'] = function() {\n        // Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,\n        //   except IE9 who retains it as hsla\n\n        setCss('background-color:hsla(120,40%,100%,.5)');\n\n        return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');\n    };\n\n    tests['multiplebgs'] = function() {\n        // Setting multiple images AND a color on the background shorthand property\n        //  and then querying the style.background property value for the number of\n        //  occurrences of \"url(\" is a reliable method for detecting ACTUAL support for this!\n\n        setCss('background:url(https://),url(https://),red url(https://)');\n\n        // If the UA supports multiple backgrounds, there should be three occurrences\n        //   of the string \"url(\" in the return value for elemStyle.background\n\n        return (/(url\\s*\\(.*?){3}/).test(mStyle.background);\n    };\n\n\n\n    // this will false positive in Opera Mini\n    //   github.com/Modernizr/Modernizr/issues/396\n\n    tests['backgroundsize'] = function() {\n        return testPropsAll('backgroundSize');\n    };\n\n    tests['borderimage'] = function() {\n        return testPropsAll('borderImage');\n    };\n\n\n    // Super comprehensive table about all the unique implementations of\n    // border-radius: muddledramblings.com/table-of-css3-border-radius-compliance\n\n    tests['borderradius'] = function() {\n        return testPropsAll('borderRadius');\n    };\n\n    // WebOS unfortunately false positives on this test.\n    tests['boxshadow'] = function() {\n        return testPropsAll('boxShadow');\n    };\n\n    // FF3.0 will false positive on this test\n    tests['textshadow'] = function() {\n        return document.createElement('div').style.textShadow === '';\n    };\n\n\n    tests['opacity'] = function() {\n        // Browsers that actually have CSS Opacity implemented have done so\n        //  according to spec, which means their return values are within the\n        //  range of [0.0,1.0] - including the leading zero.\n\n        setCssAll('opacity:.55');\n\n        // The non-literal . in this regex is intentional:\n        //   German Chrome returns this value as 0,55\n        // github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632\n        return (/^0.55$/).test(mStyle.opacity);\n    };\n\n\n    // Note, Android < 4 will pass this test, but can only animate\n    //   a single property at a time\n    //   daneden.me/2011/12/putting-up-with-androids-bullshit/\n    tests['cssanimations'] = function() {\n        return testPropsAll('animationName');\n    };\n\n\n    tests['csscolumns'] = function() {\n        return testPropsAll('columnCount');\n    };\n\n\n    tests['cssgradients'] = function() {\n        /**\n         * For CSS Gradients syntax, please see:\n         * webkit.org/blog/175/introducing-css-gradients/\n         * developer.mozilla.org/en/CSS/-moz-linear-gradient\n         * developer.mozilla.org/en/CSS/-moz-radial-gradient\n         * dev.w3.org/csswg/css3-images/#gradients-\n         */\n\n        var str1 = 'background-image:',\n            str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',\n            str3 = 'linear-gradient(left top,#9f9, white);';\n\n        setCss(\n             // legacy webkit syntax (FIXME: remove when syntax not in use anymore)\n              (str1 + '-webkit- '.split(' ').join(str2 + str1) +\n             // standard syntax             // trailing 'background-image:'\n              prefixes.join(str3 + str1)).slice(0, -str1.length)\n        );\n\n        return contains(mStyle.backgroundImage, 'gradient');\n    };\n\n\n    tests['cssreflections'] = function() {\n        return testPropsAll('boxReflect');\n    };\n\n\n    tests['csstransforms'] = function() {\n        return !!testPropsAll('transform');\n    };\n\n\n    tests['csstransforms3d'] = function() {\n\n        var ret = !!testPropsAll('perspective');\n\n        // Webkit's 3D transforms are passed off to the browser's own graphics renderer.\n        //   It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in\n        //   some conditions. As a result, Webkit typically recognizes the syntax but\n        //   will sometimes throw a false positive, thus we must do a more thorough check:\n        if ( ret && 'webkitPerspective' in docElement.style ) {\n\n          // Webkit allows this media query to succeed only if the feature is enabled.\n          // `@media (transform-3d),(-webkit-transform-3d){ ... }`\n          injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {\n            ret = node.offsetLeft === 9 && node.offsetHeight === 3;\n          });\n        }\n        return ret;\n    };\n\n\n    tests['csstransitions'] = function() {\n        return testPropsAll('transition');\n    };\n\n\n    /*>>fontface*/\n    // @font-face detection routine by Diego Perini\n    // javascript.nwbox.com/CSSSupport/\n\n    // false positives:\n    //   WebOS github.com/Modernizr/Modernizr/issues/342\n    //   WP7   github.com/Modernizr/Modernizr/issues/538\n    tests['fontface'] = function() {\n        var bool;\n\n        injectElementWithStyles('@font-face {font-family:\"font\";src:url(\"https://\")}', function( node, rule ) {\n          var style = document.getElementById('smodernizr'),\n              sheet = style.sheet || style.styleSheet,\n              cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';\n\n          bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;\n        });\n\n        return bool;\n    };\n    /*>>fontface*/\n\n    // CSS generated content detection\n    tests['generatedcontent'] = function() {\n        var bool;\n\n        injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:\"',smile,'\";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {\n          bool = node.offsetHeight >= 3;\n        });\n\n        return bool;\n    };\n\n\n\n    // These tests evaluate support of the video/audio elements, as well as\n    // testing what types of content they support.\n    //\n    // We're using the Boolean constructor here, so that we can extend the value\n    // e.g.  Modernizr.video     // true\n    //       Modernizr.video.ogg // 'probably'\n    //\n    // Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845\n    //                     thx to NielsLeenheer and zcorpan\n\n    // Note: in some older browsers, \"no\" was a return value instead of empty string.\n    //   It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2\n    //   It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5\n\n    tests['video'] = function() {\n        var elem = document.createElement('video'),\n            bool = false;\n\n        // IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('video/ogg; codecs=\"theora\"')      .replace(/^no$/,'');\n\n                // Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546\n                bool.h264 = elem.canPlayType('video/mp4; codecs=\"avc1.42E01E\"') .replace(/^no$/,'');\n\n                bool.webm = elem.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/,'');\n            }\n\n        } catch(e) { }\n\n        return bool;\n    };\n\n    tests['audio'] = function() {\n        var elem = document.createElement('audio'),\n            bool = false;\n\n        try {\n            if ( bool = !!elem.canPlayType ) {\n                bool      = new Boolean(bool);\n                bool.ogg  = elem.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,'');\n                bool.mp3  = elem.canPlayType('audio/mpeg;')               .replace(/^no$/,'');\n\n                // Mimetypes accepted:\n                //   developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements\n                //   bit.ly/iphoneoscodecs\n                bool.wav  = elem.canPlayType('audio/wav; codecs=\"1\"')     .replace(/^no$/,'');\n                bool.m4a  = ( elem.canPlayType('audio/x-m4a;')            ||\n                              elem.canPlayType('audio/aac;'))             .replace(/^no$/,'');\n            }\n        } catch(e) { }\n\n        return bool;\n    };\n\n\n    // In FF4, if disabled, window.localStorage should === null.\n\n    // Normally, we could not test that directly and need to do a\n    //   `('localStorage' in window) && ` test first because otherwise Firefox will\n    //   throw bugzil.la/365772 if cookies are disabled\n\n    // Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem\n    // will throw the exception:\n    //   QUOTA_EXCEEDED_ERRROR DOM Exception 22.\n    // Peculiarly, getItem and removeItem calls do not throw.\n\n    // Because we are forced to try/catch this, we'll go aggressive.\n\n    // Just FWIW: IE8 Compat mode supports these features completely:\n    //   www.quirksmode.org/dom/html5.html\n    // But IE8 doesn't support either with local files\n\n    tests['localstorage'] = function() {\n        try {\n            localStorage.setItem(mod, mod);\n            localStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n    tests['sessionstorage'] = function() {\n        try {\n            sessionStorage.setItem(mod, mod);\n            sessionStorage.removeItem(mod);\n            return true;\n        } catch(e) {\n            return false;\n        }\n    };\n\n\n    tests['webworkers'] = function() {\n        return !!window.Worker;\n    };\n\n\n    tests['applicationcache'] = function() {\n        return !!window.applicationCache;\n    };\n\n\n    // Thanks to Erik Dahlstrom\n    tests['svg'] = function() {\n        return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;\n    };\n\n    // specifically for SVG inline in HTML, not within XHTML\n    // test page: paulirish.com/demo/inline-svg\n    tests['inlinesvg'] = function() {\n      var div = document.createElement('div');\n      div.innerHTML = '<svg/>';\n      return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;\n    };\n\n    // SVG SMIL animation\n    tests['smil'] = function() {\n        return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));\n    };\n\n    // This test is only for clip paths in SVG proper, not clip paths on HTML content\n    // demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg\n\n    // However read the comments to dig into applying SVG clippaths to HTML content here:\n    //   github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491\n    tests['svgclippaths'] = function() {\n        return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));\n    };\n\n    /*>>webforms*/\n    // input features and input types go directly onto the ret object, bypassing the tests loop.\n    // Hold this guy to execute in a moment.\n    function webforms() {\n        /*>>input*/\n        // Run through HTML5's new input attributes to see if the UA understands any.\n        // We're using f which is the <input> element created early on\n        // Mike Taylr has created a comprehensive resource for testing these attributes\n        //   when applied to all input types:\n        //   miketaylr.com/code/input-type-attr.html\n        // spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n\n        // Only input placeholder is tested while textarea's placeholder is not.\n        // Currently Safari 4 and Opera 11 have support only for the input placeholder\n        // Both tests are available in feature-detects/forms-placeholder.js\n        Modernizr['input'] = (function( props ) {\n            for ( var i = 0, len = props.length; i < len; i++ ) {\n                attrs[ props[i] ] = !!(props[i] in inputElem);\n            }\n            if (attrs.list){\n              // safari false positive's on datalist: webk.it/74252\n              // see also github.com/Modernizr/Modernizr/issues/146\n              attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);\n            }\n            return attrs;\n        })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));\n        /*>>input*/\n\n        /*>>inputtypes*/\n        // Run through HTML5's new input types to see if the UA understands any.\n        //   This is put behind the tests runloop because it doesn't return a\n        //   true/false like all the other tests; instead, it returns an object\n        //   containing each input type with its corresponding true/false value\n\n        // Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/\n        Modernizr['inputtypes'] = (function(props) {\n\n            for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {\n\n                inputElem.setAttribute('type', inputElemType = props[i]);\n                bool = inputElem.type !== 'text';\n\n                // We first check to see if the type we give it sticks..\n                // If the type does, we feed it a textual value, which shouldn't be valid.\n                // If the value doesn't stick, we know there's input sanitization which infers a custom UI\n                if ( bool ) {\n\n                    inputElem.value         = smile;\n                    inputElem.style.cssText = 'position:absolute;visibility:hidden;';\n\n                    if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {\n\n                      docElement.appendChild(inputElem);\n                      defaultView = document.defaultView;\n\n                      // Safari 2-4 allows the smiley as a value, despite making a slider\n                      bool =  defaultView.getComputedStyle &&\n                              defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&\n                              // Mobile android web browser has false positive, so must\n                              // check the height to see if the widget is actually there.\n                              (inputElem.offsetHeight !== 0);\n\n                      docElement.removeChild(inputElem);\n\n                    } else if ( /^(search|tel)$/.test(inputElemType) ){\n                      // Spec doesn't define any special parsing or detectable UI\n                      //   behaviors so we pass these through as true\n\n                      // Interestingly, opera fails the earlier test, so it doesn't\n                      //  even make it here.\n\n                    } else if ( /^(url|email)$/.test(inputElemType) ) {\n                      // Real url and email support comes with prebaked validation.\n                      bool = inputElem.checkValidity && inputElem.checkValidity() === false;\n\n                    } else {\n                      // If the upgraded input compontent rejects the :) text, we got a winner\n                      bool = inputElem.value != smile;\n                    }\n                }\n\n                inputs[ props[i] ] = !!bool;\n            }\n            return inputs;\n        })('search tel url email datetime date month week time datetime-local number range color'.split(' '));\n        /*>>inputtypes*/\n    }\n    /*>>webforms*/\n\n\n    // End of test definitions\n    // -----------------------\n\n\n\n    // Run through all tests and detect their support in the current UA.\n    // todo: hypothetically we could be doing an array of tests and use a basic loop here.\n    for ( var feature in tests ) {\n        if ( hasOwnProp(tests, feature) ) {\n            // run the test, throw the return value into the Modernizr,\n            //   then based on that boolean, define an appropriate className\n            //   and push it into an array of classes we'll join later.\n            featureName  = feature.toLowerCase();\n            Modernizr[featureName] = tests[feature]();\n\n            classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);\n        }\n    }\n\n    /*>>webforms*/\n    // input tests need to run.\n    Modernizr.input || webforms();\n    /*>>webforms*/\n\n\n    /**\n     * addTest allows the user to define their own feature tests\n     * the result will be added onto the Modernizr object,\n     * as well as an appropriate className set on the html element\n     *\n     * @param feature - String naming the feature\n     * @param test - Function returning true if feature is supported, false if not\n     */\n     Modernizr.addTest = function ( feature, test ) {\n       if ( typeof feature == 'object' ) {\n         for ( var key in feature ) {\n           if ( hasOwnProp( feature, key ) ) {\n             Modernizr.addTest( key, feature[ key ] );\n           }\n         }\n       } else {\n\n         feature = feature.toLowerCase();\n\n         if ( Modernizr[feature] !== undefined ) {\n           // we're going to quit if you're trying to overwrite an existing test\n           // if we were to allow it, we'd do this:\n           //   var re = new RegExp(\"\\\\b(no-)?\" + feature + \"\\\\b\");\n           //   docElement.className = docElement.className.replace( re, '' );\n           // but, no rly, stuff 'em.\n           return Modernizr;\n         }\n\n         test = typeof test == 'function' ? test() : test;\n\n         if (typeof enableClasses !== \"undefined\" && enableClasses) {\n           docElement.className += ' ' + (test ? '' : 'no-') + feature;\n         }\n         Modernizr[feature] = test;\n\n       }\n\n       return Modernizr; // allow chaining.\n     };\n\n\n    // Reset modElem.cssText to nothing to reduce memory footprint.\n    setCss('');\n    modElem = inputElem = null;\n\n    /*>>shiv*/\n    /*! HTML5 Shiv v3.6.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */\n    ;(function(window, document) {\n    /*jshint evil:true */\n      /** Preset options */\n      var options = window.html5 || {};\n\n      /** Used to skip problem elements */\n      var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;\n\n      /** Not all elements can be cloned in IE **/\n      var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;\n\n      /** Detect whether the browser supports default html5 styles */\n      var supportsHtml5Styles;\n\n      /** Name of the expando, to work with multiple documents or to re-shiv one document */\n      var expando = '_html5shiv';\n\n      /** The id for the the documents expando */\n      var expanID = 0;\n\n      /** Cached data for each document */\n      var expandoData = {};\n\n      /** Detect whether the browser supports unknown elements */\n      var supportsUnknownElements;\n\n      (function() {\n        try {\n            var a = document.createElement('a');\n            a.innerHTML = '<xyz></xyz>';\n            //if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles\n            supportsHtml5Styles = ('hidden' in a);\n\n            supportsUnknownElements = a.childNodes.length == 1 || (function() {\n              // assign a false positive if unable to shiv\n              (document.createElement)('a');\n              var frag = document.createDocumentFragment();\n              return (\n                typeof frag.cloneNode == 'undefined' ||\n                typeof frag.createDocumentFragment == 'undefined' ||\n                typeof frag.createElement == 'undefined'\n              );\n            }());\n        } catch(e) {\n          supportsHtml5Styles = true;\n          supportsUnknownElements = true;\n        }\n\n      }());\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Creates a style sheet with the given CSS text and adds it to the document.\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @param {String} cssText The CSS text.\n       * @returns {StyleSheet} The style element.\n       */\n      function addStyleSheet(ownerDocument, cssText) {\n        var p = ownerDocument.createElement('p'),\n            parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;\n\n        p.innerHTML = 'x<style>' + cssText + '</style>';\n        return parent.insertBefore(p.lastChild, parent.firstChild);\n      }\n\n      /**\n       * Returns the value of `html5.elements` as an array.\n       * @private\n       * @returns {Array} An array of shived element node names.\n       */\n      function getElements() {\n        var elements = html5.elements;\n        return typeof elements == 'string' ? elements.split(' ') : elements;\n      }\n\n        /**\n       * Returns the data associated to the given document\n       * @private\n       * @param {Document} ownerDocument The document.\n       * @returns {Object} An object of data.\n       */\n      function getExpandoData(ownerDocument) {\n        var data = expandoData[ownerDocument[expando]];\n        if (!data) {\n            data = {};\n            expanID++;\n            ownerDocument[expando] = expanID;\n            expandoData[expanID] = data;\n        }\n        return data;\n      }\n\n      /**\n       * returns a shived element for the given nodeName and document\n       * @memberOf html5\n       * @param {String} nodeName name of the element\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived element.\n       */\n      function createElement(nodeName, ownerDocument, data){\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        if(supportsUnknownElements){\n            return ownerDocument.createElement(nodeName);\n        }\n        if (!data) {\n            data = getExpandoData(ownerDocument);\n        }\n        var node;\n\n        if (data.cache[nodeName]) {\n            node = data.cache[nodeName].cloneNode();\n        } else if (saveClones.test(nodeName)) {\n            node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();\n        } else {\n            node = data.createElem(nodeName);\n        }\n\n        // Avoid adding some elements to fragments in IE < 9 because\n        // * Attributes like `name` or `type` cannot be set/changed once an element\n        //   is inserted into a document/fragment\n        // * Link elements with `src` attributes that are inaccessible, as with\n        //   a 403 response, will cause the tab/window to crash\n        // * Script elements appended to fragments will execute when their `src`\n        //   or `text` property is set\n        return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;\n      }\n\n      /**\n       * returns a shived DocumentFragment for the given document\n       * @memberOf html5\n       * @param {Document} ownerDocument The context document.\n       * @returns {Object} The shived DocumentFragment.\n       */\n      function createDocumentFragment(ownerDocument, data){\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        if(supportsUnknownElements){\n            return ownerDocument.createDocumentFragment();\n        }\n        data = data || getExpandoData(ownerDocument);\n        var clone = data.frag.cloneNode(),\n            i = 0,\n            elems = getElements(),\n            l = elems.length;\n        for(;i<l;i++){\n            clone.createElement(elems[i]);\n        }\n        return clone;\n      }\n\n      /**\n       * Shivs the `createElement` and `createDocumentFragment` methods of the document.\n       * @private\n       * @param {Document|DocumentFragment} ownerDocument The document.\n       * @param {Object} data of the document.\n       */\n      function shivMethods(ownerDocument, data) {\n        if (!data.cache) {\n            data.cache = {};\n            data.createElem = ownerDocument.createElement;\n            data.createFrag = ownerDocument.createDocumentFragment;\n            data.frag = data.createFrag();\n        }\n\n\n        ownerDocument.createElement = function(nodeName) {\n          //abort shiv\n          if (!html5.shivMethods) {\n              return data.createElem(nodeName);\n          }\n          return createElement(nodeName, ownerDocument, data);\n        };\n\n        ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +\n          'var n=f.cloneNode(),c=n.createElement;' +\n          'h.shivMethods&&(' +\n            // unroll the `createElement` calls\n            getElements().join().replace(/\\w+/g, function(nodeName) {\n              data.createElem(nodeName);\n              data.frag.createElement(nodeName);\n              return 'c(\"' + nodeName + '\")';\n            }) +\n          ');return n}'\n        )(html5, data.frag);\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * Shivs the given document.\n       * @memberOf html5\n       * @param {Document} ownerDocument The document to shiv.\n       * @returns {Document} The shived document.\n       */\n      function shivDocument(ownerDocument) {\n        if (!ownerDocument) {\n            ownerDocument = document;\n        }\n        var data = getExpandoData(ownerDocument);\n\n        if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {\n          data.hasCSS = !!addStyleSheet(ownerDocument,\n            // corrects block display not defined in IE6/7/8/9\n            'article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}' +\n            // adds styling not present in IE6/7/8/9\n            'mark{background:#FF0;color:#000}'\n          );\n        }\n        if (!supportsUnknownElements) {\n          shivMethods(ownerDocument, data);\n        }\n        return ownerDocument;\n      }\n\n      /*--------------------------------------------------------------------------*/\n\n      /**\n       * The `html5` object is exposed so that more elements can be shived and\n       * existing shiving can be detected on iframes.\n       * @type Object\n       * @example\n       *\n       * // options can be changed before the script is included\n       * html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };\n       */\n      var html5 = {\n\n        /**\n         * An array or space separated string of node names of the elements to shiv.\n         * @memberOf html5\n         * @type Array|String\n         */\n        'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video',\n\n        /**\n         * A flag to indicate that the HTML5 style sheet should be inserted.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivCSS': (options.shivCSS !== false),\n\n        /**\n         * Is equal to true if a browser supports creating unknown/HTML5 elements\n         * @memberOf html5\n         * @type boolean\n         */\n        'supportsUnknownElements': supportsUnknownElements,\n\n        /**\n         * A flag to indicate that the document's `createElement` and `createDocumentFragment`\n         * methods should be overwritten.\n         * @memberOf html5\n         * @type Boolean\n         */\n        'shivMethods': (options.shivMethods !== false),\n\n        /**\n         * A string to describe the type of `html5` object (\"default\" or \"default print\").\n         * @memberOf html5\n         * @type String\n         */\n        'type': 'default',\n\n        // shivs the document according to the specified `html5` object options\n        'shivDocument': shivDocument,\n\n        //creates a shived element\n        createElement: createElement,\n\n        //creates a shived documentFragment\n        createDocumentFragment: createDocumentFragment\n      };\n\n      /*--------------------------------------------------------------------------*/\n\n      // expose html5\n      window.html5 = html5;\n\n      // shiv the document\n      shivDocument(document);\n\n    }(this, document));\n    /*>>shiv*/\n\n    // Assign private properties to the return object with prefix\n    Modernizr._version      = version;\n\n    // expose these for the plugin API. Look in the source for how to join() them against your input\n    /*>>prefixes*/\n    Modernizr._prefixes     = prefixes;\n    /*>>prefixes*/\n    /*>>domprefixes*/\n    Modernizr._domPrefixes  = domPrefixes;\n    Modernizr._cssomPrefixes  = cssomPrefixes;\n    /*>>domprefixes*/\n\n    /*>>mq*/\n    // Modernizr.mq tests a given media query, live against the current state of the window\n    // A few important notes:\n    //   * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false\n    //   * A max-width or orientation query will be evaluated against the current state, which may change later.\n    //   * You must specify values. Eg. If you are testing support for the min-width media query use:\n    //       Modernizr.mq('(min-width:0)')\n    // usage:\n    // Modernizr.mq('only screen and (max-width:768)')\n    Modernizr.mq            = testMediaQuery;\n    /*>>mq*/\n\n    /*>>hasevent*/\n    // Modernizr.hasEvent() detects support for a given event, with an optional element to test on\n    // Modernizr.hasEvent('gesturestart', elem)\n    Modernizr.hasEvent      = isEventSupported;\n    /*>>hasevent*/\n\n    /*>>testprop*/\n    // Modernizr.testProp() investigates whether a given style property is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testProp('pointerEvents')\n    Modernizr.testProp      = function(prop){\n        return testProps([prop]);\n    };\n    /*>>testprop*/\n\n    /*>>testallprops*/\n    // Modernizr.testAllProps() investigates whether a given style property,\n    //   or any of its vendor-prefixed variants, is recognized\n    // Note that the property names must be provided in the camelCase variant.\n    // Modernizr.testAllProps('boxSizing')\n    Modernizr.testAllProps  = testPropsAll;\n    /*>>testallprops*/\n\n\n    /*>>teststyles*/\n    // Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards\n    // Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })\n    Modernizr.testStyles    = injectElementWithStyles;\n    /*>>teststyles*/\n\n\n    /*>>prefixed*/\n    // Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input\n    // Modernizr.prefixed('boxSizing') // 'MozBoxSizing'\n\n    // Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.\n    // Return values will also be the camelCase variant, if you need to translate that to hypenated style use:\n    //\n    //     str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');\n\n    // If you're trying to ascertain which transition end event to bind to, you might do something like...\n    //\n    //     var transEndEventNames = {\n    //       'WebkitTransition' : 'webkitTransitionEnd',\n    //       'MozTransition'    : 'transitionend',\n    //       'OTransition'      : 'oTransitionEnd',\n    //       'msTransition'     : 'MSTransitionEnd',\n    //       'transition'       : 'transitionend'\n    //     },\n    //     transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];\n\n    Modernizr.prefixed      = function(prop, obj, elem){\n      if(!obj) {\n        return testPropsAll(prop, 'pfx');\n      } else {\n        // Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'\n        return testPropsAll(prop, obj, elem);\n      }\n    };\n    /*>>prefixed*/\n\n\n    /*>>cssclasses*/\n    // Remove \"no-js\" class from <html> element, if it exists:\n    docElement.className = docElement.className.replace(/(^|\\s)no-js(\\s|$)/, '$1$2') +\n\n                            // Add the new classes to the <html> element.\n                            (enableClasses ? ' js ' + classes.join(' ') : '');\n    /*>>cssclasses*/\n\n    return Modernizr;\n\n})(this, this.document);\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Scripts/respond.js",
    "content": "/* NUGET: BEGIN LICENSE TEXT\n *\n * Microsoft grants you the right to use these script files for the sole\n * purpose of either: (i) interacting through your browser with the Microsoft\n * website or online service, subject to the applicable licensing or use\n * terms; or (ii) using the files as included with a Microsoft product subject\n * to that product's license terms. Microsoft reserves all other rights to the\n * files not expressly granted by Microsoft, whether by implication, estoppel\n * or otherwise. Insofar as a script file is dual licensed under GPL,\n * Microsoft neither took the code under GPL nor distributes it thereunder but\n * under the terms set out in this paragraph. All notices and licenses\n * below are for informational purposes only.\n *\n * NUGET: END LICENSE TEXT */\n/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */\n/*! NOTE: If you're already including a window.matchMedia polyfill via Modernizr or otherwise, you don't need this part */\nwindow.matchMedia = window.matchMedia || (function(doc, undefined){\n  \n  var bool,\n      docElem  = doc.documentElement,\n      refNode  = docElem.firstElementChild || docElem.firstChild,\n      // fakeBody required for <FF4 when executed in <head>\n      fakeBody = doc.createElement('body'),\n      div      = doc.createElement('div');\n  \n  div.id = 'mq-test-1';\n  div.style.cssText = \"position:absolute;top:-100em\";\n  fakeBody.style.background = \"none\";\n  fakeBody.appendChild(div);\n  \n  return function(q){\n    \n    div.innerHTML = '&shy;<style media=\"'+q+'\"> #mq-test-1 { width: 42px; }</style>';\n    \n    docElem.insertBefore(fakeBody, refNode);\n    bool = div.offsetWidth == 42;  \n    docElem.removeChild(fakeBody);\n    \n    return { matches: bool, media: q };\n  };\n  \n})(document);\n\n\n\n\n/*! Respond.js v1.2.0: min/max-width media query polyfill. (c) Scott Jehl. MIT/GPLv2 Lic. j.mp/respondjs  */\n(function( win ){\n\t//exposed namespace\n\twin.respond\t\t= {};\n\t\n\t//define update even in native-mq-supporting browsers, to avoid errors\n\trespond.update\t= function(){};\n\t\n\t//expose media query support flag for external use\n\trespond.mediaQueriesSupported\t= win.matchMedia && win.matchMedia( \"only all\" ).matches;\n\t\n\t//if media queries are supported, exit here\n\tif( respond.mediaQueriesSupported ){ return; }\n\t\n\t//define vars\n\tvar doc \t\t\t= win.document,\n\t\tdocElem \t\t= doc.documentElement,\n\t\tmediastyles\t\t= [],\n\t\trules\t\t\t= [],\n\t\tappendedEls \t= [],\n\t\tparsedSheets \t= {},\n\t\tresizeThrottle\t= 30,\n\t\thead \t\t\t= doc.getElementsByTagName( \"head\" )[0] || docElem,\n\t\tbase\t\t\t= doc.getElementsByTagName( \"base\" )[0],\n\t\tlinks\t\t\t= head.getElementsByTagName( \"link\" ),\n\t\trequestQueue\t= [],\n\t\t\n\t\t//loop stylesheets, send text content to translate\n\t\tripCSS\t\t\t= function(){\n\t\t\tvar sheets \t= links,\n\t\t\t\tsl \t\t= sheets.length,\n\t\t\t\ti\t\t= 0,\n\t\t\t\t//vars for loop:\n\t\t\t\tsheet, href, media, isCSS;\n\n\t\t\tfor( ; i < sl; i++ ){\n\t\t\t\tsheet\t= sheets[ i ],\n\t\t\t\thref\t= sheet.href,\n\t\t\t\tmedia\t= sheet.media,\n\t\t\t\tisCSS\t= sheet.rel && sheet.rel.toLowerCase() === \"stylesheet\";\n\n\t\t\t\t//only links plz and prevent re-parsing\n\t\t\t\tif( !!href && isCSS && !parsedSheets[ href ] ){\n\t\t\t\t\t// selectivizr exposes css through the rawCssText expando\n\t\t\t\t\tif (sheet.styleSheet && sheet.styleSheet.rawCssText) {\n\t\t\t\t\t\ttranslate( sheet.styleSheet.rawCssText, href, media );\n\t\t\t\t\t\tparsedSheets[ href ] = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif( (!/^([a-zA-Z:]*\\/\\/)/.test( href ) && !base)\n\t\t\t\t\t\t\t|| href.replace( RegExp.$1, \"\" ).split( \"/\" )[0] === win.location.host ){\n\t\t\t\t\t\t\trequestQueue.push( {\n\t\t\t\t\t\t\t\thref: href,\n\t\t\t\t\t\t\t\tmedia: media\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tmakeRequests();\n\t\t},\n\t\t\n\t\t//recurse through request queue, get css text\n\t\tmakeRequests\t= function(){\n\t\t\tif( requestQueue.length ){\n\t\t\t\tvar thisRequest = requestQueue.shift();\n\t\t\t\t\n\t\t\t\tajax( thisRequest.href, function( styles ){\n\t\t\t\t\ttranslate( styles, thisRequest.href, thisRequest.media );\n\t\t\t\t\tparsedSheets[ thisRequest.href ] = true;\n\t\t\t\t\tmakeRequests();\n\t\t\t\t} );\n\t\t\t}\n\t\t},\n\t\t\n\t\t//find media blocks in css text, convert to style blocks\n\t\ttranslate\t\t\t= function( styles, href, media ){\n\t\t\tvar qs\t\t\t= styles.match(  /@media[^\\{]+\\{([^\\{\\}]*\\{[^\\}\\{]*\\})+/gi ),\n\t\t\t\tql\t\t\t= qs && qs.length || 0,\n\t\t\t\t//try to get CSS path\n\t\t\t\thref\t\t= href.substring( 0, href.lastIndexOf( \"/\" )),\n\t\t\t\trepUrls\t\t= function( css ){\n\t\t\t\t\treturn css.replace( /(url\\()['\"]?([^\\/\\)'\"][^:\\)'\"]+)['\"]?(\\))/g, \"$1\" + href + \"$2$3\" );\n\t\t\t\t},\n\t\t\t\tuseMedia\t= !ql && media,\n\t\t\t\t//vars used in loop\n\t\t\t\ti\t\t\t= 0,\n\t\t\t\tj, fullq, thisq, eachq, eql;\n\n\t\t\t//if path exists, tack on trailing slash\n\t\t\tif( href.length ){ href += \"/\"; }\t\n\t\t\t\t\n\t\t\t//if no internal queries exist, but media attr does, use that\t\n\t\t\t//note: this currently lacks support for situations where a media attr is specified on a link AND\n\t\t\t\t//its associated stylesheet has internal CSS media queries.\n\t\t\t\t//In those cases, the media attribute will currently be ignored.\n\t\t\tif( useMedia ){\n\t\t\t\tql = 1;\n\t\t\t}\n\t\t\t\n\n\t\t\tfor( ; i < ql; i++ ){\n\t\t\t\tj\t= 0;\n\t\t\t\t\n\t\t\t\t//media attr\n\t\t\t\tif( useMedia ){\n\t\t\t\t\tfullq = media;\n\t\t\t\t\trules.push( repUrls( styles ) );\n\t\t\t\t}\n\t\t\t\t//parse for styles\n\t\t\t\telse{\n\t\t\t\t\tfullq\t= qs[ i ].match( /@media *([^\\{]+)\\{([\\S\\s]+?)$/ ) && RegExp.$1;\n\t\t\t\t\trules.push( RegExp.$2 && repUrls( RegExp.$2 ) );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\teachq\t= fullq.split( \",\" );\n\t\t\t\teql\t\t= eachq.length;\n\t\t\t\t\t\n\t\t\t\tfor( ; j < eql; j++ ){\n\t\t\t\t\tthisq\t= eachq[ j ];\n\t\t\t\t\tmediastyles.push( { \n\t\t\t\t\t\tmedia\t: thisq.split( \"(\" )[ 0 ].match( /(only\\s+)?([a-zA-Z]+)\\s?/ ) && RegExp.$2 || \"all\",\n\t\t\t\t\t\trules\t: rules.length - 1,\n\t\t\t\t\t\thasquery: thisq.indexOf(\"(\") > -1,\n\t\t\t\t\t\tminw\t: thisq.match( /\\(min\\-width:[\\s]*([\\s]*[0-9\\.]+)(px|em)[\\s]*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" ), \n\t\t\t\t\t\tmaxw\t: thisq.match( /\\(max\\-width:[\\s]*([\\s]*[0-9\\.]+)(px|em)[\\s]*\\)/ ) && parseFloat( RegExp.$1 ) + ( RegExp.$2 || \"\" )\n\t\t\t\t\t} );\n\t\t\t\t}\t\n\t\t\t}\n\n\t\t\tapplyMedia();\n\t\t},\n        \t\n\t\tlastCall,\n\t\t\n\t\tresizeDefer,\n\t\t\n\t\t// returns the value of 1em in pixels\n\t\tgetEmValue\t\t= function() {\n\t\t\tvar ret,\n\t\t\t\tdiv = doc.createElement('div'),\n\t\t\t\tbody = doc.body,\n\t\t\t\tfakeUsed = false;\n\t\t\t\t\t\t\t\t\t\n\t\t\tdiv.style.cssText = \"position:absolute;font-size:1em;width:1em\";\n\t\t\t\t\t\n\t\t\tif( !body ){\n\t\t\t\tbody = fakeUsed = doc.createElement( \"body\" );\n\t\t\t\tbody.style.background = \"none\";\n\t\t\t}\n\t\t\t\t\t\n\t\t\tbody.appendChild( div );\n\t\t\t\t\t\t\t\t\n\t\t\tdocElem.insertBefore( body, docElem.firstChild );\n\t\t\t\t\t\t\t\t\n\t\t\tret = div.offsetWidth;\n\t\t\t\t\t\t\t\t\n\t\t\tif( fakeUsed ){\n\t\t\t\tdocElem.removeChild( body );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbody.removeChild( div );\n\t\t\t}\n\t\t\t\n\t\t\t//also update eminpx before returning\n\t\t\tret = eminpx = parseFloat(ret);\n\t\t\t\t\t\t\t\t\n\t\t\treturn ret;\n\t\t},\n\t\t\n\t\t//cached container for 1em value, populated the first time it's needed \n\t\teminpx,\n\t\t\n\t\t//enable/disable styles\n\t\tapplyMedia\t\t\t= function( fromResize ){\n\t\t\tvar name\t\t= \"clientWidth\",\n\t\t\t\tdocElemProp\t= docElem[ name ],\n\t\t\t\tcurrWidth \t= doc.compatMode === \"CSS1Compat\" && docElemProp || doc.body[ name ] || docElemProp,\n\t\t\t\tstyleBlocks\t= {},\n\t\t\t\tlastLink\t= links[ links.length-1 ],\n\t\t\t\tnow \t\t= (new Date()).getTime();\n\n\t\t\t//throttle resize calls\t\n\t\t\tif( fromResize && lastCall && now - lastCall < resizeThrottle ){\n\t\t\t\tclearTimeout( resizeDefer );\n\t\t\t\tresizeDefer = setTimeout( applyMedia, resizeThrottle );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlastCall\t= now;\n\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\n\t\t\tfor( var i in mediastyles ){\n\t\t\t\tvar thisstyle = mediastyles[ i ],\n\t\t\t\t\tmin = thisstyle.minw,\n\t\t\t\t\tmax = thisstyle.maxw,\n\t\t\t\t\tminnull = min === null,\n\t\t\t\t\tmaxnull = max === null,\n\t\t\t\t\tem = \"em\";\n\t\t\t\t\n\t\t\t\tif( !!min ){\n\t\t\t\t\tmin = parseFloat( min ) * ( min.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t}\n\t\t\t\tif( !!max ){\n\t\t\t\t\tmax = parseFloat( max ) * ( max.indexOf( em ) > -1 ? ( eminpx || getEmValue() ) : 1 );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// if there's no media query at all (the () part), or min or max is not null, and if either is present, they're true\n\t\t\t\tif( !thisstyle.hasquery || ( !minnull || !maxnull ) && ( minnull || currWidth >= min ) && ( maxnull || currWidth <= max ) ){\n\t\t\t\t\t\tif( !styleBlocks[ thisstyle.media ] ){\n\t\t\t\t\t\t\tstyleBlocks[ thisstyle.media ] = [];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstyleBlocks[ thisstyle.media ].push( rules[ thisstyle.rules ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//remove any existing respond style element(s)\n\t\t\tfor( var i in appendedEls ){\n\t\t\t\tif( appendedEls[ i ] && appendedEls[ i ].parentNode === head ){\n\t\t\t\t\thead.removeChild( appendedEls[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//inject active styles, grouped by media type\n\t\t\tfor( var i in styleBlocks ){\n\t\t\t\tvar ss\t\t= doc.createElement( \"style\" ),\n\t\t\t\t\tcss\t\t= styleBlocks[ i ].join( \"\\n\" );\n\t\t\t\t\n\t\t\t\tss.type = \"text/css\";\t\n\t\t\t\tss.media\t= i;\n\t\t\t\t\n\t\t\t\t//originally, ss was appended to a documentFragment and sheets were appended in bulk.\n\t\t\t\t//this caused crashes in IE in a number of circumstances, such as when the HTML element had a bg image set, so appending beforehand seems best. Thanks to @dvelyk for the initial research on this one!\n\t\t\t\thead.insertBefore( ss, lastLink.nextSibling );\n\t\t\t\t\n\t\t\t\tif ( ss.styleSheet ){ \n\t\t        \tss.styleSheet.cssText = css;\n\t\t        } \n\t\t        else {\n\t\t\t\t\tss.appendChild( doc.createTextNode( css ) );\n\t\t        }\n\t\t        \n\t\t\t\t//push to appendedEls to track for later removal\n\t\t\t\tappendedEls.push( ss );\n\t\t\t}\n\t\t},\n\t\t//tweaked Ajax functions from Quirksmode\n\t\tajax = function( url, callback ) {\n\t\t\tvar req = xmlHttp();\n\t\t\tif (!req){\n\t\t\t\treturn;\n\t\t\t}\t\n\t\t\treq.open( \"GET\", url, true );\n\t\t\treq.onreadystatechange = function () {\n\t\t\t\tif ( req.readyState != 4 || req.status != 200 && req.status != 304 ){\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcallback( req.responseText );\n\t\t\t}\n\t\t\tif ( req.readyState == 4 ){\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treq.send( null );\n\t\t},\n\t\t//define ajax obj \n\t\txmlHttp = (function() {\n\t\t\tvar xmlhttpmethod = false;\t\n\t\t\ttry {\n\t\t\t\txmlhttpmethod = new XMLHttpRequest();\n\t\t\t}\n\t\t\tcatch( e ){\n\t\t\t\txmlhttpmethod = new ActiveXObject( \"Microsoft.XMLHTTP\" );\n\t\t\t}\n\t\t\treturn function(){\n\t\t\t\treturn xmlhttpmethod;\n\t\t\t};\n\t\t})();\n\t\n\t//translate CSS\n\tripCSS();\n\t\n\t//expose update for re-running respond later on\n\trespond.update = ripCSS;\n\t\n\t//adjust on resize\n\tfunction callMedia(){\n\t\tapplyMedia( true );\n\t}\n\tif( win.addEventListener ){\n\t\twin.addEventListener( \"resize\", callMedia, false );\n\t}\n\telse if( win.attachEvent ){\n\t\twin.attachEvent( \"onresize\", callMedia );\n\t}\n})(this);\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Startup.cs",
    "content": "﻿using Microsoft.Owin;\nusing Owin;\n\n[assembly: OwinStartupAttribute(typeof(WebApplication.Startup))]\nnamespace WebApplication\n{\n    public partial class Startup\n    {\n        public void Configuration(IAppBuilder app)\n        {\n            ConfigureAuth(app);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Account/ConfirmEmail.cshtml",
    "content": "﻿@{\n    ViewBag.Title = \"電子メールの確認\";\n}\n\n<h2>@ViewBag.Title</h2>\n<div>\n    <p>\n        電子メールをご確認いただき、ありがとうございます。@Html.ActionLink(\"ログインするにはここをクリック\", \"Login\", \"Account\", routeValues: null, htmlAttributes: new { id = \"loginLink\" })してください。\n    </p>\n</div>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Account/ExternalLoginConfirmation.cshtml",
    "content": "﻿@model WebApplication.Models.ExternalLoginConfirmationViewModel\n@{\n    ViewBag.Title = \"登録\";\n}\n<h2>@ViewBag.Title.</h2>\n<h3>@ViewBag.LoginProvider アカウントを関連付けます。</h3>\n\n@using (Html.BeginForm(\"ExternalLoginConfirmation\", \"Account\", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" }))\n{\n    @Html.AntiForgeryToken()\n\n    <h4>関連付けフォーム</h4>\n    <hr />\n    @Html.ValidationSummary(true, \"\", new { @class = \"text-danger\" })\n    <p class=\"text-info\">\n        この <strong>@ViewBag.LoginProvider</strong> での認証に成功しました。\n        ログインを完了するには、このサイトでのユーザー名を下の欄に入力して [登録] ボタンを\n        クリックしてください。\n    </p>\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.Email, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.TextBoxFor(m => m.Email, new { @class = \"form-control\" })\n            @Html.ValidationMessageFor(m => m.Email, \"\", new { @class = \"text-danger\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        <div class=\"col-md-offset-2 col-md-10\">\n            <input type=\"submit\" class=\"btn btn-default\" value=\"登録\" />\n        </div>\n    </div>\n}\n\n@section Scripts {\n    @Scripts.Render(\"~/bundles/jqueryval\")\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Account/ExternalLoginFailure.cshtml",
    "content": "﻿@{\n    ViewBag.Title = \"ログインに失敗しました\";\n}\n\n<hgroup>\n    <h2>@ViewBag.Title.</h2>\n    <h3 class=\"text-danger\">サービスによるログインに失敗しました。</h3>\n</hgroup>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Account/ForgotPassword.cshtml",
    "content": "﻿@model WebApplication.Models.ForgotPasswordViewModel\n@{\n    ViewBag.Title = \"パスワードを忘れた場合\";\n}\n\n<h2>@ViewBag.Title</h2>\n\n@using (Html.BeginForm(\"ForgotPassword\", \"Account\", FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" }))\n{\n    @Html.AntiForgeryToken()\n    <h4>電子メールを入力してください。</h4>\n    <hr />\n    @Html.ValidationSummary(\"\", new { @class = \"text-danger\" })\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.Email, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.TextBoxFor(m => m.Email, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        <div class=\"col-md-offset-2 col-md-10\">\n            <input type=\"submit\" class=\"btn btn-default\" value=\"電子メールのリンク\" />\n        </div>\n    </div>\n}\n\n@section Scripts {\n    @Scripts.Render(\"~/bundles/jqueryval\")\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Account/ForgotPasswordConfirmation.cshtml",
    "content": "﻿@{\n    ViewBag.Title = \"パスワードの失念の確認\";\n}\n\n<hgroup class=\"title\">\n    <h1>@ViewBag.Title</h1>\n</hgroup>\n<div>\n    <p>\n        電子メールを確認してパスワードをリセットしてください。\n    </p>\n</div>\n\t\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Account/Login.cshtml",
    "content": "﻿@using WebApplication.Models\n@model LoginViewModel\n@{\n    ViewBag.Title = \"ログイン\";\n}\n\n<h2>@ViewBag.Title.</h2>\n<div class=\"row\">\n    <div class=\"col-md-8\">\n        <section id=\"loginForm\">\n            @using (Html.BeginForm(\"Login\", \"Account\", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" }))\n            {\n                @Html.AntiForgeryToken()\n                <h4>ローカル アカウントを使用してログインします。</h4>\n                <hr />\n                @Html.ValidationSummary(true, \"\", new { @class = \"text-danger\" })\n                <div class=\"form-group\">\n                    @Html.LabelFor(m => m.Email, new { @class = \"col-md-2 control-label\" })\n                    <div class=\"col-md-10\">\n                        @Html.TextBoxFor(m => m.Email, new { @class = \"form-control\" })\n                        @Html.ValidationMessageFor(m => m.Email, \"\", new { @class = \"text-danger\" })\n                    </div>\n                </div>\n                <div class=\"form-group\">\n                    @Html.LabelFor(m => m.Password, new { @class = \"col-md-2 control-label\" })\n                    <div class=\"col-md-10\">\n                        @Html.PasswordFor(m => m.Password, new { @class = \"form-control\" })\n                        @Html.ValidationMessageFor(m => m.Password, \"\", new { @class = \"text-danger\" })\n                    </div>\n                </div>\n                <div class=\"form-group\">\n                    <div class=\"col-md-offset-2 col-md-10\">\n                        <div class=\"checkbox\">\n                            @Html.CheckBoxFor(m => m.RememberMe)\n                            @Html.LabelFor(m => m.RememberMe)\n                        </div>\n                    </div>\n                </div>\n                <div class=\"form-group\">\n                    <div class=\"col-md-offset-2 col-md-10\">\n                        <input type=\"submit\" value=\"ログイン\" class=\"btn btn-default\" />\n                    </div>\n                </div>\n                <p>\n                    @Html.ActionLink(\"新しいユーザーとして登録する\", \"Register\")\n                </p>\n                @* これを有効にする前に、パスワード リセット機能に対するアカウント確認を有効にしてください。\n                    <p>\n                        @Html.ActionLink(\"パスワードを忘れた場合\", \"ForgotPassword\")\n                    </p>*@\n            }\n        </section>\n    </div>\n    <div class=\"col-md-4\">\n        <section id=\"socialLoginForm\">\n            @Html.Partial(\"_ExternalLoginsListPartial\", new ExternalLoginListViewModel { ReturnUrl = ViewBag.ReturnUrl })\n        </section>\n    </div>\n</div>\n\n@section Scripts {\n    @Scripts.Render(\"~/bundles/jqueryval\")\n}"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Account/Register.cshtml",
    "content": "﻿@model WebApplication.Models.RegisterViewModel\n@{\n    ViewBag.Title = \"登録\";\n}\n\n<h2>@ViewBag.Title.</h2>\n\n@using (Html.BeginForm(\"Register\", \"Account\", FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" }))\n{\n    @Html.AntiForgeryToken()\n    <h4>新しいアカウントを作成します。</h4>\n    <hr />\n    @Html.ValidationSummary(\"\", new { @class = \"text-danger\" })\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.Email, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.TextBoxFor(m => m.Email, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.Password, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.PasswordFor(m => m.Password, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.ConfirmPassword, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.PasswordFor(m => m.ConfirmPassword, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        <div class=\"col-md-offset-2 col-md-10\">\n            <input type=\"submit\" class=\"btn btn-default\" value=\"登録\" />\n        </div>\n    </div>\n}\n\n@section Scripts {\n    @Scripts.Render(\"~/bundles/jqueryval\")\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Account/ResetPassword.cshtml",
    "content": "﻿@model WebApplication.Models.ResetPasswordViewModel\n@{\n    ViewBag.Title = \"パスワードのリセット\";\n}\n\n<h2>@ViewBag.Title</h2>\n\n@using (Html.BeginForm(\"ResetPassword\", \"Account\", FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" }))\n{\n    @Html.AntiForgeryToken()\n    <h4>パスワードをリセットしてください。</h4>\n    <hr />\n    @Html.ValidationSummary(\"\", new { @class = \"text-danger\" })\n    @Html.HiddenFor(model => model.Code)\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.Email, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.TextBoxFor(m => m.Email, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.Password, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.PasswordFor(m => m.Password, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.ConfirmPassword, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.PasswordFor(m => m.ConfirmPassword, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        <div class=\"col-md-offset-2 col-md-10\">\n            <input type=\"submit\" class=\"btn btn-default\" value=\"リセット\" />\n        </div>\n    </div>\n}\n\n@section Scripts {\n    @Scripts.Render(\"~/bundles/jqueryval\")\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Account/ResetPasswordConfirmation.cshtml",
    "content": "﻿@{\n    ViewBag.Title = \"パスワードのリセットの確認\";\n}\n\n<hgroup class=\"title\">\n    <h1>@ViewBag.Title</h1>\n</hgroup>\n<div>\n    <p>\n        パスワードがリセットされました。@Html.ActionLink(\"ここをクリックしてログイン\", \"Login\", \"Account\", routeValues: null, htmlAttributes: new { id = \"loginLink\" })してください\n    </p>\n</div>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Account/SendCode.cshtml",
    "content": "﻿@model WebApplication.Models.SendCodeViewModel\n@{\n    ViewBag.Title = \"送信\";\n}\n\n<h2>@ViewBag.Title.</h2>\n\n@using (Html.BeginForm(\"SendCode\", \"Account\", new { ReturnUrl = Model.ReturnUrl }, FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" })) {\n    @Html.AntiForgeryToken()\n    @Html.Hidden(\"rememberMe\", @Model.RememberMe)\n    <h4>確認コードを送信する</h4>\n    <hr />\n    <div class=\"row\">\n        <div class=\"col-md-8\">\n            2 要素認証プロバイダーの選択:\n            @Html.DropDownListFor(model => model.SelectedProvider, Model.Providers)\n            <input type=\"submit\" value=\"送信\" class=\"btn btn-default\" />\n        </div>\n    </div>\n}\n\n@section Scripts {\n    @Scripts.Render(\"~/bundles/jqueryval\")\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Account/VerifyCode.cshtml",
    "content": "﻿@model WebApplication.Models.VerifyCodeViewModel\n@{\n    ViewBag.Title = \"確認\";\n}\n\n<h2>@ViewBag.Title.</h2>\n\n@using (Html.BeginForm(\"VerifyCode\", \"Account\", new { ReturnUrl = Model.ReturnUrl }, FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" })) {\n    @Html.AntiForgeryToken()\n    @Html.Hidden(\"provider\", @Model.Provider)\n    @Html.Hidden(\"rememberMe\", @Model.RememberMe)\n    <h4>確認コードを入力する</h4>\n    <hr />\n    @Html.ValidationSummary(\"\", new { @class = \"text-danger\" })\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.Code, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.TextBoxFor(m => m.Code, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        <div class=\"col-md-offset-2 col-md-10\">\n            <div class=\"checkbox\">\n                @Html.CheckBoxFor(m => m.RememberBrowser)\n                @Html.LabelFor(m => m.RememberBrowser)\n            </div>\n        </div>\n    </div>\n    <div class=\"form-group\">\n        <div class=\"col-md-offset-2 col-md-10\">\n            <input type=\"submit\" class=\"btn btn-default\" value=\"送信\" />\n        </div>\n    </div>\n}\n\n@section Scripts {\n    @Scripts.Render(\"~/bundles/jqueryval\")\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Account/_ExternalLoginsListPartial.cshtml",
    "content": "﻿@model WebApplication.Models.ExternalLoginListViewModel\n@using Microsoft.Owin.Security\n\n<h4>別のサービスを使用してログインしてください。</h4>\n<hr />\n@{\n    var loginProviders = Context.GetOwinContext().Authentication.GetExternalAuthenticationTypes();\n    if (loginProviders.Count() == 0) {\n        <div>\n            <p>\n                構成済みの外部認証サービスはありません。外部サービス経由のログインをサポートするようにこの ASP.NET アプリケーションを設定する方法の\n                詳細については、<a href=\"http://go.microsoft.com/fwlink/?LinkId=403804\">こちらの記事</a>をご覧ください。\n            </p>\n        </div>\n    }\n    else {\n        using (Html.BeginForm(\"ExternalLogin\", \"Account\", new { ReturnUrl = Model.ReturnUrl })) {\n            @Html.AntiForgeryToken()\n            <div id=\"socialLoginList\">\n                <p>\n                    @foreach (AuthenticationDescription p in loginProviders) {\n                        <button type=\"submit\" class=\"btn btn-default\" id=\"@p.AuthenticationType\" name=\"provider\" value=\"@p.AuthenticationType\" title=\"@p.Caption アカウントを使用してログイン\">@p.AuthenticationType</button>\n                    }\n                </p>\n            </div>\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Home/About.cshtml",
    "content": "﻿@{\n    ViewBag.Title = \"About\";\n}\n<h2>@ViewBag.Title.</h2>\n<h3>@ViewBag.Message</h3>\n\n<p>Use this area to provide additional information.</p>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Home/Contact.cshtml",
    "content": "﻿@{\n    ViewBag.Title = \"Contact\";\n}\n<h2>@ViewBag.Title.</h2>\n<h3>@ViewBag.Message</h3>\n\n<address>\n    One Microsoft Way<br />\n    Redmond, WA 98052-6399<br />\n    <abbr title=\"Phone\">P:</abbr>\n    425.555.0100\n</address>\n\n<address>\n    <strong>Support:</strong>   <a href=\"mailto:Support@example.com\">Support@example.com</a><br />\n    <strong>Marketing:</strong> <a href=\"mailto:Marketing@example.com\">Marketing@example.com</a>\n</address>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Home/Index.cshtml",
    "content": "﻿@{\n    ViewBag.Title = \"Home Page\";\n}\n\n<div class=\"jumbotron\">\n    <h1>ASP.NET</h1>\n    <p class=\"lead\">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p>\n    <p><a href=\"http://asp.net\" class=\"btn btn-primary btn-lg\">Learn more &raquo;</a></p>\n</div>\n\n<div class=\"row\">\n    <div class=\"col-md-4\">\n        <h2>Getting started</h2>\n        <p>\n            ASP.NET MVC gives you a powerful, patterns-based way to build dynamic websites that\n            enables a clean separation of concerns and gives you full control over markup\n            for enjoyable, agile development.\n        </p>\n        <p><a class=\"btn btn-default\" href=\"http://go.microsoft.com/fwlink/?LinkId=301865\">Learn more &raquo;</a></p>\n    </div>\n    <div class=\"col-md-4\">\n        <h2>Get more libraries</h2>\n        <p>NuGet is a free Visual Studio extension that makes it easy to add, remove, and update libraries and tools in Visual Studio projects.</p>\n        <p><a class=\"btn btn-default\" href=\"http://go.microsoft.com/fwlink/?LinkId=301866\">Learn more &raquo;</a></p>\n    </div>\n    <div class=\"col-md-4\">\n        <h2>Web Hosting</h2>\n        <p>You can easily find a web hosting company that offers the right mix of features and price for your applications.</p>\n        <p><a class=\"btn btn-default\" href=\"http://go.microsoft.com/fwlink/?LinkId=301867\">Learn more &raquo;</a></p>\n    </div>\n</div>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Manage/AddPhoneNumber.cshtml",
    "content": "﻿@model WebApplication.Models.AddPhoneNumberViewModel\n@{\n    ViewBag.Title = \"電話番号\";\n}\n\n<h2>@ViewBag.Title.</h2>\n\n@using (Html.BeginForm(\"AddPhoneNumber\", \"Manage\", FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" }))\n{\n    @Html.AntiForgeryToken()\n    <h4>電話番号の追加</h4>\n    <hr />\n    @Html.ValidationSummary(\"\", new { @class = \"text-danger\" })\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.Number, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.TextBoxFor(m => m.Number, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        <div class=\"col-md-offset-2 col-md-10\">\n            <input type=\"submit\" class=\"btn btn-default\" value=\"送信\" />\n        </div>\n    </div>\n}\n\n@section Scripts {\n    @Scripts.Render(\"~/bundles/jqueryval\")\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Manage/ChangePassword.cshtml",
    "content": "﻿@model WebApplication.Models.ChangePasswordViewModel\n@{\n    ViewBag.Title = \"パスワードの変更\";\n}\n\n<h2>@ViewBag.Title.</h2>\n\n@using (Html.BeginForm(\"ChangePassword\", \"Manage\", FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" }))\n{\n    @Html.AntiForgeryToken()\n    <h4>パスワード変更フォーム</h4>\n    <hr />\n    @Html.ValidationSummary(\"\", new { @class = \"text-danger\" })\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.OldPassword, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.PasswordFor(m => m.OldPassword, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.NewPassword, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.PasswordFor(m => m.NewPassword, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.ConfirmPassword, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.PasswordFor(m => m.ConfirmPassword, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        <div class=\"col-md-offset-2 col-md-10\">\n            <input type=\"submit\" value=\"パスワードの変更\" class=\"btn btn-default\" />\n        </div>\n    </div>\n}\n@section Scripts {\n    @Scripts.Render(\"~/bundles/jqueryval\")\n}"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Manage/Index.cshtml",
    "content": "﻿@model WebApplication.Models.IndexViewModel\n@{\n    ViewBag.Title = \"管理\";\n}\n\n<h2>@ViewBag.Title.</h2>\n\n<p class=\"text-success\">@ViewBag.StatusMessage</p>\n<div>\n    <h4>アカウント設定の変更</h4>\n    <hr />\n    <dl class=\"dl-horizontal\">\n        <dt>パスワード:</dt>\n        <dd>\n            [\n            @if (Model.HasPassword)\n            {\n                @Html.ActionLink(\"パスワードの変更\", \"ChangePassword\")\n            }\n            else\n            {\n                @Html.ActionLink(\"作成\", \"SetPassword\")\n            }\n            ]\n        </dd>\n        <dt>外部ログイン:</dt>\n        <dd>\n            @Model.Logins.Count [\n            @Html.ActionLink(\"管理\", \"ManageLogins\") ]\n        </dd>\n        @*\n            電話番号を 2 要素認証システムの第 2 認証要素としてお使いいただけます。\n             \n             SMS を使用する 2 要素認証をサポートするようにこの ASP.NET アプリケーションを設定する方法の詳細については、\n                <a href=\"http://go.microsoft.com/fwlink/?LinkId=403804\">こちらの記事</a>をご覧ください。\n             \n             2 要素認証の設定が完了したら、次のブロックのコメントを解除してください。\n        *@\n        @*  \n            <dt>電話番号:</dt>\n            <dd>\n                @(Model.PhoneNumber ?? \"なし\") [\n                @if (Model.PhoneNumber != null)\n                {\n                    @Html.ActionLink(\"変更\", \"AddPhoneNumber\")\n                    @: &nbsp;|&nbsp;\n                    @Html.ActionLink(\"削除\", \"RemovePhoneNumber\")\n                }\n                else\n                {\n                    @Html.ActionLink(\"追加\", \"AddPhoneNumber\")\n                }\n                ]\n            </dd>\n        *@\n        <dt>2 要素認証:</dt>\n        <dd>\n            <p>\n                構成済みの 2 要素認証プロバイダーはありません。2 要素認証をサポートするようにこの ASP.NET アプリケーションを設定する方法の\n                詳細については、<a href=\"http://go.microsoft.com/fwlink/?LinkId=403804\">こちらの記事</a>をご覧ください。\n            </p>\n            @*@if (Model.TwoFactor)\n                {\n                    using (Html.BeginForm(\"DisableTwoFactorAuthentication\", \"Manage\", FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" }))\n                    {\n                        @Html.AntiForgeryToken()\n                        <text>有効\n                        <input type=\"submit\" value=\"無効にする\" class=\"btn btn-link\" />\n                        </text>\n                    }\n                }\n                else\n                {\n                    using (Html.BeginForm(\"EnableTwoFactorAuthentication\", \"Manage\", FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" }))\n                    {\n                        @Html.AntiForgeryToken()\n                        <text>無効\n                        <input type=\"submit\" value=\"有効にする\" class=\"btn btn-link\" />\n                        </text>\n                    }\n                }*@\n        </dd>\n    </dl>\n</div>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Manage/ManageLogins.cshtml",
    "content": "﻿@model WebApplication.Models.ManageLoginsViewModel\n@using Microsoft.Owin.Security\n@{\n    ViewBag.Title = \"外部ログインの管理\";\n}\n\n<h2>@ViewBag.Title.</h2>\n\n<p class=\"text-success\">@ViewBag.StatusMessage</p>\n@{\n    var loginProviders = Context.GetOwinContext().Authentication.GetExternalAuthenticationTypes();\n    if (loginProviders.Count() == 0) {\n        <div>\n            <p>\n                構成済みの外部認証サービスはありません。外部サービス経由のログインをサポートするようにこの ASP.NET アプリケーションを設定する方法の\n                詳細については、<a href=\"http://go.microsoft.com/fwlink/?LinkId=313242\">こちらの記事</a>をご覧ください。\n            </p>\n        </div>\n    }\n    else\n    {\n        if (Model.CurrentLogins.Count > 0)\n        {\n            <h4>登録済みのログイン</h4>\n            <table class=\"table\">\n                <tbody>\n                    @foreach (var account in Model.CurrentLogins)\n                    {\n                        <tr>\n                            <td>@account.LoginProvider</td>\n                            <td>\n                                @if (ViewBag.ShowRemoveButton)\n                                {\n                                    using (Html.BeginForm(\"RemoveLogin\", \"Manage\"))\n                                    {\n                                        @Html.AntiForgeryToken()\n                                        <div>\n                                            @Html.Hidden(\"loginProvider\", account.LoginProvider)\n                                            @Html.Hidden(\"providerKey\", account.ProviderKey)\n                                            <input type=\"submit\" class=\"btn btn-default\" value=\"削除\" title=\"この @account.LoginProvider ログインをアカウントから削除します\" />\n                                        </div>\n                                    }\n                                }\n                                else\n                                {\n                                    @: &nbsp;\n                                }\n                            </td>\n                        </tr>\n                    }\n                </tbody>\n            </table>\n        }\n        if (Model.OtherLogins.Count > 0)\n        {\n            using (Html.BeginForm(\"LinkLogin\", \"Manage\"))\n            {\n                @Html.AntiForgeryToken()\n                <div id=\"socialLoginList\">\n                <p>\n                    @foreach (AuthenticationDescription p in Model.OtherLogins)\n                    {\n                        <button type=\"submit\" class=\"btn btn-default\" id=\"@p.AuthenticationType\" name=\"provider\" value=\"@p.AuthenticationType\" title=\"@p.Caption アカウントを使用してログイン\">@p.AuthenticationType</button>\n                    }\n                </p>\n                </div>\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Manage/SetPassword.cshtml",
    "content": "﻿@model WebApplication.Models.SetPasswordViewModel\n@{\n    ViewBag.Title = \"パスワードの作成\";\n}\n\n<h2>@ViewBag.Title.</h2>\n<p class=\"text-info\">\n    このサイトに対するローカルのユーザー名/パスワードがありません。外部ログインを使用しないで\n    ログインするには、ローカルのアカウントを追加してください。\n</p>\n\n@using (Html.BeginForm(\"SetPassword\", \"Manage\", FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" }))\n{\n    @Html.AntiForgeryToken()\n\n    <h4>ローカル ログインの作成</h4>\n    <hr />\n    @Html.ValidationSummary(\"\", new { @class = \"text-danger\" })\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.NewPassword, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.PasswordFor(m => m.NewPassword, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.ConfirmPassword, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.PasswordFor(m => m.ConfirmPassword, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        <div class=\"col-md-offset-2 col-md-10\">\n            <input type=\"submit\" value=\"パスワードの設定\" class=\"btn btn-default\" />\n        </div>\n    </div>\n}\n@section Scripts {\n    @Scripts.Render(\"~/bundles/jqueryval\")\n}"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Manage/VerifyPhoneNumber.cshtml",
    "content": "﻿@model WebApplication.Models.VerifyPhoneNumberViewModel\n@{\n    ViewBag.Title = \"電話番号を確認\";\n}\n\n<h2>@ViewBag.Title.</h2>\n\n@using (Html.BeginForm(\"VerifyPhoneNumber\", \"Manage\", FormMethod.Post, new { @class = \"form-horizontal\", role = \"form\" }))\n{\n    @Html.AntiForgeryToken()\n    @Html.Hidden(\"phoneNumber\", @Model.PhoneNumber)\n    <h4>確認コードを入力してください</h4>\n    <h5>@ViewBag.Status</h5>\n    <hr />\n    @Html.ValidationSummary(\"\", new { @class = \"text-danger\" })\n    <div class=\"form-group\">\n        @Html.LabelFor(m => m.Code, new { @class = \"col-md-2 control-label\" })\n        <div class=\"col-md-10\">\n            @Html.TextBoxFor(m => m.Code, new { @class = \"form-control\" })\n        </div>\n    </div>\n    <div class=\"form-group\">\n        <div class=\"col-md-offset-2 col-md-10\">\n            <input type=\"submit\" class=\"btn btn-default\" value=\"送信\" />\n        </div>\n    </div>\n}\n\n@section Scripts {\n    @Scripts.Render(\"~/bundles/jqueryval\")\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Shared/Error.cshtml",
    "content": "﻿{\n    Layout = null;\n}\n\n<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n    <meta name=\"viewport\" content=\"width=device-width\" />\n    <title>エラー</title>\n</head>\n<body>\n    <hgroup>\n        <h1>エラー。</h1>\n        <h2>要求の処理中にエラーが発生しました。</h2>\n    </hgroup>\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Shared/Lockout.cshtml",
    "content": "﻿@model System.Web.Mvc.HandleErrorInfo\n\n@{\n    ViewBag.Title = \"ロックアウト\";\n}\n\n<hgroup>\n    <h1 class=\"text-danger\">ロックアウトされています。</h1>\n    <h2 class=\"text-danger\">このアカウントはロックアウトされています。しばらくしてから、もう一度お試しください。</h2>\n</hgroup>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Shared/_Layout.cshtml",
    "content": "﻿<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\"/>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>@ViewBag.Title - マイ ASP.NET アプリケーション</title>\n    @Styles.Render(\"~/Content/css\")\n    @Scripts.Render(\"~/bundles/modernizr\")\n\n</head>\n<body>\n    <div class=\"navbar navbar-inverse navbar-fixed-top\">\n        <div class=\"container\">\n            <div class=\"navbar-header\">\n                <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                    <span class=\"icon-bar\"></span>\n                </button>\n                @Html.ActionLink(\"アプリケーション名\", \"Index\", \"Home\", new { area = \"\" }, new { @class = \"navbar-brand\" })\n            </div>\n            <div class=\"navbar-collapse collapse\">\n                <ul class=\"nav navbar-nav\">\n                    <li>@Html.ActionLink(\"ホーム\", \"Index\", \"Home\")</li>\n                    <li>@Html.ActionLink(\"詳細\", \"About\", \"Home\")</li>\n                    <li>@Html.ActionLink(\"連絡先\", \"Contact\", \"Home\")</li>\n                </ul>\n                @Html.Partial(\"_LoginPartial\")\n            </div>\n        </div>\n    </div>\n    <div class=\"container body-content\">\n        @RenderBody()\n        <hr />\n        <footer>\n            <p>&copy; @DateTime.Now.Year - マイ ASP.NET アプリケーション</p>\n        </footer>\n    </div>\n\n    @Scripts.Render(\"~/bundles/jquery\")\n    @Scripts.Render(\"~/bundles/bootstrap\")\n    @RenderSection(\"scripts\", required: false)\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Shared/_LoginPartial.cshtml",
    "content": "﻿@using Microsoft.AspNet.Identity\n@if (Request.IsAuthenticated)\n{\n    using (Html.BeginForm(\"LogOff\", \"Account\", FormMethod.Post, new { id = \"logoutForm\", @class = \"navbar-right\" }))\n    {\n    @Html.AntiForgeryToken()\n\n    <ul class=\"nav navbar-nav navbar-right\">\n        <li>\n            @Html.ActionLink(\"こんにちは、\" + User.Identity.GetUserName() + \"さん\", \"Index\", \"Manage\", routeValues: null, htmlAttributes: new { title = \"Manage\" })\n        </li>\n        <li><a href=\"javascript:document.getElementById('logoutForm').submit()\">ログオフ</a></li>\n    </ul>\n    }\n}\nelse\n{\n    <ul class=\"nav navbar-nav navbar-right\">\n        <li>@Html.ActionLink(\"登録\", \"Register\", \"Account\", routeValues: null, htmlAttributes: new { id = \"registerLink\" })</li>\n        <li>@Html.ActionLink(\"ログイン\", \"Login\", \"Account\", routeValues: null, htmlAttributes: new { id = \"loginLink\" })</li>\n    </ul>\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/Web.config",
    "content": "﻿<?xml version=\"1.0\"?>\n\n<configuration>\n  <configSections>\n    <sectionGroup name=\"system.web.webPages.razor\" type=\"System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35\">\n      <section name=\"host\" type=\"System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35\" requirePermission=\"false\" />\n      <section name=\"pages\" type=\"System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35\" requirePermission=\"false\" />\n    </sectionGroup>\n  </configSections>\n\n  <system.web.webPages.razor>\n    <host factoryType=\"System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35\" />\n    <pages pageBaseType=\"System.Web.Mvc.WebViewPage\">\n      <namespaces>\n        <add namespace=\"System.Web.Mvc\" />\n        <add namespace=\"System.Web.Mvc.Ajax\" />\n        <add namespace=\"System.Web.Mvc.Html\" />\n        <add namespace=\"System.Web.Optimization\"/>\n        <add namespace=\"System.Web.Routing\" />\n        <add namespace=\"WebApplication\" />\n      </namespaces>\n    </pages>\n  </system.web.webPages.razor>\n\n  <appSettings>\n    <add key=\"webpages:Enabled\" value=\"false\" />\n  </appSettings>\n\n  <system.webServer>\n    <handlers>\n      <remove name=\"BlockViewHandler\"/>\n      <add name=\"BlockViewHandler\" path=\"*\" verb=\"*\" preCondition=\"integratedMode\" type=\"System.Web.HttpNotFoundHandler\" />\n    </handlers>\n  </system.webServer>\n\n  <system.web>\n    <compilation>\n      <assemblies>\n        <add assembly=\"System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35\" />\n      </assemblies>\n    </compilation>\n  </system.web>\n</configuration>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Views/_ViewStart.cshtml",
    "content": "﻿@{\n    Layout = \"~/Views/Shared/_Layout.cshtml\";\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Web.Debug.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- Web.config 変換の使用の詳細については、http://go.microsoft.com/fwlink/?LinkId=301874 を参照してください -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    以下の例では、\"SetAttributes\" 変換により、値が \"MyDB\" の属性 \"name\" を \n    \"Match\" ロケーターが検出した場合にのみ \"connectionString\" の値に\n     \"ReleaseSQLServer\" を使用するよう変更されます。\n\n    <connectionStrings>\n      <add name=\"MyDB\"\n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\"\n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      以下の例では、\"Replace\" 変換により Web.config ファイルの\n <customErrors> セクション全体が置換されます。\n <system.web> ノードには 1 つの customErrors セクションしかないため、\n \"xdt:Locator\" 属性を使用する必要はありません。\n\n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Web.Release.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- Web.config 変換の使用の詳細については、http://go.microsoft.com/fwlink/?LinkId=301874 を参照してください -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    以下の例では、\"SetAttributes\" 変換により、値が \"MyDB\" の属性 \"name\" を \n    \"Match\" ロケーターが検出した場合にのみ \"connectionString\" の値に\n     \"ReleaseSQLServer\" を使用するよう変更されます。\n\n    <connectionStrings>\n      <add name=\"MyDB\"\n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\"\n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      以下の例では、\"Replace\" 変換により Web.config ファイルの\n <customErrors> セクション全体が置換されます。\n <system.web> ノードには 1 つの customErrors セクションしかないため、\n \"xdt:Locator\" 属性を使用する必要はありません。\n\n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/Web.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n  ASP.NET アプリケーションの構成方法の詳細については、\n  http://go.microsoft.com/fwlink/?LinkId=301880 を参照してください\n  -->\n<configuration>\n  <configSections>\n    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->\n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" requirePermission=\"false\" />\n  </configSections>\n  <connectionStrings>\n    <add name=\"DefaultConnection\" connectionString=\"Data Source=(LocalDb)\\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\\aspnet-WebApplication-20150516063851.mdf;Initial Catalog=aspnet-WebApplication-20150516063851;Integrated Security=True\"\n      providerName=\"System.Data.SqlClient\" />\n  </connectionStrings>\n  <appSettings>\n    <add key=\"webpages:Version\" value=\"3.0.0.0\" />\n    <add key=\"webpages:Enabled\" value=\"false\" />\n    <add key=\"ClientValidationEnabled\" value=\"true\" />\n    <add key=\"UnobtrusiveJavaScriptEnabled\" value=\"true\" />\n  </appSettings>\n  <system.web>\n    <authentication mode=\"None\" />\n    <compilation debug=\"true\" targetFramework=\"4.6\" />\n    <httpRuntime targetFramework=\"4.6\" />\n  </system.web>\n  <system.webServer>\n    <modules>\n      <remove name=\"FormsAuthentication\" />\n    </modules>\n  </system.webServer>\n  <runtime>\n    <assemblyBinding xmlns=\"urn:schemas-microsoft-com:asm.v1\">\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Owin.Security\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.1.0\" newVersion=\"3.0.1.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Owin.Security.OAuth\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.1.0\" newVersion=\"3.0.1.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Owin.Security.Cookies\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.1.0\" newVersion=\"3.0.1.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Microsoft.Owin\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.1.0\" newVersion=\"3.0.1.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"Newtonsoft.Json\" culture=\"neutral\" publicKeyToken=\"30ad4fe6b2a6aeed\" />\n        <bindingRedirect oldVersion=\"0.0.0.0-6.0.0.0\" newVersion=\"6.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Optimization\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-1.1.0.0\" newVersion=\"1.1.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"WebGrease\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-1.5.2.14234\" newVersion=\"1.5.2.14234\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Helpers\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.Mvc\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-5.2.3.0\" newVersion=\"5.2.3.0\" />\n      </dependentAssembly>\n      <dependentAssembly>\n        <assemblyIdentity name=\"System.Web.WebPages\" publicKeyToken=\"31bf3856ad364e35\" />\n        <bindingRedirect oldVersion=\"1.0.0.0-3.0.0.0\" newVersion=\"3.0.0.0\" />\n      </dependentAssembly>\n    </assemblyBinding>\n  </runtime>\n  <entityFramework>\n    <defaultConnectionFactory type=\"System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework\">\n      <parameters>\n        <parameter value=\"mssqllocaldb\" />\n      </parameters>\n    </defaultConnectionFactory>\n    <providers>\n      <provider invariantName=\"System.Data.SqlClient\" type=\"System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer\" />\n    </providers>\n  </entityFramework>\n</configuration>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/WebApplication.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{0972B3BF-78B7-4D1C-B376-6BBC3C11F8B5}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>WebApplication</RootNamespace>\n    <AssemblyName>WebApplication</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <MvcBuildViews>false</MvcBuildViews>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Web.Abstractions\" />\n    <Reference Include=\"System.Web.Routing\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n    <Reference Include=\"Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.Web.Infrastructure.1.0.0.0\\lib\\net40\\Microsoft.Web.Infrastructure.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Net.Http\">\n    </Reference>\n    <Reference Include=\"System.Net.Http.WebRequest\">\n    </Reference>\n    <Reference Include=\"System.Web.Helpers, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.AspNet.WebPages.3.2.3\\lib\\net45\\System.Web.Helpers.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Mvc, Version=__MvcPagesVersion__, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.AspNet.Mvc.5.2.3\\lib\\net45\\System.Web.Mvc.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Optimization\">\n      <HintPath>..\\packages\\Microsoft.AspNet.Web.Optimization.1.1.3\\lib\\net40\\System.Web.Optimization.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.AspNet.Razor.3.2.3\\lib\\net45\\System.Web.Razor.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.AspNet.WebPages.3.2.3\\lib\\net45\\System.Web.WebPages.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.WebPages.Deployment, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.AspNet.WebPages.3.2.3\\lib\\net45\\System.Web.WebPages.Deployment.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Microsoft.AspNet.WebPages.3.2.3\\lib\\net45\\System.Web.WebPages.Razor.dll</HintPath>\n    </Reference>\n    <Reference Include=\"WebGrease\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\WebGrease.1.5.2\\lib\\WebGrease.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Antlr3.Runtime\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\Antlr.3.4.1.9004\\lib\\Antlr3.Runtime.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Reference Include=\"Newtonsoft.Json\">\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.4\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"EntityFramework\">\n      <HintPath>..\\packages\\EntityFramework.6.1.2\\lib\\net45\\EntityFramework.dll</HintPath>\n    </Reference>\n    <Reference Include=\"EntityFramework.SqlServer\">\n      <HintPath>..\\packages\\EntityFramework.6.1.2\\lib\\net45\\EntityFramework.SqlServer.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.Identity.Core\">\n      <HintPath>..\\packages\\Microsoft.AspNet.Identity.Core.2.2.0\\lib\\net45\\Microsoft.AspNet.Identity.Core.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.Identity.Owin\">\n      <HintPath>..\\packages\\Microsoft.AspNet.Identity.Owin.2.2.0\\lib\\net45\\Microsoft.AspNet.Identity.Owin.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.AspNet.Identity.EntityFramework\">\n      <HintPath>..\\packages\\Microsoft.AspNet.Identity.EntityFramework.2.2.0\\lib\\net45\\Microsoft.AspNet.Identity.EntityFramework.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Owin\">\n      <HintPath>..\\packages\\Owin.1.0\\lib\\net40\\Owin.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Owin\">\n      <HintPath>..\\packages\\Microsoft.Owin.3.0.1\\lib\\net45\\Microsoft.Owin.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Owin.Host.SystemWeb\">\n      <HintPath>..\\packages\\Microsoft.Owin.Host.SystemWeb.3.0.1\\lib\\net45\\Microsoft.Owin.Host.SystemWeb.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Owin.Security\">\n      <HintPath>..\\packages\\Microsoft.Owin.Security.3.0.1\\lib\\net45\\Microsoft.Owin.Security.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Owin.Security.Facebook\">\n      <HintPath>..\\packages\\Microsoft.Owin.Security.Facebook.3.0.1\\lib\\net45\\Microsoft.Owin.Security.Facebook.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Owin.Security.Cookies\">\n      <HintPath>..\\packages\\Microsoft.Owin.Security.Cookies.3.0.1\\lib\\net45\\Microsoft.Owin.Security.Cookies.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Owin.Security.OAuth\">\n      <HintPath>..\\packages\\Microsoft.Owin.Security.OAuth.3.0.1\\lib\\net45\\Microsoft.Owin.Security.OAuth.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Owin.Security.Google\">\n      <HintPath>..\\packages\\Microsoft.Owin.Security.Google.3.0.1\\lib\\net45\\Microsoft.Owin.Security.Google.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Owin.Security.Twitter\">\n      <HintPath>..\\packages\\Microsoft.Owin.Security.Twitter.3.0.1\\lib\\net45\\Microsoft.Owin.Security.Twitter.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Owin.Security.MicrosoftAccount\">\n      <HintPath>..\\packages\\Microsoft.Owin.Security.MicrosoftAccount.3.0.1\\lib\\net45\\Microsoft.Owin.Security.MicrosoftAccount.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"App_Start\\BundleConfig.cs\" />\n    <Compile Include=\"App_Start\\FilterConfig.cs\" />\n    <Compile Include=\"App_Start\\IdentityConfig.cs\" />\n    <Compile Include=\"App_Start\\RouteConfig.cs\" />\n    <Compile Include=\"App_Start\\Startup.Auth.cs\" />\n    <Compile Include=\"Controllers\\AccountController.cs\" />\n    <Compile Include=\"Controllers\\HomeController.cs\" />\n    <Compile Include=\"Controllers\\ManageController.cs\" />\n    <Compile Include=\"Global.asax.cs\">\n      <DependentUpon>Global.asax</DependentUpon>\n    </Compile>\n    <Compile Include=\"Models\\AccountViewModels.cs\" />\n    <Compile Include=\"Models\\IdentityModels.cs\" />\n    <Compile Include=\"Models\\ManageViewModels.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Startup.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Content\\bootstrap.css\" />\n    <Content Include=\"Content\\bootstrap.min.css\" />\n    <Content Include=\"favicon.ico\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.svg\" />\n    <Content Include=\"Global.asax\" />\n    <Content Include=\"Content\\Site.css\" />\n    <Content Include=\"Scripts\\bootstrap.js\" />\n    <Content Include=\"Scripts\\bootstrap.min.js\" />\n    <None Include=\"Scripts\\jquery-1.10.2.intellisense.js\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.js\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.min.js\" />\n    <None Include=\"Scripts\\jquery.validate-vsdoc.js\" />\n    <Content Include=\"Scripts\\jquery.validate.js\" />\n    <Content Include=\"Scripts\\jquery.validate.min.js\" />\n    <Content Include=\"Scripts\\jquery.validate.unobtrusive.js\" />\n    <Content Include=\"Scripts\\jquery.validate.unobtrusive.min.js\" />\n    <Content Include=\"Scripts\\modernizr-2.6.2.js\" />\n    <Content Include=\"Scripts\\respond.js\" />\n    <Content Include=\"Scripts\\respond.min.js\" />\n    <Content Include=\"Scripts\\_references.js\" />\n    <Content Include=\"Web.config\" />\n    <Content Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </Content>\n    <Content Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </Content>\n    <Content Include=\"Views\\Web.config\" />\n    <Content Include=\"Views\\_ViewStart.cshtml\" />\n    <Content Include=\"Views\\Shared\\Error.cshtml\" />\n    <Content Include=\"Views\\Shared\\_Layout.cshtml\" />\n    <Content Include=\"Views\\Home\\About.cshtml\" />\n    <Content Include=\"Views\\Home\\Contact.cshtml\" />\n    <Content Include=\"Views\\Home\\Index.cshtml\" />\n    <Content Include=\"Scripts\\jquery-1.10.2.min.map\" />\n    <Content Include=\"Views\\Account\\_ExternalLoginsListPartial.cshtml\" />\n    <Content Include=\"Views\\Account\\ConfirmEmail.cshtml\" />\n    <Content Include=\"Views\\Account\\ExternalLoginConfirmation.cshtml\" />\n    <Content Include=\"Views\\Account\\ExternalLoginFailure.cshtml\" />\n    <Content Include=\"Views\\Account\\ForgotPassword.cshtml\" />\n    <Content Include=\"Views\\Account\\ForgotPasswordConfirmation.cshtml\" />\n    <Content Include=\"Views\\Account\\Login.cshtml\" />\n    <Content Include=\"Views\\Account\\Register.cshtml\" />\n    <Content Include=\"Views\\Account\\ResetPassword.cshtml\" />\n    <Content Include=\"Views\\Account\\ResetPasswordConfirmation.cshtml\" />\n    <Content Include=\"Views\\Account\\SendCode.cshtml\" />\n    <Content Include=\"Views\\Account\\VerifyCode.cshtml\" />\n    <Content Include=\"Views\\Manage\\AddPhoneNumber.cshtml\" />\n    <Content Include=\"Views\\Manage\\ChangePassword.cshtml\" />\n    <Content Include=\"Views\\Manage\\Index.cshtml\" />\n    <Content Include=\"Views\\Manage\\ManageLogins.cshtml\" />\n    <Content Include=\"Views\\Manage\\SetPassword.cshtml\" />\n    <Content Include=\"Views\\Manage\\VerifyPhoneNumber.cshtml\" />\n    <Content Include=\"Views\\Shared\\Lockout.cshtml\" />\n    <Content Include=\"Views\\Shared\\_LoginPartial.cshtml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"App_Data\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"fonts\\glyphicons-halflings-regular.woff\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.ttf\" />\n    <Content Include=\"fonts\\glyphicons-halflings-regular.eot\" />\n    <Content Include=\"packages.config\" />\n    <None Include=\"Project_Readme.html\" />\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <Target Name=\"MvcBuildViews\" AfterTargets=\"AfterBuild\" Condition=\"'$(MvcBuildViews)'=='true'\">\n    <AspNetCompiler VirtualPath=\"temp\" PhysicalPath=\"$(WebProjectOutputDir)\" />\n  </Target>\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>55559</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:55559/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.\n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target> -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WebApplication/packages.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Antlr\" version=\"3.4.1.9004\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"bootstrap\" version=\"3.4.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"EntityFramework\" version=\"6.1.2\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"EntityFramework.ja\" version=\"6.1.2\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"jQuery\" version=\"3.5.0\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"jQuery.Validation\" version=\"1.19.4\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.Identity.Core\" version=\"2.2.0\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.Identity.Core.ja\" version=\"2.2.0\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.Identity.EntityFramework\" version=\"2.2.0\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.Identity.EntityFramework.ja\" version=\"2.2.0\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.Identity.Owin\" version=\"2.2.4\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.Identity.Owin.ja\" version=\"2.2.0\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.Mvc\" version=\"5.2.3\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.Mvc.ja\" version=\"5.2.3\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.Razor\" version=\"3.2.3\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.Razor.ja\" version=\"3.2.3\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.Web.Optimization\" version=\"1.1.3\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.Web.Optimization.ja\" version=\"1.1.3\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.WebPages\" version=\"3.2.3\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.AspNet.WebPages.ja\" version=\"3.2.3\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.jQuery.Unobtrusive.Validation\" version=\"3.2.3\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin\" version=\"4.2.2\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Host.SystemWeb\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Host.SystemWeb.ja\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.ja\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Security\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Security.Cookies\" version=\"4.2.2\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Security.Facebook\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Security.Facebook.ja\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Security.Google\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Security.Google.ja\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Security.ja\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Security.MicrosoftAccount\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Security.MicrosoftAccount.ja\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Security.OAuth\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Security.Twitter\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Owin.Security.Twitter.ja\" version=\"3.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Web.Infrastructure\" version=\"1.0.0.0\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Modernizr\" version=\"2.6.2\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Newtonsoft.Json\" version=\"13.0.1\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Owin\" version=\"1.0\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"Respond\" version=\"1.2.0\" targetFramework=\"net46\" userInstalled=\"true\" />\n  <package id=\"WebGrease\" version=\"1.5.2\" targetFramework=\"net46\" userInstalled=\"true\" />\n</packages>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WpfApplication/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WpfApplication/App.xaml",
    "content": "﻿<Application x:Class=\"WpfApplication.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:WpfApplication\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WpfApplication/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace WpfApplication\n{\n    /// <summary>\n    /// App.xaml の相互作用ロジック\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WpfApplication/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"WpfApplication.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:WpfApplication\"\n        mc:Ignorable=\"d\"\n        Title=\"MainWindow\" Height=\"350\" Width=\"525\">\n    <Grid>\n        \n    </Grid>\n</Window>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WpfApplication/MainWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace WpfApplication\n{\n    /// <summary>\n    /// MainWindow.xaml の相互作用ロジック\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WpfApplication/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"WpfApplication\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"WpfApplication\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから\n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n//ローカライズ可能なアプリケーションのビルドを開始するには、\n//.csproj ファイルの <UICulture>CultureYouAreCodingWith</UICulture> を\n//<PropertyGroup> 内部で設定します。たとえば、\n//ソース ファイルで英語を使用している場合、<UICulture> を en-US に設定します。次に、\n//下の NeutralResourceLanguage 属性のコメントを解除します。下の行の \"en-US\" を\n//プロジェクト ファイルの UICulture 設定と一致するよう更新します。\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //テーマ固有のリソース ディクショナリが置かれている場所\n                                     //(リソースがページ、\n                                     //またはアプリケーション リソース ディクショナリに見つからない場合に使用されます)\n    ResourceDictionaryLocation.SourceAssembly //汎用リソース ディクショナリが置かれている場所\n                                              //(リソースがページ、\n                                              //アプリケーション、またはいずれのテーマ固有のリソース ディクショナリにも見つからない場合に使用されます)\n)]\n\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WpfApplication/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     このコードはツールによって生成されました。\n//     ランタイム バージョン:4.0.30319.0\n//\n//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、\n//     コードが再生成されるときに損失したりします\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace WpfApplication.Properties\n{\n\n\n    /// <summary>\n    ///   ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。\n    /// </summary>\n    // このクラスは StronglyTypedResourceBuilder クラスによって ResGen\n    // または Visual Studio のようなツールを使用して自動生成されました。\n    // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に\n    // ResGen を実行し直すか、または VS プロジェクトをリビルドします。\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources\n    {\n\n        private static global::System.Resources.ResourceManager resourceMan;\n\n        private static global::System.Globalization.CultureInfo resourceCulture;\n\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources()\n        {\n        }\n\n        /// <summary>\n        ///   このクラスに使用される、キャッシュされた ResourceManager のインスタンスを返します。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager\n        {\n            get\n            {\n                if ((resourceMan == null))\n                {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"WpfApplication.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n\n        /// <summary>\n        ///   厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、\n        ///   現在のスレッドの CurrentUICulture プロパティをオーバーライドします。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture\n        {\n            get\n            {\n                return resourceCulture;\n            }\n            set\n            {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WpfApplication/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WpfApplication/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.0\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace WpfApplication.Properties\n{\n\n\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"11.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase\n    {\n\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n\n        public static Settings Default\n        {\n            get\n            {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WpfApplication/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/Game/WpfApplication/WpfApplication.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{8234D45B-C840-419A-8CF5-24B3094BA050}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>WpfApplication</RootNamespace>\n    <AssemblyName>WpfApplication</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <WarningLevel>4</WarningLevel>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xaml\">\n      <RequiredTargetFramework>4.0</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Page Include=\"MainWindow.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"MainWindow.xaml.cs\">\n      <DependentUpon>MainWindow.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <AppDesigner Include=\"Properties\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Android/Class1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace Game.Android\n{\n    public class Class1\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Android/Game.Android.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>8.0.30703</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{5B383079-FF62-4D3B-A602-6E712B117782}</ProjectGuid>\n    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Game.Android</RootNamespace>\n    <AssemblyName>Game.Android</AssemblyName>\n    <FileAlignment>512</FileAlignment>\n    <AndroidResgenFile>Resources\\Resource.Designer.cs</AndroidResgenFile>\n    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>\n    <AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>\n    <TargetFrameworkVersion>v5.0</TargetFrameworkVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Mono.Android\" />\n    <Reference Include=\"mscorlib\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Resources\\Resource.Designer.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Resources\\AboutResources.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <AndroidResource Include=\"Resources\\Values\\Strings.xml\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\Xamarin\\Android\\Xamarin.Android.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Android/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing Android.App;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Game.Android\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Game.Android\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n[assembly: ComVisible(false)]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Android/Resources/AboutResources.txt",
    "content": "Images, layout descriptions, binary blobs and string dictionaries can be included \nin your application as resource files.  Various Android APIs are designed to \noperate on the resource IDs instead of dealing with images, strings or binary blobs \ndirectly.\n\nFor example, a sample Android app that contains a user interface layout (main.xml),\nan internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) \nwould keep its resources in the \"Resources\" directory of the application:\n\nResources/\n    drawable-hdpi/\n        icon.png\n\n    drawable-ldpi/\n        icon.png\n\n    drawable-mdpi/\n        icon.png\n\n    layout/\n        main.xml\n\n    values/\n        strings.xml\n\nIn order to get the build system to recognize Android resources, set the build action to\n\"AndroidResource\".  The native Android APIs do not operate directly with filenames, but \ninstead operate on resource IDs.  When you compile an Android application that uses resources, \nthe build system will package the resources for distribution and generate a class called\n\"Resource\" that contains the tokens for each one of the resources included. For example, \nfor the above Resources layout, this is what the Resource class would expose:\n\npublic class Resource {\n    public class drawable {\n        public const int icon = 0x123;\n    }\n\n    public class layout {\n        public const int main = 0x456;\n    }\n\n    public class strings {\n        public const int first_string = 0xabc;\n        public const int second_string = 0xbcd;\n    }\n}\n\nYou would then use R.drawable.icon to reference the drawable/icon.png file, or Resource.layout.main \nto reference the layout/main.xml file, or Resource.strings.first_string to reference the first \nstring in the dictionary file values/strings.xml."
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Android/Resources/Resource.Designer.cs",
    "content": "#pragma warning disable 1591\n//------------------------------------------------------------------------------\n// <auto-generated>\n//     このコードはツールによって生成されました。\n//     ランタイム バージョン:4.0.30319.0\n//\n//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、\n//     コードが再生成されるときに損失したりします。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\n[assembly: global::Android.Runtime.ResourceDesignerAttribute(\"Game.Android.Resource\", IsApplication=false)]\n\nnamespace Game.Android\n{\n\t\n\t\n\t[System.CodeDom.Compiler.GeneratedCodeAttribute(\"Xamarin.Android.Build.Tasks\", \"1.0.0.0\")]\n\tpublic partial class Resource\n\t{\n\t\t\n\t\tstatic Resource()\n\t\t{\n\t\t\tglobal::Android.Runtime.ResourceIdManager.UpdateIdValues();\n\t\t}\n\t\t\n\t\tpublic partial class Attribute\n\t\t{\n\t\t\t\n\t\t\tstatic Attribute()\n\t\t\t{\n\t\t\t\tglobal::Android.Runtime.ResourceIdManager.UpdateIdValues();\n\t\t\t}\n\t\t\t\n\t\t\tprivate Attribute()\n\t\t\t{\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic partial class String\n\t\t{\n\t\t\t\n\t\t\t// aapt resource value: 0x7f020001\n\t\t\tpublic static int ApplicationName = 2130837505;\n\t\t\t\n\t\t\t// aapt resource value: 0x7f020000\n\t\t\tpublic static int Hello = 2130837504;\n\t\t\t\n\t\t\tstatic String()\n\t\t\t{\n\t\t\t\tglobal::Android.Runtime.ResourceIdManager.UpdateIdValues();\n\t\t\t}\n\t\t\t\n\t\t\tprivate String()\n\t\t\t{\n\t\t\t}\n\t\t}\n\t}\n}\n#pragma warning restore 1591\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Android/Resources/Values/Strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"Hello\">Hello World, Click Me!</string>\n    <string name=\"ApplicationName\">$projectname$</string>\n</resources>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Core/Game.Core.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{8C3B6376-075D-40F7-ADB5-04B971383DD7}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Game.Core</RootNamespace>\n    <AssemblyName>Game.Core</AssemblyName>\n    <DefaultLanguage>ja-JP</DefaultLanguage>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <TargetFrameworkProfile>Profile111</TargetFrameworkProfile>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <!-- A reference to the entire .NET Framework is automatically included -->\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Game.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\Portable\\$(TargetFrameworkVersion)\\Microsoft.Portable.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Core/Game.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace Game.Core\n{\n    public class Game\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Core/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Resources;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"Game.Core\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Game.Core\")]\n[assembly: AssemblyCopyright(\"Copyright (C)  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n[assembly: NeutralResourcesLanguage(\"ja\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン \n//      ビルド番号\n//      リビジョン\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Desktop/Class1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Game.Desktop\n{\n    public class Class1\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Desktop/Game.Desktop.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>cea55bea-5139-4389-83e2-18fc89cf900f</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Game.Desktop</RootNamespace>\n    <AssemblyName>Game.Desktop</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\"/>\n    \n    <Reference Include=\"System.Core\"/>\n    <Reference Include=\"System.Xml.Linq\"/>\n    <Reference Include=\"System.Data.DataSetExtensions\"/>\n    \n    \n    <Reference Include=\"Microsoft.CSharp\"/>\n    \n    <Reference Include=\"System.Data\"/>\n    \n    <Reference Include=\"System.Net.Http\"/>\n    \n    <Reference Include=\"System.Xml\"/>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n\n </Project>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Desktop/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"Game.Desktop\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Game.Desktop\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"cea55bea-5139-4389-83e2-18fc89cf900f\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Ios/Class1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace Game.Ios\n{\n    public class Class1\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Ios/Game.Ios.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">iPhoneSimulator</Platform>\n    <ProductVersion>8.0.30703</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{0AC3EC16-59CE-48BA-B906-579F8E54935A}</ProjectGuid>\n    <ProjectTypeGuids>{FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <RootNamespace>Game.Ios</RootNamespace>\n    <IPhoneResourcePrefix>Resources</IPhoneResourcePrefix>\n    <AssemblyName>Game.Ios</AssemblyName>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\iPhone\\Debug</OutputPath>\n    <DefineConstants>DEBUG</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <ConsolePause>false</ConsolePause>\n    <MtouchDebug>true</MtouchDebug>\n    <CodesignKey>iPhone Developer</CodesignKey>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>none</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\iPhone\\Release</OutputPath>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <ConsolePause>false</ConsolePause>\n    <CodesignKey>iPhone Developer</CodesignKey>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n  </ItemGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"Xamarin.iOS\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\Xamarin\\iOS\\Xamarin.iOS.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Ios/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Game.Ios\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Game.Ios\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"0ac3ec16-59ce-48ba-b906-579f8e54935a\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Server/Class1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Game.Server\n{\n    public class Class1\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Server/Game.Server.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>43e57087-183a-40ae-85fb-5921eb75db0c</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Game.Server</RootNamespace>\n    <AssemblyName>Game.Server</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\"/>\n    \n    <Reference Include=\"System.Core\"/>\n    <Reference Include=\"System.Xml.Linq\"/>\n    <Reference Include=\"System.Data.DataSetExtensions\"/>\n    \n    \n    <Reference Include=\"Microsoft.CSharp\"/>\n    \n    <Reference Include=\"System.Data\"/>\n    \n    <Reference Include=\"System.Net.Http\"/>\n    \n    <Reference Include=\"System.Xml\"/>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n\n </Project>\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Server/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"Game.Server\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Game.Server\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"43e57087-183a-40ae-85fb-5921eb75db0c\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Universal/Class1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Game.Universal\n{\n    public class Class1\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Universal/Game.Universal.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{A71E0005-C0B8-4258-BD02-155E5A361270}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Game.Universal</RootNamespace>\n    <AssemblyName>Game.Universal</AssemblyName>\n    <DefaultLanguage>ja-JP</DefaultLanguage>\n    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>\n    <TargetPlatformVersion>10.0.10069.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.10069.0</TargetPlatformMinVersion>\n    <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|ARM'\">\n    <PlatformTarget>ARM</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|ARM'\">\n    <PlatformTarget>ARM</PlatformTarget>\n    <OutputPath>bin\\ARM\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\n    <PlatformTarget>x64</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\n    <PlatformTarget>x64</PlatformTarget>\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\n    <PlatformTarget>x86</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\n    <PlatformTarget>x86</PlatformTarget>\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Reference Include=\"System.Numerics.Vectors, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Numerics.Vectors.4.0.0\\lib\\win8\\System.Numerics.Vectors.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Numerics.Vectors.WindowsRuntime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Numerics.Vectors.4.0.0\\lib\\win8\\System.Numerics.Vectors.WindowsRuntime.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <PropertyGroup Condition=\" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' \">\n    <VisualStudioVersion>14.0</VisualStudioVersion>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\Microsoft\\WindowsXaml\\v$(VisualStudioVersion)\\Microsoft.Windows.UI.Xaml.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Universal/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Game.Universal\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Game.Universal\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: ComVisible(false)]"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/Game.Universal/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"System.Numerics.Vectors\" version=\"4.0.0\" targetFramework=\"win81\" userInstalled=\"true\" />\n</packages>"
  },
  {
    "path": "Chapters/DevEnv/Dependency/GameFramework/GameFramework.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22823.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Game.Core\", \"Game.Core\\Game.Core.csproj\", \"{8C3B6376-075D-40F7-ADB5-04B971383DD7}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Game.Ios\", \"Game.Ios\\Game.Ios.csproj\", \"{0AC3EC16-59CE-48BA-B906-579F8E54935A}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Game.Android\", \"Game.Android\\Game.Android.csproj\", \"{5B383079-FF62-4D3B-A602-6E712B117782}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Game.Universal\", \"Game.Universal\\Game.Universal.csproj\", \"{A71E0005-C0B8-4258-BD02-155E5A361270}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Game.Desktop\", \"Game.Desktop\\Game.Desktop.csproj\", \"{CEA55BEA-5139-4389-83E2-18FC89CF900F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Game.Server\", \"Game.Server\\Game.Server.csproj\", \"{43E57087-183A-40AE-85FB-5921EB75DB0C}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Release|x64.Build.0 = Release|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{8C3B6376-075D-40F7-ADB5-04B971383DD7}.Release|x86.Build.0 = Release|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Release|x64.Build.0 = Release|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{0AC3EC16-59CE-48BA-B906-579F8E54935A}.Release|x86.Build.0 = Release|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Release|x64.Build.0 = Release|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{5B383079-FF62-4D3B-A602-6E712B117782}.Release|x86.Build.0 = Release|Any CPU\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Debug|x64.Build.0 = Debug|x64\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Debug|x86.Build.0 = Debug|x86\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Release|ARM.Build.0 = Release|ARM\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Release|x64.ActiveCfg = Release|x64\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Release|x64.Build.0 = Release|x64\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Release|x86.ActiveCfg = Release|x86\n\t\t{A71E0005-C0B8-4258-BD02-155E5A361270}.Release|x86.Build.0 = Release|x86\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Release|x64.Build.0 = Release|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{CEA55BEA-5139-4389-83E2-18FC89CF900F}.Release|x86.Build.0 = Release|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Release|x64.Build.0 = Release|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{43E57087-183A-40AE-85FB-5921EB75DB0C}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/アプリ1/App.xaml",
    "content": "﻿<Application\n    x:Class=\"アプリ1.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:local=\"using:アプリ1\"\n    RequestedTheme=\"Light\">\n\n</Application>\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/アプリ1/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.InteropServices.WindowsRuntime;\nusing Windows.ApplicationModel;\nusing Windows.ApplicationModel.Activation;\nusing Windows.Foundation;\nusing Windows.Foundation.Collections;\nusing Windows.UI.Xaml;\nusing Windows.UI.Xaml.Controls;\nusing Windows.UI.Xaml.Controls.Primitives;\nusing Windows.UI.Xaml.Data;\nusing Windows.UI.Xaml.Input;\nusing Windows.UI.Xaml.Media;\nusing Windows.UI.Xaml.Navigation;\n\n// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=402347&clcid=0x409\n\nnamespace アプリ1\n{\n    /// <summary>\n    /// Provides application-specific behavior to supplement the default Application class.\n    /// </summary>\n    sealed partial class App : Application\n    {\n        /// <summary>\n        /// Allows tracking page views, exceptions and other telemetry through the Microsoft Application Insights service.\n        /// </summary>\n        public static Microsoft.ApplicationInsights.TelemetryClient TelemetryClient;\n\n        /// <summary>\n        /// Initializes the singleton application object.  This is the first line of authored code\n        /// executed, and as such is the logical equivalent of main() or WinMain().\n        /// </summary>\n        public App()\n        {\n            TelemetryClient = new Microsoft.ApplicationInsights.TelemetryClient();\n\n            this.InitializeComponent();\n            this.Suspending += OnSuspending;\n        }\n\n        /// <summary>\n        /// Invoked when the application is launched normally by the end user.  Other entry points\n        /// will be used such as when the application is launched to open a specific file.\n        /// </summary>\n        /// <param name=\"e\">Details about the launch request and process.</param>\n        protected override void OnLaunched(LaunchActivatedEventArgs e)\n        {\n\n#if DEBUG\n            if (System.Diagnostics.Debugger.IsAttached)\n            {\n                this.DebugSettings.EnableFrameRateCounter = true;\n            }\n#endif\n\n            Frame rootFrame = Window.Current.Content as Frame;\n\n            // Do not repeat app initialization when the Window already has content,\n            // just ensure that the window is active\n            if (rootFrame == null)\n            {\n                // Create a Frame to act as the navigation context and navigate to the first page\n                rootFrame = new Frame();\n\n                rootFrame.NavigationFailed += OnNavigationFailed;\n\n                if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)\n                {\n                    //TODO: Load state from previously suspended application\n                }\n\n                // Place the frame in the current Window\n                Window.Current.Content = rootFrame;\n            }\n\n            if (rootFrame.Content == null)\n            {\n                // When the navigation stack isn't restored navigate to the first page,\n                // configuring the new page by passing required information as a navigation\n                // parameter\n                rootFrame.Navigate(typeof(MainPage), e.Arguments);\n            }\n            // Ensure the current window is active\n            Window.Current.Activate();\n        }\n\n        /// <summary>\n        /// Invoked when Navigation to a certain page fails\n        /// </summary>\n        /// <param name=\"sender\">The Frame which failed navigation</param>\n        /// <param name=\"e\">Details about the navigation failure</param>\n        void OnNavigationFailed(object sender, NavigationFailedEventArgs e)\n        {\n            throw new Exception(\"Failed to load Page \" + e.SourcePageType.FullName);\n        }\n\n        /// <summary>\n        /// Invoked when application execution is being suspended.  Application state is saved\n        /// without knowing whether the application will be terminated or resumed with the contents\n        /// of memory still intact.\n        /// </summary>\n        /// <param name=\"sender\">The source of the suspend request.</param>\n        /// <param name=\"e\">Details about the suspend request.</param>\n        private void OnSuspending(object sender, SuspendingEventArgs e)\n        {\n            var deferral = e.SuspendingOperation.GetDeferral();\n            //TODO: Save application state and stop any background activity\n            deferral.Complete();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/アプリ1/ApplicationInsights.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ApplicationInsights xmlns=\"http://schemas.microsoft.com/ApplicationInsights/2013/Settings\">\n  <!-- \n    Learn more about Application Insights configuration with ApplicationInsights.config here: \n    http://go.microsoft.com/fwlink/?LinkID=513840\n    \n    Note: If not present, please add <InstrumentationKey>Your Key</InstrumentationKey> to the top of this file.\n  -->\n  <TelemetryModules>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.Implementation.Tracing.DiagnosticsTelemetryModule, Microsoft.ApplicationInsights\"/>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.Windows.SessionTelemetryModule, Microsoft.ApplicationInsights.Extensibility.Windows\"/>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.Windows.PageViewTelemetryModule, Microsoft.ApplicationInsights.Extensibility.Windows\"/>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.Windows.UnhandledExceptionTelemetryModule, Microsoft.ApplicationInsights.Extensibility.Windows\"/>\n  </TelemetryModules>\n  <TelemetryChannel Type=\"Microsoft.ApplicationInsights.Channel.PersistenceChannel, Microsoft.ApplicationInsights.PersistenceChannel\"/>\n  <ContextInitializers>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.ComponentContextInitializer, Microsoft.ApplicationInsights\"/>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.DeviceContextInitializer, Microsoft.ApplicationInsights\"/>\n  </ContextInitializers>\n  <TelemetryInitializers>\n    <Add Type=\"Microsoft.ApplicationInsights.Extensibility.Windows.UserContextInitializer, Microsoft.ApplicationInsights.Extensibility.Windows\"/>\n  </TelemetryInitializers>\n</ApplicationInsights>"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/アプリ1/MainPage.xaml",
    "content": "﻿<Page\n    x:Class=\"アプリ1.MainPage\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    xmlns:local=\"using:アプリ1\"\n    xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n    xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n    mc:Ignorable=\"d\">\n\n    <Grid Background=\"{ThemeResource ApplicationPageBackgroundThemeBrush}\">\n\n    </Grid>\n</Page>\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/アプリ1/MainPage.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.InteropServices.WindowsRuntime;\nusing Windows.Foundation;\nusing Windows.Foundation.Collections;\nusing Windows.UI.Xaml;\nusing Windows.UI.Xaml.Controls;\nusing Windows.UI.Xaml.Controls.Primitives;\nusing Windows.UI.Xaml.Data;\nusing Windows.UI.Xaml.Input;\nusing Windows.UI.Xaml.Media;\nusing Windows.UI.Xaml.Navigation;\n\n// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x409\n\nnamespace アプリ1\n{\n    /// <summary>\n    /// An empty page that can be used on its own or navigated to within a Frame.\n    /// </summary>\n    public sealed partial class MainPage : Page\n    {\n        public MainPage()\n        {\n            this.InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/アプリ1/Package.appxmanifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<Package\n  xmlns=\"http://schemas.microsoft.com/appx/manifest/foundation/windows10\"\n  xmlns:mp=\"http://schemas.microsoft.com/appx/2014/phone/manifest\"\n  xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"\n  IgnorableNamespaces=\"uap mp\">\n\n  <Identity\n    Name=\"e7aa207b-588b-4936-9bde-ae13ae4d83fd\"\n    Publisher=\"CN=Nobuyuki\"\n    Version=\"1.0.0.0\" />\n\n  <mp:PhoneIdentity PhoneProductId=\"e7aa207b-588b-4936-9bde-ae13ae4d83fd\" PhonePublisherId=\"00000000-0000-0000-0000-000000000000\"/>\n\n  <Properties>\n    <DisplayName>アプリ1</DisplayName>\n    <PublisherDisplayName>Nobuyuki</PublisherDisplayName>\n    <Logo>Assets\\StoreLogo.png</Logo>\n  </Properties>\n\n  <Dependencies>\n    <TargetDeviceFamily Name=\"Windows.Universal\" MinVersion=\"10.0.10069.0\" MaxVersionTested=\"10.0.10069.0\" />\n  </Dependencies>\n\n  <Resources>\n    <Resource Language=\"x-generate\"/>\n  </Resources>\n\n  <Applications>\n    <Application Id=\"App\"\n      Executable=\"$targetnametoken$.exe\"\n      EntryPoint=\"アプリ1.App\">\n      <uap:VisualElements\n        DisplayName=\"アプリ1\"\n        Square150x150Logo=\"Assets\\Logo.png\"\n        Square44x44Logo=\"Assets\\SmallLogo.png\"\n        Description=\"アプリ1\"\n        BackgroundColor=\"#464646\">\n        <uap:SplashScreen Image=\"Assets\\SplashScreen.png\" />\n      </uap:VisualElements>\n    </Application>\n  </Applications>\n\n  <Capabilities>\n    <Capability Name=\"internetClient\" />\n  </Capabilities>\n</Package>"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/アプリ1/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"アプリ1\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"アプリ1\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n[assembly: ComVisible(false)]"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/アプリ1/Properties/Default.rd.xml",
    "content": "<!--\n    This file contains Runtime Directives used by .NET Native. The defaults here are suitable for most\n    developers. However, you can modify these parameters to modify the behavior of the .NET Native\n    optimizer.\n\n    Runtime Directives are documented at http://go.microsoft.com/fwlink/?LinkID=391919\n\n    To fully enable reflection for App1.MyClass and all of its public/private members\n    <Type Name=\"App1.MyClass\" Dynamic=\"Required All\"/>\n\n    To enable dynamic creation of the specific instantiation of AppClass<T> over System.Int32\n    <TypeInstantiation Name=\"App1.AppClass\" Arguments=\"System.Int32\" Activate=\"Required Public\" />\n\n    Using the Namespace directive to apply reflection policy to all the types in a particular namespace\n    <Namespace Name=\"DataClasses.ViewModels\" Seralize=\"All\" />\n-->\n\n<Directives xmlns=\"http://schemas.microsoft.com/netfx/2013/01/metadata\">\n  <Application>\n    <!--\n      An Assembly element with Name=\"*Application*\" applies to all assemblies in\n      the application package. The asterisks are not wildcards.\n    -->\n    <Assembly Name=\"*Application*\" Dynamic=\"Required All\" />\n    \n    \n    <!-- Add your application specific runtime directives here. -->\n\n\n  </Application>\n</Directives>"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/アプリ1/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Microsoft.ApplicationInsights\" version=\"0.14.3-build00177\" targetFramework=\"win81\" userInstalled=\"true\" />\n  <package id=\"Microsoft.ApplicationInsights.PersistenceChannel\" version=\"0.14.3-build00177\" targetFramework=\"win81\" userInstalled=\"true\" />\n  <package id=\"Microsoft.ApplicationInsights.WindowsApps\" version=\"0.14.3-build00177\" targetFramework=\"win81\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Diagnostics.Tracing.EventSource.Redist\" version=\"1.1.16-beta\" targetFramework=\"win81\" userInstalled=\"true\" />\n  <package id=\"System.Numerics.Vectors\" version=\"4.0.0\" targetFramework=\"win81\" userInstalled=\"true\" />\n</packages>"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/アプリ1/アプリ1.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <ProjectGuid>{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}</ProjectGuid>\n    <OutputType>AppContainerExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>アプリ1</RootNamespace>\n    <AssemblyName>アプリ1</AssemblyName>\n    <DefaultLanguage>ja-JP</DefaultLanguage>\n    <TargetPlatformIdentifier>UAP</TargetPlatformIdentifier>\n    <TargetPlatformVersion>10.0.10069.0</TargetPlatformVersion>\n    <TargetPlatformMinVersion>10.0.10069.0</TargetPlatformMinVersion>\n    <MinimumVisualStudioVersion>14</MinimumVisualStudioVersion>\n    <EnableDotNetNativeCompatibleProfile>true</EnableDotNetNativeCompatibleProfile>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <PackageCertificateKeyFile>アプリ1_TemporaryKey.pfx</PackageCertificateKeyFile>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|ARM'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\ARM\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|ARM'\">\n    <OutputPath>bin\\ARM\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>ARM</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x64'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x64\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x64'\">\n    <OutputPath>bin\\x64\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x64</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Debug|x86'\">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)' == 'Release|x86'\">\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\n    <DefineConstants>TRACE;NETFX_CORE;WINDOWS_UAP</DefineConstants>\n    <Optimize>true</Optimize>\n    <NoWarn>;2008</NoWarn>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n    <ErrorReport>prompt</ErrorReport>\n    <Prefer32Bit>true</Prefer32Bit>\n    <UseDotNetNativeToolchain>true</UseDotNetNativeToolchain>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"MainPage.xaml.cs\">\n      <DependentUpon>MainPage.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <AppxManifest Include=\"Package.appxmanifest\">\n      <SubType>Designer</SubType>\n    </AppxManifest>\n    <None Include=\"ApplicationInsights.config\" />\n    <None Include=\"packages.config\" />\n    <None Include=\"アプリ1_TemporaryKey.pfx\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Properties\\Default.rd.xml\" />\n    <Content Include=\"Assets\\Logo.scale-100.png\" />\n    <Content Include=\"Assets\\SmallLogo.scale-100.png\" />\n    <Content Include=\"Assets\\SplashScreen.scale-100.png\" />\n    <Content Include=\"Assets\\StoreLogo.scale-100.png\" />\n    <Content Include=\"Assets\\WideLogo.scale-100.png\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Page Include=\"MainPage.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n  </ItemGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.ApplicationInsights, Version=0.14.3.177, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.0.14.3-build00177\\lib\\portable-win81+wpa81\\Microsoft.ApplicationInsights.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.ApplicationInsights.Extensibility.Windows, Version=0.14.3.177, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.WindowsApps.0.14.3-build00177\\lib\\win81\\Microsoft.ApplicationInsights.Extensibility.Windows.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.ApplicationInsights.PersistenceChannel, Version=0.14.3.186, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.ApplicationInsights.PersistenceChannel.0.14.3-build00177\\lib\\portable-win81+wpa81\\Microsoft.ApplicationInsights.PersistenceChannel.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Numerics.Vectors, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Numerics.Vectors.4.0.0\\lib\\win8\\System.Numerics.Vectors.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Numerics.Vectors.WindowsRuntime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\System.Numerics.Vectors.4.0.0\\lib\\win8\\System.Numerics.Vectors.WindowsRuntime.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n  <PropertyGroup Condition=\" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' \">\n    <VisualStudioVersion>14.0</VisualStudioVersion>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\Microsoft\\WindowsXaml\\v$(VisualStudioVersion)\\Microsoft.Windows.UI.Xaml.CSharp.targets\" />\n  <Import Project=\"..\\packages\\Microsoft.Diagnostics.Tracing.EventSource.Redist.1.1.16-beta\\build\\portable-net45+win8+wpa81\\Microsoft.Diagnostics.Tracing.EventSource.Redist.targets\" Condition=\"Exists('..\\packages\\Microsoft.Diagnostics.Tracing.EventSource.Redist.1.1.16-beta\\build\\portable-net45+win8+wpa81\\Microsoft.Diagnostics.Tracing.EventSource.Redist.targets')\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\packages\\Microsoft.Diagnostics.Tracing.EventSource.Redist.1.1.16-beta\\build\\portable-net45+win8+wpa81\\Microsoft.Diagnostics.Tracing.EventSource.Redist.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Microsoft.Diagnostics.Tracing.EventSource.Redist.1.1.16-beta\\build\\portable-net45+win8+wpa81\\Microsoft.Diagnostics.Tracing.EventSource.Redist.targets'))\" />\n    <Error Condition=\"!Exists('..\\packages\\Microsoft.ApplicationInsights.0.14.3-build00177\\build\\portable-win81+wpa81\\Microsoft.ApplicationInsights.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\packages\\Microsoft.ApplicationInsights.0.14.3-build00177\\build\\portable-win81+wpa81\\Microsoft.ApplicationInsights.targets'))\" />\n  </Target>\n  <Import Project=\"..\\packages\\Microsoft.ApplicationInsights.0.14.3-build00177\\build\\portable-win81+wpa81\\Microsoft.ApplicationInsights.targets\" Condition=\"Exists('..\\packages\\Microsoft.ApplicationInsights.0.14.3-build00177\\build\\portable-win81+wpa81\\Microsoft.ApplicationInsights.targets')\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/アプリ1.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22823.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"アプリ1\", \"アプリ1\\アプリ1.csproj\", \"{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"社内ツール1\", \"社内ツール1\\社内ツール1.csproj\", \"{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"社内ツール2\", \"社内ツール2\\社内ツール2.csproj\", \"{863334D5-D853-4D46-8652-5BF402ED641D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"共通部品\", \"共通部品\\共通部品.csproj\", \"{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Debug|Any CPU.ActiveCfg = Debug|x86\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Debug|ARM.ActiveCfg = Debug|ARM\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Debug|ARM.Build.0 = Debug|ARM\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Debug|ARM.Deploy.0 = Debug|ARM\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Debug|x64.Build.0 = Debug|x64\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Debug|x64.Deploy.0 = Debug|x64\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Debug|x86.Build.0 = Debug|x86\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Debug|x86.Deploy.0 = Debug|x86\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Release|Any CPU.ActiveCfg = Release|x86\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Release|ARM.ActiveCfg = Release|ARM\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Release|ARM.Build.0 = Release|ARM\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Release|ARM.Deploy.0 = Release|ARM\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Release|x64.ActiveCfg = Release|x64\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Release|x64.Build.0 = Release|x64\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Release|x64.Deploy.0 = Release|x64\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Release|x86.ActiveCfg = Release|x86\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Release|x86.Build.0 = Release|x86\n\t\t{74D421B7-B3AB-4A76-9A40-DEF6B15E0609}.Release|x86.Deploy.0 = Release|x86\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Release|x64.Build.0 = Release|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}.Release|x86.Build.0 = Release|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Release|x64.Build.0 = Release|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{863334D5-D853-4D46-8652-5BF402ED641D}.Release|x86.Build.0 = Release|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Release|x64.Build.0 = Release|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{AE192F8B-D533-4F86-B20D-9FD1D8BBB1BE}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/共通部品/Class1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace 共通部品\n{\n    public class Class1\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/共通部品/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Resources;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"共通部品\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"共通部品\")]\n[assembly: AssemblyCopyright(\"Copyright (C)  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n[assembly: NeutralResourcesLanguage(\"ja\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン \n//      ビルド番号\n//      リビジョン\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/共通部品/共通部品.csproj",
    "content": "﻿<?xml version=\"1.0\" ?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{ae192f8b-d533-4f86-b20d-9fd1d8bbb1be}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>共通部品</RootNamespace>\n    <AssemblyName>共通部品</AssemblyName>\n    <DefaultLanguage>ja-JP</DefaultLanguage>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <TargetFrameworkProfile>Profile111</TargetFrameworkProfile>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <!-- A reference to the entire .NET Framework is automatically included -->\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\Portable\\$(TargetFrameworkVersion)\\Microsoft.Portable.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n\n</Project>\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール1/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール1/App.xaml",
    "content": "﻿<Application x:Class=\"社内ツール1.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:社内ツール1\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール1/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace 社内ツール1\n{\n    /// <summary>\n    /// App.xaml の相互作用ロジック\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール1/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"社内ツール1.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:社内ツール1\"\n        mc:Ignorable=\"d\"\n        Title=\"MainWindow\" Height=\"350\" Width=\"525\">\n    <Grid>\n        \n    </Grid>\n</Window>\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール1/MainWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace 社内ツール1\n{\n    /// <summary>\n    /// MainWindow.xaml の相互作用ロジック\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール1/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"社内ツール1\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"社内ツール1\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから\n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n//ローカライズ可能なアプリケーションのビルドを開始するには、\n//.csproj ファイルの <UICulture>CultureYouAreCodingWith</UICulture> を\n//<PropertyGroup> 内部で設定します。たとえば、\n//ソース ファイルで英語を使用している場合、<UICulture> を en-US に設定します。次に、\n//下の NeutralResourceLanguage 属性のコメントを解除します。下の行の \"en-US\" を\n//プロジェクト ファイルの UICulture 設定と一致するよう更新します。\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //テーマ固有のリソース ディクショナリが置かれている場所\n                                     //(リソースがページ、\n                                     //またはアプリケーション リソース ディクショナリに見つからない場合に使用されます)\n    ResourceDictionaryLocation.SourceAssembly //汎用リソース ディクショナリが置かれている場所\n                                              //(リソースがページ、\n                                              //アプリケーション、またはいずれのテーマ固有のリソース ディクショナリにも見つからない場合に使用されます)\n)]\n\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール1/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     このコードはツールによって生成されました。\n//     ランタイム バージョン:4.0.30319.0\n//\n//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、\n//     コードが再生成されるときに損失したりします\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace 社内ツール1.Properties\n{\n\n\n    /// <summary>\n    ///   ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。\n    /// </summary>\n    // このクラスは StronglyTypedResourceBuilder クラスによって ResGen\n    // または Visual Studio のようなツールを使用して自動生成されました。\n    // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に\n    // ResGen を実行し直すか、または VS プロジェクトをリビルドします。\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources\n    {\n\n        private static global::System.Resources.ResourceManager resourceMan;\n\n        private static global::System.Globalization.CultureInfo resourceCulture;\n\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources()\n        {\n        }\n\n        /// <summary>\n        ///   このクラスに使用される、キャッシュされた ResourceManager のインスタンスを返します。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager\n        {\n            get\n            {\n                if ((resourceMan == null))\n                {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"社内ツール1.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n\n        /// <summary>\n        ///   厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、\n        ///   現在のスレッドの CurrentUICulture プロパティをオーバーライドします。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture\n        {\n            get\n            {\n                return resourceCulture;\n            }\n            set\n            {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール1/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール1/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.0\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace 社内ツール1.Properties\n{\n\n\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"11.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase\n    {\n\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n\n        public static Settings Default\n        {\n            get\n            {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール1/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール1/社内ツール1.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{637EFE0E-DB21-4BDB-830E-ADD8DFC262A1}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>社内ツール1</RootNamespace>\n    <AssemblyName>社内ツール1</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <WarningLevel>4</WarningLevel>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xaml\">\n      <RequiredTargetFramework>4.0</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Page Include=\"MainWindow.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"MainWindow.xaml.cs\">\n      <DependentUpon>MainWindow.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <AppDesigner Include=\"Properties\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール2/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール2/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace 社内ツール2\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール2/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"社内ツール2\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"社内ツール2\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"863334d5-d853-4d46-8652-5bf402ed641d\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/DevEnv/アプリ1/社内ツール2/社内ツール2.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{863334D5-D853-4D46-8652-5BF402ED641D}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>社内ツール2</RootNamespace>\n    <AssemblyName>社内ツール2</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Event/Event.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22310.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Observable\", \"Observable\\Observable.csproj\", \"{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"EventDriven\", \"EventDriven\\EventDriven.csproj\", \"{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9DA4DAFA-81CA-47C6-B953-A7D1AD376429}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B9F1BFC7-12D7-4434-8335-DDC9E7D0F9D7}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Event/EventDriven/EventDriven.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>EventDriven.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Event/EventDriven/Program.cs",
    "content": "﻿using System;\nusing System.Reflection;\n\nnamespace EventDriven\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            // サンプル掲載用に、Version* フォルダー以下の Program も単体で動くように作ってあって、\n            // そっちにも private な Main メソッドがある。\n            // ・ビルド設定で「スタートアップ オブジェクト」をこっちのクラスに設定してある。\n            // ・あっちの private Main はリフレクションで無理やり呼ぶ。\n\n            InvokeMain(typeof(Version1.Program));\n            InvokeMain(typeof(Version2.Program));\n            InvokeMain(typeof(Version3.Program));\n        }\n\n        static void InvokeMain(Type t)\n        {\n            t.GetMethod(nameof(Main), BindingFlags.Static | BindingFlags.NonPublic)!.Invoke(null, null);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/EventDriven/Version1/Program.cs",
    "content": "﻿namespace EventDriven.Version1\n{\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        // 時刻の表示形式\n        const string FULL = \"yyyy/dd/MM hh:mm:ss\\n\";\n        const string DATE = \"yyyy/dd/MM\\n\";\n        const string TIME = \"hh:mm:ss\\n\";\n\n        static bool isSuspended = true;  // プログラムの一時停止フラグ。\n        static string timeFormat = TIME; // 時刻の表示形式。\n\n        static void Main()\n        {\n            WriteHelp();\n\n            var cts = new CancellationTokenSource();\n\n            Task.WhenAll(\n                Task.Run(() => EventLoop(cts)),\n                TimerLoop(cts.Token)\n                ).Wait();\n        }\n\n        // 毎秒時刻表示のループ\n        private static async Task TimerLoop(CancellationToken ct)\n        {\n            while (!ct.IsCancellationRequested)\n            {\n                if (!isSuspended)\n                {\n                    // 1秒おきに現在時刻を表示。\n                    Console.Write(DateTime.Now.ToString(timeFormat));\n                }\n                await Task.Delay(1000);\n            }\n        }\n\n        // キー受付のループ\n        static void EventLoop(CancellationTokenSource cts)\n        {\n            while (!cts.IsCancellationRequested)\n            {\n                // 文字を読み込む\n                // (「キーが押される」というイベントの発生を待つ)\n                string line = Console.ReadLine();\n                char eventCode = line.Length == 0 ? '\\0' : line[0];\n\n                // イベント処理\n                switch (eventCode)\n                {\n                    case 'r': // run\n                        isSuspended = false;\n                        break;\n                    case 's': // suspend\n                        isSuspended = true;\n                        break;\n                    case 'f': // full\n                        timeFormat = FULL;\n                        break;\n                    case 'd': // date\n                        timeFormat = DATE;\n                        break;\n                    case 't': // time\n                        timeFormat = TIME;\n                        break;\n                    case 'q': // quit\n                        cts.Cancel();\n                        break;\n                    default: // ヘルプ\n                        WriteHelp();\n                        break;\n                }\n            }\n        }\n\n        private static void WriteHelp()\n        {\n            Console.Write(\n              \"使い方\\n\" +\n              \"r (run)    : 時刻表示を開始します。\\n\" +\n              \"s (suspend): 時刻表示を一時停止します。\\n\" +\n              \"f (full)   : 時刻の表示形式を“日付＋時刻”にします。\\n\" +\n              \"d (date)   : 時刻の表示形式を“日付のみ”にします。\\n\" +\n              \"t (time)   : 時刻の表示形式を“時刻のみ”にします。\\n\" +\n              \"q (quit)   : プログラムを終了します。\\n\"\n              );\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/EventDriven/Version2/KeyboardEventLoop.cs",
    "content": "﻿namespace EventDriven.Version2\n{\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    // イベント処理用のデリゲート\n    delegate void KeyboadEventHandler(char eventCode);\n\n    /// <summary>\n    /// キーボードからの入力イベント待受けクラス。\n    /// </summary>\n    class KeyboardEventLoop\n    {\n        KeyboadEventHandler _onKeyDown;\n\n        public KeyboardEventLoop(KeyboadEventHandler onKeyDown)\n        {\n            _onKeyDown = onKeyDown;\n        }\n\n        /// <summary>\n        /// 待受け開始。\n        /// </summary>\n        /// <param name=\"ct\">待ち受けを終了したいときにキャンセルする。</param>\n        public Task Start(CancellationToken ct)\n        {\n            return Task.Run(() => EventLoop(ct));\n        }\n\n        /// <summary>\n        /// イベント待受けループ。\n        /// </summary>\n        void EventLoop(CancellationToken ct)\n        {\n            // イベントループ\n            while (!ct.IsCancellationRequested)\n            {\n                // 文字を読み込む\n                // (「キーが押される」というイベントの発生を待つ)\n                string line = Console.ReadLine();\n                char eventCode = (line == null || line.Length == 0) ? '\\0' : line[0];\n\n                // イベント処理はデリゲートを通して他のメソッドに任せる。\n                _onKeyDown(eventCode);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/EventDriven/Version2/Program.cs",
    "content": "﻿namespace EventDriven.Version2\n{\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        // 時刻の表示形式\n        const string FULL = \"yyyy/dd/MM hh:mm:ss\\n\";\n        const string DATE = \"yyyy/dd/MM\\n\";\n        const string TIME = \"hh:mm:ss\\n\";\n\n        static KeyboardEventLoop eventLoop = null!; // Main で初期化\n        static bool isSuspended = true;  // プログラムの一時停止フラグ。\n        static string timeFormat = TIME; // 時刻の表示形式。\n\n        static void Main()\n        {\n            WriteHelp();\n\n            var cts = new CancellationTokenSource();\n            eventLoop = new KeyboardEventLoop(code => OnKeyDown(code, cts));\n\n            Task.WhenAll(\n                eventLoop.Start(cts.Token),\n                TimerLoop(cts.Token)\n                ).Wait();\n        }\n\n        // 毎秒時刻表示のループ\n        private static async Task TimerLoop(CancellationToken ct)\n        {\n            while (!ct.IsCancellationRequested)\n            {\n                if (!isSuspended)\n                {\n                    // 1秒おきに現在時刻を表示。\n                    Console.Write(DateTime.Now.ToString(timeFormat));\n                }\n                await Task.Delay(1000);\n            }\n        }\n\n        // イベント処理部。\n        static void OnKeyDown(char eventCode, CancellationTokenSource cts)\n        {\n            switch (eventCode)\n            {\n                case 'r': // run\n                    isSuspended = false;\n                    break;\n                case 's': // suspend\n                    Console.Write(\"\\n一時停止します\\n\");\n                    isSuspended = true;\n                    break;\n                case 'f': // full\n                    timeFormat = FULL;\n                    break;\n                case 'd': // date\n                    timeFormat = DATE;\n                    break;\n                case 't': // time\n                    timeFormat = TIME;\n                    break;\n                case 'q': // quit\n                    cts.Cancel();\n                    break;\n                default: // ヘルプ\n                    WriteHelp();\n                    break;\n            }\n        }\n\n        private static void WriteHelp()\n        {\n            Console.Write(\n              \"使い方\\n\" +\n              \"r (run)    : 時刻表示を開始します。\\n\" +\n              \"s (suspend): 時刻表示を一時停止します。\\n\" +\n              \"f (full)   : 時刻の表示形式を“日付＋時刻”にします。\\n\" +\n              \"d (date)   : 時刻の表示形式を“日付のみ”にします。\\n\" +\n              \"t (time)   : 時刻の表示形式を“時刻のみ”にします。\\n\" +\n              \"q (quit)   : プログラムを終了します。\\n\"\n              );\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/EventDriven/Version3/KeyboardEventLoop.cs",
    "content": "﻿namespace EventDriven.Version3\n{\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    // イベント処理用のデリゲート\n    delegate void KeyboadEventHandler(char eventCode);\n\n    /// <summary>\n    /// キーボードからの入力イベント待受けクラス。\n    /// </summary>\n    class KeyboardEventLoop\n    {\n        /// <summary>\n        /// キー入力があった時に呼ばれるイベント。\n        /// </summary>\n        public event KeyboadEventHandler OnKeyDown;\n\n        public KeyboardEventLoop(KeyboadEventHandler onKeyDown)\n        {\n            OnKeyDown += onKeyDown;\n        }\n\n        /// <summary>\n        /// 待受け開始。\n        /// </summary>\n        /// <param name=\"ct\">待ち受けを終了したいときにキャンセルする。</param>\n        public Task Start(CancellationToken ct)\n        {\n            return Task.Run(() => EventLoop(ct));\n        }\n\n        /// <summary>\n        /// イベント待受けループ。\n        /// </summary>\n        void EventLoop(CancellationToken ct)\n        {\n            // イベントループ\n            while (!ct.IsCancellationRequested)\n            {\n                // 文字を読み込む\n                // (「キーが押される」というイベントの発生を待つ)\n                string line = Console.ReadLine();\n                char eventCode = (line == null || line.Length == 0) ? '\\0' : line[0];\n\n                // イベント処理は event を通して他のメソッドに任せる。\n                OnKeyDown(eventCode);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/EventDriven/Version3/Program.cs",
    "content": "﻿namespace EventDriven.Version3\n{\n    using System;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        // 時刻の表示形式\n        const string FULL = \"yyyy/dd/MM hh:mm:ss\\n\";\n        const string DATE = \"yyyy/dd/MM\\n\";\n        const string TIME = \"hh:mm:ss\\n\";\n\n        static KeyboardEventLoop eventLoop = null!; // Main で初期化\n        static bool isSuspended = true;  // プログラムの一時停止フラグ。\n        static string timeFormat = TIME; // 時刻の表示形式。\n\n        static void Main()\n        {\n            WriteHelp();\n\n            var cts = new CancellationTokenSource();\n            eventLoop = new KeyboardEventLoop(code => OnKeyDown(code, cts));\n\n            Task.WhenAll(\n                eventLoop.Start(cts.Token),\n                TimerLoop(cts.Token)\n                ).Wait();\n        }\n\n        // 毎秒時刻表示のループ\n        private static async Task TimerLoop(CancellationToken ct)\n        {\n            while (!ct.IsCancellationRequested)\n            {\n                if (!isSuspended)\n                {\n                    // 1秒おきに現在時刻を表示。\n                    Console.Write(DateTime.Now.ToString(timeFormat));\n                }\n                await Task.Delay(1000);\n            }\n        }\n\n        // イベント処理部。\n        static void OnKeyDown(char eventCode, CancellationTokenSource cts)\n        {\n            switch (eventCode)\n            {\n                case 'r': // run\n                    isSuspended = false;\n                    break;\n                case 's': // suspend\n                    Console.Write(\"\\n一時停止します\\n\");\n                    isSuspended = true;\n                    break;\n                case 'f': // full\n                    timeFormat = FULL;\n                    break;\n                case 'd': // date\n                    timeFormat = DATE;\n                    break;\n                case 't': // time\n                    timeFormat = TIME;\n                    break;\n                case 'q': // quit\n                    cts.Cancel();\n                    break;\n                default: // ヘルプ\n                    WriteHelp();\n                    break;\n            }\n        }\n\n        private static void WriteHelp()\n        {\n            Console.Write(\n              \"使い方\\n\" +\n              \"r (run)    : 時刻表示を開始します。\\n\" +\n              \"s (suspend): 時刻表示を一時停止します。\\n\" +\n              \"f (full)   : 時刻の表示形式を“日付＋時刻”にします。\\n\" +\n              \"d (date)   : 時刻の表示形式を“日付のみ”にします。\\n\" +\n              \"t (time)   : 時刻の表示形式を“時刻のみ”にします。\\n\" +\n              \"q (quit)   : プログラムを終了します。\\n\"\n              );\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/Observable/AnonymousFunction.cs",
    "content": "﻿namespace Observable\n{\n    using System;\n\n    class AnonymousFunctionProbrem\n    {\n        public event Action X;\n\n        private void RaiseX() => X?.Invoke();\n\n        public void IncorrectSample()\n        {\n            // 購読開始\n            X += () => Console.WriteLine(\"X\");\n\n            // 数回、イベントを起こしてみる\n            for (int i = 0; i < 5; i++) RaiseX();\n\n            // 購読解除は、これだと実はできてない\n            // () => ... の部分が、それぞれ別オブジェクトになってて、remove できない\n            // というか、2か所に書かせるな\n            X -= () => Console.WriteLine(\"X\");\n\n            // このイベントは受け取ってしまう。\n            for (int i = 0; i < 5; i++) RaiseX();\n        }\n\n        public void CorrectSample()\n        {\n            // こうすればいい。のだけど…\n            // どこにでも書けるのが匿名関数(ラムダ式)のいいところなのに、そのよさが台無し\n            Action handler = () => Console.WriteLine(\"X\");\n\n            X += handler;\n\n            for (int i = 0; i < 5; i++) RaiseX();\n\n            X -= handler;\n\n            // ちゃんと購読解除されてる\n            for (int i = 0; i < 5; i++) RaiseX();\n        }\n    }\n}\n\nnamespace Observable\n{\n    using System;\n    using System.Reactive.Disposables;\n\n    class SubscribeAnonymousFunctionProbrem\n    {\n        public event Action X;\n\n        public IDisposable SubscribeX(Action handler)\n        {\n            X += handler;\n            return Disposable.Create(() => X -= handler);\n        }\n\n        private void RaiseX() => X?.Invoke();\n\n        public void CorrectSample()\n        {\n            // 購読解除は Dispose でやればいい\n            using (SubscribeX(() => Console.WriteLine(\"X\")))\n            {\n                for (int i = 0; i < 5; i++) RaiseX();\n            }\n\n            // ちゃんと購読解除されてる\n            for (int i = 0; i < 5; i++) RaiseX();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/Observable/EventInternal/Cshap4/EventSample.cs",
    "content": "﻿namespace Observable.EventInternal.Cshap4\n{\n    using System;\n    using System.Threading;\n\n    /// <summary>\n    /// そして、C# 4.0 以降では、自動実装がこんな感じに展開される。\n    /// いわゆる「lock-free アルゴリズム」っていうやつ。\n    /// <see cref=\"Interlocked.CompareExchange(ref object, object, object)\"/> を使うと lock を避けれる。\n    /// lock を使うよりはだいぶ低負荷なもの。\n    /// </summary>\n    class EventSample\n    {\n        private EventHandler _X;\n\n        public event EventHandler X\n        {\n            add\n            {\n                EventHandler x2;\n                var x1 = _X;\n                do\n                {\n                    x2 = x1;\n                    var x3 = (EventHandler)Delegate.Combine(x2, value);\n                    x1 = Interlocked.CompareExchange(ref _X, x3, x2);\n                }\n                while (x1 != x2);\n            }\n            remove\n            {\n                EventHandler x2;\n                var x1 = _X;\n                do\n                {\n                    x2 = x1;\n                    var x3 = (EventHandler)Delegate.Remove(x2, value);\n                    x1 = Interlocked.CompareExchange(ref _X, x3, x2);\n                }\n                while (x1 != x2);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/Observable/EventInternal/Csharp1/EventSample.cs",
    "content": "﻿namespace Observable.EventInternal.Csharp1\n{\n    using System;\n    using System.Runtime.CompilerServices;\n\n    /// <summary>\n    /// かつて自動実装と同じだったもの。\n    /// <see cref=\"MethodImplOptions.Synchronized\"/>を付けると、そのメソッドがスレッド安全になる。\n    /// 簡単ではあるものの、実行性能上の問題があって…\n    /// </summary>\n    class EventSample\n    {\n        private EventHandler _X;\n\n        public event EventHandler X\n        {\n            [MethodImpl(MethodImplOptions.Synchronized)]\n            add\n            {\n                _X = (EventHandler)Delegate.Combine(_X, value);\n            }\n            [MethodImpl(MethodImplOptions.Synchronized)]\n            remove\n            {\n                _X = (EventHandler)Delegate.Remove(_X, value);\n            }\n        }\n    }\n}\n\nnamespace Observable.EventInternal.Csharp1Lock\n{\n    using System;\n\n    /// <summary>\n    /// ちなみに、<see cref=\"System.Runtime.CompilerServices.MethodImplOptions.Synchronized\"/> は、さらに、lock ステートメント相当のコードに展開されます。\n    /// lock、はさらに言うと、<see cref=\"System.Threading.Monitor.TryEnter(object)\"/> に展開。\n    /// ロックを掛けるっていうのはかなり重たい処理で、できれば避けたい。\n    ///\n    /// <code>lock(this)</code> はやっちゃいけないコード。\n    /// 外からロック獲得できちゃう。大変まずい。\n    /// </summary>\n    class EventSample\n    {\n        private EventHandler _X;\n\n        public event EventHandler X\n        {\n            add\n            {\n                lock (this)\n                {\n                    _X = (EventHandler)Delegate.Combine(_X, value);\n                }\n            }\n            remove\n            {\n                lock (this)\n                {\n                    _X = (EventHandler)Delegate.Remove(_X, value);\n                }\n            }\n        }\n    }\n}\n\nnamespace Observable.EventInternal.Csharp1Monitor\n{\n    using System;\n    using System.Threading;\n\n\n    /// <summary>\n    /// lock、はさらに言うと、<see cref=\"System.Threading.Monitor.Enter(object, ref bool)\"/> に展開。\n    ///\n    /// lock の展開結果も、実は C# コンパイラーのバージョンによって何回か変更かかってるけども、今の実装はこう。\n    /// Monitor.Enter の実行中に例外が出ることがある(<see cref=\"ThreadAbortException\"/> のせい)とか、\n    /// それを検出するためには ref で flag を渡さないとダメとか。\n    /// </summary>\n    class EventSample\n    {\n        private EventHandler _X;\n\n        public event EventHandler X\n        {\n            add\n            {\n                bool flag = false;\n                try\n                {\n                    Monitor.Enter(this, ref flag);\n                    _X = (EventHandler)Delegate.Combine(_X, value);\n                }\n                finally\n                {\n                    if (flag)\n                    {\n                        Monitor.Exit(this);\n                    }\n                }\n            }\n            remove\n            {\n                bool flag = false;\n                try\n                {\n                    Monitor.Enter(this, ref flag);\n                    _X = (EventHandler)Delegate.Remove(_X, value);\n                }\n                finally\n                {\n                    if (flag)\n                    {\n                        Monitor.Exit(this);\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/Observable/EventInternal/EventSample.cs",
    "content": "﻿#pragma warning disable 67\n\nnamespace Observable.EventInternal\n{\n    using System;\n\n    /// <summary>\n    /// 自動実装。\n    /// </summary>\n    class EventSample\n    {\n        public event EventHandler X;\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/Observable/EventSource.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\n\nclass EventSource\n{\n    public event EventHandler<int> Progress; // 登録口\n\n    private async Task RunAsync()\n    {\n        for (int i = 0; i < 100; i++)\n        {\n            await Task.Delay(100);\n            Progress(this, i); // イベントを起こす\n        }\n    }\n}\n\nclass EventSubscriber : IDisposable\n{\n    EventSource _source;\n\n    public EventSubscriber(EventSource source)\n    {\n        _source = source;\n        source.Progress += OnProgress; // 購読開始\n    }\n\n    // イベントを受け取って処理\n    private void OnProgress(object sender, int i)\n    {\n        Console.WriteLine(\"進捗 \" + i + \"%\");\n    }\n\n    public void Dispose()\n    {\n        _source.Progress -= OnProgress; // 購読解除\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/Observable/Observable.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <UseWPF>true</UseWPF>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Reactive\" Version=\"3.1.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Event/Observable/ParameterProbrem.cs",
    "content": "﻿namespace Observable\n{\n    using System.Threading.Tasks;\n    using System.Windows;\n    using System.Windows.Controls;\n    using System.Windows.Input;\n\n    static class ParameterProbrem\n    {\n        /// <summary>\n        /// ボタンのクリックを1回受け取るまで待ちたい\n        /// </summary>\n        public static Task FirstClickAsync(this Button x)\n        {\n            var tcs = new TaskCompletionSource<bool>();\n            RoutedEventHandler handler = null;\n            handler = (sender, arg) =>\n            {\n                x.Click -= handler;\n                tcs.TrySetResult(false);\n            };\n            x.Click += handler;\n            return tcs.Task;\n        }\n\n\n        /// <summary>\n        /// ボタンのダブルクリックを1回受け取るまで待ちたい\n        /// FirstClickAsync とほとんど同じなのに…\n        /// </summary>\n        public static Task FirstDoubleClickAsync(this Button x)\n        {\n            var tcs = new TaskCompletionSource<bool>();\n            MouseButtonEventHandler handler = null;\n            handler = (sender, arg) =>\n            {\n                x.MouseDoubleClick -= handler;\n                tcs.TrySetResult(false);\n            };\n            x.MouseDoubleClick += handler;\n            return tcs.Task;\n        }\n\n#if false\n        /// <summary>\n        /// こんな感じのコードが書けたらよかったのにな(もちろん無理。コンパイル エラー)\n        /// </summary>\n        public static Task FirstAsync<TEventHandler>(this event TEventHandler x)\n        {\n            var tcs = new TaskCompletionSource<bool>();\n            TEventHandler handler = null;\n            handler = (sender, arg) =>\n            {\n                x -= handler;\n                tcs.TrySetResult(false);\n            };\n            x += handler;\n            return tcs.Task;\n        }\n#endif\n    }\n}\n\nnamespace Observable\n{\n    using System;\n    using System.Reactive.Disposables;\n\n    /// <summary>\n    /// イベントの登録口。\n    /// </summary>\n    public interface IEvent<TArg>\n    {\n        IDisposable Subscribe(EventHandler<TArg> handler);\n    }\n\n    /// <summary>\n    /// イベントの登録口の実装 + イベントを起こす機能。\n    /// </summary>\n    public class Event<TArg> : IEvent<TArg>\n    {\n        event EventHandler<TArg> e;\n\n        /// <summary>\n        /// イベント登録。\n        /// </summary>\n        public IDisposable Subscribe(EventHandler<TArg> handler)\n        {\n            e += handler;\n            return Disposable.Create(() => e -= handler);\n        }\n\n        /// <summary>\n        /// イベントを起こす。\n        /// </summary>\n        public void Raise(object sender, TArg arg) => e?.Invoke(sender, arg);\n    }\n}\n\nnamespace Observable\n{\n    using System;\n    using System.Threading.Tasks;\n\n    public static class EventExtensions\n    {\n        /// <summary>\n        /// イベントを1回受け取るまで待ちたい\n        /// </summary>\n        /// <typeparam name=\"TArg\"></typeparam>\n        /// <param name=\"x\"></param>\n        /// <returns></returns>\n        public static Task FirstAsync<TArg>(this IEvent<TArg> x)\n        {\n            var tcs = new TaskCompletionSource<bool>();\n            IDisposable subscription = null;\n            subscription = x.Subscribe((sender, arg) =>\n            {\n                subscription.Dispose();\n                tcs.TrySetResult(false);\n            });\n            return tcs.Task;\n        }\n    }\n}\n\nnamespace Observable\n{\n    using System.Windows;\n    using System.Windows.Input;\n\n    /// <summary>\n    /// <see cref=\"Button\"/> が、というか、event 構文がこうだったらよかったのに。\n    /// という例。\n    /// 1段階オブジェクトが挟まってしまうのがいやだけども、使い勝手は上がる。\n    /// </summary>\n    class PreferredButton\n    {\n        public IEvent<RoutedEventArgs> Click => _click;\n        private Event<RoutedEventArgs> _click = new Event<RoutedEventArgs>();\n\n        public IEvent<MouseButtonEventArgs> MouseDoubleClick => _mouseDoubleClick;\n        private Event<MouseButtonEventArgs> _mouseDoubleClick = new Event<MouseButtonEventArgs>();\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/Observable/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Observable\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            new AnonymousFunctionProbrem().IncorrectSample();\n            new AnonymousFunctionProbrem().CorrectSample();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Event/Observable/ReactiveExtensions.cs",
    "content": "﻿namespace Observable\n{\n    using System;\n    using System.Reactive.Subjects;\n    using System.Windows;\n    using System.Windows.Input;\n\n    /// <summary>\n    /// <see cref=\"Button\"/> が、というか、event 構文がこうだったらよかったのに。\n    /// という例の Reactive Extensions 版。\n    /// </summary>\n    class PreferredButtonByRx\n    {\n        public IObservable<RoutedEventArgs> Click => _click;\n        private Subject<RoutedEventArgs> _click = new Subject<RoutedEventArgs>();\n\n        public IObservable<MouseButtonEventArgs> MouseDoubleClick => _mouseDoubleClick;\n        private Subject<MouseButtonEventArgs> _mouseDoubleClick = new Subject<MouseButtonEventArgs>();\n    }\n}\n"
  },
  {
    "path": "Chapters/FileBaseApp/AllowUnsafeBlocks.cs",
    "content": "#:property AllowUnsafeBlocks=true\n\n// unsafe ブロックはオプションをつけないと使えない構文。\nunsafe\n{\n    int n = 1;\n    int* pn = &n;\n    Console.WriteLine($\"{(nint)pn:x}\");\n}\n"
  },
  {
    "path": "Chapters/FileBaseApp/AspNet.cs",
    "content": "#:sdk Microsoft.NET.Sdk.Web\n\nvar app = WebApplication.CreateBuilder(args).Build();\napp.MapGet(\"/\", () => \"Hello World!\");\napp.Run();\n"
  },
  {
    "path": "Chapters/FileBaseApp/Cat.cs",
    "content": "Console.WriteLine(\"🐈\");"
  },
  {
    "path": "Chapters/FileBaseApp/Csproj/Csproj.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net10.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n    <InvariantGlobalization>true</InvariantGlobalization>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/FileBaseApp/Csproj/Program.cs",
    "content": "Console.WriteLine(new DateTime(2000, 1, 2, 3, 4, 5));\n"
  },
  {
    "path": "Chapters/FileBaseApp/InvariantGlobalization.cs",
    "content": "#:property InvariantGlobalization=true\nConsole.WriteLine(new DateTime(2000, 1, 2, 3, 4, 5));\n"
  },
  {
    "path": "Chapters/FileBaseApp/Lib/Lib.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/FileBaseApp/Lib/Program.cs",
    "content": "﻿namespace Lib;\n\npublic class Class1\n{\n    public static string Name => \"Lib.Class1\";\n}\n"
  },
  {
    "path": "Chapters/FileBaseApp/PackageReference.cs",
    "content": "#:package Microsoft.CodeAnalysis.CSharp@4.14.0\n\nusing Microsoft.CodeAnalysis.CSharp;\n\nvar tree = CSharpSyntaxTree.ParseText(\"class Class1;\");\nvar root = await tree.GetRootAsync();\nConsole.WriteLine(root.GetFirstToken().Text);\n"
  },
  {
    "path": "Chapters/FileBaseApp/ProjectReference.cs",
    "content": "#:project Lib/Lib.csproj\nConsole.WriteLine(Lib.Class1.Name);\n"
  },
  {
    "path": "Chapters/FileBaseApp/Shebang.cs",
    "content": "#!/usr/bin/env dotnet\nConsole.WriteLine(\"🐈\");"
  },
  {
    "path": "Chapters/Functional/DelegateInternal/DelegateInternal.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>DelegateInternal.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Functional/DelegateInternal/F.cs",
    "content": "﻿namespace DelegateInternal\n{\n    delegate int F(int x);\n\n#if PsudoCode\n    class F : Delegate\n    {\n        object Target;\n        IntPtr FunctionPointer;\n        // 実際には Delegate クラスのメンバー\n        // あと、object がもう1個と、IntPtr がもう1個ある\n\n        public F(object target, IntPtr fp) => (Target, FunctionPointer) = (target, fp);\n\n        public virtual int Invoke(int x)\n        {\n            // return FunctionPointer(Target); 的な処理\n        }\n    }\n#endif\n}\n"
  },
  {
    "path": "Chapters/Functional/DelegateInternal/GetLength.cs",
    "content": "﻿namespace DelegateInternal.GetLength\n{\n    using System;\n\n    static class Program\n    {\n        static void M(Func<int> f)\n        {\n            Console.WriteLine(f());\n        }\n\n        static void Main()\n        {\n            var s = Console.ReadLine();\n\n            // ラムダ式を利用(ちょっとだけ遅い)\n            M(() => s.Length);\n\n            // 拡張メソッドでカリー化(ちょっとだけ速い)\n            M(s.GetLength);\n        }\n\n        static int GetLength(this string s) => s.Length;\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/DelegateInternal/InstanceMethod.cs",
    "content": "﻿namespace DelegateInternal.Instance\n{\n    using System;\n\n    class Sample\n    {\n        static void StaticMethod(int x)\n        {\n            // 静的メソッドの場合は正真正銘、引数は x の1つだけ\n        }\n\n        void InstanceMethod(int x)\n        {\n            // 引数が1つだけに見えて…\n\n            // 実は暗黙的に this を受け取っている\n            Console.WriteLine(this);\n        }\n\n        // ということで ↑の InstanceMethod は、以下のような静的メソッドと同じ引数の受け取り方をしてる\n        static void InstanceLikeMethod(Sample @this, int x)\n        {\n            Console.WriteLine(@this);\n        }\n    }\n}\n\nnamespace DelegateInternal.Extension\n{\n    using System;\n\n    class Sample\n    {\n        public void InstanceMethod(int x)\n        {\n            // 引数が1つだけに見えて、実は暗黙的に this を受け取っている\n        }\n\n        // ということで ↑の InstanceMethod は、以下のような静的メソッドと同じ引数の受け取り方をしてる\n        static void InstanceLikeMethod(Sample @this, int x)\n        {\n        }\n    }\n\n    static class SampleExtensions\n    {\n        // であれば、こういう拡張メソッドも InstanceMethod と同じ引数の受け取り方になる\n        public static void ExtensionMethod(this Sample @this, int x)\n        {\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var x = new Sample();\n\n            Action<int> i = x.InstanceMethod;\n\n            // 拡張メソッドに対して、インスタンス メソッドと同じようなデリゲートの作り方を認めてる\n            Action<int> e = x.ExtensionMethod;\n        }\n    }\n}\n\nnamespace DelegateInternal.StaticVsCurriedDelegate\n{\n    using System;\n\n    static class Program\n    {\n        // 普通の静的メソッド\n        static int F(int x) => 2 * x;\n\n        // わざわざ使いもしない第1引数を増やして、拡張メソッドに変更\n        static int F(this object? dummy, int x) => 2 * x;\n\n        static void Main()\n        {\n            // 静的メソッドからデリゲート作成\n            Func<int, int> s = F;\n\n            // わざわざ null を使ってカリー化デリゲートを作る\n            Func<int, int> e = default(object).F;\n\n            // 以下の2つの呼び出しでは、e (カリー化デリゲート)の方が圧倒的に高速\n            s(10);\n            e(10);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/DelegateInternal/LambdaOptimization.cs",
    "content": "﻿namespace DelegateInternal.LambdaOptimization\n{\n    using System;\n\n    class Program\n    {\n        // Func 越しに何かのインスタンスを取りたい\n        static void M(Func<string> factory)\n        {\n            Console.WriteLine(factory());\n        }\n\n        static void Main()\n        {\n            // でも、呼ぶ側としては単に何かインスタンスを1個渡したいだけ\n            string s = Console.ReadLine();\n\n            // そこで、ラムダ式で1段覆って、string から Func<string> を作る\n            // これだと、匿名関数の仕様から、匿名のクラスが作られて、その new のコストが余計にかかる\n            M(() => s);\n\n            // 一方で、以下のように、拡張メソッドを介することで、カリー化デリゲート(速い)になる\n            M(s.Identity);\n        }\n    }\n\n    static class TrickyExtension\n    {\n        // 素通しするだけの拡張メソッドを用意\n        public static T Identity<T>(this T x) => x;\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/DelegateInternal/MakePrimitiveContravariant.cs",
    "content": "﻿namespace DelegateInternal.MakePrimitiveContravariant\n{\n    using System;\n\n    static class Program\n    {\n        static void M(Action<int> a)\n        {\n            a(10);\n        }\n\n        static void Main()\n        {\n            Action<long> a = x => Console.WriteLine(x);\n\n#if InvalidCode\n            //❌コンパイル エラー。int → long へは共変性が働かないので、直接は渡せない\n            M(a);\n#endif\n\n            // ラムダ式で包めば渡せる\n            M(x => a(x));\n\n            // 拡張メソッドでカリー化(ちょっとだけ速い)\n            M(a.Upcast);\n        }\n\n        static void Upcast(this Action<long> a, int x) => a(x);\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/DelegateInternal/MakePrimitiveCovariant.cs",
    "content": "﻿namespace DelegateInternal.MakePrimitiveCovariant\n{\n    using System;\n\n    static class Program\n    {\n        static void M(Func<long> f)\n        {\n            Console.WriteLine(f());\n        }\n\n        static void Main()\n        {\n            Func<int> f = () => 1;\n\n#if InvalidCode\n            //❌コンパイル エラー。int → long へは共変性が働かないので、直接は渡せない\n            M(f);\n#endif\n\n            // ラムダ式で包めば渡せる\n            M(() => f());\n\n            // 拡張メソッドでカリー化(ちょっとだけ速い)\n            M(f.Upcast);\n        }\n\n        static long Upcast(this Func<int> f) => f();\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/DelegateInternal/Program.cs",
    "content": "﻿namespace DelegateInternal\n{\n    class Sample\n    {\n        int _a;\n        public Sample(int a = 2) => _a = a;\n\n        public static int Static(int x) => 2 * x;\n        public int Instance(int x) => _a * x;\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n#if false\n            // インスタンス メソッドから生成\n            var x = new Sample();\n            F i = x.Instance;\n\n            // 静的メソッドから生成\n            F s = Sample.Static;\n\n            i(10);\n            s(20);\n#else\n            // インスタンス メソッドから生成\n            var x = new Sample();\n            F i = new F(x.Instance);\n\n            // 静的メソッドから生成\n            F s = new F(Sample.Static);\n\n            i.Invoke(10);\n            s.Invoke(20);\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/ExtensionMethods/ExtensionMethods.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>MyApp.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Functional/ExtensionMethods/Instance.cs",
    "content": "﻿namespace ExtensionMethods.Instance\n{\n    using static System.Console;\n\n    class X\n    {\n        public void F(object x) => WriteLine($\"object {x}\");\n        public void F(string x) => WriteLine($\"string {x}\");\n    }\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var x = new X();\n            x.F(\"abc\"); // string のが呼ばれる\n            x.F(10);    // int のオーバーロードがないので object のが呼ばれる\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/ExtensionMethods/InstanceAndExtension.cs",
    "content": "﻿namespace ExtensionMethods.InstanceAndExtension\n{\n    using static System.Console;\n\n    class X\n    {\n        public void F(object x) => WriteLine($\"object {x}\");\n        public void F(string x) => WriteLine($\"string {x}\");\n    }\n\n    static class XExtensions\n    {\n        public static void F(this X @this, int x) => WriteLine($\"int {x}\");\n\n    }\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var x = new X();\n            x.F(\"abc\"); // string のが呼ばれる\n            x.F(10);    // int な拡張が増えたものの、インスタンス メソッド優先 object のが呼ばれる\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/ExtensionMethods/MyApp.cs",
    "content": "﻿using static System.Console;\nusing A;\n\nusing Lib = C.Lib;\nstatic class Lib { public static void F(this int x) => WriteLine(\"global\"); }\n\nnamespace MyApp\n{\n    using B;\n\n    static class Lib { public static void F(this int x) => WriteLine(\"MyApp\"); }\n\n    class Program\n    {\n        static void Main()\n        {\n            // F 拡張メソッドは5つある\n            // この場合 MyApp.Lib.F が使われる\n            // 優先度 高 MyApp > B > global = C > A 低\n            10.F();\n\n            // ちゃんと呼び分けたければ拡張メソッドとして使うことをあきらめる\n            // 完全修飾名を使って、普通の静的メソッドとして呼ぶ\n            A.Lib.F(10);\n            B.Lib.F(10);\n            C.Lib.F(10);\n            MyApp.Lib.F(10);\n            global::Lib.F(10);\n        }\n    }\n}\n\nnamespace A\n{\n    static class Lib { public static void F(this int x) => WriteLine(\"A\"); }\n}\nnamespace B\n{\n    static class Lib { public static void F(this int x) => WriteLine(\"B\"); }\n}\nnamespace C\n{\n    static class Lib { public static void F(this int x) => WriteLine(\"C\"); }\n}\n"
  },
  {
    "path": "Chapters/Functional/Functional.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.25612.2\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"LocalFunctions\", \"LocalFunctions\\LocalFunctions.csproj\", \"{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ExtensionMethods\", \"ExtensionMethods\\ExtensionMethods.csproj\", \"{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B1636BC9-0B5A-4FED-9E19-8CD0957737B3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6F25470E-E1AB-4254-A8D1-68E6CD40A38B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Functional/LambdaInternal/InSameBoat.cs",
    "content": "﻿namespace LambdaInternal.InSameBoat\n{\n    using System;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        static async Task Main()\n        {\n            // この2つの配列の寿命は一蓮托生になる\n            var smallData = new int[5];\n            var bigData = new int[10000];\n\n            // 小さいデータしか握っていないので長寿でもそこまで問題のないデリゲート\n            Func<int, int> f1 = i => smallData[i];\n\n            // 大きめのデータを握っていて、長寿だと問題の出るデリゲート\n            Func<int, int> f2 = i => bigData[i];\n\n            // f1, f2 を使う何か\n            f1(0);\n            f2(0);\n\n            // f2 の寿命が長いと問題なので用が済み次第消す\n            f2 = null!;\n\n            await Task.Delay(TimeSpan.FromHours(10));\n\n            // f1 は後で使いたい\n            // f1 が生きている限り、f2 を消しても結局 bigData は残る\n            f1(0);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LambdaInternal/InstanceMethod.cs",
    "content": "﻿using System;\n\nnamespace LambdaInternal.InstanceMethod\n{\n    class Sample\n    {\n        public int X { get; set; }\n\n        public void M()\n        {\n            Func<int> f = () => X;\n            Console.WriteLine(f());\n        }\n    }\n\n    namespace Compiled\n    {\n        class Sample\n        {\n            public int X { get; set; }\n\n            public void M()\n            {\n                Func<int> f = AnonymousMethod1;\n                Console.WriteLine(f());\n            }\n\n            private int AnonymousMethod1() => X;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LambdaInternal/LambdaInternal.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>LambdaInternal.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Functional/LambdaInternal/MultipleFunctions.cs",
    "content": "﻿namespace LambdaInternal.MultipleFunctions\n{\n    using System;\n\n    class Program\n    {\n        static void F(int m)\n        {\n            // ローカル関数かラムダ式か匿名デリゲート式かは無関係\n            void a(int x) => Console.WriteLine(\"A \" + m * x);\n            Action<int> b = x => Console.WriteLine(\"B \" + m * x);\n            Action<int> c = delegate (int x) { Console.WriteLine(\"C \" + m * x); };\n\n            Invoke(a, b, c);\n        }\n\n        static void Invoke(params Action<int>[] list)\n        {\n            foreach (var item in list) item(1);\n        }\n    }\n\n    namespace Compiled\n    {\n        using System;\n\n        // a, b, c いずれも1つの型にまとまる\n        class AnonymousClass\n        {\n            public int m;\n            internal void A(int x) => Console.WriteLine(\"A \" + x);\n            internal void B(int x) => Console.WriteLine(\"B \" + x);\n            internal void C(int x) => Console.WriteLine(\"C \" + x);\n        }\n\n        class Program\n        {\n            static void F(int m)\n            {\n                // 作られるインスタンスは1つだけ\n                var anonymous = new AnonymousClass();\n                anonymous.m = m;\n\n                Action<int> a = anonymous.A;\n                Action<int> b = anonymous.B;\n                Action<int> c = anonymous.C;\n\n                Invoke(a, b, c);\n            }\n\n            static void Invoke(params Action<int>[] list)\n            {\n                foreach (var item in list) item(1);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LambdaInternal/Program.cs",
    "content": "﻿using System;\n\nnamespace LambdaInternal\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Console.WriteLine(\"Hello World!\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LambdaInternal/StaticMethod.cs",
    "content": "﻿using System;\n\nnamespace LambdaInternal.StaticMethod\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Func<int> f1 = () => 0;\n            f1();\n        }\n    }\n\n    namespace OldCompiled\n    {\n        class Program\n        {\n            static int AnonymousMethod1()\n            {\n                return 0;\n            }\n\n            static void Main(string[] args)\n            {\n                Func<int> f1 = AnonymousMethod1;\n                f1();\n            }\n        }\n    }\n\n    namespace NewCompiled\n    {\n        class Program\n        {\n            class AnonymousClass\n            {\n                public static readonly AnonymousClass Singleton = new AnonymousClass();\n                public static Func<int>? Cache1;\n\n                internal int AnonymousMethod1()\n                {\n                    return 0;\n                }\n            }\n\n            static void Main(string[] args)\n            {\n                Func<int> f1 = AnonymousClass.Cache1 ??= AnonymousClass.Singleton.AnonymousMethod1;\n                f1();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/Capture.cs",
    "content": "﻿namespace LocalFunctions.Capture\n{\n    using System;\n    using System.Linq;\n\n    class Program\n    {\n        static void Main()\n        {\n            // ユーザーからの入力をローカル変数に記録\n            var m = int.Parse(Console.ReadLine());\n            var n = int.Parse(Console.ReadLine());\n\n            var input = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n\n            // ユーザーの入力 m よりも大きいか判定\n            bool filter(int x) => x > m;\n\n            var output = input\n                .Where(filter)\n                .Select(x => n * x); // ユーザーの入力 n を掛ける\n\n            foreach (var x in output)\n            {\n                Console.WriteLine(x);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/CaptureOptimization.cs",
    "content": "﻿namespace LocalFunctions.CaptureOptimization\n{\n    using System;\n\n    class Program\n    {\n        static void M1(int m, int n)\n        {\n            // 最適化できる状況: ローカル関数を直接呼出し\n            int f(int x, int y) => m * x + n * y;\n            var r = f(3, 4);\n        }\n\n        static void M2(int m, int n)\n        {\n            // できない状況1: デリゲート越しに使っている\n            int f(int x, int y) => m * x + n * y;\n            Func<int, int, int> func = f;\n            var r2 = func(3, 4);\n        }\n\n        static void M3(int m, int n)\n        {\n            // できない状況2: 匿名関数を使っている\n            Func<int, int, int> f3 = (x, y) => m * x + n * y;\n            var r3 = f3(3, 4);\n        }\n    }\n\n    class CompilationResult\n    {\n        struct State\n        {\n            public int m;\n            public int n;\n        }\n\n        static int Anonymous(int x, int y, ref State state)\n        {\n            return state.m * x + state.n * y;\n        }\n\n        static void M1(int m, int n)\n        {\n            // 最適化できる状況: ローカル関数を直接呼出し\n            var state = new State { m = m, n = n };\n            var r = Anonymous(3, 4, ref state);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/CaptureOverwrite.cs",
    "content": "﻿namespace LocalFunctions.CaptureOverwrite\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            var x = 1;\n\n            // ローカル関数内で変数xを書き換え\n            void f(int n) => x = n;\n\n            Console.WriteLine(x); // 1\n\n            f(2);\n            Console.WriteLine(x); // 2\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/Factorial.cs",
    "content": "﻿namespace LocalFunctions.Factorial\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            // Main 関数の中で、ローカル関数 f を定義\n            int f(int n) => n >= 1 ? n * f(n - 1) : 1;\n\n            Console.WriteLine(f(10));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/Iterator/MyEnumerable1.cs",
    "content": "﻿namespace LocalFunctions.Iterator1\n{\n    using System;\n    using System.Collections.Generic;\n\n    static class MyEnumerable\n    {\n        public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate)\n        {\n            // イテレーター中のコードは、最初に列挙した(foreach などに渡す)時に初めて実行される\n            // このメソッドを呼んだ時点では、↓この引数チェックが働かない\n            if (source == null) throw new ArgumentNullException(nameof(source));\n            if (predicate == null) throw new ArgumentNullException(nameof(predicate));\n\n            foreach (var x in source)\n                if (predicate(x))\n                    yield return x;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/Iterator/MyEnumerable2.cs",
    "content": "﻿namespace LocalFunctions.Iterator2\n{\n    using System;\n    using System.Collections.Generic;\n\n    static class MyEnumerable\n    {\n        public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate)\n        {\n            // イテレーターではなくなった(イテレーターなのは WhereInternal の方)ので、ちゃんと呼ばれた時点でチェックが走る\n            if (source == null) throw new ArgumentNullException(nameof(source));\n            if (predicate == null) throw new ArgumentNullException(nameof(predicate));\n\n            return WhereInternal(source, predicate);\n        }\n\n        private static IEnumerable<T> WhereInternal<T>(IEnumerable<T> source, Func<T, bool> predicate)\n        {\n            foreach (var x in source)\n                if (predicate(x))\n                    yield return x;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/Iterator/MyEnumerable3.cs",
    "content": "﻿namespace LocalFunctions.Iterator3\n{\n    using System;\n    using System.Collections.Generic;\n\n    static class MyEnumerable\n    {\n        public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate)\n        {\n            // イテレーターではなくなった(イテレーターなのは WhereInternal の方)ので、ちゃんと呼ばれた時点でチェックが走る\n            if (source == null) throw new ArgumentNullException(nameof(source));\n            if (predicate == null) throw new ArgumentNullException(nameof(predicate));\n\n            IEnumerable<T> f()\n            {\n                foreach (var x in source)\n                    if (predicate(x))\n                        yield return x;\n            }\n\n            return f();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/Iterator/Program1.cs",
    "content": "﻿namespace LocalFunctions.Iterator1\n{\n    using System;\n    using System.Collections.Generic;\n\n    class Program\n    {\n        static void Main()\n        {\n            IEnumerable<string> input = null!;\n\n            // input が null なので例外を投げてほしい\n            // 多くの人がそれを期待する\n            var output = input.Where(x => x.Length < 10);\n\n            Console.WriteLine(\"ここが表示されるとおかしい\"); // でも表示される\n\n            foreach (var x in output) // 実際に例外が出るのはこの行\n            {\n                Console.WriteLine(x);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/Iterator/Program2.cs",
    "content": "﻿namespace LocalFunctions.Iterator2\n{\n    using System;\n    using System.Collections.Generic;\n\n    class Program\n    {\n        static void Main()\n        {\n            IEnumerable<string> input = null!;\n\n            // この場合は期待通りここで例外\n            var output = input.Where(x => x.Length < 10);\n\n            Console.WriteLine(\"ここが表示されるとおかしい\"); // ちゃんと表示されない\n\n            foreach (var x in output)\n            {\n                Console.WriteLine(x);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/Lambda.cs",
    "content": "﻿#pragma warning disable CS0168\n#pragma warning disable CS8321\n\nnamespace LocalFunctions.Lambda\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    class Program\n    {\n        static void Main()\n        {\n            var input = new[] { 1, 2, 3, 4, 5 };\n            var output = input\n                .Where(n => n > 3)\n                .Select(n => n * n);\n\n            foreach (var x in output)\n            {\n                Console.WriteLine(x);\n            }\n        }\n\n        static void M1()\n        {\n            Func<int, int> f1 =\n                (int x) =>\n                {\n                    var sum = 0;\n                    for (int i = 0; i < x; i++)\n                        sum += i;\n                    return sum;\n                }\n                ;\n        }\n\n        static void 再帰()\n        {\n            // 再帰呼び出し\n            // ローカル関数は素直に書ける\n            int f1(int n) => n >= 1 ? n * f1(n - 1) : 1;\n\n            // 匿名関数はひと手間必要\n            Func<int, int> f2 = null!;\n            f2 = n => n >= 1 ? n * f2(n - 1) : 1;\n        }\n\n        static void イテレーター()\n        {\n            // イテレーター\n            // ローカル関数なら使える\n            IEnumerable<int> g1(IEnumerable<int> items)\n            {\n                foreach (var x in items)\n                    yield return 2 * x;\n            }\n\n#if false\n            // 匿名関数では使えない(コンパイル エラーになる)\n            Func<IEnumerable<int>, IEnumerable<int>> g2 = items =>\n            {\n                foreach (var x in items)\n                    yield return 2 * x;\n            }\n#endif\n        }\n\n        static void ジェネリック()\n        {\n            // ジェネリック(polymorphic lambda)\n            // ローカル関数ならジェネリックに使える\n            bool eq1<T>(T x, T y) where T : IComparable<T> => x.CompareTo(y) == 0;\n            Console.WriteLine(eq1(1, 2));\n            Console.WriteLine(eq1(\"aaa\", \"aaa\"));\n\n#if false\n            // 匿名関数はジェネリックにならない\n            // Func<T, T, bool> の時点でコンパイル エラー\n            // where 制約を付ける構文もない\n            Func<T, T, bool> eq2 = (x, y) => x.CompareTo(y) == 0;\n            // 当然、呼べない\n            Console.WriteLine(eq2(1, 2));\n            Console.WriteLine(eq2(\"aaa\", \"aaa\"));\n#endif\n        }\n\n        static void 引数の規定値()\n        {\n            // ローカル関数の引数には規定値を与えられる\n            int f1(int n = 0) => 2 * n;\n            Console.WriteLine(f1());\n            Console.WriteLine(f1(5));\n\n#if false\n            // 匿名関数は無理\n            Func<int, int> f2 = (x, y) => x.CompareTo(y) == 0;\n            // 当然、呼べない\n            Console.WriteLine(eq2(1, 2));\n            Console.WriteLine(eq2(\"aaa\", \"aaa\"));\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/LocalFunctions.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>LocalFunctions.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/Program.cs",
    "content": "﻿#pragma warning disable CS0168\n#pragma warning disable CS8321\n\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace LocalFunctions\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n\n    class Sample\n    {\n        public Sample()\n        {\n            int f(int n) => n * n;\n        }\n\n        public int Property\n        {\n            get\n            {\n                int f(int n) => n * n;\n                return f(10);\n            }\n        }\n\n        public static Sample? operator+(Sample x)\n        {\n            static int f(int n) => n * n;\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/RecursiveFunction/Node.cs",
    "content": "﻿namespace LocalFunctions.RecursiveFunction\n{\n    class Node\n    {\n        public int Value { get; }\n        public Node? Left { get; }\n        public Node? Right { get; }\n\n        public Node(int value, Node? left = null, Node? right = null)\n        {\n            Value = value;\n            Left = left;\n            Right = right;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/RecursiveFunction/Program.cs",
    "content": "﻿namespace LocalFunctions.RecursiveFunction\n{\n    class Program\n    {\n        static void Main()\n        {\n            var t = new Tree();\n\n            foreach (var x in t.Inorder())\n                System.Console.WriteLine(x);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/RecursiveFunction/Tree.cs",
    "content": "﻿namespace LocalFunctions.RecursiveFunction\n{\n    using System.Collections.Generic;\n\n    class Tree\n    {\n        // サンプル用に値を固定して作成\n        private Node _root =\n            new Node(1,\n                new Node(2,\n                    new Node(3),\n                    new Node(4)\n                    ),\n                new Node(5,\n                    new Node(6),\n                    new Node(7)\n                    )\n            );\n\n        public IEnumerable<int> Inorder()\n        {\n            return Inorder(_root); // フィールドを渡して再帰呼び出しを開始\n        }\n\n        // 再帰的にノードをたどる\n        private static IEnumerable<int> Inorder(Node n)\n        {\n            if (n.Left != null)\n                foreach (var x in Inorder(n.Left))\n                    yield return x;\n\n            yield return n.Value;\n\n            if (n.Right != null)\n                foreach (var x in Inorder(n.Right))\n                    yield return x;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/TaskCache/Program1.cs",
    "content": "﻿namespace LocalFunctions.TaskCache1\n{\n    using System;\n    using System.Net.Http;\n    using System.Text.RegularExpressions;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        static void Main()\n        {\n            MainAsync().Wait();\n        }\n\n        static async Task MainAsync()\n        {\n            // 何度か呼ぶけども、キャッシュされているので通信は1回きり\n            Console.WriteLine(await LoadAsync());\n            Console.WriteLine(await LoadAsync());\n            Console.WriteLine(await LoadAsync());\n        }\n\n        static Task<string> LoadAsync() => _loadCache ??= LoadAsyncInternal();\n        static Task<string>? _loadCache;\n\n        static async Task<string> LoadAsyncInternal()\n        {\n            var c = new HttpClient();\n            var res = await c.GetAsync(\"http://ufcpp.net\");\n            var content = await res.Content.ReadAsStringAsync();\n\n            return Regex.Match(content, @\"\\<title\\>(.*?)\\<\").Groups[1].Value;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/TaskCache/Program2.cs",
    "content": "﻿namespace LocalFunctions.TaskCache2\n{\n    using System;\n    using System.Net.Http;\n    using System.Text.RegularExpressions;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        static void Main()\n        {\n            MainAsync().Wait();\n        }\n\n        static async Task MainAsync()\n        {\n            // 何度か呼ぶけども、キャッシュされているので通信は1回きり\n            Console.WriteLine(await LoadAsync());\n            Console.WriteLine(await LoadAsync());\n            Console.WriteLine(await LoadAsync());\n        }\n\n        static Task<string> LoadAsync()\n        {\n            async Task<string> inner()\n            {\n                var c = new HttpClient();\n                var res = await c.GetAsync(\"http://ufcpp.net\");\n                var content = await res.Content.ReadAsStringAsync();\n\n                return Regex.Match(content, @\"\\<title\\>(.*?)\\<\").Groups[1].Value;\n            }\n\n            _loadCache = _loadCache ?? inner();\n            return _loadCache;\n        }\n        static Task<string> _loadCache;\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/ToArray/Program1.cs",
    "content": "﻿namespace LocalFunctions.ToArray1\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    static class MyEnumerable\n    {\n        public static U[] SelectToArray<T, U>(this T[] array, Func<T, U> selector)\n        {\n            return Select(array, selector).ToArray();\n        }\n\n        // SelectToArray からしか呼ばれない\n        private static IEnumerable<U> Select<T, U>(IEnumerable<T> source, Func<T, U> selector)\n        {\n            foreach (var x in source)\n                yield return selector(x);\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var input = new[] { 1, 2, 3, 4, 5, 6, 7 };\n            var output = input.SelectToArray(x => x * x);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/ToArray/Program2.cs",
    "content": "﻿namespace LocalFunctions.ToArray2\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    static class MyEnumerable\n    {\n        public static U[] SelectToArray<T, U>(this T[] array, Func<T, U> selector)\n        {\n            IEnumerable<U> inner()\n            {\n                foreach (var x in array)\n                    yield return selector(x);\n            }\n\n            return inner().ToArray();\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var input = new[] { 1, 2, 3, 4, 5, 6, 7 };\n            var output = input.SelectToArray(x => x * x);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Functional/LocalFunctions/Usage/Usage.cs",
    "content": "﻿namespace LocalFunctions.Usage\n{\n    class Usage1\n    {\n        static void M()\n        {\n            // 何らかの前準備とか\n            MInternal();\n        }\n\n        static void MInternal()\n        {\n            // 実際の処理はこちらで\n        }\n    }\n\n    class Usage2\n    {\n        static void M()\n        {\n            // 何らかの前準備とか\n\n            void m()\n            {\n                // 実際の処理はこちらで\n            }\n\n            m();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/.gitignore",
    "content": "*.opendb\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/Com/ComImportSample.cs",
    "content": "﻿using MSXML2;\nusing System;\n\nnamespace NativeInterop\n{\n    /// <summary>\n    /// COM interop の例として、MSXML2 を参照してみる。\n    /// </summary>\n    class ComImportSample\n    {\n        public static void Main()\n        {\n            var doc = new DOMDocument60();\n\n            if (doc.load(\"Sample.xml\"))\n            {\n                var s = doc.documentElement;\n\n                foreach (IXMLDOMElement item in s.getElementsByTagName(\"Item\"))\n                {\n                    var name = item.getAttribute(\"Name\");\n                    var value = item.getAttribute(\"Value\");\n\n                    Console.WriteLine($\"{name} = {value}\");\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/Com/ComLateBindingSample.cs",
    "content": "﻿using System;\n\nnamespace NativeInterop\n{\n    /// <summary>\n    /// <see cref=\"Type.GetTypeFromProgID(string)\"/> と dynamic を使えば、COM を遅延バインディングで使える。\n    /// やっていることは <see cref=\"ComImportSample\"/> と同じ。\n    /// </summary>\n    class ComLateBindingSample\n    {\n        public static void Main()\n        {\n            var t = Type.GetTypeFromProgID(\"MSXML2.DOMDocument\");\n            dynamic doc = Activator.CreateInstance(t);\n\n            if (doc.load(\"Sample.xml\"))\n            {\n                var s = doc.documentElement;\n\n                foreach (var item in s.getElementsByTagName(\"Item\"))\n                {\n                    var name = item.getAttribute(\"Name\");\n                    var value = item.getAttribute(\"Value\");\n\n                    Console.WriteLine($\"{name} = {value}\");\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/Dll/BlittableSample1.cs",
    "content": "﻿namespace NativeInterop.Dll\n{\n    using System;\n    using System.Runtime.InteropServices;\n\n    enum Enum16 : ushort { }\n\n    struct Struct16 { public byte x, y; }\n\n    [StructLayout(LayoutKind.Explicit, Size = 2)]\n    struct ExplicitStruct16 { }\n\n    /// <summary>\n    /// DllImport したメソッドの引数は、型のサイズしか見ていないという話。\n    ///\n    /// ネイティブ DLL 側で公開できる関数は extern \"C\" なものなので、シグネチャは関数名だけ(引数はシグネチャに含まれない。オーバーロード不可)。\n    /// DllImport している C# 側としては、所定の順序で引数をスタックに積んで、指定された名前の関数を呼び出すだけ。\n    /// なので、スタックへの引数の積まれ方が一緒なら呼べてしまう。\n    ///\n    /// もちろん、サイズが一致している保証が必要だし、ブロックコピーされて困る型は渡せないので、\n    /// いわゆる blittable 型(プリミティブ型か他の blittable 型のみを含む型)でないとダメ。\n    /// </summary>\n    class BlittableSample1\n    {\n        // Native DLL 側には void SetValu(UINT16& x) が1つだけある。\n        // 中で x に 0x1234 の値を代入してる。\n\n        // ushort, Enum16, Struct16, ExplicitStruct16 はいずれも2バイトの値型。\n        // 型のサイズさえ一致していれば DllImport で呼び出すことができる。\n\n        [DllImport(\"Win32Dll.dll\")]\n        extern static void SetValue(ref ushort x);\n\n        [DllImport(\"Win32Dll.dll\")]\n        extern static void SetValue(ref Enum16 x);\n        [DllImport(\"Win32Dll.dll\")]\n        extern static void SetValue(ref Struct16 x);\n        [DllImport(\"Win32Dll.dll\")]\n        extern static void SetValue(ref ExplicitStruct16 x);\n\n        public static void Main()\n        {\n            // 以下の4つはどれも 1234 と表示される\n            {\n                ushort x = 0;\n                SetValue(ref x);\n                Console.WriteLine($\"{x:X2}\");\n            }\n            {\n                // enum の underlying type が ushort なので ushort と互換\n                var x = default(Enum16);\n                SetValue(ref x);\n                Console.WriteLine($\"{(ushort)x:X2}\");\n            }\n            {\n                // byte 2つで合計2バイトな状態でも、ushort とサイズが一緒なので同じ関数を呼べる\n                var x = default(Struct16);\n                SetValue(ref x);\n                Console.WriteLine($\"{x.y:X2}{x.x:X2}\");\n            }\n            {\n                // ExplicitStruct16 にはメンバーがないけど、レイアウトを明示的に指定して2バイト化してる\n                // その無理やり確保した2バイトの領域に 0x1234 が書き込まれる\n                var x = default(ExplicitStruct16);\n                SetValue(ref x);\n                unsafe\n                {\n                    var p = (byte*)&x;\n                    Console.WriteLine($\"{p[1]:X2}{p[0]:X2}\");\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/Dll/BlittableSample2.cs",
    "content": "﻿namespace NativeInterop.Dll\n{\n    using System;\n    using System.Runtime.InteropServices;\n\n    /// <summary>\n    /// ネイティブ側で構造体を引数・戻り値にしてる場合の話。\n    /// <see cref=\"BlittableSample1\"/> での説明通り、同じサイズの値型を用意すれば何でも呼び出し可能。\n    /// ネイティブ側と同じレイアウトの構造体を用意するもよし、ulong とかで受け取ってしまうのもよし。\n    /// </summary>\n    class BlittableSample2\n    {\n        // ネイティブ側のシグネチャは Data Shift(Data data)\n        // Data は8バイトの構造体\n        // サイズが同じ値型なら別の型でも interop 可能(ここでは ulong を利用)\n        [DllImport(\"Win32Dll.dll\")]\n        extern static ulong Shift(ulong data);\n\n        // ネイティブ側と同じレイアウトの struct を作る\n        struct Data\n        {\n            public byte A;\n            public byte B;\n            public ushort C;\n            public uint D;\n            public override string ToString() => $\"{A:X2}{B:X2}{C:X4}{D:X8}\";\n        }\n\n        [DllImport(\"Win32Dll.dll\")]\n        extern static Data Shift(Data data);\n\n        public static void Main()\n        {\n            Data data = new Data { A = 0x01, B = 0x02, C = 0x0304, D = 0x05060708 };\n            data = Shift(data);\n            Console.WriteLine(data);\n\n            ulong v = 0x0102030405060708;\n            v = Shift(v);\n            Console.WriteLine(v.ToString(\"X16\"));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/Dll/CallbackSample.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace NativeInterop.Dll\n{\n    /// <summary>\n    /// ネイティブ側とのやり取りにコールバック関数を使いたい場合。\n    /// .NET のデリゲートを、ネイティブ側の関数ポインターにマーシャリングしてくれる仕組みがある。\n    /// </summary>\n    class CallbackSample\n    {\n        delegate void Callback(IntPtr param, uint value);\n\n        [DllImport(\"Win32Dll.dll\")]\n        extern static void SetCallback(IntPtr param, Callback callback);\n\n        [DllImport(\"Win32Dll.dll\")]\n        extern static void FireCallback(uint value);\n\n        public static void Main()\n        {\n            StaticMethod();\n            //NonReferencedInstanceMethod(); // こいつは呼ぶと実行時エラー\n            ReferencedInstanceMethod();\n            ViaCallbackParameter();\n        }\n\n        /// <summary>\n        /// ガベコレを誘発用に無駄にインスタンスを量産。\n        /// </summary>\n        private static void MakeGarbage()\n        {\n            for (int i = 0; i < 1000; i++)\n            {\n                var x = new byte[1000];\n            }\n        }\n\n        /// <summary>\n        /// static メソッドをコールバックとして渡す。\n        /// 問題なし。\n        /// </summary>\n        private static void StaticMethod()\n        {\n            void SetHandler()\n            {\n                // 何のインスタンスも参照しないメソッドであれば、問題は特に怒らない。\n                // GC が起ころうと、消えないし動かない。\n                SetCallback((IntPtr)0, (param, value) => Console.WriteLine(value));\n            }\n\n            MakeGarbage();\n\n            SetHandler();\n\n            MakeGarbage();\n            GC.Collect(2, GCCollectionMode.Forced);\n\n            for (uint i = 0; i < 5; i++)\n                FireCallback(i);\n        }\n\n        /// <summary>\n        /// インスタンスメソッドをコールバックとして渡す。\n        /// そのインスタンスが GC 回収されてしまうとまずい。\n        /// この例では、エラーが起きる。\n        /// </summary>\n        private static void NonReferencedInstanceMethod()\n        {\n            void SetHandler()\n            {\n                // クロージャにしてしまったので、インスタンスが作られて、ラムダ式もインスタンスメソッドになる。\n                // かつ、そのインスタンスはこのローカル関数を抜けた時点でGC回収の対象になってしまう。\n                uint sum = 0;\n                SetCallback((IntPtr)0, (param, value) => Console.WriteLine(sum += value));\n            }\n\n            MakeGarbage();\n\n            SetHandler();\n\n            MakeGarbage();\n            GC.Collect(2, GCCollectionMode.Forced);\n            // ここで、上記ラムダ式はGC回収されてしまう。\n\n            for (uint i = 0; i < 5; i++)\n                FireCallback(i); // ここで回収済みのインスタンスに触ろうとして、実行時エラーが起きる。\n        }\n\n        /// <summary>\n        /// <see cref=\"NonReferencedInstanceMethod\"/> の問題を回避するためのコード。\n        /// </summary>\n        private static void ReferencedInstanceMethod()\n        {\n            Callback SetHandler()\n            {\n                // NonReferencedInstanceMethod との差は、登録したハンドラーを戻り値で返して、呼び出し側で握り続けてもらうこと。\n                uint sum = 0;\n                Callback c = (param, value) => Console.WriteLine(sum += value);\n                SetCallback((IntPtr)0, c);\n                return c;\n            }\n\n            MakeGarbage();\n\n            // ただ握ってるだけ。特に使わなくてもいいんでとにかく変数に受ける。\n            var callback = SetHandler();\n\n            MakeGarbage();\n            GC.Collect(2, GCCollectionMode.Forced);\n            // GC は怒ってるので、Managed なデリゲートはコンパクションで場所が移動してる。\n\n            // それでもエラーにならなくなる。\n            // CLR 内部の挙動としては、\n            // - デリゲートを呼び出してくれる static な関数を用意してある\n            // - その static な関数は、コンパクションによる移動はトラッキングしてくれる\n            // - でも、デリゲートは GC の対象にはなる(弱参照的な挙動)\n            // みたい。\n            for (uint i = 0; i < 5; i++)\n                FireCallback(i);\n        }\n\n        /// <summary>\n        /// <see cref=\"ReferencedInstanceMethod\"/> のような挙動もちょっと特殊と言えば特殊で。\n        /// ネイティブに渡すコールバックは static で済むなら static がいい感じもあり。\n        ///\n        /// 今回の場合、<see cref=\"SetCallback(IntPtr, Callback)\"/> の第1引数に渡したパラメーターを、\n        /// <see cref=\"Callback\"/> の第1引数で渡してもらえる作りになってる。\n        /// ここに、インスタンスを渡せないかを考える。\n        ///\n        /// ネイティブ側を経由するので、pinned ポインターを使う必要がある。\n        /// <seealso cref=\"GCHandle.Alloc(object, GCHandleType)\"/>\n        /// <seealso cref=\"GCHandleType.Pinned\"/>\n        /// <seealso cref=\"GCHandle.AddrOfPinnedObject\"/>\n        /// </summary>\n        private static void ViaCallbackParameter()\n        {\n            // コールバックに渡してほしいパラメーターを用意\n            var p = new CallbackParameter();\n\n            // ネイティブに渡しても大丈夫なように pinned (ピン止め)して、\n            var h = GCHandle.Alloc(p, GCHandleType.Pinned);\n            // IntPtr 化する。\n            var ptr = GCHandle.ToIntPtr(h);\n\n            void SetHandler()\n            {\n                // IntPtr 化したオブジェクト(のアドレス)\n                SetCallback(ptr, (param, value) =>\n                {\n                    // ポインターからオブジェクトを復元\n                    var p1 = (CallbackParameter)GCHandle.FromIntPtr(param).Target;\n                    Console.WriteLine(p1.Value += value);\n                });\n            }\n\n            MakeGarbage();\n\n            SetHandler();\n\n            MakeGarbage();\n            GC.Collect(2, GCCollectionMode.Forced);\n            // コールバックは static なのでガベコレの影響を受けない。\n            // h.Free() しない限りは p もコンパクションの影響を受けない。\n\n            for (uint i = 0; i < 5; i++)\n                FireCallback(i);\n\n            // ただし、Free を忘れるとメモリリークする。\n            h.Free();\n        }\n\n        // Sequential にしておかないと GCHandle.Alloc できない。\n        [StructLayout(LayoutKind.Sequential)]\n        class CallbackParameter\n        {\n            public uint Value;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/Dll/DllImportSample.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace NativeInterop\n{\n    class DllImportSample\n    {\n        public static void Main()\n        {\n            SYSTEMTIME t;\n            GetLocalTime(out t);\n\n            Console.WriteLine($\"{t.wYear}/{t.wMonth}/{t.wDay} {t.wHour}:{t.wMinute}:{t.wSecond}\");\n        }\n\n        [DllImport(\"kernel32.dll\")]\n        static extern void GetLocalTime(out SYSTEMTIME lpSystemTime);\n    }\n\n    [StructLayout(LayoutKind.Sequential, Pack = 2)]\n    struct SYSTEMTIME\n    {\n        public ushort wYear;\n        public ushort wMonth;\n        public ushort wDayOfWeek;\n        public ushort wDay;\n        public ushort wHour;\n        public ushort wMinute;\n        public ushort wSecond;\n        public ushort wMilliseconds;\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/Dll/StringSample.cs",
    "content": "﻿namespace NativeInterop.Dll\n{\n    using System;\n    using System.Runtime.InteropServices;\n\n    /// <summary>\n    /// C# 側 string → ネイティブ側 null 終端文字列の interop の例。\n    ///\n    /// .NET の string 型は COM の BSTR 互換なメモリレイアウトになってる。\n    /// さらに、BSTR は null 終端文字列と互換。\n    /// その結果、string はコピーなしでポインターをそのままネイティブコードに渡せる。\n    ///\n    /// DllImport では、何らかの変換が必要な場合に限り変換処理を行って、\n    /// 極力そのままブロックコピーとかポインター渡しで引数を渡してくれる。\n    ///\n    /// なので、\n    /// - ネイティブ側が wchar_t* で受けてる → string は互換性があるのでコピーを作らない\n    /// - ネイティブ側が char* で受けてる → 変換が必要。コピーが作られる\n    /// という挙動になる。\n    /// </summary>\n    class StringSample\n    {\n        // FillA16, FillA8 はいずれも、引数の文字列を全文字 a に上書きする関数。\n\n        // 対 UTF-16。無変換で(ポインター渡しで)呼び出せる。\n        [DllImport(\"Win32Dll.dll\", CharSet = CharSet.Unicode)]\n        extern static void FillA16(string s);\n\n        // 対 ASCII。変換が必要。\n        [DllImport(\"Win32Dll.dll\", CharSet = CharSet.Ansi)]\n        extern static void FillA8(string s);\n\n        public static void Main()\n        {\n            // 変換が必要な方。\n            // コピーが書き換わるだけなので、s1 には影響なし。\n            var s1 = \"awsedrftgyhu\";\n            FillA8(s1);\n            Console.WriteLine(s1); // awsedrftgyhu\n\n            // ポインターで渡る方。\n            // s2 はネイティブ コード側での書き換えの影響を受ける。\n            var s2 = \"awsedrftgyhu\";\n            FillA16(s2);\n            Console.WriteLine(s2); // aaaaaaaaaaaa\n\n            // 注意: .NET の string は通常の文脈では書き換え不能に作ってあるものの、\n            // unsafe やネイティブコードを介すると普通に書き換えできる。\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/Dll/YourOwnDllImport.cs",
    "content": "﻿namespace NativeInterop.YourOwnDllImport\n{\n    using System;\n    using System.Runtime.InteropServices;\n\n    /// <summary>\n    /// 自前で作った Win32 DLL を DllImport する例。\n    ///\n    /// とりあえず一番シンプルな例。\n    /// ネイティブ側から値を1個もらうだけ。\n    /// </summary>\n    class Program\n    {\n        [DllImport(\"Win32Dll.dll\")]\n        extern static int GetValue();\n\n        private static IntPtr GetAddress(object x)\n        {\n            return System.Runtime.CompilerServices.Unsafe.As<object, IntPtr>(ref x);\n        }\n\n        [StructLayout(LayoutKind.Sequential)]\n        class CallbackParam\n        {\n            public uint Value;\n        }\n\n        public static void Main()\n        {\n            Console.WriteLine(GetValue());\n\n#if false\n\n            // GC 誘発\n            for (int i = 0; i < 10000; i++) { var x = new byte[10000]; }\n\n            var param = new CallbackParam();\n            var h = GCHandle.Alloc(param, GCHandleType.Pinned);\n\n            Sub(h);\n\n            //Console.WriteLine($\"&d = {GetAddress(param)}, &c = {GetAddress(c)}, fp(c) = {Marshal.GetFunctionPointerForDelegate(c)}\");\n\n            // GC 誘発\n            for (int i = 0; i < 10000; i++) { var x = new byte[10000]; }\n            GC.Collect(2, GCCollectionMode.Forced);\n\n            //Console.WriteLine($\"&d = {GetAddress(param)}, &c = {GetAddress(c)}, fp(c) = {Marshal.GetFunctionPointerForDelegate(c)}\");\n\n            for (uint i = 0; i < 5; i++)\n            {\n                FireCallback(i);\n            }\n\n            //Console.WriteLine($\"&d = {GetAddress(param)}, &c = {GetAddress(c)}, fp(c) = {Marshal.GetFunctionPointerForDelegate(c)}\");\n\n            return;\n\n\n        private static void Sub(GCHandle h)\n        {\n            Callback c = (param, value) =>\n            {\n                var obj = (CallbackParam)GCHandle.FromIntPtr(param).Target;\n                obj.Value += value;\n                Console.WriteLine($\"{obj.Value} {value}\");\n            };\n\n            SetCallback(GCHandle.ToIntPtr(h), c);\n        }\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/NativeInterop.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.WindowsDesktop\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <TargetPlatformVersion>10.0</TargetPlatformVersion>\n    <OutputType>Exe</OutputType>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <StartupObject>NativeInterop.Program</StartupObject>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <UseWPF>true</UseWPF>\n    <AutoGenerateBindingRedirects>false</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Include=\"$(ProjectDir)\\..\\Win32Dll\\bin\\$(Configuration)\\Win32Dll.dll\">\n      <Link>%(Filename)%(Extension)</Link>\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n\n  <ItemGroup>\n    <Reference Include=\"Windows\">\n      <HintPath>$(MSBuildProgramFiles32)\\Windows Kits\\10\\UnionMetadata\\10.0.18362.0\\Windows.winmd</HintPath>\n      <Private>False</Private>\n    </Reference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <Content Include=\"Sample.xml\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <COMReference Include=\"MSXML2\">\n      <Guid>{F5078F18-C551-11D3-89B9-0000F81FE221}</Guid>\n      <VersionMajor>6</VersionMajor>\n      <VersionMinor>0</VersionMinor>\n      <Lcid>0</Lcid>\n      <WrapperTool>tlbimp</WrapperTool>\n      <Isolated>False</Isolated>\n      <EmbedInteropTypes>True</EmbedInteropTypes>\n    </COMReference>\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "Chapters/Interop/NativeInterop/NativeInterop.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NativeInterop\", \"NativeInterop.csproj\", \"{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"Win32Dll\", \"..\\Win32Dll\\Win32Dll.vcxproj\", \"{4C367220-4A86-4F8F-94A4-E303A882EC38}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Release|x64.Build.0 = Release|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{F404E6CA-F7FD-4AB8-A531-D8203BCC3F70}.Release|x86.Build.0 = Release|Any CPU\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|ARM.ActiveCfg = Debug|Win32\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|x64.Build.0 = Debug|x64\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Debug|x86.Build.0 = Debug|Win32\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|ARM.ActiveCfg = Release|Win32\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|x64.ActiveCfg = Release|x64\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|x64.Build.0 = Release|x64\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|x86.ActiveCfg = Release|Win32\n\t\t{4C367220-4A86-4F8F-94A4-E303A882EC38}.Release|x86.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/Program.cs",
    "content": "﻿namespace NativeInterop\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            ComImportSample.Main();\n            ComLateBindingSample.Main();\n            WinRtSample.Main();\n            DllImportSample.Main();\n            YourOwnDllImport.Program.Main();\n            Dll.StringSample.Main();\n            Dll.BlittableSample1.Main();\n            Dll.BlittableSample2.Main();\n            Dll.CallbackSample.Main();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/Sample.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<Sample>\n    <Item Name=\"a\" Value=\"1\"/>\n    <Item Name=\"b\" Value=\"2\"/>\n    <Item Name=\"c\" Value=\"3\"/>\n    <Item Name=\"d\" Value=\"4\"/>\n</Sample>\n"
  },
  {
    "path": "Chapters/Interop/NativeInterop/WinRt/WinRtSample.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Threading.Tasks;\nusing Windows.Foundation;\nusing Windows.System;\n\nnamespace NativeInterop\n{\n    /// <summary>\n    /// WinRT の <see cref=\"User\"/> からユーザーIDを取得する例。\n    /// WinRT の場合は相互運用の面倒な処理はフレームワーク側がきっちり吸収してくれているので、\n    /// ほとんど .NET の普通のクラスを参照するのと変わらない感覚で使える。\n    /// </summary>\n    class WinRtSample\n    {\n        public static void Main()\n        {\n            MainAsync().Wait();\n        }\n\n        static async Task MainAsync()\n        {\n            var allUsers = await User.FindAllAsync();\n\n            foreach (var user in allUsers)\n            {\n                Console.WriteLine(user.NonRoamableId);\n            }\n        }\n    }\n\n    static class WinRtExtensions\n    {\n        public static TaskAwaiter<T> GetAwaiter<T>(this IAsyncOperation<T> t) => t.AsTask().GetAwaiter();\n\n        public static Task<T> AsTask<T>(this IAsyncOperation<T> t)\n        {\n            var tcs = new TaskCompletionSource<T>();\n            t.Completed += (info, state) =>\n            {\n                try\n                {\n                    tcs.TrySetResult(info.GetResults());\n                }\n                catch(Exception ex)\n                {\n                    tcs.TrySetException(ex);\n                }\n            };\n            return tcs.Task;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeMemory/ManagedApp/Interop.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace ConsoleApp1\n{\n    static class Interop\n    {\n        public delegate void Callback(int senderId, IntPtr data, IntPtr dataLen);\n\n        [DllImport(\"NativeLib.dll\", CallingConvention = CallingConvention.StdCall)]\n        public static extern void SetCallback(Callback callback);\n\n        [DllImport(\"NativeLib.dll\", CallingConvention = CallingConvention.StdCall)]\n        public static extern void Trigger(int senderId);\n\n        [DllImport(\"NativeLib.dll\", CallingConvention = CallingConvention.StdCall)]\n        public static extern void AddRef(IntPtr data);\n\n        [DllImport(\"NativeLib.dll\", CallingConvention = CallingConvention.StdCall)]\n        public static extern void Release(IntPtr data);\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeMemory/ManagedApp/ManagedApp.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Debug' \">\n    <MrsPath>..\\NativeLib\\x64\\Debug\\NativeLib.dll</MrsPath>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(Configuration)' == 'Release' \">\n    <MrsPath>..\\NativeLib\\x64\\Release\\NativeLib.dll</MrsPath>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Include=\"$(MrsPath)\">\n      <Link>%(Filename)%(Extension)</Link>\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview1-25305-02\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Interop/NativeMemory/ManagedApp/Program.cs",
    "content": "﻿using System;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace ConsoleApp1\n{\n    class Program\n    {\n        const int N = 30;\n        const int Wait = 30;\n\n        static void Main(string[] args)\n        {\n            Interop.SetCallback(Callback);\n\n            for (int i = 0; i < N; i++)\n            {\n                Interop.Trigger(i);\n            }\n\n            Thread.Sleep(Wait * (N + 1));\n        }\n\n        private static async void Callback(int senderId, IntPtr data, IntPtr dataLen)\n        {\n            // data の寿命は、素の状態だとこのコールバック内のみ。\n\n            // なので、ここで一時配列を取って、Buffer.MemoryCopy とかでデータをコピーしてから使うとかもよくある手法なんだけども…\n            // やっぱ一時配列の確保とかコピーを避けたい。\n            // 特に、data がかなり巨大だとコピーのコストが馬鹿にならないので。\n\n            try\n            {\n                // 参照カウントを増やして、コールバックから外に出ても data の指す先を残してもらう。\n                Interop.AddRef(data);\n\n                // data に対して時間が掛かる処理をしたり、という前提。\n                // 例えば data に巨大な JSON が入っていて、それをデシリアライズするのにそれなりの時間かかるとかいう状況で、別スレッドでデシリアライズ処理したいとか。\n                await Task.Delay(senderId * Wait);\n\n                // await の後ろなのでここはもうコールバックの外。\n                // AddRef したので data はまだ生きてる。\n\n                Console.WriteLine(\"sender: \" + senderId);\n                Console.Write(\"data: \");\n                WriteBytes(data, dataLen);\n                Console.WriteLine();\n            }\n            finally\n            {\n                // 処理が終わったら参照カウントを減らす。\n                Interop.Release(data);\n            }\n        }\n\n        static unsafe void WriteBytes(IntPtr data, IntPtr dataLen)\n        {\n            var s = new Span<byte>((byte*)data, (int)dataLen);\n\n            for (int i = 0; i < s.Length; i++)\n            {\n                Console.Write(\"{0:X2}\", s[i]);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeMemory/NativeLib/NativeLib.cpp",
    "content": "// NativeLib.cpp : Defines the exported functions for the DLL application.\n//\n\n#include \"stdafx.h\"\n\nextern \"C\"\n{\n\ttypedef __declspec(dllexport) void (*Callback)(__int32 senderId, void* data, size_t data_len);\n\n\tstatic Callback g_callback;\n\n\t// Trigger Ă񂾎ɁAcallback ĂяoB\n\t// callback ɓn data |C^[́Aʏł callback łLB\n\t// callback 𒴂ėLɂ邽߂ɂ AddRef Ă(̏ꍇARelease ƌĂ΂Ȃƃ[N)B\n\t__declspec(dllexport) void SetCallback(Callback callback)\n\t{\n\t\tg_callback = callback;\n\t}\n\n\t// { NativeLib ŋNCxgɉ callback Ă΂悤ȑzȂ񂾂ǁA\n\t// TvƂƂŊOCxgNĂ炤B\n\t// callback ɓn data KBłĂB\n\t__declspec(dllexport) void Trigger(__int32 senderId)\n\t{\n\t\tauto data_len = std::rand() % 1024;\n\n\t\t__int8* p = new __int8[data_len + sizeof(size_t)];\n\t\t__int8* data = p + +sizeof(size_t);\n\n\t\tfor (int i = 0; i < data_len; i++)\n\t\t{\n\t\t\tdata[i] = rand();\n\t\t}\n\n\t\tg_callback(senderId, data, data_len);\n\n\t\t// AddRef Ă΂ĂȂƂɌ葦 delete\n\n\t\t// قƂ͂Ԃ񃍃bNKv\n\t\tauto refCount = (size_t*)p;\n\t\tif (*refCount == 0)\n\t\t\tdelete data;\n\t}\n\n\t__declspec(dllexport) void AddRef(void* data)\n\t{\n\t\tauto refCount = (size_t*)((__int8*)data - sizeof(size_t));\n\n\t\t// قƂ͂Ԃ񃍃bNKv\n\t\t*refCount++;\n\t}\n\n\t__declspec(dllexport) void Release(void* data)\n\t{\n\t\tauto refCount = (size_t*)((__int8*)data - sizeof(size_t));\n\n\t\t// قƂ͂Ԃ񃍃bNKv\n\t\tif (*refCount-- == 0)\n\t\t{\n\t\t\tdelete (__int8*)refCount;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Interop/NativeMemory/NativeLib/NativeLib.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <VCProjectVersion>15.0</VCProjectVersion>\n    <ProjectGuid>{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>NativeLib</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(ProjectDir)$(Platform)\\$(Configuration)\\</OutDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(ProjectDir)$(Platform)\\$(Configuration)\\</OutDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;NATIVELIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;NATIVELIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;NATIVELIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;NATIVELIB_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <Text Include=\"ReadMe.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"stdafx.h\" />\n    <ClInclude Include=\"targetver.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\">\n      <CompileAsManaged Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</CompileAsManaged>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </PrecompiledHeader>\n      <CompileAsManaged Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</CompileAsManaged>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </PrecompiledHeader>\n      <CompileAsManaged Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</CompileAsManaged>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n      </PrecompiledHeader>\n      <CompileAsManaged Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</CompileAsManaged>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n      </PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"NativeLib.cpp\" />\n    <ClCompile Include=\"stdafx.cpp\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "Chapters/Interop/NativeMemory/NativeLib/NativeLib.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <Text Include=\"ReadMe.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"stdafx.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"targetver.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"stdafx.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"NativeLib.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dllmain.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "Chapters/Interop/NativeMemory/NativeLib/ReadMe.txt",
    "content": "========================================================================\n    DYNAMIC LINK LIBRARY : NativeLib Project Overview\n========================================================================\n\nAppWizard has created this NativeLib DLL for you.\n\nThis file contains a summary of what you will find in each of the files that\nmake up your NativeLib application.\n\n\nNativeLib.vcxproj\n    This is the main project file for VC++ projects generated using an Application Wizard.\n    It contains information about the version of Visual C++ that generated the file, and\n    information about the platforms, configurations, and project features selected with the\n    Application Wizard.\n\nNativeLib.vcxproj.filters\n    This is the filters file for VC++ projects generated using an Application Wizard. \n    It contains information about the association between the files in your project \n    and the filters. This association is used in the IDE to show grouping of files with\n    similar extensions under a specific node (for e.g. \".cpp\" files are associated with the\n    \"Source Files\" filter).\n\nNativeLib.cpp\n    This is the main DLL source file.\n\n\tWhen created, this DLL does not export any symbols. As a result, it\n\twill not produce a .lib file when it is built. If you wish this project\n\tto be a project dependency of some other project, you will either need to\n\tadd code to export some symbols from the DLL so that an export library\n\twill be produced, or you can set the Ignore Input Library property to Yes\n\ton the General propert page of the Linker folder in the project's Property\n\tPages dialog box.\n\n/////////////////////////////////////////////////////////////////////////////\nOther standard files:\n\nStdAfx.h, StdAfx.cpp\n    These files are used to build a precompiled header (PCH) file\n    named NativeLib.pch and a precompiled types file named StdAfx.obj.\n\n/////////////////////////////////////////////////////////////////////////////\nOther notes:\n\nAppWizard uses \"TODO:\" comments to indicate parts of the source code you\nshould add to or customize.\n\n/////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "Chapters/Interop/NativeMemory/NativeLib/dllmain.cpp",
    "content": "// dllmain.cpp : Defines the entry point for the DLL application.\n#include \"stdafx.h\"\n\nBOOL APIENTRY DllMain( HMODULE hModule,\n                       DWORD  ul_reason_for_call,\n                       LPVOID lpReserved\n\t\t\t\t\t )\n{\n\tswitch (ul_reason_for_call)\n\t{\n\tcase DLL_PROCESS_ATTACH:\n\tcase DLL_THREAD_ATTACH:\n\tcase DLL_THREAD_DETACH:\n\tcase DLL_PROCESS_DETACH:\n\t\tbreak;\n\t}\n\treturn TRUE;\n}\n\n"
  },
  {
    "path": "Chapters/Interop/NativeMemory/NativeLib/stdafx.cpp",
    "content": "// stdafx.cpp : source file that includes just the standard includes\n// NativeLib.pch will be the pre-compiled header\n// stdafx.obj will contain the pre-compiled type information\n\n#include \"stdafx.h\"\n\n// TODO: reference any additional headers you need in STDAFX.H\n// and not in this file\n"
  },
  {
    "path": "Chapters/Interop/NativeMemory/NativeLib/stdafx.h",
    "content": "// stdafx.h : include file for standard system include files,\n// or project specific include files that are used frequently, but\n// are changed infrequently\n//\n\n#pragma once\n\n#include \"targetver.h\"\n\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n// Windows Header Files:\n\n#include <Windows.h>\n#include <random>\n\n// TODO: reference additional headers your program requires here\n"
  },
  {
    "path": "Chapters/Interop/NativeMemory/NativeLib/targetver.h",
    "content": "#pragma once\n\n// Including SDKDDKVer.h defines the highest available Windows platform.\n\n// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and\n// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.\n\n"
  },
  {
    "path": "Chapters/Interop/NativeMemory/NativeMemory.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26430.13\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"NativeLib\", \"NativeLib\\NativeLib.vcxproj\", \"{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ManagedApp\", \"ManagedApp\\ManagedApp.csproj\", \"{FA53B2F5-43E0-4238-A188-C4A1F07764FA}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A} = {2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}\n\tEndProjectSection\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|x64.Build.0 = Debug|x64\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|x86.ActiveCfg = Debug|Win32\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Debug|x86.Build.0 = Debug|Win32\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|x64.ActiveCfg = Release|x64\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|x64.Build.0 = Release|x64\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|x86.ActiveCfg = Release|Win32\n\t\t{2E1BF66B-21CD-4FF6-AAEE-81ABA52CB39A}.Release|x86.Build.0 = Release|Win32\n\t\t{FA53B2F5-43E0-4238-A188-C4A1F07764FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FA53B2F5-43E0-4238-A188-C4A1F07764FA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FA53B2F5-43E0-4238-A188-C4A1F07764FA}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{FA53B2F5-43E0-4238-A188-C4A1F07764FA}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{FA53B2F5-43E0-4238-A188-C4A1F07764FA}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{FA53B2F5-43E0-4238-A188-C4A1F07764FA}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{FA53B2F5-43E0-4238-A188-C4A1F07764FA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FA53B2F5-43E0-4238-A188-C4A1F07764FA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FA53B2F5-43E0-4238-A188-C4A1F07764FA}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{FA53B2F5-43E0-4238-A188-C4A1F07764FA}.Release|x64.Build.0 = Release|Any CPU\n\t\t{FA53B2F5-43E0-4238-A188-C4A1F07764FA}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{FA53B2F5-43E0-4238-A188-C4A1F07764FA}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/ArgList/Program.cs",
    "content": "﻿namespace Arglist\n{\n    using System;\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            X(__arglist(1, \"aaa\", 'x', 1.5)); // 呼び出し側にも __arglist を書く\n        }\n\n        static void X(__arglist) // 仮引数のところに __arglist を書く\n        {\n            // 中身のとりだしには ArgIterator 構造体を使う\n            ArgIterator argumentIterator = new ArgIterator(__arglist);\n            while (argumentIterator.GetRemainingCount() > 0)\n            {\n                object value = null;\n\n                var r = argumentIterator.GetNextArg(); // 可変個引数の1個1個は TypedReference になっている\n                var t = __reftype(r); // TypedReference から、元の型を取得\n\n                // 型で分岐して、__refvalue で値の取り出し\n                if (t == typeof(int)) value = __refvalue(r, int);\n                else if (t == typeof(char)) value = __refvalue(r, char);\n                else if (t == typeof(double)) value = __refvalue(r, double);\n                else value = __refvalue(r, string);\n\n                Console.WriteLine(t.Name + \": \" + value);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/CppReference/CppReference.cpp",
    "content": "#include \"stdafx.h\"\n\n#include \"stdio.h\"\n\nvoid sample()\n{\n    int x = 10;\n    int& r = x; // x ̎QƂ\n\n    r = 99; // Qƌ x \n\n    printf(\"%d\", x); // 99\n}\n\nint _tmain(int argc, _TCHAR* argv[])\n{\n    sample();\n\treturn 0;\n}\n\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/CppReference/CppReference.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{0D12746B-9B23-470B-BCE2-35EF2D463743}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>CppReference</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <Text Include=\"ReadMe.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"stdafx.h\" />\n    <ClInclude Include=\"targetver.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"CppReference.cpp\" />\n    <ClCompile Include=\"stdafx.cpp\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "Chapters/Interop/TypedReference/CppReference/CppReference.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <Text Include=\"ReadMe.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"stdafx.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"targetver.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"stdafx.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"CppReference.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "Chapters/Interop/TypedReference/CppReference/stdafx.cpp",
    "content": "// stdafx.cpp : source file that includes just the standard includes\n// CppReference.pch will be the pre-compiled header\n// stdafx.obj will contain the pre-compiled type information\n\n#include \"stdafx.h\"\n\n// TODO: reference any additional headers you need in STDAFX.H\n// and not in this file\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/CppReference/stdafx.h",
    "content": "// stdafx.h : include file for standard system include files,\n// or project specific include files that are used frequently, but\n// are changed infrequently\n//\n\n#pragma once\n\n#include \"targetver.h\"\n\n#include <stdio.h>\n#include <tchar.h>\n\n\n\n// TODO: reference additional headers your program requires here\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/CppReference/targetver.h",
    "content": "#pragma once\n\n// Including SDKDDKVer.h defines the highest available Windows platform.\n\n// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and\n// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.\n\n#include <SDKDDKVer.h>\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/ImplicitReference/Program.cs",
    "content": "﻿#pragma warning disable 649\n\nnamespace InplicitReference\n{\n    using System;\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            ReferenceParameters();\n            NestedStructs();\n        }\n\n        /// <summary>\n        /// (標準仕様内では)C# で明示的に参照を作れるのは ref/out パラメーターのみ。\n        /// </summary>\n        static void ReferenceParameters()\n        {\n            int x = 10;\n            int y;\n\n            ReferenceParameters(ref x, out y);\n            Console.WriteLine(x); // 99\n            Console.WriteLine(y); // 256\n        }\n\n        static void ReferenceParameters(ref int x, out int y)\n        {\n            Console.WriteLine(x); // 外からわたって来た時点の値。今回の場合10\n            x = 99; // 呼び出し元の側の値も書き換わる\n            y = 256; // 呼び出し元の側の値が書き換わる\n        }\n\n        /// <summary>\n        /// 構造体 = 値型。\n        /// </summary>\n        struct StructThis\n        {\n            public int x;\n            public int Y()\n            {\n                // 値型の this は、参照になってる\n                return this.x * this.x; // この this はメソッド Y に参照が渡されてる\n            }\n        }\n\n        // 構造体の入れ子\n        struct A { public B b; }\n        struct B { public C c; }\n        struct C { public int x; }\n\n        /// <summary>\n        /// 入れ子の奥深くのフィールドの書き換えがちゃんとできるのも、これが参照で帰ってきてるから。\n        /// </summary>\n        static void NestedStructs()\n        {\n            var a = new A();\n            a.b.c.x = 1;\n            Console.WriteLine(a.b.c.x); // ちゃんと x が 1 に書き換わってる\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/InteropArgList/Program.cs",
    "content": "﻿namespace InteropArglist\n{\n    using System.Runtime.InteropServices;\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            printf(\"%d, %s, %c, %f\", __arglist(1, \"aaa\", 'x', 1.5));\n        }\n\n        [DllImport(\"msvcrt\", CallingConvention = CallingConvention.Cdecl)]\n        static extern int printf(string format, __arglist);\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/MakeRef/Program.cs",
    "content": "﻿namespace MakeRef\n{\n    using System;\n\n    /// <summary>\n    /// CppReference.vcxproj のやつと同様のコード。\n    /// </summary>\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            int x = 10;\n            TypedReference r = __makeref(x); // x の参照を作る\n\n            __refvalue(r, int) = 99; // 参照元の x も書き換わる\n\n            Console.WriteLine(x); // 99\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/Program.cs",
    "content": "﻿using System;\n\nnamespace TypedReference\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Console.WriteLine(\"Hello World!\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/Readme.md",
    "content": "http://ufcpp.net/study/csharp/sp_makeref.html pB\n\nC# ̉B@\\A__makeref  __arglist ̃TvB\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/ReferenceUsage/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ReferenceUsage\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            { int    x = 0;   AvoidBoxing.Set1(ref x); Console.WriteLine(x); }\n            { double x = 0;   AvoidBoxing.Set1(ref x); Console.WriteLine(x); }\n            { char   x = '0'; AvoidBoxing.Set1(ref x); Console.WriteLine(x); }\n            { string x = \"0\"; AvoidBoxing.Set1(ref x); Console.WriteLine(x); }\n            { long   x = 0;   AvoidBoxing.Set1(ref x); Console.WriteLine(x); }\n\n            { int    x = 0;   Boxed.Set1(ref x); Console.WriteLine(x); }\n            { double x = 0;   Boxed.Set1(ref x); Console.WriteLine(x); }\n            { char   x = '0'; Boxed.Set1(ref x); Console.WriteLine(x); }\n            { string x = \"0\"; Boxed.Set1(ref x); Console.WriteLine(x); }\n            { long   x = 0;   Boxed.Set1(ref x); Console.WriteLine(x); }\n        }\n    }\n\n    class AvoidBoxing\n    {\n        public static void Set1<T>(ref T value)\n        {\n            if (value is int) __refvalue(__makeref(value), int) = 1;\n            else if (value is double) __refvalue(__makeref(value), double) = 1;\n            else if (value is char  ) __refvalue(__makeref(value), char  ) = '1';\n            else if (value is string) __refvalue(__makeref(value), string) = \"1\";\n            else value = default(T);\n        }\n    }\n\n    class Boxed\n    {\n        public static void Set1<T>(ref T value)\n        {\n            // 型を見て分岐しているのに、結局一度 (T)(object) とキャストしないと行けない\n            // (object)の時点でボックス化発生\n            if (value is int) value = (T)(object)1;\n            else if (value is double) value = (T)(object)1.0;\n            else if (value is char  ) value = (T)(object)'1';\n            else if (value is string) value = (T)(object)\"1\";\n            else value = default(T);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/TypedReference.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>TypedReference.Program</StartupObject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Remove=\"CppReference/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Interop/TypedReference/TypedReference.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22310.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MakeRef\", \"MakeRef\\MakeRef.csproj\", \"{FEE71315-2E15-49F6-AE92-67F17F1F4129}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"CppReference\", \"CppReference\\CppReference.vcxproj\", \"{0D12746B-9B23-470B-BCE2-35EF2D463743}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ImplicitReference\", \"ImplicitReference\\ImplicitReference.csproj\", \"{0C902347-E6BF-490C-B31E-A9036076E8FD}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{384872C6-38DF-419F-B38D-7C9301C2BA9C}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tReadme.txt = Readme.txt\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ArgList\", \"ArgList\\ArgList.csproj\", \"{1827D93A-3096-463C-BF0F-D804B504FE24}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"InteropArgList\", \"InteropArgList\\InteropArgList.csproj\", \"{0C1ADBDE-3BFA-4413-BD89-CAA9CEAF7744}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ReferenceUsage\", \"ReferenceUsage\\ReferenceUsage.csproj\", \"{7133B58F-DC91-4F7D-9FD7-95EDB699723B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|Mixed Platforms = Debug|Mixed Platforms\n\t\tDebug|Win32 = Debug|Win32\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|Mixed Platforms = Release|Mixed Platforms\n\t\tRelease|Win32 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{FEE71315-2E15-49F6-AE92-67F17F1F4129}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FEE71315-2E15-49F6-AE92-67F17F1F4129}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FEE71315-2E15-49F6-AE92-67F17F1F4129}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{FEE71315-2E15-49F6-AE92-67F17F1F4129}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{FEE71315-2E15-49F6-AE92-67F17F1F4129}.Debug|Win32.ActiveCfg = Debug|Any CPU\n\t\t{FEE71315-2E15-49F6-AE92-67F17F1F4129}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FEE71315-2E15-49F6-AE92-67F17F1F4129}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FEE71315-2E15-49F6-AE92-67F17F1F4129}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{FEE71315-2E15-49F6-AE92-67F17F1F4129}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{FEE71315-2E15-49F6-AE92-67F17F1F4129}.Release|Win32.ActiveCfg = Release|Any CPU\n\t\t{0D12746B-9B23-470B-BCE2-35EF2D463743}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{0D12746B-9B23-470B-BCE2-35EF2D463743}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32\n\t\t{0D12746B-9B23-470B-BCE2-35EF2D463743}.Debug|Mixed Platforms.Build.0 = Debug|Win32\n\t\t{0D12746B-9B23-470B-BCE2-35EF2D463743}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{0D12746B-9B23-470B-BCE2-35EF2D463743}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{0D12746B-9B23-470B-BCE2-35EF2D463743}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{0D12746B-9B23-470B-BCE2-35EF2D463743}.Release|Mixed Platforms.ActiveCfg = Release|Win32\n\t\t{0D12746B-9B23-470B-BCE2-35EF2D463743}.Release|Mixed Platforms.Build.0 = Release|Win32\n\t\t{0D12746B-9B23-470B-BCE2-35EF2D463743}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{0D12746B-9B23-470B-BCE2-35EF2D463743}.Release|Win32.Build.0 = Release|Win32\n\t\t{0C902347-E6BF-490C-B31E-A9036076E8FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0C902347-E6BF-490C-B31E-A9036076E8FD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0C902347-E6BF-490C-B31E-A9036076E8FD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{0C902347-E6BF-490C-B31E-A9036076E8FD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{0C902347-E6BF-490C-B31E-A9036076E8FD}.Debug|Win32.ActiveCfg = Debug|Any CPU\n\t\t{0C902347-E6BF-490C-B31E-A9036076E8FD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0C902347-E6BF-490C-B31E-A9036076E8FD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0C902347-E6BF-490C-B31E-A9036076E8FD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{0C902347-E6BF-490C-B31E-A9036076E8FD}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{0C902347-E6BF-490C-B31E-A9036076E8FD}.Release|Win32.ActiveCfg = Release|Any CPU\n\t\t{1827D93A-3096-463C-BF0F-D804B504FE24}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1827D93A-3096-463C-BF0F-D804B504FE24}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1827D93A-3096-463C-BF0F-D804B504FE24}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{1827D93A-3096-463C-BF0F-D804B504FE24}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{1827D93A-3096-463C-BF0F-D804B504FE24}.Debug|Win32.ActiveCfg = Debug|Any CPU\n\t\t{1827D93A-3096-463C-BF0F-D804B504FE24}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1827D93A-3096-463C-BF0F-D804B504FE24}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1827D93A-3096-463C-BF0F-D804B504FE24}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{1827D93A-3096-463C-BF0F-D804B504FE24}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{1827D93A-3096-463C-BF0F-D804B504FE24}.Release|Win32.ActiveCfg = Release|Any CPU\n\t\t{0C1ADBDE-3BFA-4413-BD89-CAA9CEAF7744}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0C1ADBDE-3BFA-4413-BD89-CAA9CEAF7744}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0C1ADBDE-3BFA-4413-BD89-CAA9CEAF7744}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{0C1ADBDE-3BFA-4413-BD89-CAA9CEAF7744}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{0C1ADBDE-3BFA-4413-BD89-CAA9CEAF7744}.Debug|Win32.ActiveCfg = Debug|Any CPU\n\t\t{0C1ADBDE-3BFA-4413-BD89-CAA9CEAF7744}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0C1ADBDE-3BFA-4413-BD89-CAA9CEAF7744}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0C1ADBDE-3BFA-4413-BD89-CAA9CEAF7744}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{0C1ADBDE-3BFA-4413-BD89-CAA9CEAF7744}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{0C1ADBDE-3BFA-4413-BD89-CAA9CEAF7744}.Release|Win32.ActiveCfg = Release|Any CPU\n\t\t{7133B58F-DC91-4F7D-9FD7-95EDB699723B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7133B58F-DC91-4F7D-9FD7-95EDB699723B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7133B58F-DC91-4F7D-9FD7-95EDB699723B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{7133B58F-DC91-4F7D-9FD7-95EDB699723B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{7133B58F-DC91-4F7D-9FD7-95EDB699723B}.Debug|Win32.ActiveCfg = Debug|Any CPU\n\t\t{7133B58F-DC91-4F7D-9FD7-95EDB699723B}.Debug|Win32.Build.0 = Debug|Any CPU\n\t\t{7133B58F-DC91-4F7D-9FD7-95EDB699723B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7133B58F-DC91-4F7D-9FD7-95EDB699723B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7133B58F-DC91-4F7D-9FD7-95EDB699723B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{7133B58F-DC91-4F7D-9FD7-95EDB699723B}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{7133B58F-DC91-4F7D-9FD7-95EDB699723B}.Release|Win32.ActiveCfg = Release|Any CPU\n\t\t{7133B58F-DC91-4F7D-9FD7-95EDB699723B}.Release|Win32.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe/Array.cs",
    "content": "﻿namespace Unsafe.Array\n{\n    class Program\n    {\n        unsafe static void Main()\n        {\n            var array = new[] { 1, 2, 3, 4, 5 };\n\n            // 配列 x をポインター px に代入する。\n            fixed (int* px = array)\n            {\n                // ポインターを介して配列 x の内容を変更。\n                for (int* p = px; p != px + array.Length; ++p)\n                    *p = (*p) * (*p);\n            }\n\n            // 結果出力。\n            for (int i = 0; i < array.Length; ++i)\n                System.Console.Write(\"{0} \", array[i]);\n            // 1 4 9 16 25 と表示される。\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe/CustomFixed.cs",
    "content": "﻿namespace Unsafe.CustomFixed\n{\n    using System.Runtime.CompilerServices;\n\n    // ただの配列のラッパー\n    readonly struct Array<T>\n    {\n        private readonly T[] _array;\n        public Array(int length) => _array = new T[length];\n        public ref T this[int index] => ref _array[index];\n        public int Length => _array.Length;\n\n        // このメソッドがあれば fixed ステートメントを使えるようになる\n#if true\n        public ref T GetPinnableReference() => ref _array[0];\n#else\n        // 本来の配列と挙動を併せたければこう書く\n        public unsafe ref T GetPinnableReference()\n        {\n            var a = _array;\n            if (a.Length == 0) return ref Unsafe.AsRef<T>(null);\n            else return ref a[0];\n        }\n#endif\n    }\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var a = new Array<int>(5);\n\n            unsafe\n            {\n                // fixed (int* p = &a.GetPinnableReference()) に展開される。\n                fixed (int* p = a)\n                {\n                    for (int i = 0; i < 5; i++)\n                        p[i] = i;\n                }\n            }\n\n            for (int i = 0; i < 5; i++)\n                System.Console.WriteLine(a[i]);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe/EmptyArray.cs",
    "content": "﻿namespace Unsafe.EmptyArray\n{\n    using System;\n    using static System.Console;\n\n    class Program\n    {\n        unsafe static void Main()\n        {\n            var array = new int[0]; // 空っぽ\n\n            fixed (int* p = array) WriteLine((ulong)p); // 0\n\n            try\n            {\n                // この書き方だと今度は例外になる。\n                fixed (int* p = &array[0]) WriteLine((ulong)p);\n            }\n            catch (IndexOutOfRangeException)\n            {\n                WriteLine(\"IndexOutOfRangeException\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe/GcTracking.cs",
    "content": "﻿namespace Unsafe.GcTracking\n{\n    using System;\n    using System.Runtime.CompilerServices;\n    using static System.Console;\n\n    // C# の参照型が内部的にどうなっているか試してみるために、フィールド1個だけのクラスを用意。\n    class X\n    {\n        // フィールドが1個だけなので、順序に悩む必要なし。\n        // クラスの場合、フィールドが複数あるとき、並び順はコンパイラーが自由に変えていい仕様になってるので注意。\n        // (StructLayout 属性を付けて制御はできる。)\n        public int Value;\n    }\n\n    unsafe class Program\n    {\n        // 参照型変数が指す先のヒープのアドレスを取得。\n        // Unsafe クラスは、C# では絶対に書けない処理をやってくれる(中身は IL assebler 実装)。\n        // C# の unsafe コード以上に unsafe なことができるやべーやつ。\n        // IL は案外がばがばで、C# コンパイラーのレベルで安全性を保証してることが結構ある。\n        static ulong AsUnmanaged<T>(T r) where T : class => (ulong)Unsafe.As<T, IntPtr>(ref r);\n\n        // 同上、ref が指す先のアドレスを取得。\n        static ulong AsUnmanaged<T>(ref T r) => (ulong)Unsafe.AsPointer(ref r);\n        \n        static void Main()\n        {\n            // GC 誘発用に無駄オブジェクトを無駄に大量生成。\n            void GenerageGarbage()\n            {\n                for (int i = 0; i < 1000000; i++) { var dummy = new object(); }\n            }\n\n            GenerageGarbage();\n\n            var x = new X { Value = 12345678 };\n            ref var r = ref x.Value;\n\n            // 通常ではない手段(Unsafe クラス)を使って、managed ポインターを無理やり unmanaged ポインター化。\n            var addressOfX = AsUnmanaged(x);\n            var addressOfValue = AsUnmanaged(ref r);\n\n            WriteLine((addressOfX, addressOfValue));\n\n            GenerageGarbage();\n            GC.Collect(0, GCCollectionMode.Forced);\n            WriteLine(\"--- ここで GC 発生 ---\");\n\n            // 無理やり数値化した方のアドレスまでは追えないので、当然、前のアドレスのまま。\n            // もう無効なアドレスなので、ここに対して読み書きするとクラッシュ・セキュリティ ホールの原因になる。\n            WriteLine(\"unmanaged \" + (addressOfX, addressOfValue));\n\n            // GC 発生後、アドレスが変わってる。\n            // 大体は前に移動しているはずなので、値が小さくなってる。\n            WriteLine(\"managed   \" + (AsUnmanaged(x), AsUnmanaged(ref r)));\n\n            fixed (int* p = &x.Value)\n            {\n                // fixed している間はどれだけゴミを出そうが x は移動しない。\n                GenerageGarbage();\n                GC.Collect(0, GCCollectionMode.Forced);\n                WriteLine(\"--- ここで GC 発生(fixed) ---\");\n\n                // fixe 直前と変わってないはず。\n                WriteLine(\"managed   \" + (AsUnmanaged(x), AsUnmanaged(ref r)));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe/MutateString.cs",
    "content": "﻿namespace Unsafe.MutateString\n{\n    unsafe class Program\n    {\n        static void Main()\n        {\n            var s = \"abcde\";\n\n            fixed(char* p = s)\n            {\n                for (int i = 0; i < 5; i++)\n                    p[i] = (char)(i + '1');\n            }\n\n            System.Console.WriteLine(s); // 12345\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe/PointerOperators.cs",
    "content": "﻿namespace Unsafe.PointerOperators\n{\n    using System;\n\n    struct Point\n    {\n        public short X;\n        public short Y;\n    }\n\n    class Program\n    {\n        unsafe static void Main()\n        {\n            var p = new Point();\n\n            // アンマネージ型の変数にはポインターを使える\n            // & でアドレス取得(ポインター化)\n            // 型推論(var)も効く\n            var pp = &p;\n\n            // int 型のポインターに無理やり代入\n            // p のある位置に無理やり int の値を書き込み\n            int* pi = (int*)pp;\n            *pi = 0x00010002;\n\n            // -> で構造体のポインターのメンバーにアクセス\n            Console.WriteLine(pp->X); // (*pp).X と同じ意味 = 2\n            Console.WriteLine(pp->Y); // (*pp).Y と同じ意味 = 1\n\n            // byte 型のポインターに無理やり代入\n            byte* pb = (byte*)pp;\n\n            // ポインターには配列と同じように [] が使える\n            Console.WriteLine(pb[0]); // *(pb + 0) と同じ意味 = 2\n            Console.WriteLine(pb[1]); // *(pb + 1) と同じ意味 = 0\n            Console.WriteLine(pb[2]); // *(pb + 2) と同じ意味 = 1\n            Console.WriteLine(pb[3]); // *(pb + 3) と同じ意味 = 0\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe/Program.cs",
    "content": "﻿using System;\n\nnamespace Unsafe\n{\n    class Program\n    {\n        static void Main()\n        {\n            unsafe\n            {\n                int n;\n                int* pn = &n;        // n のアドレスをポインター pn に代入。\n                byte* p = (byte*)pn; // 違う型のポインターに無理やり代入可能。\n\n                *p = 0x78; // n の最初の1バイト目に 0x78 を代入\n                ++p;\n                *p = 0x56; // n の2バイト目に 0x56 を代入\n                ++p;\n                *p = 0x34; // n の3バイト目に 0x34 を代入\n                ++p;\n                *p = 0x12; // n の4バイト目に 0x12 を代入\n\n                Console.Write(\"{0:x}\\n\", n); // n の値を16進数で表示。\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe/RewriteString.cs",
    "content": "﻿namespace Unsafe.RewriteString\n{\nusing System;\n\nclass Program\n{\n    static void Main()\n    {\n        // C# の string は書き換えできないはず\n        var s1 = \"-----\";\n\n        // 参照型なので、同じインスタンスを見てる\n        // 書き換えれないからこそ、インスタンスの共有が安全\n        var s2 = s1;\n\n        // 実際には、C# の string は書き換えれる\n        unsafe\n        {\n            fixed (char* c = s1)\n            {\n                c[2] = 'X';\n            }\n        }\n\n        Console.WriteLine(s1); // --X--\n        Console.WriteLine(s2); // 同じものを見てるので、こちらにも書き換えの影響が出てて --X--\n    }\n}\n}\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe/String.Copy.cs",
    "content": "﻿namespace Unsafe.StringCopy\n{\nusing System;\n\nclass Program\n{\n    static void Main()\n    {\n        // C# の string は書き換えできないはず\n        // 書き換えれないもののコピー作って意味あるの？という疑問。\n        var s = \"-----\";\n\n        // s と同じものを参照\n        var s1 = s;\n\n        // コピーして新しいのを作ったので別の場所を参照\n        var s2 = string.Copy(s);\n\n        // どっちも同じ見た目だし\n        Console.WriteLine(s1); // -----\n        Console.WriteLine(s2); // -----\n\n        // C# の == は中身の比較だし\n        Console.WriteLine(s1 == s2); // true\n\n        // ハッシュ値も一致するし\n        Console.WriteLine(s1.GetHashCode() == s2.GetHashCode()); // true\n\n        // しいて言うなら、ReferenceEquals は不一致\n        Console.WriteLine(ReferenceEquals(s, s1)); // true\n        Console.WriteLine(ReferenceEquals(s, s2)); // false\n\n        // 実際には、C# の string は書き換えれる\n        unsafe\n        {\n            fixed (char* c = s1)\n            {\n                c[2] = 'X';\n            }\n        }\n\n        Console.WriteLine(s1); // --X--: s を書き換えてしまったので、同じ場所を見てる s1 も変わる\n        Console.WriteLine(s2); // -----: こっちは別コピーなので元のまま\n    }\n}\n}\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe/String.cs",
    "content": "﻿namespace Unsafe.String\n{\n    using static System.Console;\n\n    unsafe class Program\n    {\n        static void Main()\n        {\n            var s = \"abcde\";\n            fixed (char* p = s)\n            {\n                // 1行に1文字ずつ a b c d e が表示される\n                for (int i = 0; i < s.Length; i++)\n                    WriteLine(s[i]);\n            }\n\n            // ちなみに、string の場合は空文字列でも有効なアドレスが帰ってくる\n            var empty = \"\";\n            fixed (char* p = empty)\n            {\n                WriteLine((ulong)p);  // 非 0\n                WriteLine((int)p[0]); // 常に '\\0' が入ってる\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe/StringInternal.cs",
    "content": "﻿namespace Unsafe.StringInternal\n{\n    using System;\n    using System.Runtime.CompilerServices;\n    using static System.Console;\n\n    unsafe class Program\n    {\n        static ulong AsUnmanaged<T>(T r) where T : class => (ulong)Unsafe.As<T, IntPtr>(ref r);\n        static ulong AsUnmanaged<T>(ref T r) => (ulong)Unsafe.AsPointer(ref r);\n\n        static void Main()\n        {\n            var s = \"abcde\";\n\n            WriteLine(\"s: \" + AsUnmanaged(s));\n\n            fixed(char* p = s)\n            {\n                WriteLine(\"&s[0]: \" + (ulong)p);\n            }\n\n            WriteLine(\"&s[0] - s: \" + RuntimeHelpers.OffsetToStringData);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe/Unsafe.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <StartupObject>Unsafe.CustomFixed.Program</StartupObject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Interop/Unsafe/Unsafe.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25401.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Unsafe\", \"Unsafe\\Unsafe.csproj\", \"{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F9244ECD-9764-466C-8346-BFC5DDB7AAD9}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Interop/Win32Dll/ReadMe.txt",
    "content": "========================================================================\n    DYNAMIC LINK LIBRARY : Win32Dll Project Overview\n========================================================================\n\nAppWizard has created this Win32Dll DLL for you.\n\nThis file contains a summary of what you will find in each of the files that\nmake up your Win32Dll application.\n\n\nWin32Dll.vcxproj\n    This is the main project file for VC++ projects generated using an Application Wizard.\n    It contains information about the version of Visual C++ that generated the file, and\n    information about the platforms, configurations, and project features selected with the\n    Application Wizard.\n\nWin32Dll.vcxproj.filters\n    This is the filters file for VC++ projects generated using an Application Wizard. \n    It contains information about the association between the files in your project \n    and the filters. This association is used in the IDE to show grouping of files with\n    similar extensions under a specific node (for e.g. \".cpp\" files are associated with the\n    \"Source Files\" filter).\n\nWin32Dll.cpp\n    This is the main DLL source file.\n\n\tWhen created, this DLL does not export any symbols. As a result, it\n\twill not produce a .lib file when it is built. If you wish this project\n\tto be a project dependency of some other project, you will either need to\n\tadd code to export some symbols from the DLL so that an export library\n\twill be produced, or you can set the Ignore Input Library property to Yes\n\ton the General propert page of the Linker folder in the project's Property\n\tPages dialog box.\n\n/////////////////////////////////////////////////////////////////////////////\nOther standard files:\n\nStdAfx.h, StdAfx.cpp\n    These files are used to build a precompiled header (PCH) file\n    named Win32Dll.pch and a precompiled types file named StdAfx.obj.\n\n/////////////////////////////////////////////////////////////////////////////\nOther notes:\n\nAppWizard uses \"TODO:\" comments to indicate parts of the source code you\nshould add to or customize.\n\n/////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "Chapters/Interop/Win32Dll/Win32Dll.cpp",
    "content": "// Win32Dll.cpp : Defines the exported functions for the DLL application.\n//\n\n#include \"stdafx.h\"\n\nextern \"C\"\n{\n\t// UTF-16 nullI[\n\t__declspec(dllexport) void __stdcall FillA16(wchar_t* str)\n\t{\n\t\tfor (auto p = str; *p; p++)\n\t\t{\n\t\t\t*p = L'a';\n\t\t}\n\t}\n\n\t// ANSI nullI[\n\t__declspec(dllexport) void __stdcall FillA8(char* str)\n\t{\n\t\tfor (auto p = str; *p; p++)\n\t\t{\n\t\t\t*p = 'a';\n\t\t}\n\t}\n\n\t__declspec(dllexport) int __stdcall GetValue()\n\t{\n\t\treturn 123;\n\t}\n\n\t__declspec(dllexport) void __stdcall SetValue(UINT16& x)\n\t{\n\t\tx = 0x1234;\n\t}\n\n\tstruct Data\n\t{\n\t\tBYTE A;\n\t\tBYTE B;\n\t\tUINT16 C;\n\t\tUINT32 D;\n\t};\n\n\t__declspec(dllexport) Data __stdcall Shift(Data data)\n\t{\n\t\tUINT64* l = (UINT64*)&data;\n\t\t*l <<= 1;\n\t\treturn data;\n\t}\n\n\ttypedef void(__stdcall* Callback)(void* param, UINT32 value);\n\n\tstatic void* g_param;\n\tstatic Callback g_callback;\n\n\t__declspec(dllexport) void __stdcall SetCallback(void* param, Callback callback)\n\t{\n\t\tg_param = param;\n\t\tg_callback = callback;\n\t}\n\n\t__declspec(dllexport) void __stdcall FireCallback(UINT32 value)\n\t{\n\t\tg_callback(g_param, value);\n\t}\n}\n"
  },
  {
    "path": "Chapters/Interop/Win32Dll/Win32Dll.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{4C367220-4A86-4F8F-94A4-E303A882EC38}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>Win32Dll</RootNamespace>\n    <WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v141</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v142</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"Shared\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup>\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(ProjectDir)bin\\$(Configuration)\\</OutDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;WIN32DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>_DEBUG;_WINDOWS;_USRDLL;WIN32DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;WIN32DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>Use</PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>NDEBUG;_WINDOWS;_USRDLL;WIN32DLL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <Text Include=\"ReadMe.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"stdafx.h\" />\n    <ClInclude Include=\"targetver.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"dllmain.cpp\">\n      <CompileAsManaged Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">false</CompileAsManaged>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n      </PrecompiledHeader>\n      <CompileAsManaged Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">false</CompileAsManaged>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n      </PrecompiledHeader>\n      <CompileAsManaged Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">false</CompileAsManaged>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n      </PrecompiledHeader>\n      <CompileAsManaged Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">false</CompileAsManaged>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n      </PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"stdafx.cpp\">\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">Create</PrecompiledHeader>\n      <PrecompiledHeader Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">Create</PrecompiledHeader>\n    </ClCompile>\n    <ClCompile Include=\"Win32Dll.cpp\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "Chapters/Interop/Win32Dll/Win32Dll.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <Text Include=\"ReadMe.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"stdafx.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"targetver.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"stdafx.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"Win32Dll.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"dllmain.cpp\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "Chapters/Interop/Win32Dll/dllmain.cpp",
    "content": "// dllmain.cpp : Defines the entry point for the DLL application.\n#include \"stdafx.h\"\n\nBOOL APIENTRY DllMain( HMODULE hModule,\n                       DWORD  ul_reason_for_call,\n                       LPVOID lpReserved\n\t\t\t\t\t )\n{\n\tswitch (ul_reason_for_call)\n\t{\n\tcase DLL_PROCESS_ATTACH:\n\tcase DLL_THREAD_ATTACH:\n\tcase DLL_THREAD_DETACH:\n\tcase DLL_PROCESS_DETACH:\n\t\tbreak;\n\t}\n\treturn TRUE;\n}\n"
  },
  {
    "path": "Chapters/Interop/Win32Dll/stdafx.cpp",
    "content": "// stdafx.cpp : source file that includes just the standard includes\n// Win32Dll.pch will be the pre-compiled header\n// stdafx.obj will contain the pre-compiled type information\n\n#include \"stdafx.h\"\n\n// TODO: reference any additional headers you need in STDAFX.H\n// and not in this file\n"
  },
  {
    "path": "Chapters/Interop/Win32Dll/stdafx.h",
    "content": "// stdafx.h : include file for standard system include files,\n// or project specific include files that are used frequently, but\n// are changed infrequently\n//\n\n#pragma once\n\n#include \"targetver.h\"\n\n#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers\n// Windows Header Files:\n#include <windows.h>\n\n\n\n// TODO: reference additional headers your program requires here\n"
  },
  {
    "path": "Chapters/Interop/Win32Dll/targetver.h",
    "content": "#pragma once\n\n// Including SDKDDKVer.h defines the highest available Windows platform.\n\n// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and\n// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.\n\n#include <SDKDDKVer.h>\n"
  },
  {
    "path": "Chapters/MemoryManagement/DefaultValue/ArrayInitialization.cs",
    "content": "﻿using System;\n\nclass ArrayInitialization\n{\n    public static void Run()\n    {\n        const int N = 1024 * 1024;\n        var points = new Vector4[N];\n\n        // 中身が全部 0 なことを確認してみる\n        unsafe\n        {\n            fixed (Vector4* pp = points)\n            {\n                // 無理やり byte 配列扱いして、1 byte ずつ確認\n                var p = (byte*)pp;\n\n                for (int i = 0; i < N * sizeof(Vector4); i++)\n                {\n                    if (p[i] != 0)\n                        Console.WriteLine(\"絶対通らないはず\");\n                }\n            }\n        }\n    }\n}\n\nstruct Vector4\n{\n    public float x;\n    public float y;\n    public float z;\n    public float w;\n\n    /*\n    // C# 6.0 では、引数なしのコンストラクターが定義できるようになるけども、これは配列初期化時には呼ばれない。\n    // 配列初期化時には、コンストラクターで初期化するんじゃなくて機械的に 0 埋め\n    public Vector4()\n    {\n        Console.WriteLine(\"配列初期化では呼ばれない\");\n    }\n    */\n}\n"
  },
  {
    "path": "Chapters/MemoryManagement/DefaultValue/DefaultValue.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/MemoryManagement/DefaultValue/FieldInitialization.cs",
    "content": "﻿#pragma warning disable 649\n\nusing System;\n\nclass FieldInitialization\n{\n    public static void Run()\n    {\n        // 初期化せずにフィールドを読んでみる(規定値が入っている)\n        var a = new DefaultValues();\n        Console.WriteLine(a.i);\n        Console.WriteLine(a.x);\n        Console.WriteLine((int)a.c); // '\\0' (ヌル文字)は表示できないので数値化して表示\n        Console.WriteLine(a.b); // False\n        Console.WriteLine(a.s == null); // null は表示できないので比較で。True になる\n    }\n}\n\nclass DefaultValues\n{\n    public int i;\n    public double x;\n    public char c;\n    public bool b;\n    public string? s;\n}\n"
  },
  {
    "path": "Chapters/MemoryManagement/DefaultValue/Point.cs",
    "content": "﻿namespace DefaultValue\n{\n    // C# 6.0 で、一瞬、構造体にも引数なしのコンストラクターを持てるようにしようという話が出た。\n    // 結局は没に。\n    // 今でも「やりたい」という意思は残っているものの、どうしようもない不具合を抱えてて進めれないみたい。\n    //\n    // 問題は\n    // - 長らく構造体の new T() は default(T) と同じ意味という前提でやってきすぎた\n    // - リフレクションを使うライブラリで、結構な数のものがこの前提で最適化を掛けちゃってて、そういうやつの挙動が壊れる\n    // - というか、.NET Framework 自体、Activator.CreateInstance<T>() がコンストラクターを呼んでくれない挙動になってた\n    // という感じ。\n\n#if 没\n    struct Point\n    {\n        public int X;\n        public int Y;\n\n        // C# 5.0 以前ではコンパイル エラーになる\n        public Point()\n        {\n            X = int.MinValue;\n            Y = int.MinValue;\n        }\n    }\n\n    struct Entry\n    {\n        public int Id = 0;       // C# 5.0 以前ではコンパイル エラーになる\n        public string Name = \"\"; // ここも\n    }\n#endif\n}\n"
  },
  {
    "path": "Chapters/MemoryManagement/DefaultValue/Program.cs",
    "content": "﻿using System;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        FieldInitialization.Run();\n        ArrayInitialization.Run();\n    }\n}\n"
  },
  {
    "path": "Chapters/MemoryManagement/MemoryManagement.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22129.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"DefaultValue\", \"DefaultValue\\DefaultValue.csproj\", \"{012FD17A-1F55-4BB6-B923-BEF210AD83B1}\"\nEndProject\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"UninitializedMemory\", \"UninitializedMemory\\UninitializedMemory.vcxproj\", \"{5846FD63-297A-41FE-BDCF-5E1A44418953}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|Mixed Platforms = Debug|Mixed Platforms\n\t\tDebug|Win32 = Debug|Win32\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|Mixed Platforms = Release|Mixed Platforms\n\t\tRelease|Win32 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Debug|Win32.ActiveCfg = Debug|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{012FD17A-1F55-4BB6-B923-BEF210AD83B1}.Release|Win32.ActiveCfg = Release|Any CPU\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|Any CPU.ActiveCfg = Debug|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|Mixed Platforms.Build.0 = Debug|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|Any CPU.ActiveCfg = Release|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|Mixed Platforms.ActiveCfg = Release|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|Mixed Platforms.Build.0 = Release|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{5846FD63-297A-41FE-BDCF-5E1A44418953}.Release|Win32.Build.0 = Release|Win32\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/MemoryManagement/UninitializedMemory/ReadMe.txt",
    "content": "========================================================================\n    CONSOLE APPLICATION : UninitializedMemory Project Overview\n========================================================================\n\nAppWizard has created this UninitializedMemory application for you.\n\nThis file contains a summary of what you will find in each of the files that\nmake up your UninitializedMemory application.\n\n\nUninitializedMemory.vcxproj\n    This is the main project file for VC++ projects generated using an Application Wizard.\n    It contains information about the version of Visual C++ that generated the file, and\n    information about the platforms, configurations, and project features selected with the\n    Application Wizard.\n\nUninitializedMemory.vcxproj.filters\n    This is the filters file for VC++ projects generated using an Application Wizard. \n    It contains information about the association between the files in your project \n    and the filters. This association is used in the IDE to show grouping of files with\n    similar extensions under a specific node (for e.g. \".cpp\" files are associated with the\n    \"Source Files\" filter).\n\nUninitializedMemory.cpp\n    This is the main application source file.\n\n/////////////////////////////////////////////////////////////////////////////\nOther standard files:\n\nStdAfx.h, StdAfx.cpp\n    These files are used to build a precompiled header (PCH) file\n    named UninitializedMemory.pch and a precompiled types file named StdAfx.obj.\n\n/////////////////////////////////////////////////////////////////////////////\nOther notes:\n\nAppWizard uses \"TODO:\" comments to indicate parts of the source code you\nshould add to or customize.\n\n/////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "Chapters/MemoryManagement/UninitializedMemory/UninitializedMemory.cpp",
    "content": "#include <stdio.h>\n\nvoid main()\n{\n    int* x = new int[1];\n    x[0] = 0xFFFFFFFF;\n    printf(\"%08x\\n\", x[0]);\n\n    int* px = x;\n    delete x;\n    printf(\"%08x\\n\", px[0]);\n\n    int* y = new int[1];\n    printf(\"%08x\\n\", y[0]);\n}\n"
  },
  {
    "path": "Chapters/MemoryManagement/UninitializedMemory/UninitializedMemory.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{5846FD63-297A-41FE-BDCF-5E1A44418953}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>UninitializedMemory</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <PlatformToolset>v140</PlatformToolset>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>NotUsing</PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <SDLCheck>true</SDLCheck>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClCompile Include=\"UninitializedMemory.cpp\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "Chapters/MemoryManagement/UninitializedMemory/UninitializedMemory.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <ClCompile Include=\"UninitializedMemory.cpp\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "Chapters/MemoryManagement/UninitializedMemory/stdafx.cpp",
    "content": "// stdafx.cpp : source file that includes just the standard includes\n// UninitializedMemory.pch will be the pre-compiled header\n// stdafx.obj will contain the pre-compiled type information\n\n#include \"stdafx.h\"\n\n// TODO: reference any additional headers you need in STDAFX.H\n// and not in this file\n"
  },
  {
    "path": "Chapters/MemoryManagement/UninitializedMemory/stdafx.h",
    "content": "// stdafx.h : include file for standard system include files,\n// or project specific include files that are used frequently, but\n// are changed infrequently\n//\n\n#pragma once\n\n#include \"targetver.h\"\n\n#include <stdio.h>\n#include <tchar.h>\n\n\n\n// TODO: reference additional headers your program requires here\n"
  },
  {
    "path": "Chapters/MemoryManagement/UninitializedMemory/targetver.h",
    "content": "#pragma once\n\n// Including SDKDDKVer.h defines the highest available Windows platform.\n\n// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and\n// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.\n\n#include <SDKDDKVer.h>\n"
  },
  {
    "path": "Chapters/Misc/Keywords/Await/async.cs",
    "content": "﻿namespace Async\n{\n    using async = System.Threading.Tasks.Task;\n\n    class Program\n    {\n        // 原理的には C# 4.0 時代にあり得るコード\n        // ちゃんとコンパイル可能\n        // この async は Task クラスのエイリアス\n        static async F()\n        {\n            return async.Delay(1);\n        }\n\n        // ちゃんと、1つ目の async がキーワード、2つ目の async は型名\n        static async async G()\n        {\n            await async.Delay(1);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/Keywords/Await/await.cs",
    "content": "﻿namespace Keywords.Await\n{\n    using System;\n    using System.Threading.Tasks;\n\n    class A\n    {\n        static int X()\n        {\n            var async = 2; // OK\n\n            // 匿名関数の中などはまた別文脈\n            // 匿名関数に async を付けているので、この中では await がキーワード\n            Func<Task<int>> f = async () => { await Task.Delay(3); return async; };\n\n            var await = 5; // OK\n            return await * f().Result;\n        }\n\n#if false\n        static async Task<int> XAsync()\n        {\n            var async = 2;\n            Func<Task<int>> f = async () => { await Task.Delay(3); return async; };\n            var await = 5; // コンパイル エラー。キーワード扱いなので変数名に使えない。\n            return await * await f();\n        }\n#endif\n    }\n}\n\nnamespace Await\n{\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        public struct await { }\n\n#if false\n        static async Task<int> XAsync()\n        {\n            // async が付いたメソッド内では ↑ の await 型は使えない\n            var x = new await(); // コンパイル エラー\n\n            // どうしても使いたかったら @ を付けてエスケープ\n            var y = new @await(); // これならコンパイルできる\n        }\n#endif\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/Keywords/Await/yield.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace Keywords.Await\n{\n    class YieldAndAwait\n    {\n        static IEnumerable<int> Yield()\n        {\n            var yield = 1; // OK\n            yield return yield;\n        }\n\n        static async Task<int> Await()\n        {\n            //var await = 1; // これはコンパイル エラー\n            await Task.Delay(1);\n            return 1;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/Keywords/Keywords.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>Keywords.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Misc/Keywords/NameOf/NameOf.cs",
    "content": "﻿namespace Keywords.NameOf\n{\n    using System;\n\n    class NoMethod\n    {\n        static void F()\n        {\n            // nameof メソッドが存在しないのでこれはキーワード\n            var x = 1;\n            Console.WriteLine(nameof(x)); // x\n        }\n    }\n\n    class SuccessfullyCompiled\n    {\n        static void F()\n        {\n            // nameof メソッドがあるのでそちらが呼ばれてしまう\n            var x = 1;\n            Console.WriteLine(nameof(x)); // abc\n        }\n\n        static string nameof(int n) => \"abc\";\n    }\n\n    class Erroneous\n    {\n        static void F()\n        {\n            // nameof メソッドがある上に、型が合わない\n            // コンパイル エラーになる\n#if false\n            var x = 1;\n            Console.WriteLine(nameof(x));\n#endif\n        }\n\n        static string nameof(string s) => \"\";\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/Keywords/NameOf/UsingStatic.cs",
    "content": "﻿namespace Keywords.NameOf.UsingStatic\n{\n    using System;\n    using static MyExtensions;\n\n    class Program\n    {\n        static void Main()\n        {\n            // 一見、nameof メソッドはなさそうに見えるけども…\n            // using static MyExtensions; のせいで、MyExtensions.nameof が参照される\n            var x = 1;\n            Console.WriteLine(nameof(x)); // abc\n        }\n    }\n\n    static class MyExtensions\n    {\n        public static string nameof(object x) => \"abc\";\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/Keywords/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Keywords\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/Keywords/Var/Variance.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Keywords.Var\n{\n    class Variance\n    {\n        static double Calc(IEnumerable<double> data)\n        {\n            int count = 0;\n            double sum = 0;\n            double sqSum = 0;\n\n            foreach (double x in data)\n            {\n                ++count;\n                sum += x;\n                sqSum += x * x;\n            }\n\n            // 分散(variance)。ローカル変数だし略して var って名前つける人はいる\n            double var = (sum * sum - sqSum) / count;\n            return var;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/Keywords/Var/var.cs",
    "content": "﻿#pragma warning disable 219\n\nnamespace Keywords.Var\n{\n    class Inferred\n    {\n        static void F()\n        {\n            // この場合は型推論で Int 型の変数 var になる\n            var var = 1;\n        }\n    }\n\n    class SuccessfullyCompiled\n    {\n        struct var\n        {\n            public int value;\n            public static implicit operator var(int n) => new var { value = n };\n        }\n\n        static void F()\n        {\n            // この場合は ↑ の var 構造体型の変数 var になる\n            var var = 1;\n        }\n    }\n\n    class Erroneous\n    {\n        struct var { }\n\n        static void F()\n        {\n#if false\n            // この場合は ↑ の var 構造体型になるけども、1 を代入できなくてコンパイル エラー\n            var var = 1;\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/Keywords/Yield/Program.cs",
    "content": "﻿namespace Keywords.Yield\n{\n    using System.Collections.Generic;\n\n    class Program\n    {\n        static IEnumerator<yield> F()\n        {\n            // 「yield return」の2単語で初めてキーワードになる\n            // 青いところだけがキーワード。\n            // 水色が型名、黒が変数名。\n\n            yield yield = 1;\n            yield return yield;\n        }\n\n        struct yield\n        {\n            public int value;\n            public static implicit operator yield(int n) => new yield { value = n };\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/Keywords/Yield/cs1.cs",
    "content": "﻿using System;\n\nnamespace Keywords.Yield\n{\n    class cs1\n    {\n        static void Calc(decimal dividends, decimal price)\n        {\n            // yield には歩留まりとか出来高みたいな意味があって、\n            // こういう変数名を使う人がいてもおかしくはない\n            decimal yield = dividends / price;\n            Console.WriteLine(yield);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/Misc.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28917.182\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Keywords\", \"Keywords\\Keywords.csproj\", \"{F324CA0E-2847-4B65-A84B-0350026F563C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"PatternBased\", \"PatternBased\\PatternBased.csproj\", \"{7C4499EE-A624-4C73-BB20-9BCCA5533748}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F324CA0E-2847-4B65-A84B-0350026F563C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7C4499EE-A624-4C73-BB20-9BCCA5533748}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7C4499EE-A624-4C73-BB20-9BCCA5533748}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7C4499EE-A624-4C73-BB20-9BCCA5533748}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7C4499EE-A624-4C73-BB20-9BCCA5533748}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {7B725DD8-C7AE-4BA2-A753-0490AF1A7A46}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Misc/PatternBased/CollectionInitializer.cs",
    "content": "﻿namespace PatternBased.CollectionInitializer\n{\n    using System;\n    using System.Collections;\n\n    struct Adder : IEnumerable\n    {\n        public IEnumerator GetEnumerator() => throw new NotImplementedException();\n    }\n\n    static class AdderExtensions\n    {\n        public static void Add(this Adder a, int x, int dummy = 0) { }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/PatternBased/DeconstructBenchmark.cs",
    "content": "﻿namespace PatternBased.Deconstruct\n{\n    using BenchmarkDotNet.Attributes;\n    using BenchmarkDotNet.Running;\n\n    interface IDeconstructibleTo2Ints\n    {\n        void Deconstruct(out int x, out int y);\n    }\n\n    struct Point : IDeconstructibleTo2Ints\n    {\n        public int X { get; }\n        public int Y { get; }\n        public Point(int x, int y) => (X, Y) = (x, y);\n        public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);\n    }\n\n    [MemoryDiagnoser]\n    public class DeconstructBenchmark\n    {\n        // Point を直接分解。\n        // 最終的にインライン展開が働いて、単なる p.X + p.Y に展開される(ものすごく高速)。\n        static int Sum1(Point p)\n        {\n            var (x, y) = p;\n            return x + y;\n        }\n\n        // インターフェイスを介して分解。\n        // インライン展開が効かず、ボックス化も起きてるので遅い。\n        static int Sum2(IDeconstructibleTo2Ints p)\n        {\n            var (x, y) = p;\n            return x + y;\n        }\n\n        [Benchmark]\n        public int NoInterafce() => Sum1(new Point(1, 2));\n\n        [Benchmark]\n        public int WithInterafce() => Sum2(new Point(1, 2));\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            BenchmarkRunner.Run<DeconstructBenchmark>();\n            //var b = new DeconstructBenchmark();\n            //b.NoInterafce();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/PatternBased/PatternBased.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>PatternBased.Queryable1.Program</StartupObject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.5\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Misc/PatternBased/Queryable1.cs",
    "content": "﻿namespace PatternBased.Queryable1\n{\n    using System;\n\n    struct Queryable\n    {\n        public Queryable Where(Func<int, bool> f) => this;\n        public Queryable Select(Func<int, int> f) => this;\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var q =\n                from x in new Queryable()\n                where x < 10\n                select x * x;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/PatternBased/Queryable12.cs",
    "content": "﻿namespace PatternBased.Queryable2\n{\n    using System;\n\n    struct Queryable\n    {\n        public Queryable Where(Func<int, bool> f, params int[] dummy) => this;\n    }\n\n    static class QueryableExtensions\n    {\n        public static Queryable Select(this Queryable q, Func<int, int> f, int dummy = 0) => q;\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var q =\n                from x in new Queryable()\n                where x < 10\n                select x * x;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Misc/PatternBased/Using.cs",
    "content": "﻿namespace PatternBased.Using\n{\n    using System;\n\n    struct Disposable\n        // インターふぃえす実装が必須。\n        // 以下の行をコメントアウトするとコンパイル エラーになる。\n        : IDisposable\n    {\n        public void Dispose() { }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            using (var d = new Disposable()) ;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/DefiniteAssignment/DefiniteAssignment.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/DefiniteAssignment/Program.cs",
    "content": "﻿using System;\n\nnamespace DefiniteAssignment\n{\n    class Program\n    {\n#if ERROR\n        static void M1()\n        {\n            string s;\n            // 初期化しないまま s を使ったのでエラー。\n            Console.WriteLine(s.Length);\n        }\n#endif\n        static void M2()\n        {\n            string s;\n            if (true) s = \"abc\";\n            // エラーなし\n            Console.WriteLine(s.Length);\n        }\n\n#if ERROR\n        static void M3()\n        {\n            string s;\n            if (false) s = \"abc\";\n            // エラーあり\n            Console.WriteLine(s.Length);\n        }\n\n        static void M(bool flag)\n        {\n            string s;\n            if (flag) s = \"abc\";\n            // エラーあり\n            Console.WriteLine(s.Length);\n        }\n#endif\n\n        static void M2(bool flag)\n        {\n            string s;\n            if (flag) s = \"abc\";\n            else s = \"def\";\n            // エラーなし\n            Console.WriteLine(s.Length);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/FlowAnalysis/Assingment.cs",
    "content": "﻿using System;\n\nnamespace FlowAnalysis.Assingment\n{\n    class Program\n    {\n        static void Main()\n        {\n            // null 許容で宣言されていても、\n            string? s;\n\n            // ちゃんと有効な値を代入すれば\n            s = \"abc\";\n\n            // 警告は出なくなる。\n            Console.WriteLine(s.Length);\n\n            // 逆に null を代入すると、\n            s = null;\n\n            // それ以降警告が出る。\n            Console.WriteLine(s.Length);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/FlowAnalysis/Attributes.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Diagnostics.CodeAnalysis;\nusing System.IO;\nusing System.Xml.Schema;\n\nnamespace FlowAnalysis.Attributes\n{\n    class Program\n    {\n        static void Main()\n        {\n            //AllowNullAttribute(\"\");\n            //DisallowNullAttribute();\n            //MaybeNullAttribute();\n            NotNullAttribute();\n        }\n\n        private static void AllowNullAttribute(string path)\n        {\n            var t = new StreamWriter(path);\n            Console.WriteLine(t.NewLine.Length);\n            t.NewLine = null;\n        }\n\n        private static void DisallowNullAttribute()\n        {\n            var c = EqualityComparer<string>.Default;\n            c.Equals(\"\", null);\n            var h = c.GetHashCode(null);\n        }\n\n        private static void MaybeNullAttribute()\n        {\n            var array = new[] { \"a\", \"bc\" };\n            var s = Array.Find(array, s => s.Length == 3);\n            Console.WriteLine(s == null);\n        }\n\n        private static void NotNullAttribute()\n        {\n            int[]? array = null;\n            Array.Resize(ref array, 1);\n            Console.WriteLine(array.Length);\n        }\n\n        private static void MaybeNullWhenAttribute(Dictionary<int, string> map)\n        {\n            if (map.TryGetValue(1, out var s)) Console.WriteLine(s.Length);\n            else Console.WriteLine(s.Length);\n        }\n\n        private static void NotNullWhenAttribute(string? s)\n        {\n            if (string.IsNullOrEmpty(s)) Console.WriteLine(s.Length);\n            else Console.WriteLine(s.Length);\n        }\n\n        private static void NotNullIfNotNullAttribute()\n        {\n            var l1 = Path.GetFileName(\"sample.txt\").Length;\n            var l2 = Path.GetFileName(null).Length;\n        }\n\n        private static void DoesNotReturnAttribute(bool flag)\n        {\n            string? s = null;\n            if (flag) s = \"abc\";\n            else Environment.FailFast(\"fail\");\n            Console.WriteLine(s.Length);\n        }\n\n        private static void DoesNotReturnIfAttribute(string? s)\n        {\n            Debug.Assert(s != null);\n            Console.WriteLine(s.Length);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/FlowAnalysis/BclAnnotation.cs",
    "content": "﻿using System;\n\nnamespace FlowAnalysis.BclAnnotation\n{\n    class Program\n    {\n        static void Main()\n        {\n            Warning();\n            NoWarning();\n        }\n\n        private static void Warning()\n        {\n            var p = typeof(string).GetProperty(\"Length\");\n            Console.WriteLine(p.PropertyType);\n        }\n\n        private static void NoWarning()\n        {\n            var p = typeof(string).GetProperty(\"Length\");\n\n            if (p is null) return;\n\n            Console.WriteLine(p.PropertyType);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/FlowAnalysis/Default.cs",
    "content": "﻿using System;\n\nnamespace FlowAnalysis.Default\n{\n    namespace Struct\n    {\n        class Program\n        {\n            struct S { public string Name; }\n            static int M(S s) => s.Name.Length;\n            static void Main() => M(default);\n        }\n    }\n\n    namespace Array\n    {\n        class Program\n        {\n            static void Main()\n            {\n                var array = new string[1];\n                Console.WriteLine(array[0].Length);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/FlowAnalysis/Equality.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace FlowAnalysis.Equality\n{\n    class Program\n    {\n        static void Main()\n        {\n            Equality(\"\", null);\n            Equality(\"\", \"\");\n        }\n\n        private static void Equality(string x, string? y)\n        {\n            if (x == y)\n            {\n                Console.WriteLine(y.Length);\n            }\n            else\n            {\n                Console.WriteLine(y.Length);\n            }\n        }\n\n        private static void SpecialEquality(string x, string? y)\n        {\n            if (EqualityComparer<string>.Default.Equals(x, y))\n            {\n                Console.WriteLine(y.Length);\n            }\n            else\n            {\n                Console.WriteLine(y.Length);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/FlowAnalysis/FlowAnalysis.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <StartupObject>FlowAnalysis.Attributes.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/FlowAnalysis/Forgiving.cs",
    "content": "﻿namespace FlowAnalysis.Forgiving\n{\n\n\n    class Program\n    {\n#nullable enable\n        string NotNull = null!;\n\n        static void Main()\n        {\n            string? s = null;\n\n            var l = s!.Length; // (s!).Length の意味\n            var b = s !is null; // (s!) is null の意味\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/FlowAnalysis/Generics.cs",
    "content": "﻿namespace FlowAnalysis.Generics\n{\n    namespace Struct\n    {\n        class Program\n        {\n            static void M<T>(T? x)\n                where T : struct { }\n\n            static void Main()\n            {\n                M<int>(0);\n#if ERROR\n                M<int?>(0);\n                M<string>(\"\");\n                M<string?>(null);\n#endif\n            }\n        }\n    }\n\n    namespace Class\n    {\n        class Program\n        {\n            static void M<T>(T? x)\n                where T : class\n            { }\n\n            static void Main()\n            {\n#if ERROR\n                M<int>(0);\n                M<int?>(0);\n#endif\n                M<string>(\"\");\n                M<string?>(null);\n            }\n        }\n    }\n\n    namespace NullableClass\n    {\n        class Program\n        {\n            static void M<T>(T x)\n                where T : class?\n            { }\n\n            static void Main()\n            {\n                M<string>(\"\");\n                M<string?>(null);\n            }\n\n#if ERROR\n            static void M1<T>(T? x)\n                where T : class ?\n            { }\n#endif\n        }\n    }\n\n    namespace NotNull\n    {\n        class Program\n        {\n            static void M<T>(T x)\n                where T : notnull\n            { }\n\n            static void Main()\n            {\n                M<int>(0);\n                M<int?>(0);\n                M<string>(\"\");\n                M<string?>(null);\n            }\n\n#if ERROR\n            static void M1<T>(T? x)\n                where T : notnull\n            { }\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/NullPointer/InvalidPointer.cs",
    "content": "﻿namespace NullPointer.InvalidPointer\n{\n    using System;\n    using System.Runtime.CompilerServices;\n\n    class Program\n    {\n        unsafe static void Main()\n        {\n            NullPointer();\n            InvalidPointer();\n            UnsafeString();\n        }\n\n        private static unsafe void UnsafeString()\n        {\n            string s = null;\n\n            byte* p = stackalloc byte[20];\n            *(int*)(p + 8) = 3;\n            *(long*)(p + 12) = 0x0043_0042_0041;\n            Unsafe.As<string, IntPtr>(ref s) = (IntPtr)(void*)p;\n\n            Console.WriteLine(s[0]); // A\n            Console.WriteLine(s[1]); // B\n            Console.WriteLine(s[2]); // C\n        }\n\n        unsafe static void NullPointer()\n        {\n            string s = \"\";\n            Unsafe.As<string, IntPtr>(ref s) = (IntPtr)0;\n            Console.WriteLine(s.Length);\n        }\n\n        unsafe static void InvalidPointer()\n        {\n            string s = \"\";\n            Unsafe.As<string, IntPtr>(ref s) = (IntPtr)123456789;\n            Console.WriteLine(s.Length);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/NullPointer/ManualNullCheck/CallHierarchy.cs",
    "content": "﻿using System;\n\nnamespace NullPointer.ManualNullCheck\n{\n    class CallHierarchy\n    {\n        public void Run() => A();\n\n        void A() => B(null);\n        void B(string s) => C(s);\n        void C(string s) => D(s);\n        void D(string s) => E(s);\n        void E(string s) => F(s);\n        void F(string s) => Console.WriteLine(s.Length);\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/NullPointer/ManualNullCheck/DuplicateNullCheck.cs",
    "content": "﻿using System;\n\nnamespace NullPointer.ManualNullCheck\n{\n    class DuplicateNullCheck\n    {\n        void A(string s)\n        {\n            if (s != null) B(s);\n        }\n\n        void B(string s)\n        {\n            if(s != null)\n                Console.WriteLine(s.Length);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/NullPointer/NullPointer.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/NullableReferenceTypes.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.29209.152\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"NullPointer\", \"NullPointer\\NullPointer.csproj\", \"{BCF308D0-C607-4F0D-9BBF-F1386EA660F9}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"ProjectLevel\", \"ProjectLevel\", \"{769099CF-55C9-4C3D-8E73-1EB561D8BB40}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Disable\", \"ProjectLevel\\Disable\\Disable.csproj\", \"{39C93A4C-50A7-4004-9395-03FAE3CC8BDA}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Enable\", \"ProjectLevel\\Enable\\Enable.csproj\", \"{664219A4-3C97-469A-85D0-DCD76230CB0D}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Annotations\", \"ProjectLevel\\Annotations\\Annotations.csproj\", \"{27CAC10A-7CF4-4493-8CC4-2830C6E1D925}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Warnings\", \"ProjectLevel\\Warnings\\Warnings.csproj\", \"{25D12EC4-A6A1-409F-AF83-921593F6B8D5}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"SourceLevel\", \"SourceLevel\\SourceLevel.csproj\", \"{FE6E7177-5998-442F-9DCC-DB77CAB5345B}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"DefiniteAssignment\", \"DefiniteAssignment\\DefiniteAssignment.csproj\", \"{9E911A9E-C4AA-4713-B173-823C0A414B61}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"FlowAnalysis\", \"FlowAnalysis\\FlowAnalysis.csproj\", \"{21511B76-9D14-47CB-B4BB-D92615C06265}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{BCF308D0-C607-4F0D-9BBF-F1386EA660F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BCF308D0-C607-4F0D-9BBF-F1386EA660F9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BCF308D0-C607-4F0D-9BBF-F1386EA660F9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BCF308D0-C607-4F0D-9BBF-F1386EA660F9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{39C93A4C-50A7-4004-9395-03FAE3CC8BDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{39C93A4C-50A7-4004-9395-03FAE3CC8BDA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{39C93A4C-50A7-4004-9395-03FAE3CC8BDA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{39C93A4C-50A7-4004-9395-03FAE3CC8BDA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{664219A4-3C97-469A-85D0-DCD76230CB0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{664219A4-3C97-469A-85D0-DCD76230CB0D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{664219A4-3C97-469A-85D0-DCD76230CB0D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{664219A4-3C97-469A-85D0-DCD76230CB0D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{27CAC10A-7CF4-4493-8CC4-2830C6E1D925}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{27CAC10A-7CF4-4493-8CC4-2830C6E1D925}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{27CAC10A-7CF4-4493-8CC4-2830C6E1D925}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{27CAC10A-7CF4-4493-8CC4-2830C6E1D925}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{25D12EC4-A6A1-409F-AF83-921593F6B8D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{25D12EC4-A6A1-409F-AF83-921593F6B8D5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{25D12EC4-A6A1-409F-AF83-921593F6B8D5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{25D12EC4-A6A1-409F-AF83-921593F6B8D5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FE6E7177-5998-442F-9DCC-DB77CAB5345B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FE6E7177-5998-442F-9DCC-DB77CAB5345B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FE6E7177-5998-442F-9DCC-DB77CAB5345B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FE6E7177-5998-442F-9DCC-DB77CAB5345B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{9E911A9E-C4AA-4713-B173-823C0A414B61}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9E911A9E-C4AA-4713-B173-823C0A414B61}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9E911A9E-C4AA-4713-B173-823C0A414B61}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9E911A9E-C4AA-4713-B173-823C0A414B61}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{21511B76-9D14-47CB-B4BB-D92615C06265}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{21511B76-9D14-47CB-B4BB-D92615C06265}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{21511B76-9D14-47CB-B4BB-D92615C06265}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{21511B76-9D14-47CB-B4BB-D92615C06265}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{39C93A4C-50A7-4004-9395-03FAE3CC8BDA} = {769099CF-55C9-4C3D-8E73-1EB561D8BB40}\n\t\t{664219A4-3C97-469A-85D0-DCD76230CB0D} = {769099CF-55C9-4C3D-8E73-1EB561D8BB40}\n\t\t{27CAC10A-7CF4-4493-8CC4-2830C6E1D925} = {769099CF-55C9-4C3D-8E73-1EB561D8BB40}\n\t\t{25D12EC4-A6A1-409F-AF83-921593F6B8D5} = {769099CF-55C9-4C3D-8E73-1EB561D8BB40}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {48E40055-EE94-40DC-8BB8-E00F05E5DE18}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/ProjectLevel/Annotations/Annotations.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <Nullable>annotations</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../*.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/ProjectLevel/Disable/Disable.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    \n    <!-- 何もつけないと disable なはずだけど、一応。 -->\n    <Nullable>disable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../*.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/ProjectLevel/Enable/Enable.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../*.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/ProjectLevel/Nullability.cs",
    "content": "﻿class Nullability\n{\n    public void Main()\n    {\n        int.Parse(null);\n        AllowNull(NotNull());\n        DisallowNull(NotNull());\n        AllowNull(MaybeNull());\n        DisallowNull(MaybeNull());\n        AllowNull(FalseNotNull());\n        DisallowNull(FalseNotNull());\n    }\n\n    string NotNull() => \"\";\n    int DisallowNull(string s) => s.Length;\n\n    string? MaybeNull() => null;\n    int? AllowNull(string? s) => s?.Length;\n\n    string FalseNotNull() => null;\n\n    void M(string s)\n    {\n        int.Parse(s);\n\n        string local = null;\n        int.Parse(local);\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/ProjectLevel/Warnings/Warnings.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <Nullable>warnings</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../*.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/SourceLevel/IntParse.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace SourceLevel\n{\n    class IntParse\n    {\n        public static void M()\n        {\n#nullable enable\n            int.Parse(null);\n\n#nullable disable\n            int.Parse(null);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/SourceLevel/Program.cs",
    "content": "﻿using System;\n\npublic class Program\n{\n    static void Main()\n    {\n#nullable enable\n        E1(null); // 警告が出る\n\n#nullable disable\n        E1(null); // 警告が出ない\n    }\n\n#nullable enable\n    // 有効化したのでここでは string で非 null、string? で null 許容。\n    static int E1(string s) => s.Length;\n    static int? E2(string? s) => s?.Length;\n\n#nullable disable\n    // 無効化したので string に null が入っている可能性あり。\n    // string? とは書けない(書くだけで警告になる)。\n    static int D1(string s) => s.Length;\n\n#nullable restore\n    // 1つ前のコンテキストに戻す。\n    // この場合、disable から enable に戻る。\n    static int? R1(string? s) => s?.Length;\n}\n"
  },
  {
    "path": "Chapters/NullableReferenceTypes/SourceLevel/SourceLevel.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Old/ApplyXsl/ApplyXsl.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Xml;\nusing System.Xml.XPath;\nusing System.Xml.Xsl;\nusing System.Text.RegularExpressions;\n\n/// <summary>\n/// 指定したフォルダ内にあるすべての XML ファイルに\n/// XSL スタイルシートを適用して HTML 化した結果を\n/// 元ファイル名の拡張子を xml から html に変えた名前で保存する。\n/// </summary>\nclass XslApplier\n{\n\t/// <summary>\n\t/// アプリケーションのメイン エントリ ポイントです。\n\t/// </summary>\n\t[STAThread]\n\tstatic void Main(string[] args)\n\t{\n\t\tif(args.Length == 0)\n\t\t{\n\t\t\tConsole.Write(\"フォルダ名を指定してください\\n\");\n\t\t}\n\n\t\tApplyXslFiles(args[0]);\n\t}\n\n\t/// <summary>\n\t/// フォルダ内の全ての XML ファイルに XSLT を適用。\n\t/// </summary>\n\tstatic void ApplyXslFiles(string dirName)\n\t{\n\t\tforeach(string subdirName in Directory.GetDirectories(dirName))\n\t\t{\n\t\t\tApplyXslFiles(subdirName);\n\t\t}\n\n\t\tforeach(string fileName in Directory.GetFiles(dirName, \"*.xml\"))\n\t\t{\n\t\t\tApplyXsl(fileName);\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// XML ファイルに XSLT を適用。\n\t/// </summary>\n\tstatic void ApplyXsl(string fileName)\n\t{\n\t\tstring xslName = GetXSlUri(fileName);\n\t\tif(xslName == null)\n\t\t\treturn;\n\t\txslName = Path.GetDirectoryName(fileName) + @\"\\\" + xslName.Replace('/', '\\\\');\n\n\t\tstring htmlName = Path.ChangeExtension(fileName, \".html\");\n\n\t\tConsole.Write(\"xml : {0}\\nxsl : {1}\\nhtml:{2}\\n\\n\", fileName, xslName, htmlName);\n\n\t\tXslTransform xslt = new XslTransform();\n\t\txslt.Load(xslName);\n\n\t\txslt.Transform(fileName, htmlName);\n\t}\n\n\t/// <summary>\n\t/// XML 中の <?xml-stylesheet ?> 処理命令から .xsl ファイルの名前を取り出す。\n\t/// </summary>\n\tstatic string GetXSlUri(string fileName)\n\t{\n\t\tXmlDocument xdoc = new XmlDocument();\n\t\txdoc.Load(fileName);\n\n\t\tRegex regType = new Regex(\"type\\\\s*=\\\\s*\\\"(?<1>[^\\\\\\\"]*)\\\"\");\n\t\tRegex regHref = new Regex(\"href\\\\s*=\\\\s*\\\"(?<1>[^\\\\\\\"]*)\\\"\");\n\n\t\tforeach(XmlNode node in xdoc.ChildNodes)\n\t\t{\n\t\t\tif(\n\t\t\t\tnode.NodeType == XmlNodeType.ProcessingInstruction &&\n\t\t\t\tnode.LocalName == \"xml-stylesheet\")\n\t\t\t{\n\t\t\t\tMatch m = regType.Match(node.Value);\n\t\t\t\tif(m.Success && m.Groups[1].Value == \"text/xsl\")\n\t\t\t\t{\n\t\t\t\t\tm = regHref.Match(node.Value);\n\t\t\t\t\treturn m.Groups[1].Value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/ApplyXsl/readme.txt",
    "content": "//==============================================================================\n// XSL X^CV[g̓Kp\n\nCopyright(C) 2003 Iwanaga Nobuyuki\ne-mail   : iwanaga@ise.eng.osaka-u.ac.jp\nweb page : http://www-ise2.ist.osaka-u.ac.jp/~iwanaga/\n\n//----------------------------------------------------------\n// Tv\n\n- R}hCŃtH_w肷B\n- w肵tH_ɂSĂ XML t@Cɑ΂ XSL ϊB\n  iTutH_̃t@C܂ށj\n- <?xml-stylesheet?> ߒ href [Ŏw肵\n  XSL X^CV[gg XSL ϊsB\n- o̓t@C͌ XML t@C̊gq\n  .xml  .html ɕύX́B\n"
  },
  {
    "path": "Chapters/Old/BitField/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n//\n// アセンブリに関する一般情報は以下の \n// 属性セットを通して制御されます。アセンブリに関連付けられている \n// 情報を変更するには、これらの属性値を変更してください。\n//\n[assembly: AssemblyTitle(\"\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"\")]\n[assembly: AssemblyCopyright(\"\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\t\t\n\n//\n// アセンブリのバージョン情報は、以下の 4 つの属性で構成されます :\n//\n//      メジャー バージョン\n//      マイナ バージョン \n//      ビルド番号\n//      リビジョン\n//\n// 下にあるように、'*' を使って、すべての値を指定するか、 \n// ビルドおよびリビジョン番号を既定値にすることができます :\n\n[assembly: AssemblyVersion(\"1.0.*\")]\n\n//\n// アセンブリに署名するには、使用するキーを指定しなければなりません。 \n// アセンブリ署名に関する詳細については、Microsoft .NET Framework ドキュメントを参照してください。\n//\n// 下記の属性を使って、署名に使うキーを制御します。 \n//\n// メモ : \n//   (*) キーが指定されないと、アセンブリは署名されません。\n//   (*) KeyName は、コンピュータにインストールされている\n//        暗号サービス プロバイダ (CSP) のキーを表します。KeyFile は、\n//       キーを含むファイルです。\n//   (*) KeyFile および KeyName の値が共に指定されている場合は、 \n//       以下の処理が行われます :\n//       (1) KeyName が CSP に見つかった場合、そのキーが使われます。\n//       (2) KeyName が存在せず、KeyFile が存在する場合、 \n//           KeyFile にあるキーが CSP にインストールされ、使われます。\n//   (*) KeyFile を作成するには、sn.exe (厳密な名前) ユーティリティを使ってください。\n//       KeyFile を指定するとき、KeyFile の場所は、\n//       プロジェクト出力 ディレクトリへの相対パスでなければなりません。\n//       パスは、%Project Directory%\\obj\\<configuration> です。たとえば、KeyFile がプロジェクト ディレクトリにある場合、\n//       AssemblyKeyFile 属性を \n//       [assembly: AssemblyKeyFile(\"..\\\\..\\\\mykey.snk\")] として指定します。\n//   (*) 遅延署名は高度なオプションです。\n//       詳細については Microsoft .NET Framework ドキュメントを参照してください。\n//\n[assembly: AssemblyDelaySign(false)]\n[assembly: AssemblyKeyFile(\"\")]\n[assembly: AssemblyKeyName(\"\")]\n"
  },
  {
    "path": "Chapters/Old/BitField/BitField.cs",
    "content": "﻿using System;\n\nnamespace BitField\n{\n\t/// <summary>\n\t/// BitField がらみの例外\n\t/// </summary>\n\tpublic class BitFieldException : System.Exception\n\t{\n\t\t/// <summary>\n\t\t/// デフォルトコンストラクタ。\n\t\t/// </summary>\n\t\tpublic BitFieldException(){}\n\n\t\t/// <summary>\n\t\t/// メッセージ付きコンストラクタ。\n\t\t/// </summary>\n\t\t/// <param name=\"msg\">エラーメッセージ</param>\n\t\tpublic BitFieldException(string msg) : base(msg){}\n\t}//class BitFieldException\n\n\t/// <summary>\n\t/// ビットフィールドクラス。\n\t/// Verilog っぽい操作が可能。\n\t/// 64ビットが限界(仕様です)。\n\t/// </summary>\n\t/// <example>\n\t/// reg [31:0] z;\n\t/// z &lt;= {z[30:1], z[31]};\n\t/// ↓\n\t/// BitField z = BitField.Create(31, 0);\n\t/// z.Assign(BitField.Concat(z[30, 1], z[31])); \n\t/// </example>\n\t/// <example>\n\t/// wire [3:0] a;\n\t/// assign a = 4'hA;\n\t/// ↓\n\t/// BitField a = BitField.Create(3, 0);\n\t/// a.Assign(0xA);\n\t/// </example>\n\tabstract class BitField\n\t{\n\t\t/// <summary>\n\t\t/// MSB が m、LSB が l のビットフィールドを作成。\n\t\t/// verilog の <c>wire [m:l] z;</c> に相当。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <returns>MSB が m、LSB が l のビットフィールド</returns>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// m &lt; l のとき発生。\n\t\t/// </exception>\n\t\tpublic static BitField Create(int m, int l)\n\t\t{\n\t\t\treturn new BitFieldImmediate(m, l);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// MSB が m、LSB が l のビットフィールドを作成。\n\t\t/// verilog の <c>wire [m:l] z;</c> に相当。\n\t\t/// val で値を初期化する。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <param name=\"val\">初期値</param>\n\t\t/// <returns>MSB が m、LSB が l、値が val のビットフィールド</returns>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// m &lt; l のとき発生。\n\t\t/// </exception>\n\t\tpublic static BitField Create(int m, int l, ulong val)\n\t\t{\n\t\t\treturn new BitFieldImmediate(m, l, val);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 1 びっとのビットフィールドを作成。\n\t\t/// </summary>\n\t\t/// <param name=\"b\">ビットの真理値</param>\n\t\t/// <returns>1ビットのビットフィールド</returns>\n\t\tpublic static BitField Create(bool b)\n\t\t{\n\t\t\treturn new BitFieldImmediate(0, 0, b ? 1UL : 0UL);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 格納されている値を ulong 化して返す。\n\t\t/// </summary>\n\t\t/// <returns>格納されている値</returns>\n\t\tinternal abstract ulong GetValue();\n\n\t\t/// <summary>\n\t\t/// m～l ビット目に格納されている値を ulong 化して返す。\n\t\t/// verilog の <c>z[m:l]</c> に相当。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <returns>格納されている値</returns>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// m &lt; l のとき発生。\n\t\t/// </exception>\n\t\tinternal abstract ulong GetValue(int m, int l);\n\n\t\t/// <summary>\n\t\t/// 値を割り当てる。\n\t\t/// </summary>\n\t\t/// <param name=\"val\">割り当てたい値(ulong)</param>\n\t\tpublic void Assign(ulong val)\n\t\t{\n\t\t\tBitField tmp = BitField.Create(this.Msb, this.Lsb, val);\n\t\t\tthis.Assign(tmp);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 値を割り当てる。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">割り当てたい値の入ったビットフィールド。</param>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// this.Width != a.Width のとき発生。\n\t\t/// </exception>\n\t\tpublic abstract void Assign(BitField a);\n\n\t\t/// <summary>\n\t\t/// m～l ビット目に値を割り当てる。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <param name=\"a\">割り当てたい値の入ったビットフィールド</param>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// this.Sub(m, l).Width != a.Width のとき発生。\n\t\t/// </exception>\n\t\tpublic abstract void Assign(int m, int l, BitField a);\n\n\t\t/// <summary>\n\t\t/// ビット幅。\n\t\t/// </summary>\n\t\tpublic int Width\n\t\t{\n\t\t\tget{return this.Msb - this.Lsb + 1;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// MSBを取得。\n\t\t/// </summary>\n\t\tpublic abstract int Msb\n\t\t{\n\t\t\tget;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// LSBを取得。\n\t\t/// </summary>\n\t\tpublic abstract int Lsb\n\t\t{\n\t\t\tget;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// i ビット目の値を読み書き。\n\t\t/// </summary>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// i が範囲外のとき発生。\n\t\t/// </exception>\n\t\tpublic BitField this[int i]\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.Assign(i, i, value);\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.Sub(i);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// m～l ビット目の値を読み書き。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// m, l  が範囲外のときと m &lt; l のとき発生。\n\t\t/// </exception>\n\t\tpublic BitField this[int m, int l]\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.Assign(m, l, value);\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.Sub(m, l);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 格納されている値を ulong 化して返す。\n\t\t/// </summary>\n\t\tpublic ulong Value\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn GetValue();\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// i ビット目のみを切り出す。\n\t\t/// verilog の <c>z[i]</c> に相当。\n\t\t/// <c>z.Sub(i)</c> を書き換えると <c>z</c> そのものも書き換えられる。\n\t\t/// </summary>\n\t\t/// <param name=\"i\">切り出したいビットのインデックス</param>\n\t\t/// <returns>切り出されたビットフィールド</returns>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// i が範囲外のとき発生。\n\t\t/// </exception>\n\t\tinternal BitField Sub(int i)\n\t\t{\n\t\t\treturn Sub(i, i);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// m～l ビット目のみを切り出す。\n\t\t/// verilog の <c>z[m:l]</c> に相当。\n\t\t/// <c>z.Sub(m, l)</c> を書き換えると <c>z</c> そのものも書き換えられる。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <returns>切り出されたビットフィールド</returns>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// m, l  が範囲外のときと m &lt; l のとき発生。\n\t\t/// </exception>\n\t\tinternal abstract BitField Sub(int m, int l);\n\n\t\t/// <summary>\n\t\t/// 2つのビットフィールドを結合する。\n\t\t/// verilog の <c>{x, y, z}</c> に相当。\n\t\t/// いくつでもつなげられる。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">つなげたいビットフィールド</param>\n\t\t/// <returns>つながったビットフィールド</returns>\n\t\tstatic public BitField Concat(params BitField[] a)\n\t\t{\n\t\t\tulong val = 0L;\n\t\t\tint width = 0;\n\n\t\t\tforeach(BitField bf in a)\n\t\t\t{\n\t\t\t\twidth += bf.Width;\n\t\t\t\tval <<= bf.Width;\n\t\t\t\tval |= bf.Value;\n\t\t\t}\n\t\t\treturn new BitFieldImmediate(width - 1, 0, val);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 各ビットに対して AND 演算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド1</param>\n\t\t/// <param name=\"b\">オペランド2</param>\n\t\t/// <returns>計算結果</returns>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// a.Width != b.Width のとき発生。\n\t\t/// </exception>\n\t\tstatic public BitField operator& (BitField a, BitField b)\n\t\t{\n\t\t\tif(a.Width != b.Width)\n\t\t\t\tthrow new BitFieldException(\"width not match\");\n\n\t\t\tulong val = a.Value & b.Value;\n\t\t\treturn new BitFieldImmediate(a.Msb, a.Lsb, val);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 各ビットに対して OR 演算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド1</param>\n\t\t/// <param name=\"b\">オペランド2</param>\n\t\t/// <returns>計算結果</returns>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// a.Width != b.Width のとき発生。\n\t\t/// </exception>\n\t\tstatic public BitField operator| (BitField a, BitField b)\n\t\t{\n\t\t\tif(a.Width != b.Width)\n\t\t\t\tthrow new BitFieldException(\"width not match\");\n\n\t\t\tulong val = a.Value | b.Value;\n\t\t\treturn new BitFieldImmediate(a.Msb, a.Lsb, val);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 各ビットに対して XOR 演算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド1</param>\n\t\t/// <param name=\"b\">オペランド2</param>\n\t\t/// <returns>計算結果</returns>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// a.Width != b.Width のとき発生。\n\t\t/// </exception>\n\t\tstatic public BitField operator^ (BitField a, BitField b)\n\t\t{\n\t\t\tif(a.Width != b.Width)\n\t\t\t\tthrow new BitFieldException(\"width not match\");\n\n\t\t\tulong val = a.Value ^ b.Value;\n\t\t\treturn new BitFieldImmediate(a.Msb, a.Lsb, val);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 加算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド1</param>\n\t\t/// <param name=\"b\">オペランド2</param>\n\t\t/// <returns>計算結果</returns>\n\t\tstatic public BitField operator+ (BitField a, BitField b)\n\t\t{\n\t\t\tif(a.Width != b.Width)\n\t\t\t\tthrow new BitFieldException(\"width not match\");\n\n\t\t\tulong val = a.Value + b.Value;\n\t\t\treturn new BitFieldImmediate(a.Msb, a.Lsb, val);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 減算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド1</param>\n\t\t/// <param name=\"b\">オペランド2</param>\n\t\t/// <returns>計算結果</returns>\n\t\tstatic public BitField operator- (BitField a, BitField b)\n\t\t{\n\t\t\tif(a.Width != b.Width)\n\t\t\t\tthrow new BitFieldException(\"width not match\");\n\n\t\t\tulong val = a.Value - b.Value;\n\t\t\treturn new BitFieldImmediate(a.Msb, a.Lsb, val);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 符号反転。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド</param>\n\t\t/// <returns>計算結果</returns>\n\t\tstatic public BitField operator- (BitField a)\n\t\t{//! Max\n\t\t\tulong val = ~a.Value + 1;\n\t\t\treturn new BitFieldImmediate(a.Msb, a.Lsb, val);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 補数。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド</param>\n\t\t/// <returns>計算結果</returns>\n\t\tstatic public BitField operator~ (BitField a)\n\t\t{//! Max\n\t\t\tulong val = ~a.Value;\n\t\t\treturn new BitFieldImmediate(a.Msb, a.Lsb, val);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ブール値からビットフィールドに変換\n\t\t/// </summary>\n\t\t/// <param name=\"b\">ビットフィールドの真理値</param>\n\t\t/// <returns>ビットフィールド</returns>\n\t\tstatic public implicit operator BitField(bool b)\n\t\t{\n\t\t\treturn BitField.Create(b);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ビットフィールドからブール値に変換\n\t\t/// </summary>\n\t\t/// <param name=\"bf\">ビットフィールド</param>\n\t\t/// <returns>ビットフィールドの真偽</returns>\n\t\tstatic public implicit operator bool(BitField bf)\n\t\t{\n\t\t\treturn bf.Value != 0;\n\t\t}\n\n\t\tstatic public bool operator true(BitField bf)\n\t\t{\n\t\t\treturn bf.Value != 0;\n\t\t}\n\n\t\tstatic public bool operator false(BitField bf)\n\t\t{\n\t\t\treturn bf.Value == 0;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 文字列化。\n\t\t/// 0 と 1 の羅列。\n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic override string ToString()\n\t\t{\n\t\t\tstring str = \"\";\n\n\t\t\tfor(int i=this.Msb; i>=this.Lsb; --i)\n\t\t\t{\n\t\t\t\tstr += this[i] ? \"1\" : \"0\";\n\t\t\t}\n\n\t\t\treturn str;\n\t\t}\n\t}//class BitField\n\n\t/// <summary>\n\t/// 値を直接格納しているビットフィールド。\n\t/// 普通に <c>BitFiled.Create()</c> で BitField を作るとこいつができる。\n\t/// </summary>\n\tinternal class BitFieldImmediate : BitField\n\t{\n\t\tint msb; // MSB\n\t\tint lsb; // LSB\n\t\tulong n; // 値\n\n\t\t/// <summary>\n\t\t/// MSB が m、 LSB が l のビットフィールドを作成。\n\t\t/// </summary>\n\t\t/// <param name=\"msb\">MSB</param>\n\t\t/// <param name=\"lsb\">LSB</param>\n\t\tpublic BitFieldImmediate(int msb, int lsb) : this(msb, lsb, 0){}\n\n\t\t/// <summary>\n\t\t/// MSB が m、 LSB が l のビットフィールドを作成。\n\t\t/// 値の初期化も行う。\n\t\t/// </summary>\n\t\t/// <param name=\"msb\">MSB</param>\n\t\t/// <param name=\"lsb\">LSB</param>\n\t\t/// <param name=\"n\">初期値</param>\n\t\tpublic BitFieldImmediate(int msb, int lsb, ulong n)\n\t\t{\n\t\t\tif(this.msb < this.lsb)\n\t\t\t{\n\t\t\t\tthrow new BitFieldException(\"msb must be greater than lsb\");\n\t\t\t}\n\n\t\t\tthis.msb = msb;\n\t\t\tthis.lsb = lsb;\n\t\t\tthis.n = n << lsb;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 格納されている値を ulong 化して返す。\n\t\t/// </summary>\n\t\t/// <returns>格納されている値</returns>\n\t\tinternal override ulong GetValue()\n\t\t{\n\t\t\treturn (this.n & this.GetMask(this.msb, this.lsb)) >> this.lsb;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// m～l ビット目に格納されている値を ulong 化して返す。\n\t\t/// verilog の <c>z[m:l]</c> に相当。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <returns>格納されている値</returns>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// m &lt; l のとき発生。\n\t\t/// </exception>\n\t\tinternal override ulong GetValue(int m, int l)\n\t\t{\n\t\t\tif(m < l || this.msb < m || this.lsb > l)\n\t\t\t\tthrow new BitFieldException(\"illegal range\");\n\n\t\t\treturn (this.n & this.GetMask(m, l)) >> l;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 値を割り当てる。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">割り当てたい値の入ったビットフィールド。</param>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// this.Width != a.Width のとき発生。\n\t\t/// </exception>\n\t\tpublic override void Assign(BitField a)\n\t\t{\n\t\t\tif(a.Width != this.Width)\n\t\t\t\tthrow new BitFieldException(\"width don't match\");\n\n\t\t\tulong val = a.Value;\n\t\t\tthis.n = val << this.lsb;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// m～l ビット目に値を割り当てる。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <param name=\"a\">割り当てたい値の入ったビットフィールド</param>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// this.Sub(m, l).Width != a.Width のとき発生。\n\t\t/// </exception>\n\t\tpublic override void Assign(int m, int l, BitField a)\n\t\t{\n\t\t\tif(a.Width != m-l+1)\n\t\t\t\tthrow new BitFieldException(\"width don't match\");\n\n\t\t\tif(m < l || this.msb < m || this.lsb > l)\n\t\t\t\tthrow new BitFieldException(\"illegal range\");\n\n\t\t\tulong val = a.Value;\n\t\t\tulong mask = this.GetMask(m, l);\n\t\t\tval <<= l;\n\t\t\tval &= mask;\n\n\t\t\tthis.n = val | (this.n & ~mask);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// MSBを取得。\n\t\t/// </summary>\n\t\tpublic override int Msb\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.msb;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// LSBを取得。\n\t\t/// </summary>\n\t\tpublic override int Lsb\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.lsb;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// m～l ビット目のみを切り出す。\n\t\t/// verilog の <c>z[m:l]</c> に相当。\n\t\t/// <c>z.Sub(m, l)</c> を書き換えると <c>z</c> そのものも書き換えられる。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <returns>切り出されたビットフィールド</returns>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// m, l  が範囲外のときと m &lt; l のとき発生。\n\t\t/// </exception>\n\t\tinternal override BitField Sub(int m, int l)\n\t\t{\n\t\t\tif(m < l || this.msb < m || this.lsb > l)\n\t\t\t\tthrow new BitFieldException(\"illegal range\");\n\t\t\t\n\t\t\treturn new BitFieldSub(m, l, this);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// m～l ビット目のみ 1 のマスクを生成。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <returns>マスク</returns>\n\t\tprivate ulong GetMask(int m, int l)\n\t\t{\n\t\t\tulong mask = 0UL;\n\n\t\t\tfor(int i=l; i<=m; ++i)\n\t\t\t\tmask |= 1UL << i;\n\n\t\t\treturn mask;\n\t\t}\n\t}//class BitFieldImmediate\n\n\t/// <summary>\n\t/// <c>BitField.Sub</c> で取り出す部分ビットフィールド。\n\t/// </summary>\n\tinternal class BitFieldSub : BitField\n\t{\n\t\tint msb;\n\t\tint lsb;\n\t\tBitField bf;\n\n\t\t/// <summary>\n\t\t/// bf の msb～lsb 目。\n\t\t/// </summary>\n\t\t/// <param name=\"msb\">MSB</param>\n\t\t/// <param name=\"lsb\">LSB</param>\n\t\t/// <param name=\"bf\">元となるビットフィールド</param>\n\t\tpublic BitFieldSub(int msb, int lsb, BitField bf)\n\t\t{\n\t\t\tthis.msb = msb;\n\t\t\tthis.lsb = lsb;\n\t\t\tthis.bf = bf;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 格納されている値を ulong 化して返す。\n\t\t/// </summary>\n\t\t/// <returns>格納されている値</returns>\n\t\tinternal override ulong GetValue()\n\t\t{\n\t\t\treturn this.bf.GetValue(this.msb, this.lsb);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// m～l ビット目に格納されている値を ulong 化して返す。\n\t\t/// verilog の <c>z[m:l]</c> に相当。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <returns>格納されている値</returns>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// m &lt; l のとき発生。\n\t\t/// </exception>\n\t\tinternal override ulong GetValue(int m, int l)\n\t\t{\n\t\t\tif(m < l || this.msb < m || this.lsb > l)\n\t\t\t\tthrow new BitFieldException(\"illegal range\");\n\n\t\t\treturn this.bf.GetValue(m, l);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 値を割り当てる。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">割り当てたい値の入ったビットフィールド。</param>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// this.Width != a.Width のとき発生。\n\t\t/// </exception>\n\t\tpublic override void Assign(BitField a)\n\t\t{\n\t\t\tif(a.Width != this.Width)\n\t\t\t\tthrow new BitFieldException(\"width don't match\");\n\n\t\t\tthis.bf.Assign(this.msb, this.lsb, a);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// m～l ビット目に値を割り当てる。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <param name=\"a\">割り当てたい値の入ったビットフィールド</param>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// this.Sub(m, l).Width != a.Width のとき発生。\n\t\t/// </exception>\n\t\tpublic override void Assign(int m, int l, BitField a)\n\t\t{\n\t\t\tif(a.Width != m-l+1)\n\t\t\t\tthrow new BitFieldException(\"width don't match\");\n\n\t\t\tif(m < l || this.msb < m || this.lsb > l)\n\t\t\t\tthrow new BitFieldException(\"illegal range\");\n\n\t\t\tthis.bf.Assign(m, l, a);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// MSBを取得。\n\t\t/// </summary>\n\t\tpublic override int Msb\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.msb;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// LSBを取得。\n\t\t/// </summary>\n\t\tpublic override int Lsb\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.lsb;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// m～l ビット目のみを切り出す。\n\t\t/// verilog の <c>z[m:l]</c> に相当。\n\t\t/// <c>z.Sub(m, l)</c> を書き換えると <c>z</c> そのものも書き換えられる。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">MSB</param>\n\t\t/// <param name=\"l\">LSB</param>\n\t\t/// <returns>切り出されたビットフィールド</returns>\n\t\t/// <exception cref=\"BitFieldException\">\n\t\t/// m, l  が範囲外のときと m &lt; l のとき発生。\n\t\t/// </exception>\n\t\tinternal override BitField Sub(int m, int l)\n\t\t{\n\t\t\tif(m < l || this.msb < m || this.lsb > l)\n\t\t\t\tthrow new BitFieldException(\"illegal range\");\n\t\t\t\n\t\t\treturn new BitFieldSub(m, l, this);\n\t\t}\n\t}//class BitFieldSub\n}//namespace BitField\n"
  },
  {
    "path": "Chapters/Old/BitField/BitField.csproj",
    "content": "<VisualStudioProject>\n    <CSHARP\n        ProjectType = \"Local\"\n        ProductVersion = \"7.0.9466\"\n        SchemaVersion = \"1.0\"\n        ProjectGuid = \"{57195281-6BB6-47EA-AA8D-4F4C63E846C6}\"\n    >\n        <Build>\n            <Settings\n                ApplicationIcon = \"App.ico\"\n                AssemblyKeyContainerName = \"\"\n                AssemblyName = \"BitField\"\n                AssemblyOriginatorKeyFile = \"\"\n                DefaultClientScript = \"JScript\"\n                DefaultHTMLPageLayout = \"Grid\"\n                DefaultTargetSchema = \"IE50\"\n                DelaySign = \"false\"\n                OutputType = \"Exe\"\n                RootNamespace = \"BitField\"\n                StartupObject = \"\"\n            >\n                <Config\n                    Name = \"Debug\"\n                    AllowUnsafeBlocks = \"false\"\n                    BaseAddress = \"285212672\"\n                    CheckForOverflowUnderflow = \"false\"\n                    ConfigurationOverrideFile = \"\"\n                    DefineConstants = \"DEBUG;TRACE\"\n                    DocumentationFile = \"BitField.xml\"\n                    DebugSymbols = \"true\"\n                    FileAlignment = \"4096\"\n                    IncrementalBuild = \"true\"\n                    Optimize = \"false\"\n                    OutputPath = \"bin\\Debug\\\"\n                    RegisterForComInterop = \"false\"\n                    RemoveIntegerChecks = \"false\"\n                    TreatWarningsAsErrors = \"false\"\n                    WarningLevel = \"4\"\n                />\n                <Config\n                    Name = \"Release\"\n                    AllowUnsafeBlocks = \"false\"\n                    BaseAddress = \"285212672\"\n                    CheckForOverflowUnderflow = \"false\"\n                    ConfigurationOverrideFile = \"\"\n                    DefineConstants = \"TRACE\"\n                    DocumentationFile = \"\"\n                    DebugSymbols = \"false\"\n                    FileAlignment = \"4096\"\n                    IncrementalBuild = \"false\"\n                    Optimize = \"true\"\n                    OutputPath = \"bin\\Release\\\"\n                    RegisterForComInterop = \"false\"\n                    RemoveIntegerChecks = \"false\"\n                    TreatWarningsAsErrors = \"false\"\n                    WarningLevel = \"4\"\n                />\n            </Settings>\n            <References>\n                <Reference\n                    Name = \"System\"\n                    AssemblyName = \"System\"\n                    HintPath = \"..\\..\\..\\..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.dll\"\n                />\n                <Reference\n                    Name = \"System.Data\"\n                    AssemblyName = \"System.Data\"\n                    HintPath = \"..\\..\\..\\..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.Data.dll\"\n                />\n                <Reference\n                    Name = \"System.XML\"\n                    AssemblyName = \"System.Xml\"\n                    HintPath = \"..\\..\\..\\..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.XML.dll\"\n                />\n            </References>\n        </Build>\n        <Files>\n            <Include>\n                <File\n                    RelPath = \"App.ico\"\n                    BuildAction = \"Content\"\n                />\n                <File\n                    RelPath = \"AssemblyInfo.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"BitField.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"SampleLogic.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"test.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n            </Include>\n        </Files>\n    </CSHARP>\n</VisualStudioProject>\n\n"
  },
  {
    "path": "Chapters/Old/BitField/BitField.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 7.00\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"BitField\", \"BitField.csproj\", \"{57195281-6BB6-47EA-AA8D-4F4C63E846C6}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfiguration) = preSolution\n\t\tConfigName.0 = Debug\n\t\tConfigName.1 = Release\n\tEndGlobalSection\n\tGlobalSection(ProjectDependencies) = postSolution\n\tEndGlobalSection\n\tGlobalSection(ProjectConfiguration) = postSolution\n\t\t{57195281-6BB6-47EA-AA8D-4F4C63E846C6}.Debug.ActiveCfg = Debug|.NET\n\t\t{57195281-6BB6-47EA-AA8D-4F4C63E846C6}.Debug.Build.0 = Debug|.NET\n\t\t{57195281-6BB6-47EA-AA8D-4F4C63E846C6}.Release.ActiveCfg = Release|.NET\n\t\t{57195281-6BB6-47EA-AA8D-4F4C63E846C6}.Release.Build.0 = Release|.NET\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityAddIns) = postSolution\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Old/BitField/BitField.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>BitField</name>\n    </assembly>\n    <members>\n        <member name=\"T:BitField.BitFieldException\">\n            <summary>\n            BitField がらみの例外\n            </summary>\n        </member>\n        <member name=\"M:BitField.BitFieldException.#ctor\">\n            <summary>\n            デフォルトコンストラクタ。\n            </summary>\n        </member>\n        <member name=\"M:BitField.BitFieldException.#ctor(System.String)\">\n            <summary>\n            メッセージ付きコンストラクタ。\n            </summary>\n            <param name=\"msg\">エラーメッセージ</param>\n        </member>\n        <member name=\"T:BitField.BitField\">\n            <summary>\n            ビットフィールドクラス。\n            Verilog っぽい操作が可能。\n            64ビットが限界(仕様です)。\n            </summary>\n            <example>\n            reg [31:0] z;\n            z &lt;= {z[30:1], z[31]};\n            ↓\n            BitField z = BitField.Create(31, 0);\n            z.Assign(BitField.Concat(z[30, 1], z[31])); \n            </example>\n            <example>\n            wire [3:0] a;\n            assign a = 4'hA;\n            ↓\n            BitField a = BitField.Create(3, 0);\n            a.Assign(0xA);\n            </example>\n        </member>\n        <member name=\"M:BitField.BitField.Create(System.Int32,System.Int32)\">\n            <summary>\n            MSB が m、LSB が l のビットフィールドを作成。\n            verilog の <c>wire [m:l] z;</c> に相当。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <returns>MSB が m、LSB が l のビットフィールド</returns>\n            <exception cref=\"T:BitField.BitFieldException\">\n            m &lt; l のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitField.Create(System.Int32,System.Int32,System.UInt64)\">\n            <summary>\n            MSB が m、LSB が l のビットフィールドを作成。\n            verilog の <c>wire [m:l] z;</c> に相当。\n            val で値を初期化する。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <param name=\"val\">初期値</param>\n            <returns>MSB が m、LSB が l、値が val のビットフィールド</returns>\n            <exception cref=\"T:BitField.BitFieldException\">\n            m &lt; l のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitField.Create(System.Boolean)\">\n            <summary>\n            1 びっとのビットフィールドを作成。\n            </summary>\n            <param name=\"b\">ビットの真理値</param>\n            <returns>1ビットのビットフィールド</returns>\n        </member>\n        <member name=\"M:BitField.BitField.GetValue\">\n            <summary>\n            格納されている値を ulong 化して返す。\n            </summary>\n            <returns>格納されている値</returns>\n        </member>\n        <member name=\"M:BitField.BitField.GetValue(System.Int32,System.Int32)\">\n            <summary>\n            m～l ビット目に格納されている値を ulong 化して返す。\n            verilog の <c>z[m:l]</c> に相当。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <returns>格納されている値</returns>\n            <exception cref=\"T:BitField.BitFieldException\">\n            m &lt; l のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitField.Assign(System.UInt64)\">\n            <summary>\n            値を割り当てる。\n            </summary>\n            <param name=\"val\">割り当てたい値(ulong)</param>\n        </member>\n        <member name=\"M:BitField.BitField.Assign(BitField.BitField)\">\n            <summary>\n            値を割り当てる。\n            </summary>\n            <param name=\"a\">割り当てたい値の入ったビットフィールド。</param>\n            <exception cref=\"T:BitField.BitFieldException\">\n            this.Width != a.Width のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitField.Assign(System.Int32,System.Int32,BitField.BitField)\">\n            <summary>\n            m～l ビット目に値を割り当てる。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <param name=\"a\">割り当てたい値の入ったビットフィールド</param>\n            <exception cref=\"T:BitField.BitFieldException\">\n            this.Sub(m, l).Width != a.Width のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitField.Sub(System.Int32)\">\n            <summary>\n            i ビット目のみを切り出す。\n            verilog の <c>z[i]</c> に相当。\n            <c>z.Sub(i)</c> を書き換えると <c>z</c> そのものも書き換えられる。\n            </summary>\n            <param name=\"i\">切り出したいビットのインデックス</param>\n            <returns>切り出されたビットフィールド</returns>\n            <exception cref=\"T:BitField.BitFieldException\">\n            i が範囲外のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitField.Sub(System.Int32,System.Int32)\">\n            <summary>\n            m～l ビット目のみを切り出す。\n            verilog の <c>z[m:l]</c> に相当。\n            <c>z.Sub(m, l)</c> を書き換えると <c>z</c> そのものも書き換えられる。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <returns>切り出されたビットフィールド</returns>\n            <exception cref=\"T:BitField.BitFieldException\">\n            m, l  が範囲外のときと m &lt; l のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitField.Concat(BitField.BitField[])\">\n            <summary>\n            2つのビットフィールドを結合する。\n            verilog の <c>{x, y, z}</c> に相当。\n            いくつでもつなげられる。\n            </summary>\n            <param name=\"a\">つなげたいビットフィールド</param>\n            <returns>つながったビットフィールド</returns>\n        </member>\n        <member name=\"M:BitField.BitField.op_BitwiseAnd(BitField.BitField,BitField.BitField)\">\n            <summary>\n            各ビットに対して AND 演算。\n            </summary>\n            <param name=\"a\">オペランド1</param>\n            <param name=\"b\">オペランド2</param>\n            <returns>計算結果</returns>\n            <exception cref=\"T:BitField.BitFieldException\">\n            a.Width != b.Width のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitField.op_BitwiseOr(BitField.BitField,BitField.BitField)\">\n            <summary>\n            各ビットに対して OR 演算。\n            </summary>\n            <param name=\"a\">オペランド1</param>\n            <param name=\"b\">オペランド2</param>\n            <returns>計算結果</returns>\n            <exception cref=\"T:BitField.BitFieldException\">\n            a.Width != b.Width のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitField.op_ExclusiveOr(BitField.BitField,BitField.BitField)\">\n            <summary>\n            各ビットに対して XOR 演算。\n            </summary>\n            <param name=\"a\">オペランド1</param>\n            <param name=\"b\">オペランド2</param>\n            <returns>計算結果</returns>\n            <exception cref=\"T:BitField.BitFieldException\">\n            a.Width != b.Width のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitField.op_Addition(BitField.BitField,BitField.BitField)\">\n            <summary>\n            加算。\n            </summary>\n            <param name=\"a\">オペランド1</param>\n            <param name=\"b\">オペランド2</param>\n            <returns>計算結果</returns>\n        </member>\n        <member name=\"M:BitField.BitField.op_Subtraction(BitField.BitField,BitField.BitField)\">\n            <summary>\n            減算。\n            </summary>\n            <param name=\"a\">オペランド1</param>\n            <param name=\"b\">オペランド2</param>\n            <returns>計算結果</returns>\n        </member>\n        <member name=\"M:BitField.BitField.op_UnaryNegation(BitField.BitField)\">\n            <summary>\n            符号反転。\n            </summary>\n            <param name=\"a\">オペランド</param>\n            <returns>計算結果</returns>\n        </member>\n        <member name=\"M:BitField.BitField.op_OnesComplement(BitField.BitField)\">\n            <summary>\n            補数。\n            </summary>\n            <param name=\"a\">オペランド</param>\n            <returns>計算結果</returns>\n        </member>\n        <member name=\"M:BitField.BitField.op_Implicit(System.Boolean)~BitField.BitField\">\n            <summary>\n            ブール値からビットフィールドに変換\n            </summary>\n            <param name=\"b\">ビットフィールドの真理値</param>\n            <returns>ビットフィールド</returns>\n        </member>\n        <member name=\"M:BitField.BitField.op_Implicit(BitField.BitField)~System.Boolean\">\n            <summary>\n            ビットフィールドからブール値に変換\n            </summary>\n            <param name=\"bf\">ビットフィールド</param>\n            <returns>ビットフィールドの真偽</returns>\n        </member>\n        <member name=\"M:BitField.BitField.ToString\">\n            <summary>\n            文字列化。\n            0 と 1 の羅列。\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:BitField.BitField.Width\">\n            <summary>\n            ビット幅。\n            </summary>\n        </member>\n        <member name=\"P:BitField.BitField.Msb\">\n            <summary>\n            MSBを取得。\n            </summary>\n        </member>\n        <member name=\"P:BitField.BitField.Lsb\">\n            <summary>\n            LSBを取得。\n            </summary>\n        </member>\n        <member name=\"P:BitField.BitField.Item(System.Int32)\">\n            <summary>\n            i ビット目の値を読み書き。\n            </summary>\n            <exception cref=\"T:BitField.BitFieldException\">\n            i が範囲外のとき発生。\n            </exception>\n        </member>\n        <member name=\"P:BitField.BitField.Item(System.Int32,System.Int32)\">\n            <summary>\n            m～l ビット目の値を読み書き。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <exception cref=\"T:BitField.BitFieldException\">\n            m, l  が範囲外のときと m &lt; l のとき発生。\n            </exception>\n        </member>\n        <member name=\"P:BitField.BitField.Value\">\n            <summary>\n            格納されている値を ulong 化して返す。\n            </summary>\n        </member>\n        <member name=\"T:BitField.BitFieldImmediate\">\n            <summary>\n            値を直接格納しているビットフィールド。\n            普通に <c>BitFiled.Create()</c> で BitField を作るとこいつができる。\n            </summary>\n        </member>\n        <member name=\"M:BitField.BitFieldImmediate.#ctor(System.Int32,System.Int32)\">\n            <summary>\n            MSB が m、 LSB が l のビットフィールドを作成。\n            </summary>\n            <param name=\"msb\">MSB</param>\n            <param name=\"lsb\">LSB</param>\n        </member>\n        <member name=\"M:BitField.BitFieldImmediate.#ctor(System.Int32,System.Int32,System.UInt64)\">\n            <summary>\n            MSB が m、 LSB が l のビットフィールドを作成。\n            値の初期化も行う。\n            </summary>\n            <param name=\"msb\">MSB</param>\n            <param name=\"lsb\">LSB</param>\n            <param name=\"n\">初期値</param>\n        </member>\n        <member name=\"M:BitField.BitFieldImmediate.GetValue\">\n            <summary>\n            格納されている値を ulong 化して返す。\n            </summary>\n            <returns>格納されている値</returns>\n        </member>\n        <member name=\"M:BitField.BitFieldImmediate.GetValue(System.Int32,System.Int32)\">\n            <summary>\n            m～l ビット目に格納されている値を ulong 化して返す。\n            verilog の <c>z[m:l]</c> に相当。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <returns>格納されている値</returns>\n            <exception cref=\"T:BitField.BitFieldException\">\n            m &lt; l のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitFieldImmediate.Assign(BitField.BitField)\">\n            <summary>\n            値を割り当てる。\n            </summary>\n            <param name=\"a\">割り当てたい値の入ったビットフィールド。</param>\n            <exception cref=\"T:BitField.BitFieldException\">\n            this.Width != a.Width のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitFieldImmediate.Assign(System.Int32,System.Int32,BitField.BitField)\">\n            <summary>\n            m～l ビット目に値を割り当てる。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <param name=\"a\">割り当てたい値の入ったビットフィールド</param>\n            <exception cref=\"T:BitField.BitFieldException\">\n            this.Sub(m, l).Width != a.Width のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitFieldImmediate.Sub(System.Int32,System.Int32)\">\n            <summary>\n            m～l ビット目のみを切り出す。\n            verilog の <c>z[m:l]</c> に相当。\n            <c>z.Sub(m, l)</c> を書き換えると <c>z</c> そのものも書き換えられる。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <returns>切り出されたビットフィールド</returns>\n            <exception cref=\"T:BitField.BitFieldException\">\n            m, l  が範囲外のときと m &lt; l のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitFieldImmediate.GetMask(System.Int32,System.Int32)\">\n            <summary>\n            m～l ビット目のみ 1 のマスクを生成。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <returns>マスク</returns>\n        </member>\n        <member name=\"P:BitField.BitFieldImmediate.Msb\">\n            <summary>\n            MSBを取得。\n            </summary>\n        </member>\n        <member name=\"P:BitField.BitFieldImmediate.Lsb\">\n            <summary>\n            LSBを取得。\n            </summary>\n        </member>\n        <member name=\"T:BitField.BitFieldSub\">\n            <summary>\n            <c>BitField.Sub</c> で取り出す部分ビットフィールド。\n            </summary>\n        </member>\n        <member name=\"M:BitField.BitFieldSub.#ctor(System.Int32,System.Int32,BitField.BitField)\">\n            <summary>\n            bf の msb～lsb 目。\n            </summary>\n            <param name=\"msb\">MSB</param>\n            <param name=\"lsb\">LSB</param>\n            <param name=\"bf\">元となるビットフィールド</param>\n        </member>\n        <member name=\"M:BitField.BitFieldSub.GetValue\">\n            <summary>\n            格納されている値を ulong 化して返す。\n            </summary>\n            <returns>格納されている値</returns>\n        </member>\n        <member name=\"M:BitField.BitFieldSub.GetValue(System.Int32,System.Int32)\">\n            <summary>\n            m～l ビット目に格納されている値を ulong 化して返す。\n            verilog の <c>z[m:l]</c> に相当。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <returns>格納されている値</returns>\n            <exception cref=\"T:BitField.BitFieldException\">\n            m &lt; l のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitFieldSub.Assign(BitField.BitField)\">\n            <summary>\n            値を割り当てる。\n            </summary>\n            <param name=\"a\">割り当てたい値の入ったビットフィールド。</param>\n            <exception cref=\"T:BitField.BitFieldException\">\n            this.Width != a.Width のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitFieldSub.Assign(System.Int32,System.Int32,BitField.BitField)\">\n            <summary>\n            m～l ビット目に値を割り当てる。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <param name=\"a\">割り当てたい値の入ったビットフィールド</param>\n            <exception cref=\"T:BitField.BitFieldException\">\n            this.Sub(m, l).Width != a.Width のとき発生。\n            </exception>\n        </member>\n        <member name=\"M:BitField.BitFieldSub.Sub(System.Int32,System.Int32)\">\n            <summary>\n            m～l ビット目のみを切り出す。\n            verilog の <c>z[m:l]</c> に相当。\n            <c>z.Sub(m, l)</c> を書き換えると <c>z</c> そのものも書き換えられる。\n            </summary>\n            <param name=\"m\">MSB</param>\n            <param name=\"l\">LSB</param>\n            <returns>切り出されたビットフィールド</returns>\n            <exception cref=\"T:BitField.BitFieldException\">\n            m, l  が範囲外のときと m &lt; l のとき発生。\n            </exception>\n        </member>\n        <member name=\"P:BitField.BitFieldSub.Msb\">\n            <summary>\n            MSBを取得。\n            </summary>\n        </member>\n        <member name=\"P:BitField.BitFieldSub.Lsb\">\n            <summary>\n            LSBを取得。\n            </summary>\n        </member>\n        <member name=\"T:BitField.BitFieldTest\">\n            <summary>\n            BitField クラスのテスト用プログラム。\n            </summary>\n        </member>\n        <member name=\"M:BitField.BitFieldTest.Main\">\n            <summary>\n            アプリケーションのメイン エントリ ポイントです。\n            </summary>\n        </member>\n        <member name=\"M:BitField.BitFieldTest.TestBcd(System.UInt64)\">\n            <summary>\n            BinToBcd および BcdToBin のチェック\n            </summary>\n            <param name=\"m\">テスト入力値</param>\n        </member>\n        <member name=\"M:BitField.BitFieldTest.TestMulDiv(System.UInt64,System.UInt64)\">\n            <summary>\n            MulDiv のテスト\n            </summary>\n            <param name=\"m\">テスト入力(オペランド1)</param>\n            <param name=\"n\">テスト入力(オペランド2)</param>\n        </member>\n        <member name=\"M:BitField.BitFieldTest.TestMul(System.UInt64,System.UInt64)\">\n            <summary>\n            Mul のテスト\n            </summary>\n            <param name=\"m\">テスト入力(オペランド1)</param>\n            <param name=\"n\">テスト入力(オペランド2)</param>\n        </member>\n        <member name=\"M:BitField.BitFieldTest.TestDiv(System.UInt64,System.UInt64)\">\n            <summary>\n            Div のテスト\n            </summary>\n            <param name=\"m\">テスト入力(オペランド1)</param>\n            <param name=\"n\">テスト入力(オペランド2)</param>\n        </member>\n        <member name=\"T:BitField.SampleLogic\">\n            <summary>\n            ビットフィールドクラスのサンプルモジュール集。\n            乗除算器とBCD⇔バイナリ変換器。\n            </summary>\n        </member>\n        <member name=\"M:BitField.SampleLogic.MulDiv(BitField.BitField,BitField.BitField,System.Boolean)\">\n            <summary>\n            乗除算器。\n            </summary>\n            <param name=\"a\">オペランド1</param>\n            <param name=\"b\">オペランド2</param>\n            <param name=\"mul\">true のとき乗算、 false のとき除算</param>\n            <returns>演算結果(乗算の場合、下位32ビットに商、上位32ビットに剰余)</returns>\n        </member>\n        <member name=\"M:BitField.SampleLogic.Mul(BitField.BitField,BitField.BitField)\">\n            <summary>\n            乗算器。\n            </summary>\n            <param name=\"a\">オペランド1</param>\n            <param name=\"b\">オペランド2</param>\n            <returns>演算結果</returns>\n        </member>\n        <member name=\"M:BitField.SampleLogic.Div(BitField.BitField,BitField.BitField)\">\n            <summary>\n            除算器。\n            </summary>\n            <param name=\"a\">オペランド1</param>\n            <param name=\"b\">オペランド2</param>\n            <returns>演算結果(下位32ビットに商、上位32ビットに剰余)</returns>\n        </member>\n        <member name=\"M:BitField.SampleLogic.Negate(BitField.BitField)\">\n            <summary>\n            符号反転器。\n            </summary>\n            <param name=\"a\">オペランド</param>\n            <returns>演算結果</returns>\n        </member>\n        <member name=\"M:BitField.SampleLogic.BcdToBin(BitField.BitField)\">\n            <summary>\n            BCD → Binary 変換\n            </summary>\n            <param name=\"bcd\">変換元</param>\n            <returns>変換結果</returns>\n        </member>\n        <member name=\"M:BitField.SampleLogic.BcdToBinAddIn(BitField.BitField)\">\n            <summary>\n            BCD →バイナリ変換の補正値求める。\n            </summary>\n            <param name=\"a\">1桁(4ビット)BCD</param>\n            <returns>補正値</returns>\n        </member>\n        <member name=\"M:BitField.SampleLogic.BinToBcd(BitField.BitField,System.Boolean@)\">\n            <summary>\n            Binary → BCD 変換\n            </summary>\n            <param name=\"bin\">変換元</param>\n            <param name=\"overflow\">オーバーフローが起きたらtrueにセットされる。</param>\n            <returns>変換結果</returns>\n        </member>\n        <member name=\"M:BitField.SampleLogic.BinToBcdAddIn(BitField.BitField)\">\n            <summary>\n            バイナリ→BCD 変換の補正値求める。\n            </summary>\n            <param name=\"a\">4ビットバイナリ</param>\n            <returns>補正値</returns>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "Chapters/Old/BitField/SampleLogic.cs",
    "content": "﻿using System;\n\nnamespace BitField\n{\n\t/// <summary>\n\t/// ビットフィールドクラスのサンプルモジュール集。\n\t/// 乗除算器とBCD⇔バイナリ変換器。\n\t/// </summary>\n\tclass SampleLogic\n\t{\n\t\t/// <summary>\n\t\t/// 乗除算器。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド1</param>\n\t\t/// <param name=\"b\">オペランド2</param>\n\t\t/// <param name=\"mul\">true のとき乗算、 false のとき除算</param>\n\t\t/// <returns>演算結果(乗算の場合、下位32ビットに商、上位32ビットに剰余)</returns>\n\t\tpublic static BitField MulDiv(BitField a, BitField b, bool mul)\n\t\t{\n\t\t\tbool sgn = a[a.Msb] ^ b[b.Msb];\n\t\t\tBitField p = BitField.Create(63, 0);\n\t\t\tBitField q = BitField.Create(31, 0);\n\n\t\t\tif(a[a.Msb]) a = Negate(a);\n\t\t\tif(b[b.Msb]) b = Negate(b);\n\n\t\t\tp.Assign(BitField.Concat(BitField.Create(31, 0, 0), a));\n\t\t\tq.Assign(b);\n\n\t\t\tfor(int i=0; i<32; ++i)\n\t\t\t{\n\t\t\t\tBitField addin1, addin2, addout;\n\t\t\t\taddin1 = mul ? p[63, 32] : p[62, 31];\n\t\t\t\taddin2 = mul | p[63] ? q : Negate(q);\n\t\t\t\taddout = addin1 + addin2;\n\n\t\t\t\tif(mul)\n\t\t\t\t\tif(p[0])\n\t\t\t\t\t\tp.Assign(BitField.Concat(BitField.Create(0, 0, 0), addout, p[31, 1]));\n\t\t\t\t\telse\n\t\t\t\t\t\tp.Assign(BitField.Concat(BitField.Create(0, 0, 0), p[63, 1]));\n\t\t\t\telse\n\t\t\t\t\tp.Assign(BitField.Concat(addout, p[30, 0], ~addout[addout.Msb]));\n\t\t\t}\n\t\t\tif(!mul & !p[0])\n\t\t\t{\n\t\t\t\tBitField tmp = q + p[63,32];\n\t\t\t\tp.Assign(BitField.Concat(tmp, p[31, 0]));\n\t\t\t}\n\n\t\t\tif(sgn) p = Negate(p);\n\n\t\t\treturn p;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 乗算器。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド1</param>\n\t\t/// <param name=\"b\">オペランド2</param>\n\t\t/// <returns>演算結果</returns>\n\t\tpublic static BitField Mul(BitField a, BitField b)\n\t\t{\n\t\t\tbool sgn = a[a.Msb] ^ b[b.Msb];\n\t\t\tBitField p = BitField.Create(63, 0);\n\t\t\tBitField q = BitField.Create(31, 0);\n\n\t\t\tif(a[a.Msb]) a = Negate(a);\n\t\t\tif(b[b.Msb]) b = Negate(b);\n\n\t\t\tp.Assign(BitField.Concat(BitField.Create(31, 0, 0), a));\n\t\t\tq.Assign(b);\n\n\t\t\tfor(int i=0; i<32; ++i)\n\t\t\t{\n\t\t\t\tBitField addin1, addin2, addout;\n\n\t\t\t\taddin1 = p[63, 32];\n\t\t\t\taddin2 = q;\n\t\t\t\taddout = addin1 + addin2;\n\n\t\t\t\tif(p[0])\n\t\t\t\t\tp.Assign(BitField.Concat(BitField.Create(0, 0, 0), addout, p[31, 1]));\n\t\t\t\telse\n\t\t\t\t\tp.Assign(BitField.Concat(BitField.Create(0, 0, 0), p[63, 1]));\n\t\t\t}\n\n\t\t\tif(sgn) p = Negate(p);\n\n\t\t\treturn p;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 除算器。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド1</param>\n\t\t/// <param name=\"b\">オペランド2</param>\n\t\t/// <returns>演算結果(下位32ビットに商、上位32ビットに剰余)</returns>\n\t\tpublic static BitField Div(BitField a, BitField b)\n\t\t{\n\t\t\tbool sgn = a[a.Msb] ^ b[b.Msb];\n\t\t\tBitField p = BitField.Create(63, 0);\n\t\t\tBitField q = BitField.Create(31, 0);\n\n\t\t\tif(a[a.Msb]) a = Negate(a);\n\t\t\tif(b[b.Msb]) b = Negate(b);\n\n\t\t\tp.Assign(BitField.Concat(BitField.Create(31, 0, 0), a));\n\t\t\tq.Assign(b);\n\n\t\t\tfor(int i=0; i<32; ++i)\n\t\t\t{\n\t\t\t\tBitField addin1, addin2, addout;\n\n\t\t\t\taddin1 = p[62, 31];\n\t\t\t\taddin2 = p[63] ? q : Negate(q);\n\t\t\t\taddout = addin1 + addin2;\n\n\t\t\t\tp.Assign(BitField.Concat(addout, p[30, 0], ~addout[addout.Msb]));\n\t\t\t}\n\t\t\tif(!p[0])\n\t\t\t{\n\t\t\t\tBitField tmp = q + p[63,32];\n\t\t\t\tp.Assign(BitField.Concat(tmp, p[31, 0]));\n\t\t\t}\n\n\t\t\tif(sgn) p = Negate(p);\n\n\t\t\treturn p;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 符号反転器。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド</param>\n\t\t/// <returns>演算結果</returns>\n\t\tpublic static BitField Negate(BitField a)\n\t\t{\n\t\t\tBitField tmp = BitField.Create(a.Msb, a.Lsb);\n\t\t\ttmp.Assign(~a.Value + 1);\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// BCD → Binary 変換\n\t\t/// </summary>\n\t\t/// <param name=\"bcd\">変換元</param>\n\t\t/// <returns>変換結果</returns>\n\t\tpublic static BitField BcdToBin(BitField bcd)\n\t\t{\n\t\t\tBitField bin = BitField.Concat(BitField.Create(0, 0, 0), bcd, BitField.Create(29, 0, 0));\n\n\t\t\tfor(int i=0; i<30; ++i)\n\t\t\t{\n\t\t\t\tBitField a0 = BcdToBinAddIn(bin[62, 59]);\n\t\t\t\tBitField a1 = BcdToBinAddIn(bin[58, 55]);\n\t\t\t\tBitField a2 = BcdToBinAddIn(bin[54, 51]);\n\t\t\t\tBitField a3 = BcdToBinAddIn(bin[50, 47]);\n\t\t\t\tBitField a4 = BcdToBinAddIn(bin[46, 43]);\n\t\t\t\tBitField a5 = BcdToBinAddIn(bin[42, 39]);\n\t\t\t\tBitField a6 = BcdToBinAddIn(bin[38, 35]);\n\t\t\t\tBitField a7 = BcdToBinAddIn(bin[34, 31]);\n\t\t\t\tBitField add_in = BitField.Concat(a0, a1, a2, a3, a4, a5, a6, a7);\n\t\t\t\tBitField add_out = bin[62, 31] + add_in + BitField.Create(31, 0, 1);\n\n\t\t\t\tbin.Assign(BitField.Concat(BitField.Create(0, 0, 0), add_out, bin[30, 1]));\n\t\t\t}\n\n\t\t\treturn bin[31, 0];\n\t\t}\n\n\t\t/// <summary>\n\t\t/// BCD →バイナリ変換の補正値求める。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">1桁(4ビット)BCD</param>\n\t\t/// <returns>補正値</returns>\n\t\tstatic private BitField BcdToBinAddIn(BitField a)\n\t\t{\n\t\t\treturn BitField.Create(3, 0, a.Value >= 8 ? 0xCUL : 0xFUL);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Binary → BCD 変換\n\t\t/// </summary>\n\t\t/// <param name=\"bin\">変換元</param>\n\t\t/// <param name=\"overflow\">オーバーフローが起きたらtrueにセットされる。</param>\n\t\t/// <returns>変換結果</returns>\n\t\tpublic static BitField BinToBcd(BitField bin, out bool overflow)\n\t\t{\n\t\t\tBitField bcd = BitField.Concat(BitField.Create(30, 0, 0), bin);\n\n\t\t\toverflow = false;\n\t\t\tfor(int i=0; i<30; ++i)\n\t\t\t{\n\t\t\t\tBitField a0 = BinToBcdAddIn(bcd[61, 58]);\n\t\t\t\tBitField a1 = BinToBcdAddIn(bcd[57, 54]);\n\t\t\t\tBitField a2 = BinToBcdAddIn(bcd[53, 50]);\n\t\t\t\tBitField a3 = BinToBcdAddIn(bcd[49, 46]);\n\t\t\t\tBitField a4 = BinToBcdAddIn(bcd[45, 42]);\n\t\t\t\tBitField a5 = BinToBcdAddIn(bcd[41, 38]);\n\t\t\t\tBitField a6 = BinToBcdAddIn(bcd[37, 34]);\n\t\t\t\tBitField a7 = BinToBcdAddIn(bcd[33, 30]);\n\t\t\t\tBitField add_in = BitField.Concat(a0, a1, a2, a3, a4, a5, a6, a7);\n\t\t\t\tBitField add_out = bcd[61, 30] + add_in;\n\n\n\t\t\t\tbcd.Assign(BitField.Concat(add_out, bcd[29, 0], BitField.Create(0, 0, 0)));\n\t\t\t\toverflow |= add_out[add_out.Msb];\n\t\t\t}\n\n\t\t\treturn bcd[61, 30];\n\t\t}\n\n\t\t/// <summary>\n\t\t/// バイナリ→BCD 変換の補正値求める。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">4ビットバイナリ</param>\n\t\t/// <returns>補正値</returns>\n\t\tstatic private BitField BinToBcdAddIn(BitField a)\n\t\t{\n\t\t\treturn BitField.Create(3, 0, a.Value >= 5 ? 0x3UL : 0x0UL);\n\t\t}\n\t}//class SampleLogic\n}//namespace BitField\n"
  },
  {
    "path": "Chapters/Old/BitField/readme.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<html lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">\n<title>read me</title>\n</head>\n<body>\n\n<h1>BitField NX</h1>\n<p>\n̉ۑ Verilog HDL Ń\\[XĂłA\nrŃG[`FbNÂȀdV~[Vc[ɂԂ؂āA\n\\tgEFAŃASỸ`FbNĂ HDL LqƂɂ܂B\n̍ۂɍ̂AVerilog ̕ϐ݂ȃrbgsƂ̏orbgtB[hNXłB\n</p>\n<p>\ñrbgtB[hNX̎gpȉɂ܂B\n</p>\n<table border=\"1\" cellpadding=\"5\">\n<tr><th>VerilogLq</th><th><code>BitField</code>NX</th></tr>\n<tr>\n<td><code>wire [31:0]w;</code></td>\n<td><code>BitField w = BitField.Create(31, 0);</code></td>\n</tr>\n<tr>\n<td><code>assign w = x[4:0];</code></td>\n<td><code>w.Assign(x[4, 0]);</code></td>\n</tr>\n<tr>\n<td><code>assign w = {x, y, z};</code></td>\n<td><code>w.Assign(BitField.Concat(x, y, z));</code></td>\n</tr>\n<tr>\n<td><code>assign w = {w[0], w[31:1]};</code></td>\n<td><code>w.Assign(BitField.Concat(w[0], w[31, 1]));</code></td>\n</tr>\n<tr>\n<td><code>assign w[0] = x[0] &amp; y[0];</code></td>\n<td><code>w[0] = x[0] &amp; y[0];</code></td>\n</tr>\n<tr>\n<td><code>assign w[4:0] = x[4:0] &amp; y[4:0];</code></td>\n<td><code>w[4, 0].Assign(x[4, 0] &amp; y[4, 0])</code></td>\n</tr>\n</table>\n\n<h2>BitFieldNXTv</h2>\n<p>\nƂ肠ABitField NXgĒvZ^̏ZƔ񕜌^̏Z܂Ƃ߂̂Ă݂܂B\n\\[X͈ȉ̒ʂB\n</p>\n\n<pre title=\"C# 揜Z\">\npublic static BitField MulDiv(BitField a, BitField b, bool mul)\n{\n  bool sgn = a[a.Msb] ^ b[b.Msb];\n  BitField p = BitField.Create(63, 0);\n  BitField q = BitField.Create(31, 0);\n\n  if(a[a.Msb]) a = Negate(a);\n  if(b[b.Msb]) b = Negate(b);\n\n  p.Assign(BitField.Concat(BitField.Create(31, 0, 0), a));\n  q.Assign(b);\n\n  for(int i=0; i&lt;32; ++i)\n  {\n    BitField addin1, addin2, addout;\n    addin1 = mul ? p[63, 32] : p[62, 31];\n    addin2 = mul | p[63] ? q : Negate(q);\n    addout = addin1 + addin2;\n\n    if(mul)\n      if(p[0])\n        p.Assign(BitField.Concat(BitField.Create(0, 0, 0), addout, p[31, 1]));\n      else\n        p.Assign(BitField.Concat(BitField.Create(0, 0, 0), p[63, 1]));\n    else\n      p.Assign(BitField.Concat(addout, p[30, 0], ~addout[addout.Msb]));\n  }\n  if(!mul &amp; !p[0])\n  {\n    BitField tmp = q + p[63,32];\n    p.Assign(BitField.Concat(tmp, p[31, 0]));\n  }\n\n  if(sgn) p = Negate(p);\n\n  return p;\n}\n</pre>\n<p>\n: <code>Negate</code> ͕]HłB\n</p>\n<p>\n C# ̃R[hɁAȉ Verilog HDL Lq܂B\n</p>\n\n<pre title=\"verilog HDL 揜Z\">\nmodule MulDiv32(xreset, clk, start, multiply, a, b, valid, result, overflow);\ninput xreset;\ninput clk;\n\ninput start;          //̐M1̂ƂvZJn\ninput multiply;       //̐M1̂ƂZA0̂ƂZ\ninput [31:0] a, b;    //Z/Z\noutput valid;         //vZI1\noutput [31:0] result; //result = a * b ܂ result = a / b\noutput overflow;      //(Z)vZʂ32bitɎ܂Ȃꍇ1\n\nreg mul;\nreg sgn;\nreg [6:0] count;\n\nreg [63:0] p; //搔Z\nreg [31:0] q; //搔\n\nwire [31:0] add_in1, add_in2;\nwire [31:0] add_out;\nwire add_cin;\nwire add_cout;\n\nwire [31:0] neg_a_in, neg_a, neg_b_in, neg_b;\n\n//module\n  Add32 add32(add_in1, add_in2, add_cin, add_out, add_cout);\n  Negate32 negA(neg_a_in, neg_a);\n  Negate32 negB(neg_b_in, neg_b);\n\n//add wire\n  assign add_in1 = mul ? p[63:32] : p[62:31];\n  assign add_in2 = (mul | p[63]) ? q : ~q;\n  assign add_cin = (mul | p[63]) ? 1'b0 : 1'b1;\n\n//neg wire\n  assign neg_a_in = start ? a : p[31:0];\n  assign neg_b_in = b;\n\n//output wire\n  assign result = sgn ? neg_a : p[31:0];\n  assign overflow = mul &amp; (|p[63:31]) &amp; !(&p[63:31]);\n  assign valid = count == 6'd1;\n\n//reg\n  //mul\n  always @(posedge clk or negedge xreset)\n  begin\n    if(!xreset)\n      mul &lt;= 0;\n    else if(start)\n      mul &lt;= multiply;\n    else\n      mul &lt;= mul;\n  end\n\n  //sgn\n  always @(posedge clk or negedge xreset)\n  begin\n    if(!xreset)\n      sgn &lt;= 0;\n    else if(start)\n      sgn &lt;= a[31] ^ b[31];\n    else\n      sgn &lt;= sgn;\n  end\n\n  //p\n  always @(posedge clk or negedge xreset)\n  begin\n    if(!xreset)\n      p &lt;= 0;\n    else if(start)\n      p &lt;= {32'h0, a[31] ? neg_a : a};\n    else if(mul)\n      p &lt;= p[0] ? {1'b0, add_out, p[31:1]} : {1'b0, p[63:1]};\n    else\n      p &lt;= {add_out, p[30:0], ~add_out[31]};\n  end\n\n  //q\n  always @(posedge clk or negedge xreset)\n  begin\n    if(!xreset)\n      q &lt;= 0;\n    else if(start)\n      q &lt;= b[31] ? neg_b : b;\n    else\n      q &lt;= q;\n  end\n\n  //count\n  always @(posedge clk or negedge xreset)\n  begin\n    if(!xreset)\n      count &lt;= 6'd0;\n    else if(start)\n      count &lt;= 6'd33;\n    else if(count == 6'd0)\n      count &lt;= count;\n    else\n      count &lt;= count-1;\n  end\nendmodule\n</pre>\n<p>\n: <code>Add32</code> 32rbgZA<code>Negate32</code> 32rbg]HłB\n</p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/BitField/test.cs",
    "content": "﻿#define CHECK_BCD\n//#define CHECK_MUL\n//#define CHECK_DIV\n//#define CHECK_MUL_DIV\n\nusing System;\n\nnamespace BitField\n{\n\t/// <summary>\n\t/// BitField クラスのテスト用プログラム。\n\t/// </summary>\n\tclass BitFieldTest\n\t{\n\t\t/// <summary>\n\t\t/// アプリケーションのメイン エントリ ポイントです。\n\t\t/// </summary>\n\t\t[STAThread]\n\t\tpublic static void Main()\n\t\t{\n\t\t\tRandom rnd = new Random();\n\n\t\t\t// BinToBcd および BcdToBin のチェック\n#if CHECK_BCD\n\t\t\tfor(int i=1; i<100; ++i)\n\t\t\t{\n\t\t\t\tTestBcd(unchecked((ulong)rnd.Next(99999999)));\n\t\t\t\tTestBcd(unchecked((ulong)rnd.Next() + 99999999UL));\n\t\t\t}\n\t\t\tTestBcd(99999999UL);\n\t\t\tTestBcd(100000000UL);\n#endif\n\n\t\t\t// MulDiv のチェック\n#if CHECK_MUL_DIV\n\t\t\tfor(int i=1; i<100; ++i)\n\t\t\t{\n\t\t\t\tTestMulDiv(unchecked((ulong)rnd.Next()), unchecked((ulong)rnd.Next()));\n\t\t\t\tTestMulDiv(unchecked((ulong)rnd.Next()), unchecked((ulong)(rnd.Next(0x10000) - 0x8000)));\n\t\t\t\tTestMulDiv(unchecked((ulong)(rnd.Next(0x10000) - 0x8000)), unchecked((ulong)rnd.Next()));\n\t\t\t\tTestMulDiv(unchecked((ulong)(rnd.Next(0x10000) - 0x8000)), unchecked((ulong)(rnd.Next(0x10000) - 0x8000)));\n\t\t\t}\n#endif\n\n\t\t\t// Mul のチェック\n#if CHECK_MUL\n\t\t\tfor(int i=1; i<100; ++i)\n\t\t\t{\n\t\t\t\tTestMul(unchecked((ulong)rnd.Next()), unchecked((ulong)rnd.Next()));\n\t\t\t\tTestMul(unchecked((ulong)rnd.Next()), unchecked((ulong)(rnd.Next(0x10000) - 0x8000)));\n\t\t\t\tTestMul(unchecked((ulong)(rnd.Next(0x10000) - 0x8000)), unchecked((ulong)rnd.Next()));\n\t\t\t\tTestMul(unchecked((ulong)(rnd.Next(0x10000) - 0x8000)), unchecked((ulong)(rnd.Next(0x10000) - 0x8000)));\n\t\t\t}\n#endif\n\n\t\t\t// Div のチェック\n#if CHECK_DIV\n\t\t\tfor(int i=1; i<100; ++i)\n\t\t\t{\n\t\t\t\tTestDiv(unchecked((ulong)rnd.Next()), unchecked((ulong)rnd.Next()));\n\t\t\t\tTestDiv(unchecked((ulong)rnd.Next()), unchecked((ulong)(rnd.Next(0x10000) - 0x8000)));\n\t\t\t\tTestDiv(unchecked((ulong)(rnd.Next(0x10000) - 0x8000)), unchecked((ulong)rnd.Next()));\n\t\t\t\tTestDiv(unchecked((ulong)(rnd.Next(0x10000) - 0x8000)), unchecked((ulong)(rnd.Next(0x10000) - 0x8000)));\n\t\t\t}\n#endif\n\t\t}\n\n\t\t/// <summary>\n\t\t/// BinToBcd および BcdToBin のチェック\n\t\t/// </summary>\n\t\t/// <param name=\"m\">テスト入力値</param>\n\t\tstatic void TestBcd(ulong m)\n\t\t{\n\t\t\tBitField bin;\n\t\t\tbin = BitField.Create(31, 0, m);\n\n\t\t\tConsole.Write(\"{0,15:d08} : \", bin.Value);\n\t\t\tbool of;\n\t\t\tBitField bcd = SampleLogic.BinToBcd(bin, out of);\n\t\t\tConsole.Write(\"{0,9:x08} : \", bcd.Value);\n\t\t\tBitField bin2 = SampleLogic.BcdToBin(bcd);\n\t\t\tConsole.Write(\"{0,9:d08}\", bin2.Value);\n\t\t\tif((bin.Value % 100000000) != bin2.Value)\n\t\t\t\tConsole.Write(\" **\");\n\t\t\tif(of)\n\t\t\t\tConsole.Write(\"  overflow\");\n\t\t\tConsole.Write(\"\\n\");\n\t\t}\n\n\t\t/// <summary>\n\t\t/// MulDiv のテスト\n\t\t/// </summary>\n\t\t/// <param name=\"m\">テスト入力(オペランド1)</param>\n\t\t/// <param name=\"n\">テスト入力(オペランド2)</param>\n\t\tstatic void TestMulDiv(ulong m, ulong n)\n\t\t{\n\t\t\tBitField a, b;\n\t\t\ta = BitField.Create(31, 0, m);\n\t\t\tb = BitField.Create(31, 0, n);\n\n\t\t\tBitField p = SampleLogic.MulDiv(a, b, true);\n\t\t\tBitField q = SampleLogic.MulDiv(a, b, false);\n\n\t\t\tulong tmp1 = p.Value;\n\t\t\tulong tmp2 = unchecked((ulong)((long)(int)a.Value * (long)(int)b.Value));\n\n\t\t\tConsole.Write(\"{0:x8}×{1:x8} = \", (int)a.Value, (int)b.Value);\n\t\t\tConsole.Write(\"{0:x16} ({1:x16})\", tmp1, tmp2);\n\n\t\t\tif(tmp1 != tmp2)\n\t\t\t{\n\t\t\t\tConsole.Write(\" ** \");\n\t\t\t\tConsole.ReadLine();\n\t\t\t}\n\t\t\tConsole.Write(\"\\n\");\n\n\t\t\tuint tmp3 = (uint)q[31, 0].Value;\n\t\t\tuint tmp4 = unchecked((uint)((long)(int)a.Value / (long)(int)b.Value));\n\n\t\t\tConsole.Write(\"{0:x8}÷{1:x8} = \", (int)a.Value, (int)b.Value);\n\t\t\tConsole.Write(\"{0:x8} ({1:x8})\", tmp3, tmp4);\n\n\t\t\tif(tmp3 != tmp4)\n\t\t\t{\n\t\t\t\tConsole.Write(\" ** \");\n\t\t\t\tConsole.ReadLine();\n\t\t\t}\n\t\t\tConsole.Write(\"\\n\");\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Mul のテスト\n\t\t/// </summary>\n\t\t/// <param name=\"m\">テスト入力(オペランド1)</param>\n\t\t/// <param name=\"n\">テスト入力(オペランド2)</param>\n\t\tstatic void TestMul(ulong m, ulong n)\n\t\t{\n\t\t\tBitField a, b;\n\t\t\ta = BitField.Create(31, 0, m);\n\t\t\tb = BitField.Create(31, 0, n);\n\n\t\t\tBitField p = SampleLogic.Mul(a, b);\n\n\t\t\tulong tmp1 = p.Value;\n\t\t\tulong tmp2 = unchecked((ulong)((long)(int)a.Value * (long)(int)b.Value));\n\n\t\t\tConsole.Write(\"{0:x8}×{1:x8} = \", (int)a.Value, (int)b.Value);\n\t\t\tConsole.Write(\"{0:x16} ({1:x16})\", tmp1, tmp2);\n\n\t\t\tif(tmp1 != tmp2)\n\t\t\t{\n\t\t\t\tConsole.Write(\" ** \");\n\t\t\t\tConsole.ReadLine();\n\t\t\t}\n\t\t\tConsole.Write(\"\\n\");\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Div のテスト\n\t\t/// </summary>\n\t\t/// <param name=\"m\">テスト入力(オペランド1)</param>\n\t\t/// <param name=\"n\">テスト入力(オペランド2)</param>\n\t\tstatic void TestDiv(ulong m, ulong n)\n\t\t{\n\t\t\tBitField a, b;\n\t\t\ta = BitField.Create(31, 0, m);\n\t\t\tb = BitField.Create(31, 0, n);\n\n\t\t\tBitField q = SampleLogic.Div(a, b);\n\n\t\t\tuint tmp3 = (uint)q[31, 0].Value;\n\t\t\tuint tmp4 = unchecked((uint)((long)(int)a.Value / (long)(int)b.Value));\n\n\t\t\tConsole.Write(\"{0:x8}÷{1:x8} = \", (int)a.Value, (int)b.Value);\n\t\t\tConsole.Write(\"{0:x8} ({1:x8})\", tmp3, tmp4);\n\n\t\t\tif(tmp3 != tmp4)\n\t\t\t{\n\t\t\t\tConsole.Write(\" ** \");\n\t\t\t\tConsole.ReadLine();\n\t\t\t}\n\t\t\tConsole.Write(\"\\n\");\n\t\t}\n\t}//class BitFieldTest\n}//namespace BitField\n"
  },
  {
    "path": "Chapters/Old/Complex/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n//\n// アセンブリに関する一般情報は以下の \n// 属性セットを通して制御されます。アセンブリに関連付けられている \n// 情報を変更するには、これらの属性値を変更してください。\n//\n[assembly: AssemblyTitle(\"Mathematic Library\")]\n[assembly: AssemblyDescription(\"数学ライブラリ(複素数型サンプルのみ)\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"\")]\n[assembly: AssemblyCopyright(\"Iwanaga Nobuyuki\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\t\t\n\n//\n// アセンブリのバージョン情報は、以下の 4 つの属性で構成されます :\n//\n//      メジャー バージョン\n//      マイナ バージョン \n//      ビルド番号\n//      リビジョン\n//\n// 下にあるように、'*' を使って、すべての値を指定するか、 \n// ビルドおよびリビジョン番号を既定値にすることができます :\n\n[assembly: AssemblyVersion(\"1.0.*\")]\n\n//\n// アセンブリに署名するには、使用するキーを指定しなければなりません。アセンブリ署名に関する \n// 詳細については、Microsoft .NET Framework ドキュメントを参照してください。\n//\n// 下の属性を使って、署名に使うキーを制御します。\n//\n// メモ : \n//   (*) キーが指定されないと、アセンブリは署名されません。\n//   (*) KeyName は、コンピュータにインストールされている暗号サービス プロバイダ (CSP) を\n//       表します。KeyFile は、キーを含む\n//       ファイルです。\n//   (*) KeyFile および KeyName の値が共に指定されている場合は、 \n//       次の処置が取られます :\n//       (1) KeyName が CSP に見つかった場合、そのキーが使われます。\n//       (2) KeyName が存在せず、KeyFile が存在する場合、\n//           KeyFile にあるキーが CSP にインストールされ、使われます。\n//   (*) KeyFile を作成するには、sn.exe (Strong Name) ユーティリティを使ってください。\n//       KeyFile を指定するとき、KeyFile の場所は、\n//       プロジェクト出力 ディレクトリへの相対パスでなければなりません。パスは、\n//       %Project Directory%\\obj\\<configuration> です。たとえば、KeyFile がプロジェクト ディレクトリにある場合、\n//       AssemblyKeyFile 属性を \n//       [assembly: AssemblyKeyFile(\"..\\\\..\\\\mykey.snk\")] として指定します。\n//   (*) 遅延署名は高度なオプションです。詳細については Microsoft .NET Framework\n//       ドキュメントを参照してください。\n//\n[assembly: AssemblyDelaySign(false)]\n[assembly: AssemblyKeyFile(\"\")]\n[assembly: AssemblyKeyName(\"\")]\n"
  },
  {
    "path": "Chapters/Old/Complex/CartesianComplex.cs",
    "content": "﻿using System;\n\nnamespace MyMath\n{\n\t/// <summary>\n\t/// 複素数クラスの実装1\n\t/// 実部と虚部をメンバに持つ\n\t/// 加減算は高速で、乗除算は低速\n\t/// </summary>\n\tpublic class CartesianComplex : Complex\n\t{\n\t\t#region 定数\n\n\t\tstatic public readonly CartesianComplex I = new CartesianComplex(0, 1);\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic CartesianComplex(double x, double y)\n\t\t{\n\t\t\tthis.re = x;\n\t\t\tthis.im = y;\n\t\t}\n\n\t\tpublic CartesianComplex(Complex z) : this(z.Re, z.Im){}\n\t\tpublic CartesianComplex(double x) : this(x, 0){}\n\t\tpublic CartesianComplex() : this(0, 0){}\n\t\tstatic public implicit operator CartesianComplex (double x){return new CartesianComplex(x);}\n\n\t\t/// <summary>\n\t\t/// 極座標からコンストラクト\n\t\t/// </summary>\n\t\t/// <param name=\"r\">絶対値</param>\n\t\t/// <param name=\"theta\">偏角</param>\n\t\tstatic CartesianComplex FromPolar(double r, double theta)\n\t\t{\n\t\t\treturn new CartesianComplex(r * Math.Cos(theta), r * Math.Sin(theta));\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable メンバ\n\n\t\tpublic override object Clone()\n\t\t{\n\t\t\treturn new CartesianComplex(this.re, this.im);\n\t\t}\n\n\t\tpublic override bool Equals(object o)\n\t\t{\n\t\t\tif(!(o is Complex))\n\t\t\t\treturn false;\n\n\t\t\tComplex z = (Complex)o;\n\t\t\treturn (this.re == z.Re) && (this.im == z.Im);\n\t\t}\n\t\tpublic override bool Equals(double x)\n\t\t{\n\t\t\treturn (this.im == 0) && (this.re == x);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn this.re.GetHashCode() ^ this.im.GetHashCode();\n\t\t}\n\n\t\t#endregion\n\t\t#region override プロパティ\n\n\t\tpublic override double Re\n\t\t{\n\t\t\tset{this.re = value;}\n\t\t\tget{return this.re;}\n\t\t}\n\n\t\tpublic override double Im\n\t\t{\n\t\t\tset{this.im = value;}\n\t\t\tget{return this.im;}\n\t\t}\n\n\t\tpublic override double Abs\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tdouble abs = this.Abs;\n\t\t\t\tthis.re *= value / abs;\n\t\t\t\tthis.im *= value / abs;\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn Abs_(this.re, this.im);\n\t\t\t}\n\t\t}\n\n\t\tpublic override double Arg\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tdouble abs = this.Abs;\n\t\t\t\tthis.re = abs * Math.Cos(value);\n\t\t\t\tthis.im = abs * Math.Sin(value);\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn Arg_(this.re, this.im);\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region override メソッド\n\n\t\tpublic override Complex Negate()\n\t\t{\n\t\t\treturn new CartesianComplex(-this.re, -this.im);\n\t\t}\n\n\t\tpublic override Complex Conjugate()\n\t\t{\n\t\t\treturn new CartesianComplex(this.re, -this.im);\n\t\t}\n\n\t\tpublic override Complex Invert()\n\t\t{\n\t\t\tdouble norm = this.Norm();\n\t\t\treturn new CartesianComplex(this.re / norm, -this.im / norm);\n\t\t}\n\n\t\tpublic override Complex Add(Complex z)\n\t\t{\n\t\t\treturn new CartesianComplex(this.re + z.Re, this.im + z.Im);\n\t\t}\n\t\tpublic override Complex Add(double x)\n\t\t{\n\t\t\treturn new CartesianComplex(this.re + x, this.im);\n\t\t}\n\n\t\tpublic override Complex Sub(Complex z)\n\t\t{\n\t\t\treturn new CartesianComplex(this.re - z.Re, this.im - z.Im);\n\t\t}\n\t\tpublic override Complex Sub(double x)\n\t\t{\n\t\t\treturn new CartesianComplex(this.re - x, this.im);\n\t\t}\n\n\t\tpublic override Complex Mul(Complex z)\n\t\t{\n\t\t\treturn new CartesianComplex(this.re * z.Re - this.im * z.Im, this.re * z.Im + this.im * z.Re);\n\t\t}\n\t\tpublic override Complex Mul(double x)\n\t\t{\n\t\t\treturn new CartesianComplex(this.re * x, this.im * x);\n\t\t}\n\n\t\tpublic override Complex Div(Complex z)\n\t\t{\n\t\t\tCartesianComplex w = new CartesianComplex(this.re * z.Re + this.im * z.Im, this.im * z.Re - this.re * z.Im);\n\t\t\tw.re /= z.Norm();\n\t\t\tw.im /= z.Norm();\n\t\t\treturn w;\n\t\t}\n\t\tpublic override Complex Div(double x)\n\t\t{\n\t\t\treturn new CartesianComplex(this.re / x, this.im / x);\n\t\t}\n\n\t\tpublic override double Norm()\n\t\t{\n\t\t\treturn Norm_(this.re, this.im);\n\t\t}\n\n\t\t#endregion\n\t\t#region フィールド\n\n\t\tprivate double re; // 実部\n\t\tprivate double im; // 虚部\n\n\t\t#endregion\n\t}//class CartesianComplex\n}\n"
  },
  {
    "path": "Chapters/Old/Complex/Complex.cs",
    "content": "﻿using System;\n\nnamespace MyMath\n{\n\t/// <summary>\n\t/// 複素数型の抽象基底クラス\n\t/// </summary>\n\tpublic abstract class Complex : ICloneable\n\t{\n\t\t#region ICloneable メンバ\n\n\t\tpublic abstract object Clone();\n\t\tpublic abstract override bool Equals(object o);\n\t\tpublic abstract bool Equals(double x);\n\t\tpublic abstract override int GetHashCode();\n\n\t\t#endregion\n\t\t#region abstract プロパティ\n\n\t\t/// <summary>\n\t\t/// 実部\n\t\t/// </summary>\n\t\tpublic abstract double Re{set; get;}\n\n\t\t/// <summary>\n\t\t/// 虚部\n\t\t/// </summary>\n\t\tpublic abstract double Im{set; get;}\n\n\t\t/// <summary>\n\t\t/// 絶対値\n\t\t/// </summary>\n\t\tpublic abstract double Abs{set; get;}\n\n\t\t/// <summary>\n\t\t/// 偏角\n\t\t/// </summary>\n\t\tpublic abstract double Arg{set; get;}\n\n\t\t#endregion\n\t\t#region abstract メソッド\n\n\t\t/// <summary>\n\t\t/// 絶対値の二乗を返す\n\t\t/// </summary>\n\t\tpublic abstract double Norm();\n\n\t\t/// <summary>\n\t\t/// this を符号反転させたものを返す\n\t\t/// </summary>\n\t\tpublic abstract Complex Negate();\n\n\t\t/// <summary>\n\t\t/// this の逆数を返す\n\t\t/// </summary>\n\t\tpublic abstract Complex Invert();\n\n\t\t/// <summary>\n\t\t/// this の共役複素数を返す\n\t\t/// </summary>\n\t\tpublic abstract Complex Conjugate();\n\n\t\t/// <summary>\n\t\t/// this に z を加えた値を返す\n\t\t/// (thisの値は変化させない)\n\t\t/// </summary>\n\t\tpublic abstract Complex Add(Complex z);\n\t\tpublic abstract Complex Add(double x);\n\n\t\t/// <summary>\n\t\t/// this から z を引いた値を返す\n\t\t/// (thisの値は変化させない)\n\t\t/// </summary>\n\t\tpublic abstract Complex Sub(Complex z);\n\t\tpublic abstract Complex Sub(double x);\n\n\t\t/// <summary>\n\t\t/// this に z を掛けた値を返す\n\t\t/// (thisの値は変化させない)\n\t\t/// </summary>\n\t\tpublic abstract Complex Mul(Complex z);\n\t\tpublic abstract Complex Mul(double x);\n\n\t\t/// <summary>\n\t\t/// this を z で割った値を返す\n\t\t/// (thisの値は変化させない)\n\t\t/// </summary>\n\t\tpublic abstract Complex Div(Complex z);\n\t\tpublic abstract Complex Div(double x);\n\n\t\t#endregion\n\t\t#region object メンバ\n\n\t\t/// <summary>\n\t\t/// 文字列化\n\t\t/// </summary>\n\t\tpublic override string ToString()\n\t\t{\n\t\t\tif(this.Im > 0)\n\t\t\t\treturn this.Re + \"+i\" + this.Im;\n\t\t\tif(this.Im < 0)\n\t\t\t\treturn this.Re + \"-i\" + (-this.Im);\n\t\t\treturn this.Re.ToString();\n\t\t}\n\n\t\t#endregion\n\t\t#region operator\n\n\t\t#region 単項演算子\n\n\t\t/// <summary>\n\t\t/// 単項+\n\t\t/// </summary>\n\t\tstatic public Complex operator+ (Complex z)\n\t\t{\n\t\t\treturn (Complex)z.Clone();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 単項-\n\t\t/// </summary>\n\t\tstatic public Complex operator- (Complex z)\n\t\t{\n\t\t\treturn z.Negate();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 共役演算子\n\t\t/// </summary>\n\t\tstatic public Complex operator~ (Complex z)\n\t\t{\n\t\t\treturn z.Conjugate();\n\t\t}\n\n\t\t#endregion\n\t\t#region 2項演算子\n\n\t\t/// <summary>\n\t\t/// 加算\n\t\t/// </summary>\n\t\t/// <returns>z+w</returns>\n\t\tstatic public Complex operator+ (Complex z, Complex w)\n\t\t{\n\t\t\treturn z.Add(w);\n\t\t}\n\t\tstatic public Complex operator+ (Complex z, double x)\n\t\t{\n\t\t\treturn z.Add(x);\n\t\t}\n\t\tstatic public Complex operator+ (double x, Complex z)\n\t\t{\n\t\t\treturn z.Add(x);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 減算\n\t\t/// </summary>\n\t\t/// <returns>z-w</returns>\n\t\tstatic public Complex operator- (Complex z, Complex w)\n\t\t{\n\t\t\treturn z.Sub(w);\n\t\t}\n\t\tstatic public Complex operator- (Complex z, double x)\n\t\t{\n\t\t\treturn z.Sub(x);\n\t\t}\n\t\tstatic public Complex operator- (double x, Complex z)\n\t\t{\n\t\t\treturn z.Negate().Add(x);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 乗算\n\t\t/// </summary>\n\t\t/// <returns>z*w</returns>\n\t\tstatic public Complex operator* (Complex z, Complex w)\n\t\t{\n\t\t\treturn z.Mul(w);\n\t\t}\n\t\tstatic public Complex operator* (Complex z, double x)\n\t\t{\n\t\t\treturn z.Mul(x);\n\t\t}\n\t\tstatic public Complex operator* (double x, Complex z)\n\t\t{\n\t\t\treturn z.Mul(x);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 除算\n\t\t/// </summary>\n\t\t/// <returns>z/w</returns>\n\t\tstatic public Complex operator/ (Complex z, Complex w)\n\t\t{\n\t\t\treturn z.Div(w);\n\t\t}\n\t\tstatic public Complex operator/ (Complex z, double x)\n\t\t{\n\t\t\treturn z.Div(x);\n\t\t}\n\t\tstatic public Complex operator/ (double x, Complex z)\n\t\t{\n\t\t\treturn z.Invert().Mul(x);\n\t\t}\n\n\t\t#endregion\n\t\t#region 比較演算子\n\n\t\t/// <summary>\n\t\t/// z と w の値の比較\n\t\t/// </summary>\n\t\tstatic public bool operator== (Complex z, Complex w)\n\t\t{\n\t\t\treturn z.Equals(w);\n\t\t}\n\t\tstatic public bool operator== (Complex z, double x)\n\t\t{\n\t\t\treturn z.Equals(x);\n\t\t}\n\t\tstatic public bool operator== (double x, Complex z)\n\t\t{\n\t\t\treturn z.Equals(x);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// z と w の値の比較\n\t\t/// </summary>\n\t\tstatic public bool operator!= (Complex z, Complex w)\n\t\t{\n\t\t\treturn !z.Equals(w);\n\t\t}\n\t\tstatic public bool operator!= (Complex z, double x)\n\t\t{\n\t\t\treturn !z.Equals(x);\n\t\t}\n\t\tstatic public bool operator!= (double x, Complex z)\n\t\t{\n\t\t\treturn !z.Equals(x);\n\t\t}\n\n\t\t#endregion\n\n\t\t#endregion\n\t\t#region 静的メソッド\n\n\t\tstatic protected double Norm_(double x, double y)\n\t\t{\n\t\t\treturn x*x + y*y;\n\t\t}\n\n\t\tstatic protected double Abs_(double x, double y)\n\t\t{\n\t\t\treturn Math.Sqrt(Norm_(x, y));\n\t\t}\n\n\t\tstatic protected double Arg_(double x, double y)\n\t\t{\n\t\t\treturn Math.Atan2(y, x);\n\t\t}\n\n\t\t#endregion\n\t}//class Complex\n}"
  },
  {
    "path": "Chapters/Old/Complex/PolarComplex.cs",
    "content": "﻿using System;\n\nnamespace MyMath\n{\n\t/// <summary>\n\t/// 複素数クラスの実装2\n\t/// 絶対値と偏角をメンバに持つ\n\t/// 加減算は激遅で、乗除算は高速\n\t/// </summary>\n\tpublic class PolarComplex : Complex\n\t{\n\t\t#region 定数\n\n\t\tprivate const double TwoPI = 2 * Math.PI;\n\t\tstatic public readonly PolarComplex I = new PolarComplex(0, Math.PI);\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic PolarComplex(double r, double t)\n\t\t{\n\t\t\tthis.abs = r;\n\t\t\tthis.arg = t % TwoPI;\n\t\t}\n\n\t\tpublic PolarComplex(Complex z) : this(z.Abs, z.Arg){}\n\t\tpublic PolarComplex(double r) : this(r, 0){}\n\t\tpublic PolarComplex() : this(0, 0){}\n\t\tstatic public implicit operator PolarComplex (double x){return new PolarComplex(x);}\n\n\t\t/// <summary>\n\t\t/// 直行座標からコンストラクト\n\t\t/// </summary>\n\t\t/// <param name=\"x\">実部</param>\n\t\t/// <param name=\"y\">虚部</param>\n\t\tstatic PolarComplex FromCartesian(double x, double y)\n\t\t{\n\t\t\treturn new PolarComplex(Abs_(x, y), Arg_(x, y));\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable メンバ\n\n\t\tpublic override object Clone()\n\t\t{\n\t\t\treturn new PolarComplex(this.abs, this.arg);\n\t\t}\n\n\t\tpublic override bool Equals(object o)\n\t\t{\n\t\t\tif(!(o is Complex))\n\t\t\t\treturn false;\n\n\t\t\tComplex z = (Complex)o;\n\t\t\treturn (this.abs == z.Abs) || (this.arg == z.Arg);\n\t\t}\n\t\tpublic override bool Equals(double x)\n\t\t{\n\t\t\treturn (this.arg == 0) || (this.abs == x);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn this.abs.GetHashCode() ^ this.arg.GetHashCode();\n\t\t}\n\n\t\t#endregion\n\t\t#region override プロパティ\n\n\t\tpublic override double Re\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tdouble im = this.Im;\n\t\t\t\tthis.abs = Abs_(value, im);\n\t\t\t\tthis.arg = Arg_(value, im);\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.abs * Math.Cos(this.arg);\n\t\t\t}\n\t\t}\n\n\t\tpublic override double Im\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tdouble re = this.Re;\n\t\t\t\tthis.abs = Abs_(re, value);\n\t\t\t\tthis.arg = Arg_(re, value);\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.abs * Math.Sin(this.arg);\n\t\t\t}\n\t\t}\n\n\t\tpublic override double Abs\n\t\t{\n\t\t\tset{this.abs = value;}\n\t\t\tget{return this.abs;}\n\t\t}\n\n\t\tpublic override double Arg\n\t\t{\n\t\t\tset{this.arg = value;}\n\t\t\tget{return this.arg;}\n\t\t}\n\n\t\t#endregion\n\t\t#region override メソッド\n\n\t\tpublic override Complex Negate()\n\t\t{\n\t\t\treturn new PolarComplex(this.abs, this.arg + Math.PI);\n\t\t}\n\n\t\tpublic override Complex Invert()\n\t\t{\n\t\t\treturn new PolarComplex(1.0 / this.abs, -this.arg);\n\t\t}\n\n\t\tpublic override Complex Conjugate()\n\t\t{\n\t\t\treturn new PolarComplex(this.abs, -this.arg);\n\t\t}\n\n\t\tpublic override Complex Add(Complex z)\n\t\t{\n\t\t\treturn FromCartesian(this.Re + z.Re, this.Im + z.Im);\n\t\t}\n\t\tpublic override Complex Add(double x)\n\t\t{\n\t\t\treturn FromCartesian(this.Re + x, this.Im);\n\t\t}\n\n\t\tpublic override Complex Sub(Complex z)\n\t\t{\n\t\t\treturn FromCartesian(this.Re - z.Re, this.Im - z.Im);\n\t\t}\n\t\tpublic override Complex Sub(double x)\n\t\t{\n\t\t\treturn FromCartesian(this.Re - x, this.Im);\n\t\t}\n\n\t\tpublic override Complex Mul(Complex z)\n\t\t{\n\t\t\treturn new PolarComplex(this.abs * z.Abs, this.arg + z.Arg);\n\t\t}\n\t\tpublic override Complex Mul(double x)\n\t\t{\n\t\t\treturn new PolarComplex(this.abs * x, this.arg);\n\t\t}\n\n\t\tpublic override Complex Div(Complex z)\n\t\t{\n\t\t\treturn new PolarComplex(this.abs / z.Abs, this.arg - z.Arg);\n\t\t}\n\t\tpublic override Complex Div(double x)\n\t\t{\n\t\t\treturn new PolarComplex(this.abs / x, this.arg);\n\t\t}\n\n\t\tpublic override double Norm()\n\t\t{\n\t\t\treturn this.abs * this.abs;\n\t\t}\n\n\t\t#endregion\n\t\t#region フィールド\n\n\t\tprivate double abs; // 絶対値\n\t\tprivate double arg; // 偏角\n\n\t\t#endregion\n\t}//class PolarComplex\n}\n"
  },
  {
    "path": "Chapters/Old/Complex/makefile",
    "content": "all: MyMath.dll test.exe\n\nMyMath.dll: Complex.cs CartesianComplex.cs PolarComplex.cs AssemblyInfo.cs\n\tcsc /t:library /out:MyMath.dll Complex.cs CartesianComplex.cs PolarComplex.cs AssemblyInfo.cs\n\ntest.exe: test.cs\n\tcsc /r:MyMath.dll test.cs\n"
  },
  {
    "path": "Chapters/Old/Complex/readme.txt",
    "content": "//==============================================================================\n// fNX̃Tv\n\nCopyright(C) 2002 Iwanaga Nobuyuki\ne-mail   : iwanaga@ise.eng.osaka-u.ac.jp\nweb page : http://www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/\n\n//----------------------------------------------------------\n// Tv\n\nf^݂ɋK͂āAvZXs[hœKق̂́A\nstruct Œ`āA public ɂقIǁA\nTvƂƂŁAł͂ĈႤjŎĂ݂܂B\n\ñTvł́Af2̈قȂ@Ŏ܂B\n 1. ƋoƂĎ    CartesianComplex\n 2. ΒlƕΊpoƂĎ  PolarComplex\n\nāÃTvł2̃NX𓯂ۊNX Complex h܂B\n\nBA/Ȃǂɂ̓vpeBʂăANZX邽߁A\n@̈قȂ2̕f^܂`Ԃŗpł܂B\n܂A2̕f^𓯂ۊ^hĂ邽߁A\n2̂ǂ̕f^𗘗pĂ̂ӎɕfvZs܂B\n\n//----------------------------------------------------------\n// Complex NX\n\nComplex NX͈ȉ̑sƂł܂B\n\nE//Βl/Ίp̓ǂݎ/ύX\nE + - * / ɂlZ\nE == != ɂr\nE\n (double^Ƃ̎lZ/r\\)\n\n͈̑ȉ̂悤ɂĎ܂B\n\nE//Βl/Ίp̓ǂݎ/ύX́A\n  ꂼ Re / Im / Abs / Arg ƂÕvpeBʂčsB\nE+ - * / ͎ۂɂ Add / Sub / Mul / Div ƂO\n  \\bhĂяoĎlZsB\nE== !=  Equals \\bhĂяočsB\nERe / Im / Abs / Arg / Add / Sub / Mul / Div / Equals \n  ׂ virtual \\bhŁA|[tBbNȓB\nE񉻂 a+ib Ƃ`ōsB\n  ̂ƂAɌ`ŕ񉻂Aformato͂@\\͂ȂB\n\n//----------------------------------------------------------\n// CartesianComplex NX\n\nCartesianComplex NX͎ƋoƂĎƂ\nComplex NX̂łB\ñNX͈ȉ̂悤ȓ܂B\n\nE/̓ǂݏo/ύXAZZ͍\nEΒl/Ίp̓ǂݏo/ύXAZZ͒ᑬ\n\n//----------------------------------------------------------\n// PolarComplex NX\n\nPolarComplex NX͐ΒlƕΊpoƂĎƂ\nComplex NX̂łB\ñNX͈ȉ̂悤ȓ܂B\n\nE/̓ǂݏo/ύXAZZ͒ᑬ\nEΒl/Ίp̓ǂݏo/ύXAZZ͍\n\n܂ACartesianComplex NXƂ͑IȊ֌WɂȂ܂B\n\n//----------------------------------------------------------\n// t@C\\\n\nComplex.cs          c Complex ̃\\[Xt@CłB\nCartesianComplex.cs c CartesianComplex ̃\\[Xt@CłB\nPolarComplex.cs     c PolarComplex ̃\\[Xt@CłB\ntest.cs             c Complex NX̓߂̃eXgvÕ\\[Xt@CłB\nmakefile            c make R}hpmaket@CłB\nreadme.txt          c ̃eLXgłB\n\n//----------------------------------------------------------\n// RpC\n\nmake sĂB\n\n(.NET Framework SDKɕWŕtĂ make \n \"C:\\Program Files\\Microsoft.NET\\FrameworkSDK\\Bin\\nmake\"\n ɂ܂B܂Acygwin  make Ă͂𗘗pĂ܂܂B)\n\nmake 悭Ȃ̓R}hCňȉ̂悤ɓ͂ĂB\n\ncsc /t:library /out:MyMath.dll Complex.cs CartesianComplex.cs PolarComplex.cs\ncsc /r:MyMath.dll test.cs\n\n܂AR}hC̎gȂŁAVisual Studio .NET̕\nVKvWFNg(C# R\\[AvP[V)쐬A\nComplex.cs  test.cs vWFNgɒǉArhĂB\n\n//----------------------------------------------------------\n// p@\n\ntest.cs KɏėVłB\nComplex.cs KɏĂČ\\łB\noOȂǂ܂񍐂肢܂B\n"
  },
  {
    "path": "Chapters/Old/Complex/test.cs",
    "content": "﻿using System;\n\nnamespace MyMath\n{\n\t/// <summary>\n\t/// Complex クラスの動作確認\n\t/// </summary>\n\tclass TestComplex\n\t{\n\t\tstatic void Main(string[] args)\n\t\t{\n\t\t\tComplex z, w;\n\n\t\t\tz = new CartesianComplex(1, 1);\n\t\t\tw = new CartesianComplex(0, 1);\n\t\t\tShow(z, w); // Cartesian 同士\n\n\t\t\tz = new PolarComplex(Math.Sqrt(2), Math.PI/4);\n\t\t\tShow(z, w); // Polar と Cartesian\n\n\t\t\tw = new PolarComplex(1, Math.PI/2);\n\t\t\tShow(z, w); // Polar 同士\n\n\t\t\tz = new CartesianComplex(1, 1);\n\t\t\tShow(z, w); // Cartesian と Polar\n\t\t}//Main\n\n\t\tstatic void Show(Complex z, Complex w)\n\t\t{\n\t\t\tConsole.Write(\"z = {0}, w = {1}\\n\", z, w);\n\t\t\tConsole.Write(\"|z| = {0}, \", z.Abs);\n\t\t\tConsole.Write(\"||z|| = {0}\\n\", z.Norm());\n\t\t\tConsole.Write(\"∠z = {0}\\n\", z.Arg);\n\t\t\tConsole.Write(\"+z = {0}, \", +z);\n\t\t\tConsole.Write(\"-z = {0}, \", -z);\n\t\t\tConsole.Write(\"~z = {0}\\n\", ~z);\n\t\t\tConsole.Write(\"z + w = {0}, \", z + w);\n\t\t\tConsole.Write(\"z - w = {0}\\n\", z - w);\n\t\t\tConsole.Write(\"z * w = {0}, \", z * w);\n\t\t\tConsole.Write(\"z / w = {0}\\n\", z / w);\n\t\t}\n\t}//class TestComplex\n}//namespace MyMath\n"
  },
  {
    "path": "Chapters/Old/DrawImage/DrawImage.csproj",
    "content": "﻿<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" ToolsVersion=\"Current\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>8.0.50727</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{61D99ECF-D768-40E7-8A97-B31B70773DE0}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>DrawImage</RootNamespace>\n    <AssemblyName>DrawImage</AssemblyName>\n    <FileUpgradeFlags>\n    </FileUpgradeFlags>\n    <UpgradeBackupLocation>\n    </UpgradeBackupLocation>\n    <OldToolsVersion>2.0</OldToolsVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Deployment\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Form1.cs\">\n      <SubType>Form</SubType>\n    </Compile>\n    <Compile Include=\"Form1.Designer.cs\">\n      <DependentUpon>Form1.cs</DependentUpon>\n    </Compile>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <EmbeddedResource Include=\"Form1.resx\">\n      <SubType>Designer</SubType>\n      <DependentUpon>Form1.cs</DependentUpon>\n    </EmbeddedResource>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Resources.resx</DependentUpon>\n      <DesignTime>True</DesignTime>\n    </Compile>\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Old/DrawImage/Form1.Designer.cs",
    "content": "﻿namespace DrawImage\n{\n  partial class Form1\n  {\n    /// <summary>\n    /// 必要なデザイナ変数です。\n    /// </summary>\n    private System.ComponentModel.IContainer components = null;\n\n    /// <summary>\n    /// 使用中のリソースをすべてクリーンアップします。\n    /// </summary>\n    /// <param name=\"disposing\">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>\n    protected override void Dispose(bool disposing)\n    {\n      if (disposing && (components != null))\n      {\n        components.Dispose();\n      }\n      base.Dispose(disposing);\n    }\n\n    #region Windows フォーム デザイナで生成されたコード\n\n    /// <summary>\n    /// デザイナ サポートに必要なメソッドです。このメソッドの内容を\n    /// コード エディタで変更しないでください。\n    /// </summary>\n    private void InitializeComponent()\n    {\n      this.panel1 = new System.Windows.Forms.Panel();\n      this.SuspendLayout();\n      // \n      // panel1\n      // \n      this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)\n                  | System.Windows.Forms.AnchorStyles.Left)\n                  | System.Windows.Forms.AnchorStyles.Right)));\n      this.panel1.BackColor = System.Drawing.Color.White;\n      this.panel1.Location = new System.Drawing.Point(12, 12);\n      this.panel1.Name = \"panel1\";\n      this.panel1.Size = new System.Drawing.Size(268, 249);\n      this.panel1.TabIndex = 0;\n      this.panel1.Resize += new System.EventHandler(this.panel1_Resize);\n      this.panel1.Paint += new System.Windows.Forms.PaintEventHandler(this.panel1_Paint);\n      // \n      // Form1\n      // \n      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);\n      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n      this.ClientSize = new System.Drawing.Size(292, 273);\n      this.Controls.Add(this.panel1);\n      this.Name = \"Form1\";\n      this.Text = \"Form1\";\n      this.ResumeLayout(false);\n\n    }\n\n    #endregion\n\n    private System.Windows.Forms.Panel panel1;\n  }\n}\n\n"
  },
  {
    "path": "Chapters/Old/DrawImage/Form1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Data;\nusing System.Drawing;\nusing System.Text;\nusing System.Windows.Forms;\nusing System.Threading;\n\nnamespace DrawImage\n{\n  delegate void WorkerThread();\n\n  public partial class Form1 : Form\n  {\n    #region 定数定義\n\n    private const int WEIGHT = 10;\n\n    #endregion\n    #region ここの中身を更新してください。\n\n    // 例として、赤い点がパネル中を動き回るプログラム。\n\n    int x = 0;\n    int y = 0;\n    int dx = 3;\n    int dy = 2;\n\n    /// <summary>\n    /// this.panel1 に表示される内容を更新する。\n    /// WEIGHT ミリ秒に1回呼ばれる。\n    /// </summary>\n    /// <param name=\"g\">この g に対する描画が this.panel1 に反映される。</param>\n    /// <param name=\"width\">this.panel1 の幅。</param>\n    /// <param name=\"height\">this.panel1 の高さ。</param>\n    private void UpdatePanel(Graphics g, int width, int height)\n    {\n      x += dx;\n      if (x > width) { x = width; dx = -dx; }\n      else if(x < 0) { x = 0; dx = -dx; }\n      y += dy;\n      if (y > height) { y = height; dy = -dy; }\n      else if(y < 0) { y = 0; dy = -dy; }\n\n      g.Clear(Color.White);\n      g.FillEllipse(new SolidBrush(Color.Red), x, y, 5, 5);\n    }\n\n    #endregion\n    #region 以下、雛形。書き換える必要なし。\n\n    public Form1()\n    {\n      InitializeComponent();\n\n      this.isAlive = true;\n      this.wthread = this.MainThread;\n      this.ar = this.wthread.BeginInvoke(null, null);\n    }\n\n    protected override void OnClosing(CancelEventArgs e)\n    {\n      this.isAlive = false;\n      this.wthread.EndInvoke(this.ar);\n      base.OnClosing(e);\n    }\n\n    private bool isAlive;\n    private Bitmap backBuffer;\n    private WorkerThread wthread;\n    IAsyncResult ar;\n\n    private void MainThread()\n    {\n      while (this.isAlive)\n      {\n        lock (this)\n        {\n          if (this.backBuffer == null)\n          {\n            this.backBuffer = new Bitmap(this.panel1.Width, this.panel1.Height);\n          }\n          Graphics g = Graphics.FromImage(this.backBuffer);\n          this.UpdatePanel(g, this.panel1.Width, this.panel1.Height);\n          g.Dispose();\n        }\n        this.panel1.Invalidate();\n        Thread.Sleep(WEIGHT);\n      }\n    }\n\n    private void panel1_Resize(object sender, EventArgs e)\n    {\n      lock (this)\n      {\n        if (this.backBuffer != null)\n        {\n          this.backBuffer.Dispose();\n          this.backBuffer = null;\n        }\n      }\n    }\n\n    private void panel1_Paint(object sender, PaintEventArgs e)\n    {\n      lock (this)\n      {\n        if (this.backBuffer != null)\n        {\n          e.Graphics.DrawImageUnscaled(this.backBuffer, 0, 0);\n        }\n      }\n    }\n\n    #endregion\n  }\n}"
  },
  {
    "path": "Chapters/Old/DrawImage/Form1.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Chapters/Old/DrawImage/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Windows.Forms;\n\nnamespace DrawImage\n{\n  static class Program\n  {\n    /// <summary>\n    /// アプリケーションのメイン エントリ ポイントです。\n    /// </summary>\n    [STAThread]\n    static void Main()\n    {\n      Application.EnableVisualStyles();\n      Application.SetCompatibleTextRenderingDefault(false);\n      Application.Run(new Form1());\n    }\n  }\n}"
  },
  {
    "path": "Chapters/Old/DrawImage/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。 \n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"DrawImage\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"DrawImage\")]\n[assembly: AssemblyCopyright(\"Copyright (C)  2006\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、このアセンブリ内の型は COM コンポーネントには \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、 \n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"3de07a25-3e02-4d79-8dfd-61f246b1a376\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Old/DrawImage/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace DrawImage.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"16.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"DrawImage.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/DrawImage/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Chapters/Old/DrawImage/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace DrawImage.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"16.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/DrawImage/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"http://schemas.microsoft.com/VisualStudio/2004/01/settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/Gma.UserActivityMonitor/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\n\n// Information about this assembly is defined by the following\n// attributes.\n//\n// change them to the information which is associated with the assembly\n// you compile.\n\n[assembly: AssemblyTitle(\"Gma.UserActivity\")]\n[assembly: AssemblyDescription(\"This class library contains components which monitor all mouse and keyboard activities globally (also outside of the application) and provides appropriate events.\")]\n[assembly: AssemblyCompany(\"George Mamaladze\")]\n[assembly: AssemblyProduct(\"Gma.UserActivity\")]\n[assembly: AssemblyCopyright(\"Free to use, copy, modify and redistribute\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// The assembly version has following format :\n//\n// Major.Minor.Build.Revision\n//\n// You can specify all values by your own or you can build default build and revision\n// numbers with the '*' character (the default):\n\n[assembly: AssemblyVersion(\"1.0.0\")]\n\n// The following attributes specify the key for the sign of your assembly. See the\n// .NET Framework documentation for more information about signing.\n// This is not required, if you don't want signing let these attributes like they're.\n[assembly: AssemblyDelaySign(false)]\n[assembly: AssemblyKeyFile(\"\")]\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/Gma.UserActivityMonitor/GlobalEventProvider.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Windows.Forms;\n\nnamespace Gma.UserActivityMonitor\n{\n    /// <summary>\n    /// This component monitors all mouse activities globally (also outside of the application) \n    /// and provides appropriate events.\n    /// </summary>\n    public class GlobalEventProvider : Component\n    {\n        /// <summary>\n        /// This component raises events. The value is always true.\n        /// </summary>\n        protected override bool CanRaiseEvents\n        {\n            get\n            {\n                return true;\n            }\n        }\n\n        //################################################################\n        #region Mouse events\n\n        private event MouseEventHandler m_MouseMove;\n\n        /// <summary>\n        /// Occurs when the mouse pointer is moved. \n        /// </summary>\n        public event MouseEventHandler MouseMove\n        {\n            add\n            {\n                if (m_MouseMove == null)\n                {\n                    HookManager.MouseMove += HookManager_MouseMove;\n                }\n                m_MouseMove += value;\n            }\n\n            remove\n            {\n                m_MouseMove -= value;\n                if (m_MouseMove == null)\n                {\n                    HookManager.MouseMove -= HookManager_MouseMove;\n                }\n            }\n        }\n\n        void HookManager_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (m_MouseMove != null)\n            {\n                m_MouseMove.Invoke(this, e);\n            }\n        }\n\n        private event MouseEventHandler m_MouseClick;\n        /// <summary>\n        /// Occurs when a click was performed by the mouse. \n        /// </summary>\n        public event MouseEventHandler MouseClick\n        {\n            add\n            {\n                if (m_MouseClick == null)\n                {\n                    HookManager.MouseClick += HookManager_MouseClick;\n                }\n                m_MouseClick += value;\n            }\n\n            remove\n            {\n                m_MouseClick -= value;\n                if (m_MouseClick == null)\n                {\n                    HookManager.MouseClick -= HookManager_MouseClick;\n                }\n            }\n        }\n\n        void HookManager_MouseClick(object sender, MouseEventArgs e)\n        {\n            if (m_MouseClick != null)\n            {\n                m_MouseClick.Invoke(this, e);\n            }\n        }\n\n        private event MouseEventHandler m_MouseDown;\n\n        /// <summary>\n        /// Occurs when the mouse a mouse button is pressed. \n        /// </summary>\n        public event MouseEventHandler MouseDown\n        {\n            add\n            {\n                if (m_MouseDown == null)\n                {\n                    HookManager.MouseDown += HookManager_MouseDown;\n                }\n                m_MouseDown += value;\n            }\n\n            remove\n            {\n                m_MouseDown -= value;\n                if (m_MouseDown == null)\n                {\n                    HookManager.MouseDown -= HookManager_MouseDown;\n                }\n            }\n        }\n\n        void HookManager_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (m_MouseDown != null)\n            {\n                m_MouseDown.Invoke(this, e);\n            }\n        }\n\n\n        private event MouseEventHandler m_MouseUp;\n\n        /// <summary>\n        /// Occurs when a mouse button is released. \n        /// </summary>\n        public event MouseEventHandler MouseUp\n        {\n            add\n            {\n                if (m_MouseUp == null)\n                {\n                    HookManager.MouseUp += HookManager_MouseUp;\n                }\n                m_MouseUp += value;\n            }\n\n            remove\n            {\n                m_MouseUp -= value;\n                if (m_MouseUp == null)\n                {\n                    HookManager.MouseUp -= HookManager_MouseUp;\n                }\n            }\n        }\n\n        void HookManager_MouseUp(object sender, MouseEventArgs e)\n        {\n            if (m_MouseUp != null)\n            {\n                m_MouseUp.Invoke(this, e);\n            }\n        }\n\n        private event MouseEventHandler m_MouseDoubleClick;\n\n        /// <summary>\n        /// Occurs when a double clicked was performed by the mouse. \n        /// </summary>\n        public event MouseEventHandler MouseDoubleClick\n        {\n            add\n            {\n                if (m_MouseDoubleClick == null)\n                {\n                    HookManager.MouseDoubleClick += HookManager_MouseDoubleClick;\n                }\n                m_MouseDoubleClick += value;\n            }\n\n            remove\n            {\n                m_MouseDoubleClick -= value;\n                if (m_MouseDoubleClick == null)\n                {\n                    HookManager.MouseDoubleClick -= HookManager_MouseDoubleClick;\n                }\n            }\n        }\n\n        void HookManager_MouseDoubleClick(object sender, MouseEventArgs e)\n        {\n            if (m_MouseDoubleClick != null)\n            {\n                m_MouseDoubleClick.Invoke(this, e);\n            }\n        }\n\n\n        private event EventHandler<MouseEventExtArgs> m_MouseMoveExt;\n\n        /// <summary>\n        /// Occurs when the mouse pointer is moved. \n        /// </summary>\n        /// <remarks>\n        /// This event provides extended arguments of type <see cref=\"MouseEventArgs\"/> enabling you to \n        /// supress further processing of mouse movement in other applications.\n        /// </remarks>\n        public event EventHandler<MouseEventExtArgs> MouseMoveExt\n        {\n            add\n            {\n                if (m_MouseMoveExt == null)\n                {\n                    HookManager.MouseMoveExt += HookManager_MouseMoveExt;\n                }\n                m_MouseMoveExt += value;\n            }\n\n            remove\n            {\n                m_MouseMoveExt -= value;\n                if (m_MouseMoveExt == null)\n                {\n                    HookManager.MouseMoveExt -= HookManager_MouseMoveExt;\n                }\n            }\n        }\n\n        void HookManager_MouseMoveExt(object sender, MouseEventExtArgs e)\n        {\n            if (m_MouseMoveExt != null)\n            {\n                m_MouseMoveExt.Invoke(this, e);\n            }\n        }\n\n        private event EventHandler<MouseEventExtArgs> m_MouseClickExt;\n\n        /// <summary>\n        /// Occurs when a click was performed by the mouse. \n        /// </summary>\n        /// <remarks>\n        /// This event provides extended arguments of type <see cref=\"MouseEventArgs\"/> enabling you to \n        /// supress further processing of mouse click in other applications.\n        /// </remarks>\n        public event EventHandler<MouseEventExtArgs> MouseClickExt\n        {\n            add\n            {\n                if (m_MouseClickExt == null)\n                {\n                    HookManager.MouseClickExt += HookManager_MouseClickExt;\n                }\n                m_MouseClickExt += value;\n            }\n\n            remove\n            {\n                m_MouseClickExt -= value;\n                if (m_MouseClickExt == null)\n                {\n                    HookManager.MouseClickExt -= HookManager_MouseClickExt;\n                }\n            }\n        }\n\n        void HookManager_MouseClickExt(object sender, MouseEventExtArgs e)\n        {\n            if (m_MouseClickExt != null)\n            {\n                m_MouseClickExt.Invoke(this, e);\n            }\n        }\n\n\n        #endregion\n\n        //################################################################\n        #region Keyboard events\n\n        private event KeyPressEventHandler m_KeyPress;\n\n        /// <summary>\n        /// Occurs when a key is pressed.\n        /// </summary>\n        /// <remarks>\n        /// Key events occur in the following order: \n        /// <list type=\"number\">\n        /// <item>KeyDown</item>\n        /// <item>KeyPress</item>\n        /// <item>KeyUp</item>\n        /// </list>\n        ///The KeyPress event is not raised by noncharacter keys; however, the noncharacter keys do raise the KeyDown and KeyUp events. \n        ///Use the KeyChar property to sample keystrokes at run time and to consume or modify a subset of common keystrokes. \n        ///To handle keyboard events only in your application and not enable other applications to receive keyboard events, \n        /// set the KeyPressEventArgs.Handled property in your form's KeyPress event-handling method to <b>true</b>. \n        /// </remarks>\n        public event KeyPressEventHandler KeyPress\n        {\n            add\n            {\n                if (m_KeyPress==null)\n                {\n                    HookManager.KeyPress +=HookManager_KeyPress;\n                }\n                m_KeyPress += value;\n            }\n            remove\n            {\n                m_KeyPress -= value;\n                if (m_KeyPress == null)\n                {\n                    HookManager.KeyPress -= HookManager_KeyPress;\n                }\n            }\n        }\n\n        void HookManager_KeyPress(object sender, KeyPressEventArgs e)\n        {\n            if (m_KeyPress != null)\n            {\n                m_KeyPress.Invoke(this, e);\n            }\n        }\n\n        private event KeyEventHandler m_KeyUp;\n\n        /// <summary>\n        /// Occurs when a key is released. \n        /// </summary>\n        public event KeyEventHandler KeyUp\n        {\n            add\n            {\n                if (m_KeyUp == null)\n                {\n                    HookManager.KeyUp += HookManager_KeyUp;\n                }\n                m_KeyUp += value;\n            }\n            remove\n            {\n                m_KeyUp -= value;\n                if (m_KeyUp == null)\n                {\n                    HookManager.KeyUp -= HookManager_KeyUp;\n                }\n            }\n        }\n\n        private void HookManager_KeyUp(object sender, KeyEventArgs e)\n        {\n            if (m_KeyUp != null)\n            {\n                m_KeyUp.Invoke(this, e);\n            }\n        }\n\n        private event KeyEventHandler m_KeyDown;\n\n        /// <summary>\n        /// Occurs when a key is preseed. \n        /// </summary>\n        public event KeyEventHandler KeyDown\n        {\n            add\n            {\n                if (m_KeyDown == null)\n                {\n                    HookManager.KeyDown += HookManager_KeyDown;\n                }\n                m_KeyDown += value;\n            }\n            remove\n            {\n                m_KeyDown -= value;\n                if (m_KeyDown == null)\n                {\n                    HookManager.KeyDown -= HookManager_KeyDown;\n                }\n            }\n        }\n\n        private void HookManager_KeyDown(object sender, KeyEventArgs e)\n        {\n            m_KeyDown.Invoke(this, e);\n        }\n\n        #endregion\n\n        \n    }\n}\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/Gma.UserActivityMonitor/Gma.UserActivityMonitor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" ToolsVersion=\"14.0\">\n  <PropertyGroup>\n    <ProjectType>Local</ProjectType>\n    <ProductVersion>9.0.21022</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{F52AA97E-180A-40ED-8F2B-09080171D6C7}</ProjectGuid>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ApplicationIcon>\n    </ApplicationIcon>\n    <AssemblyKeyContainerName>\n    </AssemblyKeyContainerName>\n    <AssemblyName>Gma.UserActivityMonitor</AssemblyName>\n    <AssemblyOriginatorKeyFile>\n    </AssemblyOriginatorKeyFile>\n    <DefaultClientScript>JScript</DefaultClientScript>\n    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>\n    <DefaultTargetSchema>IE50</DefaultTargetSchema>\n    <DelaySign>false</DelaySign>\n    <OutputType>Library</OutputType>\n    <RootNamespace>Gma.UserActivityMonitor</RootNamespace>\n    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>\n    <StartupObject>\n    </StartupObject>\n    <FileUpgradeFlags>\n    </FileUpgradeFlags>\n    <UpgradeBackupLocation>\n    </UpgradeBackupLocation>\n    <IsWebBootstrapper>true</IsWebBootstrapper>\n    <OldToolsVersion>3.5</OldToolsVersion>\n    <PublishUrl>http://localhost/GlobalHookDemo/</PublishUrl>\n    <Install>true</Install>\n    <InstallFrom>Web</InstallFrom>\n    <UpdateEnabled>true</UpdateEnabled>\n    <UpdateMode>Foreground</UpdateMode>\n    <UpdateInterval>7</UpdateInterval>\n    <UpdateIntervalUnits>Days</UpdateIntervalUnits>\n    <UpdatePeriodically>false</UpdatePeriodically>\n    <UpdateRequired>false</UpdateRequired>\n    <MapFileExtensions>true</MapFileExtensions>\n    <ApplicationRevision>0</ApplicationRevision>\n    <ApplicationVersion>2.0.0.%2a</ApplicationVersion>\n    <UseApplicationTrust>false</UseApplicationTrust>\n    <BootstrapperEnabled>true</BootstrapperEnabled>\n    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>\n    <BaseAddress>285212672</BaseAddress>\n    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>\n    <ConfigurationOverrideFile>\n    </ConfigurationOverrideFile>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <DocumentationFile>bin\\Debug\\Gma.xml</DocumentationFile>\n    <DebugSymbols>true</DebugSymbols>\n    <FileAlignment>4096</FileAlignment>\n    <NoStdLib>false</NoStdLib>\n    <NoWarn>\n    </NoWarn>\n    <Optimize>false</Optimize>\n    <RegisterForComInterop>false</RegisterForComInterop>\n    <RemoveIntegerChecks>false</RemoveIntegerChecks>\n    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\n    <WarningLevel>4</WarningLevel>\n    <DebugType>full</DebugType>\n    <ErrorReport>prompt</ErrorReport>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>\n    <BaseAddress>285212672</BaseAddress>\n    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>\n    <ConfigurationOverrideFile>\n    </ConfigurationOverrideFile>\n    <DefineConstants>TRACE</DefineConstants>\n    <DocumentationFile>\n    </DocumentationFile>\n    <DebugSymbols>false</DebugSymbols>\n    <FileAlignment>4096</FileAlignment>\n    <NoStdLib>false</NoStdLib>\n    <NoWarn>\n    </NoWarn>\n    <Optimize>true</Optimize>\n    <RegisterForComInterop>false</RegisterForComInterop>\n    <RemoveIntegerChecks>false</RemoveIntegerChecks>\n    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\n    <WarningLevel>4</WarningLevel>\n    <DebugType>none</DebugType>\n    <ErrorReport>prompt</ErrorReport>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\">\n      <Name>System</Name>\n    </Reference>\n    <Reference Include=\"System.Data\">\n      <Name>System.Data</Name>\n    </Reference>\n    <Reference Include=\"System.Drawing\">\n      <Name>System.Drawing</Name>\n    </Reference>\n    <Reference Include=\"System.Windows.Forms\">\n      <Name>System.Windows.Forms</Name>\n    </Reference>\n    <Reference Include=\"System.Xml\">\n      <Name>System.XML</Name>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"GlobalEventProvider.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"HookManager.Callbacks.cs\" />\n    <Compile Include=\"HookManager.cs\" />\n    <Compile Include=\"HookManager.Structures.cs\" />\n    <Compile Include=\"HookManager.Windows.cs\" />\n    <Compile Include=\"MouseEventExtArgs.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <BootstrapperPackage Include=\"Microsoft.Net.Framework.2.0\">\n      <Visible>False</Visible>\n      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>\n      <Install>true</Install>\n    </BootstrapperPackage>\n    <BootstrapperPackage Include=\"Microsoft.Net.Framework.3.0\">\n      <Visible>False</Visible>\n      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>\n      <Install>false</Install>\n    </BootstrapperPackage>\n    <BootstrapperPackage Include=\"Microsoft.Net.Framework.3.5\">\n      <Visible>False</Visible>\n      <ProductName>.NET Framework 3.5</ProductName>\n      <Install>false</Install>\n    </BootstrapperPackage>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PreBuildEvent>\n    </PreBuildEvent>\n    <PostBuildEvent>\n    </PostBuildEvent>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "Chapters/Old/KeyLogger/Gma.UserActivityMonitor/HookManager.Callbacks.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Windows.Forms;\n\nnamespace Gma.UserActivityMonitor\n{\n    public static partial class HookManager\n    {\n        /// <summary>\n        /// The CallWndProc hook procedure is an application-defined or library-defined callback \n        /// function used with the SetWindowsHookEx function. The HOOKPROC type defines a pointer \n        /// to this callback function. CallWndProc is a placeholder for the application-defined \n        /// or library-defined function name.\n        /// </summary>\n        /// <param name=\"nCode\">\n        /// [in] Specifies whether the hook procedure must process the message. \n        /// If nCode is HC_ACTION, the hook procedure must process the message. \n        /// If nCode is less than zero, the hook procedure must pass the message to the \n        /// CallNextHookEx function without further processing and must return the \n        /// value returned by CallNextHookEx.\n        /// </param>\n        /// <param name=\"wParam\">\n        /// [in] Specifies whether the message was sent by the current thread. \n        /// If the message was sent by the current thread, it is nonzero; otherwise, it is zero. \n        /// </param>\n        /// <param name=\"lParam\">\n        /// [in] Pointer to a CWPSTRUCT structure that contains details about the message. \n        /// </param>\n        /// <returns>\n        /// If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx. \n        /// If nCode is greater than or equal to zero, it is highly recommended that you call CallNextHookEx \n        /// and return the value it returns; otherwise, other applications that have installed WH_CALLWNDPROC \n        /// hooks will not receive hook notifications and may behave incorrectly as a result. If the hook \n        /// procedure does not call CallNextHookEx, the return value should be zero. \n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/callwndproc.asp\n        /// </remarks>\n        private delegate int HookProc(int nCode, int wParam, IntPtr lParam);\n\n        //##############################################################################\n        #region Mouse hook processing\n\n        /// <summary>\n        /// This field is not objectively needed but we need to keep a reference on a delegate which will be \n        /// passed to unmanaged code. To avoid GC to clean it up.\n        /// When passing delegates to unmanaged code, they must be kept alive by the managed application \n        /// until it is guaranteed that they will never be called.\n        /// </summary>\n        private static HookProc s_MouseDelegate;\n\n        /// <summary>\n        /// Stores the handle to the mouse hook procedure.\n        /// </summary>\n        private static int s_MouseHookHandle;\n\n        private static int m_OldX;\n        private static int m_OldY;\n\n        /// <summary>\n        /// A callback function which will be called every Time a mouse activity detected.\n        /// </summary>\n        /// <param name=\"nCode\">\n        /// [in] Specifies whether the hook procedure must process the message. \n        /// If nCode is HC_ACTION, the hook procedure must process the message. \n        /// If nCode is less than zero, the hook procedure must pass the message to the \n        /// CallNextHookEx function without further processing and must return the \n        /// value returned by CallNextHookEx.\n        /// </param>\n        /// <param name=\"wParam\">\n        /// [in] Specifies whether the message was sent by the current thread. \n        /// If the message was sent by the current thread, it is nonzero; otherwise, it is zero. \n        /// </param>\n        /// <param name=\"lParam\">\n        /// [in] Pointer to a CWPSTRUCT structure that contains details about the message. \n        /// </param>\n        /// <returns>\n        /// If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx. \n        /// If nCode is greater than or equal to zero, it is highly recommended that you call CallNextHookEx \n        /// and return the value it returns; otherwise, other applications that have installed WH_CALLWNDPROC \n        /// hooks will not receive hook notifications and may behave incorrectly as a result. If the hook \n        /// procedure does not call CallNextHookEx, the return value should be zero. \n        /// </returns>\n        private static int MouseHookProc(int nCode, int wParam, IntPtr lParam)\n        {\n            if (nCode >= 0)\n            {\n                //Marshall the data from callback.\n                MouseLLHookStruct mouseHookStruct = (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));\n\n                //detect button clicked\n                MouseButtons button = MouseButtons.None;\n                short mouseDelta = 0;\n                int clickCount = 0;\n                bool mouseDown = false;\n                bool mouseUp = false;\n\n                switch (wParam)\n                {\n                    case WM_LBUTTONDOWN:\n                        mouseDown = true;\n                        button = MouseButtons.Left;\n                        clickCount = 1;\n                        break;\n                    case WM_LBUTTONUP:\n                        mouseUp = true;\n                        button = MouseButtons.Left;\n                        clickCount = 1;\n                        break;\n                    case WM_LBUTTONDBLCLK: \n                        button = MouseButtons.Left;\n                        clickCount = 2;\n                        break;\n                    case WM_RBUTTONDOWN:\n                        mouseDown = true;\n                        button = MouseButtons.Right;\n                        clickCount = 1;\n                        break;\n                    case WM_RBUTTONUP:\n                        mouseUp = true;\n                        button = MouseButtons.Right;\n                        clickCount = 1;\n                        break;\n                    case WM_RBUTTONDBLCLK: \n                        button = MouseButtons.Right;\n                        clickCount = 2;\n                        break;\n                    case WM_MOUSEWHEEL:\n                        //If the message is WM_MOUSEWHEEL, the high-order word of MouseData member is the wheel delta. \n                        //One wheel click is defined as WHEEL_DELTA, which is 120. \n                        //(value >> 16) & 0xffff; retrieves the high-order word from the given 32-bit value\n                        mouseDelta = (short)((mouseHookStruct.MouseData >> 16) & 0xffff);\n                       \n                    //TODO: X BUTTONS (I havent them so was unable to test)\n                        //If the message is WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, \n                        //or WM_NCXBUTTONDBLCLK, the high-order word specifies which X button was pressed or released, \n                        //and the low-order word is reserved. This value can be one or more of the following values. \n                        //Otherwise, MouseData is not used. \n                        break;\n                }\n\n                //generate event \n                MouseEventExtArgs e = new MouseEventExtArgs(\n                                                   button,\n                                                   clickCount,\n                                                   mouseHookStruct.Point.X,\n                                                   mouseHookStruct.Point.Y,\n                                                   mouseDelta);\n\n                //Mouse up\n                if (s_MouseUp!=null && mouseUp)\n                {\n                    s_MouseUp.Invoke(null, e);\n                }\n\n                //Mouse down\n                if (s_MouseDown != null && mouseDown)\n                {\n                    s_MouseDown.Invoke(null, e);\n                }\n\n                //If someone listens to click and a click is heppened\n                if (s_MouseClick != null && clickCount>0)\n                {\n                    s_MouseClick.Invoke(null, e);\n                }\n\n                //If someone listens to click and a click is heppened\n                if (s_MouseClickExt != null && clickCount > 0)\n                {\n                    s_MouseClickExt.Invoke(null, e);\n                }\n\n                //If someone listens to double click and a click is heppened\n                if (s_MouseDoubleClick != null && clickCount == 2)\n                {\n                    s_MouseDoubleClick.Invoke(null, e);\n                }\n\n                //Wheel was moved\n                if (s_MouseWheel!=null && mouseDelta!=0)\n                {\n                    s_MouseWheel.Invoke(null, e);\n                }\n\n                //If someone listens to move and there was a change in coordinates raise move event\n                if ((s_MouseMove!=null || s_MouseMoveExt!=null) && (m_OldX != mouseHookStruct.Point.X || m_OldY != mouseHookStruct.Point.Y))\n                {\n                    m_OldX = mouseHookStruct.Point.X;\n                    m_OldY = mouseHookStruct.Point.Y;\n                    if (s_MouseMove != null)\n                    {\n                        s_MouseMove.Invoke(null, e);\n                    }\n\n                    if (s_MouseMoveExt != null)\n                    {\n                        s_MouseMoveExt.Invoke(null, e);\n                    }\n                }\n\n                if (e.Handled)\n                {\n                    return -1;\n                }\n            }\n\n            //call next hook\n            return CallNextHookEx(s_MouseHookHandle, nCode, wParam, lParam);\n        }\n\n        private static void EnsureSubscribedToGlobalMouseEvents()\n        {\n            // install Mouse hook only if it is not installed and must be installed\n            if (s_MouseHookHandle == 0)\n            {\n                //See comment of this field. To avoid GC to clean it up.\n                s_MouseDelegate = MouseHookProc;\n                //install hook\n                s_MouseHookHandle = SetWindowsHookEx(\n                    WH_MOUSE_LL,\n                    s_MouseDelegate,\n                    Marshal.GetHINSTANCE(\n                        Assembly.GetExecutingAssembly().GetModules()[0]),\n                    0);\n                //If SetWindowsHookEx fails.\n                if (s_MouseHookHandle == 0)\n                {\n                    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. \n                    int errorCode = Marshal.GetLastWin32Error();\n                    //do cleanup\n\n                    //Initializes and throws a new instance of the Win32Exception class with the specified error. \n                    throw new Win32Exception(errorCode);\n                }\n            }\n        }\n\n        private static void TryUnsubscribeFromGlobalMouseEvents()\n        {\n            //if no subsribers are registered unsubsribe from hook\n            if (s_MouseClick == null &&\n                s_MouseDown == null &&\n                s_MouseMove == null &&\n                s_MouseUp == null &&\n                s_MouseClickExt == null &&\n                s_MouseMoveExt == null &&\n                s_MouseWheel == null)\n            {\n                ForceUnsunscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static void ForceUnsunscribeFromGlobalMouseEvents()\n        {\n            if (s_MouseHookHandle != 0)\n            {\n                //uninstall hook\n                int result = UnhookWindowsHookEx(s_MouseHookHandle);\n                //reset invalid handle\n                s_MouseHookHandle = 0;\n                //Free up for GC\n                s_MouseDelegate = null;\n                //if failed and exception must be thrown\n                if (result == 0)\n                {\n                    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. \n                    int errorCode = Marshal.GetLastWin32Error();\n                    //Initializes and throws a new instance of the Win32Exception class with the specified error. \n                    throw new Win32Exception(errorCode);\n                }\n            }\n        }\n        \n        #endregion\n\n        //##############################################################################\n        #region Keyboard hook processing\n\n        /// <summary>\n        /// This field is not objectively needed but we need to keep a reference on a delegate which will be \n        /// passed to unmanaged code. To avoid GC to clean it up.\n        /// When passing delegates to unmanaged code, they must be kept alive by the managed application \n        /// until it is guaranteed that they will never be called.\n        /// </summary>\n        private static HookProc s_KeyboardDelegate;\n\n        /// <summary>\n        /// Stores the handle to the Keyboard hook procedure.\n        /// </summary>\n        private static int s_KeyboardHookHandle;\n\n        /// <summary>\n        /// A callback function which will be called every Time a keyboard activity detected.\n        /// </summary>\n        /// <param name=\"nCode\">\n        /// [in] Specifies whether the hook procedure must process the message. \n        /// If nCode is HC_ACTION, the hook procedure must process the message. \n        /// If nCode is less than zero, the hook procedure must pass the message to the \n        /// CallNextHookEx function without further processing and must return the \n        /// value returned by CallNextHookEx.\n        /// </param>\n        /// <param name=\"wParam\">\n        /// [in] Specifies whether the message was sent by the current thread. \n        /// If the message was sent by the current thread, it is nonzero; otherwise, it is zero. \n        /// </param>\n        /// <param name=\"lParam\">\n        /// [in] Pointer to a CWPSTRUCT structure that contains details about the message. \n        /// </param>\n        /// <returns>\n        /// If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx. \n        /// If nCode is greater than or equal to zero, it is highly recommended that you call CallNextHookEx \n        /// and return the value it returns; otherwise, other applications that have installed WH_CALLWNDPROC \n        /// hooks will not receive hook notifications and may behave incorrectly as a result. If the hook \n        /// procedure does not call CallNextHookEx, the return value should be zero. \n        /// </returns>\n        private static int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)\n        {\n            //indicates if any of underlaing events set e.Handled flag\n            bool handled = false;\n\n            if (nCode >= 0)\n            {\n                //read structure KeyboardHookStruct at lParam\n                KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));\n                //raise KeyDown\n                if (s_KeyDown != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))\n                {\n                    Keys keyData = (Keys)MyKeyboardHookStruct.VirtualKeyCode;\n                    KeyEventArgs e = new KeyEventArgs(keyData);\n                    s_KeyDown.Invoke(null, e);\n                    handled = e.Handled;\n                }\n\n                // raise KeyPress\n                if (s_KeyPress != null && wParam == WM_KEYDOWN)\n                {\n                    bool isDownShift = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? true : false);\n                    bool isDownCapslock = (GetKeyState(VK_CAPITAL) != 0 ? true : false);\n\n                    byte[] keyState = new byte[256];\n                    GetKeyboardState(keyState);\n                    byte[] inBuffer = new byte[2];\n                    if (ToAscii(MyKeyboardHookStruct.VirtualKeyCode,\n                              MyKeyboardHookStruct.ScanCode,\n                              keyState,\n                              inBuffer,\n                              MyKeyboardHookStruct.Flags) == 1)\n                    {\n                        char key = (char)inBuffer[0];\n                        if ((isDownCapslock ^ isDownShift) && Char.IsLetter(key)) key = Char.ToUpper(key);\n                        KeyPressEventArgs e = new KeyPressEventArgs(key);\n                        s_KeyPress.Invoke(null, e);\n                        handled = handled || e.Handled;\n                    }\n                }\n\n                // raise KeyUp\n                if (s_KeyUp != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))\n                {\n                    Keys keyData = (Keys)MyKeyboardHookStruct.VirtualKeyCode;\n                    KeyEventArgs e = new KeyEventArgs(keyData);\n                    s_KeyUp.Invoke(null, e);\n                    handled = handled || e.Handled;\n                }\n\n            }\n\n            //if event handled in application do not handoff to other listeners\n            if (handled)\n                return -1;\n\n            //forward to other application\n            return CallNextHookEx(s_KeyboardHookHandle, nCode, wParam, lParam);\n        }\n\n        private static void EnsureSubscribedToGlobalKeyboardEvents()\n        {\n            // install Keyboard hook only if it is not installed and must be installed\n            if (s_KeyboardHookHandle == 0)\n            {\n                //See comment of this field. To avoid GC to clean it up.\n                s_KeyboardDelegate = KeyboardHookProc;\n                //install hook\n                s_KeyboardHookHandle = SetWindowsHookEx(\n                    WH_KEYBOARD_LL,\n                    s_KeyboardDelegate,\n                    Marshal.GetHINSTANCE(\n                        Assembly.GetExecutingAssembly().GetModules()[0]),\n                    0);\n                //If SetWindowsHookEx fails.\n                if (s_KeyboardHookHandle == 0)\n                {\n                    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. \n                    int errorCode = Marshal.GetLastWin32Error();\n                    //do cleanup\n\n                    //Initializes and throws a new instance of the Win32Exception class with the specified error. \n                    throw new Win32Exception(errorCode);\n                }\n            }\n        }\n\n        private static void TryUnsubscribeFromGlobalKeyboardEvents()\n        {\n            //if no subsribers are registered unsubsribe from hook\n            if (s_KeyDown == null &&\n                s_KeyUp == null &&\n                s_KeyPress == null)\n            {\n                ForceUnsunscribeFromGlobalKeyboardEvents();\n            }\n        }\n\n        private static void ForceUnsunscribeFromGlobalKeyboardEvents()\n        {\n            if (s_KeyboardHookHandle != 0)\n            {\n                //uninstall hook\n                int result = UnhookWindowsHookEx(s_KeyboardHookHandle);\n                //reset invalid handle\n                s_KeyboardHookHandle = 0;\n                //Free up for GC\n                s_KeyboardDelegate = null;\n                //if failed and exception must be thrown\n                if (result == 0)\n                {\n                    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. \n                    int errorCode = Marshal.GetLastWin32Error();\n                    //Initializes and throws a new instance of the Win32Exception class with the specified error. \n                    throw new Win32Exception(errorCode);\n                }\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/Gma.UserActivityMonitor/HookManager.Structures.cs",
    "content": "﻿using System.Runtime.InteropServices;\n\nnamespace Gma.UserActivityMonitor {\n\n    public static partial class HookManager {\n        /// <summary>\n        /// The Point structure defines the X- and Y- coordinates of a point. \n        /// </summary>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/rectangl_0tiq.asp\n        /// </remarks>\n        [StructLayout(LayoutKind.Sequential)]\n        private struct Point {\n            /// <summary>\n            /// Specifies the X-coordinate of the point. \n            /// </summary>\n            public int X;\n            /// <summary>\n            /// Specifies the Y-coordinate of the point. \n            /// </summary>\n            public int Y;\n        }\n\n        /// <summary>\n        /// The MSLLHOOKSTRUCT structure contains information about a low-level keyboard input event. \n        /// </summary>\n        [StructLayout(LayoutKind.Sequential)]\n        private struct MouseLLHookStruct {\n            /// <summary>\n            /// Specifies a Point structure that contains the X- and Y-coordinates of the cursor, in screen coordinates. \n            /// </summary>\n            public Point Point;\n            /// <summary>\n            /// If the message is WM_MOUSEWHEEL, the high-order word of this member is the wheel delta. \n            /// The low-order word is reserved. A positive value indicates that the wheel was rotated forward, \n            /// away from the user; a negative value indicates that the wheel was rotated backward, toward the user. \n            /// One wheel click is defined as WHEEL_DELTA, which is 120. \n            ///If the message is WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP,\n            /// or WM_NCXBUTTONDBLCLK, the high-order word specifies which X button was pressed or released, \n            /// and the low-order word is reserved. This value can be one or more of the following values. Otherwise, MouseData is not used. \n            ///XBUTTON1\n            ///The first X button was pressed or released.\n            ///XBUTTON2\n            ///The second X button was pressed or released.\n            /// </summary>\n            public int MouseData;\n            /// <summary>\n            /// Specifies the event-injected flag. An application can use the following value to test the mouse Flags. Value Purpose \n            ///LLMHF_INJECTED Test the event-injected flag.  \n            ///0\n            ///Specifies whether the event was injected. The value is 1 if the event was injected; otherwise, it is 0.\n            ///1-15\n            ///Reserved.\n            /// </summary>\n            public int Flags;\n            /// <summary>\n            /// Specifies the Time stamp for this message.\n            /// </summary>\n            public int Time;\n            /// <summary>\n            /// Specifies extra information associated with the message. \n            /// </summary>\n            public int ExtraInfo;\n        }\n\n        /// <summary>\n        /// The KBDLLHOOKSTRUCT structure contains information about a low-level keyboard input event. \n        /// </summary>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookstructures/cwpstruct.asp\n        /// </remarks>\n        [StructLayout(LayoutKind.Sequential)]\n        private struct KeyboardHookStruct\n        {\n            /// <summary>\n            /// Specifies a virtual-key code. The code must be a value in the range 1 to 254. \n            /// </summary>\n            public int VirtualKeyCode;\n            /// <summary>\n            /// Specifies a hardware scan code for the key. \n            /// </summary>\n            public int ScanCode;\n            /// <summary>\n            /// Specifies the extended-key flag, event-injected flag, context code, and transition-state flag.\n            /// </summary>\n            public int Flags;\n            /// <summary>\n            /// Specifies the Time stamp for this message.\n            /// </summary>\n            public int Time;\n            /// <summary>\n            /// Specifies extra information associated with the message. \n            /// </summary>\n            public int ExtraInfo;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/Gma.UserActivityMonitor/HookManager.Windows.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace Gma.UserActivityMonitor\n{\n    public static partial class HookManager\n    {\n        #region Windows constants\n\n        //values from Winuser.h in Microsoft SDK.\n        /// <summary>\n        /// Windows NT/2000/XP: Installs a hook procedure that monitors low-level mouse input events.\n        /// </summary>\n        private const int WH_MOUSE_LL = 14;\n\n        /// <summary>\n        /// Windows NT/2000/XP: Installs a hook procedure that monitors low-level keyboard  input events.\n        /// </summary>\n        private const int WH_KEYBOARD_LL = 13;\n\n        /// <summary>\n        /// Installs a hook procedure that monitors mouse messages. For more information, see the MouseProc hook procedure. \n        /// </summary>\n        private const int WH_MOUSE = 7;\n\n        /// <summary>\n        /// Installs a hook procedure that monitors keystroke messages. For more information, see the KeyboardProc hook procedure. \n        /// </summary>\n        private const int WH_KEYBOARD = 2;\n\n        /// <summary>\n        /// The WM_MOUSEMOVE message is posted to a window when the cursor moves. \n        /// </summary>\n        private const int WM_MOUSEMOVE = 0x200;\n\n        /// <summary>\n        /// The WM_LBUTTONDOWN message is posted when the user presses the left mouse button \n        /// </summary>\n        private const int WM_LBUTTONDOWN = 0x201;\n\n        /// <summary>\n        /// The WM_RBUTTONDOWN message is posted when the user presses the right mouse button\n        /// </summary>\n        private const int WM_RBUTTONDOWN = 0x204;\n\n        /// <summary>\n        /// The WM_MBUTTONDOWN message is posted when the user presses the middle mouse button \n        /// </summary>\n        private const int WM_MBUTTONDOWN = 0x207;\n\n        /// <summary>\n        /// The WM_LBUTTONUP message is posted when the user releases the left mouse button \n        /// </summary>\n        private const int WM_LBUTTONUP = 0x202;\n\n        /// <summary>\n        /// The WM_RBUTTONUP message is posted when the user releases the right mouse button \n        /// </summary>\n        private const int WM_RBUTTONUP = 0x205;\n\n        /// <summary>\n        /// The WM_MBUTTONUP message is posted when the user releases the middle mouse button \n        /// </summary>\n        private const int WM_MBUTTONUP = 0x208;\n\n        /// <summary>\n        /// The WM_LBUTTONDBLCLK message is posted when the user double-clicks the left mouse button \n        /// </summary>\n        private const int WM_LBUTTONDBLCLK = 0x203;\n\n        /// <summary>\n        /// The WM_RBUTTONDBLCLK message is posted when the user double-clicks the right mouse button \n        /// </summary>\n        private const int WM_RBUTTONDBLCLK = 0x206;\n\n        /// <summary>\n        /// The WM_RBUTTONDOWN message is posted when the user presses the right mouse button \n        /// </summary>\n        private const int WM_MBUTTONDBLCLK = 0x209;\n\n        /// <summary>\n        /// The WM_MOUSEWHEEL message is posted when the user presses the mouse wheel. \n        /// </summary>\n        private const int WM_MOUSEWHEEL = 0x020A;\n\n        /// <summary>\n        /// The WM_KEYDOWN message is posted to the window with the keyboard focus when a nonsystem \n        /// key is pressed. A nonsystem key is a key that is pressed when the ALT key is not pressed.\n        /// </summary>\n        private const int WM_KEYDOWN = 0x100;\n\n        /// <summary>\n        /// The WM_KEYUP message is posted to the window with the keyboard focus when a nonsystem \n        /// key is released. A nonsystem key is a key that is pressed when the ALT key is not pressed, \n        /// or a keyboard key that is pressed when a window has the keyboard focus.\n        /// </summary>\n        private const int WM_KEYUP = 0x101;\n\n        /// <summary>\n        /// The WM_SYSKEYDOWN message is posted to the window with the keyboard focus when the user \n        /// presses the F10 key (which activates the menu bar) or holds down the ALT key and then \n        /// presses another key. It also occurs when no window currently has the keyboard focus; \n        /// in this case, the WM_SYSKEYDOWN message is sent to the active window. The window that \n        /// receives the message can distinguish between these two contexts by checking the context \n        /// code in the lParam parameter. \n        /// </summary>\n        private const int WM_SYSKEYDOWN = 0x104;\n\n        /// <summary>\n        /// The WM_SYSKEYUP message is posted to the window with the keyboard focus when the user \n        /// releases a key that was pressed while the ALT key was held down. It also occurs when no \n        /// window currently has the keyboard focus; in this case, the WM_SYSKEYUP message is sent \n        /// to the active window. The window that receives the message can distinguish between \n        /// these two contexts by checking the context code in the lParam parameter. \n        /// </summary>\n        private const int WM_SYSKEYUP = 0x105;\n\n        private const byte VK_SHIFT = 0x10;\n        private const byte VK_CAPITAL = 0x14;\n        private const byte VK_NUMLOCK = 0x90;\n\n        #endregion\n\n        #region Windows function imports\n\n        /// <summary>\n        /// The CallNextHookEx function passes the hook information to the next hook procedure in the current hook chain. \n        /// A hook procedure can call this function either before or after processing the hook information. \n        /// </summary>\n        /// <param name=\"idHook\">Ignored.</param>\n        /// <param name=\"nCode\">\n        /// [in] Specifies the hook code passed to the current hook procedure. \n        /// The next hook procedure uses this code to determine how to process the hook information.\n        /// </param>\n        /// <param name=\"wParam\">\n        /// [in] Specifies the wParam value passed to the current hook procedure. \n        /// The meaning of this parameter depends on the type of hook associated with the current hook chain. \n        /// </param>\n        /// <param name=\"lParam\">\n        /// [in] Specifies the lParam value passed to the current hook procedure. \n        /// The meaning of this parameter depends on the type of hook associated with the current hook chain. \n        /// </param>\n        /// <returns>\n        /// This value is returned by the next hook procedure in the chain. \n        /// The current hook procedure must also return this value. The meaning of the return value depends on the hook type. \n        /// For more information, see the descriptions of the individual hook procedures.\n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp\n        /// </remarks>\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto,\n            CallingConvention = CallingConvention.StdCall)]\n        private static extern int CallNextHookEx(\n            int idHook,\n            int nCode,\n            int wParam,\n            IntPtr lParam);\n\n\n        /// <summary>\n        /// The SetWindowsHookEx function installs an application-defined hook procedure into a hook chain. \n        /// You would install a hook procedure to monitor the system for certain types of events. These events \n        /// are associated either with a specific thread or with all threads in the same desktop as the calling thread. \n        /// </summary>\n        /// <param name=\"idHook\">\n        /// [in] Specifies the type of hook procedure to be installed. This parameter can be one of the following values.\n        /// </param>\n        /// <param name=\"lpfn\">\n        /// [in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a \n        /// thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link \n        /// library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process.\n        /// </param>\n        /// <param name=\"hMod\">\n        /// [in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. \n        /// The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by \n        /// the current process and if the hook procedure is within the code associated with the current process. \n        /// </param>\n        /// <param name=\"dwThreadId\">\n        /// [in] Specifies the identifier of the thread with which the hook procedure is to be associated. \n        /// If this parameter is zero, the hook procedure is associated with all existing threads running in the \n        /// same desktop as the calling thread. \n        /// </param>\n        /// <returns>\n        /// If the function succeeds, the return value is the handle to the hook procedure.\n        /// If the function fails, the return value is NULL. To get extended error information, call GetLastError.\n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp\n        /// </remarks>\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto,\n            CallingConvention = CallingConvention.StdCall, SetLastError = true)]\n        private static extern int SetWindowsHookEx(\n            int idHook,\n            HookProc lpfn,\n            IntPtr hMod,\n            int dwThreadId);\n\n        /// <summary>\n        /// The UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function. \n        /// </summary>\n        /// <param name=\"idHook\">\n        /// [in] Handle to the hook to be removed. This parameter is a hook handle obtained by a previous call to SetWindowsHookEx. \n        /// </param>\n        /// <returns>\n        /// If the function succeeds, the return value is nonzero.\n        /// If the function fails, the return value is zero. To get extended error information, call GetLastError.\n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp\n        /// </remarks>\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto,\n            CallingConvention = CallingConvention.StdCall, SetLastError = true)]\n        private static extern int UnhookWindowsHookEx(int idHook);\n\n        /// <summary>\n        /// The GetDoubleClickTime function retrieves the current double-click time for the mouse. A double-click is a series of two clicks of the \n        /// mouse button, the second occurring within a specified time after the first. The double-click time is the maximum number of \n        /// milliseconds that may occur between the first and second click of a double-click. \n        /// </summary>\n        /// <returns>\n        /// The return value specifies the current double-click time, in milliseconds. \n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/en-us/library/ms646258(VS.85).aspx\n        /// </remarks>\n        [DllImport(\"user32\")]\n        public static extern int GetDoubleClickTime();\n\n        /// <summary>\n        /// The ToAscii function translates the specified virtual-key code and keyboard \n        /// state to the corresponding character or characters. The function translates the code \n        /// using the input language and physical keyboard layout identified by the keyboard layout handle.\n        /// </summary>\n        /// <param name=\"uVirtKey\">\n        /// [in] Specifies the virtual-key code to be translated. \n        /// </param>\n        /// <param name=\"uScanCode\">\n        /// [in] Specifies the hardware scan code of the key to be translated. \n        /// The high-order bit of this value is set if the key is up (not pressed). \n        /// </param>\n        /// <param name=\"lpbKeyState\">\n        /// [in] Pointer to a 256-byte array that contains the current keyboard state. \n        /// Each element (byte) in the array contains the state of one key. \n        /// If the high-order bit of a byte is set, the key is down (pressed). \n        /// The low bit, if set, indicates that the key is toggled on. In this function, \n        /// only the toggle bit of the CAPS LOCK key is relevant. The toggle state \n        /// of the NUM LOCK and SCROLL LOCK keys is ignored.\n        /// </param>\n        /// <param name=\"lpwTransKey\">\n        /// [out] Pointer to the buffer that receives the translated character or characters. \n        /// </param>\n        /// <param name=\"fuState\">\n        /// [in] Specifies whether a menu is active. This parameter must be 1 if a menu is active, or 0 otherwise. \n        /// </param>\n        /// <returns>\n        /// If the specified key is a dead key, the return value is negative. Otherwise, it is one of the following values. \n        /// Value Meaning \n        /// 0 The specified virtual key has no translation for the current state of the keyboard. \n        /// 1 One character was copied to the buffer. \n        /// 2 Two characters were copied to the buffer. This usually happens when a dead-key character \n        /// (accent or diacritic) stored in the keyboard layout cannot be composed with the specified \n        /// virtual key to form a single character. \n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/toascii.asp\n        /// </remarks>\n        [DllImport(\"user32\")]\n        private static extern int ToAscii(\n            int uVirtKey,\n            int uScanCode,\n            byte[] lpbKeyState,\n            byte[] lpwTransKey,\n            int fuState);\n\n        /// <summary>\n        /// The GetKeyboardState function copies the status of the 256 virtual keys to the \n        /// specified buffer. \n        /// </summary>\n        /// <param name=\"pbKeyState\">\n        /// [in] Pointer to a 256-byte array that contains keyboard key states. \n        /// </param>\n        /// <returns>\n        /// If the function succeeds, the return value is nonzero.\n        /// If the function fails, the return value is zero. To get extended error information, call GetLastError. \n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/toascii.asp\n        /// </remarks>\n        [DllImport(\"user32\")]\n        private static extern int GetKeyboardState(byte[] pbKeyState);\n\n        /// <summary>\n        /// The GetKeyState function retrieves the status of the specified virtual key. The status specifies whether the key is up, down, or toggled \n        /// (on, off預lternating each time the key is pressed). \n        /// </summary>\n        /// <param name=\"vKey\">\n        /// [in] Specifies a virtual key. If the desired virtual key is a letter or digit (A through Z, a through z, or 0 through 9), nVirtKey must be set to the ASCII value of that character. For other keys, it must be a virtual-key code. \n        /// </param>\n        /// <returns>\n        /// The return value specifies the status of the specified virtual key, as follows: \n        ///If the high-order bit is 1, the key is down; otherwise, it is up.\n        ///If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.\n        /// </returns>\n        /// <remarks>http://msdn.microsoft.com/en-us/library/ms646301.aspx</remarks>\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]\n        private static extern short GetKeyState(int vKey);\n\n        #endregion\n    }\n}"
  },
  {
    "path": "Chapters/Old/KeyLogger/Gma.UserActivityMonitor/HookManager.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\n\nnamespace Gma.UserActivityMonitor {\n\n    /// <summary>\n    /// This class monitors all mouse activities globally (also outside of the application) \n    /// and provides appropriate events.\n    /// </summary>\n    public static partial class HookManager\n    {\n        //################################################################\n        #region Mouse events\n\n        private static event MouseEventHandler s_MouseMove;\n\n        /// <summary>\n        /// Occurs when the mouse pointer is moved. \n        /// </summary>\n        public static event MouseEventHandler MouseMove\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseMove += value;\n            }\n\n            remove\n            {\n                s_MouseMove -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static event EventHandler<MouseEventExtArgs> s_MouseMoveExt;\n\n        /// <summary>\n        /// Occurs when the mouse pointer is moved. \n        /// </summary>\n        /// <remarks>\n        /// This event provides extended arguments of type <see cref=\"MouseEventArgs\"/> enabling you to \n        /// supress further processing of mouse movement in other applications.\n        /// </remarks>\n        public static event EventHandler<MouseEventExtArgs> MouseMoveExt\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseMoveExt += value;\n            }\n\n            remove\n            {\n\n                s_MouseMoveExt -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static event MouseEventHandler s_MouseClick;\n\n        /// <summary>\n        /// Occurs when a click was performed by the mouse. \n        /// </summary>\n        public static event MouseEventHandler MouseClick\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseClick += value;\n            }\n            remove\n            {\n                s_MouseClick -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static event EventHandler<MouseEventExtArgs> s_MouseClickExt;\n\n        /// <summary>\n        /// Occurs when a click was performed by the mouse. \n        /// </summary>\n        /// <remarks>\n        /// This event provides extended arguments of type <see cref=\"MouseEventArgs\"/> enabling you to \n        /// supress further processing of mouse click in other applications.\n        /// </remarks>\n        public static event EventHandler<MouseEventExtArgs> MouseClickExt\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseClickExt += value;\n            }\n            remove\n            {\n                s_MouseClickExt -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static event MouseEventHandler s_MouseDown;\n\n        /// <summary>\n        /// Occurs when the mouse a mouse button is pressed. \n        /// </summary>\n        public static event MouseEventHandler  MouseDown\n        {\n            add \n            { \n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseDown += value;\n            }\n            remove\n            {\n                s_MouseDown -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static event MouseEventHandler s_MouseUp;\n\n        /// <summary>\n        /// Occurs when a mouse button is released. \n        /// </summary>\n        public static event MouseEventHandler MouseUp\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseUp += value;\n            }\n            remove\n            {\n                s_MouseUp -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static event MouseEventHandler s_MouseWheel;\n\n        /// <summary>\n        /// Occurs when the mouse wheel moves. \n        /// </summary>\n        public static event MouseEventHandler MouseWheel\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseWheel += value;\n            }\n            remove\n            {\n                s_MouseWheel -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n\n        private static event MouseEventHandler s_MouseDoubleClick;\n\n        //The double click event will not be provided directly from hook.\n        //To fire the double click event wee need to monitor mouse up event and when it occures \n        //Two times during the time interval which is defined in Windows as a doble click time\n        //we fire this event.\n\n        /// <summary>\n        /// Occurs when a double clicked was performed by the mouse. \n        /// </summary>\n        public static event MouseEventHandler MouseDoubleClick\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                if (s_MouseDoubleClick == null)\n                {\n                    //We create a timer to monitor interval between two clicks\n                    s_DoubleClickTimer = new Timer\n                    {\n                        //This interval will be set to the value we retrive from windows. This is a windows setting from contro planel.\n                        Interval = GetDoubleClickTime(),\n                        //We do not start timer yet. It will be start when the click occures.\n                        Enabled = false\n                    };\n                    //We define the callback function for the timer\n                    s_DoubleClickTimer.Tick += DoubleClickTimeElapsed;\n                    //We start to monitor mouse up event.\n                    MouseUp += OnMouseUp;\n                }\n                s_MouseDoubleClick += value;\n            }\n            remove\n            {\n                if (s_MouseDoubleClick != null)\n                {\n                    s_MouseDoubleClick -= value;\n                    if (s_MouseDoubleClick == null)\n                    {\n                        //Stop monitoring mouse up\n                        MouseUp -= OnMouseUp;\n                        //Dispose the timer\n                        s_DoubleClickTimer.Tick -= DoubleClickTimeElapsed;\n                        s_DoubleClickTimer = null;\n                    }\n                }\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        //This field remembers mouse button pressed because in addition to the short interval it must be also the same button.\n        private static MouseButtons s_PrevClickedButton;\n        //The timer to monitor time interval between two clicks.\n        private static Timer s_DoubleClickTimer;\n\n        private static void DoubleClickTimeElapsed(object sender, EventArgs e)\n        {\n            //Timer is alapsed and no second click ocuured\n            s_DoubleClickTimer.Enabled = false;\n            s_PrevClickedButton = MouseButtons.None;\n        }\n\n        /// <summary>\n        /// This method is designed to monitor mouse clicks in order to fire a double click event if interval between \n        /// clicks was short enaugh.\n        /// </summary>\n        /// <param name=\"sender\">Is always null</param>\n        /// <param name=\"e\">Some information about click heppened.</param>\n        private static void OnMouseUp(object sender, MouseEventArgs e)\n        {\n            //This should not heppen\n            if (e.Clicks < 1) { return;}\n            //If the secon click heppened on the same button\n            if (e.Button.Equals(s_PrevClickedButton))\n            {\n                if (s_MouseDoubleClick!=null)\n                {\n                    //Fire double click\n                    s_MouseDoubleClick.Invoke(null, e);\n                }\n                //Stop timer\n                s_DoubleClickTimer.Enabled = false;\n                s_PrevClickedButton = MouseButtons.None;\n            }\n            else\n            {\n                //If it was the firts click start the timer\n                s_DoubleClickTimer.Enabled = true;\n                s_PrevClickedButton = e.Button;\n            }\n        }\n        #endregion\n\n        //################################################################\n        #region Keyboard events\n\n        private static event KeyPressEventHandler s_KeyPress;\n\n        /// <summary>\n        /// Occurs when a key is pressed.\n        /// </summary>\n        /// <remarks>\n        /// Key events occur in the following order: \n        /// <list type=\"number\">\n        /// <item>KeyDown</item>\n        /// <item>KeyPress</item>\n        /// <item>KeyUp</item>\n        /// </list>\n        ///The KeyPress event is not raised by noncharacter keys; however, the noncharacter keys do raise the KeyDown and KeyUp events. \n        ///Use the KeyChar property to sample keystrokes at run time and to consume or modify a subset of common keystrokes. \n        ///To handle keyboard events only in your application and not enable other applications to receive keyboard events, \n        /// set the KeyPressEventArgs.Handled property in your form's KeyPress event-handling method to <b>true</b>. \n        /// </remarks>\n        public static event KeyPressEventHandler KeyPress\n        {\n            add\n            {\n                EnsureSubscribedToGlobalKeyboardEvents();\n                s_KeyPress += value;\n            }\n            remove\n            {\n                s_KeyPress -= value;\n                TryUnsubscribeFromGlobalKeyboardEvents();\n            }\n        }\n\n        private static event KeyEventHandler s_KeyUp;\n\n        /// <summary>\n        /// Occurs when a key is released. \n        /// </summary>\n        public static event KeyEventHandler KeyUp\n        {\n            add\n            {\n                EnsureSubscribedToGlobalKeyboardEvents();\n                s_KeyUp += value;\n            }\n            remove\n            {\n                s_KeyUp -= value;\n                TryUnsubscribeFromGlobalKeyboardEvents();\n            }\n        }\n\n        private static event KeyEventHandler s_KeyDown;\n\n        /// <summary>\n        /// Occurs when a key is preseed. \n        /// </summary>\n        public static event KeyEventHandler KeyDown\n        {\n            add\n            {\n                EnsureSubscribedToGlobalKeyboardEvents();\n                s_KeyDown += value;\n            }\n            remove\n            {\n                s_KeyDown -= value;\n                TryUnsubscribeFromGlobalKeyboardEvents();\n            }\n        }\n\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/Gma.UserActivityMonitor/MouseEventExtArgs.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace Gma.UserActivityMonitor\n{\n    /// <summary>\n    /// Provides data for the MouseClickExt and MouseMoveExt events. It also provides a property Handled.\n    /// Set this property to <b>true</b> to prevent further processing of the event in other applications.\n    /// </summary>\n    public class MouseEventExtArgs : MouseEventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the MouseEventArgs class. \n        /// </summary>\n        /// <param name=\"buttons\">One of the MouseButtons values indicating which mouse button was pressed.</param>\n        /// <param name=\"clicks\">The number of times a mouse button was pressed.</param>\n        /// <param name=\"x\">The x-coordinate of a mouse click, in pixels.</param>\n        /// <param name=\"y\">The y-coordinate of a mouse click, in pixels.</param>\n        /// <param name=\"delta\">A signed count of the number of detents the wheel has rotated.</param>\n        public MouseEventExtArgs(MouseButtons buttons, int clicks, int x, int y, int delta)\n            : base(buttons, clicks, x, y, delta)\n        {}\n\n        /// <summary>\n        /// Initializes a new instance of the MouseEventArgs class. \n        /// </summary>\n        /// <param name=\"e\">An ordinary <see cref=\"MouseEventArgs\"/> argument to be extended.</param>\n        internal MouseEventExtArgs(MouseEventArgs e) : base(e.Button, e.Clicks, e.X, e.Y, e.Delta)\n        {}\n\n        private bool m_Handled;\n\n        /// <summary>\n        /// Set this property to <b>true</b> inside your event handler to prevent further processing of the event in other applications.\n        /// </summary>\n        public bool Handled\n        {\n            get { return m_Handled; }\n            set { m_Handled = value; }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/KeyLogger/App.xaml",
    "content": "﻿<Application x:Class=\"KeyLogger.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    StartupUri=\"Window1.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/KeyLogger/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Windows;\n\nnamespace KeyLogger\n{\n    /// <summary>\n    /// App.xaml の相互作用ロジック\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/KeyLogger/KeyLogger.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>9.0.30729</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{EC788AB9-5BB2-4628-B4A5-66540790588E}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>KeyLogger</RootNamespace>\n    <AssemblyName>KeyLogger</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <WarningLevel>4</WarningLevel>\n    <FileUpgradeFlags>\n    </FileUpgradeFlags>\n    <UpgradeBackupLocation>\n    </UpgradeBackupLocation>\n    <OldToolsVersion>3.5</OldToolsVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <ErrorReport>prompt</ErrorReport>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <ErrorReport>prompt</ErrorReport>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\">\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xml.Linq\">\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"System.Data.DataSetExtensions\">\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Page Include=\"Window1.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Window1.xaml.cs\">\n      <DependentUpon>Window1.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"NativeWin32.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <AppDesigner Include=\"Properties\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Gma.UserActivityMonitor\\Gma.UserActivityMonitor.csproj\">\n      <Project>{F52AA97E-180A-40ED-8F2B-09080171D6C7}</Project>\n      <Name>Gma.UserActivityMonitor</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Old/KeyLogger/KeyLogger/NativeWin32.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nnamespace KeyLogger\n{\n    public class Win32\n    {\n        /// <summary>\n        /// SendInput Win32APIをラップしたメソッド\n        /// </summary>\n        /// <param name=\"inputs\"></param>\n        public static void SendInput(INPUT[] inputs)\n        {\n            for (Int32 i = 0; i < inputs.Length; i++)\n            {\n                INPUT input = inputs[i];\n                if (input.type == type.INPUT_KEYBOARD)\n                {\n                    //キーボードの時は変換が必要らしい\n                    //input.ki.wScan = (Int16)input.ki.wVk;//(Int16)(MapVirtualKey((Int32)input.ki.wVk, 0));\n                    input.ki.dwExtraInfo = GetMessageExtraInfo();\n                    input.ki.dwFlags = ExtendedKeyFlagW(input.ki.wVk) | input.ki.dwFlags;\n                }\n            }\n            SendInput(inputs.Length, inputs, Marshal.SizeOf(inputs[0]));\n        }\n\n        public static void SendInput(INPUT input)\n        {\n            input.ki.dwExtraInfo = GetMessageExtraInfo();\n            input.ki.dwFlags = ExtendedKeyFlagW(input.ki.wVk) | input.ki.dwFlags;\n            SendInput(1, ref input, Marshal.SizeOf(input));\n        }\n\n        private static dwFlags ExtendedKeyFlagW(wVk key)\n        {\n            dwFlags flag = 0;\n            if (key == wVk.VK_CONTROL)\n            {//とりあえずControlだけ\n                flag = dwFlags.KEYEVENTF_EXTENDEDKEY;\n            }\n            return flag;\n        }\n        //SendInput Function\n        //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/sendinput.asp\n        [DllImport(\"user32.dll\")]\n        private extern static Int32 SendInput(Int32 nInputs, INPUT[] pInputs, Int32 cbSize);\n\n        [DllImport(\"user32.dll\")]\n        public static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);\n\n        //GetMessageExtraInfo Function\n        //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/getmessageextrainfo.asp\n        [DllImport(\"user32.dll\")]\n        private extern static IntPtr GetMessageExtraInfo();\n\n        //MapVirtualKey Function\n        //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/mapvirtualkey.asp\n        [DllImport(\"user32.dll\")]\n        private extern static Int32 MapVirtualKey(Int32 uCode, Int32 uMapType);\n\n        [DllImport(\"user32.dll\")]\n        public extern static IntPtr GetForegroundWindow();\n\n        [DllImport(\"user32.dll\")]\n        public extern static int SetForegroundWindow(IntPtr hWnd);\n\n        [DllImport(\"user32.dll\")]\n        public extern static int GetWindowThreadProcessId(IntPtr hWnd, ref int lpdwProcessId);\n\n        [DllImport(\"user32.dll\")]\n        public extern static bool AttachThreadInput(int idAttach, int idAttachTo, bool fAttach);\n    }\n\n    //for KEYBDINPUT /MOUSEINPUT Structure\n    public enum dwFlags\n    {\n        KEYEVENTF_KEYDOWN = 0,\n        KEYEVENTF_EXTENDEDKEY = 0x1,\n        KEYEVENTF_KEYUP = 0x2,\n        KEYEVENTF_SCANCODE = 0x8,\n        KEYEVENTF_UNICODE = 0x4,\n\n        MOUSEEVENTF_MOVED = 0x0001,\n        MOUSEEVENTF_LEFTDOWN = 0x0002,  // 左ボタン Down\n        MOUSEEVENTF_LEFTUP = 0x0004,  // 左ボタン Up\n        MOUSEEVENTF_RIGHTDOWN = 0x0008,  // 右ボタン Down\n        MOUSEEVENTF_RIGHTUP = 0x0010,  // 右ボタン Up\n        MOUSEEVENTF_MIDDLEDOWN = 0x0020,  // 中ボタン Down\n        MOUSEEVENTF_MIDDLEUP = 0x0040,  // 中ボタン Up\n        MOUSEEVENTF_WHEEL = 0x0080,\n        MOUSEEVENTF_XDOWN = 0x0100,\n        MOUSEEVENTF_XUP = 0x0200,\n        MOUSEEVENTF_ABSOLUTE = 0x8000\n\n    }\n\n    //for INPUT Structure\n    public enum type\n    {\n        INPUT_MOUSE = 0,\n        INPUT_KEYBOARD = 1,\n        INPUT_HARDWARE = 2\n    }\n\n    //INPUT struct\n    //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputstructs/input.asp\n    [StructLayout(LayoutKind.Explicit)]\n    public struct INPUT\n    {\n        [FieldOffset(0)]\n        public type type;\n        [FieldOffset(4)]\n        public MOUSEINPUT mi;\n        [FieldOffset(4)]\n        public KEYBDINPUT ki;\n        [FieldOffset(4)]\n        public HARDWAREINPUT hi;\n    }\n\n    //MOUSEINPUT struct\n    //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputstructs/mouseinput.asp\n    [StructLayout(LayoutKind.Explicit)]\n    public struct MOUSEINPUT\n    {\n        [FieldOffset(0)]\n        public Int32 dx;\n        [FieldOffset(4)]\n        public Int32 dy;\n        [FieldOffset(8)]\n        public Int32 mouseData;\n        [FieldOffset(12)]\n        public dwFlags dwFlags;\n        [FieldOffset(16)]\n        public Int32 time;\n        [FieldOffset(20)]\n        public IntPtr dwExtraInfo;\n    }\n\n    //KEYBDINPUT struct\n    //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputstructs/keybdinput.asp\n    [StructLayout(LayoutKind.Explicit)]\n    public struct KEYBDINPUT\n    {\n        [FieldOffset(0)]\n        public wVk wVk;\n        [FieldOffset(2)]\n        public Int16 wScan;\n        [FieldOffset(4)]\n        public dwFlags dwFlags;\n        [FieldOffset(8)]\n        public Int32 time;\n        [FieldOffset(12)]\n        public IntPtr dwExtraInfo;\n    }\n\n    //HARDWAREINPUT struct\n    //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputstructs/hardwareinput.asp\n    [StructLayout(LayoutKind.Explicit)]\n    public struct HARDWAREINPUT\n    {\n        [FieldOffset(0)]\n        public Int32 uMsg;\n        [FieldOffset(4)]\n        public Int16 wParamL;\n        [FieldOffset(6)]\n        public Int16 wParamH;\n    }\n\n    public enum wVk : short\n    {\n        VK_CANCEL = 0x3, //BREAK(Control+Pause) key(ExtendedKey)\n        VK_BACK = 0x8, //BACKSPACE key\n        VK_TAB = 0x9, //TAB key\n        VK_CLEAR = 0xC,\n        VK_RETURN = 0xD, //ENTER key\n        VK_SHIFT = 0x10, //SHIFT key\n        VK_CONTROL = 0x11, //CTRL key\n        VK_MENU = 0x12, //ALT key\n        VK_PAUSE = 0x13, //PAUSE key\n        VK_CAPITAL = 0x14, //CAPS LOCK key\n        VK_KANA = 0x15, //IME かな mode\n        VK_JUNJA = 0x17,\n        VK_FINAL = 0x18,\n        VK_KANJI = 0x19, //IME 漢字 mode\n        VK_ESCAPE = 0x1B, //ESC key\n        VK_CONVERT = 0x1C, //IME 変換 key\n        VK_NONCONVERT = 0x1D, //IME 無変換 key\n        VK_ACCEPT = 0x1E,\n        VK_MODECHANGE = 0x1F,\n        VK_SPACE = 0x20,//SPACEBAR\n        VK_PRIOR = 0x21, //PAGE UP key(ExtendedKey)\n        VK_NEXT = 0x22, //PAGE DOWN key(ExtendedKey)\n        VK_END = 0x23,//END key(ExtendedKey)\n        VK_HOME = 0x24, //HOME key(ExtendedKey)\n        VK_LEFT = 0x25, //← key(ExtendedKey)\n        VK_UP = 0x26, //↑ key(ExtendedKey)\n        VK_RIGHT = 0x27, //→ key(ExtendedKey)\n        VK_DOWN = 0x28, //↓ key(ExtendedKey)\n        VK_SELECT = 0x29,\n        VK_PRINT = 0x2A,\n        VK_EXECUTE = 0x2B,\n        VK_SNAPSHOT = 0x2C, //PRINT SCREEN key(ExtendedKey)\n        VK_INSERT = 0x2D, //INS key(ExtendedKey)\n        VK_DELETE = 0x2E, //DEL key(ExtendedKey)\n        VK_HELP = 0x2F,\n        VK_0 = 0x30,//0 key\n        VK_1 = 0x31, //1 key\n        VK_2 = 0x32, //2 key\n        VK_3 = 0x33, //3 key\n        VK_4 = 0x34, //4 key\n        VK_5 = 0x35, //5 key\n        VK_6 = 0x36, //6 key\n        VK_7 = 0x37, //7 key\n        VK_8 = 0x38, //8 key\n        VK_9 = 0x39, //9 key\n        VK_A = 0x41, //A key\n        VK_B = 0x42, //B key\n        VK_C = 0x43, //C key\n        VK_D = 0x44, //D key\n        VK_E = 0x45, //E key\n        VK_F = 0x46, //F key\n        VK_G = 0x47, //G key\n        VK_H = 0x48, //H key\n        VK_I = 0x49, //I key\n        VK_J = 0x4A, //J key\n        VK_K = 0x4B, //K key\n        VK_L = 0x4C, //L key\n        VK_M = 0x4D, //M key\n        VK_N = 0x4E, //N key\n        VK_O = 0x4F, //O key\n        VK_P = 0x50, //P key\n        VK_Q = 0x51, //Q key\n        VK_R = 0x52, //R key\n        VK_S = 0x53, //S key\n        VK_T = 0x54, //T key\n        VK_U = 0x55, //U key\n        VK_V = 0x56, //V key\n        VK_W = 0x57, //W key\n        VK_X = 0x58, //X key\n        VK_Y = 0x59, //Y key\n        VK_Z = 0x5A, //Z key\n        VK_LWIN = 0x5B, //Left Windows key\n        VK_RWIN = 0x5C, //Right Windows key\n        VK_APPS = 0x5D, // Applications key\n        VK_NUMPAD0 = 0x60, //Numeric keypad 0 key\n        VK_NUMPAD1 = 0x61, //Numeric keypad 1 key\n        VK_NUMPAD2 = 0x62, //Numeric keypad 2 key\n        VK_NUMPAD3 = 0x63, //Numeric keypad 3 key\n        VK_NUMPAD4 = 0x64, //Numeric keypad 4 key\n        VK_NUMPAD5 = 0x65, //Numeric keypad 5 key\n        VK_NUMPAD6 = 0x66, //Numeric keypad 6 key\n        VK_NUMPAD7 = 0x67, //Numeric keypad 7 key\n        VK_NUMPAD8 = 0x68, //Numeric keypad 8 key\n        VK_NUMPAD9 = 0x69, //Numeric keypad 9 key\n        VK_MULTIPLY = 0x6A, //* key\n        VK_ADD = 0x6B, //+ key\n        VK_SEPERATOR = 0x6C, //\n        VK_SUBTRACT = 0x6D, //- key\n        VK_DECIMAL = 0x6E, //テンキーの . key\n        VK_DEVIDE = 0x6F, /// key(ExtendedKey)\n        VK_F1 = 0x70, //F1 key\n        VK_F2 = 0x71, //F2 key\n        VK_F3 = 0x72, //F3 key\n        VK_F4 = 0x73, //F4 key\n        VK_F5 = 0x74,//F5 key\n        VK_F6 = 0x75, //F6 key\n        VK_F7 = 0x76, //F7 key\n        VK_F8 = 0x77, //F8 key\n        VK_F9 = 0x78, //F9 key\n        VK_F10 = 0x79, //F10 key\n        VK_F11 = 0x7A, //F11 key\n        VK_F12 = 0x7B, //F12 key\n        VK_F13 = 0x7C, //F13 key\n        VK_F14 = 0x7D, //F14 key\n        VK_F15 = 0x7E, //F15 key\n        VK_F16 = 0x7F, //F16 key\n        VK_F17 = 0x80, //F17 key\n        VK_F18 = 0x81, //F18 key\n        VK_F19 = 0x82, //F19 key\n        VK_F20 = 0x83, //F20 key\n        VK_F21 = 0x84, //F21 key\n        VK_F22 = 0x85, //F22 key\n        VK_F23 = 0x86, //F23 key\n        VK_F24 = 0x87, //F24 key\n        VK_NUMLOCK = 0x90, //NUM LOCK key(ExtendedKey)\n        VK_SCROLL = 0x91, //SCROLL LOCK key\n        VK_LSHIFT = 0xA0, //Left SHIFT key\n        VK_RSHIFT = 0xA1, // Right SHIFT key(ExtendedKey)\n        VK_LCONTROL = 0xA2, //Left CONTROL key\n        VK_RCONTROL = 0xA3, //Right CONTROL key(ExtendedKey)\n        VK_LMENU = 0xA4, //Left MENU key\n        VK_RMENU = 0xA5, //Right MENU key(ExtendedKey)\n        VK_BROWSER_BACK = 0xA6, //Browser Back key\n        VK_BROWSER_FORWARD = 0xA7, //Browser Forward key\n        VK_BROWSER_REFRESH = 0xA8, //Browser Refresh key\n        VK_BROWSER_STOP = 0xA9, //Browser Stop key\n        VK_BROWSER_SEARCH = 0xAA, //Browser Search key\n        VK_BROWSER_FAVORITES = 0xAB, //Browser Favorites key\n        VK_BROWSER_HOME = 0xA6, //Browser Start and Home key\n        VK_VOLUME_MUTE = 0xAD, //Volume Mute key\n        VK_VOLUME_DOWN = 0xAE, //Volume Down key\n        VK_VOLUME_UP = 0xAF, //Volume Up key\n        VK_MEDIA_NEXT_TRACK = 0xB0, //Next Track key\n        VK_MEDIA_PREV_TRACK = 0xB1, //Previous Track key\n        VK_MEDIA_STOP = 0xB2, //Stop Media key\n        VK_MEDIA_PLAY_PAUSE = 0xB3, //Play/Pause Media key\n        VK_LAUNCH_MAIL = 0xB4, //Start Mail key\n        VK_LAUNCH_MEDIA_SELECT = 0xB5, //Select Media Key\n        VK_LAUNCH_APP1 = 0xB6, //Start Application 1 key\n        VK_LAUNCH_APP2 = 0xB7, //Start Application 2 key\n        VK_OEM_1 = 0xBA, //: *  key\n        VK_OEM_PLUS = 0xBB, //; + key\n        VK_OEM_COMMA = 0xBC, //, < key\n        VK_OEM_MINUS = 0xBD, //- = key\n        VK_OEM_PERIOD = 0xBE, //. > key\n        VK_OEM_2 = 0xBF, /// ? key\n        VK_OEM_3 = 0xC0, //@ ` key\n        VK_OEM_4 = 0xDB, //[ { key\n        VK_OEM_5 = 0xDC, //\\ | key\n        VK_OEM_6 = 0xDD, //] } key\n        VK_OEM_7 = 0xDE, //^ ~ key\n        VK_OEM_8 = 0xDF,\n        VK_PROCESSKEY = 0xE5,\n        VK_OEM_ATTN = 0xF0, //英数\n        VK_OEM_102 = 0xE2, //\\ _ key\n        VK_OEM_COPY = 0xF2, //カタカナひらがな\n        VK_OEM_AUTO = 0xF3, //全角/半角\n        VK_OEM_ENLW = 0xF4,//全角/半角\n        VK_OEM_BACKTAB = 0xF5, //ローマ字\n        VK_PACKET = 0xE7,\n        VK_ATTN = 0xF6,\n        VK_CRSEL = 0xF7,\n        VK_EXSEL = 0xF8,\n        VK_EREOF = 0xF9,\n        VK_PLAY = 0xFA,\n        VK_ZOOM = 0xFB,\n        VK_NONAME = 0xFC,\n        VK_PA1 = 0xFD,\n        VK_OEM_CLEAR = 0xFE\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/KeyLogger/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"KeyLogger\")]\n[assembly: AssemblyDescription(\"キーボードからの入力を記録・再生\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"++C++;\")]\n[assembly: AssemblyProduct(\"KeyLogger\")]\n[assembly: AssemblyCopyright(\"Copyright © ++C++; 2009\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから\n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n//ローカライズ可能なアプリケーションのビルドを開始するには、\n//.csproj ファイルの <UICulture>CultureYouAreCodingWith</UICulture> を\n//<PropertyGroup> 内部で設定します。たとえば、\n//ソース ファイルで英語を使用している場合、<UICulture> を en-US に設定します。次に、\n//下の NeutralResourceLanguage 属性のコメントを解除します。下の行の \"en-US\" を\n//プロジェクト ファイルの UICulture 設定と一致するよう更新します。\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //テーマ固有のリソース ディクショナリが置かれている場所\n    //(リソースがページ、\n    //またはアプリケーション リソース ディクショナリに見つからない場合に使用されます)\n    ResourceDictionaryLocation.SourceAssembly //汎用リソース ディクショナリが置かれている場所\n    //(リソースがページ、\n    //アプリケーション、またはいずれのテーマ固有のリソース ディクショナリにも見つからない場合に使用されます)\n)]\n\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/KeyLogger/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     このコードはツールによって生成されました。\n//     ランタイム バージョン:4.0.30319.42000\n//\n//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、\n//     コードが再生成されるときに損失したりします。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace KeyLogger.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。\n    /// </summary>\n    // このクラスは StronglyTypedResourceBuilder クラスが ResGen\n    // または Visual Studio のようなツールを使用して自動生成されました。\n    // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に\n    // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   このクラスで使用されているキャッシュされた ResourceManager インスタンスを返します。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"KeyLogger.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、\n        ///   現在のスレッドの CurrentUICulture プロパティをオーバーライドします。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/KeyLogger/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Chapters/Old/KeyLogger/KeyLogger/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     このコードはツールによって生成されました。\n//     ランタイム バージョン:4.0.30319.42000\n//\n//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、\n//     コードが再生成されるときに損失したりします。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace KeyLogger.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"14.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/KeyLogger/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "Chapters/Old/KeyLogger/KeyLogger/Window1.xaml",
    "content": "﻿<Window x:Class=\"KeyLogger.Window1\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    Title=\"Key Logger\" Height=\"300\" Width=\"300\">\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"*\" />\n            <RowDefinition Height=\"30\" />\n            <RowDefinition Height=\"30\" />\n            <!--<RowDefinition Height=\"30\" />-->\n        </Grid.RowDefinitions>\n        <ListBox Name=\"listHistory\"/>\n        <StackPanel Orientation=\"Horizontal\" Grid.Row=\"1\">\n            <Button Name=\"buttonRecord\">記録開始（右Ctrl）</Button>\n            <Button Name=\"buttonReplay\" ToolTip=\"F12 キーでも再生できるよ\" >再生（右Alt）</Button>\n        </StackPanel>\n        <StackPanel Orientation=\"Horizontal\" Grid.Row=\"2\">\n            <CheckBox Name=\"checkShowLog\" VerticalAlignment=\"Center\">ログの表示</CheckBox>\n            <Button Name=\"buttonSave\" ToolTip=\"記録をファイルに書き出します\" >Save</Button>\n            <Button Name=\"buttonLoad\" ToolTip=\"記録をファイルから読み込みます\">Load</Button>\n            <Button Name=\"buttonClear\" ToolTip=\"記録をクリアします\" >Clear</Button>\n            <Button Name=\"buttonReduce\" ToolTip=\"余計な KeyDown イベントを削除します\">Reduce</Button>\n            <!--<Label Name=\"labelDebug\"></Label>-->\n        </StackPanel>\n        <!--<TextBox Name=\"textResult\" Grid.Row=\"3\"></TextBox>-->\n    </Grid>\n</Window>\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/KeyLogger/Window1.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing System.Diagnostics;\nusing System.Xml.Serialization;\nusing System.IO;\nusing System.Threading;\n\nusing Key = System.Windows.Forms.Keys;\nusing System.Runtime.InteropServices;\nusing System.Windows.Interop;\n\nnamespace KeyLogger\n{\n    public enum EventType\n    {\n        KeyDown,\n        KeyUp,\n    }\n\n    [Serializable]\n    public struct KeyEvent\n    {\n        public EventType Type;\n        public int Code;\n        public long Elapsed;\n    }\n\n    /// <summary>\n    /// Window1.xaml の相互作用ロジック\n    /// </summary>\n    public partial class Window1 : Window\n    {\n        public Window1()\n        {\n            InitializeComponent();\n\n            Gma.UserActivityMonitor.HookManager.KeyDown += new System.Windows.Forms.KeyEventHandler(HookManager_KeyDown);\n            //Gma.UserActivityMonitor.HookManager.KeyPress += new System.Windows.Forms.KeyPressEventHandler(HookManager_KeyPress);\n            Gma.UserActivityMonitor.HookManager.KeyUp += new System.Windows.Forms.KeyEventHandler(HookManager_KeyUp);\n\n            this.buttonRecord.Click += new RoutedEventHandler(buttonRecord_Click);\n            this.buttonClear.Click += new RoutedEventHandler(buttonClear_Click);\n            this.buttonReduce.Click += new RoutedEventHandler(buttonReduce_Click);\n            this.buttonSave.Click += new RoutedEventHandler(buttonSave_Click);\n            this.buttonLoad.Click += new RoutedEventHandler(buttonLoad_Click);\n            this.buttonReplay.Click += new RoutedEventHandler(buttonReplay_Click);\n        }\n\n        void buttonReduce_Click(object sender, RoutedEventArgs e)\n        {\n            var reduced = new List<KeyEvent>();\n\n            KeyEvent prev = new KeyEvent { Type = (EventType)(-1) };\n            foreach (var k in keys)\n            {\n                if (prev.Type == k.Type\n                    && k.Type == EventType.KeyDown\n                    && prev.Code == k.Code)\n                {\n                    prev = k;\n                    continue;\n                }\n\n                reduced.Add(k);\n                prev = k;\n            }\n\n            this.keys = reduced;\n\n            this.ShowHistory();\n        }\n\n        #region 再生\n\n        Thread replay = null;\n        bool isReplayAlive;\n\n        void Dispatch(Action a)\n        {\n            this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, a);\n        }\n\n        void ReplayThread()\n        {\n            var inputs =\n                from x in this.keys\n                select new INPUT\n                {\n                    type = type.INPUT_KEYBOARD,\n                    ki = new KEYBDINPUT\n                    {\n                        time = (int)x.Elapsed,\n                        wVk = (wVk)x.Code,\n                        dwFlags = x.Type == EventType.KeyDown ? dwFlags.KEYEVENTF_KEYDOWN : dwFlags.KEYEVENTF_KEYUP,\n                    },\n                };\n\n            Stopwatch sw = new Stopwatch();\n\n            sw.Start();\n\n            foreach (var input in inputs)\n            {\n                while (input.ki.time > sw.ElapsedMilliseconds)\n                {\n                    Thread.Sleep(1);\n                    //this.Dispatch(() => { this.labelDebug.Content = string.Format(\"{0} : {1}\", input.ki.time, sw.ElapsedMilliseconds); });\n                }\n\n                Win32.SendInput(input);\n\n                if (!this.isReplayAlive)\n                    break;\n            }\n\n            sw.Stop();\n\n            this.Dispatch(() =>\n            {\n                this.buttonReplay.IsEnabled = true;\n                this.replay = null;\n                this.isReplayAlive = false;\n            });\n        }\n\n        void Replay()\n        {\n            if (this.isReplayAlive)\n            {\n                this.isReplayAlive = false;\n                return;\n            }\n\n            this.isReplayAlive = true;\n            this.replay = new Thread(this.ReplayThread)\n            {\n                Priority = ThreadPriority.AboveNormal,\n            };\n\n            this.buttonReplay.IsEnabled = false;\n            this.replay.Start();\n        }\n\n        void buttonReplay_Click(object sender, RoutedEventArgs e)\n        {\n            //Keyboard.Focus(this.textResult);\n            this.Replay();\n        }\n\n        #endregion\n        #region シリアライズ\n\n        XmlSerializer serializer = null;\n        XmlSerializer Serializer\n        {\n            get\n            {\n                if (this.serializer == null)\n                {\n                    this.serializer = new XmlSerializer(typeof(List<KeyEvent>));\n                }\n                return this.serializer;\n            }\n        }\n\n        void Serialize(Stream stream)\n        {\n            this.Serializer.Serialize(stream, this.keys);\n        }\n\n        void Deserialize(Stream stream)\n        {\n            this.keys = (List<KeyEvent>)this.Serializer.Deserialize(stream);\n\n            this.ShowHistory();\n        }\n\n        void Serialize()\n        {\n            var dlg = new Microsoft.Win32.OpenFileDialog\n            {\n                Multiselect = false,\n                Filter = \"XML|*.xml\",\n                AddExtension = true,\n                CheckFileExists = false,\n            };\n\n            if (dlg.ShowDialog() ?? false)\n            {\n                using (var stream = File.Open(dlg.FileName, FileMode.Create))\n                {\n                    this.Serialize(stream);\n                }\n            }\n        }\n\n        void Deserialize()\n        {\n            var dlg = new Microsoft.Win32.OpenFileDialog\n            {\n                Multiselect = false,\n                Filter = \"XML|*.xml\",\n                AddExtension = true,\n                CheckFileExists = true,\n            };\n\n            if (dlg.ShowDialog() ?? false)\n            {\n                using (var stream = File.OpenRead(dlg.FileName))\n                {\n                    this.Deserialize(stream);\n                }\n            }\n        }\n\n        void buttonLoad_Click(object sender, RoutedEventArgs e)\n        {\n            this.Deserialize();\n        }\n\n        void buttonSave_Click(object sender, RoutedEventArgs e)\n        {\n            this.Serialize();\n        }\n\n        void buttonClear_Click(object sender, RoutedEventArgs e)\n        {\n            this.keys.Clear();\n            this.ShowHistory();\n        }\n\n        #endregion\n        #region 記録開始/停止\n\n        bool isRecording = false;\n        Stopwatch stopwatch = new Stopwatch();\n        List<KeyEvent> keys = new List<KeyEvent>();\n\n        void SwitchRecording()\n        {\n            if (this.isRecording)\n            {\n                this.isRecording = false;\n                this.buttonRecord.Content = \"記録開始（右Ctrl）\";\n            }\n            else\n            {\n                this.isRecording = true;\n                this.stopwatch.Reset();\n                this.stopwatch.Start();\n                this.buttonRecord.Content = \"記録停止（右Ctrl）\";\n            }\n        }\n\n        void buttonRecord_Click(object sender, RoutedEventArgs e)\n        {\n            this.SwitchRecording();\n        }\n\n        #endregion\n        #region ログの表示\n\n        void ShowHistory()\n        {\n            this.listHistory.ItemsSource = keys.Select(x => string.Format(\"{0}: {1} ({2})\", x.Type, ((Key)x.Code), x.Elapsed));\n        }\n\n        #endregion\n        #region フック\n\n        void HookManager_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)\n        {\n            if (e.KeyCode == System.Windows.Forms.Keys.RControlKey\n                || e.KeyCode == System.Windows.Forms.Keys.RMenu\n                || e.KeyCode == System.Windows.Forms.Keys.F12)\n            {\n                e.Handled = true;\n                return;\n            }\n\n            if (this.replay != null && this.replay.IsAlive)\n            {\n                //this.labelDebug.Content = string.Format(\"{0}\", e.KeyCode);\n                return;\n            }\n\n            if (!this.isRecording)\n                return;\n\n            this.keys.Add(new KeyEvent\n            {\n                Type = EventType.KeyDown,\n                Code = (int)e.KeyCode,\n                Elapsed = this.stopwatch.ElapsedMilliseconds,\n            });\n\n            //this.ShowHistory();\n        }\n\n        void HookManager_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)\n        {\n            if (e.KeyCode == System.Windows.Forms.Keys.RMenu\n                || e.KeyCode == System.Windows.Forms.Keys.F12)\n            {\n                this.Replay();\n                e.Handled = true;\n                return;\n            }\n\n            if (this.replay != null && this.replay.IsAlive)\n            {\n                e.Handled = false;\n                return;\n            }\n\n            if (e.KeyCode == System.Windows.Forms.Keys.RControlKey)\n            {\n                this.SwitchRecording();\n                this.ShowHistory();\n                e.Handled = true;\n                return;\n            }\n\n            if (!this.isRecording)\n                return;\n\n            this.keys.Add(new KeyEvent\n            {\n                Type = EventType.KeyUp,\n                Code = (int)e.KeyCode,\n                Elapsed = this.stopwatch.ElapsedMilliseconds,\n            });\n\n            //this.ShowHistory();\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/KeyLogger/KeyLogger.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.23107.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"KeyLogger\", \"KeyLogger\\KeyLogger.csproj\", \"{EC788AB9-5BB2-4628-B4A5-66540790588E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Gma.UserActivityMonitor\", \"Gma.UserActivityMonitor\\Gma.UserActivityMonitor.csproj\", \"{F52AA97E-180A-40ED-8F2B-09080171D6C7}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Debug|x86.Build.0 = Debug|x86\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Release|x86.ActiveCfg = Release|x86\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Release|x86.Build.0 = Release|x86\n\t\t{F52AA97E-180A-40ED-8F2B-09080171D6C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F52AA97E-180A-40ED-8F2B-09080171D6C7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F52AA97E-180A-40ED-8F2B-09080171D6C7}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{F52AA97E-180A-40ED-8F2B-09080171D6C7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F52AA97E-180A-40ED-8F2B-09080171D6C7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F52AA97E-180A-40ED-8F2B-09080171D6C7}.Release|x86.ActiveCfg = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Old/LineArt/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n//\n// アセンブリに関する一般情報は以下の \n// 属性セットを通して制御されます。アセンブリに関連付けられている \n// 情報を変更するには、これらの属性値を変更してください。\n//\n[assembly: AssemblyTitle(\"\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"\")]\n[assembly: AssemblyCopyright(\"\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\t\t\n\n//\n// アセンブリのバージョン情報は、以下の 4 つの属性で構成されます :\n//\n//      メジャー バージョン\n//      マイナ バージョン \n//      ビルド番号\n//      リビジョン\n//\n// 下にあるように、'*' を使って、すべての値を指定するか、 \n// ビルドおよびリビジョン番号を既定値にすることができます :\n\n[assembly: AssemblyVersion(\"1.0.*\")]\n\n//\n// アセンブリに署名するには、使用するキーを指定しなければなりません。 \n// アセンブリ署名に関する詳細については、Microsoft .NET Framework ドキュメントを参照してください。\n//\n// 下記の属性を使って、署名に使うキーを制御します。 \n//\n// メモ : \n//   (*) キーが指定されないと、アセンブリは署名されません。\n//   (*) KeyName は、コンピュータにインストールされている\n//        暗号サービス プロバイダ (CSP) のキーを表します。KeyFile は、\n//       キーを含むファイルです。\n//   (*) KeyFile および KeyName の値が共に指定されている場合は、 \n//       以下の処理が行われます :\n//       (1) KeyName が CSP に見つかった場合、そのキーが使われます。\n//       (2) KeyName が存在せず、KeyFile が存在する場合、 \n//           KeyFile にあるキーが CSP にインストールされ、使われます。\n//   (*) KeyFile を作成するには、sn.exe (厳密な名前) ユーティリティを使ってください。\n//       KeyFile を指定するとき、KeyFile の場所は、\n//       プロジェクト出力 ディレクトリへの相対パスでなければなりません。\n//       パスは、%Project Directory%\\obj\\<configuration> です。たとえば、KeyFile がプロジェクト ディレクトリにある場合、\n//       AssemblyKeyFile 属性を \n//       [assembly: AssemblyKeyFile(\"..\\\\..\\\\mykey.snk\")] として指定します。\n//   (*) 遅延署名は高度なオプションです。\n//       詳細については Microsoft .NET Framework ドキュメントを参照してください。\n//\n[assembly: AssemblyDelaySign(false)]\n[assembly: AssemblyKeyFile(\"\")]\n[assembly: AssemblyKeyName(\"\")]\n"
  },
  {
    "path": "Chapters/Old/LineArt/Form1.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing System.Data;\nusing System.Threading;\n\nnamespace LineArt\n{\n\t/// <summary>\n\t/// ひたすらラインアートを描写し続けるだけのフォーム。\n\t/// </summary>\n\tpublic class LineArtForm : System.Windows.Forms.Form\n\t{\n\t\tpublic const int default_lines  = 4;\n\t\tpublic const int default_vertex = 4;\n\t\tpublic const int default_width  = 640;\n\t\tpublic const int default_height = 480;\n\t\tpublic const int default_wait = 0;\n\t\tconst string parameter_file = \"parameter.xml\";\n\n\t\tint vertex;\n\t\tint lines;\n\t\tint wait_time;\n\n\t\tpublic Point[][] p;\n\t\tpublic Size[] v;\n\t\tThread thread;\n\t\tbool loop_flag=true;\n\n\t\t/// <summary>\n\t\t/// 必要なデザイナ変数です。\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.Container components = null;\n\n\t\tpublic LineArtForm()\n\t\t{\n\t\t\tInitializeComponent();\n\n\t\t\tMenuItem item = new MenuItem(\"設定\");\n\t\t\titem.Click += new EventHandler(ParameterSetting);\n\t\t\tSystem.Windows.Forms.ContextMenu menu = new ContextMenu();\n\t\t\tmenu.MenuItems.Add(item);\n\t\t\tthis.ContextMenu = menu;\n\n\t\t\tReadParameter();\n\n\t\t\tInitializeLineObject();\n\n\t\t\tthread = new Thread(new ThreadStart(ThreadProc));\n\t\t\tthread.Start();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 使用されているリソースに後処理を実行します。\n\t\t/// </summary>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif( disposing )\n\t\t\t{\n\t\t\t\tif (components != null) \n\t\t\t\t{\n\t\t\t\t\tcomponents.Dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Windows Form Designer generated code\n\t\t/// <summary>\n\t\t/// デザイナ サポートに必要なメソッドです。このメソッドの内容を\n\t\t/// コード エディタで変更しないでください。\n\t\t/// </summary>\n\t\tprivate void InitializeComponent()\n\t\t{\n\t\t\tSystem.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(LineArtForm));\n\t\t\t// \n\t\t\t// LineArtForm\n\t\t\t// \n\t\t\tthis.AutoScaleBaseSize = new System.Drawing.Size(5, 12);\n\t\t\tthis.BackColor = System.Drawing.Color.White;\n\t\t\tthis.ClientSize = new System.Drawing.Size(632, 453);\n\t\t\tthis.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n\t\t\tthis.MinimizeBox = false;\n\t\t\tthis.Name = \"LineArtForm\";\n\t\t\tthis.Text = \"Line Art\";\n\t\t\tthis.Closed += new System.EventHandler(this.LineArtForm_Closed);\n\n\t\t}\n\t\t#endregion\n\n\t\t/// <summary>\n\t\t/// アプリケーションのメイン エントリ ポイントです。\n\t\t/// </summary>\n\t\t[STAThread]\n\t\tstatic void Main(string[] args) \n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tApplication.Run(new LineArtForm());\n\t\t\t}\n\t\t\tcatch(Exception e)\n\t\t\t{\n\t\t\t\tMessageBox.Show(e.GetType() + \" \" + e.Message + \"\\n\");\n\t\t\t}\n\t\t}//Main\n\n\t\t/// <summary>\n\t\t/// ラインオブジェクトの初期化。\n\t\t/// 頂点の座標および速度をランダムに初期化する。\n\t\t/// </summary>\n\t\tprivate void InitializeLineObject()\n\t\t{\n\t\t\tRandom rnd = new Random();\n\n\t\t\tthis.p = new Point[lines][];\n\t\t\tthis.p[0] = new Point[vertex];\n\t\t\tthis.v = new Size[vertex];\n\t\t\tfor(int j=0; j<vertex; ++j)\n\t\t\t{\n\t\t\t\tthis.p[0][j].X = (rnd.Next()>>3) % this.ClientSize.Width;\n\t\t\t\tthis.p[0][j].Y = (rnd.Next()>>3) % this.ClientSize.Height;\n\t\t\t\tdouble theta = rnd.NextDouble() * 2*Math.PI;\n\t\t\t\tdouble r = rnd.NextDouble() * 5+2;\n\t\t\t\tthis.v[j].Width = (int)(r * Math.Cos(theta));\n\t\t\t\tthis.v[j].Height = (int)(r * Math.Sin(theta));\n\t\t\t}\n\t\t\tfor(int i=1; i<lines; ++i)\n\t\t\t{\n\t\t\t\tthis.p[i] = new Point[vertex];\n\t\t\t\tfor(int j=0; j<vertex; ++j)\n\t\t\t\t{\n\t\t\t\t\tthis.p[i][j] = this.p[i-1][j];\n\t\t\t\t}\n\t\t\t}\n\t\t}//InitializeLineObject\n\n\t\t/// <summary>\n\t\t/// 画面背景描写イベントハンドラ。\n\t\t/// </summary>\n\t\tprotected override void OnPaintBackground(PaintEventArgs e)\n\t\t{\n\t\t\tBitmap bmp = new Bitmap(this.Width, this.Height);\n\t\t\tGraphics g = Graphics.FromImage(bmp);\n\n\t\t\tg.FillRectangle(new SolidBrush(Color.White), 0, 0, this.Width, this.Height);\n\t\t\tfor(int i=0; i<this.lines; ++i)\n\t\t\t{\n\t\t\t\tg.DrawPolygon(new Pen(Color.Black), this.p[i]);\n\t\t\t}\n\t\t\te.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);\n\t\t}//OnPaintBackground\n\n\t\t/// <summary>\n\t\t/// 画面更新用のスレッド。\n\t\t/// ラインオブジェクトの頂点位置および速度を更新する。\n\t\t/// </summary>\n\t\tvoid ThreadProc()\n\t\t{\n\t\t\tfor(;;)\n\t\t\t{\n\t\t\t\tlock(this)\n\t\t\t\t{\n\t\t\t\t\tfor(int j=0; j<this.vertex; ++j)\n\t\t\t\t\t{\n\t\t\t\t\t\t//残像を作る\n\t\t\t\t\t\tfor(int i=this.lines-1; i>0; --i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthis.p[i][j] = this.p[i-1][j];\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//点の位置の更新\n\t\t\t\t\t\tthis.p[0][j] += this.v[j];\n\t\t\t\t\t\t//画面からはみ出したときの処理\n\t\t\t\t\t\tif(this.p[0][j].X >= this.ClientSize.Width)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthis.p[0][j].X = this.ClientSize.Width * 2 - this.p[0][j].X;\n\t\t\t\t\t\t\tthis.v[j].Width = -this.v[j].Width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(this.p[0][j].X < 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthis.p[0][j].X = -this.p[0][j].X;\n\t\t\t\t\t\t\tthis.v[j].Width = -this.v[j].Width;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(this.p[0][j].Y >= this.ClientSize.Height)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthis.p[0][j].Y = this.ClientSize.Height * 2 - this.p[0][j].Y;\n\t\t\t\t\t\t\tthis.v[j].Height = -this.v[j].Height;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if(this.p[0][j].Y < 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tthis.p[0][j].Y = -this.p[0][j].Y;\n\t\t\t\t\t\t\tthis.v[j].Height = -this.v[j].Height;\n\t\t\t\t\t\t}\n\t\t\t\t\t}//for\n\t\t\t\t\t//終了すべきかどうか判断\n\t\t\t\t\tif(!this.loop_flag)\n\t\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t//画面の更新\n\t\t\t\tthis.Refresh();\n\t\t\t\t//GCの強制\n\t\t\t\tGC.Collect();\n\n\t\t\t\tThread.Sleep(this.wait_time);\n\t\t\t}\n\t\t}//ThreadProc\n\n\t\t/// <summary>\n\t\t/// プログラム終了時の処理。\n\t\t/// 設定をファイルに保存する。\n\t\t/// </summary>\n\t\tprivate void LineArtForm_Closed(object sender, System.EventArgs e)\n\t\t{\n\t\t\tlock(this)\n\t\t\t{\n\t\t\t\tthis.loop_flag = false;\n\t\t\t}\n\t\t\ttry\n\t\t\t{\n\t\t\t\tthread.Join();\n\t\t\t}\n\t\t\tcatch(Exception)\n\t\t\t{\n\t\t\t}\n\t\t\tWriteParameter();\n\t\t}//LineArtForm_Closed\n\n\t\t/// <summary>\n\t\t/// コンテキストメニューの「設定」が押されたときのイベントハンドラ。\n\t\t/// 設定用ダイアログを表示し、設定値の更新を行う。\n\t\t/// </summary>\n\t\tprivate void ParameterSetting(object sender, System.EventArgs e)\n\t\t{\n\t\t\tSettingForm form = new SettingForm();\n\t\t\tform.Vertex   = this.p[0].Length;\n\t\t\tform.Lines    = this.p.Length;\n\t\t\tform.WaitTime = this.wait_time;\n\t\t\tDialogResult res = form.ShowDialog();\n\t\t\tif(res == DialogResult.OK)\n\t\t\t{\n\t\t\t\tlock(this)\n\t\t\t\t{\n\t\t\t\t\tthis.lines     = form.Lines;\n\t\t\t\t\tthis.vertex    = form.Vertex;\n\t\t\t\t\tthis.wait_time = form.WaitTime;\n\t\t\t\t\tInitializeLineObject();\n\t\t\t\t}\n\t\t\t}\n\t\t}//ParameterSetting\n\n\t\t/// <summary>\n\t\t/// 設定値をXMLファイルから読み出す。\n\t\t/// </summary>\n\t\tprivate void ReadParameter()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tSystem.Xml.XmlDocument doc = new System.Xml.XmlDocument();\n\t\t\t\tdoc.Load(parameter_file);\n\n\t\t\t\tSystem.Xml.XmlElement root = doc.DocumentElement;\n\n\t\t\t\tthis.Width     = Int32.Parse(root.GetElementsByTagName(\"Width\").Item(0).InnerText);\n\t\t\t\tthis.Height    = Int32.Parse(root.GetElementsByTagName(\"Height\").Item(0).InnerText);\n\t\t\t\tthis.lines     = Int32.Parse(root.GetElementsByTagName(\"Lines\").Item(0).InnerText);\n\t\t\t\tthis.vertex    = Int32.Parse(root.GetElementsByTagName(\"Vertex\").Item(0).InnerText);\n\t\t\t\tthis.wait_time = Int32.Parse(root.GetElementsByTagName(\"WaitTime\").Item(0).InnerText);\n\t\t\t}\n\t\t\tcatch(Exception)\n\t\t\t{\n\t\t\t\tthis.Width    = LineArtForm.default_width;\n\t\t\t\tthis.Height   = LineArtForm.default_height;\n\t\t\t\tthis.lines    = LineArtForm.default_lines;\n\t\t\t\tthis.vertex   = LineArtForm.default_vertex;\n\t\t\t\tthis.wait_time= LineArtForm.default_wait;\n\t\t\t}\n\t\t}//ReadParameter\n\n\t\t/// <summary>\n\t\t/// 設定値をXMLファイルに書き出す。\n\t\t/// </summary>\n\t\tprivate void WriteParameter()\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tSystem.Xml.XmlDocument doc = new System.Xml.XmlDocument();\n\t\t\t\tSystem.Xml.XmlElement root = doc.CreateElement(parameter_file);\n\t\t\t\tSystem.Xml.XmlElement elem;\n\n\t\t\t\tdoc.AppendChild(root);\n\n\t\t\t\telem = doc.CreateElement(\"Width\");\n\t\t\t\telem.InnerText = this.Width.ToString();\n\t\t\t\troot.AppendChild(elem);\n\n\t\t\t\telem = doc.CreateElement(\"Height\");\n\t\t\t\telem.InnerText = this.Height.ToString();\n\t\t\t\troot.AppendChild(elem);\n\n\t\t\t\telem = doc.CreateElement(\"Lines\");\n\t\t\t\telem.InnerText = this.lines.ToString();\n\t\t\t\troot.AppendChild(elem);\n\n\t\t\t\telem = doc.CreateElement(\"Vertex\");\n\t\t\t\telem.InnerText = this.vertex.ToString();\n\t\t\t\troot.AppendChild(elem);\n\n\t\t\t\telem = doc.CreateElement(\"WaitTime\");\n\t\t\t\telem.InnerText = this.wait_time.ToString();\n\t\t\t\troot.AppendChild(elem);\n\n\t\t\t\tdoc.Save(\"parameter.xml\");\n\t\t\t}\n\t\t\tcatch(Exception e)\n\t\t\t{\n\t\t\t\tMessageBox.Show(e.Message);\n\t\t\t}\n\t\t}//WriteParameter\n\t}//class LineArtForm\n}//namespace LineArt\n"
  },
  {
    "path": "Chapters/Old/LineArt/Form1.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n            Microsoft ResX Schema \n        \n            Version 1.3\n                \n            The primary goals of this format is to allow a simple XML format \n            that is mostly human readable. The generation and parsing of the \n            various data types are done through the TypeConverter classes \n            associated with the data types.\n        \n            Example:\n        \n                ... ado.net/XML headers & schema ...\n                <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n                <resheader name=\"version\">1.3</resheader>\n                <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n                <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n                <data name=\"Name1\">this is my long string</data>\n                <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n                <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n                    [base64 mime encoded serialized .NET Framework object]\n                </data>\n                <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n                    [base64 mime encoded string representing a byte array form of the .NET Framework object]\n                </data>\n        \n            There are any number of \"resheader\" rows that contain simple \n            name/value pairs.\n            \n            Each data row contains a name, and value. The row also contains a \n            type or mimetype. Type corresponds to a .NET class that support \n            text/value conversion through the TypeConverter architecture. \n            Classes that don't support this are serialized and stored with the \n            mimetype set.\n                     \n            The mimetype is used for serialized objects, and tells the \n            ResXResourceReader how to depersist the object. This is currently not \n            extensible. For a given mimetype the value must be set accordingly:\n        \n            Note - application/x-microsoft.net.object.binary.base64 is the format \n                   that the ResXResourceWriter will generate, however the reader can \n                   read any of the formats listed below.\n        \n            mimetype: application/x-microsoft.net.object.binary.base64\n            value   : The object must be serialized with \n                    : System.Serialization.Formatters.Binary.BinaryFormatter\n                    : and then encoded with base64 encoding.\n        \n            mimetype: application/x-microsoft.net.object.soap.base64\n            value   : The object must be serialized with \n                    : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n                    : and then encoded with base64 encoding.\n            mimetype: application/x-microsoft.net.object.bytearray.base64\n            value   : The object must be serialized into a byte array \n                    : using a System.ComponentModel.TypeConverter\n                    : and then encoded with base64 encoding.\n        -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>1.3</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"$this.Name\">\n    <value>LineArtForm</value>\n  </data>\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAC\n        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/\n        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3d3d3d3d3d3d3d3dwBEREREREREREREREREREcAT/\n        ////////////////9HAE//////////////////RwBP/////////////////0cAT/////////mf/P////\n        9HAE////////+f/Mz/////RwBP///////5/Mn8/////0cAT///////mqqqqqr///9HAE//+qqqqq////\n        yv////RwBP//+v/M/////8r////0cAT///+s+f////+p////9HAE///M+p//////rP////RwBP/8z/mv\n        ////+vyf///0cAT///zM+v////r8+f//9HAE///5/8yv//+v/Pn///RwBP//mZmZmszJqZyZn//0cAT/\n        //////+v+sz8////9HAE////////+vr/zP////RwBP////////+v///////0cASIiIiIiIiIiIiIiIiI\n        hHAERERERERERERERERERERwBExMTExMTExMTE7Ozkl0cATMzMzMzMzMzMzMzMzMxAAARERERERERERE\n        REREREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////\n        /////////////8AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA\n        AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAA8AAAAf/////////////\n        //8oAAAAEAAAACAAAAABAAQAAAAAAIAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAA\n        AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAB3d3d3d3\n        d3dERERERERER0////////hHT/zP/5n/+EdP/PzMyf/4R0//yf/8zPhHT5nP//zP+EdP/8mZyf/4R0//\n        /MyZn/hHT//8////+EdIiIiIiIiIR0zMzMzMzMxHxERERERERMAAAAAAAAAAAAAAAAAAAAAA//8AAIAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD//wAA//8AAA==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "Chapters/Old/LineArt/LineArt.csproj",
    "content": "<VisualStudioProject>\n    <CSHARP\n        ProjectType = \"Local\"\n        ProductVersion = \"7.0.9466\"\n        SchemaVersion = \"1.0\"\n        ProjectGuid = \"{8A892CB5-4571-4977-A7F5-29F5BE128C44}\"\n    >\n        <Build>\n            <Settings\n                ApplicationIcon = \"App.ico\"\n                AssemblyKeyContainerName = \"\"\n                AssemblyName = \"LineArt\"\n                AssemblyOriginatorKeyFile = \"\"\n                DefaultClientScript = \"JScript\"\n                DefaultHTMLPageLayout = \"Grid\"\n                DefaultTargetSchema = \"IE50\"\n                DelaySign = \"false\"\n                OutputType = \"WinExe\"\n                RootNamespace = \"LineArt\"\n                StartupObject = \"\"\n            >\n                <Config\n                    Name = \"Debug\"\n                    AllowUnsafeBlocks = \"false\"\n                    BaseAddress = \"285212672\"\n                    CheckForOverflowUnderflow = \"false\"\n                    ConfigurationOverrideFile = \"\"\n                    DefineConstants = \"DEBUG;TRACE\"\n                    DocumentationFile = \"\"\n                    DebugSymbols = \"true\"\n                    FileAlignment = \"4096\"\n                    IncrementalBuild = \"true\"\n                    Optimize = \"false\"\n                    OutputPath = \"bin\\Debug\\\"\n                    RegisterForComInterop = \"false\"\n                    RemoveIntegerChecks = \"false\"\n                    TreatWarningsAsErrors = \"false\"\n                    WarningLevel = \"4\"\n                />\n                <Config\n                    Name = \"Release\"\n                    AllowUnsafeBlocks = \"false\"\n                    BaseAddress = \"285212672\"\n                    CheckForOverflowUnderflow = \"false\"\n                    ConfigurationOverrideFile = \"\"\n                    DefineConstants = \"TRACE\"\n                    DocumentationFile = \"\"\n                    DebugSymbols = \"false\"\n                    FileAlignment = \"4096\"\n                    IncrementalBuild = \"false\"\n                    Optimize = \"true\"\n                    OutputPath = \"bin\\Release\\\"\n                    RegisterForComInterop = \"false\"\n                    RemoveIntegerChecks = \"false\"\n                    TreatWarningsAsErrors = \"false\"\n                    WarningLevel = \"4\"\n                />\n            </Settings>\n            <References>\n                <Reference\n                    Name = \"System\"\n                    AssemblyName = \"System\"\n                    HintPath = \"C:\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.dll\"\n                />\n                <Reference\n                    Name = \"System.Data\"\n                    AssemblyName = \"System.Data\"\n                    HintPath = \"C:\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.Data.dll\"\n                />\n                <Reference\n                    Name = \"System.Drawing\"\n                    AssemblyName = \"System.Drawing\"\n                    HintPath = \"C:\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.Drawing.dll\"\n                />\n                <Reference\n                    Name = \"System.Windows.Forms\"\n                    AssemblyName = \"System.Windows.Forms\"\n                    HintPath = \"C:\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.Windows.Forms.dll\"\n                />\n                <Reference\n                    Name = \"System.XML\"\n                    AssemblyName = \"System.Xml\"\n                    HintPath = \"C:\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.XML.dll\"\n                />\n            </References>\n        </Build>\n        <Files>\n            <Include>\n                <File\n                    RelPath = \"App.ico\"\n                    BuildAction = \"Content\"\n                />\n                <File\n                    RelPath = \"AssemblyInfo.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"Form1.cs\"\n                    SubType = \"Form\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"Form1.resx\"\n                    DependentUpon = \"Form1.cs\"\n                    BuildAction = \"EmbeddedResource\"\n                />\n                <File\n                    RelPath = \"SettingForm.cs\"\n                    SubType = \"Form\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"SettingForm.resx\"\n                    DependentUpon = \"SettingForm.cs\"\n                    BuildAction = \"EmbeddedResource\"\n                />\n            </Include>\n        </Files>\n    </CSHARP>\n</VisualStudioProject>\n\n"
  },
  {
    "path": "Chapters/Old/LineArt/LineArt.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 7.00\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"LineArt\", \"LineArt.csproj\", \"{8A892CB5-4571-4977-A7F5-29F5BE128C44}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfiguration) = preSolution\n\t\tConfigName.0 = Debug\n\t\tConfigName.1 = Release\n\tEndGlobalSection\n\tGlobalSection(ProjectDependencies) = postSolution\n\tEndGlobalSection\n\tGlobalSection(ProjectConfiguration) = postSolution\n\t\t{8A892CB5-4571-4977-A7F5-29F5BE128C44}.Debug.ActiveCfg = Debug|.NET\n\t\t{8A892CB5-4571-4977-A7F5-29F5BE128C44}.Debug.Build.0 = Debug|.NET\n\t\t{8A892CB5-4571-4977-A7F5-29F5BE128C44}.Release.ActiveCfg = Release|.NET\n\t\t{8A892CB5-4571-4977-A7F5-29F5BE128C44}.Release.Build.0 = Release|.NET\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityAddIns) = postSolution\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Old/LineArt/SettingForm.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Windows.Forms;\n\nnamespace LineArt\n{\n\t/// <summary>\n\t/// パラメータ設定用ダイアログ。\n\t/// </summary>\n\tpublic class SettingForm : System.Windows.Forms.Form\n\t{\n\t\tprivate System.Windows.Forms.Label label1;\n\t\tprivate System.Windows.Forms.Label label2;\n\t\tprivate System.Windows.Forms.Label label3;\n\t\tprivate System.Windows.Forms.TextBox textBoxVertex;\n\t\tprivate System.Windows.Forms.TextBox textBoxLines;\n\t\tprivate System.Windows.Forms.TextBox textBoxWait;\n\t\tprivate System.Windows.Forms.Button buttonOK;\n\t\tprivate System.Windows.Forms.Button buttonCancel;\n\t\t/// <summary>\n\t\t/// 必要なデザイナ変数です。\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.Container components = null;\n\n\t\tpublic SettingForm()\n\t\t{\n\t\t\tInitializeComponent();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 使用されているリソースに後処理を実行します。\n\t\t/// </summary>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif( disposing )\n\t\t\t{\n\t\t\t\tif(components != null)\n\t\t\t\t{\n\t\t\t\t\tcomponents.Dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Windows Form Designer generated code\n\t\t/// <summary>\n\t\t/// デザイナ サポートに必要なメソッドです。このメソッドの内容を\n\t\t/// コード エディタで変更しないでください。\n\t\t/// </summary>\n\t\tprivate void InitializeComponent()\n\t\t{\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\n\t\t\tthis.label3 = new System.Windows.Forms.Label();\n\t\t\tthis.textBoxVertex = new System.Windows.Forms.TextBox();\n\t\t\tthis.textBoxLines = new System.Windows.Forms.TextBox();\n\t\t\tthis.textBoxWait = new System.Windows.Forms.TextBox();\n\t\t\tthis.buttonOK = new System.Windows.Forms.Button();\n\t\t\tthis.buttonCancel = new System.Windows.Forms.Button();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// label1\n\t\t\t// \n\t\t\tthis.label1.Location = new System.Drawing.Point(8, 16);\n\t\t\tthis.label1.Name = \"label1\";\n\t\t\tthis.label1.Size = new System.Drawing.Size(56, 16);\n\t\t\tthis.label1.TabIndex = 0;\n\t\t\tthis.label1.Text = \"頂点の数\";\n\t\t\t// \n\t\t\t// label2\n\t\t\t// \n\t\t\tthis.label2.Location = new System.Drawing.Point(8, 40);\n\t\t\tthis.label2.Name = \"label2\";\n\t\t\tthis.label2.Size = new System.Drawing.Size(56, 16);\n\t\t\tthis.label2.TabIndex = 1;\n\t\t\tthis.label2.Text = \"線の数\";\n\t\t\t// \n\t\t\t// label3\n\t\t\t// \n\t\t\tthis.label3.Location = new System.Drawing.Point(8, 64);\n\t\t\tthis.label3.Name = \"label3\";\n\t\t\tthis.label3.Size = new System.Drawing.Size(56, 16);\n\t\t\tthis.label3.TabIndex = 2;\n\t\t\tthis.label3.Text = \"ウェイト\";\n\t\t\t// \n\t\t\t// textBoxVertex\n\t\t\t// \n\t\t\tthis.textBoxVertex.Location = new System.Drawing.Point(64, 8);\n\t\t\tthis.textBoxVertex.Name = \"textBoxVertex\";\n\t\t\tthis.textBoxVertex.Size = new System.Drawing.Size(32, 19);\n\t\t\tthis.textBoxVertex.TabIndex = 3;\n\t\t\tthis.textBoxVertex.Text = \"\";\n\t\t\tthis.textBoxVertex.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n\t\t\t// \n\t\t\t// textBoxLines\n\t\t\t// \n\t\t\tthis.textBoxLines.Location = new System.Drawing.Point(64, 32);\n\t\t\tthis.textBoxLines.Name = \"textBoxLines\";\n\t\t\tthis.textBoxLines.Size = new System.Drawing.Size(32, 19);\n\t\t\tthis.textBoxLines.TabIndex = 4;\n\t\t\tthis.textBoxLines.Text = \"\";\n\t\t\tthis.textBoxLines.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n\t\t\t// \n\t\t\t// textBoxWait\n\t\t\t// \n\t\t\tthis.textBoxWait.Location = new System.Drawing.Point(64, 56);\n\t\t\tthis.textBoxWait.Name = \"textBoxWait\";\n\t\t\tthis.textBoxWait.Size = new System.Drawing.Size(32, 19);\n\t\t\tthis.textBoxWait.TabIndex = 5;\n\t\t\tthis.textBoxWait.Text = \"\";\n\t\t\tthis.textBoxWait.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n\t\t\t// \n\t\t\t// buttonOK\n\t\t\t// \n\t\t\tthis.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK;\n\t\t\tthis.buttonOK.Location = new System.Drawing.Point(8, 88);\n\t\t\tthis.buttonOK.Name = \"buttonOK\";\n\t\t\tthis.buttonOK.Size = new System.Drawing.Size(56, 24);\n\t\t\tthis.buttonOK.TabIndex = 6;\n\t\t\tthis.buttonOK.Text = \"OK\";\n\t\t\t// \n\t\t\t// buttonCancel\n\t\t\t// \n\t\t\tthis.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n\t\t\tthis.buttonCancel.Location = new System.Drawing.Point(72, 88);\n\t\t\tthis.buttonCancel.Name = \"buttonCancel\";\n\t\t\tthis.buttonCancel.Size = new System.Drawing.Size(56, 24);\n\t\t\tthis.buttonCancel.TabIndex = 7;\n\t\t\tthis.buttonCancel.Text = \"Cancel\";\n\t\t\t// \n\t\t\t// SettingForm\n\t\t\t// \n\t\t\tthis.AcceptButton = this.buttonOK;\n\t\t\tthis.AutoScaleBaseSize = new System.Drawing.Size(5, 12);\n\t\t\tthis.CancelButton = this.buttonCancel;\n\t\t\tthis.ClientSize = new System.Drawing.Size(136, 117);\n\t\t\tthis.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.buttonCancel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.buttonOK,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.textBoxWait,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.textBoxLines,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.textBoxVertex,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.label3,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.label2,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.label1});\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n\t\t\tthis.MaximizeBox = false;\n\t\t\tthis.MinimizeBox = false;\n\t\t\tthis.Name = \"SettingForm\";\n\t\t\tthis.Text = \"SettingForm\";\n\t\t\tthis.ResumeLayout(false);\n\n\t\t}\n\t\t#endregion\n\n\t\tprivate void buttonOK_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.Close();\n\t\t}\n\n\t\tprivate void buttonCancel_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.Close();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 頂点の数。\n\t\t/// </summary>\n\t\tpublic int Vertex\n\t\t{\n\t\t\tset{this.textBoxVertex.Text = value.ToString();}\n\t\t\tget\n\t\t\t{\n\t\t\t\tint val = LineArtForm.default_vertex;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tval = Int32.Parse(this.textBoxVertex.Text);\n\t\t\t\t}\n\t\t\t\tcatch(Exception){}\n\t\t\t\treturn val;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 線の本数。\n\t\t/// </summary>\n\t\tpublic int Lines\n\t\t{\n\t\t\tset{this.textBoxLines.Text = value.ToString();}\n\t\t\tget\n\t\t\t{\n\t\t\t\tint val = LineArtForm.default_lines;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tval = Int32.Parse(this.textBoxLines.Text);\n\t\t\t\t}\n\t\t\t\tcatch(Exception){}\n\t\t\t\treturn val;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 表示速度のウェイト。\n\t\t/// </summary>\n\t\tpublic int WaitTime\n\t\t{\n\t\t\tset{this.textBoxWait.Text = value.ToString();}\n\t\t\tget\n\t\t\t{\n\t\t\t\tint val = LineArtForm.default_wait;\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tval = Int32.Parse(this.textBoxWait.Text);\n\t\t\t\t}\n\t\t\t\tcatch(Exception){}\n\t\t\t\treturn val;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/LineArt/SettingForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n            Microsoft ResX Schema \n        \n            Version 1.3\n                \n            The primary goals of this format is to allow a simple XML format \n            that is mostly human readable. The generation and parsing of the \n            various data types are done through the TypeConverter classes \n            associated with the data types.\n        \n            Example:\n        \n                ... ado.net/XML headers & schema ...\n                <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n                <resheader name=\"version\">1.3</resheader>\n                <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n                <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n                <data name=\"Name1\">this is my long string</data>\n                <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n                <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n                    [base64 mime encoded serialized .NET Framework object]\n                </data>\n                <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n                    [base64 mime encoded string representing a byte array form of the .NET Framework object]\n                </data>\n        \n            There are any number of \"resheader\" rows that contain simple \n            name/value pairs.\n            \n            Each data row contains a name, and value. The row also contains a \n            type or mimetype. Type corresponds to a .NET class that support \n            text/value conversion through the TypeConverter architecture. \n            Classes that don't support this are serialized and stored with the \n            mimetype set.\n                     \n            The mimetype is used for serialized objects, and tells the \n            ResXResourceReader how to depersist the object. This is currently not \n            extensible. For a given mimetype the value must be set accordingly:\n        \n            Note - application/x-microsoft.net.object.binary.base64 is the format \n                   that the ResXResourceWriter will generate, however the reader can \n                   read any of the formats listed below.\n        \n            mimetype: application/x-microsoft.net.object.binary.base64\n            value   : The object must be serialized with \n                    : System.Serialization.Formatters.Binary.BinaryFormatter\n                    : and then encoded with base64 encoding.\n        \n            mimetype: application/x-microsoft.net.object.soap.base64\n            value   : The object must be serialized with \n                    : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n                    : and then encoded with base64 encoding.\n            mimetype: application/x-microsoft.net.object.bytearray.base64\n            value   : The object must be serialized into a byte array \n                    : using a System.ComponentModel.TypeConverter\n                    : and then encoded with base64 encoding.\n        -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>1.3</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"$this.Name\">\n    <value>SettingForm</value>\n  </data>\n</root>"
  },
  {
    "path": "Chapters/Old/SoundLibrary/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n//\n// アセンブリに関する一般情報は以下の \n// 属性セットを通して制御されます。アセンブリに関連付けられている \n// 情報を変更するには、これらの属性値を変更してください。\n//\n[assembly: AssemblyTitle(\"SoundLibrary\")]\n[assembly: AssemblyDescription(\"Class Library for Sound Signal Processing\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"\")]\n[assembly: AssemblyCopyright(\"Iwanaga Nobuyuki\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\t\t\n\n//\n// アセンブリのバージョン情報は、以下の 4 つの属性で構成されます :\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// 下にあるように、'*' を使って、すべての値を指定するか、\n// ビルドおよびリビジョン番号を既定値にすることができます。\n\n[assembly: AssemblyVersion(\"1.0.*\")]\n\n//\n// アセンブリに署名するには、使用するキーを指定しなければなりません。 \n// アセンブリ署名に関する詳細については、Microsoft .NET Framework ドキュメントを参照してください。\n//\n// 下記の属性を使って、署名に使うキーを制御します。 \n//\n// メモ : \n//   (*) キーが指定されないと、アセンブリは署名されません。\n//   (*) KeyName は、コンピュータにインストールされている\n//        暗号サービス プロバイダ (CSP) のキーを表します。KeyFile は、\n//       キーを含むファイルです。\n//   (*) KeyFile および KeyName の値が共に指定されている場合は、 \n//       以下の処理が行われます :\n//       (1) KeyName が CSP に見つかった場合、そのキーが使われます。\n//       (2) KeyName が存在せず、KeyFile が存在する場合、 \n//           KeyFile にあるキーが CSP にインストールされ、使われます。\n//   (*) KeyFile を作成するには、sn.exe (厳密な名前) ユーティリティを使ってください。\n//       KeyFile を指定するとき、KeyFile の場所は、\n//       プロジェクト出力 ディレクトリへの相対パスでなければなりません。\n//       パスは、%Project Directory%\\obj\\<configuration> です。たとえば、KeyFile がプロジェクト ディレクトリにある場合、\n//       AssemblyKeyFile 属性を \n//       [assembly: AssemblyKeyFile(\"..\\\\..\\\\mykey.snk\")] として指定します。\n//   (*) 遅延署名は高度なオプションです。\n//       詳細については Microsoft .NET Framework ドキュメントを参照してください。\n//\n[assembly: AssemblyDelaySign(false)]\n[assembly: AssemblyKeyFile(\"\")]\n[assembly: AssemblyKeyName(\"\")]\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/BitOperation.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary\n{\n\t/// <summary>\n\t/// ビット演算用クラス。\n\t/// </summary>\n\tpublic class BitOperation\n\t{\n\t\t/// <summary>\n\t\t/// Floor(Log_2(x)) を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"x\"></param>\n\t\t/// <returns></returns>\n\t\tpublic static int FloorLog2(int x)\n\t\t{\n\t\t\tif(x == 0)\n\t\t\t\treturn 0;\n\n\t\t\tint n = 0;\n\t\t\tfor(; x!=1; x/=2, ++n);\n\t\t\treturn n;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Ceil(Log_2(x)) を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"x\"></param>\n\t\t/// <returns></returns>\n\t\tpublic static int CeilLog2(int x)\n\t\t{\n\t\t\tif(x == 0)\n\t\t\t\treturn 0;\n\n\t\t\treturn 1 + FloorLog2(x - 1);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// x を超えない最大の2のべきを求める。\n\t\t/// 2^FloorLog2(x)\n\t\t/// </summary>\n\t\t/// <param name=\"x\"></param>\n\t\t/// <returns></returns>\n\t\t[System.Obsolete(\"FloorPower2 に移行\")]\n\t\tpublic static int Power2(int x)\n\t\t{\n\t\t\treturn FloorPower2(x);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// x を超えない最大の2のべきを求める。\n\t\t/// </summary>\n\t\t/// <param name=\"x\"></param>\n\t\t/// <returns></returns>\n\t\tpublic static int FloorPower2(int x)\n\t\t{\n\t\t\tif(x == 0)\n\t\t\t\treturn 0;\n\n\t\t\tint n = 1;\n\t\t\tfor(; x!=1; x/=2, n*=2);\n\t\t\treturn n;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// x 以上の最小の2のべきを求める。\n\t\t/// 2^CeilLog2(x)\n\t\t/// </summary>\n\t\t/// <param name=\"x\"></param>\n\t\t/// <returns></returns>\n\t\tpublic static int CeilPower2(int x)\n\t\t{\n\t\t\tif(x == 0)\n\t\t\t\treturn 0;\n\n\t\t\treturn 2 * FloorPower2(x - 1);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 下位 n ビットが1、残りが0のマスクを作る。\n\t\t/// </summary>\n\t\t/// <param name=\"n\"></param>\n\t\t/// <returns></returns>\n\t\tpublic static int Mask(int n)\n\t\t{\n\t\t\treturn (1 << n) - 1;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 四捨五入しつつシフト。\n\t\t/// </summary>\n\t\t/// <param name=\"val\">値</param>\n\t\t/// <param name=\"shift\">シフト量</param>\n\t\t/// <returns>シフト後の値</returns>\n\t\tpublic static int RoundShift(long val, int shift)\n\t\t{\n\t\t\treturn (int)((val + (1 << (shift - 1))) >> shift);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Command/CommandParser.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Collections;\nusing System.Text.RegularExpressions;\n\nnamespace SoundLibrary.Command\n{\n\t/// <summary>\n\t/// コマンド処理用のデリゲート。\n\t/// </summary>\n\t/// <remarks>\n\t/// 引数リスト <paramref name=\"args\"/> を受け取って処理を行い、\n\t/// 出力ストリーム <paramref name=\"sout\"/> に結果を出力する。\n\t/// コマンド解釈を終了したいときに true を返す。\n\t/// </remarks>\n\tpublic delegate bool CommandHandlar(string[] args, TextWriter sout);\n\n\t/// <summary>\n\t/// テキストストリームから入力されたコマンドの解釈を行うクラス。\n\t/// </summary>\n\tpublic class CommandParser\n\t{\n\t\t#region 内部クラス\n\n\t\tclass Tuple\n\t\t{\n\t\t\tpublic CommandHandlar ope;\n\t\t\tpublic string help;\n\n\t\t\tpublic Tuple(CommandHandlar ope, string help)\n\t\t\t{\n\t\t\t\tthis.ope = ope;\n\t\t\t\tthis.help = help;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region フィールド\n\n\t\tHashtable commands;\n\t\tCommandHandlar notFound; // コマンドが見つからなかったときの処理\n\n\t\tstring prompt;\n\t\tRegex delim1; // コマンドと引数の区切り文字\n\t\tRegex delim2; // 引数同士の間の区切り文字\n\t\tRegex delim3; // リダイレクト用の区切り文字\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// 区切り文字に空白文字 (\"\\s+\") を使用。\n\t\t/// リダイレクト用に > (\\s*>\\s*) を使用。\n\t\t/// </summary>\n\t\tpublic CommandParser() : this(\"> \", @\"\\s+\", @\"\\s+\", @\"\\s*>\\s*\")\n\t\t{\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// コマンド、引数間の区切り文字(正規表現)を指定。\n\t\t/// </summary>\n\t\t/// <param name=\"delim1\">コマンドと引数の区切り文字</param>\n\t\t/// <param name=\"delim2\">引数同士の間の区切り文字</param>\n\t\t/// <param name=\"delim3\">リダイレクト用の区切り文字</param>\n\t\tpublic CommandParser(string prompt, string delim1, string delim2, string delim3)\n\t\t{\n\t\t\tthis.commands = new Hashtable();\n\t\t\tthis.commands[HELP_COMMAND] = new Tuple(new CommandHandlar(this.ShowHelp), HELP_MESSAGE);\n\t\t\tthis.commands[QUIT_COMMAND] = new Tuple(new CommandHandlar(Quit), QUIT_MESSAGE);\n\t\t\tthis.commands[SOURCE_COMMAND] = new Tuple(new CommandHandlar(this.Source), SOURCE_MESSAGE);\n\n\t\t\tthis.notFound = new CommandHandlar(this.DefaultNotFound);\n\n\t\t\tthis.prompt = prompt;\n\t\t\tthis.delim1 = new Regex(delim1);\n\t\t\tthis.delim2 = new Regex(delim2);\n\t\t\tthis.delim3 = new Regex(delim3);\n\t\t}\n\n\t\t#endregion\n\t\t#region コマンドの解釈\n\n\t\t/// <summary>\n\t\t/// 標準入力ストリームからコマンドを読み出して解釈。\n\t\t/// </summary>\n\t\t/// <returns>コマンド解釈が終わったとき true を返す</returns>\n\t\tpublic bool Parse()\n\t\t{\n\t\t\treturn this.Parse(Console.In, Console.Out);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ストリームからコマンドを読み出して解釈。\n\t\t/// 標準出力ストリームに出力。\n\t\t/// </summary>\n\t\t/// <param name=\"sin\">入力元</param>\n\t\t/// <returns>コマンド解釈が終わったとき true を返す</returns>\n\t\tpublic bool Parse(TextReader sin)\n\t\t{\n\t\t\treturn this.Parse(sin, Console.Out);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ストリームからコマンドを読み出して解釈。\n\t\t/// </summary>\n\t\t/// <param name=\"sin\">入力元</param>\n\t\t/// <param name=\"sout\">出力先</param>\n\t\t/// <returns>コマンド解釈が終わったとき true を返す</returns>\n\t\tpublic bool Parse(TextReader sin, TextWriter sout)\n\t\t{\n\t\t\twhile(true)\n\t\t\t{\n\t\t\t\tif(sin == Console.In && sout == Console.Out)\n\t\t\t\t\tsout.Write(this.prompt);\n\n\t\t\t\tstring line = sin.ReadLine();\n\n\t\t\t\tif(line == null)\n\t\t\t\t\tbreak;\n\n\t\t\t\tstring[] tmp = this.delim3.Split(line);\n\t\t\t\tif(tmp.Length <= 1)\n\t\t\t\t{\n\t\t\t\t\tif(Parse(tmp[0], sout))\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tStreamWriter sout1 = null;\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tsout1 = new StreamWriter(tmp[1], false, System.Text.Encoding.Default);\n\t\t\t\t\t\tif(Parse(tmp[0], sout1))\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tcatch(Exception exc)\n\t\t\t\t\t{\n\t\t\t\t\t\tConsole.Error.Write(exc);\n\t\t\t\t\t}\n\t\t\t\t\tfinally\n\t\t\t\t\t{\n\t\t\t\t\t\tif(sout1 != null) sout1.Close();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// コマンドを1ライン解釈。\n\t\t/// </summary>\n\t\t/// <param name=\"commandLine\">コマンドライン</param>\n\t\t/// <returns>コマンド解釈が終わったとき true を返す</returns>\n\t\tbool Parse(string commandLine, TextWriter sout)\n\t\t{\n\t\t\tif(commandLine == null || commandLine.Length == 0)\n\t\t\t{\n\t\t\t\tShowHelp(sout);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tstring[] tmp = this.delim1.Split(commandLine, 2);\n\n\t\t\tTuple t = (Tuple)this.commands[tmp[0]];\n\n\t\t\tCommandHandlar ope;\n\t\t\tstring[] args;\n\n\t\t\tif(t == null)\n\t\t\t{\n\t\t\t\tope = this.notFound;\n\t\t\t\targs = tmp;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tope = t.ope;\n\t\t\t\tif(tmp.Length < 2)\n\t\t\t\t\targs = null;\n\t\t\t\telse\n\t\t\t\t\targs = this.delim2.Split(tmp[1]);\n\t\t\t}\n\t\t\t\n\t\t\tif(ope == null)\n\t\t\t{\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn ope(args, sout);\n\t\t}\n\n\n\t\t#endregion\n\t\t#region コマンドの追加・削除\n\n\t\t/// <summary>\n\t\t/// コマンドを追加する。\n\t\t/// </summary>\n\t\t/// <param name=\"command\">コマンド名</param>\n\t\t/// <param name=\"ope\">コマンド処理デリゲート</param>\n\t\tpublic void Add(string command, CommandHandlar ope)\n\t\t{\n\t\t\tthis.Add(command, ope, \"\");\n\t\t}\n\n\t\t/// <summary>\n\t\t/// コマンドを追加する。\n\t\t/// </summary>\n\t\t/// <param name=\"command\">コマンド名</param>\n\t\t/// <param name=\"ope\">コマンド処理デリゲート</param>\n\t\t/// <param name=\"help\">ヘルプメッセージ</param>\n\t\tpublic void Add(string command, CommandHandlar ope, string help)\n\t\t{\n\t\t\tthis.commands[command] = new Tuple(ope, help);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// コマンドを削除する。\n\t\t/// </summary>\n\t\t/// <param name=\"command\">コマンド名</param>\n\t\tpublic void Remove(string command)\n\t\t{\n\t\t\tthis.commands.Remove(command);\n\t\t}\n\n\t\t#endregion\n\t\t#region デフォルトコマンド\n\n\t\tconst string QUIT_COMMAND = \"quit\";\n\t\tconst string QUIT_MESSAGE = \"終了します。\\n\";\n\n\t\tconst string HELP_COMMAND = \"help\";\n\t\tconst string HELP_MESSAGE = \"ヘルプを表示します。\\n\";\n\n\t\tconst string SOURCE_COMMAND = \"source\";\n\t\tconst string SOURCE_MESSAGE = \"source [ファイル名]\\nテキストファイルからコマンドを読み込みます。\\n\";\n\n\t\t#region コマンドが見つからなかったとき用\n\n\t\t/// <summary>\n\t\t/// コマンド未登録時用デリゲートを登録。\n\t\t/// </summary>\n\t\t/// <param name=\"notFound\">コマンド未登録時用デリゲート</param>\n\t\tvoid SetNotFound(CommandHandlar notFound)\n\t\t{\n\t\t\tif(notFound == null)\n\t\t\t\tthis.notFound = new CommandHandlar(this.DefaultNotFound);\n\t\t\telse\n\t\t\t\tthis.notFound = notFound;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// コマンド未登録時、デフォルトの動作。\n\t\t/// </summary>\n\t\tbool DefaultNotFound(string[] args, TextWriter sout)\n\t\t{\n\t\t\tif(args.Length >= 1)\n\t\t\t\tsout.Write(\"{0} というコマンドはありません。\\n\", args[0]);\n\t\t\tthis.ShowHelp(sout);\n\t\t\treturn false;\n\t\t}\n\n\t\t#endregion\n\t\t#region ヘルプ用\n\n\t\t/// <summary>\n\t\t/// ヘルプ表示。\n\t\t/// </summary>\n\t\tvoid ShowHelp(TextWriter sout)\n\t\t{\n\t\t\tsout.Write(\"help [コマンド名]\\nと入力することで、各コマンドのヘルプを表示できます。\\n\");\n\n\t\t\tint i=0;\n\t\t\tforeach(string command in commands.Keys)\n\t\t\t{\n\t\t\t\tif(i % 4 == 3)\n\t\t\t\t\tsout.Write(\"\\n\");\n\t\t\t\tsout.Write(\"{0,10}\", command);\n\t\t\t}\n\t\t\tsout.Write(\"\\n\");\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 各コマンドのヘルプ表示。\n\t\t/// </summary>\n\t\t/// <param name=\"command\">コマンド名</param>\n\t\t/// <param name=\"sout\">出力先。</param>\n\t\tbool ShowHelp(string[] command, TextWriter sout)\n\t\t{\n\t\t\tif(command == null || command.Length == 0)\n\t\t\t\tthis.ShowHelp(sout);\n\t\t\telse\n\t\t\t{\n\t\t\t\tTuple t = (Tuple)this.commands[command[0]];\n\n\t\t\t\tif(t == null)\n\t\t\t\t\treturn this.notFound(command, sout);\n\n\t\t\t\tsout.Write(t.help);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\t#endregion\n\t\t#region 終了処理用\n\n\t\tstatic bool Quit(string[] args, TextWriter sout)\n\t\t{\n\t\t\treturn true;\n\t\t}\n\n\t\t#endregion\n\t\t#region 外部ファイル読み込み\n\n\t\t/// <summary>\n\t\t/// テキストファイルからコマンドを読み出す。\n\t\t/// </summary>\n\t\tbool Source(string[] args, TextWriter sout)\n\t\t{\n\t\t\tif(args.Length < 1)\n\t\t\t{\n\t\t\t\tsout.Write(SOURCE_MESSAGE);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tStreamReader sin = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tsin = new StreamReader(args[0], System.Text.Encoding.Default);\n\t\t\t\treturn this.Parse(sin, sout);\n\t\t\t}\n\t\t\tcatch(Exception exc)\n\t\t\t{\n\t\t\t\tConsole.Error.Write(exc);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tif(sin != null) sin.Close();\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Data/DataGenerator.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Data\n{\n\t/// <summary>\n\t/// テスト用のデータ生成インターフェース\n\t/// </summary>\n\tpublic interface IDataGenerator : ICloneable\n\t{\n\t\t/// <summary>\n\t\t/// 次のデータを取り出す。\n\t\t/// </summary>\n\t\t/// <returns>データ</returns>\n\t\tdouble Next();\n\n\t\t/// <summary>\n\t\t/// 初期状態に戻す。\n\t\t/// </summary>\n\t\tvoid Reset();\n\t}\n}//namespace test\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Data/FourierSeriesGenerator.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Data\n{\n\t/// <summary>\n\t/// フーリエ級数を使ってデータを生成する。\n\t/// </summary>\n\tpublic class FourierSeriesGenerator : IDataGenerator\n\t{\n\t\tconst int N = 512;\n\t\tint i = 0;\n\t\tdouble[] gain;\n\t\tdouble[] phase;\n\n\t\tpublic FourierSeriesGenerator(double[] gain, double[] phase)\n\t\t{\n\t\t\tthis.gain = gain;\n\t\t\tthis.phase = phase;\n\t\t}\n\n\t\tpublic double Next()\n\t\t{\n\t\t\tdouble x = 0;\n\t\t\tfor(int k=0; k<N; ++k)\n\t\t\t\tx += this.gain[k] * Math.Cos(Math.PI / N * k * this.i + this.phase[k]);\n\t\t\t++this.i;\n\t\t\treturn x;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tthis.i = 0;\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new FourierSeriesGenerator(this.gain, this.phase);\n\t\t}\n\t}\n}//namespace Data\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Data/ImpulseGenerator.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Data\n{\n\t/// <summary>\n\t/// インパルス列生成\n\t/// </summary>\n\tpublic class ImpulseGenerator : IDataGenerator\n\t{\n\t\tdouble gain;\n\t\tbool first = true;\n\t\tpublic ImpulseGenerator () : this(short.MaxValue){}\n\t\tpublic ImpulseGenerator (double gain){this.gain = gain;}\n\t\tpublic double Next()\n\t\t{\n\t\t\tif(first)\n\t\t\t{\n\t\t\t\tfirst = false;\n\t\t\t\treturn this.gain;\n\t\t\t}\n\t\t\treturn 0;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tthis.first = true;\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new ImpulseGenerator(this.gain);\n\t\t}\n\t}\n}//namespace Data\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Data/MixedDataGenerator.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Data\n{\n\t/// <summary>\n\t/// 複数の IDataGenerator の出力値を混ぜ合わせたデータを生成。\n\t/// </summary>\n\tpublic class MixedDataGenerator : IDataGenerator\n\t{\n\t\tIDataGenerator[] generators;\n\n\t\tpublic MixedDataGenerator(params IDataGenerator[] generators)\n\t\t{\n\t\t\tthis.generators = generators;\n\t\t}\n\n\t\tpublic double Next()\n\t\t{\n\t\t\tdouble x = 0;\n\t\t\tforeach(IDataGenerator gen in this.generators)\n\t\t\t{\n\t\t\t\tx += gen.Next();\n\t\t\t}\n\t\t\treturn x;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tforeach(IDataGenerator gen in this.generators)\n\t\t\t\tgen.Reset();\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\tIDataGenerator[] gen = new IDataGenerator[this.generators.Length];\n\t\t\tfor(int i=0; i<this.generators.Length; ++i)\n\t\t\t{\n\t\t\t\tgen[i] = (IDataGenerator)this.generators[i].Clone();\n\t\t\t}\n\t\t\treturn new MixedDataGenerator(gen);\n\t\t}\n\t}\n}//namespace Data\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Data/RampGenerator.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Data\n{\n\t/// <summary>\n\t/// ランプ関数生成\n\t/// </summary>\n\tpublic class RampGenerator : IDataGenerator\n\t{\n\t\tdouble gain;\n\t\tushort i = 0;\n\t\tpublic RampGenerator() : this(1) {}\n\t\tpublic RampGenerator(double gain){this.gain = gain;}\n\n\t\tpublic double Next()\n\t\t{\n\t\t\tdouble x = (ushort)(this.gain * this.i);\n\t\t\t++this.i;\n\t\t\treturn x;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tthis.i = 0;\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new RampGenerator(this.gain);\n\t\t}\n\t}\n}//namespace Data\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Data/RandomGenerator.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Data\n{\n\t/// <summary>\n\t/// 一様乱数列生成\n\t/// </summary>\n\tpublic class RandomGenerator : IDataGenerator\n\t{\n\t\tRandom rnd;\n\t\tint seed;\n\n\t\tpublic RandomGenerator(){this.rnd = new Random();}\n\t\tpublic RandomGenerator(int seed)\n\t\t{\n\t\t\tthis.seed = seed;\n\t\t\tthis.rnd = new Random(seed);\n\t\t}\n\n\t\tpublic double Next()\n\t\t{\n\t\t\tint i = rnd.Next(ushort.MinValue, ushort.MaxValue);\n\t\t\treturn i;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tthis.rnd = new Random(seed);\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new RandomGenerator(this.seed);\n\t\t}\n\t}\n}//namespace Data\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Data/SinusoidGenerator.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Data\n{\n\t/// <summary>\n\t/// 正弦波生成\n\t/// </summary>\n\tpublic class SinusoidGenerator : IDataGenerator\n\t{\n\t\tint i = 0;\n\t\tdouble w;\n\t\tdouble gain;\n\t\tdouble phase;\n\n\t\tpublic SinusoidGenerator() : this(0) {}\n\t\tpublic SinusoidGenerator(double phase) : this((ushort)short.MaxValue, phase) {}\n\t\tpublic SinusoidGenerator(double gain, double phase) : this(Math.PI / 24000 * 1000, gain, phase) {}\n\n\t\t/// <summary>\n\t\t/// 周波数、振幅、初期位相を指定。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">周波数(2πで正規化)</param>\n\t\t/// <param name=\"gain\">振幅(リニア値)</param>\n\t\t/// <param name=\"phase\">初期位相(rad)</param>\n\t\tpublic SinusoidGenerator(double w, double gain, double phase)\n\t\t{\n\t\t\tthis.w = w;\n\t\t\tthis.gain = gain;\n\t\t\tthis.phase = phase;\n\t\t}\n\n\t\tpublic double Next()\n\t\t{\n\t\t\tdouble x = this.gain * Math.Sin(this.w * this.i + phase);\n\t\t\t++this.i;\n\t\t\treturn x;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tthis.i = 0;\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new SinusoidGenerator(this.w, this.gain, this.phase);\n\t\t}\n\t}\n}//namespace Data\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Data/StepGenerator.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Data\n{\n\t/// <summary>\n\t/// ステップ関数生成\n\t/// </summary>\n\tpublic class StepGenerator : IDataGenerator\n\t{\n\t\tbool first = true;\n\t\tdouble gain;\n\t\tpublic StepGenerator() : this(short.MaxValue / 100){}\n\t\tpublic StepGenerator(double gain){this.gain = gain;}\n\n\t\tpublic double Next()\n\t\t{\n\t\t\tif(first)\n\t\t\t{\n\t\t\t\tfirst = false;\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\treturn this.gain;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tthis.first = true;\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new StepGenerator(this.gain);\n\t\t}\n\t}\n}//namespace Data\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Data/TspGenerator.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Data\n{\n\t/// <summary>\n\t/// TSP 信号\n\t/// </summary>\n\tpublic class TspGenerator : IDataGenerator\n\t{\n\t\tint i = 0;\n\t\tint taps;\n\t\tdouble amp;\n\t\tdouble phase;\n\n\t\tpublic TspGenerator() : this(512, short.MaxValue, 300){}\n\n\t\tpublic TspGenerator(int taps, double gain, double m)\n\t\t{\n\t\t\tthis.taps = taps;\n\t\t\tthis.amp = 2 * gain / taps;\n\t\t\tthis.phase = 4 * m * Math.PI / (taps * taps);\n\t\t}\n\n\t\tTspGenerator(TspGenerator x)\n\t\t{\n\t\t\tthis.taps  = x.taps;\n\t\t\tthis.amp   = x.amp;\n\t\t\tthis.phase = x.phase;\n\t\t}\n\n\t\tpublic double Next()\n\t\t{\n\t\t\tdouble x = this.amp / 2;\n\t\t\tfor(int k=1; k<taps; ++k)\n\t\t\t{\n\t\t\t\tdouble phase = this.phase  * k * k;\n\t\t\t\tx += this.amp * Math.Cos(Math.PI / this.taps * k * this.i + phase);\n\t\t\t}\n\t\t\t++this.i;\n\t\t\treturn x;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tthis.i = 0;\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new TspGenerator(this);\n\t\t}\n\t}\n}//namespace Data\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Data/WhiteNoiseGenerator.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Data\n{\n\t/// <summary>\n\t/// ホワイトノイズ生成。\n\t/// (Box-Muller 法を用いて正規乱数を生成。)\n\t/// </summary>\n\tpublic class WhiteNoiseGenerator : IDataGenerator\n\t{\n\t\tdouble mean;  // 平均\n\t\tdouble sigma; // 標準偏差\n\t\tint seed;\n\t\tRandom rand;\n\n\t\t/// <summary>\n\t\t/// 平均0、標準偏差1のホワイトノイズを生成。\n\t\t/// </summary>\n\t\tpublic WhiteNoiseGenerator() : this(0, 1, 0){}\n\n\t\t/// <summary>\n\t\t/// 平均値と標準偏差を指定してホワイトノイズを生成。\n\t\t/// </summary>\n\t\t/// <param name=\"mean\">平均値</param>\n\t\t/// <param name=\"sigma\">標準偏差</param>\n\t\tpublic WhiteNoiseGenerator(double mean, double sigma, int seed)\n\t\t{\n\t\t\tthis.mean = mean;\n\t\t\tthis.sigma = sigma;\n\t\t\tthis.seed = seed;\n\t\t\tthis.rand = new Random(seed);\n\t\t}\n\n\t\tpublic double Next()\n\t\t{\n\t\t\tdouble amp = Math.Sqrt(-2 * Math.Log(this.rand.NextDouble()));\n\t\t\tdouble phase = 2 * Math.PI * this.rand.NextDouble();\n\t\t\treturn this.sigma * amp * Math.Sin(phase) + this.mean;\n\t\t}\n\n\t\tpublic void Reset()\n\t\t{\n\t\t\tthis.rand = new Random(seed);\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new WhiteNoiseGenerator(this.mean, this.sigma, this.seed);\n\t\t}\n\t}\n}// namespace\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/BandPass/BandPassFir.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// 窓関数用のデリゲート。\n\t/// </summary>\n\tpublic delegate double WindowFunction(double i);\n\n\t/// <summary>\n\t/// 窓関数用のインターフェース。\n\t/// </summary>\n\tpublic interface IWindow\n\t{\n\t\t/// <summary>\n\t\t/// 窓関数の値を取得。\n\t\t/// </summary>\n\t\t/// <param name=\"i\">i サンプル目の値を取得する</param>\n\t\t/// <returns>窓関数の値</returns>\n\t\tdouble Get(double i);\n\n\t\t/// <summary>\n\t\t/// 窓関数の次数を設定する。\n\t\t/// </summary>\n\t\tint Order{get; set;}\n\t}\n\n\t/// <summary>\n\t/// 線形位相ローパス/バンドパス/ハイパスフィルタのフィルタタイプ。\n\t/// </summary>\n\tpublic enum FirFilterType\n\t{\n\t\tLPF, BPF, HPF\n\t}\n\n\t/// <summary>\n\t/// 窓関数タイプ。\n\t/// </summary>\n\tpublic enum WindowType\n\t{\n\t\tRectangular, // 矩形窓\n\t\tHamming,     // ハミング窓\n\t\tHanning,     // ハニング窓\n\t\tBlackman,    // ブラックマン窓\n\t\tKeiser,      // カイザー窓\n\t}\n\n\t/// <summary>\n\t/// FIR フィルタ関係の共通関数群\n\t/// </summary>\n\tpublic class FirCommon\n\t{\n\t\tpublic static IFirFilter GetLowPassFilter(int taps, double w, WindowType type)\n\t\t{\n\t\t\treturn CalcLinearBPFCoefficient(FirFilterType.LPF, w, 0, taps, type);\n\t\t}\n\n\t\tpublic static IFirFilter GetBandPassFilter(int taps, double wl, double wh, WindowType type)\n\t\t{\n\t\t\treturn CalcLinearBPFCoefficient(FirFilterType.BPF, (wl - wh)/2, (wl + wh)/2, taps, type);\n\t\t}\n\n\t\tpublic static IFirFilter GetHighPassFilter(int taps, double w, WindowType type)\n\t\t{\n\t\t\treturn CalcLinearBPFCoefficient(FirFilterType.HPF, Math.PI - w, 0, taps, type);\n\t\t}\n\n\t\tpublic static IFirFilter CalcLinearBPFCoefficient(FirFilterType type, double w, double w0, int taps, WindowType window)\n\t\t{\n\t\t\tdouble[] coef;\n\n\t\t\tif(taps % 2 == 1)\n\t\t\t{\n\t\t\t\tcoef = new double[(taps + 1) / 2];\n\t\t\t\tCalcOddLinearBPFCoefficient(type, coef, w, w0, GetWindow(window, taps));\n\t\t\t\treturn new OddLinearFir(coef);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tcoef = new double[taps / 2];\n\t\t\t\tCalcEvenLinearBPFCoefficient(type, coef, w, w0, GetWindow(window, taps));\n\t\t\t\treturn new EvenLinearFir(coef);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 線形位相バンドパスフィルタ(奇数タップ)の係数を計算する。\n\t\t/// 右側半分のみを計算。\n\t\t/// </summary>\n\t\t/// <param name=\"type\">フィルタタイプ</param>\n\t\t/// <param name=\"coef\">係数の格納先</param>\n\t\t/// <param name=\"w\">遮断周波数(BPF の場合は遮断帯域幅、HPF の場合は π-遮断周波数)</param>\n\t\t/// <param name=\"w0\">(BPF のみ) 中心周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic static void CalcOddLinearBPFCoefficient(FirFilterType type, double[] coef, double w, double w0, WindowFunction window)\n\t\t{\n\t\t\tint n = coef.Length - 1;\n\t\t\tdouble sum;\n\n\t\t\tsum = coef[n] = window(0) * w;\n\t\t\tfor(int i=1; i<=n; ++i)\n\t\t\t{\n\t\t\t\tdouble tmp = window(i) * Math.Sin(w * i) / i;\n\t\t\t\tsum += tmp * 2;\n\n\t\t\t\tif(type == FirFilterType.LPF)\n\t\t\t\t{\n\t\t\t\t\tcoef[n - i] = tmp;\n\t\t\t\t}\n\t\t\t\telse if(type == FirFilterType.HPF)\n\t\t\t\t{\n\t\t\t\t\tif(i%2 != 0)\n\t\t\t\t\t\tcoef[n - i] = -tmp;\n\t\t\t\t\telse\n\t\t\t\t\t\tcoef[n - i] = tmp;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcoef[n - i] = 2 * Math.Cos(w0 * i) * tmp;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor(int i=0; i<=n; ++i)\n\t\t\t{\n\t\t\t\tcoef[i] /= sum;\n\t\t\t}\n\t\t}//GetOddLinearBPFCoefficient\n\n\n\t\t/// <summary>\n\t\t/// 線形位相バンドパスフィルタ(奇数タップ)の係数を計算する。\n\t\t/// 右側半分のみを計算。\n\t\t/// </summary>\n\t\t/// <param name=\"type\">フィルタタイプ</param>\n\t\t/// <param name=\"coef\">係数の格納先</param>\n\t\t/// <param name=\"w\">遮断周波数(BPF の場合は遮断帯域幅、HPF の場合は π-遮断周波数)</param>\n\t\t/// <param name=\"w0\">(BPF のみ) 中心周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic static void CalcEvenLinearBPFCoefficient(FirFilterType type, double[] coef, double w, double w0, WindowFunction window)\n\t\t{\n\t\t\tint n = coef.Length - 1;\n\t\t\tdouble sum;\n\n\t\t\tsum = 0;\n\t\t\tfor(int i=0; i<=n; ++i)\n\t\t\t{\n\t\t\t\tdouble x = i + 0.5;\n\n\t\t\t\tdouble tmp = window(x) * Math.Sin(w * x) / x;\n\t\t\t\tsum += tmp * 2;\n\n\t\t\t\tif(type == FirFilterType.LPF)\n\t\t\t\t{\n\t\t\t\t\tcoef[n - i] = tmp;\n\t\t\t\t}\n\t\t\t\telse if(type == FirFilterType.HPF)\n\t\t\t\t{\n\t\t\t\t\tif(i%2 != 0)\n\t\t\t\t\t\tcoef[n - i] = -tmp;\n\t\t\t\t\telse\n\t\t\t\t\t\tcoef[n - i] = tmp;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcoef[n - i] = 2 * Math.Cos(w0 * x) * tmp;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor(int i=0; i<n; ++i)\n\t\t\t{\n\t\t\t\tcoef[i] /= sum;\n\t\t\t}\n\t\t}//GetEvenLinearBPFCoefficient\n\n\t\t/// <summary>\n\t\t/// 窓関数用。常に1を返す関数。\n\t\t/// </summary>\n\t\tpublic static double Constant1(double i)\n\t\t{\n\t\t\treturn 1;\n\t\t}\n\n\t\tpublic static WindowFunction GetWindow(WindowType type, int order)\n\t\t{\n\t\t\tswitch(type)\n\t\t\t{\n\t\t\t\tcase WindowType.Hamming:\n\t\t\t\t\treturn new WindowFunction(new Window.Hamming(order).Get);\n\t\t\t\tcase WindowType.Hanning:\n\t\t\t\t\treturn new WindowFunction(new Window.Hanning(order).Get);\n\t\t\t\tcase WindowType.Blackman:\n\t\t\t\t\treturn new WindowFunction(new Window.Blackman(order).Get);\n\t\t\t\tcase WindowType.Keiser:\n\t\t\t\t\treturn new WindowFunction(new Window.Keiser(order, 20).Get);\n\t\t\t\tdefault:\n\t\t\t\t\treturn new WindowFunction(Constant1);\n\t\t\t}\n\t\t}\n\t}//class FirCommon\n\n\t/// <summary>\n\t/// ローパス FIR フィルタ。\n\t/// </summary>\n\tpublic class LowPassFir : OddLinearFir\n\t{\n\t\t/// <summary>\n\t\t/// ローパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"w\">遮断周波数</param>\n\t\tpublic LowPassFir(int n, double w) : this(n, w, new WindowFunction(FirCommon.Constant1)){}\n\n\t\t/// <summary>\n\t\t/// ローパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"w\">遮断周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic LowPassFir(int n, double w, IWindow window) : this(n, w, new WindowFunction(window.Get)){}\n\n\t\t/// <summary>\n\t\t/// ローパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"w\">遮断周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic LowPassFir(int n, double w, WindowFunction window) : base(n)\n\t\t{\n\t\t\tthis.SetParameter(w, window);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パラメータを設定する。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">遮断周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic void SetParameter(double w, WindowFunction window)\n\t\t{\n\t\t\tFirCommon.CalcOddLinearBPFCoefficient(FirFilterType.LPF, this.coef, w, 0, window);\n\t\t}\n\t}//class LowPassFir\n\n\t/// <summary>\n\t/// ハイパス FIR フィルタ。\n\t/// </summary>\n\tpublic class HighPassFir : OddLinearFir\n\t{\n\t\t/// <summary>\n\t\t/// ハイパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"w\">遮断周波数</param>\n\t\tpublic HighPassFir(int n, double w) : this(n, w, new WindowFunction(FirCommon.Constant1)){}\n\n\t\t/// <summary>\n\t\t/// ハイパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"w\">遮断周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic HighPassFir(int n, double w, IWindow window) : this(n, w, new WindowFunction(window.Get)){}\n\t\t\n\t\t/// <summary>\n\t\t/// ハイパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"w\">遮断周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic HighPassFir(int n, double w, WindowFunction window) : base(n)\n\t\t{\n\t\t\tthis.SetParameter(w, window);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パラメータを設定する。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">遮断周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic void SetParameter(double w, WindowFunction window)\n\t\t{\n\t\t\tFirCommon.CalcOddLinearBPFCoefficient(FirFilterType.HPF, this.coef, Math.PI - w, 0, window);\n\t\t}\n\t}//class HighPassFir\n\n\t/// <summary>\n\t/// バンドパス FIR フィルタ。\n\t/// </summary>\n\tpublic class BandPassFir : OddLinearFir\n\t{\n\t\t/// <summary>\n\t\t/// バンドパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"wl\">下限周波数</param>\n\t\t/// <param name=\"wh\">上限周波数</param>\n\t\tpublic BandPassFir(int n, double wl, double wh) : this(n, wl, wh, new WindowFunction(FirCommon.Constant1)){}\n\n\t\t/// <summary>\n\t\t/// バンドパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"wl\">下限周波数</param>\n\t\t/// <param name=\"wh\">上限周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic BandPassFir(int n, double wl, double wh, IWindow window) : this(n, wl, wh, new WindowFunction(window.Get)){}\n\n\t\t/// <summary>\n\t\t/// バンドパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"wl\">下限周波数</param>\n\t\t/// <param name=\"wh\">上限周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic BandPassFir(int n, double wl, double wh, WindowFunction window) : base(n)\n\t\t{\n\t\t\tthis.SetParameter(wl, wh, window);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パラメータを設定する。\n\t\t/// </summary>\n\t\t/// <param name=\"wl\">下限周波数</param>\n\t\t/// <param name=\"wh\">上限周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic void SetParameter(double wl, double wh, WindowFunction window)\n\t\t{\n\t\t\tFirCommon.CalcOddLinearBPFCoefficient(FirFilterType.BPF, this.coef, (wl - wh)/2, (wl + wh)/2, window);\n\t\t}\n\t}//class BandPassFir\n\n\tnamespace Window\n\t{\n\t\t/// <summary>\n\t\t/// ハニング窓\n\t\t/// </summary>\n\t\tpublic class Hanning : IWindow\n\t\t{\n\t\t\tint order;\n\t\t\tpublic Hanning(int order){this.order = order;}\n\n\t\t\tpublic double Get(double i)\n\t\t\t{\n\t\t\t\treturn 0.5 + 0.5 * Math.Cos(2 * Math.PI * i / (double)this.order) ;\n\t\t\t}\n\n\t\t\tpublic int Order\n\t\t\t{\n\t\t\t\tget{return this.order;}\n\t\t\t\tset{this.order = value;}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ハミング窓\n\t\t/// </summary>\n\t\tpublic class Hamming : IWindow\n\t\t{\n\t\t\tint order;\n\t\t\tpublic Hamming(int order){this.order = order;}\n\n\t\t\tpublic double Get(double i)\n\t\t\t{\n\t\t\t\treturn 0.54 + 0.46 * Math.Cos(2 * Math.PI * i / (double)this.order) ;\n\t\t\t}\n\n\t\t\tpublic int Order\n\t\t\t{\n\t\t\t\tget{return this.order;}\n\t\t\t\tset{this.order = value;}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ブラックマン窓\n\t\t/// </summary>\n\t\tpublic class Blackman : IWindow\n\t\t{\n\t\t\tint order;\n\t\t\tpublic Blackman(int order){this.order = order;}\n\n\t\t\tpublic double Get(double i)\n\t\t\t{\n\t\t\t\treturn 0.42 + 0.5 * Math.Cos(2 * Math.PI * i / (double)this.order) \n\t\t\t\t\t+ 0.08 * Math.Cos(4 * Math.PI * i / (double)this.order);\n\t\t\t}\n\n\t\t\tpublic int Order\n\t\t\t{\n\t\t\t\tget{return this.order;}\n\t\t\t\tset{this.order = value;}\n\t\t\t}\n\t\t}\n\n\t\tpublic class Keiser : IWindow\n\t\t{\n\t\t\t/// <summary>\n\t\t\t/// 0次第1種変形ベッセル関数\n\t\t\t/// </summary>\n\t\t\tstatic double I0(double x)\n\t\t\t{\n\t\t\t\tdouble sum = 1.0;\n\t\t\t\tdouble xj = 1.0;\n\n\t\t\t\tfor(int j=1; j<20 ; j++)\n\t\t\t\t{\n\t\t\t\t\txj = 0.5*xj*x/j;\n\t\t\t\t\tsum = sum + Pow2(xj);\n\t\t\t\t}\n\t\t\t\treturn sum;\n\t\t\t}\n\n\t\t\tstatic double Pow2(double x){return x * x;}\n\n\t\t\tint order2; // 次数/2\n\t\t\tdouble alpha;\n\n\t\t\tpublic Keiser(int order, double attenuate)\n\t\t\t{\n\t\t\t\tthis.order2 = order / 2;\n\n\t\t\t\tif(attenuate >= 50.0)\n\t\t\t\t\tthis.alpha = 0.1102 * (attenuate - 8.7);\n\t\t\t\telse if(attenuate > 21.0)\n\t\t\t\t\tthis.alpha = 0.5842 * Math.Pow(attenuate - 21.0 , 0.4)\n\t\t\t\t\t\t+ 0.07886 * (attenuate - 21.0);\n\t\t\t\telse\n\t\t\t\t\tthis.alpha = 0.0;  //方形窓となる\n\t\t\t}\n\n\t\t\tpublic double Get(double i)\n\t\t\t{\n\t\t\t\tdouble fm = this.alpha * Math.Sqrt(1.0-Pow2((double)i / this.order2));\n\t\t\t\treturn I0(fm) / I0(this.alpha);\n\t\t\t}\n\n\t\t\tpublic int Order\n\t\t\t{\n\t\t\t\tget{return this.order2 * 2;}\n\t\t\t\tset{this.order2 = value / 2;}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 矩形窓\n\t\t/// </summary>\n\t\tpublic class Rectangular : IWindow\n\t\t{\n\t\t\tpublic double Get(double i)\n\t\t\t{\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tpublic int Order\n\t\t\t{\n\t\t\t\tget{return 0;}\n\t\t\t\tset{}\n\t\t\t}\n\t\t}\n\t}//namespace Window\n}//namespace Filter\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/CircularBuffer.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace SoundLibrary.Filter\n{\n#if false\n\t// ↓ちょっとバグあり。\n\t// #else の方の実装と比べて10～20％程度高速。\n\t// 10％程度のためにデバッグするのが面倒で。\n\t/// <summary>\n\t/// 循環バッファ\n\t/// </summary>\n\tpublic class CircularBuffer : IEnumerable\n\t{\n\t\tdouble[] buff;\n\t\tint current;\n\t\tint length;\n\n\t\t/// <summary>\n\t\t/// 循環バッファコンストラクタ。\n\t\t/// </summary>\n\t\t/// <param name=\"len\">循環バッファの長さ。</param>\n\t\tpublic CircularBuffer(int len)\n\t\t{\n\t\t\tthis.buff   = new double[2 * len];\n\t\t\tthis.length = len;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファ内の要素のアクセス。\n\t\t/// </summary>\n\t\tpublic double this[int n]\n\t\t{\n\t\t\tset{this.buff[this.current + n] = value;}\n\t\t\tget{return this.buff[this.current + n];}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファの末尾に値を挿入。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">挿入する値。</param>\n\t\tpublic void PushBack(double x)\n\t\t{\n\t\t\tthis.buff[this.current] = this.buff[this.current + this.length] = x;\n\t\t\t++this.current;\n\t\t\tif(this.current >= this.length) this.current -= this.length;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファの先頭に値を挿入。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">挿入する値。</param>\n\t\tpublic void PushFront(double x)\n\t\t{\n\t\t\t--this.current;\n\t\t\tif(this.current < 0) this.current += this.length;\n\t\t\tthis.buff[this.current] = this.buff[this.current + this.length] = x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファの先頭の要素を返す。\n\t\t/// </summary>\n\t\tpublic double Top\n\t\t{\n\t\t\tget{return this.buff[this.current];}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// バッファ長(＝this.buff.Length)を返す。\n\t\t/// </summary>\n\t\tpublic int Length\n\t\t{\n\t\t\tget{return this.length;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// this.buff の列挙子を返す。\n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic IEnumerator GetEnumerator()\n\t\t{\n\t\t\treturn this.buff.GetEnumerator();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファの長さを変更する。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">新しい長さ</param>\n\t\tpublic void Resize(int length)\n\t\t{\n\t\t\tdouble[] tmp = new double[2 * length];\n\t\t\tint len = Math.Min(length, this.Length);\n\n\t\t\tint i=0;\n\t\t\tfor(; i<len; ++i)\n\t\t\t\ttmp[i] = this[i];\n\t\t\tfor(; i<length; ++i)\n\t\t\t\ttmp[i] = 0;\n\t\t\tfor(int j=0; j<length; ++i, ++j)\n\t\t\t\ttmp[i] = tmp[j];\n\t\t\tthis.buff = tmp;\n\t\t}\n\t}//class CircularBuffer\n\n#else\n\n\t/// <summary>\n\t/// 循環バッファ\n\t/// </summary>\n\tpublic class CircularBuffer : IEnumerable\n\t{\n\t\tdouble[] buff;\n\n\t\t/// <summary>\n\t\t/// 循環バッファコンストラクタ。\n\t\t/// </summary>\n\t\t/// <param name=\"len\">循環バッファの長さ。</param>\n\t\tpublic CircularBuffer(int len)\n\t\t{\n\t\t\tthis.buff = new double[len];\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファ内の要素のアクセス。\n\t\t/// </summary>\n\t\tpublic double this[int n]\n\t\t{\n\t\t\tset{this.buff[n] = value;}\n\t\t\tget{return this.buff[n];}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファの末尾に値を挿入。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">挿入する値。</param>\n\t\tpublic void PushBack(double x)\n\t\t{\n\t\t\tfor(int i=0; i<this.buff.Length-1; ++i)\n\t\t\t{\n\t\t\t\tthis.buff[i] = this.buff[i+1];\n\t\t\t}\n\t\t\tthis.buff[this.buff.Length-1] = x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファの先頭に値を挿入。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">挿入する値。</param>\n\t\tpublic void PushFront(double x)\n\t\t{\n\t\t\tfor(int i=this.buff.Length-1; i>0; --i)\n\t\t\t{\n\t\t\t\tthis.buff[i] = this.buff[i-1];\n\t\t\t}\n\t\t\tthis.buff[0] = x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファの先頭の要素を返す。\n\t\t/// </summary>\n\t\tpublic double Top\n\t\t{\n\t\t\tget{return this.buff[0];}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// バッファ長(＝this.buff.Length)を返す。\n\t\t/// </summary>\n\t\tpublic int Length\n\t\t{\n\t\t\tget{return this.buff.Length;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// this.buff の列挙子を返す。\n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic IEnumerator GetEnumerator()\n\t\t{\n\t\t\treturn this.buff.GetEnumerator();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファの長さを変更する。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">新しい長さ</param>\n\t\tpublic void Resize(int length)\n\t\t{\n\t\t\tdouble[] tmp = new double[length];\n\t\t\tint len = Math.Min(length, this.Length);\n\t\t\tint i=0;\n\t\t\tfor(; i<len; ++i)\n\t\t\t\ttmp[i] = this[i];\n\t\t\tfor(; i<length; ++i)\n\t\t\t\ttmp[i] = 0;\n\t\t\tthis.buff = tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 中身を0クリア。\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tfor(int i=0; i<this.buff.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.buff[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 係数との積和演算。\n\t\t/// ∑this[i]*coef[i] を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"coef\">係数</param>\n\t\t/// <returns>積和結果</returns>\n\t\tpublic double Mac(double[] coef)\n\t\t{\n\t\t\tint n = coef.Length;\n\t\t\tdouble sum = 0;\n\t\t\tfor(int i=0; i<n; ++i)\n\t\t\t{\n\t\t\t\tsum += this.buff[i] * coef[i];\n\t\t\t}\n\t\t\treturn sum;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 係数との積和演算。\n\t\t/// ∑this[i + offset]*coef[i] を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"offset\">畳込みの開始位置オフセット</param>\n\t\t/// <param name=\"coef\">係数</param>\n\t\t/// <returns>積和結果</returns>\n\t\tpublic double Mac(int offset, double[] coef)\n\t\t{\n\t\t\tint n = coef.Length;\n\t\t\tdouble sum = 0;\n\t\t\tfor(int i=0, j=offset; i<n; ++i, ++j)\n\t\t\t{\n\t\t\t\tsum += this.buff[j] * coef[i];\n\t\t\t}\n\t\t\treturn sum;\n\t\t}\n\t}//class CircularBuffer\n#endif\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Connector.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// 直列接続。\n\t/// </summary>\n\tpublic class SerialConnector : IFilter\n\t{\n\t\tIFilter[] filters;\n\n\t\tpublic SerialConnector(params IFilter[] filters)\n\t\t{\n\t\t\tthis.filters = filters;\n\n\t\t\tthis.Clear();\n\t\t}\n\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tforeach(IFilter f in this.filters)\n\t\t\t\tx = f.GetValue(x);\n\t\t\treturn x;\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tforeach(IFilter f in this.filters)\n\t\t\t\tf.Clear();\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\tIFilter[] clone = new IFilter[this.filters.Length];\n\t\t\tfor(int i=0; i<clone.Length; ++i)\n\t\t\t{\n\t\t\t\tclone[i] = (IFilter)this.filters[i].Clone();\n\t\t\t}\n\n\t\t\treturn new SerialConnector(clone);\n\t\t}\n\t}//class SerialConnector\n\n\t/// <summary>\n\t/// 並列接続。\n\t/// </summary>\n\tpublic class PallarelConnector : IFilter\n\t{\n\t\tIFilter[] filters;\n\n\t\tpublic PallarelConnector(params IFilter[] filters)\n\t\t{\n\t\t\tthis.filters = filters;\n\n\t\t\tthis.Clear();\n\t\t}\n\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tdouble tmp = 0;\n\t\t\tforeach(IFilter f in this.filters)\n\t\t\t\ttmp += f.GetValue(x);\n\t\t\treturn tmp;\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tforeach(IFilter f in this.filters)\n\t\t\t\tf.Clear();\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\tIFilter[] clone = new IFilter[this.filters.Length];\n\t\t\tfor(int i=0; i<clone.Length; ++i)\n\t\t\t{\n\t\t\t\tclone[i] = (IFilter)this.filters[i].Clone();\n\t\t\t}\n\n\t\t\treturn new PallarelConnector(clone);\n\t\t}\n\t}//class PallarelConnector\n}//namespace Filter\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Delay/Delay.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter.Delay\n{\n\t/// <summary>\n\t/// 遅延器\n\t/// </summary>\n\tpublic class Delay : IDelay\n\t{\n\t\tCircularBuffer buf;\n\n\t\t/// <summary>\n\t\t/// コンストラクタ\n\t\t/// </summary>\n\t\t/// <param name=\"taps\">遅延タップ数</param>\n\t\tpublic Delay(int taps)\n\t\t{\n\t\t\tif(taps <= 0)\n\t\t\t\tthis.buf = null;\n\t\t\telse\n\t\t\t\tthis.buf = new CircularBuffer(taps);\n\n\t\t\tthis.Clear();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 遅延タップ数\n\t\t/// </summary>\n\t\tpublic int Taps\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif(this.buf == null) return 0;\n\t\t\t\treturn this.buf.Length;\n\t\t\t}\n\t\t\tset\n\t\t\t{\n\t\t\t\tif(this.buf == null)\n\t\t\t\t\tthis.buf = new CircularBuffer(value);\n\t\t\t\telse\n\t\t\t\t\tthis.buf.Resize(value);\n\t\t\t}\n\t\t}\n\n\t\t#region IFilter メンバ\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tif(this.buf == null)\n\t\t\t\treturn x;\n\n\t\t\tdouble tmp = this.buf.Top;\n\t\t\tthis.buf.PushBack(x);\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tif(this.buf == null)\n\t\t\t\treturn;\n\n\t\t\tfor(int i=0; i<this.buf.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.buf[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region IClonable メンバ\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new Delay(this.buf.Length);\n\t\t}\n\n\t\t#endregion\n\t\t#region IDelay メンバ\n\n\t\tpublic double DelayTime\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.Taps;\n\t\t\t}\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.Taps = (int)value;\n\t\t\t}\n\t\t}\n\n\t\tpublic double GetValue()\n\t\t{\n\t\t\tif(this.buf == null)\n\t\t\t\treturn 0;\n\n\t\t\treturn this.buf.Top;\n\t\t}\n\n\t\tpublic void Push(double x)\n\t\t{\n\t\t\tthis.buf.PushBack(x);\n\t\t}\n\n\t\tpublic double GetBufferValue(int n)\n\t\t{\n\t\t\treturn this.buf[n-1];\n\t\t}\n\n\t\t#endregion\n\t}//class Delay\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Delay/FractionalDelay.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter.Delay\n{\n\t/// <summary>\n\t/// 分数遅延フィルタ。\n\t/// </summary>\n\tpublic class FractionalDelay : IDelay\n\t{\n\t\tCircularBuffer buf;\n\t\tint integer;\n\t\tdouble fraction;\n\t\tdouble[] coef; // 分数遅延をかけるための FIR 係数\n\n\t\t/// <summary>\n\t\t/// コンストラクタ\n\t\t/// </summary>\n\t\t/// <param name=\"time\">遅延タップ数</param>\n\t\tpublic FractionalDelay(double time) : this(time, 4){}\n\n\t\t/// <summary>\n\t\t/// コンストラクタ\n\t\t/// </summary>\n\t\t/// <param name=\"time\">遅延タップ数</param>\n\t\t/// <param name=\"firLength\">分数遅延FIRの次数</param>\n\t\tpublic FractionalDelay(double time, int firLength)\n\t\t{\n\t\t\tif(time < 0)\n\t\t\t{\n\t\t\t\tthis.integer = 0;\n\t\t\t\tthis.fraction = 0;\n\t\t\t\tthis.buf = null;\n\t\t\t\tthis.coef = null;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.coef = new double[firLength];\n\t\t\t\tGetFractionalDelayCoef(this.Delay, this.Length, this.coef);\n\t\t\t\tthis.DelayTime = time;\n\t\t\t}\n\n\t\t\tthis.Clear();\n\t\t}\n\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tif(this.buf == null)\n\t\t\t\treturn x;\n\n\t\t\tint n = this.integer - this.Delay;\n\t\t\tint i = 0;\n\t\t\tif(n < 0)\n\t\t\t{\n\t\t\t\ti = -n;\n\t\t\t\tn = 0;\n\t\t\t}\n\n\t\t\tthis.buf.PushFront(x);\n\n\t\t\tdouble y = 0;\n\t\t\tfor(; i<this.Length; ++i, ++n)\n\t\t\t\ty += this.buf[n] * this.coef[i];\n\t\t\treturn y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 値を循環バッファにプッシュする。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">プッシュする値</param>\n\t\tpublic void Push(double x)\n\t\t{\n\t\t\tif(this.buf == null)\n\t\t\t\treturn;\n\n\t\t\tthis.buf.PushFront(x);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 値の取り出し。\n\t\t/// </summary>\n\t\t/// <returns>フィルタ結果</returns>\n\t\tpublic double GetValue()\n\t\t{\n\t\t\tif(this.buf == null)\n\t\t\t\treturn 0;\n\n\t\t\tint n = this.integer - this.Delay;\n\t\t\tint i = 0;\n\t\t\tif(n < 0)\n\t\t\t{\n\t\t\t\ti = -n;\n\t\t\t\tn = 0;\n\t\t\t}\n\n\t\t\tdouble y = 0;\n\t\t\tfor(; i<this.Length; ++i, ++n)\n\t\t\t\ty += this.buf[n] * this.coef[i];\n\t\t\treturn y;\n\t\t}\n\n\t\tpublic double GetBufferValue(int n)\n\t\t{\n\t\t\tif(n > this.Length)\n\t\t\t\treturn this.buf[n-1];\n\t\t\telse\n\t\t\t\treturn 0.0;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tif(this.buf == null)\n\t\t\t\treturn;\n\n\t\t\tfor(int i=0; i<this.buf.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.buf[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 遅延タップ数\n\t\t/// </summary>\n\t\tpublic double DelayTime\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.Integer + this.Fraction;\n\t\t\t}\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.Integer = (int)value;\n\t\t\t\tthis.Fraction = value - integer;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 遅延タップ数の整数部分\n\t\t/// </summary>\n\t\tpublic int Integer\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.integer;\n\t\t\t}\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.integer = value;\n\t\t\t\tif(this.buf == null)\n\t\t\t\t\tthis.buf = new CircularBuffer(this.BufferSize);\n\t\t\t\telse if(this.buf.Length < this.BufferSize)\n\t\t\t\t\tthis.buf.Resize(this.BufferSize);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 遅延タップ数の小数部分\n\t\t/// </summary>\n\t\tpublic double Fraction\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.fraction;\n\t\t\t}\n\t\t\tset\n\t\t\t{\n\t\t\t\tif(this.coef == null)\n\t\t\t\t{\n\t\t\t\t\tthis.fraction = value;\n\t\t\t\t\tthis.coef = GetFractionalDelayCoef(this.fraction + this.Delay, this.Length);\n\t\t\t\t}\n\t\t\t\tif(this.fraction != value)\n\t\t\t\t{\n\t\t\t\t\tthis.fraction = value;\n\t\t\t\t\tGetFractionalDelayCoef(this.fraction + this.Delay, this.Length, this.coef);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 分数遅延FIRのタップ数。\n\t\t/// </summary>\n\t\tpublic int Length\n\t\t{\n\t\t\tget{return this.coef.Length;}\n\t\t\tset\n\t\t\t{\n\t\t\t\tif(this.coef.Length < value)\n\t\t\t\t{\n\t\t\t\t\tthis.coef = GetFractionalDelayCoef(this.fraction + this.Delay, this.Length);\n\t\t\t\t}\n\n\t\t\t\tif(this.buf.Length < this.BufferSize)\n\t\t\t\t\tthis.buf.Resize(this.BufferSize);\n\t\t\t}\n\t\t}\n\n\t\tint Delay{get{return this.Length / 2 - 1;}}\n\t\tint BufferSize{get{return this.integer + this.Length - this.Delay;}}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new FractionalDelay(this.DelayTime);\n\t\t}\n\n\t\t#region static メソッド\n\n\t\t/// <summary>\n\t\t/// ディレイ値から分数遅延 FIR フィルタ係数を計算する。\n\t\t/// </summary>\n\t\t/// <param name=\"delay\">ディレイ値</param>\n\t\t/// <param name=\"length\">FIR フィルタのタップ数</param>\n\t\t/// <returns>FIR フィルタ係数</returns>\n\t\tstatic double[] GetFractionalDelayCoef(double delay, int length)\n\t\t{\n\t\t\tdouble[] coef = new double[length];\n\t\t\tGetFractionalDelayCoef(delay, length, coef);\n\t\t\treturn coef;\n\t\t}\n\n\t\tstatic void GetFractionalDelayCoef(double delay, int length, double[] coef)\n\t\t{\n\t\t\t//*\n\t\t\tSpectrumAnalysis.Spectrum tmp = SpectrumAnalysis.Spectrum.FromDelay(delay, length);\n\t\t\ttmp.GetTimeSequence(coef);\n\t\t\t//*/\n\n\t\t\t/*\n\t\t\tfor(int i=0; i<length; ++i)\n\t\t\t{\n\t\t\t\tcoef[i] = 1;\n\t\t\t\tfor(int j=0; j<length; ++j)\n\t\t\t\t{\n\t\t\t\t\tif(i == j) continue;\n\n\t\t\t\t\tcoef[i] *= (delay - j) / (i - j);\n\t\t\t\t}\n\t\t\t}\n\t\t\t//*/\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Delay/IDelay.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter.Delay\n{\n\t/// <summary>\n\t/// 遅延フィルタのインタフェース。\n\t/// </summary>\n\tpublic interface IDelay : IFilter\n\t{\n\t\t/// <summary>\n\t\t/// 遅延時間[サンプル]。\n\t\t/// </summary>\n\t\tdouble DelayTime\n\t\t{\n\t\t\tget;\n\t\t\tset;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// DelayTime サンプル遅れの値を取り出すだけ。\n\t\t/// </summary>\n\t\t/// <returns>取り出した値</returns>\n\t\tdouble GetValue();\n\n\t\t/// <summary>\n\t\t/// 内部バッファの途中の値を取り出す。\n\t\t/// ! リバーブ用。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">値を取り出したい位置</param>\n\t\t/// <returns>取り出した値</returns>\n\t\tdouble GetBufferValue(int n);\n\n\t\t/// <summary>\n\t\t/// 値のプッシュ。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">プッシュしたい値</param>\n\t\tvoid Push(double x);\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Equalizer/ButterworthFilterDesigner.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter.Equalizer\n{\n\t/// <summary>\n\t/// バターワースフィルタ設計。\n\t/// </summary>\n\tpublic class ButterworthFilterDesigner : FilterDesigner\n\t{\n\t\t#region 初期化\n\n\t\tpublic ButterworthFilterDesigner(int order) : base(order)\n\t\t{\n\t\t}\n\n\t\t#endregion\n\t\t#region 零点/極の計算\n\n\t\t/// <summary>\n\t\t/// フィルタの零点/極を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"roots\">零点/極一覧の格納先</param>\n\t\tpublic override void GetZeroPole(ZeroPole[] roots)\n\t\t{\n\t\t\tfor(int i=this.order-1, j=0; i>0; i-=2, ++j)\n\t\t\t{\n\t\t\t\tdouble w = Math.PI / 2.0 * (double)i / this.order;\n\t\t\t\tdouble sin, cos;\n\t\t\t\tGetSinCos(w, out sin, out cos);\n\n\t\t\t\troots[j].zero = new Root(Root.Type.None, 0, 0);\n\t\t\t\troots[j].pole = new Root(Root.Type.Complex, -cos, -sin);\n\t\t\t}\n\n\t\t\tif((this.order & 1) == 1)\n\t\t\t{\n\t\t\t\troots[this.order / 2].zero = new Root(Root.Type.None, 0, 0);\n\t\t\t\troots[this.order / 2].pole = new Root(Root.Type.Single, -1, 0);\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region アナログプロトタイプ\n\n\t\t//public override void GetAnalogPrototype(Coefficient[] coefs)\n\t\tpublic void GetAnalogPrototype2(Coefficient[] coefs)\n\t\t{\n\t\t\tfor(int i=this.order-1, j=0; i>0; i-=2, ++j)\n\t\t\t{\n\t\t\t\tCoefficient coef = coefs[j];\n\n\t\t\t\tcoef.a[0] = 1;\n\t\t\t\tcoef.a[1] = 2 * Math.Cos(Math.PI / 2 * (double)i / this.order);\n\t\t\t\tcoef.a[2] = 1;\n\t\t\t\tcoef.b[0] = 1;\n\t\t\t\tcoef.b[1] = 0;\n\t\t\t\tcoef.b[2] = 0;\n\t\t\t}\n\n\t\t\tif((this.order & 1) == 1)\n\t\t\t{\n\t\t\t\tCoefficient coef = coefs[this.order / 2];\n\n\t\t\t\tcoef.a[0] = 1;\n\t\t\t\tcoef.a[1] = 1;\n\t\t\t\tcoef.a[2] = 0;\n\t\t\t\tcoef.b[0] = 1;\n\t\t\t\tcoef.b[1] = 0;\n\t\t\t\tcoef.b[2] = 0;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region ディジタル LPF\n\n\t\t//public override void GetDigitalLPF(double w, Coefficient[] coefs)\n\t\tpublic void GetDigitalLPF2(double w, Coefficient[] coefs)\n\t\t{\n\t\t\tdouble sin, cos;\n\t\t\tGetSinCos(w, out sin, out cos);\n\t\t\tdouble b0 = (1 - cos) / 2;\n\t\t\tdouble a1 = -2 * cos;\n\n\t\t\tdouble nu = (this.order & 1) == 1 ? 1 : 0.5;\n\n\t\t\tfor(int i=this.order-1, j=0; i>0; i-=2, ++j)\n\t\t\t{\n\t\t\t\tCoefficient coef = coefs[j];\n\n\t\t\t\tdouble alpha = sin * Math.Cos(Math.PI / 2.0 * (double)i / this.order);\n\n\t\t\t\tcoef.a[0] = 1 + alpha;\n\t\t\t\tcoef.a[1] = a1;\n\t\t\t\tcoef.a[2] = 1 - alpha;\n\t\t\t\tcoef.b[0] = b0;\n\t\t\t\tcoef.b[1] = 2 * b0;\n\t\t\t\tcoef.b[2] = b0;\n\t\t\t}\n\n\t\t\tif((this.order & 1) == 1)\n\t\t\t{\n\t\t\t\tCoefficient coef = coefs[this.order / 2];\n\n\t\t\t\tcoef.a[0] = sin + cos + 1;\n\t\t\t\tcoef.a[1] = sin - cos - 1;\n\t\t\t\tcoef.a[2] = 0;\n\t\t\t\tcoef.b[0] = sin;\n\t\t\t\tcoef.b[1] = sin;\n\t\t\t\tcoef.b[2] = 0;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Equalizer/ChebyshevFilterDesigner.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter.Equalizer\n{\n\t/// <summary>\n\t/// チェビシェフフィルタ設計。。\n\t/// </summary>\n\tpublic class ChebyshevFilterDesigner : FilterDesigner\n\t{\n\t\t#region フィールド\n\n\t\t/// <summary>\n\t\t/// フィルタ種別。false: I型、true: II型(逆チェビシェフ)\n\t\t/// </summary>\n\t\tbool kind;\n\n\t\t/// <summary>\n\t\t/// ε\n\t\t/// </summary>\n\t\tdouble epsilon;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic ChebyshevFilterDesigner(int order, double epsilon) : this(order, epsilon, false) {}\n\n\t\tpublic ChebyshevFilterDesigner(int order, double epsilon, bool kind) : base(order)\n\t\t{\n\t\t\tthis.kind = kind;\n\t\t\tthis.epsilon = epsilon;\n\t\t}\n\n\t\t#endregion\n\t\t#region パラメータ設定\n\n\t\t/// <summary>\n\t\t/// チェビシェフフィルタ種別。\n\t\t/// </summary>\n\t\tpublic bool Kind\n\t\t{\n\t\t\tget{return this.kind;}\n\t\t\tset{this.kind = value;}\n\t\t}\n\n\t\tpublic double Epsilon\n\t\t{\n\t\t\tget{return this.epsilon;}\n\t\t\tset{this.epsilon = value;}\n\t\t}\n\n\t\tdouble Beta0\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tdouble t = Math.Pow(\n\t\t\t\t\t(1 + Math.Sqrt(1 + this.epsilon * this.epsilon)) / this.epsilon,\n\t\t\t\t\t1.0 / this.order);\n\n\t\t\t\treturn (t * t - 1) / (2 * t);\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 零点/極の計算\n\n\t\t/// <summary>\n\t\t/// フィルタの零点/極を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"roots\">零点/極一覧の格納先</param>\n\t\tpublic override void GetZeroPole(ZeroPole[] roots)\n\t\t{\n\t\t\t//!\n\t\t\t/*\n\t\t\tfor(int i=this.order-1, j=0; i>0; i-=2, ++j)\n\t\t\t{\n\t\t\t\tdouble w = Math.PI / 2.0 * (double)i / this.order;\n\t\t\t\tdouble sin, cos;\n\t\t\t\tGetSinCos(w, out sin, out cos);\n\n\t\t\t\troots[j].zero = new Root(Root.Type.None, 0, 0);\n\t\t\t\troots[j].pole = new Root(Root.Type.Complex, -cos, -sin);\n\t\t\t}\n\n\t\t\tif((this.order & 1) == 1)\n\t\t\t{\n\t\t\t\troots[this.order / 2].zero = new Root(Root.Type.None, 0, 0);\n\t\t\t\troots[this.order / 2].pole = new Root(Root.Type.Single, -1, 0);\n\t\t\t}\n\t\t\t*/\n\t\t}\n\n\t\t#endregion\n\t\t#region アナログプロトタイプ\n\n\t\tpublic override void GetAnalogPrototype(Coefficient[] coefs)\n\t\t{\n\t\t\tdouble beta0 = this.Beta0;\n\n\t\t\tfor(int i=this.order-1, j=0; i>0; i-=2, ++j)\n\t\t\t{\n\t\t\t\tCoefficient coef = coefs[j];\n\n\t\t\t\tdouble sin, cos;\n\t\t\t\tGetSinCos(Math.PI / 2 * (double)i / this.order, out sin, out cos);\n\n\t\t\t\tdouble alpha = 2 * beta0 * cos;\n\t\t\t\tdouble beta = sin;\n\t\t\t\tbeta *= beta;\n\t\t\t\tdouble gamma = beta;\n\t\t\t\tbeta += beta0 * beta0;\n\n\t\t\t\tif(this.kind)\n\t\t\t\t{\n\t\t\t\t\tcoef.a[0] = 1; coef.a[1] = alpha; coef.a[2] = beta;\n\t\t\t\t\tcoef.b[0] = 1; coef.b[1] = 0;     coef.b[2] = gamma;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcoef.a[0] = beta; coef.a[1] = alpha; coef.a[2] = 1;\n\t\t\t\t\tcoef.b[0] = beta; coef.b[1] = 0;     coef.b[2] = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif((this.order & 1) == 1)\n\t\t\t{\n\t\t\t\tCoefficient coef = coefs[this.order / 2];\n\n\t\t\t\tif(this.kind)\n\t\t\t\t{\n\t\t\t\t\tcoef.a[0] = 1; coef.a[1] = beta0; coef.a[2] = 0;\n\t\t\t\t\tcoef.b[0] = 1; coef.b[1] = 0;     coef.b[2] = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcoef.a[0] = beta0; coef.a[1] = 1; coef.a[2] = 0;\n\t\t\t\t\tcoef.b[0] = beta0; coef.b[1] = 0; coef.b[2] = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Equalizer/EllipticFilterDesigner.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.Mathematics;\n\nnamespace SoundLibrary.Filter.Equalizer\n{\n\t/// <summary>\n\t/// 楕円フィルタ設計。\n\t/// </summary>\n\tpublic class EllipticFilterDesigner : FilterDesigner\n\t{\n\t\t#region フィールド\n\n\t\t/// <summary>\n\t\t/// ε\n\t\t/// </summary>\n\t\tdouble epsilon;\n\n\t\t/// <summary>\n\t\t/// 楕円関数の率 k1 の2乗\n\t\t/// </summary>\n\t\tdouble m1;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic EllipticFilterDesigner(int order, double rp, double rs) : base(order)\n\t\t{\n\t\t\tthis.SetParameter(rp, rs);\n\t\t}\n\n\t\t#endregion\n\t\t#region パラメータ設定\n\n\t\t/// <summary>\n\t\t/// パスバンドリプルとストップバンドリプルからパラメータ計算。\n\t\t/// </summary>\n\t\t/// <param name=\"rp\">パスバンドリプル</param>\n\t\t/// <param name=\"rs\">ストップバンドリプル</param>\n\t\tpublic void SetParameter(double rp, double rs)\n\t\t{\n\t\t\trp *= rp;\n\t\t\trs *= rs;\n\t\t\tthis.epsilon = Math.Sqrt(1/rp - 1);\n\t\t\tthis.m1 = (1/rp - 1) / (1/rs - 1);\n\t\t}\n\n\t\tpublic double Epsilon\n\t\t{\n\t\t\tget{return this.epsilon;}\n\t\t\tset{this.epsilon = value;}\n\t\t}\n\n\t\tpublic double M1\n\t\t{\n\t\t\tget{return this.m1;}\n\t\t\tset{this.m1 = value;}\n\t\t}\n\n\t\t#endregion\n\t\t#region 零点/極の計算\n\n\t\t/// <summary>\n\t\t/// フィルタの零点/極を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"roots\">零点/極一覧の格納先</param>\n\t\tpublic override void GetZeroPole(ZeroPole[] roots)\n\t\t{\n\t\t\tdouble m1 = this.m1;\n\t\t\tdouble m1p = 1 - this.m1;\n\n\t\t\tdouble Kk1  = Elliptic.K(m1);\n\t\t\tdouble Kk1p = Elliptic.K(m1p);\n\n\t\t\tdouble temp1 = -Math.PI * Kk1p / (this.order * Kk1);\n\t\t\tdouble temp2 = Math.Exp(temp1);\n\n\t\t\tdouble m    = Elliptic.InverseQ(Math.Exp(-Math.PI * Kk1p / (this.order * Kk1)));\n\t\t\tdouble mp   = 1 - m;\n\t\t\tdouble k    = Math.Sqrt(m);\n\t\t\tdouble Kk   = Elliptic.K(m);\n\n\t\t\tdouble Kkp  = Elliptic.K(mp);\n\t\t\tdouble temp3 = (Kk / Kkp) / (Kk1 / Kk1p);\n\n\t\t\tdouble phi, sn_p, cn_p, dn_p;\n\t\t\tdouble v = Elliptic.F(Math.Atan(1 / this.epsilon), m1p) * Kk / (this.order * Kk1);\n\t\t\tElliptic.Jacobi(v, mp, out phi, out sn_p, out cn_p, out dn_p);\n\n\t\t\tfor(int i=this.order-1, j=0; i>0; i-=2, ++j)\n\t\t\t{\n\t\t\t\tdouble sn, cn, dn;\n\t\t\t\tdouble u = Kk * (double)i / this.order;\n\t\t\t\tElliptic.Jacobi(u, m, out phi, out sn, out cn, out dn);\n\n\t\t\t\tdouble denom = 1 - dn * dn * sn_p * sn_p;\n\t\t\t\tdouble re = -cn * dn * sn_p * cn_p / denom;\n\t\t\t\tdouble im = -sn * dn_p / denom;\n\n\t\t\t\troots[j].zero = new Root(Root.Type.Complex, 0, 1 / (k * sn));\n\t\t\t\troots[j].pole = new Root(Root.Type.Complex, re, im);\n\t\t\t}\n\n\t\t\tif((this.order & 1) == 1)\n\t\t\t{\n\t\t\t\tdouble denom = 1 - sn_p * sn_p;\n\t\t\t\tdouble re = -sn_p * cn_p / denom;\n\n\t\t\t\troots[this.order / 2].zero = new Root(Root.Type.None, 0, 0);\n\t\t\t\troots[this.order / 2].pole = new Root(Root.Type.Single, re, 0);\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region アナログプロトタイプ\n\n\t\tpublic override void GetAnalogPrototype(Coefficient[] coefs)\n//\t\tpublic void GetAnalogPrototype2(Coefficient[] coefs)\n\t\t{\n\t\t\tdouble m1 = this.m1;\n\t\t\tdouble m1p = 1 - this.m1;\n\n\t\t\tdouble Kk1  = Elliptic.K(m1);\n\t\t\tdouble Kk1p = Elliptic.K(m1p);\n\n\t\t\tdouble m    = Elliptic.InverseQ(Math.Exp(-Math.PI * Kk1p / (this.order * Kk1)));\n\t\t\tdouble mp   = 1 - m;\n\t\t\tdouble Kk   = Elliptic.K(m);\n\n\t\t\tdouble phi, sn_p, cn_p, dn_p;\n\t\t\tdouble v = Elliptic.F(Math.Atan(1 / this.epsilon), m1p) * Kk / (this.order * Kk1);\n\t\t\tElliptic.Jacobi(v, mp, out phi, out sn_p, out cn_p, out dn_p);\n\n\t\t\tfor(int i=this.order-1, j=0; i>0; i-=2, ++j)\n\t\t\t{\n\t\t\t\tCoefficient coef = coefs[j];\n\n\t\t\t\tdouble sn, cn, dn;\n\t\t\t\tdouble u = Kk * (double)i / this.order;\n\t\t\t\tElliptic.Jacobi(u, m, out phi, out sn, out cn, out dn);\n\n\t\t\t\tdouble denom = 1 - dn * dn * sn_p * sn_p;\n\t\t\t\tdouble re = -cn * dn * sn_p * cn_p / denom;\n\t\t\t\tdouble im = -sn * dn_p / denom;\n\n\t\t\t\tdouble alpha = -2 * re;\n\t\t\t\tdouble beta  = re * re + im * im;\n\t\t\t\tdouble gamma = 1 / (m * sn * sn);\n\n\t\t\t\tcoef.a[0] = 1; coef.a[1] = alpha / beta; coef.a[2] = 1 / beta;\n\t\t\t\tcoef.b[0] = 1; coef.b[1] = 0;            coef.b[2] = 1 / gamma;\n\t\t\t}\n\n\t\t\tif((this.order & 1) == 1)\n\t\t\t{\n\t\t\t\tCoefficient coef = coefs[this.order / 2];\n\n\t\t\t\tdouble denom = 1 - sn_p * sn_p;\n\t\t\t\tdouble re = -sn_p * cn_p / denom;\n\n\t\t\t\tcoef.a[0] = 1; coef.a[1] = -1 / re; coef.a[2] = 0;\n\t\t\t\tcoef.b[0] = 1; coef.b[1] = 0;       coef.b[2] = 0;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Equalizer/FilterDesigner.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter.Equalizer\n{\n\tusing Function = SoundLibrary.Mathematics.Function.Function;\n\tusing Cached = SoundLibrary.Mathematics.Function.CachedFunction;\n\n\t/// <summary>\n\t/// パライコの IIR フィルタ設計クラス。\n\t/// </summary>\n\t/// <remarks>\n\t/// フィルタの零/極計算。\n\t/// 零/極 → アナログプロトタイプフィルタ係数計算。\n\t/// AP フィルタ →[双一次変換]→ ディジタルフィルタ化。\n\t/// ディジタルフィルタ係数を ParametricEqualizer クラスの形式に変換。\n\t/// \n\t/// 零/極                 : AP フィルタの零/極。共役複素数根、実根×2、もしくは実根×1。\n\t/// AP フィルタ係数       : a[3], b[3]。∑b[i]s^i / ∑a[i]s^i。\n\t/// ディジタルフィルタ係数: a[3], b[3]。∑b[i]z^-i / ∑a[i]z^-i。\n\t/// パライコクラスの係数  : a[2], b[2], c。c * (1 + ∑b[i]z^-i) / (1 - ∑a[i]z^-i)。\n\t/// </remarks>\n\tpublic abstract class FilterDesigner\n\t{\n\t\t#region フィールド\n\n\t\tprotected int order;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tprotected FilterDesigner() : this(0) {}\n\t\tprotected FilterDesigner(int order){this.order = order;}\n\n\t\t#endregion\n\t\t#region プロパティ\n\n\t\t/// <summary>\n\t\t/// 次数。\n\t\t/// </summary>\n\t\tpublic int Order\n\t\t{\n\t\t\tget{return this.order;}\n\t\t\tset{this.order = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 零/極ペアの数。\n\t\t/// </summary>\n\t\tpublic virtual int Length\n\t\t{\n\t\t\tget{return (this.order + 1) / 2;}\n\t\t}\n\n\t\t#endregion\n\t\t#region 抽象メソッド\n\n\t\t/// <summary>\n\t\t/// フィルタの零点/極を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"roots\">零点/極一覧の格納先</param>\n\t\tpublic abstract void GetZeroPole(ZeroPole[] roots);\n\n\t\t#endregion\n\t\t#region 零点/極の計算\n\n\t\t/// <summary>\n\t\t/// フィルタの零点/極を計算。\n\t\t/// 結果格納用の配列を関数内で確保。\n\t\t/// </summary>\n\t\t/// <returns>フィルタの零点/極一覧</returns>\n\t\tpublic virtual ZeroPole[] GetZeroPole()\n\t\t{\n\t\t\tZeroPole[] roots = new ZeroPole[this.Length];\n\t\t\tfor(int i=0; i<roots.Length; ++i) roots[i] = new ZeroPole();\n\n\t\t\tthis.GetZeroPole(roots);\n\t\t\treturn roots;\n\t\t}\n\n\t\t#endregion\n\t\t#region アナログプロトタイプフィルタ係数設計\n\n\t\t/// <summary>\n\t\t/// アナログプロトタイプフィルタの係数を計算。\n\t\t/// </summary>\n\t\t/// <returns>AP フィルタ係数</returns>\n\t\tpublic Coefficient[] GetAnalogPrototype()\n\t\t{\n\t\t\tCoefficient[] coefs = new Coefficient[this.Length];\n\t\t\tfor(int i=0; i<coefs.Length; ++i) coefs[i] = new Coefficient();\n\n\t\t\tthis.GetAnalogPrototype(coefs);\n\n\t\t\treturn coefs;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// アナログプロトタイプフィルタの係数を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"coefs\">計算結果の格納先</param>\n\t\tpublic virtual void GetAnalogPrototype(Coefficient[] coefs)\n\t\t{\n\t\t\tZeroPole[] roots = this.GetZeroPole();\n\t\t\tZeroPoleToAnalogPrototype(roots, coefs);\n\t\t}\n\n\t\t#endregion\n\t\t#region ディジタルフィルタ係数設計\n\n\t\t/// <summary>\n\t\t/// ディジタル LPF 係数を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">カットオフ周波数</param>\n\t\t/// <returns>ディジタル LPF 係数</returns>\n\t\tpublic Coefficient[] GetDigitalLPF(double w)\n\t\t{\n\t\t\tCoefficient[] coefs = new Coefficient[this.Length];\n\t\t\tfor(int i=0; i<coefs.Length; ++i) coefs[i] = new Coefficient();\n\n\t\t\tthis.GetDigitalLPF(w, coefs);\n\n\t\t\treturn coefs;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ディジタル LPF 係数を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">カットオフ周波数</param>\n\t\t/// <param name=\"coefs\">計算結果の格納先</param>\n\t\tpublic virtual void GetDigitalLPF(double w, Coefficient[] coefs)\n\t\t{\n\t\t\tthis.GetAnalogPrototype(coefs);\n\t\t\tBilinearTransform(coefs, coefs, w);\n\t\t}\n\n\t\t#endregion\n\t\t#region PEQ 係数\n\n\t\t/// <summary>\n\t\t/// PEQ 係数(LPF)を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"w\"></param>\n\t\t/// <returns></returns>\n\t\tpublic virtual ParametricEqualizer.Parameter[] GetLPF(double w)\n\t\t{\n\t\t\tParametricEqualizer.Parameter[] peq = new ParametricEqualizer.Parameter[this.Length];\n\t\t\tfor(int i=0; i<peq.Length; ++i) peq[i] = new ParametricEqualizer.Parameter();\n\n\t\t\tToPeqCoefficient(this.GetDigitalLPF(w), peq);\n\t\t\treturn peq;\n\t\t}\n\n\t\t#endregion\n\t\t#region 変換\n\t\t#region 零点/極配置→アナログプロトタイプフィルタ係数\n\n\t\tpublic static void RootToAnalogPrototype(Root root, double[] c)\n\t\t{\n\t\t\tswitch(root.type)\n\t\t\t{\n\t\t\t\tcase Root.Type.Complex:\n\t\t\t\t\tc[2] = 1;\n\t\t\t\t\tc[1] = -2 * root.a;\n\t\t\t\t\tc[0] = root.a * root.a + root.b * root.b;\n\t\t\t\t\tbreak;\n\t\t\t\tcase Root.Type.Real:\n\t\t\t\t\tc[2] = 1;\n\t\t\t\t\tc[1] = -(root.a + root.b);\n\t\t\t\t\tc[0] = root.a * root.b;\n\t\t\t\t\tbreak;\n\t\t\t\tcase Root.Type.None:\n\t\t\t\t\tc[2] = 0;\n\t\t\t\t\tc[1] = 0;\n\t\t\t\t\tc[0] = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tc[2] = 0;\n\t\t\t\t\tc[1] = 1;\n\t\t\t\t\tc[0] = -root.a;\n          break;\n\t\t\t}\n\t\t}\n\n\t\tpublic static void ZeroPoleToAnalogPrototype(ZeroPole zeropole, Coefficient coef)\n\t\t{\n\t\t\tRootToAnalogPrototype(zeropole.zero, coef.b);\n\t\t\tRootToAnalogPrototype(zeropole.pole, coef.a);\n\t\t}\n\n\t\tpublic static void ZeroPoleToAnalogPrototype(ZeroPole[] roots, Coefficient[] coefs)\n\t\t{\n\t\t\tfor(int i=0; i<roots.Length; ++i)\n\t\t\t{\n\t\t\t\tZeroPoleToAnalogPrototype(roots[i], coefs[i]);\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 双一次変換\n\n\t\t/// <summary>\n\t\t/// 1次の伝達関数を双1時変換する。\n\t\t/// </summary>\n\t\t/// <remarks>\n\t\t/// (b0 + b1 s)/(a0 + a1 s) を、双1次変換した結果を\n\t\t/// (b0' + b1' z^-1)/(a0' + a1' z^-1)とするとき、\n\t\t/// a0, a1 → a0', a1' を求める。\n\t\t/// (b に関しても同様の手順で変換可能。)\n\t\t/// </remarks>\n\t\t/// <param name=\"a0\">a0(a0'の値に上書きされる)</param>\n\t\t/// <param name=\"a1\">a1(a1'の値に上書きされる)</param>\n\t\t/// <param name=\"sin\">sin ωs</param>\n\t\t/// <param name=\"cos\">cos ωs</param>\n\t\tpublic static void BilinearTransform(\n\t\t\tdouble a0, double a1,\n\t\t\tout double d0, out double d1,\n\t\t\tdouble sin, double cos)\n\t\t{\n\t\t\ta0 = a0 * sin;\n\t\t\ta1 = a1 * (1 + cos);\n\n\t\t\td0 = a0 + a1;\n\t\t\td1 = a0 - a1;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 2次の伝達関数を双1時変換する。\n\t\t/// </summary>\n\t\t/// <remarks>\n\t\t/// (b0 + b1 s + b2 s^2)/(a0 + a1 s + a2 s^2) を、双1次変換した結果を\n\t\t/// (b0' + b1' z^-1 + b2' z^-2)/(a0' + a1' z^-1 + a2' z^-2)とするとき、\n\t\t/// a0, a1, a2 → a0', a1', a2' を求める。\n\t\t/// (b に関しても同様の手順で変換可能。)\n\t\t/// </remarks>\n\t\t/// <param name=\"a0\">a0(a0'の値に上書きされる)</param>\n\t\t/// <param name=\"a1\">a1(a1'の値に上書きされる)</param>\n\t\t/// <param name=\"a2\">a2(a2'の値に上書きされる)</param>\n\t\t/// <param name=\"sin\">sin ωs</param>\n\t\t/// <param name=\"cos\">cos ωs</param>\n\t\tpublic static void BilinearTransform(\n\t\t\tdouble a0, double a1, double a2,\n\t\t\tout double d0, out double d1, out double d2,\n\t\t\tdouble sin, double cos)\n\t\t{\n\t\t\ta0 = a0 * (1 - cos);\n\t\t\ta1 = a1 * sin;\n\t\t\ta2 = a2 * (1 + cos);\n\n\t\t\td0 = d2 = a0 + a2;\n\t\t\td1 = 2 * (a0 - a2);\n\n\t\t\td0 += a1;\n\t\t\td2 -= a1;\n\t\t}\n\n\t\tpublic static void BilinearTransform(Coefficient ap, Coefficient digital, double sin, double cos)\n\t\t{\n\t\t\tif(ap.a[2] != 0 || ap.b[2] != 0)\n\t\t\t{\n\t\t\t\tBilinearTransform(\n\t\t\t\t\tap.a[0], ap.a[1], ap.a[2],\n\t\t\t\t\tout digital.a[0], out digital.a[1], out digital.a[2],\n\t\t\t\t\tsin, cos);\n\t\t\t\tBilinearTransform(\n\t\t\t\t\tap.b[0], ap.b[1], ap.b[2],\n\t\t\t\t\tout digital.b[0], out digital.b[1], out digital.b[2],\n\t\t\t\t\tsin, cos);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdigital.a[2] = 0;\n\t\t\tdigital.b[2] = 0;\n\n\t\t\tif(ap.a[1] != 0 || ap.b[1] != 0)\n\t\t\t{\n\t\t\t\tBilinearTransform(\n\t\t\t\t\tap.a[0], ap.a[1],\n\t\t\t\t\tout digital.a[0], out digital.a[1],\n\t\t\t\t\tsin, cos);\n\t\t\t\tBilinearTransform(\n\t\t\t\t\tap.b[0], ap.b[1],\n\t\t\t\t\tout digital.b[0], out digital.b[1],\n\t\t\t\t\tsin, cos);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdigital.a[1] = 0;\n\t\t\tdigital.b[1] = 0;\n\n\t\t\tdigital.a[0] = ap.a[0];\n\t\t\tdigital.b[0] = ap.b[0];\n\t\t}\n\n\t\tpublic static void BilinearTransform(Coefficient[] ap, Coefficient[] digital, double w)\n\t\t{\n\t\t\tdouble sin, cos;\n\t\t\tGetSinCos(w, out sin, out cos);\n\n\t\t\tfor(int i=0; i<ap.Length; ++i)\n\t\t\t{\n\t\t\t\tBilinearTransform(ap[i], digital[i], sin, cos);\n\t\t\t}\n\t\t}\n\n\t\tprotected static void GetSinCos(double w, out double sin, out double cos)\n\t\t{\n\t\t\tcos = Math.Cos(w);\n\t\t\tsin = Math.Sqrt(1 - cos * cos); //Math.Sin(w);\n\t\t}\n\n\t\t#endregion\n\t\t#region ディジタルフィルタ係数→PEQの係数\n\n\t\tpublic static void ToPeqCoefficient(Coefficient digital, ParametricEqualizer.Parameter peq)\n\t\t{\n\t\t\tdouble[] a = digital.a;\n\t\t\tdouble[] b = digital.b;\n\n\t\t\tpeq.c  =  b[0] / a[0];\n\t\t\tpeq.a1 = -a[1] / a[0];\n\t\t\tpeq.a2 = -a[2] / a[0];\n\t\t\tpeq.b1 =  b[1] / b[0];\n\t\t\tpeq.b2 =  b[2] / b[0];\n\t\t}\n\n\t\tpublic static void ToPeqCoefficient(Coefficient[] digital, ParametricEqualizer.Parameter[] peq)\n\t\t{\n\t\t\tfor(int i=0; i<digital.Length; ++i)\n\t\t\t{\n\t\t\t\tToPeqCoefficient(digital[i], peq[i]);\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#endregion\n\t\t#region Function クラスとの連携\n\n\t\t/// <summary>\n\t\t/// z^-1 = exp(-jω)\n\t\t/// </summary>\n\t\t/// <param name=\"w\">周波数ω</param>\n\t\t/// <returns>z^-1</returns>\n\t\tpublic static Function ZInv(Function w)\n\t\t{\n\t\t\treturn new Cached(\n\t\t\t\tFunction.Exp(-Function.I(w))\n\t\t\t\t);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 双1次変換\n\t\t/// s = 1/tan(ωs/2) * (z^-1 + 1) / (z^-1 - 1)\n\t\t///   = j tan(ω/2) / tan(ωs/2)\n\t\t/// </summary>\n\t\t/// <param name=\"w\">ω</param>\n\t\t/// <param name=\"ws\">ωs</param>\n\t\t/// <returns>ディジタル s</returns>\n\t\tpublic static Function DigitalS(Function w, Function ws)\n\t\t{\n\t\t\treturn new Cached(\n\t\t\t\tFunction.I(\n\t\t\t\tFunction.Tan(w / 2) / Function.Tan(ws / 2)\n\t\t\t\t));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 双1次変換\n\t\t/// s = 1/tan(ωs/2) * (z^-1 + 1) / (z^-1 - 1)\n\t\t///   = j tan(ω/2) / tan(ωs/2)\n\t\t/// </summary>\n\t\t/// <param name=\"w\">ω</param>\n\t\t/// <param name=\"ws\">ωs</param>\n\t\t/// <returns>ディジタル s</returns>\n\t\tpublic static Function DigitalS(Function w, double ws)\n\t\t{\n\t\t\treturn new Cached(\n\t\t\t\tFunction.I(\n\t\t\t\tFunction.Tan(w / 2) / Math.Tan(ws / 2)\n\t\t\t\t));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 双1次変換(ωs＝π/2)\n\t\t/// s = (z^-1 + 1) / (z^-1 - 1)\n\t\t///   = j tan(ω/2)\n\t\t/// </summary>\n\t\t/// <param name=\"w\">ω</param>\n\t\t/// <returns>ディジタル s</returns>\n\t\tpublic static Function DigitalS(Function w)\n\t\t{\n\t\t\treturn new Cached(\n\t\t\t\tFunction.I(\n\t\t\t\tFunction.Tan(w / 2)\n\t\t\t\t));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// アナログ伝達関数を取得。\n\t\t/// </summary>\n\t\t/// <param name=\"s\">s 領域変数</param>\n\t\t/// <returns>伝達関数</returns>\n\t\tpublic Function GetTransferFunction(Function s)\n\t\t{\n\t\t\tCoefficient[] coefs = this.GetAnalogPrototype();\n\t\t\tFunction f = (Function)1;\n\n\t\t\tforeach(Coefficient coef in coefs)\n\t\t\t{\n\t\t\t\tf *=\n\t\t\t\t\t(coef.b[0] + coef.b[1] * s + coef.b[2] * s * s) /\n\t\t\t\t\t(coef.a[0] + coef.a[1] * s + coef.a[2] * s * s);\n\t\t\t}\n\n\t\t\treturn f;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ディジタル伝達関数の周波数特性を取得。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">周波数変数ω(正規化角周波数)</param>\n\t\t/// <param name=\"ws\">カットオフ周波数ωs(正規化角周波数)</param>\n\t\t/// <returns>周波数特性</returns>\n\t\tpublic Function GetTransferFunction(Function w, Function ws)\n\t\t{\n\t\t\treturn this.GetTransferFunction(DigitalS(w, ws));\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Equalizer/ParametricEqualizer.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace SoundLibrary.Filter.Equalizer\n{\n\t/// <summary>\n\t/// パラメトリックイコライザ。\n\t/// 2次IIRの直列接続で実現。\n\t/// IIR の伝達関数の式は以下の通り\n\t/// c * (1 + b1 * z^-1 + b2 z^-2) / (1 - a1 * z^-1 - a2 z^-2)\n\t/// </summary>\n\tpublic class ParametricEqualizer : IFilter\n\t{\n\t\t#region 内部データ型\n\n\t\t/// <summary>\n\t\t/// 2次 IIR のパラメータ\n\t\t/// </summary>\n\t\tpublic class Parameter\n\t\t{\n\t\t\tpublic double c;\n\t\t\tpublic double a1;\n\t\t\tpublic double a2;\n\t\t\tpublic double b1;\n\t\t\tpublic double b2;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 2次 IIR の1個1個の状態＋パラメータを表すクラス。\n\t\t/// </summary>\n\t\tprivate class Tuple\n\t\t{\n\t\t\tpublic double t1;\n\t\t\tpublic double t2;\n\t\t\tpublic Parameter parameter;\n\n\t\t\tpublic Tuple(Parameter parameter)\n\t\t\t{\n\t\t\t\tthis.parameter = parameter;\n\t\t\t\tthis.Clear();\n\t\t\t}\n\n\t\t\tpublic void Clear()\n\t\t\t{\n\t\t\t\tthis.t1 = 0;\n\t\t\t\tthis.t2 = 0;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region フィールド\n\n\t\tdouble gain;\n\t\tArrayList filters;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic ParametricEqualizer()\n\t\t{\n\t\t\tthis.gain = 1;\n\t\t\tthis.filters = new ArrayList();\n\t\t}\n\n\t\tpublic ParametricEqualizer(params Parameter[] parameters) : this()\n\t\t{\n\t\t\tthis.Add(parameters);\n\t\t}\n\n\t\tprivate ParametricEqualizer(ArrayList filters)\n\t\t{\n\t\t\tthis.gain = 1;\n\t\t\tthis.filters = new ArrayList();\n\n\t\t\tforeach(Tuple filter in filters)\n\t\t\t{\n\t\t\t\tthis.Add(filter.parameter);\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region パラメータ設定\n\n\t\tpublic void Add(Parameter parameter)\n\t\t{\n\t\t\tthis.filters.Add(new Tuple(parameter));\n\t\t\tthis.gain *= parameter.c;\n\t\t}\n\n\t\tpublic void Add (params Parameter[] parameters)\n\t\t{\n\t\t\tforeach(Parameter parameter in parameters)\n\t\t\t{\n\t\t\t\tthis.Add(parameter);\n\t\t\t}\n\t\t}\n\n\t\tpublic void RemoveAt(int i)\n\t\t{\n\t\t\tTuple tuple = (Tuple)this.filters[i];\n\t\t\tthis.gain /= tuple.parameter.c;\n\t\t\tthis.filters.RemoveAt(i);\n\t\t}\n\n\t\tpublic Parameter this[int i]\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tTuple tuple = (Tuple)this.filters[i];\n\t\t\t\treturn tuple.parameter;\n\t\t\t}\n\t\t\tset\n\t\t\t{\n\t\t\t\tTuple tuple = (Tuple)this.filters[i];\n\t\t\t\tthis.gain /= tuple.parameter.c;\n\t\t\t\tthis.gain *= value.c;\n\t\t\t\ttuple.parameter = value;\n\t\t\t}\n\t\t}\n\n\t\tpublic void UpdateGain()\n\t\t{\n\t\t\tthis.gain = 1;\n\t\t\tforeach(Tuple f in this.filters)\n\t\t\t{\n\t\t\t\tthis.gain *= f.parameter.c;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region IFilter メンバ\n\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tx *= gain;\n\n\t\t\tforeach(Tuple filter in this.filters)\n\t\t\t{\n\t\t\t\tx = GetValue(filter, x);\n\t\t\t}\n\n\t\t\treturn x;\n\t\t}\n\n\t\tstatic double GetValue(Tuple filter, double x)\n\t\t{\n\t\t\tx += filter.parameter.a1 * filter.t1;\n\t\t\tx += filter.parameter.a2 * filter.t2;\n\t\t\tdouble y = x;\n\t\t\ty += filter.parameter.b1 * filter.t1;\n\t\t\ty += filter.parameter.b2 * filter.t2;\n\t\t\tfilter.t2 = filter.t1;\n\t\t\tfilter.t1 = x;\n\t\t\treturn y;\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tforeach(Tuple filter in this.filters)\n\t\t\t{\n\t\t\t\tfilter.Clear();\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable メンバ\n\n\t\tpublic ParametricEqualizer Clone()\n\t\t{\n\t\t\treturn new ParametricEqualizer(this.filters);\n\t\t}\n\n\t\tobject ICloneable.Clone()\n\t\t{\n\t\t\treturn this.Clone();\n\t\t}\n\n\t\t#endregion\n\t\t#region パラメータ設計用 static 関数\n\n\t\t#region 双1次変換\n\n\t\t/// <summary>\n\t\t/// 1次の伝達関数を双1時変換する。\n\t\t/// </summary>\n\t\t/// <remarks>\n\t\t/// (b0 + b1 s)/(a0 + a1 s) を、双1次変換した結果を\n\t\t/// (b0' + b1' z^-1)/(a0' + a1' z^-1)とするとき、\n\t\t/// a0, a1 → a0', a1' を求める。\n\t\t/// (b に関しても同様の手順で変換可能。)\n\t\t/// </remarks>\n\t\t/// <param name=\"a0\">a0(a0'の値に上書きされる)</param>\n\t\t/// <param name=\"a1\">a1(a1'の値に上書きされる)</param>\n\t\t/// <param name=\"sin\">sin ωs</param>\n\t\t/// <param name=\"cos\">cos ωs</param>\n\t\tstatic void BilinearTransform(ref double a0, ref double a1, double sin, double cos)\n\t\t{\n\t\t\tdouble t0 = a0 * sin;\n\t\t\tdouble t1 = a1 * (1 + cos);\n\n\t\t\ta0 = t0 + t1;\n\t\t\ta1 = t0 - t1;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 2次の伝達関数を双1時変換する。\n\t\t/// </summary>\n\t\t/// <remarks>\n\t\t/// (b0 + b1 s + b2 s^2)/(a0 + a1 s + a2 s^2) を、双1次変換した結果を\n\t\t/// (b0' + b1' z^-1 + b2' z^-2)/(a0' + a1' z^-1 + a2' z^-2)とするとき、\n\t\t/// a0, a1, a2 → a0', a1', a2' を求める。\n\t\t/// (b に関しても同様の手順で変換可能。)\n\t\t/// </remarks>\n\t\t/// <param name=\"a0\">a0(a0'の値に上書きされる)</param>\n\t\t/// <param name=\"a1\">a1(a1'の値に上書きされる)</param>\n\t\t/// <param name=\"a2\">a2(a2'の値に上書きされる)</param>\n\t\t/// <param name=\"sin\">sin ωs</param>\n\t\t/// <param name=\"cos\">cos ωs</param>\n\t\tstatic void BilinearTransform(ref double a0, ref double a1, ref double a2, double sin, double cos)\n\t\t{\n\t\t\tdouble t0 = a0 * (1 - cos);\n\t\t\tdouble t1 = a1 * sin;\n\t\t\tdouble t2 = a2 * (1 + cos);\n\n\t\t\ta0 = a2 = t0 + t2;\n\t\t\ta1 = 2 * (t0 - t2);\n\n\t\t\ta0 += t1;\n\t\t\ta2 -= t1;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ハイパスフィルタ用双1次変換。\n\t\t/// </summary>\n\t\tstatic void BilinearTransformHPF(ref double a0, ref double a1, ref double a2, double sin, double cos)\n\t\t{\n\t\t\tBilinearTransform(ref a2, ref a1, ref a0, sin, cos);\n\t\t\tSwap(ref a0, ref a2);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ハイパスフィルタ用双1次変換。\n\t\t/// </summary>\n\t\tstatic void BilinearTransformHPF(ref double a0, ref double a1, double sin, double cos)\n\t\t{\n\t\t\tBilinearTransform(ref a1, ref a0, sin, cos);\n\t\t\tSwap(ref a0, ref a1);\n\t\t}\n\n\t\tstatic void Swap(ref double a, ref double b)\n\t\t{\n\t\t\tdouble tmp = a; a = b; b = tmp;\n\t\t}\n\n\t\t#endregion\n\t\t#region RBJ Audio-EQ-Cookbook Biquad フィルタ\n\n\t\t/// <summary>\n\t\t/// ローパスフィルタの設計。\n\t\t/// H(s) = 1 / (s^2 + s/Q + 1)\n\t\t/// b0 =  (1 - cos)/2\n\t\t/// b1 =   1 - cos\n\t\t/// b2 =  (1 - cos)/2\n\t\t/// a0 =   1 + alpha\n\t\t/// a1 =  -2*cos\n\t\t/// a2 =   1 - alpha\n\t\t/// </summary>\n\t\t/// <param name=\"w\">カットオフ周波数</param>\n\t\t/// <param name=\"q\">Q値</param>\n\t\t/// <returns>パラメータ</returns>\n\t\tpublic static Parameter GetLowPass(double w, double q)\n\t\t{\n\t\t\tdouble cos = Math.Cos(w);\n\t\t\tdouble alpha = Math.Sin(w) / (2 * q);\n\t\t\tdouble a0 = 1 + alpha;\n\n\t\t\tParameter parameter = new Parameter();\n\t\t\tparameter.c = (1 - cos) / (2 * a0);\n\t\t\tparameter.a1 = 2 * cos / a0;\n\t\t\tparameter.a2 = -(1 - alpha) / a0;\n\t\t\tparameter.b1 = 2;\n\t\t\tparameter.b2 = 1;\n\n\t\t\treturn parameter;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ハイパスフィルタの設計。\n\t\t/// H(s) = s^2 / (s^2 + s/Q + 1)\n\t\t/// b0 =  (1 + cos)/2\n\t\t/// b1 =  -(1 + cos)\n\t\t/// b2 =  (1 + cos)/2\n\t\t/// a0 =   1 + alpha\n\t\t/// a1 =  -2*cos\n\t\t/// a2 =   1 - alpha\n\t\t/// </summary>\n\t\t/// <param name=\"w\">カットオフ周波数</param>\n\t\t/// <param name=\"q\">Q値</param>\n\t\t/// <returns>パラメータ</returns>\n\t\tpublic static Parameter GetHighPass(double w, double q)\n\t\t{\n\t\t\tdouble cos = Math.Cos(w);\n\t\t\tdouble alpha = Math.Sin(w) / (2 * q);\n\t\t\tdouble a0 = 1 + alpha;\n\n\t\t\tParameter parameter = new Parameter();\n\t\t\tparameter.c = (1 + cos) / (2 * a0);\n\t\t\tparameter.a1 = 2 * cos / a0;\n\t\t\tparameter.a2 = -(1 - alpha) / a0;\n\t\t\tparameter.b1 = -2;\n\t\t\tparameter.b2 = 1;\n\n\t\t\treturn parameter;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ピーキングフィルタの設計。\n\t\t/// H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)\n\t\t/// b0 =   1 + alpha*A\n\t\t/// b1 =  -2*cos\n\t\t/// b2 =   1 - alpha*A\n\t\t/// a0 =   1 + alpha/A\n\t\t/// a1 =  -2*cos\n\t\t/// a2 =   1 - alpha/A\n\t\t/// </summary>\n\t\t/// <param name=\"w\">カットオフ周波数</param>\n\t\t/// <param name=\"q\">Q値</param>\n\t\t/// <returns>パラメータ</returns>\n\t\tpublic static Parameter GetPeaking(double w, double q, double g)\n\t\t{\n\t\t\tdouble cos = Math.Cos(w);\n\t\t\tdouble alpha = Math.Sin(w) / (2 * q);\n\t\t\tdouble a0, a1, a2, b0, b1, b2;\n#if true\n\t\t\tdouble A = Math.Sqrt(g);\n\n\t\t\ta0 = 1 + alpha / A;\n\t\t\ta1 = -2 * cos;\n\t\t\ta2 = 1 - alpha / A;\n\t\t\tb0 = 1 + alpha * A;\n\t\t\tb1 = -2 * cos;\n\t\t\tb2 = 1 - alpha * A;\n#else\n\t\t\tif(g > 1)\n\t\t\t{\n\t\t\t\ta0 = 1 + alpha;\n\t\t\t\ta1 = -2 * cos;\n\t\t\t\ta2 = 1 - alpha;\n\t\t\t\tb0 = 1 + alpha * g;\n\t\t\t\tb1 = -2 * cos;\n\t\t\t\tb2 = 1 - alpha * g;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ta0 = 1 + alpha / g;\n\t\t\t\ta1 = -2 * cos;\n\t\t\t\ta2 = 1 - alpha / g;\n\t\t\t\tb0 = 1 + alpha;\n\t\t\t\tb1 = -2 * cos;\n\t\t\t\tb2 = 1 - alpha;\n\t\t\t}\n#endif\n\n\t\t\tParameter parameter = new Parameter();\n\t\t\tparameter.c = b0 / a0;\n\t\t\tparameter.a1 = -a1 / a0;\n\t\t\tparameter.a2 = -a2 / a0;\n\t\t\tparameter.b1 = b1 / b0;\n\t\t\tparameter.b2 = b2 / b0;\n\n\t\t\treturn parameter;\n\t\t}\n\n\t\tpublic static void GetPeaking(double w, double q, double g, Parameter parameter)\n\t\t{\n\t\t\tdouble cos = Math.Cos(w);\n\t\t\tdouble alpha = Math.Sin(w) / (2 * q);\n\t\t\tdouble a0, a1, a2, b0, b1, b2;\n\n\t\t\tdouble A = Math.Sqrt(g);\n\n\t\t\ta0 = 1 + alpha / A;\n\t\t\ta1 = -2 * cos;\n\t\t\ta2 = 1 - alpha / A;\n\t\t\tb0 = 1 + alpha * A;\n\t\t\tb1 = -2 * cos;\n\t\t\tb2 = 1 - alpha * A;\n\n\t\t\tparameter.c = b0 / a0;\n\t\t\tparameter.a1 = -a1 / a0;\n\t\t\tparameter.a2 = -a2 / a0;\n\t\t\tparameter.b1 = b1 / b0;\n\t\t\tparameter.b2 = b2 / b0;\n\t\t}\n\n#if false\n\t\t// ↓これから追加していく。\n\nBPF:        H(s) = s / (s^2 + s/Q + 1)          (constant skirt gain, peak gain = Q)\n\n            b0 =   sin/2  =   Q*alpha\n            b1 =   0 \n            b2 =  -sin/2  =  -Q*alpha\n            a0 =   1 + alpha\n            a1 =  -2*cos\n            a2 =   1 - alpha\n\n\nBPF:        H(s) = (s/Q) / (s^2 + s/Q + 1)      (constant 0 dB peak gain)\n\n            b0 =   alpha\n            b1 =   0\n            b2 =  -alpha\n            a0 =   1 + alpha\n            a1 =  -2*cos\n            a2 =   1 - alpha\n\n\n\nnotch:      H(s) = (s^2 + 1) / (s^2 + s/Q + 1)\n\n            b0 =   1\n            b1 =  -2*cos\n            b2 =   1\n            a0 =   1 + alpha\n            a1 =  -2*cos\n            a2 =   1 - alpha\n\n\n\nAPF:        H(s) = (s^2 - s/Q + 1) / (s^2 + s/Q + 1)\n\n            b0 =   1 - alpha\n            b1 =  -2*cos\n            b2 =   1 + alpha\n            a0 =   1 + alpha\n            a1 =  -2*cos\n            a2 =   1 - alpha\n\n\n\npeakingEQ:  H(s) = (s^2 + s*(A/Q) + 1) / (s^2 + s/(A*Q) + 1)\n\n            b0 =   1 + alpha*A\n            b1 =  -2*cos\n            b2 =   1 - alpha*A\n            a0 =   1 + alpha/A\n            a1 =  -2*cos\n            a2 =   1 - alpha/A\n\n\n\nlowShelf:   H(s) = A * (s^2 + (sqrt(A)/Q)*s + A) / (A*s^2 + (sqrt(A)/Q)*s + 1)\n\n            b0 =    A*[ (A+1) - (A-1)*cos + beta*sin ]\n            b1 =  2*A*[ (A-1) - (A+1)*cos            ]\n            b2 =    A*[ (A+1) - (A-1)*cos - beta*sin ]\n            a0 =        (A+1) + (A-1)*cos + beta*sin\n            a1 =   -2*[ (A-1) + (A+1)*cos            ]\n            a2 =        (A+1) + (A-1)*cos - beta*sin\n\n\n\nhighShelf:  H(s) = A * (A*s^2 + (sqrt(A)/Q)*s + 1) / (s^2 + (sqrt(A)/Q)*s + A)\n\n            b0 =    A*[ (A+1) + (A-1)*cos + beta*sin ]\n            b1 = -2*A*[ (A-1) + (A+1)*cos            ]\n            b2 =    A*[ (A+1) + (A-1)*cos - beta*sin ]\n            a0 =        (A+1) - (A-1)*cos + beta*sin\n            a1 =    2*[ (A-1) - (A+1)*cos            ]\n            a2 =        (A+1) - (A-1)*cos - beta*sin\n#endif\n\n\t\t#endregion\n\t\t#region Butterworth フィルタ\n\n\t\t/// <summary>\n\t\t/// バターワースフィルタの設計。\n\t\t/// n が偶数のとき\n\t\t/// H(s) = Π_(k=0)^(n/2-1) {1 / (s^2 + (2cos((2k+1)/2n))s + 1)}\n\t\t/// n が奇数のとき\n\t\t/// H(s) = Π_(k=0)^(n/2-1) {1 / (s^2 + (2cos(k/n))s + 1)} × 1 / (1 + s)\n\t\t/// \n\t\t/// 以下の係数を持つ n/2 個のIIRを直列接続。\n\t\t/// (k=0～n/2-1)\n\t\t/// alpha(k,n) = sinω × cos((2k+1)/2n)) … (n 偶数)\n\t\t/// alpha(k,n) = sinω × cos(k/n)) … (n 奇数)\n\t\t/// b0 =  (1 - cos)/2\n\t\t/// b1 =   1 - cos\n\t\t/// b2 =  (1 - cos)/2\n\t\t/// a0 =   1 + alpha(k,n)\n\t\t/// a1 =  -2*cos\n\t\t/// a2 =   1 - alpha(k,n)\n\t\t/// (nが奇数の時にはさらに、b0 = sin, b1 = sin, a0 = sin+cos+1, a1 = sin-cos-1)\n\t\t/// </summary>\n\t\t/// <param name=\"n\">バターワースフィルタの次数</param>\n\t\t/// <param name=\"w\">カットオフ周波数</param>\n\t\t/// <returns>フィルタ係数</returns>\n\t\tpublic static Parameter[] GetButterworthLowPass(int n, double w)\n\t\t{\n\t\t\treturn GetButterworth(n, w, 0);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// バターワースフィルタの設計。\n\t\t/// </summary>\n\t\t/// <remarks>\n\t\t/// 次数 n が偶数のとき\n\t\t/// H(s) = Π_(k=0)^(n/2-1) {s^2 / (s^2 + (2cos((2k+1)/2n))s + 1)}\n\t\t/// n が奇数のとき\n\t\t/// H(s) = Π_(k=0)^(n/2-1) {s^2 / (s^2 + (2cos(k/n))s + 1)} × s / (1 + s)\n\t\t/// \n\t\t/// 以下の係数を持つ n/2 個のIIRを直列接続。\n\t\t/// (k=0～n/2-1)\n\t\t/// alpha(k,n) = sinω × cos((2k+1)/2n)) … (n 偶数)\n\t\t/// alpha(k,n) = sinω × cos(k/n)) … (n 奇数)\n\t\t/// b0 =  (1 + cos)/2\n\t\t/// b1 =  -(1 + cos)\n\t\t/// b2 =  (1 + cos)/2\n\t\t/// a0 =   1 + alpha(k,n)\n\t\t/// a1 =  -2*cos\n\t\t/// a2 =   1 - alpha(k,n)\n\t\t/// (nが奇数の時にはさらに、b0 = 1+cos, b1 = -(1+cos), a0 = sin+cos+1, a1 = sin-cos-1)\n\t\t/// </remarks>\n\t\t/// <param name=\"n\">バターワースフィルタの次数</param>\n\t\t/// <param name=\"w\">カットオフ周波数</param>\n\t\t/// <returns></returns>\n\t\tpublic static Parameter[] GetButterworthHighPass(int n, double w)\n\t\t{\n\t\t\treturn GetButterworth(n, w, 1);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Butterworth フィルタの設計\n\t\t/// </summary>\n\t\t/// <param name=\"n\">バターワースフィルタの次数</param>\n\t\t/// <param name=\"w\">カットオフ周波数</param>\n\t\t/// <param name=\"type\">0のときLPF、1のときHPF</param>\n\t\t/// <returns>フィルタ係数</returns>\n\t\tpublic static Parameter[] GetButterworth(int n, double w, int type)\n\t\t{\n\t\t\tdouble sin = Math.Sin(w);\n\t\t\tdouble cos = Math.Cos(w);\n\t\t\tdouble a0, a1, a2, b0;\n\t\t\tif(type == 0)\n\t\t\t\tb0 = (1 - cos) / 2;\n\t\t\telse\n\t\t\t\tb0 = (1 + cos) / 2;\n\t\t\ta1 = -2 * cos;\n\n\t\t\tint len = n/2;\n\t\t\tdouble nu;\n\n\t\t\tParameter[] parameters;\n\t\t\tif(n % 2 == 0)\n\t\t\t{\n\t\t\t\tparameters = new Parameter[len];\n\t\t\t\tnu = 0.5;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tparameters = new Parameter[len + 1];\n\t\t\t\tnu = 1;\n\n\t\t\t\ta0 = sin + cos + 1;\n\t\t\t\ta2 = sin - cos - 1;\n\t\t\t\tif(type == 0)\n\t\t\t\t\tparameters[len].c = sin / a0;\n\t\t\t\telse\n\t\t\t\t\tparameters[len].c = (1+cos) / a0;\n\t\t\t\tparameters[len].a1 = -a2 / a0;\n\t\t\t\tparameters[len].a2 = 0;\n\t\t\t\tif(type == 0)\n\t\t\t\t\tparameters[len].b1 = 1;\n\t\t\t\telse\n\t\t\t\t\tparameters[len].b1 = -1;\n\t\t\t\tparameters[len].b2 = 0;\n\t\t\t}\n\n\t\t\tfor(int i=0; i<len; ++i, ++nu)\n\t\t\t{\n\t\t\t\tdouble alpha = sin * Math.Cos(nu / n * Math.PI);\n\t\t\t\ta0 = 1 + alpha;\n\t\t\t\ta2 = 1 - alpha;\n\n\t\t\t\tparameters[i].c = b0 / a0;\n\t\t\t\tparameters[i].a1 = -a1 / a0;\n\t\t\t\tparameters[i].a2 = -a2 / a0;\n\t\t\t\tif(type == 0)\n\t\t\t\t\tparameters[i].b1 = 2;\n\t\t\t\telse\n\t\t\t\t\tparameters[i].b1 = -2;\n\t\t\t\tparameters[i].b2 = 1;\n\t\t\t}\n\n\t\t\treturn parameters;\n\t\t}\n\n\t\t#endregion\n\t\t#region Chebyshev フィルタ\n\n\t\tpublic static Parameter[] GetChebyshev1LowPass(int n, double w, double epsilon)\n\t\t{\n\t\t\treturn GetChebyshev1(n, w, epsilon, 0);\n\t\t}\n\n\t\tpublic static Parameter[] GetChebyshev1HighPass(int n, double w, double epsilon)\n\t\t{\n\t\t\treturn GetChebyshev1(n, w, epsilon, 1);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Chebyshev I 型フィルタの設計\n\t\t/// </summary>\n\t\t/// <param name=\"n\">バターワースフィルタの次数</param>\n\t\t/// <param name=\"w\">カットオフ周波数</param>\n\t\t/// <param name=\"epsilon\">リプルの許容幅</param>\n\t\t/// <param name=\"type\">0のときLPF、1のときHPF</param>\n\t\t/// <returns>フィルタ係数</returns>\n\t\tpublic static Parameter[] GetChebyshev1(int n, double w, double epsilon, int type)\n\t\t{\n\t\t\tdouble k = Math.Pow( (1 + Math.Sqrt(1 + epsilon*epsilon)) / epsilon, 1.0/n);\n\t\t\tdouble beta0 = (k * k - 1) / (2 * k);\n\n\t\t\tdouble sin = Math.Sin(w);\n\t\t\tdouble cos = Math.Cos(w);\n\t\t\tdouble a0, a1, a2, b0, tmp;\n\n\t\t\tint len = n/2;\n\t\t\tdouble nu;\n\n\t\t\tParameter[] parameters;\n\t\t\tif(n % 2 == 0)\n\t\t\t{\n\t\t\t\tparameters = new Parameter[len];\n\t\t\t\tnu = 0.5;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tparameters = new Parameter[len + 1];\n\t\t\t\tnu = 1;\n\n\t\t\t\ttmp = 1 + cos;\n\t\t\t\tif(type == 0)\n\t\t\t\t{\n\t\t\t\t\tb0 = beta0 * sin;\n\t\t\t\t\ta0 = b0 + tmp;\n\t\t\t\t\ta1 = b0 - tmp;\n\t\t\t\t\tparameters[len].b1 = 1;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tb0 = beta0 * tmp;\n\t\t\t\t\ta0 = sin + b0;\n\t\t\t\t\ta1 = sin - b0;\n\t\t\t\t\tparameters[len].b1 = -1;\n\t\t\t\t}\n\t\t\t\tparameters[len].c = b0 / a0;\n\t\t\t\tparameters[len].a1 = -a1 / a0;\n\t\t\t\tparameters[len].a2 = 0;\n\t\t\t\tparameters[len].b2 = 0;\n\t\t\t}\n\n\t\t\tfor(int i=0; i<len; ++i, ++nu)\n\t\t\t{\n\t\t\t\tdouble alpha = sin * 2 * beta0 * Math.Cos(nu / n * Math.PI);\n\t\t\t\tdouble beta = Math.Sin(nu / n * Math.PI);\n\t\t\t\tbeta *= beta;\n\t\t\t\tbeta += beta0 * beta0;\n\n\t\t\t\tif(type == 0)\n\t\t\t\t{\n\t\t\t\t\tb0 = beta * (1 - cos);\n\t\t\t\t\ttmp = 1 + cos;\n\t\t\t\t\ta1 = 2 * (b0 - tmp);\n\t\t\t\t\tparameters[i].b1 = 2;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tb0 = beta * (1 + cos);\n\t\t\t\t\ttmp = 1 - cos;\n\t\t\t\t\ta1 = 2 * (tmp - b0);\n\t\t\t\t\tparameters[i].b1 = -2;\n\t\t\t\t}\n\t\t\t\ta0 = b0 + tmp + alpha;\n\t\t\t\ta2 = b0 + tmp - alpha;\n\n\t\t\t\tparameters[i].c = b0 / a0;\n\t\t\t\tparameters[i].a1 = -a1 / a0;\n\t\t\t\tparameters[i].a2 = -a2 / a0;\n\t\t\t\tparameters[i].b2 = 1;\n\t\t\t}\n\n\t\t\treturn parameters;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Chebyshev フィルタの設計\n\t\t/// </summary>\n\t\t/// <param name=\"n\">バターワースフィルタの次数</param>\n\t\t/// <param name=\"w\">カットオフ周波数</param>\n\t\t/// <param name=\"epsilon\">リプルの許容幅</param>\n\t\t/// <param name=\"kind\">false のとき I 型フィルタ、true のとき II 型フィルタ</param>\n\t\t/// <param name=\"type\">false のときLPF、trueのときHPF</param>\n\t\t/// <returns>フィルタ係数</returns>\n\t\tpublic static Parameter[] GetChebyshev(int n, double w, double epsilon, bool kind, bool type)\n\t\t{\n\t\t\tdouble t = Math.Pow( (1 + Math.Sqrt(1 + epsilon*epsilon)) / epsilon, 1.0/n);\n\t\t\tdouble beta0 = (t * t - 1) / (2 * t);\n\n\t\t\tdouble cos = Math.Cos(w);\n\t\t\tdouble sin = Math.Sqrt(1 - cos * cos);//Math.Sin(w);\n\t\t\tdouble a0, a1, a2, b0, b1, b2;\n\n\t\t\tint len = n/2;\n\t\t\tint k;\n\n\t\t\tParameter[] parameters;\n\t\t\tif(n % 2 == 0)\n\t\t\t{\n\t\t\t\tparameters = new Parameter[len];\n\t\t\t\tk = 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tparameters = new Parameter[len + 1];\n\t\t\t\tk = 2;\n\n\t\t\t\tif(kind)\n\t\t\t\t{\n\t\t\t\t\ta0 = 1; a1 = beta0;\n\t\t\t\t\tb0 = 1; b1 = 0;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ta0 = beta0; a1 = 1;\n\t\t\t\t\tb0 = beta0; b1 = 0;\n\t\t\t\t}\n\t\t\t\t/* テスト用(Butterworth 特性)\n\t\t\t\ta0 = 1; a1 = 1;\n\t\t\t\tb0 = 1; b1 = 0;\n\t\t\t\t//*/\n\n\t\t\t\tif(type)\n\t\t\t\t{\n\t\t\t\t\tBilinearTransformHPF(ref a0, ref a1, sin, cos);\n\t\t\t\t\tBilinearTransformHPF(ref b0, ref b1, sin, cos);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tBilinearTransform(ref a0, ref a1, sin, cos);\n\t\t\t\t\tBilinearTransform(ref b0, ref b1, sin, cos);\n\t\t\t\t}\n\n\t\t\t\tparameters[len].c = b0 / a0;\n\t\t\t\tparameters[len].a1 = -a1 / a0;\n\t\t\t\tparameters[len].a2 = 0;\n\t\t\t\tparameters[len].b1 = b1 / b0;\n\t\t\t\tparameters[len].b2 = 0;\n\t\t\t}\n\n\t\t\tfor(int i=0; i<len; ++i, k += 2)\n\t\t\t{\n\t\t\t\tdouble wk = (double)k / n * Math.PI / 2;\n\n\t\t\t\tdouble alpha = 2 * beta0 * Math.Cos(wk);\n\t\t\t\tdouble beta = Math.Sin(wk);\n\t\t\t\tbeta *= beta;\n\t\t\t\tdouble gamma = beta;\n\t\t\t\tbeta += beta0 * beta0;\n\n\t\t\t\tif(kind)\n\t\t\t\t{\n\t\t\t\t\ta0 = 1; a1 = alpha; a2 = beta;\n\t\t\t\t\tb0 = 1; b1 = 0; b2 = gamma;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ta0 = beta; a1 = alpha; a2 = 1;\n\t\t\t\t\tb0 = beta; b1 = 0; b2 = 0;\n\t\t\t\t}\n\t\t\t\t/* テスト用(Butterworth 特性)\n\t\t\t\tdouble alpha = 2 * Math.Cos(wk);\n\t\t\t\ta0 = 1; a1 = alpha; a2 = 1;\n\t\t\t\tb0 = 1; b1 = 0; b2 = 0;\n\t\t\t\t//*/\n\n\t\t\t\tif(type)\n\t\t\t\t{\n\t\t\t\t\tBilinearTransformHPF(ref a0, ref a1, ref a2, sin, cos);\n\t\t\t\t\tBilinearTransformHPF(ref b0, ref b1, ref b2, sin, cos);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tBilinearTransform(ref a0, ref a1, ref a2, sin, cos);\n\t\t\t\t\tBilinearTransform(ref b0, ref b1, ref b2, sin, cos);\n\t\t\t\t}\n\n\t\t\t\tparameters[i].c = b0 / a0;\n\t\t\t\tparameters[i].a1 = -a1 / a0;\n\t\t\t\tparameters[i].a2 = -a2 / a0;\n\t\t\t\tparameters[i].b1 = b1 / b0;\n\t\t\t\tparameters[i].b2 = b2 / b0;\n\t\t\t}\n\n\t\t\treturn parameters;\n\t\t}\n\n\t\t#endregion\n#if false\n\t\t#region 楕円フィルタ\n\n\t\t/// <summary>\n\t\t/// 楕円フィルタの設計\n\t\t/// </summary>\n\t\t/// <param name=\"n\">バターワースフィルタの次数</param>\n\t\t/// <param name=\"w\">カットオフ周波数</param>\n\t\t/// <param name=\"epsilon\">ε</param>\n\t\t/// <param name=\"k1\">k1</param>\n\t\t/// <param name=\"type\">false のときLPF、trueのときHPF</param>\n\t\t/// <returns>フィルタ係数</returns>\n\t\tpublic static Parameter[] GetElliptic(int n, double w, double epsilon, double k1, bool type)\n\t\t{\n\t\t\tdouble t = Math.Pow( (1 + Math.Sqrt(1 + epsilon*epsilon)) / epsilon, 1.0/n);\n\t\t\tdouble beta0 = (t * t - 1) / (2 * t);\n\n\t\t\tdouble cos = Math.Cos(w);\n\t\t\tdouble sin = Math.Sqrt(1 - cos * cos);//Math.Sin(w);\n\t\t\tdouble a0, a1, a2, b0, b1, b2;\n\n\t\t\tint len = n/2;\n\t\t\tint k;\n\n\t\t\tParameter[] parameters;\n\t\t\tif(n % 2 == 0)\n\t\t\t{\n\t\t\t\tparameters = new Parameter[len];\n\t\t\t\tk = 1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tparameters = new Parameter[len + 1];\n\t\t\t\tk = 2;\n\n\t\t\t\ta0 = 1; a1 = beta0;\n\t\t\t\tb0 = 1; b1 = 0;\n\t\t\t\t/* テスト用(Butterworth 特性)\n\t\t\t\ta0 = 1; a1 = 1;\n\t\t\t\tb0 = 1; b1 = 0;\n\t\t\t\t//*/\n\n\t\t\t\tif(type)\n\t\t\t\t{\n\t\t\t\t\tBilinearTransformHPF(ref a0, ref a1, sin, cos);\n\t\t\t\t\tBilinearTransformHPF(ref b0, ref b1, sin, cos);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tBilinearTransform(ref a0, ref a1, sin, cos);\n\t\t\t\t\tBilinearTransform(ref b0, ref b1, sin, cos);\n\t\t\t\t}\n\n\t\t\t\tparameters[len].c = b0 / a0;\n\t\t\t\tparameters[len].a1 = -a1 / a0;\n\t\t\t\tparameters[len].a2 = 0;\n\t\t\t\tparameters[len].b1 = b1 / b0;\n\t\t\t\tparameters[len].b2 = 0;\n\t\t\t}\n\n\t\t\tfor(int i=0; i<len; ++i, k += 2)\n\t\t\t{\n\t\t\t\tdouble wk = (double)k / n * Math.PI / 2;\n\n\t\t\t\tdouble alpha = 2 * beta0 * Math.Cos(wk);\n\t\t\t\tdouble beta = Math.Sin(wk);\n\t\t\t\tbeta *= beta;\n\t\t\t\tdouble gamma = beta;\n\t\t\t\tbeta += beta0 * beta0;\n\n\t\t\t\ta0 = 1; a1 = alpha; a2 = beta;\n\t\t\t\tb0 = 1; b1 = 0; b2 = gamma;\n\t\t\t\t/* テスト用(Butterworth 特性)\n\t\t\t\tdouble alpha = 2 * Math.Cos(wk);\n\t\t\t\ta0 = 1; a1 = alpha; a2 = 1;\n\t\t\t\tb0 = 1; b1 = 0; b2 = 0;\n\t\t\t\t//*/\n\n\t\t\t\tif(type)\n\t\t\t\t{\n\t\t\t\t\tBilinearTransformHPF(ref a0, ref a1, ref a2, sin, cos);\n\t\t\t\t\tBilinearTransformHPF(ref b0, ref b1, ref b2, sin, cos);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tBilinearTransform(ref a0, ref a1, ref a2, sin, cos);\n\t\t\t\t\tBilinearTransform(ref b0, ref b1, ref b2, sin, cos);\n\t\t\t\t}\n\n\t\t\t\tparameters[i].c = b0 / a0;\n\t\t\t\tparameters[i].a1 = -a1 / a0;\n\t\t\t\tparameters[i].a2 = -a2 / a0;\n\t\t\t\tparameters[i].b1 = b1 / b0;\n\t\t\t\tparameters[i].b2 = b2 / b0;\n\t\t\t}\n\n\t\t\treturn parameters;\n\t\t}\n\n\t\t#endregion\n#endif\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Equalizer/Type.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.Mathematics;\n\nnamespace SoundLibrary.Filter.Equalizer\n{\n\t/// <summary>\n\t/// 根(零点または極)。\n\t/// </summary>\n\t/// <remarks>\n\t/// 信号処理の分野では、フィルタの零/極が共役複素数の場合でも実数係数フィルタで実現できるように、\n\t/// フィルタを2次ずつに区切って実現することが多いので、解を2個ずつペアにして表現。\n\t/// \t根のタイプ …\n\t/// \t\t単根、実根×2(重根含む)、共役複素数根、なし(定数項のみ)。\n\t/// \ta, b …\n\t/// \t\t単根の場合、a に値を。b は無視。\n\t/// \t\t実根の場合、a, b にそれぞれの根の値を。\n\t/// \t\t共役複素根、a に実部、b に虚部。\n\t/// </remarks>\n\tpublic class Root : ICloneable\n\t{\n\t\t#region インナークラス\n\n\t\t/// <summary>\n\t\t/// 根のタイプ\n\t\t/// </summary>\n\t\tpublic enum Type\n\t\t{\n\t\t\tNone,    // 根なし(定数項のみ)\n\t\t\tReal,    // 実数根×2\n\t\t\tSingle,  // 実数根×1\n\t\t\tComplex, // 共役複素数根\n\t\t}\n\n\t\t#endregion\n\t\t#region public フィールド\n\n\t\tpublic Type type;\n\t\tpublic double a;\n\t\tpublic double b;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Root() : this(Type.Complex, 0, 0) {}\n\n\t\tpublic Root(Type type, double a, double b)\n\t\t{\n\t\t\tthis.type = type;\n\t\t\tthis.a = a;\n\t\t\tthis.b = b;\n\t\t}\n\n\t\t#endregion\n\t\t#region 解の取り出し\n\n\t\t/// <summary>\n\t\t/// ちゃんとした複素数にして解の値を返す。\n\t\t/// </summary>\n\t\t/// <param name=\"x1\">解1</param>\n\t\t/// <param name=\"x2\">解2(実数根×1の場合には0に)</param>\n\t\t/// <returns>解の数(0 ～ 2)</returns>\n\t\tpublic int GetRoots(out Complex x1, out Complex x2)\n\t\t{\n\t\t\tswitch(this.type)\n\t\t\t{\n\t\t\t\tcase Type.None:\n\t\t\t\t\tx1 = 0;\n\t\t\t\t\tx2 = 0;\n\t\t\t\t\treturn 0;\n\t\t\t\tcase Type.Real:\n\t\t\t\t\tx1 = this.a;\n\t\t\t\t\tx2 = this.b;\n\t\t\t\t\treturn 2;\n\t\t\t\tcase Type.Single:\n\t\t\t\t\tx1 = this.a;\n\t\t\t\t\tx2 = 0;\n\t\t\t\t\treturn 1;\n\t\t\t\tdefault:\n\t\t\t\t\tx1 = new Complex(this.a, this.b);\n\t\t\t\t\tx2 = new Complex(this.a, -this.b);\n\t\t\t\t\treturn 2;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable メンバ\n\n\t\tpublic Root Clone()\n\t\t{\n\t\t\treturn new Root(this.type, this.a, this.b);\n\t\t}\n\n\t\tobject ICloneable.Clone()\n\t\t{\n\t\t\treturn this.Clone();\n\t\t}\n\n\t\t#endregion\n\t}\n\n\t/// <summary>\n\t/// 零点と極のペア。\n\t/// </summary>\n\t/// <remarks>\n\t/// IIR フィルタを想定。\n\t/// 2次のIIRフィルタ→零点と極が1ペアずつ。\n\t/// </remarks>\n\tpublic class ZeroPole : ICloneable\n\t{\n\t\t#region public フィールド\n\n\t\tpublic Root zero;\n\t\tpublic Root pole;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic ZeroPole() : this(new Root(), new Root()) {}\n\n\t\tpublic ZeroPole(Root zero, Root pole)\n\t\t{\n\t\t\tthis.zero = zero;\n\t\t\tthis.pole = pole;\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable メンバ\n\n\t\tpublic ZeroPole Clone()\n\t\t{\n\t\t\treturn new ZeroPole(this.zero, this.pole);\n\t\t}\n\n\t\tobject ICloneable.Clone()\n\t\t{\n\t\t\treturn this.Clone();\n\t\t}\n\n\t\t#endregion\n\t}\n\n\t/// <summary>\n\t/// フィルタ係数。\n\t/// アナログプロトタイプ/ディジタル兼用。\n\t/// </summary>\n\t/// <remarks>\n\t/// アナログ  : ∑b[i]s^i  / ∑a[i]s^i\n\t/// ディジタル: ∑b[i]z^-i / ∑a[i]z^-i\n\t/// 双一次変換では分母/分子の次数が変わらないことを利用して、\n\t/// アナログ・ディジタルで係数クラスを使いまわす。\n\t/// </remarks>\n\tpublic class Coefficient : ICloneable\n\t{\n\t\t#region public フィールド\n\n\t\tpublic double[] a = new double[3];\n\t\tpublic double[] b = new double[3];\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Coefficient() : this(1, 0, 0, 1, 0, 0) {}\n\n\t\tpublic Coefficient(double a0, double a1, double a2, double b0, double b1, double b2)\n\t\t{\n\t\t\tthis.a[0] = a0;\n\t\t\tthis.a[1] = a1;\n\t\t\tthis.a[2] = a2;\n\t\t\tthis.b[0] = b0;\n\t\t\tthis.b[1] = b1;\n\t\t\tthis.b[2] = b2;\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable メンバ\n\n\t\tpublic Coefficient Clone()\n\t\t{\n\t\t\treturn new Coefficient(\n\t\t\t\tthis.a[0], this.a[1], this.a[2],\n\t\t\t\tthis.b[0], this.b[1], this.b[2]);\n\t\t}\n\n\t\tobject ICloneable.Clone()\n\t\t{\n\t\t\treturn this.Clone();\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Filter.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// 音声処理用フィルタインターフェース。\n\t/// </summary>\n\tpublic interface IFilter : ICloneable\n\t{\n\t\t/// <summary>\n\t\t/// フィルタリングを行い、その結果を返す。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力。</returns>\n\t\tdouble GetValue(double x);\n\n\t\t/// <summary>\n\t\t/// フィルタの内部状態をクリアする。\n\t\t/// </summary>\n\t\tvoid Clear();\n\t}\n}//namespace Filter\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Fir.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// 係数配列のプロキシ。\n\t/// </summary>\n\tpublic interface IFirCoefficient : System.Collections.IEnumerable\n\t{\n\t\t/// <summary>\n\t\t/// 係数の数を取得。\n\t\t/// </summary>\n\t\tint Count{get;}\n\n\t\t/// <summary>\n\t\t/// i 番目の係数を取得。\n\t\t/// </summary>\n\t\tdouble this[int i]{get; set;}\n\t}\n\n\t/// <summary>\n\t/// FIR フィルタインターフェース。\n\t/// </summary>\n\tpublic interface IFirFilter : IFilter\n\t{\n\t\t/// <summary>\n\t\t/// 係数配列を取得。\n\t\t/// </summary>\n\t\tIFirCoefficient Coefficient{get; set;}\n\t}\n\n\t/// <summary>\n\t/// FIR フィルタクラス。\n\t/// </summary>\n\tpublic class FirFilter : IFirFilter\n\t{\n\t\tprotected double[] coef; // 係数配列\n\t\tprotected CircularBuffer buff; // 遅延バッファ\n\n\t\t/// <summary>\n\t\t/// デフォルトコンストラクタ\n\t\t/// </summary>\n\t\tpublic FirFilter() : this(null){}\n\n\t\t/// <summary>\n\t\t/// タップ数を指定して FIR を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"taps\">タップ数</param>\n\t\tpublic FirFilter(int taps) : this(new double[taps]){}\n\n\t\t/// <summary>\n\t\t/// 係数を指定して FIR を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"coef\">係数を格納した配列。</param>\n\t\tpublic FirFilter(double[] coef)\n\t\t{\n\t\t\tthis.Coefficient = coef;\n\n\t\t\tthis.Clear();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// N: フィルタ次数 (= this.coef.Length - 1)\n\t\t/// x: 入力\n\t\t/// y: 出力\n\t\t/// c[i]: 係数配列\n\t\t/// d[i]: i+1 サンプル前の x の値\n\t\t/// とすると、\n\t\t/// y = x*c[N] + Σ_{i=0}^{N-1} d[i]*c[N-1-i]\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tthis.buff.PushFront(x);\n\t\t\tint N = this.coef.Length;\n\t\t\tdouble y = 0;\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\ty += this.buff[i] * this.coef[i];\n\t\t\t}\n\t\t\treturn y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tfor(int i=0; i<this.buff.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.buff[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t#region IFirFilter メンバ\n\n\t\tpublic class CoefficientProxy : IFirCoefficient\n\t\t{\n\t\t\tinternal double[] x;\n\n\t\t\tpublic CoefficientProxy(double[] x){this.x = x;}\n\t\t\tpublic static implicit operator CoefficientProxy(double[] x){return new CoefficientProxy(x);}\n\n\t\t\t#region IFirCoefficient メンバ\n\n\t\t\tpublic int Count\n\t\t\t{\n\t\t\t\tget{return this.x.Length;}\n\t\t\t}\n\n\t\t\tpublic double this[int i]\n\t\t\t{\n\t\t\t\tget\n\t\t\t\t{\n\t\t\t\t\treturn this.x[i];\n\t\t\t\t}\n\t\t\t\tset\n\t\t\t\t{\n\t\t\t\t\tthis.x[i] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t#endregion\n\t\t\t#region IEnumerable メンバ\n\n\t\t\tinternal class Enumerator : System.Collections.IEnumerator\n\t\t\t{\n\t\t\t\tIFirCoefficient x;\n\t\t\t\tint current;\n\n\t\t\t\tpublic Enumerator(IFirCoefficient x){this.x = x; this.current = -1;}\n\n\t\t\t\t#region IEnumerator メンバ\n\n\t\t\t\tpublic void Reset(){this.current = -1;}\n\n\t\t\t\tpublic object Current{get{return this.x[this.current];}}\n\n\t\t\t\tpublic bool MoveNext()\n\t\t\t\t{\n\t\t\t\t\t++this.current;\n\t\t\t\t\treturn this.current < this.x.Count;\n\t\t\t\t}\n\n\t\t\t\t#endregion\n\t\t\t}\n\n\t\t\tpublic System.Collections.IEnumerator GetEnumerator()\n\t\t\t{\n\t\t\t\treturn new Enumerator(this);\n\t\t\t}\n\n\t\t\t#endregion\n\t\t}\n\n\t\tIFirCoefficient IFirFilter.Coefficient\n\t\t{\n\t\t\tset{this.Coefficient = ((CoefficientProxy)value).x;}\n\t\t\tget{return new CoefficientProxy(this.Coefficient);}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 係数の取得/設定\n\t\t/// </summary>\n\t\tpublic double[] Coefficient\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.coef = value;\n\t\t\t\tif(value == null)\n\t\t\t\t\tthis.buff = null;\n\t\t\t\telse if(this.buff == null)\n\t\t\t\t\tthis.buff = new CircularBuffer(this.coef.Length);\n\t\t\t\telse if(this.buff.Length < this.coef.Length)\n\t\t\t\t\tthis.buff.Resize(this.coef.Length);\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.coef;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new FirFilter((double[])this.coef.Clone());\n\t\t}\n\t}//class FirFilter\n\n\t/// <summary>\n\t/// 線形位相 FIR フィルタクラス。\n\t/// 係数が実対象であることを利用して計算量/メモリ量削減。\n\t/// 奇数タップバージョン\n\t/// (タップ数 2n - 1 で、coef[n-1-i] == coef[n-1+i] foreach i)\n\t/// </summary>\n\tpublic class OddLinearFir : IFirFilter\n\t{\n\t\tprotected double[] coef;\n\t\tprotected CircularBuffer buff;\n\n\t\t/// <summary>\n\t\t/// デフォルトコンストラクタ\n\t\t/// </summary>\n\t\tpublic OddLinearFir() : this(null){}\n\n\t\t/// <summary>\n\t\t/// タップ数を指定して FIR を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数 ＝ 2n - 1</param>\n\t\tpublic OddLinearFir(int n) : this(new double[n]){}\n\n\t\t/// <summary>\n\t\t/// 係数を指定して FIR を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"coef\">係数を格納した配列。</param>\n\t\tpublic OddLinearFir(double[] coef)\n\t\t{\n\t\t\tthis.Coefficient = coef;\n\n\t\t\tthis.Clear();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// n: タップ数が 2n + 1 (n = this.coef.Length - 1)\n\t\t/// x: 入力\n\t\t/// y: 出力\n\t\t/// c[i]: 係数配列\n\t\t/// d[i]: i+1 サンプル前の x の値\n\t\t/// とすると、\n\t\t/// y = d[n]*c[n] + Σ_{i=1}^{n} (d[n+i] + d[n-i])*c[i]\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tthis.buff.PushFront(x);\n\n\t\t\tint n = this.coef.Length - 1;\n\t\t\tdouble y = this.coef[n] * this.buff[n];\n\t\t\tfor(int i=0; i<n; ++i)\n\t\t\t{\n\t\t\t\ty += this.coef[i] * (this.buff[i] + this.buff[2*n-i]);\n\t\t\t}\n\t\t\treturn y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tfor(int i=0; i<this.buff.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.buff[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t#region IFirFilter メンバ\n\n\t\tpublic class CoefficientProxy : IFirCoefficient\n\t\t{\n\t\t\tinternal double[] x;\n\n\t\t\tpublic CoefficientProxy(double[] x){this.x = x;}\n\t\t\tpublic static implicit operator CoefficientProxy(double[] x){return new CoefficientProxy(x);}\n\n\t\t\t#region IFirCoefficient メンバ\n\n\t\t\tpublic int Count\n\t\t\t{\n\t\t\t\tget{return 2 * this.x.Length - 1;}\n\t\t\t}\n\n\t\t\tpublic double this[int i]\n\t\t\t{\n\t\t\t\tget\n\t\t\t\t{\n\t\t\t\t\tif(i < this.x.Length)\n\t\t\t\t\t\treturn this.x[i];\n\t\t\t\t\telse\n\t\t\t\t\t\treturn this.x[2 * (this.x.Length - 1) - i];\n\t\t\t\t}\n\t\t\t\tset\n\t\t\t\t{\n\t\t\t\t\tif(i < this.x.Length)\n\t\t\t\t\t\tthis.x[i] = value;\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.x[2 * (this.x.Length - 1) - i] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t#endregion\n\t\t\t#region IEnumerable メンバ\n\n\t\t\tpublic System.Collections.IEnumerator GetEnumerator()\n\t\t\t{\n\t\t\t\treturn new FirFilter.CoefficientProxy.Enumerator(this);\n\t\t\t}\n\n\t\t\t#endregion\n\t\t}\n\n\t\tIFirCoefficient IFirFilter.Coefficient\n\t\t{\n\t\t\tset{this.Coefficient = ((CoefficientProxy)value).x;}\n\t\t\tget{return new CoefficientProxy(this.Coefficient);}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 係数の取得/設定\n\t\t/// </summary>\n\t\tpublic double[] Coefficient\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.coef = value;\n\t\t\t\tif(value == null)\n\t\t\t\t\tthis.buff = null;\n\t\t\t\telse if(this.buff == null)\n\t\t\t\t\tthis.buff = new CircularBuffer(2 * this.coef.Length - 1);\n\t\t\t\telse if(this.buff.Length < 2 * this.coef.Length - 1)\n\t\t\t\t\tthis.buff.Resize(2 * this.coef.Length - 1);\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.coef;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new OddLinearFir((double[])this.coef.Clone());\n\t\t}\n\t}//class OddLinearFir\n\n\t/// <summary>\n\t/// 線形位相 FIR フィルタクラス。\n\t/// 係数が実対象であることを利用して計算量/メモリ量削減。\n\t/// 偶数タップバージョン\n\t/// (タップ数 2n で、coef[n-1-i] == coef[n+i] foreach i)\n\t/// </summary>\n\tpublic class EvenLinearFir : IFirFilter\n\t{\n\t\tprotected double[] coef;\n\t\tprotected CircularBuffer buff;\n\n\t\t/// <summary>\n\t\t/// デフォルトコンストラクタ\n\t\t/// </summary>\n\t\tpublic EvenLinearFir() : this(null){}\n\n\t\t/// <summary>\n\t\t/// タップ数を指定して FIR を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数 ＝ 2n - 1</param>\n\t\tpublic EvenLinearFir(int n) : this(new double[n]){}\n\n\t\t/// <summary>\n\t\t/// 係数を指定して FIR を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"coef\">係数を格納した配列。</param>\n\t\tpublic EvenLinearFir(double[] coef)\n\t\t{\n\t\t\tthis.Coefficient = coef;\n\n\t\t\tthis.Clear();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// n: タップ数が 2n (n = this.coef.Length)\n\t\t/// x: 入力\n\t\t/// y: 出力\n\t\t/// c[i]: 係数配列\n\t\t/// d[i]: i+1 サンプル前の x の値\n\t\t/// とすると、\n\t\t/// y = Σ_{i=1}^{n} (d[n+i] + d[n-1-i])*c[i]\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tthis.buff.PushFront(x);\n\n\t\t\tint n = this.coef.Length;\n\t\t\tdouble y = 0;\n\t\t\tfor(int i=0; i<n; ++i)\n\t\t\t{\n\t\t\t\ty += this.coef[i] * (this.buff[i] + this.buff[2*n-1-i]);\n\t\t\t}\n\t\t\treturn y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tfor(int i=0; i<this.buff.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.buff[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t#region IFirFilter メンバ\n\n\t\tpublic class CoefficientProxy : IFirCoefficient\n\t\t{\n\t\t\tinternal double[] x;\n\n\t\t\tpublic CoefficientProxy(double[] x){this.x = x;}\n\t\t\tpublic static implicit operator CoefficientProxy(double[] x){return new CoefficientProxy(x);}\n\n\t\t\t#region IFirCoefficient メンバ\n\n\t\t\tpublic int Count\n\t\t\t{\n\t\t\t\tget{return 2 * this.x.Length;}\n\t\t\t}\n\n\t\t\tpublic double this[int i]\n\t\t\t{\n\t\t\t\tget\n\t\t\t\t{\n\t\t\t\t\tif(i < this.x.Length)\n\t\t\t\t\t\treturn this.x[i];\n\t\t\t\t\telse\n\t\t\t\t\t\treturn this.x[2 * this.x.Length - 1 - i];\n\t\t\t\t}\n\t\t\t\tset\n\t\t\t\t{\n\t\t\t\t\tif(i < this.x.Length)\n\t\t\t\t\t\tthis.x[i] = value;\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.x[2 * this.x.Length - 1 - i] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t#endregion\n\t\t\t#region IEnumerable メンバ\n\n\t\t\tpublic System.Collections.IEnumerator GetEnumerator()\n\t\t\t{\n\t\t\t\treturn new FirFilter.CoefficientProxy.Enumerator(this);\n\t\t\t}\n\n\t\t\t#endregion\n\t\t}\n\n\t\tIFirCoefficient IFirFilter.Coefficient\n\t\t{\n\t\t\tset{this.Coefficient = ((CoefficientProxy)value).x;}\n\t\t\tget{return new CoefficientProxy(this.Coefficient);}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 係数の取得/設定\n\t\t/// </summary>\n\t\tpublic double[] Coefficient\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.coef = value;\n\t\t\t\tif(value == null)\n\t\t\t\t\tthis.buff = null;\n\t\t\t\telse if(this.buff == null)\n\t\t\t\t\tthis.buff = new CircularBuffer(2 * this.coef.Length);\n\t\t\t\telse if(this.buff.Length < 2 * this.coef.Length)\n\t\t\t\t\tthis.buff.Resize(2 * this.coef.Length);\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.coef;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new EvenLinearFir((double[])this.coef.Clone());\n\t\t}\n\t}//class EvenLinearFir\n\n}//namespace Filter\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/FractionalCombFilter.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// 分数遅延コムフィルタ。\n\t/// </summary>\n\t[Obsolete(\"SoundLibrary.Filter.Misc.CombFilter を使ってください。\")]\n\tpublic class FractionalCombFilter : IFilter\n\t{\n\t\tdouble direct;\n\t\tdouble effect;\n\t\tdouble feedback;\n\t\tDelay.FractionalDelay delay;\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"direct\">ダイレクトゲイン</param>\n\t\t/// <param name=\"effect\">エフェクトゲイン</param>\n\t\t/// <param name=\"feedback\">フィードバックゲイン</param>\n\t\t/// <param name=\"buffer\">バッファサイズ</param>\n\t\tpublic FractionalCombFilter(double direct, double effect, double feedback, double buffer)\n\t\t{\n\t\t\t--buffer;\n\t\t\tif(buffer < 0) buffer = 0;\n\n\t\t\tthis.direct = direct;\n\t\t\tthis.effect = effect;\n\t\t\tthis.feedback = feedback;\n\t\t\tthis.delay = new Delay.FractionalDelay(buffer);\n\t\t\tthis.Clear();\n\t\t}\n\n\t\tpublic FractionalCombFilter(double direct, double effect, double feedback, double buffer, int firLength)\n\t\t{\n\t\t\t--buffer;\n\t\t\tif(buffer < 0) buffer = 0;\n\n\t\t\tthis.direct = direct;\n\t\t\tthis.effect = effect;\n\t\t\tthis.feedback = feedback;\n\t\t\tthis.delay = new Delay.FractionalDelay(buffer, firLength);\n\t\t\tthis.Clear();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パラメータを設定する。\n\t\t/// </summary>\n\t\t/// <param name=\"direct\">ダイレクトゲイン</param>\n\t\t/// <param name=\"effect\">エフェクトゲイン</param>\n\t\t/// <param name=\"feedback\">フィードバックゲイン</param>\n\t\t/// <param name=\"buffer\">遅延時間</param>\n\t\tpublic void SetParameter(double direct, double effect, double feedback, double buffer)\n\t\t{\n\t\t\tthis.DirectGain   = direct;\n\t\t\tthis.EffectGain   = effect;\n\t\t\tthis.FeedbackGain = feedback;\n\t\t\tthis.DelayBuffer  = buffer;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ダイレクトゲイン\n\t\t/// </summary>\n\t\tpublic double DirectGain\n\t\t{\n\t\t\tget{return this.direct;}\n\t\t\tset{this.direct = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// エフェクトゲイン\n\t\t/// </summary>\n\t\tpublic double EffectGain\n\t\t{\n\t\t\tget{return this.effect;}\n\t\t\tset{this.effect = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィードバックゲイン\n\t\t/// </summary>\n\t\tpublic double FeedbackGain\n\t\t{\n\t\t\tget{return this.feedback;}\n\t\t\tset{this.feedback = value;}\n\t\t}\n\n\n\t\t/// <summary>\n\t\t/// バッファサイズ\n\t\t/// </summary>\n\t\tpublic double DelayBuffer\n\t\t{\n\t\t\tget{return this.delay.DelayTime + 1;}\n\t\t\tset\n\t\t\t{\n\t\t\t\t--value;\n\t\t\t\tif(value < 0) value = 0;\n\t\t\t\tthis.delay.DelayTime = value;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tdouble t = this.delay.GetValue();\n\t\t\tdouble y = x * this.direct + t * this.effect;\n\t\t\tthis.delay.Push(x + t * this.feedback);\n\t\t\treturn y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tthis.delay.Clear();\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new FractionalCombFilter(this.direct, this.effect, this.feedback, this.DelayBuffer);\n\t\t}\n\t}//class FractionalCombFilter\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Iir.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// IIR フィルタクラス。\n\t/// </summary>\n\tpublic class IirFilter : IFilter\n\t{\n\t\tdouble[] a; // 分母係数配列\n\t\tdouble[] b; // 分子係数配列\n\t\tCircularBuffer buff; // 遅延バッファ\n\n\t\t/// <summary>\n\t\t/// デフォルトコンストラクタ。\n\t\t/// </summary>\n\t\tpublic IirFilter() : this(null, null) {}\n\n\t\t/// <summary>\n\t\t/// 次数を指定して IIR を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"order\">IIR の次数</param>\n\t\tpublic IirFilter(int order) : this(new double[order], new double[order + 1]) {}\n\n\t\t/// <summary>\n\t\t/// 係数を指定して IIR を作る。\n\t\t/// 作りたい IIR の伝達関数が、\n\t\t///      Σ_0^N B_i z^i\n\t\t/// Y = ---------------- X\n\t\t///      Σ_0^N A_i z^i\n\t\t/// であるとき、\n\t\t/// a[i] = - A_(i+1) / A_0    (i = 1～N)\n\t\t/// b[i] = B_i / A_0        (i = 0～N)\n\t\t/// </summary>\n\t\t/// <param name=\"a\">分母係数配列</param>\n\t\t/// <param name=\"b\">分子係数配列</param>\n\t\tpublic IirFilter(double[] a, double[] b)\n\t\t{\n\t\t\tthis.SetCoefficient(a, b);\n\n\t\t\tthis.Clear();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// N: フィルタ次数 (= this.a.Length = this.b.Length - 1)\n\t\t/// x: 入力\n\t\t/// t: 中間データ\n\t\t/// y: 出力\n\t\t/// a[i]: 分母係数配列\n\t\t/// b[i]: 分子係数配列\n\t\t/// d[i]: i+1 サンプル前の t の値\n\t\t/// とすると、\n\t\t/// t = x + Σ_{i=0}^{N-1} a[i]d[i]\n\t\t/// y = t * b[0] + Σ_{i=0}^{N} b[i+1]d[i]\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tint N = this.a.Length;\n\t\t\tdouble t = x;\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\tt += this.buff[i] * this.a[i];\n\t\t\t}\n\t\t\tdouble y = t * this.b[0];\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\ty += this.buff[i] * this.b[i+1];\n\t\t\t}\n\t\t\tthis.buff.PushFront(t);\n\t\t\treturn y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tfor(int i=0; i<this.buff.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.buff[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 係数の設定\n\t\t/// </summary>\n\t\t/// <param name=\"a\">分母係数配列</param>\n\t\t/// <param name=\"b\">分子係数配列</param>\n\t\tpublic void SetCoefficient(double[] a, double[]b)\n\t\t{\n\t\t\tif(a == null || b == null ||\n\t\t\t\ta.Length + 1 != b.Length)\n\t\t\t{\n\t\t\t\tthis.buff = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(this.buff == null)\n\t\t\t\tthis.buff = new CircularBuffer(a.Length);\n\t\t\telse if(this.buff.Length < a.Length)\n\t\t\t\tthis.buff.Resize(a.Length);\n\n\t\t\tthis.a = a;\n\t\t\tthis.b = b;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 分母係数配列の取得\n\t\t/// </summary>\n\t\tpublic double[] A\n\t\t{\n\t\t\tget{return this.a;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 分母係数配列の取得\n\t\t/// </summary>\n\t\tpublic double[] B\n\t\t{\n\t\t\tget{return this.b;}\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new IirFilter(this.a, this.b);\n\t\t}\n\t}//class IirFilter\n}//namespace Filter\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Misc/AllPassFilter.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter.Misc\n{\n\tusing IDelay = SoundLibrary.Filter.Delay.IDelay;\n\tusing Delay = SoundLibrary.Filter.Delay.Delay;\n\tusing FractionalDelay = SoundLibrary.Filter.Delay.FractionalDelay;\n\n\t/// <summary>\n\t\t/// オールパスフィルタ。\n\t\t/// </summary>\n\tpublic class AllPassFilter : IFilter\n\t{\n\t\tdouble feedback;\n\t\tIDelay delay;\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"direct\">ダイレクトゲイン</param>\n\t\t/// <param name=\"effect\">エフェクトゲイン</param>\n\t\t/// <param name=\"feedback\">フィードバックゲイン</param>\n\t\t/// <param name=\"delay\">ディレイタイム</param>\n\t\tpublic AllPassFilter(double feedback, double delay)\n\t\t{\n\t\t\t--delay;\n\t\t\tif(delay < 0) delay = 0;\n\n\t\t\tthis.feedback = feedback;\n\t\t\tthis.delay = new FractionalDelay(delay);\n\t\t\tthis.Clear();\n\t\t}\n\n\t\tpublic AllPassFilter(double feedback, double delay, int firLength)\n\t\t{\n\t\t\t--delay;\n\t\t\tif(delay < 0) delay = 0;\n\n\t\t\tthis.feedback = feedback;\n\t\t\tthis.delay = new FractionalDelay(delay, firLength);\n\t\t\tthis.Clear();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パラメータを設定する。\n\t\t/// </summary>\n\t\t/// <param name=\"feedback\">フィードバックゲイン</param>\n\t\t/// <param name=\"delay\">遅延時間</param>\n\t\tpublic void SetParameter(double feedback, double delay)\n\t\t{\n\t\t\tthis.FeedbackGain = feedback;\n\t\t\tthis.DelayTime    = delay;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィードバックゲイン\n\t\t/// </summary>\n\t\tpublic double FeedbackGain\n\t\t{\n\t\t\tget{return this.feedback;}\n\t\t\tset{this.feedback = value;}\n\t\t}\n\n\n\t\t/// <summary>\n\t\t/// ディレイタイム\n\t\t/// </summary>\n\t\tpublic double DelayTime\n\t\t{\n\t\t\tget{return this.delay.DelayTime + 1;}\n\t\t\tset\n\t\t\t{\n\t\t\t\t--value;\n\t\t\t\tif(value < 0) value = 0;\n\t\t\t\tthis.delay.DelayTime = value;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tdouble t = this.delay.GetValue();\n\t\t\tdouble y = x + t * this.feedback;\n\t\t\tthis.delay.Push(y);\n\t\t\t\t\n\t\t\treturn y * -this.feedback + t;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tthis.delay.Clear();\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new AllPassFilter(this.feedback, this.DelayTime);\n\t\t}\n\n\t\tpublic double GetBufferValue(int n)\n\t\t{\n\t\t\treturn this.delay.GetBufferValue(n);\n\t\t}\n\t}//class AllPassFilter\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Misc/Amplifier.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter.Misc\n{\n\t/// <summary>\n\t/// 増幅器\n\t/// </summary>\n\tpublic class Amplifier : IFilter\n\t{\n\t\tdouble gain;\n\n\t\tpublic Amplifier(double gain)\n\t\t{\n\t\t\tthis.gain = gain;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\treturn this.gain * x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new Amplifier(this.gain);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 増幅率\n\t\t/// </summary>\n\t\tpublic double Gain\n\t\t{\n\t\t\tget{return this.gain;}\n\t\t\tset{this.gain = value;}\n\t\t}\n\t}//class Amplifier\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Misc/CombFilter.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter.Misc\n{\n\tusing IDelay = SoundLibrary.Filter.Delay.IDelay;\n\tusing Delay = SoundLibrary.Filter.Delay.Delay;\n\tusing FractionalDelay = SoundLibrary.Filter.Delay.FractionalDelay;\n\n\t/// <summary>\n\t/// コムフィルタ。\n\t/// </summary>\n\tpublic class CombFilter : IFilter\n\t{\n\t\tdouble direct;\n\t\tdouble effect;\n\t\tdouble feedback;\n\t\tIDelay delay;\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"direct\">ダイレクトゲイン</param>\n\t\t/// <param name=\"effect\">エフェクトゲイン</param>\n\t\t/// <param name=\"feedback\">フィードバックゲイン</param>\n\t\t/// <param name=\"delay\">ディレイタイム</param>\n\t\tpublic CombFilter(double direct, double effect, double feedback, double delayTime)\n\t\t\t: this(direct, effect, feedback, delayTime, new FractionalDelay(delayTime))\n\t\t{\n\t\t}\n\n\t\tpublic CombFilter(double direct, double effect, double feedback, double delayTime, IDelay delay)\n\t\t{\n\t\t\tthis.direct = direct;\n\t\t\tthis.effect = effect;\n\t\t\tthis.feedback = feedback;\n\t\t\tthis.delay = delay;\n\t\t\tthis.DelayTime = delayTime;\n\t\t\tthis.Clear();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パラメータを設定する。\n\t\t/// </summary>\n\t\t/// <param name=\"direct\">ダイレクトゲイン</param>\n\t\t/// <param name=\"effect\">エフェクトゲイン</param>\n\t\t/// <param name=\"feedback\">フィードバックゲイン</param>\n\t\t/// <param name=\"delay\">遅延時間</param>\n\t\tpublic void SetParameter(double direct, double effect, double feedback, double delay)\n\t\t{\n\t\t\tthis.DirectGain   = direct;\n\t\t\tthis.EffectGain   = effect;\n\t\t\tthis.FeedbackGain = feedback;\n\t\t\tthis.DelayTime    = delay;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ダイレクトゲイン\n\t\t/// </summary>\n\t\tpublic double DirectGain\n\t\t{\n\t\t\tget{return this.direct;}\n\t\t\tset{this.direct = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// エフェクトゲイン\n\t\t/// </summary>\n\t\tpublic double EffectGain\n\t\t{\n\t\t\tget{return this.effect;}\n\t\t\tset{this.effect = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィードバックゲイン\n\t\t/// </summary>\n\t\tpublic double FeedbackGain\n\t\t{\n\t\t\tget{return this.feedback;}\n\t\t\tset{this.feedback = value;}\n\t\t}\n\n\n\t\t/// <summary>\n\t\t/// ディレイタイム\n\t\t/// </summary>\n\t\tpublic double DelayTime\n\t\t{\n\t\t\tget{return this.delay.DelayTime;}\n\t\t\tset\n\t\t\t{\n\t\t\t\tif(value < 0) value = 0;\n\t\t\t\tthis.delay.DelayTime = value;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tdouble t = this.delay.GetValue();\n\t\t\tdouble y = x * this.direct + t * this.effect;\n\t\t\tthis.delay.Push(x + t * this.feedback);\n\t\t\treturn y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tthis.delay.Clear();\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new CombFilter(this.direct, this.effect, this.feedback, this.DelayTime);\n\t\t}\n\n\t\tpublic double GetBufferValue(int n)\n\t\t{\n\t\t\treturn this.delay.GetBufferValue(n);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Misc/Equalizer.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// 2次IIRを用いたピーキングイコライザ。\n\t/// </summary>\n\tpublic class PeakingEqualizer : IirFilter\n\t{\n\t\t/// <summary>\n\t\t/// ピーキングイコライザを作成。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">中心周波数</param>\n\t\t/// <param name=\"q\">Q値</param>\n\t\t/// <param name=\"a\">増幅率(リニア値)</param>\n\t\tpublic PeakingEqualizer(double w, double q, double a) : base(2)\n\t\t{\n\t\t\tthis.SetParameter(w, q, a);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ピーキングイコライザのパラメータを設定。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">中心周波数</param>\n\t\t/// <param name=\"q\">Q値</param>\n\t\t/// <param name=\"a\">増幅率(リニア値)</param>\n\t\tpublic void SetParameter(double w, double q, double a)\n\t\t{\n#if false\n\t\t\tdouble x = Math.Sqrt(a);\n\t\t\tdouble c = Math.Cos(w);\n\t\t\tdouble s = Math.Sqrt(1 - c * c);// Math.Sin(w);\n\t\t\tdouble y = s / (2 * q);\n\n\t\t\tdouble a0 = 1 + y / x;\n\t\t\tdouble a1 = -2 * c;\n\t\t\tdouble a2 = 1 - y / x;\n\t\t\tdouble b0 = 1 + y * x;\n\t\t\tdouble b1 = -2 * c;\n\t\t\tdouble b2 = 1 - y * x;\n\n\t\t\tthis.A[0] = -a1 / a0;\n\t\t\tthis.A[1] = -a2 / a0;\n\t\t\tthis.B[0] = b0 / a0;\n\t\t\tthis.B[1] = b1 / a0;\n\t\t\tthis.B[2] = b2 / a0;\n#elif false\n\t\t\t// このコードは↓のコードと等価(誤差を除いて)のはず。\n\t\t\tdouble c = Math.Cos(w);\n\t\t\tdouble s = Math.Sqrt(1 - c * c);// Math.Sin(w);\n\t\t\tdouble y = s / (2 * q);\n\n\t\t\tdouble a0, a1, a2, b0, b1, b2;\n\n\t\t\tif(a > 1)\n\t\t\t{\n\t\t\t\ta0 = 1 + y;\n\t\t\t\ta1 = -2 * c;\n\t\t\t\ta2 = 1 - y;\n\t\t\t\tb0 = 1 + y * a;\n\t\t\t\tb1 = -2 * c;\n\t\t\t\tb2 = 1 - y * a;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ta0 = 1 + y / a;\n\t\t\t\ta1 = -2 * c;\n\t\t\t\ta2 = 1 - y / a;\n\t\t\t\tb0 = 1 + y;\n\t\t\t\tb1 = -2 * c;\n\t\t\t\tb2 = 1 - y;\n\t\t\t}\n\n\t\t\tthis.A[0] = -a1 / a0;\n\t\t\tthis.A[1] = -a2 / a0;\n\t\t\tthis.B[0] = b0 / a0;\n\t\t\tthis.B[1] = b1 / a0;\n\t\t\tthis.B[2] = b2 / a0;\n#else\n\t\t\tdouble g = a > 1 ? a : 1/a;\n\t\t\tdouble Ft = 1 / Math.Tan(w / 2);\n\n\t\t\tdouble term1 = 1.0 + Ft*g/q + Ft*Ft;\n\t\t\tdouble term2 = 1.0 + Ft/q + Ft*Ft;\n\n\t\t\t//Peekを作る\n\t\t\tif(a > 1)\n\t\t\t{\n\t\t\t\tthis.B[0] = term1 / term2;\n\t\t\t\tthis.B[1] = 2.0*(1.0 - Ft*Ft)/term2;\n\t\t\t\tthis.B[2] = (1.0 - Ft*g/q + Ft*Ft) / term2;\n\t\t\t\tthis.A[0] = - this.B[1];\n\t\t\t\tthis.A[1] = - (1.0 - Ft/q + Ft*Ft)/ term2;\n\t\t\t}\n\t\t\t\t//dipを作る\n\t\t\telse if(a < 1)\n\t\t\t{\n\t\t\t\tthis.B[0] = term2 / term1;\n\t\t\t\tthis.B[1] = 2.0*(1.0 - Ft*Ft)/term1;\n\t\t\t\tthis.B[2] = (1.0 - Ft / q + Ft*Ft) / term1;\n\t\t\t\tthis.A[0] = - this.B[1];\n\t\t\t\tthis.A[1] = - (1.0 - Ft*g/q + Ft*Ft)/ term1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.B[0] = 1.0;\n\t\t\t\tthis.B[1] = 0.0;\n\t\t\t\tthis.B[2] = 0.0;\n\t\t\t\tthis.A[0] = 0.0; \n\t\t\t\tthis.A[1] = 0.0;   \n\t\t\t}\n#endif\n\t\t}\n\t}//class PeakingEqualizer\n\n\n\t/// <summary>\n\t/// 1次IIRを用いたピーシェルビングイコライザ。\n\t/// </summary>\n\tpublic class ShelvingEqualizer : IirFilter\n\t{\n\t\t/// <summary>\n\t\t/// シェルビングイコライザ作成。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">中心周波数</param>\n\t\t/// <param name=\"a\">増幅率(リニア値)</param>\n\t\tpublic ShelvingEqualizer(double w, double a) : base(1)\n\t\t{\n\t\t\tthis.SetParameter(w, a);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// シェルビングイコライザのパラメータを設定。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">中心周波数</param>\n\t\t/// <param name=\"a\">増幅率(リニア値)</param>\n\t\tpublic void SetParameter(double w, double a)\n\t\t{\n\t\t\tdouble tn = (Math.Sin(w) - 1) / Math.Cos(w);\n\t\t\tdouble g = 1/a;//Math.Sqrt(a);\n\n\t\t\tdouble term1 = g*(1.0+tn) - (1.0-tn);\n\t\t\tdouble term2 = g*(1.0+tn) + (1.0-tn);\n\n\t\t\tif(g > 1)\n\t\t\t{\n\t\t\t\tthis.A[0]= term1/term2;\n\t\t\t\tthis.B[0]= 2.0/term2;\n\t\t\t\tthis.B[1]= tn;\n\t\t\t}\n\t\t\telse if(g < 1)\n\t\t\t{\n\t\t\t\tthis.A[0]= tn;\n\t\t\t\tthis.B[0]= term2/2.0;\n\t\t\t\tthis.B[1]= term1/term2; \n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.A[0]= 0.0;\n\t\t\t\tthis.B[0]= 1.0;\n\t\t\t\tthis.B[1]= 0.0;\n\t\t\t}\n\t\t}\n\t}//class ShelvingEqualizer\n}//namespace Filter\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Misc/MultiDelay.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter.Misc\n{\n\t/// <summary>\n\t/// マルチディレイ。\n\t/// </summary>\n\tpublic class MultiDelay : IFilter\n\t{\n\t\tpublic struct Tuple\n\t\t{\n\t\t\tpublic double gain;\n\t\t\tpublic int delay;\n\n\t\t\tpublic Tuple(double gain, int delay)\n\t\t\t{\n\t\t\t\tthis.gain = gain;\n\t\t\t\tthis.delay = delay;\n\t\t\t}\n\t\t}\n\t\tTuple[] filters;\n\t\tCircularBuffer buf;\n\n\t\tpublic MultiDelay(params Tuple[] filters)\n\t\t{\n\t\t\tthis.filters = filters;\n\n\t\t\tint maxDelay = int.MinValue;\n\t\t\tforeach(Tuple t in filters)\n\t\t\t\tif(t.delay > maxDelay) maxDelay = t.delay;\n\t\t\t++maxDelay;\n\n\t\t\tif(maxDelay > 0)\n\t\t\t\tthis.buf = new CircularBuffer(maxDelay);\n\n\t\t\tthis.Clear();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tthis.buf.PushBack(0);\n\n\t\t\tforeach(Tuple t in this.filters)\n\t\t\t\tthis.buf[t.delay] += x * t.gain;\n\t\t\treturn this.buf[0];\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tfor(int i=0; i<this.buf.Length; ++i)\n\t\t\t\tthis.buf[i] = 0;\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\treturn new MultiDelay((Tuple[])this.filters.Clone());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/Mixer.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// ミキサー。\n\t/// 並列接続＋ゲイン調整。\n\t/// </summary>\n\tpublic class Mixer : IFilter\n\t{\n\t\tpublic struct Tuple\n\t\t{\n\t\t\tpublic IFilter filter;\n\t\t\tpublic double gain;\n\n\t\t\tpublic Tuple(IFilter filter, double gain)\n\t\t\t{\n\t\t\t\tthis.filter = filter;\n\t\t\t\tthis.gain = gain;\n\t\t\t}\n\t\t}\n\t\tTuple[] filters;\n\n\t\tpublic Mixer(params Tuple[] filters)\n\t\t{\n\t\t\tthis.filters = filters;\n\n\t\t\tthis.Clear();\n\t\t}\n\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tdouble tmp = 0;\n\t\t\tforeach(Tuple t in this.filters)\n\t\t\t\ttmp += t.filter.GetValue(x) * t.gain;\n\t\t\treturn tmp;\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tforeach(Tuple t in this.filters)\n\t\t\t\tt.filter.Clear();\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\tTuple[] clone = new Tuple[this.filters.Length];\n\t\t\tfor(int i=0; i<clone.Length; ++i)\n\t\t\t{\n\t\t\t\tclone[i] = new Tuple(\n\t\t\t\t\t(IFilter)this.filters[i].filter.Clone(),\n\t\t\t\t\tthis.filters[i].gain);\n\t\t\t}\n\n\t\t\treturn new Mixer(clone);\n\t\t}\n\t}//class Mixer\n\n\t/// <summary>\n\t/// 遅延付きミキサー。\n\t/// 並列接続＋ゲイン＆遅延調整。\n\t/// </summary>\n\tpublic class DelayMixer : IFilter\n\t{\n\t\tpublic struct Tuple\n\t\t{\n\t\t\tpublic IFilter filter;\n\t\t\tpublic double gain;\n\t\t\tpublic int delay;\n\n\t\t\tpublic Tuple(IFilter filter, double gain, int delay)\n\t\t\t{\n\t\t\t\tthis.filter = filter;\n\t\t\t\tthis.gain = gain;\n\t\t\t\tthis.delay = delay;\n\t\t\t}\n\t\t}\n\t\tTuple[] filters;\n\t\tCircularBuffer buf;\n\n\t\tpublic DelayMixer(params Tuple[] filters)\n\t\t{\n\t\t\tthis.filters = filters;\n\n\t\t\tint maxDelay = int.MinValue;\n\t\t\tforeach(Tuple t in filters)\n\t\t\t\tif(t.delay > maxDelay) maxDelay = t.delay;\n\t\t\t++maxDelay;\n\n\t\t\tif(maxDelay > 0)\n\t\t\t\tthis.buf = new CircularBuffer(maxDelay);\n\n\t\t\tthis.Clear();\n\t\t}\n\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tthis.buf.PushBack(0);\n\n\t\t\tforeach(Tuple t in this.filters)\n\t\t\t\tthis.buf[t.delay] += t.filter.GetValue(x) * t.gain;\n\t\t\treturn this.buf[0];\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tforeach(Tuple t in this.filters)\n\t\t\t{\n\t\t\t\tthis.buf.PushFront(0);\n\t\t\t\tt.filter.Clear();\n\t\t\t}\n\t\t}\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\tTuple[] clone = new Tuple[this.filters.Length];\n\t\t\tfor(int i=0; i<clone.Length; ++i)\n\t\t\t{\n\t\t\t\tclone[i] = new Tuple(\n\t\t\t\t\t(IFilter)this.filters[i].filter.Clone(),\n\t\t\t\t\tthis.filters[i].gain,\n\t\t\t\t\tthis.filters[i].delay);\n\t\t\t}\n\n\t\t\treturn new DelayMixer(clone);\n\t\t}\n\t}//class DelayMixer\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Filter/readme.txt",
    "content": "//==============================================================================\n// tB^Cu\n\nCopyright(C) 2003 Iwanaga Nobuyuki\ne-mail   : iwanaga@ise.eng.osaka-u.ac.jp\nweb page : http://www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/\n\n//----------------------------------------------------------\n// Tv\n\ntB^CułB\n\ntB^͑S IFilter C^tF[X܂B\nEIFilter\n\t- double GetValue(double x);\n\t\ttB^OsǍʂԂB\n\t- void Clear();\n\t\ttB^̓ԂԂɖ߂B\n\n\n\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/FilterGenerator/BandPassFir.cs",
    "content": "﻿using System;\nusing System.Xml;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// Low Pass FIR を作成する。\n\t/// </summary>\n\tpublic class LowPassFirGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"低域透過フィルタ\";\n\t\tconst string CutoffName = \"カットオフ周波数\";\n\t\tconst string OrderName  = \"フィルタ次数\";\n\t\tconst string TypeName   = \"窓関数タイプ\";\n\n\t\tpublic LowPassFirGenerator()\n\t\t{\n\t\t\tthis.properties = new FilterProperty[3];\n\t\t\tthis.properties[0] = new FilterProperty(OrderName, 1);\n\t\t\tthis.properties[1] = new FilterProperty(CutoffName, (double)0);\n\t\t\tthis.properties[2] = new FilterProperty(TypeName, WindowType.Rectangular);\n\t\t}\n\n\t\tpublic int Order\n\t\t{\n\t\t\tget{return (int)this.properties[0].Value;}\n\t\t\tset{this.properties[0].Value = value;}\n\t\t}\n\n\t\tpublic double Cutoff\n\t\t{\n\t\t\tget{return (double)this.properties[1].Value;}\n\t\t\tset{this.properties[1].Value = value;}\n\t\t}\n\n\t\tpublic WindowType WindowType\n\t\t{\n\t\t\tget{return (WindowType)this.properties[2].Value;}\n\t\t\tset{this.properties[2].Value = value;}\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\tif(this.Order <= 0)\n\t\t\t\treturn \"次数は 1 以上でなければなりません。\";\n\n\t\t\tdouble cutoff = this.Cutoff;\n\t\t\tif(cutoff < 0 || cutoff > Math.PI)\n\t\t\t\treturn \"カットオフ周波数は 0 ～ π の間でなければなりません。\";\n\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\treturn FirCommon.GetLowPassFilter(this.Order, this.Cutoff, this.WindowType);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"LowPassFir\");\n\t\t\txwriter.WriteAttributeString(\"order\",  this.Order     .ToString());\n\t\t\txwriter.WriteAttributeString(\"cutoff\", this.Cutoff    .ToString());\n\t\t\txwriter.WriteAttributeString(\"window\", this.WindowType.ToString());\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tthis.Order      = int.Parse(elem.Attributes[\"order\"].Value);\n\t\t\tthis.Cutoff     = this.converter.ToFrequency(elem.Attributes[\"cutoff\"].Value);\n\t\t\tthis.WindowType = (WindowType)Enum.Parse(typeof(WindowType), elem.Attributes[\"window\"].Value);\n\t\t}\n\t}//class LowPassFirGenerator\n\n\t/// <summary>\n\t/// High Pass FIR を作成する。\n\t/// </summary>\n\tpublic class HighPassFirGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"高域透過フィルタ\";\n\t\tconst string CutoffName = \"カットオフ周波数\";\n\t\tconst string OrderName  = \"フィルタ次数\";\n\t\tconst string TypeName   = \"窓関数タイプ\";\n\n\t\tpublic HighPassFirGenerator()\n\t\t{\n\t\t\tthis.properties = new FilterProperty[3];\n\t\t\tthis.properties[0] = new FilterProperty(OrderName, 1);\n\t\t\tthis.properties[1] = new FilterProperty(CutoffName, (double)0);\n\t\t\tthis.properties[2] = new FilterProperty(TypeName, WindowType.Rectangular);\n\t\t}\n\n\t\tpublic int Order\n\t\t{\n\t\t\tget{return (int)this.properties[0].Value;}\n\t\t\tset{this.properties[0].Value = value;}\n\t\t}\n\n\t\tpublic double Cutoff\n\t\t{\n\t\t\tget{return (double)this.properties[1].Value;}\n\t\t\tset{this.properties[1].Value = value;}\n\t\t}\n\n\t\tpublic WindowType WindowType\n\t\t{\n\t\t\tget{return (WindowType)this.properties[2].Value;}\n\t\t\tset{this.properties[2].Value = value;}\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\tif(this.Order <= 0)\n\t\t\t\treturn \"次数は 1 以上でなければなりません。\";\n\n\t\t\tdouble cutoff = this.Cutoff;\n\t\t\tif(cutoff < 0 || cutoff > Math.PI)\n\t\t\t\treturn \"カットオフ周波数は 0 ～ π の間でなければなりません。\";\n\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\treturn FirCommon.GetHighPassFilter(this.Order, this.Cutoff, this.WindowType);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"HighPassFir\");\n\t\t\txwriter.WriteAttributeString(\"order\",  this.Order     .ToString());\n\t\t\txwriter.WriteAttributeString(\"cutoff\", this.Cutoff    .ToString());\n\t\t\txwriter.WriteAttributeString(\"window\", this.WindowType.ToString());\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tthis.Order      = int.Parse(elem.Attributes[\"order\"].Value);\n\t\t\tthis.Cutoff     = this.converter.ToFrequency(elem.Attributes[\"cutoff\"].Value);\n\t\t\tthis.WindowType = (WindowType)Enum.Parse(typeof(WindowType), elem.Attributes[\"window\"].Value);\n\t\t}\n\t}//class HighPassFirGenerator\n\n\t/// <summary>\n\t/// Band Pass FIR を作成する。\n\t/// </summary>\n\tpublic class BandPassFirGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"帯域透過フィルタ\";\n\t\tconst string UpperName = \"上限周波数\";\n\t\tconst string LowerfName = \"下限周波数\";\n\t\tconst string OrderName  = \"フィルタ次数\";\n\t\tconst string TypeName   = \"窓関数タイプ\";\n\n\t\tpublic BandPassFirGenerator()\n\t\t{\n\t\t\tthis.properties = new FilterProperty[4];\n\t\t\tthis.properties[0] = new FilterProperty(OrderName, 1);\n\t\t\tthis.properties[1] = new FilterProperty(UpperName, (double)0);\n\t\t\tthis.properties[2] = new FilterProperty(LowerfName, (double)0);\n\t\t\tthis.properties[3] = new FilterProperty(TypeName, WindowType.Rectangular);\n\t\t}\n\n\t\tpublic int Order\n\t\t{\n\t\t\tget{return (int)this.properties[0].Value;}\n\t\t\tset{this.properties[0].Value = value;}\n\t\t}\n\n\t\tpublic double UpperBound\n\t\t{\n\t\t\tget{return (double)this.properties[1].Value;}\n\t\t\tset{this.properties[1].Value = value;}\n\t\t}\n\n\t\tpublic double LowerBound\n\t\t{\n\t\t\tget{return (double)this.properties[2].Value;}\n\t\t\tset{this.properties[2].Value = value;}\n\t\t}\n\n\t\tpublic WindowType WindowType\n\t\t{\n\t\t\tget{return (WindowType)this.properties[3].Value;}\n\t\t\tset{this.properties[3].Value = value;}\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\tif(this.Order <= 0)\n\t\t\t\treturn \"次数は 1 以上でなければなりません。\";\n\n\t\t\tdouble upper = this.UpperBound;\n\t\t\tif(upper < 0 || upper > Math.PI)\n\t\t\t\treturn \"上限周波数は 0 ～ π の間でなければなりません。\";\n\n\t\t\tdouble lower = this.LowerBound;\n\t\t\tif(lower < 0 || lower > Math.PI)\n\t\t\t\treturn \"下限周波数は 0 ～ π の間でなければなりません。\";\n\n\t\t\tif(lower > upper)\n\t\t\t\treturn \"下限が上限を超えています。\";\n\n\t\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\treturn FirCommon.GetBandPassFilter(this.Order, this.LowerBound, this.UpperBound, this.WindowType);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"BandPassFir\");\n\t\t\txwriter.WriteAttributeString(\"order\",      this.Order.ToString());\n\t\t\txwriter.WriteAttributeString(\"lowerBound\", this.LowerBound.ToString());\n\t\t\txwriter.WriteAttributeString(\"upperBound\", this.UpperBound.ToString());\n\t\t\txwriter.WriteAttributeString(\"window\",     this.WindowType.ToString());\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tthis.Order      = int.Parse(elem.Attributes[\"order\"].Value);\n\t\t\tthis.LowerBound = this.converter.ToFrequency(elem.Attributes[\"lowerBound\"].Value);\n\t\t\tthis.UpperBound = this.converter.ToFrequency(elem.Attributes[\"upperBound\"].Value);\n\t\t\tthis.WindowType = (WindowType)Enum.Parse(typeof(WindowType), elem.Attributes[\"window\"].Value);\n\t\t}\n\t}//class BandPassFirGenerator\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/FilterGenerator/Basic.cs",
    "content": "﻿using System;\nusing System.Xml;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// 増幅器を作成する。\n\t/// </summary>\n\tpublic class AmplifierGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"増幅器\";\n\t\tconst string GainName   = \"増幅率\";\n\n\t\tpublic AmplifierGenerator()\n\t\t{\n\t\t\tthis.properties = new FilterProperty[1];\n\t\t\tthis.properties[0] = new FilterProperty(GainName, (double)1.0);\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\tdouble gain = this.Gain;\n\t\t\treturn new Misc.Amplifier(gain);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"Amplifier\");\n\t\t\txwriter.WriteAttributeString(\"gain\", this.Gain.ToString());\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tthis.Gain = this.converter.ToPower(elem.Attributes[\"gain\"].Value);\n\t\t}\n\n\t\tpublic double Gain\n\t\t{\n\t\t\tget{return (double)this.properties[0].Value;}\n\t\t\tset{this.properties[0].Value = value;}\n\t\t}\n\t}//class AmplifierGenerator\n\n\t/// <summary>\n\t/// 遅延器を作成する。\n\t/// </summary>\n\tpublic class DelayGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"遅延器\";\n\t\tconst string DelayName  = \"遅延サンプル数\";\n\n\t\tpublic DelayGenerator()\n\t\t{\n\t\t\tthis.properties = new FilterProperty[1];\n\t\t\tthis.properties[0] = new FilterProperty(DelayName, (int)0);\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\tint delay = this.Delay;\n\t\t\treturn new Delay.Delay(delay);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"Delay\");\n\t\t\txwriter.WriteAttributeString(\"delay\", this.Delay.ToString());\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tthis.Delay = int.Parse(elem.Attributes[\"delay\"].Value);\n\t\t}\n\n\t\tpublic int Delay\n\t\t{\n\t\t\tget{return (int)this.properties[0].Value;}\n\t\t\tset{this.properties[0].Value = value;}\n\t\t}\n\t}//class DelayGenerator\n\n\t/// <summary>\n\t/// MultiDelay を作成する。\n\t/// </summary>\n\tpublic class MultiDelayGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"マルチディレイ\";\n\t\tconst string GainName   = \"増幅率\";\n\t\tconst string DelayName  = \"遅延サンプル数\";\n\n\t\tpublic MultiDelayGenerator()\n\t\t{\n\t\t\tthis.arrayProperties = new FilterArrayProperty[1];\n\t\t\tthis.arrayProperties[0] = new FilterArrayProperty(\n\t\t\t\tnew FilterArrayProperty.Tuple(GainName, typeof(double)),\n\t\t\t\tnew FilterArrayProperty.Tuple(DelayName, typeof(int))\n\t\t\t\t);\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\tint len = this.Length;\n\t\t\tMisc.MultiDelay.Tuple[] tuples = new Misc.MultiDelay.Tuple[len];\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\tdouble gain = this.GetGain(i);\n\t\t\t\tint delay = this.GetDelay(i);\n\t\t\t\ttuples[i] = new Misc.MultiDelay.Tuple(gain, delay);\n\t\t\t}\n\t\t\treturn new Misc.MultiDelay(tuples);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"MultiDelay\");\n\n\t\t\tint len = this.Length;\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\txwriter.WriteStartElement(\"Filter\");\n\t\t\t\txwriter.WriteAttributeString(\"gain\", this.GetGain(i).ToString());\n\t\t\t\txwriter.WriteAttributeString(\"delay\", this.GetDelay(i).ToString());\n\t\t\t\txwriter.WriteEndElement();\n\t\t\t}\n\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tforeach(XmlNode node in elem.ChildNodes)\n\t\t\t{\n\t\t\t\tif(node is XmlElement)\n\t\t\t\t{\n\t\t\t\t\tdouble gain = this.converter.ToPower(node.Attributes[\"gain\"].Value);\n\t\t\t\t\tint delay = int.Parse(node.Attributes[\"delay\"].Value);\n\t\t\t\t\tthis.Add(gain, delay);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic double GetGain(int i)\n\t\t{\n\t\t\treturn (double)this.arrayProperties[0][i, 0];\n\t\t}\n\n\t\tpublic int GetDelay(int i)\n\t\t{\n\t\t\treturn (int)this.arrayProperties[0][i, 1];\n\t\t}\n\n\t\tpublic void SetSubfilter(int i, FilterGenerator gen)\n\t\t{\n\t\t\tthis.arrayProperties[0][i, 0] = gen;\n\t\t}\n\n\t\tpublic int Length\n\t\t{\n\t\t\tget{return this.arrayProperties[0].ListLength;}\n\t\t}\n\n\t\tpublic void Add(double gain, int delay)\n\t\t{\n\t\t\tthis.arrayProperties[0].Add(gain, delay);\n\t\t}\n\n\t\tpublic void Remove(int i)\n\t\t{\n\t\t\tthis.arrayProperties[0].Remove(i);\n\t\t}\n\t}//class MultiDelayGenerator\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/FilterGenerator/Comb.cs",
    "content": "﻿using System;\nusing System.Xml;\n\nnamespace SoundLibrary.Filter\n{\n\tusing CombFilter = SoundLibrary.Filter.Misc.CombFilter;\n\n\t/// <summary>\n\t/// CombFilter を作成する。\n\t/// </summary>\n\tpublic class CombFilterGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"コムフィルタ\";\n\t\tconst string DirectGainName = \"ダイレクト増幅率\";\n\t\tconst string EffectGainName = \"エフェクト増幅率\";\n\t\tconst string FeedbackName   = \"フィードバック増幅率\";\n\t\tconst string DelayName  = \"遅延サンプル数\";\n\n\t\tpublic CombFilterGenerator()\n\t\t{\n\t\t\tthis.properties = new FilterProperty[4];\n\t\t\tthis.properties[0] = new FilterProperty(DirectGainName, (double)0.0);\n\t\t\tthis.properties[1] = new FilterProperty(EffectGainName, (double)0.0);\n\t\t\tthis.properties[2] = new FilterProperty(FeedbackName, (double)0.0);\n\t\t\tthis.properties[3] = new FilterProperty(DelayName, (int)0);\n\t\t}\n\n\t\tpublic double DirectGain\n\t\t{\n\t\t\tget{return (double)this.properties[0].Value;}\n\t\t\tset{this.properties[0].Value = value;}\n\t\t}\n\n\t\tpublic double EffectGain\n\t\t{\n\t\t\tget{return (double)this.properties[1].Value;}\n\t\t\tset{this.properties[1].Value = value;}\n\t\t}\n\n\t\tpublic double FeedbackGain\n\t\t{\n\t\t\tget{return (double)this.properties[2].Value;}\n\t\t\tset{this.properties[2].Value = value;}\n\t\t}\n\n\t\tpublic int Delay\n\t\t{\n\t\t\tget{return (int)this.properties[3].Value;}\n\t\t\tset{this.properties[3].Value = value;}\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\treturn new CombFilter(this.DirectGain, this.EffectGain, this.FeedbackGain, this.Delay);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"CombFilter\");\n\t\t\txwriter.WriteAttributeString(\"direct\", this.DirectGain.ToString());\n\t\t\txwriter.WriteAttributeString(\"effect\", this.EffectGain.ToString());\n\t\t\txwriter.WriteAttributeString(\"feedback\", this.FeedbackGain.ToString());\n\t\t\txwriter.WriteAttributeString(\"delay\", this.Delay.ToString());\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tthis.DirectGain = double.Parse(elem.Attributes[\"direct\"].Value);\n\t\t\tthis.EffectGain = double.Parse(elem.Attributes[\"effect\"].Value);\n\t\t\tthis.FeedbackGain = double.Parse(elem.Attributes[\"feedback\"].Value);\n\t\t\tthis.Delay = int.Parse(elem.Attributes[\"delay\"].Value);\n\t\t}\n\t}//class CombFilterGenerator\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/FilterGenerator/Common.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Xml;\nusing System.Reflection;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// フィルタの構成情報。\n\t/// </summary>\n\tpublic class FilterProperty\n\t{\n\t\tstring name;\n\t\tobject obj;\n\t\tType type;\n\n\t\tinternal FilterProperty(string name, object obj)\n\t\t{\n\t\t\tthis.name = name;\n\t\t\tthis.obj = obj;\n\t\t\tthis.type = obj.GetType();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// プロパティの値を取得・設定。\n\t\t/// </summary>\n\t\tpublic object Value\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tif(value == null)\n\t\t\t\t\tthrow new ArgumentNullException(\"null は設定できません\");\n\n\t\t\t\tif(!this.type.IsAssignableFrom(value.GetType()))\n\t\t\t\t\tthrow new ArgumentException(\"型が一致していません\");\n\n\t\t\t\tthis.obj = value;\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.obj;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// プロパティ名を取得。\n\t\t/// </summary>\n\t\tpublic string Name()\n\t\t{\n\t\t\treturn this.name;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// プロパティの型を取得。\n\t\t/// </summary>\n\t\tpublic Type Type()\n\t\t{\n\t\t\treturn this.type;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// フィルタの配列型構成情報\n\t/// </summary>\n\tpublic class FilterArrayProperty\n\t{\n\t\tpublic struct Tuple\n\t\t{\n\t\t\tpublic string name;\n\t\t\tpublic Type type;\n\n\t\t\tpublic Tuple(string name, Type type)\n\t\t\t{\n\t\t\t\tthis.name = name;\n\t\t\t\tthis.type = type;\n\t\t\t}\n\t\t}\n\n\t\tTuple[] informations;\n\t\tArrayList propertyList;\n\n\t\tpublic FilterArrayProperty(params Tuple[] informations)\n\t\t{\n\t\t\tthis.informations = informations;\n\t\t\tthis.propertyList = new ArrayList();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// i 番目の配列属性の j 番目の属性を取得/設定する。\n\t\t/// </summary>\n\t\tpublic object this[int i, int j]\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tif(value == null)\n\t\t\t\t\tthrow new ArgumentNullException(\"null は設定できません\");\n\n\t\t\t\tif(!this.informations[i].type.IsAssignableFrom(value.GetType()))\n\t\t\t\t\tthrow new ArgumentException(\"型が一致していません\");\n\n\t\t\t\t((object[])this.propertyList[i])[j] = value;\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn ((object[])this.propertyList[i])[j];\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 構成情報を追加する。\n\t\t/// </summary>\n\t\t/// <param name=\"objs\">項目の属性</param>\n\t\tpublic void Add(params object[] objs)\n\t\t{\n\t\t\tif(objs == null)\n\t\t\t\tthrow new ArgumentNullException(\"null は設定できません\");\n\n\t\t\tif(this.informations.Length != objs.Length)\n\t\t\t\tthrow new ArgumentException(\"長さが一致していません\");\n\n\t\t\tfor(int i=0; i<objs.Length; ++i)\n\t\t\t{\n\t\t\t\tif(!this.informations[i].type.IsAssignableFrom(objs[i].GetType()))\n\t\t\t\t\tthrow new ArgumentException(\"型が一致していません\");\n\t\t\t}\n\n\t\t\tthis.propertyList.Add(objs);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 構成情報を削除する。\n\t\t/// </summary>\n\t\t/// <param name=\"i\">削除位置</param>\n\t\tpublic void Remove(int i)\n\t\t{\n\t\t\tthis.propertyList.RemoveAt(i);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// リストの長さ。\n\t\t/// </summary>\n\t\tpublic int ListLength\n\t\t{\n\t\t\tget{return this.propertyList.Count;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 構成情報の数を取得する。\n\t\t/// </summary>\n\t\tpublic int Count\n\t\t{\n\t\t\tget{return this.informations.Length;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// プロパティ名を取得。\n\t\t/// </summary>\n\t\tpublic string Name(int i)\n\t\t{\n\t\t\treturn this.informations[i].name;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// プロパティの型を取得。\n\t\t/// </summary>\n\t\tpublic Type Type(int i)\n\t\t{\n\t\t\treturn this.informations[i].type;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// フィルタ作成クラスの共通部分を集めた抽象基底クラス。\n\t/// プロパティの管理部分はこのクラスでする。\n\t/// </summary>\n\tpublic abstract class FilterGenerator\n\t{\n\t\t/// <summary>\n\t\t/// フィルタの構成情報。\n\t\t/// Amplifier の gain とか、FirFilter の coef とか、\n\t\t/// 普通の構成情報。\n\t\t/// </summary>\n\t\tprotected FilterProperty[] properties = null;\n\n\t\t/// <summary>\n\t\t/// リストになっている構成情報(配列型構成情報と呼ぶことにする)。\n\t\t/// SerialConnector の (filter) とか Mixer の (gain, filter)とか、\n\t\t/// 可変長のもの構成情報。\n\t\t/// </summary>\n\t\tprotected FilterArrayProperty[] arrayProperties = null;\n\n\t\t/// <summary>\n\t\t/// 数値変換用。\n\t\t/// </summary>\n\t\tprotected Converter converter = new Converter();\n\n\t\t/// <summary>\n\t\t/// 構成情報の数を取得する。\n\t\t/// </summary>\n\t\tpublic int Count\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif(this.properties == null)\n\t\t\t\t\treturn 0;\n\t\t\t\telse\n\t\t\t\t\treturn this.properties.Length;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタの構成情報を取得する。\n\t\t/// </summary>\n\t\t[System.Runtime.CompilerServices.IndexerName(\"Property\")]\n\t\tpublic FilterProperty this[int i]\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.properties[i];\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列型構成情報の数を取得する。\n\t\t/// </summary>\n\t\tpublic int ArrayCount\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif(this.arrayProperties == null)\n\t\t\t\t\treturn 0;\n\t\t\t\telse\n\t\t\t\t\treturn this.arrayProperties.Length;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタの配列型構成情報を取得する。\n\t\t/// </summary>\n\t\tpublic FilterArrayProperty GetArrayProperty(int i)\n\t\t{\n\t\t\treturn this.arrayProperties[i];\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタを作成する。\n\t\t/// </summary>\n\t\t/// <returns>作成したフィルタ</returns>\n\t\tpublic abstract IFilter GetFilter();\n\n\t\t/// <summary>\n\t\t/// 設定した属性がフィルタの制約を満たしているかどうかチェックする。\n\t\t/// </summary>\n\t\t/// <returns>制約を満たしていれば null、満たしていなければエラーメッセージを返す</returns>\n\t\tpublic abstract string CheckConstraint();\n\n\t\t/// <summary>\n\t\t/// XML にフィルタ構成を出力。\n\t\t/// </summary>\n\t\t/// <param name=\"xwriter\">出力先</param>\n\t\tpublic abstract void ToXml(XmlWriter xwriter);\n\n\t\t/// <summary>\n\t\t/// XML からフィルタ構成を入力。\n\t\t/// </summary>\n\t\t/// <param name=\"elem\">入力元</param>\n\t\tpublic abstract void FromXml(XmlElement elem);\n\n\t\t/// <summary>\n\t\t/// フィルタ構成を XML 形式でファイル出力。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">XML ファイル名</param>\n\t\tpublic void WriteXml(string filename)\n\t\t{\n\t\t\tXmlTextWriter xwriter = new XmlTextWriter(filename, System.Text.Encoding.Default);\n\t\t\txwriter.WriteStartDocument();\n\t\t\tthis.ToXml(xwriter);\n\t\t\txwriter.WriteEndDocument();\n\t\t\txwriter.Close();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// XML ファイル内のフィルタ構成情報から FilterGenerator を作成。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">XML ファイル名</param>\n\t\t/// <returns>作成した FilterGenerator</returns>\n\t\tpublic static FilterGenerator CreateFromXml(string filename)\n\t\t{\n\t\t\tXmlDocument xdoc = new XmlDocument();\n\t\t\txdoc.Load(filename);\n\t\t\tFilterGenerator gen = CreateFromXml(xdoc.DocumentElement);\n\t\t\treturn gen;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// XML ファイル内のフィルタ構成情報から FilterGenerator を作成。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">XML ファイル名</param>\n\t\t/// <returns>作成した FilterGenerator</returns>\n\t\tpublic static FilterGenerator CreateFromXml(string filename, Converter converter)\n\t\t{\n\t\t\tXmlDocument xdoc = new XmlDocument();\n\t\t\txdoc.Load(filename);\n\t\t\tFilterGenerator gen = CreateFromXml(xdoc.DocumentElement, converter);\n\t\t\treturn gen;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// XML から FilterGenerator を作成。\n\t\t/// </summary>\n\t\t/// <param name=\"xreader\">入力</param>\n\t\t/// <returns>作成した FilterGenerator</returns>\n\t\tinternal static FilterGenerator CreateFromXml(XmlElement elem)\n\t\t{\n\t\t\treturn FilterGenerator.CreateFromXml(elem, null);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// XML から FilterGenerator を作成。\n\t\t/// </summary>\n\t\t/// <param name=\"xreader\">入力</param>\n\t\t/// <returns>作成した FilterGenerator</returns>\n\t\tinternal static FilterGenerator CreateFromXml(XmlElement elem, Converter converter)\n\t\t{\n\t\t\tAssembly asm = Assembly.GetExecutingAssembly();\n\t\t\tFilterGenerator gen = (FilterGenerator)asm.CreateInstance(\"SoundLibrary.Filter.\" + elem.LocalName + \"Generator\");\n\n\t\t\tif(gen == null)\n\t\t\t\tthrow new NotSupportedException(\"SoundLibrary.Filter.\" + elem.LocalName + \" は実装されていません。\");\n\n\t\t\tif(converter != null)\n\t\t\t\tgen.converter = converter;\n\n\t\t\tXmlAttribute att;\n\t\t\tatt = elem.Attributes[\"samplingRate\"];\n\t\t\tif(att != null)\n\t\t\t\tgen.SamplingRate = double.Parse(att.Value);\n\t\t\tatt = elem.Attributes[\"dB\"];\n\t\t\tif(att != null)\n\t\t\t\tgen.IsDB = att.Value == \"true\";\n\n\t\t\tgen.FromXml(elem);\n\t\t\treturn gen;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// IsDB が真のとき、入力された文字列は dB 値を表してるものとして、\n\t\t/// dB → リニア値の変換を行う。\n\t\t/// </summary>\n\t\tpublic bool IsDB\n\t\t{\n\t\t\tset{this.converter.IsDB = value;}\n\t\t\tget{return this.converter.IsDB;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// SamplingRate が非 0 のとき、その周波数で正規化を行う。\n\t\t/// </summary>\n\t\tpublic double SamplingRate\n\t\t{\n\t\t\tset{this.converter.SamplingRate = value;}\n\t\t\tget{return this.converter.SamplingRate;}\n\t\t}\n\t}//class FilterGenerator\n\n\tpublic class Util\n\t{\n\t\tpublic static string ArrayToString(double[] array)\n\t\t{\n\t\t\tstring str = array[0].ToString();\n\t\t\tfor(int i=1; i<array.Length; ++i)\n\t\t\t\tstr += ',' + array[i].ToString();\n\t\t\treturn str;\n\t\t}\n\n\t\tpublic static double[] StringToArray(string str)\n\t\t{\n\t\t\tstring[] tokens = str.Split(',');\n\t\t\tdouble[] array = new double[tokens.Length];\n\t\t\tfor(int i=0; i<tokens.Length; ++i)\n\t\t\t\tarray[i] = double.Parse(tokens[i]);\n\t\t\treturn array;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// 文字列→数値変換クラス。\n\t/// dB → リニア値の変換や、周波数の正規かも行う。\n\t/// </summary>\n\tpublic class Converter\n\t{\n\t\tbool isDB = false;\n\t\tdouble samplingRate = 0;\n\n\t\t/// <summary>\n\t\t/// IsDB が真のとき、入力された文字列は dB 値を表してるものとして、\n\t\t/// dB → リニア値の変換を行う。\n\t\t/// </summary>\n\t\tpublic bool IsDB\n\t\t{\n\t\t\tset{this.isDB = value;}\n\t\t\tget{return this.isDB;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// SamplingRate が非 0 のとき、その周波数で正規化を行う。\n\t\t/// </summary>\n\t\tpublic double SamplingRate\n\t\t{\n\t\t\tset{this.samplingRate = value;}\n\t\t\tget{return this.samplingRate;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 文字列→数値変換。振幅版。\n\t\t/// IsDB の値に応じて数値を変換する。\n\t\t/// </summary>\n\t\t/// <param name=\"str\">変換元</param>\n\t\t/// <returns>変換結果</returns>\n\t\tpublic double ToPower(string str)\n\t\t{\n\t\t\tdouble x = double.Parse(str);\n\n\t\t\tif(this.isDB)\n\t\t\t\treturn SoundLibrary.Util.DBToLinear(x);\n\n\t\t\treturn x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 文字列→数値変換。周波数版。\n\t\t/// SamplingRate の値に応じて数値を変換する。\n\t\t/// </summary>\n\t\t/// <param name=\"str\">変換元</param>\n\t\t/// <returns>変換結果</returns>\n\t\tpublic double ToFrequency(string str)\n\t\t{\n\t\t\tdouble x = double.Parse(str);\n\n\t\t\tif(this.samplingRate != 0)\n\t\t\t\treturn SoundLibrary.Util.Normalize(x, this.samplingRate);\n\n\t\t\treturn x;\n\t\t}\n\t}\n}//namespace FilterGenerator\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/FilterGenerator/Connector.cs",
    "content": "﻿using System;\nusing System.Xml;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// SerialConnector を作成する。\n\t/// </summary>\n\tpublic class SerialConnectorGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"直列接続\";\n\t\tconst string SubFilterName = \"フィルタ\";\n\n\t\tpublic SerialConnectorGenerator()\n\t\t{\n\t\t\tthis.arrayProperties = new FilterArrayProperty[1];\n\t\t\tthis.arrayProperties[0] = new FilterArrayProperty(\n\t\t\t\tnew FilterArrayProperty.Tuple(SubFilterName, typeof(FilterGenerator))\n\t\t\t\t);\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\tfor(int i=0; i<this.Length; ++i)\n\t\t\t{\n\t\t\t\tstring message = this.GetSubfilter(i).CheckConstraint();\n\t\t\t\tif(message != null)\n\t\t\t\t\treturn message;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\tint len = this.Length;\n\t\t\tIFilter[] filters = new IFilter[len];\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\tFilterGenerator gen = this.GetSubfilter(i);\n\t\t\t\tfilters[i] = gen.GetFilter();\n\t\t\t}\n\t\t\treturn new SerialConnector(filters);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"SerialConnector\");\n\n\t\t\tint len = this.Length;\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\tFilterGenerator gen = this.GetSubfilter(i);\n\t\t\t\tgen.ToXml(xwriter);\n\t\t\t}\n\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tforeach(XmlNode node in elem.ChildNodes)\n\t\t\t{\n\t\t\t\tif(node is XmlElement)\n\t\t\t\t{\n\t\t\t\t\tFilterGenerator gen = FilterGenerator.CreateFromXml((XmlElement)node, this.converter);\n\t\t\t\t\tthis.Add(gen);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic FilterGenerator GetSubfilter(int i)\n\t\t{\n\t\t\treturn (FilterGenerator)this.arrayProperties[0][i, 0];\n\t\t}\n\n\t\tpublic void SetSubfilter(int i, FilterGenerator gen)\n\t\t{\n\t\t\tthis.arrayProperties[0][i, 0] = gen;\n\t\t}\n\n\t\tpublic int Length\n\t\t{\n\t\t\tget{return this.arrayProperties[0].ListLength;}\n\t\t}\n\n\t\tpublic void Add(FilterGenerator gen)\n\t\t{\n\t\t\tthis.arrayProperties[0].Add(gen);\n\t\t}\n\n\t\tpublic void Remove(int i)\n\t\t{\n\t\t\tthis.arrayProperties[0].Remove(i);\n\t\t}\n\t}//class SerialConnectorGenerator\n\n\t/// <summary>\n\t/// PallarelConnector を作成する。\n\t/// </summary>\n\tpublic class PallarelConnectorGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"並列接続\";\n\t\tconst string SubFilterName = \"フィルタ\";\n\n\t\tpublic PallarelConnectorGenerator()\n\t\t{\n\t\t\tthis.arrayProperties = new FilterArrayProperty[1];\n\t\t\tthis.arrayProperties[0] = new FilterArrayProperty(\n\t\t\t\tnew FilterArrayProperty.Tuple(SubFilterName, typeof(FilterGenerator))\n\t\t\t\t);\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\tfor(int i=0; i<this.Length; ++i)\n\t\t\t{\n\t\t\t\tstring message = this.GetSubfilter(i).CheckConstraint();\n\t\t\t\tif(message != null)\n\t\t\t\t\treturn message;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\tint len = this.Length;\n\t\t\tIFilter[] filters = new IFilter[len];\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\tFilterGenerator gen = this.GetSubfilter(i);\n\t\t\t\tfilters[i] = gen.GetFilter();\n\t\t\t}\n\t\t\treturn new PallarelConnector(filters);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"PallarelConnector\");\n\n\t\t\tint len = this.Length;\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\tFilterGenerator gen = this.GetSubfilter(i);\n\t\t\t\tgen.ToXml(xwriter);\n\t\t\t}\n\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tforeach(XmlNode node in elem.ChildNodes)\n\t\t\t{\n\t\t\t\tif(node is XmlElement)\n\t\t\t\t{\n\t\t\t\t\tFilterGenerator gen = FilterGenerator.CreateFromXml((XmlElement)node, this.converter);\n\t\t\t\t\tthis.Add(gen);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic FilterGenerator GetSubfilter(int i)\n\t\t{\n\t\t\treturn (FilterGenerator)this.arrayProperties[0][i, 0];\n\t\t}\n\n\t\tpublic void SetSubfilter(int i, FilterGenerator gen)\n\t\t{\n\t\t\tthis.arrayProperties[0][i, 0] = gen;\n\t\t}\n\n\t\tpublic int Length\n\t\t{\n\t\t\tget{return this.arrayProperties[0].ListLength;}\n\t\t}\n\n\t\tpublic void Add(FilterGenerator gen)\n\t\t{\n\t\t\tthis.arrayProperties[0].Add(gen);\n\t\t}\n\n\t\tpublic void Remove(int i)\n\t\t{\n\t\t\tthis.arrayProperties[0].Remove(i);\n\t\t}\n\t}//class PallarelConnectorGenerator\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/FilterGenerator/Equalizer.cs",
    "content": "﻿using System;\nusing System.Xml;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// ShelvingEqualizer を作成する。\n\t/// </summary>\n\tpublic class ShelvingEqualizerGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"低域透過フィルタ\";\n\t\tconst string CenterName = \"中心周波数\";\n\t\tconst string QName = \"Q値\";\n\t\tconst string GainName = \"増幅率\";\n\n\t\tpublic ShelvingEqualizerGenerator()\n\t\t{\n\t\t\tthis.properties = new FilterProperty[2];\n\t\t\tthis.properties[0] = new FilterProperty(CenterName, (double)0);\n\t\t\tthis.properties[1] = new FilterProperty(GainName, (double)1);\n\t\t}\n\n\t\tpublic double CenterFrequency\n\t\t{\n\t\t\tget{return (double)this.properties[0].Value;}\n\t\t\tset{this.properties[0].Value = value;}\n\t\t}\n\n\t\tpublic double Gain\n\t\t{\n\t\t\tget{return (double)this.properties[1].Value;}\n\t\t\tset{this.properties[1].Value = value;}\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\tdouble center = this.CenterFrequency;\n\t\t\tif(center < 0 || center > Math.PI)\n\t\t\t\treturn \"中心周波数は 0 ～ π の間でなければなりません。\";\n\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\treturn new ShelvingEqualizer(this.CenterFrequency, this.Gain);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"ShelvingEqualizer\");\n\t\t\txwriter.WriteAttributeString(\"center\", this.CenterFrequency.ToString());\n\t\t\txwriter.WriteAttributeString(\"gain\"  , this.Gain           .ToString());\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tthis.CenterFrequency = this.converter.ToFrequency(elem.Attributes[\"center\"].Value);\n\t\t\tthis.Gain            = this.converter.ToPower(elem.Attributes[\"gain\"  ].Value);\n\t\t}\n\t}//class ShelvingEqualizerGenerator\n\n\t/// <summary>\n\t/// ShelvingEqualizer を作成する。\n\t/// </summary>\n\tpublic class PeakingEqualizerGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"低域透過フィルタ\";\n\t\tconst string CenterName = \"中心周波数\";\n\t\tconst string QName = \"Q値\";\n\t\tconst string GainName = \"増幅率\";\n\n\t\tpublic PeakingEqualizerGenerator()\n\t\t{\n\t\t\tthis.properties = new FilterProperty[3];\n\t\t\tthis.properties[0] = new FilterProperty(CenterName, (double)0);\n\t\t\tthis.properties[1] = new FilterProperty(QName, (double)1);\n\t\t\tthis.properties[2] = new FilterProperty(GainName, (double)1);\n\t\t}\n\n\t\tpublic double CenterFrequency\n\t\t{\n\t\t\tget{return (double)this.properties[0].Value;}\n\t\t\tset{this.properties[0].Value = value;}\n\t\t}\n\n\t\tpublic double Q\n\t\t{\n\t\t\tget{return (double)this.properties[1].Value;}\n\t\t\tset{this.properties[1].Value = value;}\n\t\t}\n\n\t\tpublic double Gain\n\t\t{\n\t\t\tget{return (double)this.properties[2].Value;}\n\t\t\tset{this.properties[2].Value = value;}\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\tdouble center = this.CenterFrequency;\n\t\t\tif(center < 0 || center > Math.PI)\n\t\t\t\treturn \"中心周波数は 0 ～ π の間でなければなりません。\";\n\n\t\t\tif(this.Q == 0)\n\t\t\t\treturn \"Q値は非0でなければなりません。\";\n\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\treturn new PeakingEqualizer(this.CenterFrequency, this.Q, this.Gain);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"PeakingEqualizer\");\n\t\t\txwriter.WriteAttributeString(\"center\", this.CenterFrequency.ToString());\n\t\t\txwriter.WriteAttributeString(\"q\"     , this.Q              .ToString());\n\t\t\txwriter.WriteAttributeString(\"gain\"  , this.Gain           .ToString());\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tthis.CenterFrequency = this.converter.ToFrequency(elem.Attributes[\"center\"].Value);\n\t\t\tthis.Q               = double.Parse(elem.Attributes[\"q\"     ].Value);\n\t\t\tthis.Gain            = this.converter.ToPower(elem.Attributes[\"gain\"  ].Value);\n\t\t}\n\t}//class PeakingEqualizerGenerator\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/FilterGenerator/FilterGeneratorForm.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Windows.Forms;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// FilterGeneratorForm の概要の説明です。\n\t/// </summary>\n\tpublic class FilterGeneratorForm : System.Windows.Forms.Form\n\t{\n\t\t#region\n\t\tFilterGenerator generator;\n\n\t\tpublic FilterGeneratorForm(FilterGenerator fg)\n\t\t{\n\t\t\t//\n\t\t\t// Windows フォーム デザイナ サポートに必要です。\n\t\t\t//\n\t\t\tInitializeComponent();\n\n\t\t\tthis.generator = fg;\n\t\t\t//Init();\n\t\t}\n\t\t#endregion\n\n\t\tprivate System.Windows.Forms.Button buttonOk;\n\t\t/// <summary>\n\t\t/// 必要なデザイナ変数です。\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.Container components = null;\n\n\t\t/// <summary>\n\t\t/// 使用されているリソースに後処理を実行します。\n\t\t/// </summary>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif( disposing )\n\t\t\t{\n\t\t\t\tif(components != null)\n\t\t\t\t{\n\t\t\t\t\tcomponents.Dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Windows フォーム デザイナで生成されたコード \n\t\t/// <summary>\n\t\t/// デザイナ サポートに必要なメソッドです。このメソッドの内容を\n\t\t/// コード エディタで変更しないでください。\n\t\t/// </summary>\n\t\tprivate void InitializeComponent()\n\t\t{\n\t\t\tthis.buttonOk = new System.Windows.Forms.Button();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// buttonOk\n\t\t\t// \n\t\t\tthis.buttonOk.Location = new System.Drawing.Point(328, 344);\n\t\t\tthis.buttonOk.Name = \"buttonOk\";\n\t\t\tthis.buttonOk.Size = new System.Drawing.Size(56, 24);\n\t\t\tthis.buttonOk.TabIndex = 0;\n\t\t\tthis.buttonOk.Text = \"OK\";\n\t\t\t// \n\t\t\t// FilterGeneratorForm\n\t\t\t// \n\t\t\tthis.AcceptButton = this.buttonOk;\n\t\t\tthis.AutoScaleBaseSize = new System.Drawing.Size(5, 12);\n\t\t\tthis.ClientSize = new System.Drawing.Size(392, 373);\n\t\t\tthis.Controls.Add(this.buttonOk);\n\t\t\tthis.Name = \"FilterGeneratorForm\";\n\t\t\tthis.Text = \"FilterGeneratorForm\";\n\t\t\tthis.Load += new System.EventHandler(this.c);\n\t\t\tthis.ResumeLayout(false);\n\n\t\t}\n\t\t#endregion\n\n\t\tprivate void c(object sender, System.EventArgs e)\n\t\t{\n\t\t\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/FilterGenerator/FilterGeneratorForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 1.3\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">1.3</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\">this is my long string</data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        [base64 mime encoded serialized .NET Framework object]\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        [base64 mime encoded string representing a byte array form of the .NET Framework object]\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used forserialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>1.3</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"buttonOk.Locked\" type=\"System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>False</value>\n  </data>\n  <data name=\"buttonOk.Modifiers\" type=\"System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>Private</value>\n  </data>\n  <data name=\"buttonOk.DefaultModifiers\" type=\"System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>Private</value>\n  </data>\n  <data name=\"$this.Locked\" type=\"System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>False</value>\n  </data>\n  <data name=\"$this.Language\" type=\"System.Globalization.CultureInfo, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>(Default)</value>\n  </data>\n  <data name=\"$this.TrayLargeIcon\" type=\"System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>False</value>\n  </data>\n  <data name=\"$this.Localizable\" type=\"System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>False</value>\n  </data>\n  <data name=\"$this.GridSize\" type=\"System.Drawing.Size, System.Drawing, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>8, 8</value>\n  </data>\n  <data name=\"$this.DrawGrid\" type=\"System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </data>\n  <data name=\"$this.TrayHeight\" type=\"System.Int32, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>80</value>\n  </data>\n  <data name=\"$this.Name\">\n    <value>FilterGeneratorForm</value>\n  </data>\n  <data name=\"$this.SnapToGrid\" type=\"System.Boolean, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </data>\n  <data name=\"$this.DefaultModifiers\" type=\"System.CodeDom.MemberAttributes, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>Private</value>\n  </data>\n</root>"
  },
  {
    "path": "Chapters/Old/SoundLibrary/FilterGenerator/Fir.cs",
    "content": "﻿using System;\nusing System.Xml;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// FIR を作成する。\n\t/// </summary>\n\tpublic class FirFilterGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"FIR フィルタ\";\n\t\tconst string CoefName   = \"フィルタ係数\";\n\n\t\tpublic FirFilterGenerator()\n\t\t{\n\t\t\tthis.properties = new FilterProperty[1];\n\n\t\t\tdouble[] coef = new double[1];\n\t\t\tcoef[0] = 1;\n\n\t\t\tthis.properties[0] = new FilterProperty(CoefName, coef);\n\t\t}\n\n\t\tpublic double[] Coef\n\t\t{\n\t\t\tget{return (double[])this.properties[0].Value;}\n\t\t\tset{this.properties[0].Value = value;}\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\treturn new FirFilter(this.Coef);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"FirFilter\");\n\t\t\txwriter.WriteElementString(\"Coef\", Util.ArrayToString(this.Coef));\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tthis.Coef = Util.StringToArray(elem[\"Coef\"].InnerText);\n\t\t}\n\t}//class FirFilterGenerator\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/FilterGenerator/Iir.cs",
    "content": "﻿using System;\nusing System.Xml;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// FIR を作成する。\n\t/// </summary>\n\tpublic class IirFilterGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"FIR フィルタ\";\n\t\tconst string CoefAName   = \"フィルタ分母係数\";\n\t\tconst string CoefBName   = \"フィルタ分子係数\";\n\n\t\tpublic IirFilterGenerator()\n\t\t{\n\t\t\tthis.properties = new FilterProperty[2];\n\n\t\t\tdouble[] coefA = new double[0];\n\t\t\tdouble[] coefB = new double[]{1};\n\n\t\t\tthis.properties[0] = new FilterProperty(CoefAName, coefA);\n\t\t\tthis.properties[1] = new FilterProperty(CoefBName, coefB);\n\t\t}\n\n\t\tpublic double[] CoefA\n\t\t{\n\t\t\tget{return (double[])this.properties[0].Value;}\n\t\t\tset{this.properties[0].Value = value;}\n\t\t}\n\n\t\tpublic double[] CoefB\n\t\t{\n\t\t\tget{return (double[])this.properties[1].Value;}\n\t\t\tset{this.properties[1].Value = value;}\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\tif(this.CoefA.Length + 1 != this.CoefB.Length)\n\t\t\t\treturn CoefAName + \"の長さ +1 ==\" + CoefBName + \"の長さ出なければなりません。\";\n\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\treturn new IirFilter(this.CoefA, this.CoefB);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"IirFilter\");\n\t\t\txwriter.WriteElementString(\"CoefA\", Util.ArrayToString(this.CoefA));\n\t\t\txwriter.WriteElementString(\"CoefB\", Util.ArrayToString(this.CoefB));\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tthis.CoefA = Util.StringToArray(elem[\"CoefA\"].InnerText);\n\t\t\tthis.CoefB = Util.StringToArray(elem[\"CoefB\"].InnerText);\n\t\t}\n\t}//class IirFilterGenerator\n}//namespace FilterGenerator\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/FilterGenerator/Mixer.cs",
    "content": "﻿using System;\nusing System.Xml;\n\nnamespace SoundLibrary.Filter\n{\n\t/// <summary>\n\t/// MixerGenerator を作成する。\n\t/// </summary>\n\tpublic class MixerGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"ミキサー\";\n\t\tconst string SubFilterName = \"フィルタ\";\n\t\tconst string GainName   = \"増幅率\";\n\n\t\tpublic MixerGenerator()\n\t\t{\n\t\t\tthis.arrayProperties = new FilterArrayProperty[1];\n\t\t\tthis.arrayProperties[0] = new FilterArrayProperty(\n\t\t\t\tnew FilterArrayProperty.Tuple(SubFilterName, typeof(FilterGenerator)),\n\t\t\t\tnew FilterArrayProperty.Tuple(GainName, typeof(double))\n\t\t\t\t);\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\tfor(int i=0; i<this.Length; ++i)\n\t\t\t{\n\t\t\t\tstring message = this.GetSubfilter(i).CheckConstraint();\n\t\t\t\tif(message != null)\n\t\t\t\t\treturn message;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\tint len = this.Length;\n\t\t\tMixer.Tuple[] tuples = new Mixer.Tuple[len];\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\tdouble gain = this.GetGain(i);\n\t\t\t\tFilterGenerator gen = this.GetSubfilter(i);\n\t\t\t\tIFilter filter = gen.GetFilter();\n\t\t\t\ttuples[i] = new Mixer.Tuple(filter, gain);\n\t\t\t}\n\t\t\treturn new Mixer(tuples);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"Mixer\");\n\n\t\t\tint len = this.Length;\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\txwriter.WriteStartElement(\"Filter\");\n\t\t\t\txwriter.WriteAttributeString(\"gain\", this.GetGain(i).ToString());\n\t\t\t\tFilterGenerator gen = this.GetSubfilter(i);\n\t\t\t\tgen.ToXml(xwriter);\n\t\t\t\txwriter.WriteEndElement();\n\t\t\t}\n\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tforeach(XmlNode node in elem.ChildNodes)\n\t\t\t{\n\t\t\t\tif(node is XmlElement)\n\t\t\t\t{\n\t\t\t\t\tdouble gain = this.converter.ToPower(node.Attributes[\"gain\"].Value);\n\t\t\t\t\tFilterGenerator gen = FilterGenerator.CreateFromXml((XmlElement)node.FirstChild, this.converter);\n\t\t\t\t\tthis.Add(gen, gain);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic FilterGenerator GetSubfilter(int i)\n\t\t{\n\t\t\treturn (FilterGenerator)this.arrayProperties[0][i, 0];\n\t\t}\n\n\t\tpublic double GetGain(int i)\n\t\t{\n\t\t\treturn (double)this.arrayProperties[0][i, 1];\n\t\t}\n\n\t\tpublic void SetSubfilter(int i, FilterGenerator gen)\n\t\t{\n\t\t\tthis.arrayProperties[0][i, 0] = gen;\n\t\t}\n\n\t\tpublic int Length\n\t\t{\n\t\t\tget{return this.arrayProperties[0].ListLength;}\n\t\t}\n\n\t\tpublic void Add(FilterGenerator gen, double gain)\n\t\t{\n\t\t\tthis.arrayProperties[0].Add(gen, gain);\n\t\t}\n\n\t\tpublic void Remove(int i)\n\t\t{\n\t\t\tthis.arrayProperties[0].Remove(i);\n\t\t}\n\t}//class MixerGenerator\n\n\t/// <summary>\n\t/// DelayMixerGenerator を作成する。\n\t/// </summary>\n\tpublic class DelayMixerGenerator : FilterGenerator\n\t{\n\t\tconst string FilterName = \"遅延付きミキサー\";\n\t\tconst string SubFilterName = \"フィルタ\";\n\t\tconst string GainName   = \"増幅率\";\n\t\tconst string DelayName  = \"遅延サンプル数\";\n\n\t\tpublic DelayMixerGenerator()\n\t\t{\n\t\t\tthis.arrayProperties = new FilterArrayProperty[1];\n\t\t\tthis.arrayProperties[0] = new FilterArrayProperty(\n\t\t\t\tnew FilterArrayProperty.Tuple(SubFilterName, typeof(FilterGenerator)),\n\t\t\t\tnew FilterArrayProperty.Tuple(GainName, typeof(double)),\n\t\t\t\tnew FilterArrayProperty.Tuple(DelayName, typeof(int))\n\t\t\t\t);\n\t\t}\n\n\t\tpublic override string CheckConstraint()\n\t\t{\n\t\t\tfor(int i=0; i<this.Length; ++i)\n\t\t\t{\n\t\t\t\tstring message = this.GetSubfilter(i).CheckConstraint();\n\t\t\t\tif(message != null)\n\t\t\t\t\treturn message;\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tpublic override IFilter GetFilter()\n\t\t{\n\t\t\tint len = this.Length;\n\t\t\tDelayMixer.Tuple[] tuples = new DelayMixer.Tuple[len];\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\tdouble gain = this.GetGain(i);\n\t\t\t\tint delay = this.GetDelay(i);\n\t\t\t\tFilterGenerator gen = this.GetSubfilter(i);\n\t\t\t\tIFilter filter = gen.GetFilter();\n\t\t\t\ttuples[i] = new DelayMixer.Tuple(filter, gain, delay);\n\t\t\t}\n\t\t\treturn new DelayMixer(tuples);\n\t\t}\n\n\t\tpublic override void ToXml(XmlWriter xwriter)\n\t\t{\n\t\t\txwriter.WriteStartElement(\"DelayMixer\");\n\n\t\t\tint len = this.Length;\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\txwriter.WriteStartElement(\"Filter\");\n\t\t\t\txwriter.WriteAttributeString(\"gain\", this.GetGain(i).ToString());\n\t\t\t\txwriter.WriteAttributeString(\"delay\", this.GetDelay(i).ToString());\n\t\t\t\tFilterGenerator gen = this.GetSubfilter(i);\n\t\t\t\tgen.ToXml(xwriter);\n\t\t\t\txwriter.WriteEndElement();\n\t\t\t}\n\n\t\t\txwriter.WriteEndElement();\n\t\t}\n\n\t\tpublic override void FromXml(XmlElement elem)\n\t\t{\n\t\t\tforeach(XmlNode node in elem.ChildNodes)\n\t\t\t{\n\t\t\t\tif(node is XmlElement)\n\t\t\t\t{\n\t\t\t\t\tdouble gain = this.converter.ToPower(node.Attributes[\"gain\"].Value);\n\t\t\t\t\tint delay = int.Parse(node.Attributes[\"delay\"].Value);\n\t\t\t\t\tFilterGenerator gen = FilterGenerator.CreateFromXml((XmlElement)node.FirstChild, this.converter);\n\t\t\t\t\tthis.Add(gen, gain, delay);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic FilterGenerator GetSubfilter(int i)\n\t\t{\n\t\t\treturn (FilterGenerator)this.arrayProperties[0][i, 0];\n\t\t}\n\n\t\tpublic double GetGain(int i)\n\t\t{\n\t\t\treturn (double)this.arrayProperties[0][i, 1];\n\t\t}\n\n\t\tpublic int GetDelay(int i)\n\t\t{\n\t\t\treturn (int)this.arrayProperties[0][i, 2];\n\t\t}\n\n\t\tpublic void SetSubfilter(int i, FilterGenerator gen)\n\t\t{\n\t\t\tthis.arrayProperties[0][i, 0] = gen;\n\t\t}\n\n\t\tpublic int Length\n\t\t{\n\t\t\tget{return this.arrayProperties[0].ListLength;}\n\t\t}\n\n\t\tpublic void Add(FilterGenerator gen, double gain, int delay)\n\t\t{\n\t\t\tthis.arrayProperties[0].Add(gen, gain, delay);\n\t\t}\n\n\t\tpublic void Remove(int i)\n\t\t{\n\t\t\tthis.arrayProperties[0].Remove(i);\n\t\t}\n\t}//class DelayMixerGenerator\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Array.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics\n{\n\tusing Type = System.Double;\n\n\t/// <summary>\n\t/// Array の概要の説明です。\n\t/// </summary>\n\tpublic class Array\n\t{\n\t\t/// <summary>\n\t\t/// 配列を左右反転する。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">元の配列</param>\n\t\t/// <param name=\"y\">結果格納先</param>\n\t\tpublic static Type[] Reverse(Type[] x)\n\t\t{\n\t\t\tint len = x.Length;\n\t\t\tType[] y = new Type[len];\n\t\t\tfor(int i=0, j=len-1; i<len; ++i, --j)\n\t\t\t\ty[j] = x[i];\n\t\t\treturn y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列 x を右に delay だけずらす。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">元の配列</param>\n\t\t/// <param name=\"y\">結果格納先</param>\n\t\tpublic static void Delay(Type[] x, int delay, Type[] y)\n\t\t{\n\t\t\tint i = x.Length - 1;\n\t\t\tfor(; i>=delay; --i)\n\t\t\t\ty[i] = x[i - delay];\n\t\t\tfor(; i>=0; --i)\n\t\t\t\ty[i] = 0;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Complex.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics\n{\n\t/// <summary>\n\t/// 複素数。\n\t/// </summary>\n\tpublic struct Complex\n\t{\n\t\tdouble re; // 実部\n\t\tdouble im; // 虚部\n\n\t\t#region コンストラクタ・構築用メソッド\n\n\t\t/// <summary>\n\t\t/// 実部を指定して構築。\n\t\t/// </summary>\n\t\t/// <param name=\"re\">実部</param>\n\t\tpublic Complex(double re) : this(re, 0){}\n\n\t\t/// <summary>\n\t\t/// 実部、虚部を指定して構築。\n\t\t/// </summary>\n\t\t/// <param name=\"re\">実部</param>\n\t\t/// <param name=\"im\">虚部</param>\n\t\tpublic Complex(double re, double im)\n\t\t{\n\t\t\tthis.re = re;\n\t\t\tthis.im = im;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 偏角を指定して絶対値1の複素数を作成する。\n\t\t/// </summary>\n\t\t/// <param name=\"arg\">偏角</param>\n\t\t/// <returns>指定した偏角を持つ絶対値1の複素数</returns>\n\t\tpublic static Complex FromArg(double arg)\n\t\t{\n\t\t\tdouble re = Math.Cos(arg);\n\t\t\tdouble im = Math.Sin(arg);\n\t\t\treturn new Complex(re, im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 絶対と偏角を指定して複素数を作成する。\n\t\t/// </summary>\n\t\t/// <param name=\"abs\">絶対値</param>\n\t\t/// <param name=\"arg\">偏角</param>\n\t\t/// <returns>指定した絶対値と偏角を持つ複素数</returns>\n\t\tpublic static Complex FromPolar(double abs, double arg)\n\t\t{\n\t\t\tdouble re = abs * Math.Cos(arg);\n\t\t\tdouble im = abs * Math.Sin(arg);\n\t\t\treturn new Complex(re, im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パワーのdB値と偏角を指定して複素数を作成する。\n\t\t/// </summary>\n\t\t/// <param name=\"power\">パワーのdB値</param>\n\t\t/// <param name=\"arg\">偏角</param>\n\t\t/// <returns>指定した絶対値と偏角を持つ複素数</returns>\n\t\tpublic static Complex FromPowerPolar(double power, double arg)\n\t\t{\n\t\t\treturn Complex.FromPolar(Util.DBToLinear(power), arg);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// コピーコンストラクタ。\n\t\t/// </summary>\n\t\t/// <param name=\"z\">コピー元</param>\n\t\tpublic Complex(Complex z)\n\t\t{\n\t\t\tthis.re = z.re;\n\t\t\tthis.im = z.im;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// double → Complex の暗黙の方変換。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">double 値</param>\n\t\t/// <returns>x を Complex 化したもの</returns>\n\t\tpublic static implicit operator Complex(double x)\n\t\t{\n\t\t\treturn new Complex(x);\n\t\t}\n\n\t\t#endregion\n\t\t#region 実部・虚部\n\n\t\t/// <summary>\n\t\t/// 実部\n\t\t/// </summary>\n\t\tpublic double Re\n\t\t{\n\t\t\tset{this.re = value;}\n\t\t\tget{return this.re;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 虚部\n\t\t/// </summary>\n\t\tpublic double Im\n\t\t{\n\t\t\tset{this.im = value;}\n\t\t\tget{return this.im;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 実部と虚部を設定する。\n\t\t/// </summary>\n\t\t/// <param name=\"re\">実部</param>\n\t\t/// <param name=\"im\">虚部</param>\n\t\tpublic void SetCartesian(double re, double im)\n\t\t{\n\t\t\tthis.re = re;\n\t\t\tthis.im = im;\n\t\t}\n\n\t\t#endregion\n\t\t#region 絶対値・偏角\n\n\t\t/// <summary>\n\t\t/// 絶対と偏角を設定する。\n\t\t/// </summary>\n\t\t/// <param name=\"abs\">絶対値</param>\n\t\t/// <param name=\"arg\">偏角</param>\n\t\tpublic void SetPolar(double abs, double arg)\n\t\t{\n\t\t\tthis.re = abs * Math.Cos(arg);\n\t\t\tthis.im = abs * Math.Sin(arg);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 絶対(パワーのdB値で指定)と偏角を設定する。\n\t\t/// </summary>\n\t\t/// <param name=\"power\">パワーのdB値</param>\n\t\t/// <param name=\"arg\">偏角</param>\n\t\tpublic void SetPowerPolar(double power, double arg)\n\t\t{\n\t\t\tthis.SetPolar(Util.DBToLinear(power), arg);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 偏角を設定する(絶対値は1)。\n\t\t/// </summary>\n\t\t/// <param name=\"arg\">偏角</param>\n\t\tpublic void SetArg(double arg)\n\t\t{\n\t\t\tthis.re = Math.Cos(arg);\n\t\t\tthis.im = Math.Sin(arg);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パワー(絶対値の二乗)のリニア値。\n\t\t/// </summary>\n\t\tpublic double LinearPower\n\t\t{\n\t\t\tget{return this.re * this.re + this.im * this.im;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パワー(絶対値の二乗)の dB 値。\n\t\t/// </summary>\n\t\tpublic double Power\n\t\t{\n\t\t\tget{return 10 * Math.Log10(this.LinearPower);}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 絶対値\n\t\t/// </summary>\n\t\tpublic double Abs\n\t\t{\n\t\t\tget{return Math.Sqrt(this.LinearPower);}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 偏角\n\t\t/// </summary>\n\t\tpublic double Arg\n\t\t{\n\t\t\tget{return Math.Atan2(this.im, this.re);}\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算子・変換メソッド\n\n\t\t/// <summary>\n\t\t/// 共役複素数。\n\t\t/// </summary>\n\t\t/// <returns>this の共役</returns>\n\t\tpublic Complex Conjugate()\n\t\t{\n\t\t\treturn new Complex(this.re, -this.im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 逆数。\n\t\t/// </summary>\n\t\t/// <returns>this の逆数</returns>\n\t\tpublic Complex Invert()\n\t\t{\n\t\t\tdouble pow = this.LinearPower;\n\t\t\treturn new Complex(this.re/pow, -this.im/pow);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 単項+。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド</param>\n\t\t/// <returns>+a</returns>\n\t\tpublic static Complex operator+ (Complex a)\n\t\t{\n\t\t\treturn new Complex(a);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 単項-。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド</param>\n\t\t/// <returns>-a</returns>\n\t\tpublic static Complex operator- (Complex a)\n\t\t{\n\t\t\treturn new Complex(-a.re, -a.im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 加算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>加算結果</returns>\n\t\tpublic static Complex operator+ (Complex a, Complex b)\n\t\t{\n\t\t\tdouble re = a.re + b.re;\n\t\t\tdouble im = a.im + b.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t\tpublic static Complex operator+ (double a, Complex b)\n\t\t{\n\t\t\tdouble re = a + b.re;\n\t\t\tdouble im = b.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t\tpublic static Complex operator+ (Complex a, double b)\n\t\t{\n\t\t\tdouble re = a.re + b;\n\t\t\tdouble im = a.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 減算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>減算結果</returns>\n\t\tpublic static Complex operator- (Complex a, Complex b)\n\t\t{\n\t\t\tdouble re = a.re - b.re;\n\t\t\tdouble im = a.im - b.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t\tpublic static Complex operator- (double a, Complex b)\n\t\t{\n\t\t\tdouble re = a - b.re;\n\t\t\tdouble im = -b.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t\tpublic static Complex operator- (Complex a, double b)\n\t\t{\n\t\t\tdouble re = a.re - b;\n\t\t\tdouble im = a.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 乗算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>乗算結果</returns>\n\t\tpublic static Complex operator* (Complex a, Complex b)\n\t\t{\n\t\t\tdouble re = a.re * b.re - a.im * b.im;\n\t\t\tdouble im = a.im * b.re + a.re * b.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t\tpublic static Complex operator* (double a, Complex b)\n\t\t{\n\t\t\tdouble re = a * b.re;\n\t\t\tdouble im = a * b.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t\tpublic static Complex operator* (Complex a, double b)\n\t\t{\n\t\t\tdouble re = a.re * b;\n\t\t\tdouble im = a.im * b;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 除算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>除算結果</returns>\n\t\tpublic static Complex operator/ (Complex a, Complex b)\n\t\t{\n\t\t\treturn a * b.Invert();\n\t\t}\n\t\tpublic static Complex operator/ (double a, Complex b)\n\t\t{\n\t\t\treturn a * b.Invert();\n\t\t}\n\t\tpublic static Complex operator/ (Complex a, double b)\n\t\t{\n\t\t\tdouble re = a.re / b;\n\t\t\tdouble im = a.im / b;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 等値判定。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>判定結果</returns>\n\t\tpublic static bool operator== (Complex a, Complex b)\n\t\t{\n\t\t\treturn a.re == b.re && a.im == b.im;\n\t\t}\n\t\tpublic static bool operator== (Complex a, double b)\n\t\t{\n\t\t\treturn a.re == b && a.im == 0;\n\t\t}\n\t\tpublic static bool operator== (double a, Complex b)\n\t\t{\n\t\t\treturn a == b.re && 0 == b.im;\n\t\t}\n\n\t\tpublic static bool operator!= (Complex a, Complex b)\n\t\t{\n\t\t\treturn a.re != b.re || a.im != b.im;\n\t\t}\n\t\tpublic static bool operator!= (Complex a, double b)\n\t\t{\n\t\t\treturn a.re != b || a.im != 0;\n\t\t}\n\t\tpublic static bool operator!= (double a, Complex b)\n\t\t{\n\t\t\treturn a != b.re || 0 != b.im;\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tComplex c = (Complex)obj;\n\t\t\treturn this.re.Equals(c.re) && this.im.Equals(c.im);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn this.re.GetHashCode() ^ this.im.GetHashCode();\n\t\t}\n\n\t\t#endregion\n\t\t#region string 文字列化\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn string.Format(\"({0}, {1})\", this.re, this.Im);\n\t\t}\n\t\t#endregion\n\t}//class Complex\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/ComplexMath.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics\n{\n\t/// <summary>\n\t/// Math 関数の複素数化。\n\t/// </summary>\n\t/* static */\n\tpublic class ComplexMath\n\t{\n\t\tpublic static Complex ExpI(double y)\n\t\t{\n\t\t\treturn new Complex(Math.Cos(y), Math.Sin(y));\n\t\t}\n\n\t\tpublic static Complex Exp(Complex z)\n\t\t{\n\t\t\treturn Math.Exp(z.Re) * ExpI(z.Im);\n\t\t}\n\n\t\tpublic static Complex Log(Complex z)\n\t\t{\n\t\t\treturn new Complex(Math.Log(z.Abs), z.Arg);\n\t\t}\n\n\t\tstatic readonly double LOG10 = Math.Log(10);\n\n\t\tpublic static Complex Log10(Complex z)\n\t\t{\n\t\t\treturn LOG10 * Log(z);\n\t\t}\n\n\t\tpublic static Complex Pow(Complex a, Complex z)\n\t\t{\n\t\t\treturn Exp(Log(a) * z);\n\t\t}\n\n\t\tpublic static Complex Log(Complex a, Complex z)\n\t\t{\n\t\t\treturn Log(z) / Log(a);\n\t\t}\n\n\t\tpublic static Complex Sin(Complex z)\n\t\t{\n\t\t\treturn new Complex(\n\t\t\t\tMath.Sin(z.Re) * Math.Cosh(z.Im),\n\t\t\t\tMath.Cos(z.Re) * Math.Sinh(z.Im));\n\t\t}\n\n\t\tpublic static Complex Cos(Complex z)\n\t\t{\n\t\t\treturn new Complex(\n\t\t\t\tMath.Cos(z.Re) * Math.Cosh(z.Im),\n\t\t\t\t-Math.Sin(z.Re) * Math.Sinh(z.Im));\n\t\t}\n\n\t\tpublic static Complex Tan(Complex z)\n\t\t{\n\t\t\tdouble x = Math.Tan(z.Re);\n\t\t\tdouble y = Math.Tanh(z.Im);\n\n\t\t\treturn new Complex(x, y) / new Complex(1, -x * y);\n\t\t}\n\n\t\tpublic static Complex Sinh(Complex z)\n\t\t{\n\t\t\treturn new Complex(\n\t\t\t\tMath.Cos(z.Im) * Math.Sinh(z.Re),\n\t\t\t\tMath.Sin(z.Im) * Math.Cosh(z.Re));\n\t\t}\n\n\t\tpublic static Complex Cosh(Complex z)\n\t\t{\n\t\t\treturn new Complex(\n\t\t\t\tMath.Cos(z.Im) * Math.Cosh(z.Re),\n\t\t\t\tMath.Sin(z.Im) * Math.Sinh(z.Re));\n\t\t}\n\n\t\tpublic static Complex Tanh(Complex z)\n\t\t{\n\t\t\tdouble x = Math.Tanh(z.Re);\n\t\t\tdouble y = Math.Tan(z.Im);\n\n\t\t\treturn new Complex(x, y) / new Complex(1, x * y);\n\t\t}\n\n\t\t/*\n\t\tpublic static Complex Asin(Complex z){return 0;}\n\t\tpublic static Complex Acos(Complex z){return 0;}\n\t\tpublic static Complex Atan(Complex z){return 0;}\n\t\t*/\n\n\t\tpublic static Complex Sqrt(Complex z)\n\t\t{\n\t\t\tdouble abs = Math.Sqrt(z.Abs);\n\t\t\tdouble arg = z.Arg / 2;\n\n\t\t\treturn Complex.FromPolar(abs, arg);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Constant.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics\n{\n\t/// <summary>\n\t/// Constant の概要の説明です。\n\t/// </summary>\n\tpublic /*static*/ class Constant\n\t{\n\t\tpublic const double Epsilon = 1.38777878078144567553E-17; // 2^(-56);\n\t\tpublic const double PI2 = Math.PI / 2;\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Continuous/Function.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Continuous\n{\n\tusing Type = System.Double;\n\n\t/// <summary>\n\t/// 連続関数を表すクラス。\n\t/// </summary>\n\tpublic abstract class Function\n\t{\n\t\t/// <summary>\n\t\t/// 関数値 f(t) を計算。\n\t\t/// </summary>\n\t\tpublic abstract Type this[double t]\n\t\t{\n\t\t\tget;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Continuous/Range.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Continuous\n{\n\t/// <summary>\n\t/// 定義域の範囲を表す構造体。\n\t/// </summary>\n\tpublic struct Range\n\t{\n\t\tbool hasMin;\n\t\tbool hasMax;\n\t\tdouble inf;\n\t\tdouble sup;\n\n\t\t/// <summary>\n\t\t/// 最小・最大値の有無、上限・下限を指定して初期化。\n\t\t/// 例:\n\t\t/// (1, 2] → new Range(false, true, 1, 2)、\n\t\t/// [0, 1] → new Range(true, true, 0, 1)\n\t\t/// </summary>\n\t\t/// <param name=\"hasMin\"></param>\n\t\t/// <param name=\"hasMax\"></param>\n\t\t/// <param name=\"inf\"></param>\n\t\t/// <param name=\"sup\"></param>\n\t\tpublic Range(bool hasMin, bool hasMax, double inf, double sup)\n\t\t{\n\t\t\tthis.hasMax = hasMax;\n\t\t\tthis.hasMin = hasMin;\n\t\t\tthis.sup = sup;\n\t\t\tthis.inf = inf;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 最大値を持つかどうか。\n\t\t/// </summary>\n\t\tpublic bool HasMaximum\n\t\t{\n\t\t\tget{return this.hasMax;}\n\t\t\tset{this.hasMax = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 最小値を持つかどうか。\n\t\t/// </summary>\n\t\tpublic bool HasMinimum\n\t\t{\n\t\t\tget{return this.hasMin;}\n\t\t\tset{this.hasMin = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 上限。\n\t\t/// </summary>\n\t\tpublic double Supremum\n\t\t{\n\t\t\tget{return this.sup;}\n\t\t\tset{this.sup = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 下限。\n\t\t/// </summary>\n\t\tpublic double Infimum\n\t\t{\n\t\t\tget{return this.inf;}\n\t\t\tset{this.inf = value;}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Discrete/CircularConvolution.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace SoundLibrary.Mathematics.Discrete\n{\n\tusing Type = System.Double;\n\n\t/// <summary>\n\t/// 配列 x と配列 y の循環畳込みを求める。\n\t/// </summary>\n\tpublic class CircularConvolution : Function\n\t{\n\t\tType[] x;\n\t\tType[] y;\n\n\t\tpublic CircularConvolution(Type[] x, Type[] y)\n\t\t{\n\t\t\tif(x.Length != y.Length)\n\t\t\t\tthrow new ArgumentException(\"x と y の長さは等しくなければなりません。\");\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t}\n\n\t\tpublic override int Begin\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\n\t\tpublic override int End\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.Length;\n\t\t\t}\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.x.Length;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環畳込み C[n] = Σ_i x[i]y[n-i] を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">C[n] の n</param>\n\t\t/// <returns>循環畳込み結果</returns>\n\t\tpublic override Type this[int n]\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tint len = this.x.Length;\n\t\t\t\tType val = 0;\n\n\t\t\t\tint i=0;\n\t\t\t\tfor(int j=n-1; i<n; ++i, --j)\n\t\t\t\t{\n\t\t\t\t\tval += x[i] * y[j];\n\t\t\t\t}\n\t\t\t\tfor(int j=len-1; i<len; ++i, --j)\n\t\t\t\t{\n\t\t\t\t\tval += x[i] * y[j];\n\t\t\t\t}\n\n\t\t\t\treturn val;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Discrete/CircularCorrelation.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace SoundLibrary.Mathematics.Discrete\n{\n\tusing Type = System.Double;\n\n\t/// <summary>\n\t/// 配列 x と配列 y の循環相互相関値を求める。\n\t/// </summary>\n\tpublic class CircularCorrelation : Function\n\t{\n\t\tType[] x;\n\t\tType[] y;\n\n\t\tpublic CircularCorrelation(Type[] x, Type[] y)\n\t\t{\n\t\t\tif(x.Length != y.Length)\n\t\t\t\tthrow new ArgumentException(\"x と y の長さは等しくなければなりません。\");\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t}\n\n\t\tpublic override int Begin\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\n\t\tpublic override int End\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.x.Length;\n\t\t\t}\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.x.Length;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 相互相関値 C[n] = Σ_i x[i]y[i-n] を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">C[n] の n</param>\n\t\t/// <returns>相互相関値</returns>\n\t\tpublic override Type this[int n]\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tint len = this.x.Length;\n\t\t\t\tType val = 0;\n\n\t\t\t\tint i=0;\n\t\t\t\tfor(int j=n; j<len; ++i, ++j)\n\t\t\t\t{\n\t\t\t\t\tval += x[i] * y[j];\n\t\t\t\t}\n\t\t\t\tfor(int j=0; i<len; ++i, ++j)\n\t\t\t\t{\n\t\t\t\t\tval += x[i] * y[j];\n\t\t\t\t}\n\n\t\t\t\treturn val;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Discrete/Convolution.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace SoundLibrary.Mathematics.Discrete\n{\n\tusing Type = System.Double;\n\n\t/// <summary>\n\t/// 配列 x と配列 y の畳込みを求める。\n\t/// </summary>\n\tpublic class Convolution : Function\n\t{\n\t\tType[] x;\n\t\tType[] y;\n\n\t\tpublic Convolution(Type[] x, Type[] y)\n\t\t{\n\t\t\tif(x.Length != y.Length)\n\t\t\t\tthrow new ArgumentException(\"x と y の長さは等しくなければなりません。\");\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t}\n\n\t\tpublic override int Begin\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\n\t\tpublic override int End\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.Length;\n\t\t\t}\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn 2 * this.x.Length - 1;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 畳込み C[n] = Σ_i x[i]y[n-i] を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">C[n] の n</param>\n\t\t/// <returns>畳込み結果</returns>\n\t\tpublic override Type this[int n]\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tint len = this.x.Length;\n\t\t\t\tType val = 0;\n\t\t\t\tif(n < len)\n\t\t\t\t{\n\t\t\t\t\tfor(int i=0, j=n; i<=n; ++i, --j)\n\t\t\t\t\t{\n\t\t\t\t\t\tval += x[i] * y[j];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor(int i=n-(len-1), j=len-1; i<len; ++i, --j)\n\t\t\t\t\t{\n\t\t\t\t\t\tval += x[i] * y[j];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn val;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Discrete/Correlation.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace SoundLibrary.Mathematics.Discrete\n{\n\tusing Type = System.Double;\n\n\t/// <summary>\n\t/// 配列 x と配列 y の相互相関値を求める。\n\t/// </summary>\n\tpublic class Correlation : Function\n\t{\n\t\tType[] x;\n\t\tType[] y;\n\n\t\tpublic Correlation(Type[] x, Type[] y)\n\t\t{\n\t\t\tif(x.Length != y.Length)\n\t\t\t\tthrow new ArgumentException(\"x と y の長さは等しくなければなりません。\");\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t}\n\n\t\tpublic override int Begin\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn -(this.x.Length - 1);\n\t\t\t}\n\t\t}\n\n\t\tpublic override int End\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.x.Length;\n\t\t\t}\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn 2 * this.x.Length - 1;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 相互相関値 C[n] = Σ_i x[i]y[i-n] を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">C[n] の n</param>\n\t\t/// <returns>相互相関値</returns>\n\t\tpublic override Type this[int n]\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tint len = this.x.Length;\n\t\t\t\tType val = 0;\n\t\t\t\tif(n < 0)\n\t\t\t\t{\n\t\t\t\t\tfor(int i=0, j=-n; j<len; ++i, ++j)\n\t\t\t\t\t{\n\t\t\t\t\t\tval += x[i] * y[j];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tfor(int i=n, j=0; i<len; ++i, ++j)\n\t\t\t\t\t{\n\t\t\t\t\t\tval += x[i] * y[j];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn val;\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Discrete/Differential.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Discrete\n{\n\tusing Type = System.Double;\n\n\t/// <summary>\n\t/// 導関数。\n\t/// </summary>\n\tpublic class Differential : Function\n\t{\n\t\tFunction primitive;\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"primitive\">原始関数</param>\n\t\tpublic Differential(Function primitive)\n\t\t{\n\t\t\tthis.primitive = primitive;\n\t\t}\n\n\t\tpublic override int Begin\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.primitive.Begin;\n\t\t\t}\n\t\t}\n\n\t\tpublic override int End\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.primitive.End;\n\t\t\t}\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.primitive.Length;\n\t\t\t}\n\t\t}\n\n\t\tpublic override Type this[int n]\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tif(n == this.primitive.Begin    ) return ForwardDifference(this.primitive, n);\n\t\t\t\tif(n == this.primitive.Begin + 1) return Diffrential3(this.primitive, n);\n\t\t\t\tif(n == this.primitive.End - 2  ) return Diffrential3(this.primitive, n);\n\t\t\t\tif(n == this.primitive.End - 1  ) return BackwardDifference(this.primitive, n);\n\t\t\t\treturn Diffrential5(this.primitive, n);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 前進差分近似で微分。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">微分対象</param>\n\t\t/// <param name=\"i\">位置</param>\n\t\t/// <returns>微分結果</returns>\n\t\tpublic static Type ForwardDifference(Function f, int i)\n\t\t{\n\t\t\treturn f[i+1] - f[i];\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 後退差分近似で微分。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">微分対象</param>\n\t\t/// <param name=\"i\">位置</param>\n\t\t/// <returns>微分結果</returns>\n\t\tpublic static Type BackwardDifference(Function f, int i)\n\t\t{\n\t\t\treturn f[i] - f[i-1];\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 3点近似で微分。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">微分対象</param>\n\t\t/// <param name=\"i\">位置</param>\n\t\t/// <returns>微分結果</returns>\n\t\tpublic static Type Diffrential3(Function f, int i)\n\t\t{\n\t\t\treturn (f[i+1] - f[i-1]) / 2;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 5点近似で微分。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">微分対象</param>\n\t\t/// <param name=\"i\">位置</param>\n\t\t/// <returns>微分結果</returns>\n\t\tpublic static Type Diffrential5(Function f, int i)\n\t\t{\n\t\t\treturn (-f[i+2] + 8 * f[i+1] - 8 * f[i-1] + f[i-2]) / 12;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列を関数に見立てて微分。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">微分対象</param>\n\t\t/// <returns>微分結果</returns>\n\t\tpublic static Type[] Derive(Type[] x)\n\t\t{\n\t\t\tType[] y = new Type[x.Length];\n\t\t\tDifferential dx = new Differential(Function.FromArray(x));\n\t\t\tfor(int i=0; i<y.Length; ++i)\n\t\t\t{\n\t\t\t\ty[i] = dx[i];\n\t\t\t}\n\t\t\treturn y;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Discrete/Function.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Discrete\n{\n\tusing Type = System.Double;\n\n\t/// <summary>\n\t/// 離散関数を表すクラス。\n\t/// </summary>\n\tabstract public class Function\n\t{\n\t\t/// <summary>\n\t\t/// 定義域の下限。\n\t\t/// </summary>\n\t\tpublic abstract int Begin{get;}\n\n\t\t/// <summary>\n\t\t/// 定義域の上限 + 1。\n\t\t/// </summary>\n\t\tpublic abstract int End{get;}\n\n\t\t/// <summary>\n\t\t/// 定義域の長さ。\n\t\t/// </summary>\n\t\tpublic abstract int Length{get;}\n\n\t\t/// <summary>\n\t\t/// f[n] を求める。\n\t\t/// </summary>\n\t\tpublic abstract Type this[int n]{get;}\n\n\t\t/// <summary>\n\t\t/// 配列化。\n\t\t/// </summary>\n\t\t/// <returns>配列化したもの</returns>\n\t\tpublic virtual Type[] ToArray()\n\t\t{\n\t\t\tType[] x = new Type[this.Length];\n\n\t\t\tfor(int i=this.Begin; i<this.End; ++i)\n\t\t\t{\n\t\t\t\tx[i] = this[i];\n\t\t\t}\n\t\t\treturn x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// func の値を最大にする引数の値を返す。\n\t\t/// </summary>\n\t\t/// <param name=\"func\">argmax を求めたい関数。</param>\n\t\t/// <returns>argmax 値</returns>\n\t\tpublic static int Argmax(Function func)\n\t\t{\n\t\t\treturn Argmax(func, func.Begin, func.End);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// func の値を最大にする引数の値を返す。\n\t\t/// </summary>\n\t\t/// <param name=\"func\">argmax を求めたい関数。</param>\n\t\t/// <param name=\"min\">引数の範囲の最小値</param>\n\t\t/// <param name=\"max\">引数の範囲の最大値</param>\n\t\t/// <returns>argmax 値</returns>\n\t\tpublic static int Argmax(Function func, int min, int max)\n\t\t{\n\t\t\tdouble maxVal = func[min];\n\t\t\tint argmax = min;\n\n\t\t\tfor(int i=min+1; i<max; ++i)\n\t\t\t{\n\t\t\t\tdouble val = func[i];\n\t\t\t\tif(val > maxVal)\n\t\t\t\t{\n\t\t\t\t\tmaxVal = val;\n\t\t\t\t\targmax = i;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn argmax;\n\t\t}\n\n\t\t#region Type[] を Function として扱うためのラッパー\n\t\t/// <summary>\n\t\t/// 配列の値をそのまま返す関数。\n\t\t/// </summary>\n\t\tclass Array : Function\n\t\t{\n\t\t\tType[] array;\n\t\t\tinternal Array(Type[] array){this.array = array;}\n\t\t\tpublic override int Begin{get{return 0;}}\n\t\t\tpublic override int End{get{return this.array.Length;}}\n\t\t\tpublic override int Length{get{return this.array.Length;}}\n\t\t\tpublic override Double this[int n]{get{return this.array[n];}}\n\t\t\tpublic override Double[] ToArray(){return this.array;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列の値をそのまま返す関数を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"array\">配列</param>\n\t\t/// <returns>配列の値をそのまま返す関数</returns>\n\t\tpublic static Function FromArray(Type[] array)\n\t\t{\n\t\t\treturn new Array(array);\n\t\t}\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Elliptic.cs",
    "content": "﻿/* ↓ここにあるソースを参考にしてます。\n *  http://www.ldas-sw.ligo.caltech.edu/cgi-bin/cvsweb.cgi/?cvsroot=GDS#dirlist\n */\n\n//! テストまだ。テストコードを書く。\n\nusing System;\n\nnamespace SoundLibrary.Mathematics\n{\n\t/// <summary>\n\t/// 楕円積分/楕円関数関連の static メソッド群を定義。\n\t/// </summary>\n\t/// <remarks>\n\t/// u = ∫ dφ/Δ(φ)\n\t/// Δ(φ) = √(1 - k^2 sin^2 φ)\n\t/// z = sn u = sin φ\n\t/// cn u = cos φ\n\t/// dn = √（1 - k^2 sn^2）\n\t/// </remarks>\n\t/*static*/\n\tpublic class Elliptic\n\t{\n\t\tconst double EPSILON = 1.11022302462515654042E-16;\n\n\t\t#region 楕円関数\n\n\t\t/// <summary>\n\t\t/// 楕円積分の引数 u から振幅φを求める。\n\t\t/// </summary>\n\t\t/// <param name=\"u\">引数 u</param>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>振幅φ</returns>\n\t\tpublic static double Phi(double u, double m)\n\t\t{\n\t\t\tif(m < 0.0 || m > 1.0) return double.NaN;\n\n\t\t\tdouble t;\n\t\t\tdouble b;\n\n\t\t\tif(m < EPSILON)\n\t\t\t{\n\t\t\t\tt = Math.Sin(u);\n\t\t\t\tb = Math.Cos(u);\n\t\t\t\tdouble ai = 0.25 * m * (u - t*b);\n\n\t\t\t\treturn u - ai;\n\t\t\t}\n\n\t\t\tdouble twon;\n   \n\t\t\tif(m >= 1 - EPSILON)\n\t\t\t{\n\t\t\t\tdouble ai = 0.25 * (1.0-m);\n\t\t\t\tb = Math.Cosh(u);\n\t\t\t\tt = Math.Tanh(u);\n\t\t\t\ttwon =  b * Math.Sinh(u);\n\n\t\t\t\treturn 2.0*Math.Atan(Math.Exp(u)) - Constant.PI2 + ai * (twon - u) / b;\n\t\t\t}\n   \n\t\t\tconst int MAX = 10;\n\t\t\tdouble[] a = new double[MAX], c = new double[MAX];\n   \n\t\t\tb = Math.Sqrt(1.0 - m);\n\t\t\ttwon = 1.0;\n\t\t\ta[0] = 1.0;\n\t\t\tc[0] = Math.Sqrt(m);\n\t\t\tint i = 0;\n   \n\t\t\twhile( Math.Abs(c[i]/a[i]) > EPSILON)\n\t\t\t{\n\t\t\t\tif(i >= MAX - 1)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdouble ai = a[i];\n\t\t\t\t++i;\n\t\t\t\tc[i] = ( ai - b )/2.0;\n\t\t\t\tt = Math.Sqrt( ai * b );\n\t\t\t\ta[i] = ( ai + b )/2.0;\n\t\t\t\tb = t;\n\t\t\t\ttwon *= 2.0;\n\t\t\t}\n   \n\t\t\t/* backward recurrence */\n\t\t\tdouble phi = twon * a[i] * u;\n\n\t\t\tfor(; i != 0; --i)\n\t\t\t{\n\t\t\t\tt = c[i] * Math.Sin(phi) / a[i];\n\t\t\t\tphi = (Math.Asin(t) + phi)/2.0;\n\t\t\t}\n\n\t\t\treturn phi;\n\t\t}\n\n\t\t#region Jacobi の楕円関数\n\n\t\t/// <summary>\n\t\t/// Jacobi の楕円関数 sn u を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"u\">引数 u</param>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>sn(u, k)</returns>\n\t\tpublic static double Sn(double u, double m)\n\t\t{\n\t\t\tif(m < 0.0 || m > 1.0) return double.NaN;\n\n\t\t\treturn Math.Sin(Elliptic.Phi(u, m));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Jacobi の楕円関数 cn u を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"u\">引数 u</param>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>cn(u, k)</returns>\n\t\tpublic static double Cn(double u, double m)\n\t\t{\n\t\t\tif(m < 0.0 || m > 1.0) return double.NaN;\n\n\t\t\treturn Math.Cos(Elliptic.Phi(u, m));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Jacobi の楕円関数 dn u を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"u\">引数 u</param>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>dn(u, k)</returns>\n\t\tpublic static double Dn(double u, double m)\n\t\t{\n\t\t\tif(m < 0.0 || m > 1.0) return double.NaN;\n\n\t\t\tdouble sn = Elliptic.Sn(u, m);\n\t\t\treturn Math.Sqrt(1 - m * sn * sn);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Jacobi の楕円関数(振幅φから sn, cn, dn)を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"phi\">振幅φ</param>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <param name=\"sn\">sn(u, k)</param>\n\t\t/// <param name=\"cn\">cn(u, k)</param>\n\t\t/// <param name=\"dn\">dn(u, k)</param>\n\t\tpublic static void Jacobi(double phi, double m, out double sn, out double cn, out double dn)\n\t\t{\n\t\t\tif(double.IsNaN(m) || m < 0.0 || m > 1.0)\n\t\t\t{\n\t\t\t\tsn = double.NaN;\n\t\t\t\tcn = double.NaN;\n\t\t\t\tdn = double.NaN;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsn  = Math.Sin(phi);\n\t\t\tcn  = Math.Cos(phi);\n\t\t\tdn  = Math.Sqrt(1 - m * sn * sn);;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Jacobi の楕円関数(引数 u と率 k から振幅φおよび sn, cn, dn)を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"u\">引数 u</param>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <param name=\"phi\">振幅φ</param>\n\t\t/// <param name=\"sn\">sn(u, k)</param>\n\t\t/// <param name=\"cn\">cn(u, k)</param>\n\t\t/// <param name=\"dn\">dn(u, k)</param>\n\t\tpublic static void Jacobi(double u, double m, out double phi, out double sn, out double cn, out double dn)\n\t\t{\n\t\t\tif(m < 0.0 || m > 1.0)\n\t\t\t{\n\t\t\t\tphi = double.NaN;\n\t\t\t\tsn  = double.NaN;\n\t\t\t\tcn  = double.NaN;\n\t\t\t\tdn  = double.NaN;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif(m < EPSILON)\n\t\t\t{\n\t\t\t\tdouble t = Math.Sin(u);\n\t\t\t\tdouble b = Math.Cos(u);\n\t\t\t\tdouble ai = 0.25 * m * (u - t*b);\n\n\t\t\t\tphi = u - ai;\n\t\t\t\tsn  = t - ai*b;\n\t\t\t\tcn  = b + ai*t;\n\t\t\t\tdn  = 1.0 - 0.5*m*t*t;\n\t\t\t\treturn;\n\t\t\t}\n \n\t\t\tif(m >= 1 - EPSILON)\n\t\t\t{\n\t\t\t\tdouble ai = 0.25 * (1.0-m);\n\t\t\t\tdouble b = Math.Cosh(u);\n\t\t\t\tdouble t = Math.Tanh(u);\n\t\t\t\tdouble binv = 1.0/b;\n\t\t\t\tdouble twon =  b * Math.Sinh(u);\n\n\t\t\t\tphi = 2.0*Math.Atan(Math.Exp(u)) - Constant.PI2 + ai*(twon - u)/b;\n\t\t\t\tsn  = t + ai * (twon - u)/(b*b);\n\t\t\t\tai *= t * phi;\n\t\t\t\tcn  = binv - ai * (twon - u);\n\t\t\t\tdn  = binv + ai * (twon + u);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tphi = Elliptic.Phi(u, m);\n\t\t\tElliptic.Jacobi(phi, m, out sn, out cn, out dn);\n\t\t}\n\n\t\t#endregion\n\t\t#region Jacobi の楕円関数の逆関数\n\n#if false\n\n\t\t/// <summary>\n\t\t/// Jacobi の逆楕円関数 u = sn^-1 v の逆を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"v\">引数 v</param>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>sn(u, k)</returns>\n\t\tpublic static double InverseSn(double v, double m)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\t// InverseCn\n\t\t// InverseDn\n\n#endif\n\n\t\t#endregion\n\t\t#region テータ関数\n\n#if false\n\t\t/// <summary>\n\t\t/// 楕円テータ関数θ_a(q, u) (a = 1, 2, 3, 4)を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">θ_a の a</param>\n\t\t/// <param name=\"u\">引数 u</param>\n\t\t/// <param name=\"q\">パラメータ q</param>\n\t\t/// <returns></returns>\n\t\tpublic static double Theta(int a, double u, double q)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 楕円テータ関数θ_a(q, u) (a = 1, 2, 3, 4)の導関数を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">θ_a の a</param>\n\t\t/// <param name=\"u\">引数 u</param>\n\t\t/// <param name=\"q\">パラメータ q</param>\n\t\t/// <returns></returns>\n\t\tpublic static double ThetaPrime(int a, double u, double q)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\n\t\t// WeierstrassP\n\t\t// WeierstrassSigma\n\t\t// WeierstrassZeta\n#endif\n\n\t\t#endregion\n\t\t#region ノーム\n\n#if false\n\t\t/// <summary>\n\t\t/// ノーム q(m) を計算する。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>ノーム q(m)</returns>\n\t\t/// <remarks>\n\t\t/// ノーム q(m) = exp( - pi K(1-m)/K(m) )\n\t\t/// </remarks>\n\t\tpublic double Q(double m)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n#endif\n\n\t\t/// <summary>\n\t\t/// ノーム q(m) の逆を計算する。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>ノームの逆 m(q)</returns>\n\t\tpublic static double InverseQ(double q)\n\t\t{\n\t\t\tdouble t1, t2;\n\n\t\t\tdouble a = 1.0; // Theta3(0,q)\n\t\t\tdouble b = 1.0; // Theta2(0,q)/(2 q^(1/4))\n\t\t\tdouble r = 1.0;\n\t\t\tdouble p = q;\n\n\t\t\tdo\n\t\t\t{\n\t\t\t\tr *= p;\n\t\t\t\ta += 2.0 * r;\n\t\t\t\tt1 = Math.Abs( r/a );\n\n\t\t\t\tr *= p;\n\t\t\t\tb += r;\n\t\t\t\tp *= q;\n\t\t\t\tt2 = Math.Abs( r/b );\n      \n\t\t\t}\n\t\t\twhile(t1 > EPSILON || t2 > EPSILON);\n\n\t\t\tb /= a;\n\t\t\tb *= b;\n\t\t\tb *= b; // b = (b / a)^4\n\n\t\t\treturn 16.0 * q * b;\n\t\t}\n\n\t\t#endregion\n\n\t\t#endregion\n\t\t#region 楕円積分\n\n\t\t/// <summary>\n\t\t/// 第1種完全楕円積分。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>積分値</returns>\n\t\tpublic static double K(double m)\n\t\t{\n\t\t\tif(m < 0.0 || m >= 1.0) \n\t\t\t{\n\t\t\t\treturn double.NaN;\n\t\t\t}\n\n\t\t\tif(m == 0) \n\t\t\t{\n\t\t\t\treturn Math.PI / 2;\n\t\t\t}\n   \n\t\t\tdouble a0 = 1, a1 = 1;\n\t\t\tdouble b0 = Math.Sqrt( 1 - m );\n\t\t\tdouble s0 = m;\n\t\t\tdouble mm = 1;\n\t\t\tint i = 0;\n\t\t\tdouble pow2i = 1;\n   \n\t\t\twhile(mm > EPSILON) \n\t\t\t{\n\t\t\t\ta1 = (a0 + b0) / 2;\n\t\t\t\tdouble b1 = Math.Sqrt(a0 * b0);\n\t\t\t\tdouble c1 = (a0 - b0) / 2;\n\t\t\t\t++i;\n\t\t\t\tpow2i *= 2;\n\t\t\t\tdouble w1 = pow2i * c1 * c1;\n\t\t\t\tmm = w1;\n      \n\t\t\t\ts0 += w1;\n\t\t\t\ta0 = a1;\n\t\t\t\tb0 = b1;\n\t\t\t}\n   \n\t\t\treturn Math.PI / 2 / a1;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 第1種不完全楕円積分。\n\t\t/// </summary>\n\t\t/// <param name=\"phi\">振幅φ</param>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>積分値</returns>\n\t\tpublic static double F(double phi, double m)\n\t\t{\n\t\t\tif(m == 0.0)\n\t\t\t\treturn phi;\n   \n\t\t\tif(m == 1.0)\n\t\t\t{\n\t\t\t\tif(Math.Abs(phi) >= Math.PI / 2)\n\t\t\t\t{\n\t\t\t\t\treturn double.NaN;\n\t\t\t\t}\n\t\t\t\treturn Math.Log(Math.Tan((Math.PI / 2 + phi) / 2.0));\n\t\t\t}\n   \n\t\t\tint npio2 = (int)Math.Floor(phi / (Math.PI / 2));\n\t\t\tif((npio2 & 1) != 0)\n\t\t\t\t++npio2;\n   \n\t\t\tdouble K = npio2 == 0 ? Elliptic.K(1.0 - m) : 0.0;\n   \n\t\t\tphi -= npio2 * Math.PI / 2;\n\t\t\tint sign = phi < 0.0 ? -1 : 1;\n\t\t\tphi = Math.Abs(phi);\n   \n\t\t\tdouble t = Math.Tan(phi);\n\t\t\tif(Math.Abs(t) > 10.0)\n\t\t\t{\n\t\t\t\t/* Transform the amplitude */\n\t\t\t\tdouble e = 1.0 / (Math.Sqrt(1.0 - m) * t);\n\t\t\t\t/* ... but avoid multiple recursions.  */\n\t\t\t\tif(Math.Abs(e) < 10.0)\n\t\t\t\t{\n\t\t\t\t\tif(npio2 == 0)\n\t\t\t\t\t\tK = Elliptic.K(1.0 - m);\n\t\t\t\t\tdouble ret = K - Elliptic.F(Math.Atan(e), m);\n\t\t\t\t\treturn sign * ret + npio2 * K;\n\t\t\t\t}\n\t\t\t}\n   \n\t\t\tdouble a = 1.0;\n\t\t\tdouble b = Math.Sqrt(1.0 - m);\n\t\t\tdouble c = Math.Sqrt(m);\n\t\t\tint d = 1;\n\t\t\tint mod = 0;\n\t\t\twhile(Math.Abs(c/a) > EPSILON)\n\t\t\t{\n\t\t\t\tdouble tmp = b/a;\n\t\t\t\tphi = phi + (Math.Atan(t * tmp) + mod * Math.PI);\n\t\t\t\tmod = (int)((phi + Math.PI / 2) / Math.PI);\n\t\t\t\tt = t * (1.0 + tmp) / (1.0 - tmp * t * t);\n\t\t\t\tc = (a - b) / 2.0;\n\t\t\t\ttmp = Math.Sqrt(a * b);\n\t\t\t\ta = (a + b) / 2.0;\n\t\t\t\tb = tmp;\n\t\t\t\td += d;\n\t\t\t}\n   \n\t\t\treturn sign * (Math.Atan(t) + mod * Math.PI) / (d * a) + npio2 * K;\n\t\t}\n\n#if false\n\t\t/// <summary>\n\t\t/// 第2種完全楕円積分。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>積分値</returns>\n\t\tpublic static double E(double m)\n\t\t{\n\t\t\t//!\n\t\t\treturn 0;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 第2種不完全楕円積分。\n\t\t/// </summary>\n\t\t/// <param name=\"phi\">振幅φ</param>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>積分値</returns>\n\t\tpublic static double E(double phi, double m)\n\t\t{\n\t\t\t//!\n\t\t\treturn 0;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 第3種完全楕円積分。\n\t\t/// </summary>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>積分値</returns>\n\t\tpublic static double Pi(double n, double m)\n\t\t{\n\t\t\t//!\n\t\t\treturn 0;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 第3種不完全楕円積分。\n\t\t/// </summary>\n\t\t/// <param name=\"phi\">振幅φ</param>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>積分値</returns>\n\t\tpublic static double Pi(double phi, double n, double m)\n\t\t{\n\t\t\t//!\n\t\t\treturn 0;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Jacobi のゼータ関数。\n\t\t/// </summary>\n\t\t/// <param name=\"phi\">振幅φ</param>\n\t\t/// <param name=\"m\">率 k の2乗</param>\n\t\t/// <returns>積分値</returns>\n\t\tpublic static double JacobiZeta(double phi, double m)\n\t\t{\n\t\t\t//!\n\t\t\treturn 0;\n\t\t}\n#endif\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Expression/Polynomial.cs",
    "content": "﻿using System;\n\n//! todo\n/*\n * 差、単項-、畳み込み (operator)\n * 微分・積分\n * http://www5.airnet.ne.jp/tomy/cpro/sslib9.htm\n * 最小二乗近似\n * Chebyshev 近似\n * \n * 有理式も作ろう。\n * Fourier Series とかも。\n */\n\nnamespace SoundLibrary.Mathematics.Expression\n{\n\tusing CoefType   = System.Double;\n\tusing DomainType = System.Double;\n\tusing ValueType  = System.Double;\n\n\t/// <summary>\n\t/// 多項式。\n\t/// </summary>\n\tpublic class Polynomial : ICloneable\n\t{\n\t\t#region フィールド\n\n\t\t/// <summary>\n\t\t/// coef[n] … n次の係数。\n\t\t/// </summary>\n\t\tCoefType[] coef;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Polynomial() : this(0) {}\n\n\t\t/// <summary>\n\t\t/// 次数を指定して初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"order\">多項式の次数</param>\n\t\tpublic Polynomial(int order) : this(new CoefType[order + 1]) {}\n\n\t\t/// <summary>\n\t\t/// 係数配列を指定して初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"coef\">係数配列</param>\n\t\tpublic Polynomial(params CoefType[] coef)\n\t\t{\n\t\t\tthis.coef = coef;\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\t/// <summary>\n\t\t/// f(x) を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <returns>f(x)</returns>\n\t\tpublic ValueType Value(DomainType x)\n\t\t{\n\t\t\tint n=coef.Length-1;\n\t\t\tValueType y = this.coef[n];\n\n\t\t\twhile(n > 0)\n\t\t\t{\n\t\t\t\ty *= x;\n\t\t\t\t--n;\n\t\t\t\ty += this.coef[n];\n\t\t\t}\n\n\t\t\treturn y;\n\t\t}\n\n\t\t#endregion\n\t\t#region 係数の取得\n\n\t\tpublic CoefType[] Coef\n\t\t{\n\t\t\tget{return this.coef;}\n\t\t}\n\n\t\t#endregion\n\t\t#region operator\n\n\t\t/// <summary>\n\t\t/// 単項+。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <returns>+f(x)</returns>\n\t\tpublic static Polynomial operator+ (Polynomial f)\n\t\t{\n\t\t\treturn f.Clone();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式同士の加算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <param name=\"g\">g(x)</param>\n\t\t/// <returns>f(x) + g(x)</returns>\n\t\tpublic static Polynomial operator+ (Polynomial f, Polynomial g)\n\t\t{\n\t\t\tCoefType[] a, b, c;\n\t\t\tSelect(f.coef, g.coef, out a, out b);\n\t\t\tc = new CoefType[a.Length];\n\n\t\t\tint n = 0;\n\t\t\tfor(; n<b.Length; ++n) c[n] = a[n] + b[n];\n\t\t\tfor(; n<a.Length; ++n) c[n] = a[n];\n\n\t\t\treturn new Polynomial(c);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式同士の減算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <param name=\"g\">g(x)</param>\n\t\t/// <returns>f(x) - g(x)</returns>\n\t\tpublic static Polynomial operator- (Polynomial f, Polynomial g)\n\t\t{\n\t\t\tCoefType[] c;\n\n\t\t\tif(f.coef.Length > g.coef.Length)\n\t\t\t{\n\t\t\t\tc = new CoefType[f.coef.Length];\n\n\t\t\t\tint n = 0;\n\t\t\t\tfor(; n<g.coef.Length; ++n) c[n] = f.coef[n] - g.coef[n];\n\t\t\t\tfor(; n<f.coef.Length; ++n) c[n] = f.coef[n];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tc = new CoefType[g.coef.Length];\n\n\t\t\t\tint n = 0;\n\t\t\t\tfor(; n<f.coef.Length; ++n) c[n] = f.coef[n] - g.coef[n];\n\t\t\t\tfor(; n<g.coef.Length; ++n) c[n] = -g.coef[n];\n\t\t\t}\n\n\t\t\treturn new Polynomial(c);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// -f\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <returns>-f(x)</returns>\n\t\tpublic static Polynomial operator-(Polynomial f)\n\t\t{\n\t\t\tCoefType[] c;\n\t\t\tc = new CoefType[f.coef.Length];\n\t\t\tfor(int n=0; n<f.coef.Length; ++n) c[n] = -f.coef[n];\n\t\t\treturn new Polynomial(c);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式同士の乗算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <param name=\"g\">g(x)</param>\n\t\t/// <returns>f(x) × g(x)</returns>\n\t\tpublic static Polynomial operator* (Polynomial f, Polynomial g)\n\t\t{\n\t\t\tCoefType[] c = Convolute(f.coef, g.coef);\n\t\t\treturn new Polynomial(c);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式÷係数体。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <param name=\"a\">a</param>\n\t\t/// <returns>f(x) ÷ a</returns>\n\t\tpublic static Polynomial operator/ (Polynomial f, CoefType a)\n\t\t{\n\t\t\tCoefType[] c = (CoefType[])f.coef.Clone();\n\t\t\tfor(int n=0; n<c.Length; ++n) c[n] /= a;\n\t\t\treturn new Polynomial(c);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 係数→多項式のキャスト。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">係数</param>\n\t\t/// <returns>Polynominal</returns>\n\t\tpublic static implicit operator Polynomial (CoefType a)\n\t\t{\n\t\t\treturn new Polynomial(a);\n\t\t}\n\n\t\t#endregion\n\t\t#region 特殊な多項式を取得\n\n\t\t#region x のべき乗\n\n\t\t/// <summary>\n\t\t/// x の n 乗を返す。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">指数</param>\n\t\t/// <returns>x の n 乗</returns>\n\t\tpublic static Polynomial X(int n)\n\t\t{\n\t\t\treturn Polynomial.X(n, 1);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// a x^n を返す。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">指数</param>\n\t\t/// <param name=\"a\">係数</param>\n\t\t/// <returns>x の n 乗</returns>\n\t\tpublic static Polynomial X(int n, CoefType a)\n\t\t{\n\t\t\tCoefType[] c = new CoefType[n + 1];\n\t\t\tfor(int i=0; i<n; ++i) c[i] = 0;\n\t\t\tc[n] = a;\n\n\t\t\treturn new Polynomial(c);\n\t\t}\n\n\t\t#endregion\n\t\t#region チェビシェフ多項式\n\n\t\t/// <summary>\n\t\t/// チェビシェフ多項式を計算する。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">次数</param>\n\t\t/// <returns>次数 n のチェビシェフ多項式</returns>\n\t\tpublic static Polynomial Chebyshev(int n)\n\t\t{\n\t\t\tif(n == 0)\n\t\t\t\treturn Polynomial.X(0, 1);\n\t\t\telse if(n == 1)\n\t\t\t\treturn Polynomial.X(1, 1);\n\t\t\t\n\t\t\treturn Polynomial.X(1, 2) * Polynomial.Chebyshev(n - 1) - Polynomial.Chebyshev(n - 2);\n\t\t}\n\n\t\t#endregion\n\t\t#region ラグランジュ補間\n\n\t\tpublic static Polynomial Lagrange(DomainType[] x, DomainType[] y)\n\t\t{\n\t\t\tif(x.Length != y.Length)\n\t\t\t\tthrow new System.ArgumentException(\"x と y の次数は等しくなければいけません。\");\n\n\t\t\tint len = x.Length;\n\t\t\tPolynomial p = (Polynomial)(CoefType)0.0;\n\t\t\tPolynomial X = Polynomial.X(1);\n\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\tPolynomial q = (Polynomial)(CoefType)y[i];\n\n\t\t\t\tfor(int j=0; j<len; ++j)\n\t\t\t\t{\n\t\t\t\t\tif(i == j) continue;\n\n\t\t\t\t\tPolynomial temp = (X - (CoefType)x[j]);\n\t\t\t\t\ttemp /= (x[i] - x[j]);\n\t\t\t\t\tq *= (X - (CoefType)x[j]) / (x[i] - (CoefType)x[j]);\n\t\t\t\t}\n\t\t\t\tp += q;\n\t\t\t}\n\n\t\t\treturn p;\n\t\t}\n\n\t\t#endregion\n\n\t\t#endregion\n\t\t#region static 関数\n\n\t\t/// <summary>\n\t\t/// x と y のうち、長い方の配列を a に、短い方を b に格納。\n\t\t/// </summary>\n\t\tstatic void Select(CoefType[] x, CoefType[] y, out CoefType[] a, out CoefType[] b)\n\t\t{\n\t\t\tif(x.Length > y.Length)\n\t\t\t{\n\t\t\t\ta = x;\n\t\t\t\tb = y;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ta = y;\n\t\t\t\tb = x;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列の畳込み積を計算する。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">配列1</param>\n\t\t/// <param name=\"y\">配列2</param>\n\t\t/// <returns>x * y</returns>\n\t\tstatic CoefType[] Convolute(CoefType[] x, CoefType[] y)\n\t\t{\n\t\t\tCoefType[] a, b, c;\n\n\t\t\tSelect(x, y, out a, out b);\n\n\t\t\tc = new CoefType[a.Length + b.Length - 1];\n\t\t\tfor(int k=0; k<c.Length; ++k) c[k] = 0;\n\n\t\t\tint i=0;\n\t\t\tfor(; i<b.Length; ++i)\n\t\t\t\tfor(int k=0, l=i; k<=i; ++k, --l)\n\t\t\t\t\tc[i] += a[k] * b[l];\n\t\t\tfor(; i<a.Length; ++i)\n\t\t\t\tfor(int k=i, l=0; l<b.Length; --k, ++l)\n\t\t\t\t\tc[i] += a[k] * b[l];\n\t\t\tfor(; i<c.Length; ++i)\n\t\t\t\tfor(int l=b.Length-1, k=i-l; k<a.Length; ++k, --l)\n\t\t\t\t\tc[i] += a[k] * b[l];\n\n\t\t\treturn c;\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tPolynomial p = obj as Polynomial;\n\n\t\t\tif(p == null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif(this.coef.Length != p.coef.Length)\n\t\t\t\treturn false;\n\n\t\t\tfor(int i=0; i<this.coef.Length; ++i)\n\t\t\t{\n\t\t\t\tif(this.coef[i] != p.coef[i])\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\tint code = 2376498;\n\n\t\t\tfor(int i=0; i<this.coef.Length; ++i)\n\t\t\t{\n\t\t\t\tcode <<= 2;\n\t\t\t\tcode ^= this.coef[i].GetHashCode();\n\t\t\t}\n\n\t\t\treturn (int)code;\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable メンバ\n\n\t\tpublic Polynomial Clone()\n\t\t{\n\t\t\treturn new Polynomial((CoefType[])this.coef.Clone());\n\t\t}\n\n\t\tobject ICloneable.Clone()\n\t\t{\n\t\t\treturn this.Clone();\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Expression/Rational.cs",
    "content": "﻿using System;\n\nusing Ellip = SoundLibrary.Mathematics.Elliptic;\n\nnamespace SoundLibrary.Mathematics.Expression\n{\n\tusing CoefType   = System.Double;\n\tusing DomainType = System.Double;\n\tusing ValueType  = System.Double;\n\n\t/// <summary>\n\t/// 有理式。\n\t/// </summary>\n\tpublic class Rational\n\t{\n\t\t#region フィールド\n\n\t\tPolynomial num;\n\t\tPolynomial denom;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\t/// <summary>\n\t\t/// 0次数で初期化。\n\t\t/// </summary>\n\t\tpublic Rational() : this(0) {}\n\n\t\t/// <summary>\n\t\t/// 分子多項式の次数を指定して初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"nOrder\">分子多項式の次数</param>\n\t\tpublic Rational(int nOrder) : this(nOrder, 0) {}\n\n\t\t/// <summary>\n\t\t/// 次数を指定して初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"nOrder\">分子多項式の次数</param>\n\t\t/// <param name=\"dOrder\">分母多項式の次数</param>\n\t\tpublic Rational(int nOrder, int dOrder) : this(new Polynomial(nOrder), new Polynomial(dOrder)) {}\n\n\t\t/// <summary>\n\t\t/// 分子/分母多項式を指定して初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"num\">分子多項式</param>\n\t\t/// <param name=\"denom\">分母多項式</param>\n\t\tpublic Rational(Polynomial num, Polynomial denom)\n\t\t{\n\t\t\tthis.num   = num;\n\t\t\tthis.denom = denom;\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\t/// <summary>\n\t\t/// f(x) を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <returns>f(x)</returns>\n\t\tpublic ValueType Value(DomainType x)\n\t\t{\n\t\t\treturn this.num.Value(x) / this.denom.Value(x);\n\t\t}\n\n\t\t#endregion\n\t\t#region 分子/分母多項式の取得\n\n\t\t/// <summary>\n\t\t/// 分子多項式。\n\t\t/// </summary>\n\t\tpublic Polynomial Numerator\n\t\t{\n\t\t\tget{return this.num;}\n\t\t\tset{this.num = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 分母多項式。\n\t\t/// </summary>\n\t\tpublic Polynomial Denominator\n\t\t{\n\t\t\tget{return this.denom;}\n\t\t\tset{this.denom = value;}\n\t\t}\n\n\t\t#endregion\n\t\t#region operator\n\n\t\t/// <summary>\n\t\t/// 単項+。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <returns>+f(x)</returns>\n\t\tpublic static Rational operator+ (Rational f)\n\t\t{\n\t\t\treturn new Rational(+f.num, +f.denom);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 単項-。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <returns>-f(x)</returns>\n\t\tpublic static Rational operator- (Rational f)\n\t\t{\n\t\t\treturn new Rational(-f.num, +f.denom);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式同士の加算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <param name=\"g\">g(x)</param>\n\t\t/// <returns>f(x) + g(x)</returns>\n\t\tpublic static Rational operator+ (Rational f, Rational g)\n\t\t{\n\t\t\tPolynomial num = f.num * g.denom + f.denom * g.denom;\n\t\t\tPolynomial denom = f.denom * g.denom;\n\n\t\t\treturn new Rational(num, denom);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式同士の減算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <param name=\"g\">g(x)</param>\n\t\t/// <returns>f(x) - g(x)</returns>\n\t\tpublic static Rational operator- (Rational f, Rational g)\n\t\t{\n\t\t\tPolynomial num = f.num * g.denom - f.denom * g.denom;\n\t\t\tPolynomial denom = f.denom * g.denom;\n\n\t\t\treturn new Rational(num, denom);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式同士の乗算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <param name=\"g\">g(x)</param>\n\t\t/// <returns>f(x) * g(x)</returns>\n\t\tpublic static Rational operator* (Rational f, Rational g)\n\t\t{\n\t\t\tPolynomial num = f.num * g.num;\n\t\t\tPolynomial denom = f.denom * g.denom;\n\n\t\t\treturn new Rational(num, denom);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式同士の除算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <param name=\"g\">g(x)</param>\n\t\t/// <returns>f(x) / g(x)</returns>\n\t\tpublic static Rational operator/ (Rational f, Rational g)\n\t\t{\n\t\t\tPolynomial num = f.num * g.denom;\n\t\t\tPolynomial denom = f.denom * g.num;\n\n\t\t\treturn new Rational(num, denom);\n\t\t}\n\n\t\t#endregion\n\t\t#region 特殊な多項式を取得\n\n\t\t#region チェビシェフ有理式\n\n\t\t/// <summary>\n\t\t/// チェビシェフ有理式(elliptic rational)を計算する。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">次数</param>\n\t\t/// <param name=\"l\">x > 1 における極小値</param>\n\t\t/// <returns>次数 n のチェビシェフ有理式</returns>\n\t\tpublic static Rational Elliptic(int n, double l)\n\t\t{\n\t\t\tdouble m1 = 1 / (l * l);\n\t\t\tdouble m1p = 1 - m1;\n\n\t\t\tdouble Kk1  = Ellip.K(m1);\n\t\t\tdouble Kk1p = Ellip.K(m1p);\n\n\t\t\tdouble m    = Ellip.InverseQ(Math.Exp(-Math.PI * Kk1p / (n * Kk1)));\n\t\t\tdouble Kk   = Ellip.K(m);\n\n\t\t\tPolynomial num   = Polynomial.X(0, 1);\n\t\t\tPolynomial denom = Polynomial.X(0, 1);\n\n\t\t\tRational r = new Rational(Polynomial.X(0, 1), Polynomial.X(0, 1));\n\t\t\tdouble g = 1;\n\n\t\t\tfor(int i=n-1; i>0; i-=2)\n\t\t\t{\n\t\t\t\tdouble u = Kk * (double)i / n;\n\t\t\t\tdouble sn = Ellip.Sn(u, m);\n\t\t\t\tdouble w = sn * sn;\n\n\t\t\t\tg *= (m*w - 1) / (1/w - 1);\n\t\t\t\tnum   *= Polynomial.X(2,\t1/w) - 1;\n\t\t\t\tdenom *= Polynomial.X(2, m*w) - 1;\n\t\t\t}\n\n\t\t\tif((n & 1) == 1)\n\t\t\t{\n\t\t\t\tnum *= Polynomial.X(1);\n\t\t\t}\n\n\t\t\tnum *= g;\n\n\t\t\treturn new Rational(num, denom);\n\t\t}\n\n\t\t#endregion\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Algorithm.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\tusing ValueType = System.Double;\n\n\t/// <summary>\n\t/// Algorithm の概要の説明です。\n\t/// </summary>\n\t/* static */\n\tpublic class Algorithm\n\t{\n\t\t/// <summary>\n\t\t/// 数値積分や探索のための変数の変化幅。\n\t\t/// 領域 [min, max] の間を刻み幅 step で探索する。\n\t\t/// </summary>\n\t\tpublic class Range\n\t\t{\n\t\t\tpublic Variable variable;\n\t\t\tpublic ValueType min;\n\t\t\tpublic ValueType max;\n\t\t\tpublic ValueType step;\n\n\t\t\t/// <summary>\n\t\t\t/// 最大値、最小値と、刻み幅を指定して初期化。\n\t\t\t/// </summary>\n\t\t\t/// <param name=\"variable\">変数</param>\n\t\t\t/// <param name=\"min\">最小値</param>\n\t\t\t/// <param name=\"max\">最大値</param>\n\t\t\t/// <param name=\"step\">刻み幅</param>\n\t\t\tpublic Range(Variable variable, ValueType min, ValueType max, ValueType step)\n\t\t\t{\n\t\t\t\tthis.variable = variable;\n\t\t\t\tthis.min = min;\n\t\t\t\tthis.max = max;\n\t\t\t\tthis.step = step;\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// 分割数を指定して初期化。\n\t\t\t/// </summary>\n\t\t\t/// <param name=\"variable\">変数</param>\n\t\t\t/// <param name=\"min\">最小値</param>\n\t\t\t/// <param name=\"max\">最大値</param>\n\t\t\t/// <param name=\"n\">分割数</param>\n\t\t\tpublic Range(Variable variable, ValueType min, ValueType max, int n)\n\t\t\t{\n\t\t\t\tthis.variable = variable;\n\t\t\t\tthis.min = min;\n\t\t\t\tthis.max = max;\n\t\t\t\tthis.step = (max - min) / (ValueType)n;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 指定した範囲内/刻み幅で、関数 f の値が最小になるような引数を探す。\n\t\t/// (総当り)\n\t\t/// </summary>\n\t\t/// <param name=\"f\">関数 f</param>\n\t\t/// <param name=\"rangeList\">探索範囲/刻み幅</param>\n\t\t/// <returns>argmin f</returns>\n\t\tpublic static VariableTable Argmin(Function f, params Range[] rangeList)\n\t\t{\n\t\t\tVariableTable vars = new VariableTable();\n\t\t\tforeach(Range range in rangeList)\n\t\t\t{\n\t\t\t\tvars[range.variable] = range.min;\n\t\t\t}\n\n\t\t\tValueType min = ValueType.MaxValue;\n\t\t\tVariableTable argmin = null;\n\n\t\t\tfor(;;)\n\t\t\t{\n\t\t\t\tValueType val = f[vars];\n\t\t\t\tif(val < min)\n\t\t\t\t{\n\t\t\t\t\tmin = val;\n\t\t\t\t\targmin = vars.Clone();\n\t\t\t\t}\n\n\t\t\t\tint i=0;\n\t\t\t\tfor(; i<rangeList.Length; ++i)\n\t\t\t\t{\n\t\t\t\t\tValueType x = vars[rangeList[i].variable];\n\t\t\t\t\tx += rangeList[i].step;\n\n\t\t\t\t\tif(x > rangeList[i].max)\n\t\t\t\t\t{\n\t\t\t\t\t\tvars[rangeList[i].variable] = rangeList[i].min;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tvars[rangeList[i].variable] = x;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(i >= rangeList.Length) break;\n\t\t\t}\n\n\t\t\treturn argmin;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 数値積分。(台形公式を使用。)\n\t\t/// </summary>\n\t\t/// <param name=\"f\">被積分関数</param>\n\t\t/// <param name=\"range\">積分範囲</param>\n\t\t/// <returns>数値積分結果</returns>\n\t\tpublic static Function Integral(Function f, Range range)\n\t\t{\n\t\t\tVariable x = range.variable;\n\t\t\tValueType min = range.min;\n\t\t\tValueType max = range.max;\n\t\t\tValueType step = range.step;\n\n\t\t\tFunction g = f.Bind(new Function.Parameter(x, min));\n\t\t\tg += f.Bind(new Function.Parameter(x, max));\n\t\t\tg /= 2;\n\n\t\t\tfor(; min < max; min += step)\n\t\t\t\tg += f.Bind(new Function.Parameter(x, min));\n\n\t\t\tg *= step;\n\t\t\treturn g;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Binary.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\tusing ValueType = System.Double;\n\n\t/// <summary>\n\t/// 二項関数デリゲート。\n\t/// </summary>\n\tpublic delegate ValueType BinaryFunction(ValueType x, ValueType y);\n\n\t/// <summary>\n\t/// 二項関数。\n\t/// </summary>\n\tpublic class Binary : Function\n\t{\n\t\t#region フィールド\n\n\t\t/// <summary>\n\t\t/// 関数本体。\n\t\t/// </summary>\n\t\tprotected BinaryFunction func;\n\n\t\t/// <summary>\n\t\t/// 内部関数。\n\t\t/// this.GetValue(x) == func(inner.GetValue(x))\n\t\t/// </summary>\n\t\tprotected Function inner0;\n\t\tprotected Function inner1;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Binary(BinaryFunction func, Function inner0, Function inner1)\n\t\t{\n\t\t\tthis.func = func;\n\t\t\tthis.inner0 = inner0;\n\t\t\tthis.inner1 = inner1;\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\tpublic override System.Collections.ArrayList GetVariableList()\n\t\t{\n\t\t\treturn Misc.Merge(this.inner0.GetVariableList(), this.inner1.GetVariableList());\n\t\t}\n\n\t\tpublic override ValueType GetValue(params Parameter[] x)\n\t\t{\n\t\t\treturn this.func(this.inner0.GetValue(x), this.inner1.GetValue(x));\n\t\t}\n\n\t\tpublic override Function Bind(params Parameter[] x)\n\t\t{\n\t\t\tFunction inner0 = this.inner0.Bind(x);\n\t\t\tFunction inner1 = this.inner1.Bind(x);\n\n\t\t\tConstant c0 = inner0 as Constant;\n\t\t\tConstant c1 = inner1 as Constant;\n\n\t\t\tif(c0 != null && c1 != null)\n\t\t\t{\n\t\t\t\treturn (Constant)this.func(c0.Value, c1.Value);\n\t\t\t}\n\n\t\t\tBinary f = this.Clone() as Binary;\n\t\t\tf.inner0 = inner0;\n\t\t\tf.inner1 = inner1;\n\t\t\treturn f;\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部構造の最適化\n\n\t\tpublic override Function Optimize()\n\t\t{\n\t\t\tFunction f0 = this.inner0.Optimize();\n\t\t\tFunction f1 = this.inner1.Optimize();\n\t\t\tBinary u = (Binary)this.Clone();\n\t\t\tu.inner0 = f0;\n\t\t\tu.inner1 = f1;\n\t\t\treturn u;\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tprotected virtual string FunctionName()\n\t\t{\n\t\t\treturn string.Empty;\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn this.FunctionName() + \"(\" + this.inner0.ToString() + \", \" + this.inner1.ToString() + \")\";\n\t\t}\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tBinary f = obj as Binary;\n\n\t\t\tif(f == null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn this.func.Equals(f.func)\n\t\t\t\t&& this.inner0.Equals(f.inner0)\n\t\t\t\t&& this.inner1.Equals(f.inner1);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn this.func.GetHashCode() ^ this.inner0.GetHashCode()\n\t\t\t\t^ (this.inner1.GetHashCode() << 1);\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Binary(\n\t\t\t\t(BinaryFunction)this.func.Clone(),\n\t\t\t\tthis.inner0.Clone(),\n\t\t\t\tthis.inner1.Clone());\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/CachedFunction.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\tusing ValueType = System.Double;\n\n\t/// <summary>\n\t/// 関数クラスにキャッシュ機能を付ける。\n\t/// f[Exp(x)] とかすると、f の中で、Exp の値が何度も計算される場合があるので。\n\t/// 一度 Exp(x) の値を計算したら、x の値が同じ限り極力値を使いまわす。\n\t/// </summary>\n\tpublic class CachedFunction : Function\n\t{\n\t\t#region 内部クラス\n\n\t\tclass Cache\n\t\t{\n\t\t\tstatic int count; //! for debug\n\t\t\tint unique_id;\n\t\t\tpublic Cache(){this.unique_id = count; ++count;}\n\n\t\t\tpublic Parameter[] bind_x = null;\n\t\t\tpublic Function    bind   = null;\n\t\t\tpublic Parameter[] gv_x   = null;\n\t\t\tpublic ValueType   gv     = 0;\n\t\t\tpublic Function    re     = null;\n\t\t\tpublic Function    im     = null;\n\t\t}\n\n\t\t#endregion\n\t\t#region フィールド\n\n\t\t/// <summary>\n\t\t/// 関数の実体。\n\t\t/// </summary>\n\t\tFunction f;\n\n\t\t/// <summary>\n\t\t/// キャッシュ値。\n\t\t/// </summary>\n\t\tCache cache;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tstatic int count; //! for debug\n\t\tint unique_id;\n\n\t\tpublic CachedFunction(Function f) : this(f, new Cache()) {}\n\n\t\tCachedFunction(Function f, Cache c)\n\t\t{\n\t\t\tthis.f = f;\n\t\t\tthis.cache = c;\n\n\t\t\tthis.unique_id = count; ++count;\n\t\t}\n\n\t\t#endregion\n\t\t#region Parameter[] の等値判定\n\n\t\tstatic bool ParameterEquals(Parameter[] a, Parameter[] b)\n\t\t{\n\t\t\treturn a == b;\n\t\t\t/*\n\t\t\tif(a == null || b == null) return false;\n\t\t\tif(a.Length != b.Length) return false;\n\n\t\t\tfor(int i=0; i<a.Length; ++i)\n\t\t\t\tif(!a[i].Equals(b[i])) return false;\n\n\t\t\treturn true;\n\t\t\t*/\n\t\t}\n\n\t\t#endregion\n\t\t#region Bind\n\n\t\tpublic override Function Bind(params Parameter[] x)\n\t\t{\n\t\t\tif(!ParameterEquals(x, this.cache.bind_x))\n\t\t\t{\n\t\t\t\tthis.cache.bind_x = x;\n\t\t\t\tthis.cache.bind = new CachedFunction(this.f.Bind(x));\n\t\t\t}\n\t\t\treturn this.cache.bind;\n\t\t}\n\n\t\t#endregion\n\t\t#region GetValue\n\n\t\tpublic override ValueType GetValue(params Parameter[] x)\n\t\t{\n\t\t\tif(!ParameterEquals(x, this.cache.gv_x))\n\t\t\t{\n\t\t\t\tthis.cache.gv_x = x;\n\t\t\t\tthis.cache.gv = this.f.GetValue(x);\n\t\t\t}\n\t\t\treturn this.cache.gv;\n\t\t}\n\n\t\t#endregion\n\t\t#region GetComplexPart\n\n\t\tpublic override void GetComplexPart(out Function re, out Function im)\n\t\t{\n\t\t\tif(this.cache.re == null)\n\t\t\t{\n\t\t\t\tthis.f.GetComplexPart(out this.cache.re, out this.cache.im);\n\t\t\t\tthis.cache.re = new CachedFunction(this.cache.re);\n\t\t\t\tthis.cache.im = new CachedFunction(this.cache.im);\n\t\t\t}\n\n\t\t\tre = this.cache.re;\n\t\t\tim = this.cache.im;\n\t\t}\n\n\t\t#endregion\n\t\t#region その他の抽象関数\n\n\t\tpublic override System.Collections.ArrayList GetVariableList()\n\t\t{\n\t\t\treturn this.f.GetVariableList();\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部構造の最適化\n\n\t\t/// <remarks>\n\t\t/// 現状の CachedFunction には Optimize はかからないので、\n\t\t/// 予め Optimize を掛けてからキャッシュ化するように。\n\t\t/// </remarks>\n\t\tpublic override Function Optimize()\n\t\t{\n\t\t\treturn this;\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable メンバ\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new CachedFunction(this.f.Clone(), this.cache);\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override string ToString()\n\t\t{\n#if DEBUG\n\t\t\treturn \"c(\" + this.f.ToString() + \")\";\n#else\n\t\t\treturn this.f.ToString();\n#endif\n\t\t}\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tCachedFunction cf = obj as CachedFunction;\n\t\t\tif(cf == null) return false;\n\n\t\t\treturn this.f.Equals(cf.f);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn 658376238 ^ this.f.GetHashCode();\n\t\t}\n\n\t\t#endregion\n\t\t#region 特殊な関数\n\n\t\t#region 単項関数\n\n\t\tpublic static new CachedFunction Exp(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Exp(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Log(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Log(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Log10(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Log10(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Sin(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Sin(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Cos(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Cos(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Tan(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Tan(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Asin(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Asin(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Acos(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Acos(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Atan(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Atan(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Sinh(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Sinh(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Cosh(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Cosh(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Tanh(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Tanh(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Abs(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Abs(f));\n\t\t}\n\n\t\tpublic static new CachedFunction Sqrt(Function f)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Sqrt(f));\n\t\t}\n\n\t\t#endregion\n\t\t#region 二項関数\n\n\t\tpublic static new CachedFunction Pow(Function f, Function g)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Pow(f, g));\n\t\t}\n\n\t\tpublic static new CachedFunction Log(Function f, Function g)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Log(f, g));\n\t\t}\n\n\t\tpublic static new CachedFunction Atan2(Function f, Function g)\n\t\t{\n\t\t\treturn new CachedFunction(Function.Atan2(f, g));\n\t\t}\n\n\t\t#endregion\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/ComplexVariable.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\t/// <summary>\n\t/// 複素数変数。\n\t/// </summary>\n\tpublic class ComplexVariable : Variable\n\t{\n\t\tpublic ComplexVariable(IComparable id) : base(id) {}\n\n\t\t#region 複素数対応\n\n\t\t/// <summary>\n\t\t/// 実部。\n\t\t/// </summary>\n\t\tpublic Variable Re\n\t\t{\n\t\t\tget{return new Variable(new ComplexId(ComplexId.ReIm.Re, this.id));}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 虚部。\n\t\t/// </summary>\n\t\tpublic Variable Im\n\t\t{\n\t\t\tget{return new Variable(new ComplexId(ComplexId.ReIm.Im, this.id));}\n\t\t}\n\n\t\tpublic override void GetComplexPart(out Function re, out Function im)\n\t\t{\n\t\t\tre = this.Re;\n\t\t\tim = this.Im;\n\t\t}\n\n\t\t#endregion\n\t}\n\n\t/// <summary>\n\t/// 純虚数変数。\n\t/// </summary>\n\tpublic class ImaginaryVariable : Variable\n\t{\n\t\tpublic ImaginaryVariable(IComparable id) : base(id) {}\n\n\t\t#region 複素数対応\n\n\t\tpublic override void GetComplexPart(out Function re, out Function im)\n\t\t{\n\t\t\tre = (Constant)0;\n\t\t\tim = this;\n\t\t}\n\n\t\t#endregion\n\t}\n\n\t/// <summary>\n\t/// Variable を複素数対応化するためのクラス。\n\t/// Variable x が id 'x' を持つとき、\n\t/// x.GetComplexPart(out re, out im); の結果 re, im を\n\t/// re の id = ComplexId(Re, 'x'),\n\t/// im の id = ComplexId(Im, 'x')\n\t/// にする。\n\t/// </summary>\n\tinternal struct ComplexId : IComparable\n\t{\n\t\t#region 内部型\n\n\t\tpublic enum ReIm\n\t\t{\n\t\t\tRe, Im\n\t\t}\n\n\t\t#endregion\n\t\t#region フィールド\n\n\t\tpublic ReIm ri;\n\t\tpublic IComparable id;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic ComplexId(ReIm ri, IComparable id)\n\t\t{\n\t\t\tthis.ri = ri;\n\t\t\tthis.id = id;\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tComplexId id = (ComplexId)obj;\n\t\t\treturn this.ri == id.ri && this.id.Equals(id.id);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn this.ri.GetHashCode() ^ this.id.GetHashCode();\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\tif(this.ri == ReIm.Re)\n\t\t\t{\n\t\t\t\treturn \"Re(\" + this.id.ToString() + \")\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn \"Im(\" + this.id.ToString() + \")\";\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region IComparable メンバ\n\n\t\tpublic int CompareTo(object obj)\n\t\t{\n\t\t\tComplexId id = (ComplexId)obj;\n\n\t\t\tint comp = this.id.CompareTo(id.id);\n\n\t\t\tif(comp != 0) return comp;\n\t\t\t\n\t\t\treturn this.ri.CompareTo(id.ri);\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Constant.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\tusing ValueType = System.Double;\n\n\t/// <summary>\n\t/// 定数。\n\t/// </summary>\n\tpublic class Constant : Function\n\t{\n\t\t#region フィールド\n\n\t\t/// <summary>\n\t\t/// 定数の値。\n\t\t/// </summary>\n\t\tValueType val;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Constant() : this(0){}\n\n\t\tpublic Constant(ValueType val)\n\t\t{\n\t\t\tthis.val = val;\n\t\t}\n\n\t\tpublic static implicit operator Constant (ValueType val)\n\t\t{\n\t\t\treturn new Constant(val);\n\t\t}\n\n\t\t#endregion\n\t\t#region 値\n\n\t\tpublic ValueType Value\n\t\t{\n\t\t\tget{return this.val;}\n\t\t}\n\n\t\t#endregion\n\t\t#region 複素数対応\n\n\t\tpublic override void GetComplexPart(out Function re, out Function im)\n\t\t{\n\t\t\tre = this;\n\t\t\tim = (Constant)0;\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\tpublic override System.Collections.ArrayList GetVariableList()\n\t\t{\n\t\t\treturn new System.Collections.ArrayList();\n\t\t}\n\n\t\tpublic override ValueType GetValue(params Parameter[] x)\n\t\t{\n\t\t\treturn this.val;\n\t\t}\n\n\t\tpublic override Function Bind(params Parameter[] x)\n\t\t{\n\t\t\treturn this;\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算\n\n\t\tpublic override Function Negate()\n\t\t{\n\t\t\treturn (Constant)(-this.val);\n\t\t}\n\n\t\tpublic override Function Add(Function f)\n\t\t{\n\t\t\tConstant c = f as Constant;\n\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\treturn (Constant)(this.val + c.val);\n\t\t\t}\n\n\t\t\treturn f.Add(this);\n\t\t}\n\n\t\tpublic override Function Subtract(Function f)\n\t\t{\n\t\t\tConstant c = f as Constant;\n\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\treturn (Constant)(this.val - c.val);\n\t\t\t}\n\n\t\t\treturn -f.Subtract(this);\n\t\t}\n\n\t\tpublic override Function Multiply(Function f)\n\t\t{\n\t\t\tConstant c = f as Constant;\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\treturn (Constant)(this.val * c.val);\n\t\t\t}\n\n\t\t\tVariable v = f as Variable;\n\t\t\tif(v != null)\n\t\t\t{\n\t\t\t\treturn new Multiple(this.val, v);\n\t\t\t}\n\n\t\t\treturn f.Multiply(this);\n\t\t}\n\n\t\tpublic override Function Divide(Function f)\n\t\t{\n\t\t\tConstant c = f as Constant;\n\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\treturn (Constant)(this.val / c.val);\n\t\t\t}\n\n\t\t\treturn base.Divide(f);\n\t\t}\n\n\t\t#endregion\n\t\t#region 微分\n\n\t\tpublic override Function Differentiate(Variable x)\n\t\t{\n\t\t\treturn (Constant)0;\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn this.val.ToString();\n\t\t}\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tConstant c = obj as Constant;\n\n\t\t\tif(c == null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn this.val == c.val;\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn this.val.GetHashCode();\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Variable(this.val);\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Elementary/Exp.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function.Elementary\n{\n\t//! 指数関数の掛け算とか、対数関数の足し算とか、最適化可能。\n\t//! 指数関数の中に対数関数とかも。\n\n\t#region 指数・対数\n\n\t/// <summary>\n\t/// 指数関数。\n\t/// </summary>\n\tpublic class Exp : Unary\n\t{\n\t\tpublic Exp(Function f) : base(new UnaryFunction(Math.Exp), f)\n\t\t{\n\t\t}\n\n\t\tprotected override void GetComplexPart(Function reX, Function imX, out Function reY, out Function imY)\n\t\t{\n\t\t\tFunction exp = Exp(reX);\n\t\t\treY = exp * Cos(imX);\n\t\t\timY = exp * Sin(imX);\n\t\t}\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Exp(this.inner);\n\t\t}\n\n\t\tprotected override Function Differentiate()\n\t\t{\n\t\t\treturn this.Clone();\n\t\t}\n\n\t\tprotected override string FunctionName()\n\t\t{\n\t\t\treturn \"exp\";\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// 対数関数 log_e。\n\t/// </summary>\n\tpublic class LogE : Unary\n\t{\n\t\tpublic LogE(Function f) : base(new UnaryFunction(Math.Log), f)\n\t\t{\n\t\t}\n\n\t\t/*\n\t\tprotected override void GetComplexPart(Function reX, Function imX, out Function reY, out Function imY)\n\t\t{\n\t\t//! Arg が必要になるけど、どうしよう？実装できそうなら実装したい。\n\t\t}\n\t\t*/\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new LogE(this.inner);\n\t\t}\n\n\t\tprotected override Function Differentiate()\n\t\t{\n\t\t\treturn (Constant)1 / this.inner;\n\t\t}\n\n\t\tprotected override string FunctionName()\n\t\t{\n\t\t\treturn \"log\";\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// 対数関数 log_10。\n\t/// </summary>\n\tpublic class Log10 : Unary\n\t{\n\t\tpublic Log10(Function f) : base(new UnaryFunction(Math.Log10), f)\n\t\t{\n\t\t}\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Log10(this.inner);\n\t\t}\n\n\t\tprotected override Function Differentiate()\n\t\t{\n\t\t\tdouble tmp = 1/Math.Log(10); //! tmp は定数にしておけばちょっと効率的。\n\t\t\treturn (Constant)(tmp) / this.inner;\n\t\t}\n\n\t\tprotected override string FunctionName()\n\t\t{\n\t\t\treturn \"log10\";\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// 対数関数(任意の底)。\n\t/// </summary>\n\tpublic class Log : Binary\n\t{\n\t\tpublic Log(Function f1, Function f2) : base(new BinaryFunction(Math.Log), f1, f2)\n\t\t{\n\t\t}\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Log(this.inner0, this.inner1);\n\t\t}\n\n\t\tprotected override string FunctionName()\n\t\t{\n\t\t\treturn \"log\";\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// 指数関数(任意の底)。\n\t/// </summary>\n\tpublic class Pow : Binary\n\t{\n\t\tpublic Pow(Function f1, Function f2) : base(new BinaryFunction(Math.Pow), f1, f2)\n\t\t{\n\t\t}\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Pow(this.inner0, this.inner1);\n\t\t}\n\n\t\tprotected override string FunctionName()\n\t\t{\n\t\t\treturn \"pow\";\n\t\t}\n\t}\n\n\t#endregion\n\t#region 三角関数\n\n\t/// <summary>\n\t/// sin 関数。\n\t/// </summary>\n\tpublic class Sin : Unary\n\t{\n\t\tpublic Sin(Function f) : base(new UnaryFunction(Math.Sin), f)\n\t\t{\n\t\t}\n\n\t\tprotected override void GetComplexPart(Function reX, Function imX, out Function reY, out Function imY)\n\t\t{\n\t\t\treY = Sin(reX) * Cosh(imX);\n\t\t\timY = Cos(reX) * Sinh(imX);\n\t\t}\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Sin(this.inner);\n\t\t}\n\n\t\tprotected override Function Differentiate()\n\t\t{\n\t\t\treturn new Cos(this.inner);\n\t\t}\n\n\t\tprotected override string FunctionName()\n\t\t{\n\t\t\treturn \"sin\";\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// cos 関数。\n\t/// </summary>\n\tpublic class Cos : Unary\n\t{\n\t\tpublic Cos(Function f) : base(new UnaryFunction(Math.Cos), f)\n\t\t{\n\t\t}\n\n\t\tprotected override void GetComplexPart(Function reX, Function imX, out Function reY, out Function imY)\n\t\t{\n\t\t\treY = Cos(reX) * Cosh(imX);\n\t\t\timY = -Sin(reX) * Sinh(imX);\n\t\t}\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Cos(this.inner);\n\t\t}\n\n\t\tprotected override Function Differentiate()\n\t\t{\n\t\t\treturn -(new Sin(this.inner));\n\t\t}\n\n\t\tprotected override string FunctionName()\n\t\t{\n\t\t\treturn \"cos\";\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// tan 関数。\n\t/// </summary>\n\tpublic class Tan : Unary\n\t{\n\t\tpublic Tan(Function f) : base(new UnaryFunction(Math.Tan), f)\n\t\t{\n\t\t}\n\n\t\tprotected override void GetComplexPart(Function reX, Function imX, out Function reY, out Function imY)\n\t\t{\n\t\t\tFunction reN = Tan(reX);\n\t\t\tFunction imN = Tanh(imX);\n\t\t\tFunction imD = reN * imN;\n\t\t\tFunction absD = 1 + imD * imD;\n\n\t\t\treY = (reN - imN * imD) / absD;\n\t\t\timY = (imN + reN * imD) / absD;\n\t\t}\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Tan(this.inner);\n\t\t}\n\n\t\tprotected override Function Differentiate()\n\t\t{\n\t\t\tFunction cos = new Cos(this.inner);\n\t\t\treturn (Constant)1 / (cos * cos);\n\t\t}\n\n\t\tprotected override string FunctionName()\n\t\t{\n\t\t\treturn \"tan\";\n\t\t}\n\t}\n\n\t#endregion\n\t#region 双曲関数\n\n\t/// <summary>\n\t/// sinh 関数。\n\t/// </summary>\n\tpublic class Sinh : Unary\n\t{\n\t\tpublic Sinh(Function f) : base(new UnaryFunction(Math.Sinh), f)\n\t\t{\n\t\t}\n\n\t\tprotected override void GetComplexPart(Function reX, Function imX, out Function reY, out Function imY)\n\t\t{\n\t\t\treY = Sinh(reX) * Cos(imX);\n\t\t\timY = Cosh(reX) * Sin(imX);\n\t\t}\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Sinh(this.inner);\n\t\t}\n\n\t\tprotected override Function Differentiate()\n\t\t{\n\t\t\treturn new Cosh(this.inner);\n\t\t}\n\n\t\tprotected override string FunctionName()\n\t\t{\n\t\t\treturn \"sinh\";\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// cosh 関数。\n\t/// </summary>\n\tpublic class Cosh : Unary\n\t{\n\t\tpublic Cosh(Function f) : base(new UnaryFunction(Math.Cosh), f)\n\t\t{\n\t\t}\n\n\t\tprotected override void GetComplexPart(Function reX, Function imX, out Function reY, out Function imY)\n\t\t{\n\t\t\treY = Cosh(reX) * Cos(imX);\n\t\t\timY = Sinh(reX) * Sin(imX);\n\t\t}\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Cosh(this.inner);\n\t\t}\n\n\t\tprotected override Function Differentiate()\n\t\t{\n\t\t\treturn new Sinh(this.inner);\n\t\t}\n\n\t\tprotected override string FunctionName()\n\t\t{\n\t\t\treturn \"cosh\";\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// tanh 関数。\n\t/// </summary>\n\tpublic class Tanh : Unary\n\t{\n\t\tpublic Tanh(Function f) : base(new UnaryFunction(Math.Tanh), f)\n\t\t{\n\t\t}\n\n\t\tprotected override void GetComplexPart(Function reX, Function imX, out Function reY, out Function imY)\n\t\t{\n\t\t\tFunction reN = Tanh(reX);\n\t\t\tFunction imN = Tan(imX);\n\t\t\tFunction imD = reN * imN;\n\t\t\tFunction absD = 1 + imD * imD;\n\n\t\t\treY = (reN + imN * imD) / absD;\n\t\t\timY = (imN - reN * imD) / absD;\n\t\t}\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Tanh(this.inner);\n\t\t}\n\n\t\tprotected override Function Differentiate()\n\t\t{\n\t\t\tFunction cosh = new Cosh(this.inner);\n\t\t\treturn (Constant)1 / (cosh * cosh);\n\t\t}\n\n\t\tprotected override string FunctionName()\n\t\t{\n\t\t\treturn \"tanh\";\n\t\t}\n\t}\n\n\t#endregion\n\t#region その他\n\n\t/// <summary>\n\t/// 平方根。\n\t/// </summary>\n\tpublic class Sqrt : Unary\n\t{\n\t\tpublic Sqrt(Function f) : base(new UnaryFunction(Math.Sqrt), f)\n\t\t{\n\t\t}\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Sqrt(this.inner);\n\t\t}\n\n\t\tprotected override Function Differentiate()\n\t\t{\n\t\t\treturn (Constant)1 / ((Constant)2 * new Sqrt(this.inner));\n\t\t}\n\n\t\tprotected override string FunctionName()\n\t\t{\n\t\t\treturn \"sqrt\";\n\t\t}\n\t}\n\n\t#endregion\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Elementary/GeneralPolynomial.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function.Elementary\n{\n\tusing CoefType   = SoundLibrary.Mathematics.Function.Function;\n\tusing DomainType = System.Double;\n\tusing ValueType  = System.Double;\n\tusing Poly = SoundLibrary.Mathematics.Function.Elementary.Temp.Polynomial;\n\n\t/// <summary>\n\t/// 関数を係数に持つ多項式。\n\t/// </summary>\n\tpublic class GeneralPolynomial : Function\n\t{\n\t\t#region フィールド\n\n\t\tPoly p;\n\t\tFunction inner;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic GeneralPolynomial(Function f) : this(f, 0.0) {}\n\n\t\tpublic GeneralPolynomial(Function f, int order) : this(f, new CoefType[order + 1]) {}\n\n\t\tpublic GeneralPolynomial(Function f, params CoefType[] coef) : this(f, new Poly(coef)) {}\n\n\t\tpublic GeneralPolynomial(Function f, Poly p)\n\t\t{\n\t\t\tthis.p = p;\n\t\t\tthis.inner = f;\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\tpublic override System.Collections.ArrayList GetVariableList()\n\t\t{\n\t\t\tSystem.Collections.ArrayList list = this.inner.GetVariableList();\n\n\t\t\tforeach(Function c in this.p.Coef)\n\t\t\t{\n\t\t\t\tlist = Misc.Merge(list, c.GetVariableList());\n\t\t\t}\n\n\t\t\treturn list;\n\t\t}\n\n\t\tpublic override ValueType GetValue(params Parameter[] x)\n\t\t{\n\t\t\tdouble val = this.inner.GetValue(x);\n\t\t\tFunction f = this.p.Value(val);\n\t\t\treturn f.GetValue(x);\n\t\t}\n\n\t\tpublic override Function Bind(params Parameter[] x)\n\t\t{\n\t\t\tif(this.p.Coef.Length == 1)\n\t\t\t\treturn this.p.Coef[0].Bind(x);\n\n\t\t\tFunction f = this.inner.Bind(x);\n\t\t\tif(f is Constant)\n\t\t\t{\n\t\t\t\tConstant c = f as Constant;\n\t\t\t\treturn this.p.Value(c.Value).Bind(x);\n\t\t\t}\n\n\t\t\tif(this.p.Coef.Length == 2 && this.p.Coef[0].Equals(0))\n\t\t\t{\n\t\t\t\tif(this.p.Coef[1].Equals(1))\n\t\t\t\t\treturn f;\n\n\t\t\t\treturn this.p.Coef[1].Bind(x) * f;\n\t\t\t}\n\n\t\t\tCoefType[] coef = new CoefType[this.p.Coef.Length];\n\t\t\tfor(int i=0; i<coef.Length; ++i)\n\t\t\t\tcoef[i] = this.p.Coef[i].Bind(x);\n\n\t\t\treturn new GeneralPolynomial(f, coef);\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算子\n\n\t\tpublic override Function Negate()\n\t\t{\n\t\t\treturn new GeneralPolynomial(this.inner, -this.p);\n\t\t}\n\n\t\tpublic override Function Add(Function f)\n\t\t{\n\t\t\tGeneralPolynomial poly = f as GeneralPolynomial;\n\n\t\t\tif(poly == null || !this.inner.Equals(poly.inner))\n\t\t\t{\n\t\t\t\treturn base.Add(f);\n\t\t\t}\n\n\t\t\t//! f is Variable / Constant のときの処理を加える\n\n\t\t\tPoly p = this.p + poly.p;\n\t\t\treturn new GeneralPolynomial(this.inner, p);\n\t\t}\n\n\t\tpublic override Function Subtract(Function f)\n\t\t{\n\t\t\tGeneralPolynomial poly = f as GeneralPolynomial;\n\n\t\t\tif(poly == null || !this.inner.Equals(poly.inner))\n\t\t\t{\n\t\t\t\treturn base.Subtract(f);\n\t\t\t}\n\n\t\t\tPoly p = this.p - poly.p;\n\t\t\treturn new GeneralPolynomial(this.inner, p);\n\t\t}\n\n\t\tpublic override Function Multiply(Function f)\n\t\t{\n\t\t\tGeneralPolynomial poly = f as GeneralPolynomial;\n\n\t\t\tif(poly == null || !this.inner.Equals(poly.inner))\n\t\t\t{\n\t\t\t\treturn base.Multiply(f);\n\t\t\t}\n\n\t\t\tPoly p = this.p * poly.p;\n\t\t\treturn new GeneralPolynomial(this.inner, p);\n\t\t}\n\n\t\t#endregion\n\t\t#region 微分\n\n\t\tpublic override Function Differentiate(Variable x)\n\t\t{\n\t\t\tFunction f = this.DifferentiateCoef(x);\n\t\t\tf += this.inner.Differentiate(x) * this.Differentiate();\n\n\t\t\treturn f;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式のパラメータを定数とみなして、係数のみを微分。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">微分変数</param>\n\t\t/// <returns>微分結果</returns>\n\t\tFunction DifferentiateCoef(Variable x)\n\t\t{\n\t\t\tCoefType[] coef  = this.p.Coef;\n\t\t\tCoefType[] deriv = new CoefType[coef.Length];\n\n\t\t\tfor(int i=0; i<coef.Length; ++i)\n\t\t\t{\n\t\t\t\tderiv[i] = coef[i].Differentiate(x);\n\t\t\t}\n\n\t\t\treturn new GeneralPolynomial(this.inner, new Poly(deriv));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 係数は定数とみなして、多項式のみを微分。\n\t\t/// </summary>\n\t\t/// <returns>微分結果</returns>\n\t\tFunction Differentiate()\n\t\t{\n\t\t\tCoefType[] coef  = this.p.Coef;\n\n\t\t\tif(coef.Length <= 1)\n\t\t\t\treturn (Constant)0;\n\n\t\t\tCoefType[] deriv = new CoefType[coef.Length - 1];\n\n\t\t\tfor(int i=1; i<coef.Length; ++i)\n\t\t\t{\n\t\t\t\tderiv[i - 1] = i * coef[i];\n\t\t\t}\n\n\t\t\treturn new GeneralPolynomial(this.inner, new Poly(deriv));\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部構造の最適化\n\n\t\tpublic override Function Optimize()\n\t\t{\n\t\t\tif(this.p.Coef.Length == 1)\n\t\t\t\treturn this.p.Coef[0].Optimize();\n\n\t\t\tFunction f = this.inner.Optimize();\n\t\t\tif(f is Constant)\n\t\t\t{\n\t\t\t\tConstant c = f as Constant;\n\t\t\t\treturn this.p.Value(c.Value).Optimize();\n\t\t\t}\n\n\t\t\tif(this.p.Coef.Length == 2 && this.p.Coef[0].Equals(0))\n\t\t\t{\n\t\t\t\tif(this.p.Coef[1].Equals(1))\n\t\t\t\t\treturn f;\n\n\t\t\t\treturn this.p.Coef[1].Optimize() * f;\n\t\t\t}\n\n\t\t\tCoefType[] coef = new CoefType[this.p.Coef.Length];\n\t\t\tfor(int i=0; i<coef.Length; ++i)\n\t\t\t\tcoef[i] = this.p.Coef[i].Optimize();\n\n\t\t\treturn new GeneralPolynomial(f, coef);\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\tstring str;\n\n\t\t\tstr = this.p.Coef[0].ToString();\n\n\t\t\tfor(int i=1; i<this.p.Coef.Length; ++i)\n\t\t\t{\n\t\t\t\tif(this.p.Coef[i].Equals((Constant)0))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tstring coef = this.p.Coef[i].ToString();\n\n\t\t\t\tif(coef[0] != '-')\n\t\t\t\t{\n\t\t\t\t\tstr += \" + \";\n\t\t\t\t}\n\n\t\t\t\tstr += string.Format(\"{0}X^{1}\", this.p.Coef[i], i);\n\t\t\t}\n\n\t\t\tstr += string.Format(\"(X = {0})\", this.inner);\n\n\t\t\treturn str;\n\t\t}\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tGeneralPolynomial f = obj as GeneralPolynomial;\n\n\t\t\tif(f == null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn this.p.Equals(f.p) && this.inner.Equals(f.inner);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn this.p.GetHashCode() ^ this.inner.GetHashCode();\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new GeneralPolynomial(this.inner.Clone(), this.p.Clone());\n\t\t}\n\n\t\t#endregion\n\t}\n}\n\nnamespace SoundLibrary.Mathematics.Function.Elementary.Temp\n{\n\t//*\n\tusing CoefType   = SoundLibrary.Mathematics.Function.Function;\n\tusing DomainType = System.Double;\n\tusing ValueType  = SoundLibrary.Mathematics.Function.Function;\n\t//*/\n\t/*\n\tusing CoefType   = Complex;\n\tusing DomainType = Complex;\n\tusing ValueType  = Complex;\n\t//*/\n\n\t/// <summary>\n\t/// 多項式。\n\t/// </summary>\n\tpublic class Polynomial : ICloneable\n\t{\n\t\t#region フィールド\n\n\t\t/// <summary>\n\t\t/// coef[n] … n次の係数。\n\t\t/// </summary>\n\t\tCoefType[] coef;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Polynomial() : this(0) {}\n\n\t\t/// <summary>\n\t\t/// 次数を指定して初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"order\">多項式の次数</param>\n\t\tpublic Polynomial(int order) : this(new CoefType[order + 1]) {}\n\n\t\t/// <summary>\n\t\t/// 係数配列を指定して初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"coef\">係数配列</param>\n\t\tpublic Polynomial(params CoefType[] coef)\n\t\t{\n\t\t\tthis.coef = coef;\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\t/// <summary>\n\t\t/// f(x) を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <returns>f(x)</returns>\n\t\tpublic ValueType Value(DomainType x)\n\t\t{\n\t\t\tint n=coef.Length-1;\n\t\t\tValueType y = this.coef[n];\n\n\t\t\twhile(n > 0)\n\t\t\t{\n\t\t\t\ty *= x;\n\t\t\t\t--n;\n\t\t\t\ty += this.coef[n];\n\t\t\t}\n\n\t\t\treturn y;\n\t\t}\n\n\t\t#endregion\n\t\t#region 係数の取得\n\n\t\tpublic CoefType[] Coef\n\t\t{\n\t\t\tget{return this.coef;}\n\t\t}\n\n\t\t#endregion\n\t\t#region operator\n\n\t\t/// <summary>\n\t\t/// 単項+。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <returns>+f(x)</returns>\n\t\tpublic static Polynomial operator+ (Polynomial f)\n\t\t{\n\t\t\treturn f.Clone();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式同士の加算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <param name=\"g\">g(x)</param>\n\t\t/// <returns>f(x) + g(x)</returns>\n\t\tpublic static Polynomial operator+ (Polynomial f, Polynomial g)\n\t\t{\n\t\t\tCoefType[] a, b, c;\n\t\t\tSelect(f.coef, g.coef, out a, out b);\n\t\t\tc = new CoefType[a.Length];\n\n\t\t\tint n = 0;\n\t\t\tfor(; n<b.Length; ++n) c[n] = a[n] + b[n];\n\t\t\tfor(; n<a.Length; ++n) c[n] = a[n];\n\n\t\t\treturn new Polynomial(c);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式同士の減算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <param name=\"g\">g(x)</param>\n\t\t/// <returns>f(x) - g(x)</returns>\n\t\tpublic static Polynomial operator- (Polynomial f, Polynomial g)\n\t\t{\n\t\t\tCoefType[] c;\n\n\t\t\tif(f.coef.Length > g.coef.Length)\n\t\t\t{\n\t\t\t\tc = new CoefType[f.coef.Length];\n\n\t\t\t\tint n = 0;\n\t\t\t\tfor(; n<g.coef.Length; ++n) c[n] = f.coef[n] - g.coef[n];\n\t\t\t\tfor(; n<f.coef.Length; ++n) c[n] = f.coef[n];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tc = new CoefType[g.coef.Length];\n\n\t\t\t\tint n = 0;\n\t\t\t\tfor(; n<f.coef.Length; ++n) c[n] = f.coef[n] - g.coef[n];\n\t\t\t\tfor(; n<g.coef.Length; ++n) c[n] = -g.coef[n];\n\t\t\t}\n\n\t\t\treturn new Polynomial(c);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// -f\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <returns>-f(x)</returns>\n\t\tpublic static Polynomial operator-(Polynomial f)\n\t\t{\n\t\t\tCoefType[] c;\n\t\t\tc = new CoefType[f.coef.Length];\n\t\t\tfor(int n=0; n<f.coef.Length; ++n) c[n] = -f.coef[n];\n\t\t\treturn new Polynomial(c);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式同士の乗算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <param name=\"g\">g(x)</param>\n\t\t/// <returns>f(x) × g(x)</returns>\n\t\tpublic static Polynomial operator* (Polynomial f, Polynomial g)\n\t\t{\n\t\t\tCoefType[] c = Convolute(f.coef, g.coef);\n\t\t\treturn new Polynomial(c);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 多項式÷係数体。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">f(x)</param>\n\t\t/// <param name=\"a\">a</param>\n\t\t/// <returns>f(x) ÷ a</returns>\n\t\tpublic static Polynomial operator/ (Polynomial f, CoefType a)\n\t\t{\n\t\t\tCoefType[] c = (CoefType[])f.coef.Clone();\n\t\t\tfor(int n=0; n<c.Length; ++n) c[n] /= a;\n\t\t\treturn new Polynomial(c);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 係数→多項式のキャスト。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">係数</param>\n\t\t/// <returns>Polynominal</returns>\n\t\tpublic static implicit operator Polynomial (CoefType a)\n\t\t{\n\t\t\treturn new Polynomial(a);\n\t\t}\n\n\t\t#endregion\n\t\t#region 特殊な多項式を取得\n\n\t\t#region x のべき乗\n\n\t\t/// <summary>\n\t\t/// x の n 乗を返す。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">指数</param>\n\t\t/// <returns>x の n 乗</returns>\n\t\tpublic static Polynomial X(int n)\n\t\t{\n\t\t\treturn Polynomial.X(n, 1);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// a x^n を返す。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">指数</param>\n\t\t/// <param name=\"a\">係数</param>\n\t\t/// <returns>x の n 乗</returns>\n\t\tpublic static Polynomial X(int n, CoefType a)\n\t\t{\n\t\t\tCoefType[] c = new CoefType[n + 1];\n\t\t\tfor(int i=0; i<n; ++i) c[i] = 0;\n\t\t\tc[n] = a;\n\n\t\t\treturn new Polynomial(c);\n\t\t}\n\n\t\t#endregion\n\t\t#region チェビシェフ多項式\n\n\t\t/// <summary>\n\t\t/// チェビシェフ多項式を計算する。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">次数</param>\n\t\t/// <returns>次数 n のチェビシェフ多項式</returns>\n\t\tpublic static Polynomial Chebyshev(int n)\n\t\t{\n\t\t\tif(n == 0)\n\t\t\t\treturn Polynomial.X(0, 1);\n\t\t\telse if(n == 1)\n\t\t\t\treturn Polynomial.X(1, 1);\n\t\t\t\n\t\t\treturn Polynomial.X(1, 2) * Polynomial.Chebyshev(n - 1) - Polynomial.Chebyshev(n - 2);\n\t\t}\n\n\t\t#endregion\n\t\t#region ラグランジュ補間\n\n\t\tpublic static Polynomial Lagrange(DomainType[] x, DomainType[] y)\n\t\t{\n\t\t\tif(x.Length != y.Length)\n\t\t\t\tthrow new System.ArgumentException(\"x と y の次数は等しくなければいけません。\");\n\n\t\t\tint len = x.Length;\n\t\t\tPolynomial p = (Polynomial)(CoefType)0.0;\n\t\t\tPolynomial X = Polynomial.X(1);\n\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\tPolynomial q = (Polynomial)(CoefType)y[i];\n\n\t\t\t\tfor(int j=0; j<len; ++j)\n\t\t\t\t{\n\t\t\t\t\tif(i == j) continue;\n\n\t\t\t\t\tPolynomial temp = (X - (CoefType)x[j]);\n\t\t\t\t\ttemp /= (x[i] - x[j]);\n\t\t\t\t\tq *= (X - (CoefType)x[j]) / (x[i] - (CoefType)x[j]);\n\t\t\t\t}\n\t\t\t\tp += q;\n\t\t\t}\n\n\t\t\treturn p;\n\t\t}\n\n\t\t#endregion\n\n\t\t#endregion\n\t\t#region static 関数\n\n\t\t/// <summary>\n\t\t/// x と y のうち、長い方の配列を a に、短い方を b に格納。\n\t\t/// </summary>\n\t\tstatic void Select(CoefType[] x, CoefType[] y, out CoefType[] a, out CoefType[] b)\n\t\t{\n\t\t\tif(x.Length > y.Length)\n\t\t\t{\n\t\t\t\ta = x;\n\t\t\t\tb = y;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\ta = y;\n\t\t\t\tb = x;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列の畳込み積を計算する。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">配列1</param>\n\t\t/// <param name=\"y\">配列2</param>\n\t\t/// <returns>x * y</returns>\n\t\tstatic CoefType[] Convolute(CoefType[] x, CoefType[] y)\n\t\t{\n\t\t\tCoefType[] a, b, c;\n\n\t\t\tSelect(x, y, out a, out b);\n\n\t\t\tc = new CoefType[a.Length + b.Length - 1];\n\t\t\tfor(int k=0; k<c.Length; ++k) c[k] = 0;\n\n\t\t\tint i=0;\n\t\t\tfor(; i<b.Length; ++i)\n\t\t\t\tfor(int k=0, l=i; k<=i; ++k, --l)\n\t\t\t\t\tc[i] += a[k] * b[l];\n\t\t\tfor(; i<a.Length; ++i)\n\t\t\t\tfor(int k=i, l=0; l<b.Length; --k, ++l)\n\t\t\t\t\tc[i] += a[k] * b[l];\n\t\t\tfor(; i<c.Length; ++i)\n\t\t\t\tfor(int l=b.Length-1, k=i-l; k<a.Length; ++k, --l)\n\t\t\t\t\tc[i] += a[k] * b[l];\n\n\t\t\treturn c;\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tPolynomial p = obj as Polynomial;\n\n\t\t\tif(p == null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif(this.coef.Length != p.coef.Length)\n\t\t\t\treturn false;\n\n\t\t\tfor(int i=0; i<this.coef.Length; ++i)\n\t\t\t{\n\t\t\t\tif(this.coef[i] != p.coef[i])\n\t\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\tint code = 2376498;\n\n\t\t\tfor(int i=0; i<this.coef.Length; ++i)\n\t\t\t{\n\t\t\t\tcode <<= 2;\n\t\t\t\tcode ^= this.coef[i].GetHashCode();\n\t\t\t}\n\n\t\t\treturn (int)code;\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable メンバ\n\n\t\tpublic Polynomial Clone()\n\t\t{\n\t\t\treturn new Polynomial((CoefType[])this.coef.Clone());\n\t\t}\n\n\t\tobject ICloneable.Clone()\n\t\t{\n\t\t\treturn this.Clone();\n\t\t}\n\n\t\t#endregion\n\t}\n}\n\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Elementary/Polynomial.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function.Elementary\n{\n\tusing CoefType   = System.Double;\n\tusing DomainType = System.Double;\n\tusing ValueType  = System.Double;\n\tusing Poly = SoundLibrary.Mathematics.Expression.Polynomial;\n\n\t/// <summary>\n\t/// 多項式。\n\t/// </summary>\n\tpublic class Polynomial : Unary\n\t{\n\t\t#region フィールド\n\n\t\tPoly p;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Polynomial(Function f) : this(f, 0.0) {}\n\n\t\tpublic Polynomial(Function f, int order) : this(f, new CoefType[order + 1]) {}\n\n\t\tpublic Polynomial(Function f, params CoefType[] coef) : this(f, new Poly(coef)) {}\n\n\t\tpublic Polynomial(Function f, Poly p) : base(null, f)\n\t\t{\n\t\t\tthis.p = p;\n\t\t\tthis.func = new UnaryFunction(this.p.Value);\n\t\t}\n\n\t\t#endregion\n\t\t#region 複素数対応\n\n\t\tprotected override void GetComplexPart(Function reX, Function imX, out Function reY, out Function imY)\n\t\t{\n\t\t\tPolynomial[] reCoef = new Polynomial[this.p.Coef.Length];\n\t\t\tPolynomial[] imCoef = new Polynomial[this.p.Coef.Length];\n\n\t\t\treY = new GeneralPolynomial(reX, reCoef);\n\t\t\timY = new GeneralPolynomial(reX, imCoef);\n\n\t\t\tFunction z = imX / reX;\n\n\t\t\tfor(int n=0; n<this.p.Coef.Length; ++n)\n\t\t\t{\n\t\t\t\treCoef[n] = new Polynomial(z, n);\n\t\t\t\timCoef[n] = new Polynomial(z, n);\n\n\t\t\t\tfor(int k=0; k<=n; ++k)\n\t\t\t\t{\n\t\t\t\t\tswitch(k % 4)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\treCoef[n].p.Coef[k] = this.p.Coef[n] * Misc.Combination(n, k);\n\t\t\t\t\t\t\timCoef[n].p.Coef[k] = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\treCoef[n].p.Coef[k] = 0;\n\t\t\t\t\t\t\timCoef[n].p.Coef[k] = this.p.Coef[n] * Misc.Combination(n, k);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\treCoef[n].p.Coef[k] = -this.p.Coef[n] * Misc.Combination(n, k);\n\t\t\t\t\t\t\timCoef[n].p.Coef[k] = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treCoef[n].p.Coef[k] = 0;\n\t\t\t\t\t\t\timCoef[n].p.Coef[k] = -this.p.Coef[n] * Misc.Combination(n, k);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算子\n\n\t\tpublic override Function Negate()\n\t\t{\n\t\t\treturn new Polynomial(this.inner, -this.p);\n\t\t}\n\n\t\tpublic override Function Add(Function f)\n\t\t{\n\t\t\tPolynomial poly = f as Polynomial;\n\t\t\tif(poly != null && this.inner.Equals(poly.inner))\n\t\t\t{\n\t\t\t\tPoly p = this.p + poly.p;\n\t\t\t\treturn new Polynomial(this.inner, p);\n\t\t\t}\n\n\t\t\tif(this.inner.Equals(f))\n\t\t\t{\n\t\t\t\treturn new Polynomial(this.inner, this.p + Poly.X(1));\n\t\t\t}\n\n\t\t\tConstant c = f as Constant;\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\treturn new Polynomial(this.inner, this.p + c.Value);\n\t\t\t}\n\n\t\t\treturn base.Add(f);\n\t\t}\n\n\t\tpublic override Function Subtract(Function f)\n\t\t{\n\t\t\tPolynomial poly = f as Polynomial;\n\n\t\t\tif(poly == null || !this.inner.Equals(poly.inner))\n\t\t\t{\n\t\t\t\treturn base.Subtract(f);\n\t\t\t}\n\n\t\t\tPoly p = this.p - poly.p;\n\t\t\treturn new Polynomial(this.inner, p);\n\t\t}\n\n\t\tpublic override Function Multiply(Function f)\n\t\t{\n\t\t\tPolynomial poly = f as Polynomial;\n\n\t\t\tif(poly != null && this.inner.Equals(poly.inner))\n\t\t\t{\n\t\t\t\tPoly p = this.p * poly.p;\n\t\t\t\treturn new Polynomial(this.inner, p);\n\t\t\t}\n\n\t\t\tif(this.inner.Equals(f))\n\t\t\t{\n\t\t\t\treturn new Polynomial(this.inner, this.p * Poly.X(1));\n\t\t\t}\n\n\t\t\tConstant c = f as Constant;\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\treturn new Polynomial(this.inner, this.p * c.Value);\n\t\t\t}\n\n\t\t\treturn base.Multiply(f);\n\t\t}\n\n\t\t#endregion\n\t\t#region 微分\n\n\t\tprotected override Function Differentiate()\n\t\t{\n\t\t\tCoefType[] coef  = this.p.Coef;\n\n\t\t\tif(coef.Length <= 1)\n\t\t\t\treturn (Constant)0;\n\n\t\t\t//! ↓ Mathematics.Expression.Polynomial の方にあるべきコードかも。\n\t\t\tCoefType[] deriv = new CoefType[coef.Length - 1];\n\n\t\t\tfor(int i=1; i<coef.Length; ++i)\n\t\t\t{\n\t\t\t\tderiv[i - 1] = i * coef[i];\n\t\t\t}\n\n\t\t\treturn new Polynomial(this.inner, new Poly(deriv));\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部構造の最適化\n\n\t\tpublic override Function Optimize()\n\t\t{\n\t\t\tif(this.p.Coef.Length == 1)\n\t\t\t\treturn (Constant)this.p.Coef[0];\n\n\t\t\tif(this.p.Coef.Length == 2 && this.p.Coef[0] == 0)\n\t\t\t{\n\t\t\t\tif(this.p.Coef[1] == 1)\n\t\t\t\t\treturn this.inner;\n\n\t\t\t\treturn new Multiple(this.p.Coef[1], this.inner);\n\t\t\t}\n\n\t\t\treturn this;\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\tstring str;\n\n\t\t\tstr = this.p.Coef[0].ToString();\n\n\t\t\tfor(int i=1; i<this.p.Coef.Length; ++i)\n\t\t\t{\n\t\t\t\tif(this.p.Coef[i] < 0)\n\t\t\t\t{\n\t\t\t\t\tstr += string.Format(\" - {0}X^{1}\", Math.Abs(this.p.Coef[i]), i);\n\t\t\t\t}\n\t\t\t\telse if(this.p.Coef[i] > 0)\n\t\t\t\t{\n\t\t\t\t\tstr += string.Format(\" + {0}X^{1}\", this.p.Coef[i], i);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstr += string.Format(\"(X = {0})\", this.inner);\n\n\t\t\treturn str;\n\t\t}\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tPolynomial f = obj as Polynomial;\n\n\t\t\tif(f == null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn this.p.Equals(f.p) && this.inner.Equals(f.inner);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn this.p.GetHashCode() ^ this.inner.GetHashCode();\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Polynomial(this.inner, this.p);\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Fraction.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\tusing ValueType = System.Double;\n\n\t/// <summary>\n\t/// 分数型の関数。\n\t/// </summary>\n\tpublic class Fraction : Function\n\t{\n\t\t#region フィールド\n\n\t\t/// <summary>\n\t\t/// 分子。\n\t\t/// </summary>\n\t\tFunction num;\n\n\t\t/// <summary>\n\t\t/// 分母\n\t\t/// </summary>\n\t\tFunction denom;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Fraction(Function num, Function denom)\n\t\t{\n\t\t\tthis.num = num;\n\t\t\tthis.denom = denom;\n\t\t}\n\n\t\tpublic static Function Create(Function num, Function denom)\n\t\t{\n\t\t\tif(num == denom)\n\t\t\t\treturn (Constant)1;\n\t\t\treturn new Fraction(num, denom);\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\tpublic override System.Collections.ArrayList GetVariableList()\n\t\t{\n\t\t\treturn Misc.Merge(this.num.GetVariableList(), this.denom.GetVariableList());\n\t\t}\n\n\t\tpublic override ValueType GetValue(params Parameter[] x)\n\t\t{\n\t\t\tValueType y;\n\n\t\t\ty = this.num.GetValue(x);\n\t\t\ty /= this.denom.GetValue(x);\n\n\t\t\treturn y;\n\t\t}\n\n\t\tpublic override Function Bind(params Parameter[] x)\n\t\t{\n\t\t\tFunction num   = this.num.Bind(x);\n\t\t\tFunction denom = this.denom.Bind(x);\n\n\t\t\tif(denom is Constant)\n\t\t\t{\n\t\t\t\tConstant c = denom as Constant;\n\t\t\t\tValueType val = 1 / c.Value;\n\n\t\t\t\tif(num is Constant)\n\t\t\t\t{\n\t\t\t\t\tc = num as Constant;\n\t\t\t\t\tval *= c.Value;\n\t\t\t\t\treturn (Constant)val;\n\t\t\t\t}\n\n\t\t\t\tc = (Constant)val;\n\t\t\t\treturn c * num;\n\t\t\t}\n\n\t\t\treturn Fraction.Create(num, denom);\n\t\t}\n\n\t\t#endregion\n\t\t#region 複素数対応\n\n\t\tpublic override void GetComplexPart(out Function re, out Function im)\n\t\t{\n\t\t\tFunction reN, imN, reD, imD;\n\t\t\tthis.num.GetComplexPart(out reN, out imN);\n\t\t\tthis.denom.GetComplexPart(out reD, out imD);\n\n\t\t\tFunction denom = reD * reD + imD * imD;\n\n\t\t\tre = (reN * reD + imN * imD) / denom;\n\t\t\tim = (imN * reD - reN * imD) / denom;\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算\n\n\t\tpublic override Function Multiply(Function f)\n\t\t{\n\t\t\tif(f is Fraction)\n\t\t\t{\n\t\t\t\tFraction frac = f as Fraction;\n\t\t\t\treturn Fraction.Create(this.num * frac.num, this.denom * frac.denom);\n\t\t\t}\n\n\t\t\treturn Fraction.Create(this.num * f, this.denom);\n\t\t}\n\n\t\tpublic override Function Divide(Function f)\n\t\t{\n\t\t\tif(f is Fraction)\n\t\t\t{\n\t\t\t\tFraction frac = f as Fraction;\n\t\t\t\treturn Fraction.Create(this.num * frac.denom, this.denom * frac.num);\n\t\t\t}\n\n\t\t\treturn Fraction.Create(this.num, this.denom * f);\n\t\t}\n\n\t\t#endregion\n\t\t#region 微分\n\n\t\tpublic override Function Differentiate(Variable x)\n\t\t{\n\t\t\tFunction num  = this.num;\n\t\t\tFunction nump = num.Differentiate(x);\n\t\t\tFunction denom  = this.denom;\n\t\t\tFunction denomp = denom.Differentiate(x);\n\n\t\t\treturn (nump * denom - num * denomp) / (denom * denom);\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部構造の最適化\n\n\t\tpublic override Function Optimize()\n\t\t{\n\t\t\tFunction num = this.num.Optimize();\n\t\t\tFunction denom = this.denom.Optimize();\n\n\t\t\tif(num.Equals(denom))\n\t\t\t{\n\t\t\t\treturn (Constant)1;\n\t\t\t}\n\n\t\t\treturn Fraction.Create(num, denom);\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\tstring str = \"{\";\n\t\t\tstr += this.num.ToString();\n\t\t\tstr += \"}/{\";\n\t\t\tstr += this.denom.ToString();\n\t\t\tstr += \"}\";\n\t\t\treturn str;\n\t\t}\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tFraction f = obj as Fraction;\n\n\t\t\tif(f == null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn this.num.Equals(f.num) && this.denom.Equals(f.denom);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn this.num.GetHashCode() ^ this.denom.GetHashCode();\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Fraction(this.num.Clone(), this.denom.Clone());\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Function.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\tusing ValueType = System.Double;\n\n\t/// <summary>\n\t/// 関数を表すクラスの抽象基底。\n\t/// </summary>\n\tpublic abstract class Function : ICloneable\n\t{\n\t\t#region フィールド\n\n\t\t//ArrayList variables = new ArrayList();\n\n\t\t#endregion\n\t\t#region 内部クラス\n\n\t\tpublic class Parameter\n\t\t{\n\t\t\tpublic Variable  x;\n\t\t\tpublic ValueType val;\n\n\t\t\tpublic Parameter(Variable x, ValueType val)\n\t\t\t{\n\t\t\t\tthis.x = x;\n\t\t\t\tthis.val = val;\n\t\t\t}\n\n\t\t\tpublic override bool Equals(object obj)\n\t\t\t{\n\t\t\t\tParameter v = (Parameter)obj;\n\t\t\t\treturn this.x.Equals(v.x) && this.val.Equals(v.val);\n\t\t\t}\n\n\t\t\tpublic override int GetHashCode()\n\t\t\t{\n\t\t\t\treturn this.x.GetHashCode() ^ this.val.GetHashCode();\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\tpublic VariableTable GetVariableTable()\n\t\t{\n\t\t\treturn new VariableTable(this.GetVariableList());\n\t\t}\n\n\t\t/// <summary>\n\t\t/// その関数に含まれている変数のリストを求める。\n\t\t/// 例えば、f(g(x, y), h(x)) + i(y, z) とか言うように、\n\t\t/// 関数の合成・四則演算を使って作った関数の場合、{x, y, z} というリストを返す。\n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic abstract System.Collections.ArrayList GetVariableList();\n\n\t\t/// <summary>\n\t\t/// 値の計算。\n\t\t/// </summary>\n\t\tpublic virtual ValueType this[VariableTable t]\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.GetValue(t.GetParameterList());\n\t\t\t}\n\t\t}\n\n\t\tpublic abstract ValueType GetValue(params Parameter[] x);\n\n\t\t/// <summary>\n\t\t/// 値を固定する。\n\t\t/// 例えば、f(x, y) っていう関数があったとして、\n\t\t/// y = 1 で固定した関数 g(x) = f(x, 1) を求めたり。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">固定したい値のリスト</param>\n\t\t/// <returns>値固定後の関数</returns>\n\t\tpublic abstract Function Bind(params Parameter[] x);\n\n\t\t#endregion\n\t\t#region 複素数対応\n\n\t\t/// <summary>\n\t\t/// 関数 f(z) を複素関数とみなしたとき、その実部と虚部\n\t\t/// Re[f](Re(z), Im(z)), Im[f](Re(z), Im(z) を求める。\n\t\t/// 例えば、Exp の場合、\n\t\t/// reY = Exp(reX) * Cos(imX),\n\t\t/// imY = Exp(reX) * Sin(imX)\n\t\t/// </summary>\n\t\t/// <param name=\"reX\">パラメータの実部</param>\n\t\t/// <param name=\"imX\">パラメータの虚部</param>\n\t\tpublic virtual void GetComplexPart(out Function re, out Function im)\n\t\t{\n\t\t\tthrow new InvalidOperationException(\"この関数は複素数未対応です。\");\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 複素関数のノルム関数 |f(z)|^2 を求める。\n\t\t/// </summary>\n\t\t/// <returns>ノルム</returns>\n\t\tpublic Function Norm()\n\t\t{\n\t\t\tFunction re, im;\n\t\t\tthis.GetComplexPart(out re, out im);\n\t\t\treturn re * re + im * im;\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算\n\n\t\t/// <summary>\n\t\t/// 正負反転。\n\t\t/// </summary>\n\t\t/// <returns>正負反転結果</returns>\n\t\tpublic virtual Function Negate()\n\t\t{\n\t\t\treturn this.Multiply((Constant)(-1.0));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 加算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">オペランド</param>\n\t\t/// <returns>加算結果</returns>\n\t\tpublic virtual Function Add(Function f)\n\t\t{\n\t\t\treturn new Sum(this, f);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 減算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">オペランド</param>\n\t\t/// <returns>減算結果</returns>\n\t\tpublic virtual Function Subtract(Function f)\n\t\t{\n\t\t\treturn this.Add(f.Negate());\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 乗算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">オペランド</param>\n\t\t/// <returns>乗算結果</returns>\n\t\tpublic virtual Function Multiply(Function f)\n\t\t{\n\t\t\tConstant c = f as Constant;\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\treturn new Multiple(c.Value, this);\n\t\t\t}\n\n\t\t\treturn new Product(this, f);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 除算。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">オペランド</param>\n\t\t/// <returns>除算結果</returns>\n\t\tpublic virtual Function Divide(Function f)\n\t\t{\n\t\t\tConstant c = f as Constant;\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\treturn new Multiple(1 / c.Value, this);\n\t\t\t}\n\n\t\t\treturn Fraction.Create(this, f);\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算子\n\n\t\tpublic static Function operator+ (Function f)\n\t\t{\n\t\t\treturn f.Clone();\n\t\t}\n\n\t\tpublic static Function operator- (Function f)\n\t\t{\n\t\t\treturn f.Negate();\n\t\t}\n\n\t\tpublic static Function operator+ (Function f, Function g)\n\t\t{\n\t\t\tif(f.Equals((Constant)0))\n\t\t\t\treturn g;\n\t\t\tif(g.Equals((Constant)0))\n\t\t\t\treturn f;\n\t\t\tif(f.Equals(g))\n\t\t\t\treturn new Multiple(2, f);\n\n\t\t\treturn f.Add(g);\n\t\t}\n\n\t\tpublic static Function operator- (Function f, Function g)\n\t\t{\n\t\t\tif(f.Equals(g))\n\t\t\t\treturn (Constant)0;\n\t\t\treturn f.Subtract(g);\n\t\t}\n\n\t\tpublic static Function operator* (Function f, Function g)\n\t\t{\n\t\t\tif(f.Equals((Constant)0) || g.Equals((Constant)0))\n\t\t\t\treturn (Constant)0;\n\t\t\tif(f.Equals((Constant)1))\n\t\t\t\treturn g;\n\t\t\tif(g.Equals((Constant)1))\n\t\t\t\treturn f;\n//\t\t\tif(f.Equals(g))\n//\t\t\t\treturn Function.X(f, 2);\n\n\t\t\treturn f.Multiply(g);\n\t\t}\n\n\t\tpublic static Function operator/ (Function f, Function g)\n\t\t{\n\t\t\tif(f.Equals(g))\n\t\t\t\treturn (Constant)1;\n\t\t\treturn f.Divide(g);\n\t\t}\n\n\t\tpublic static implicit operator Function (double x)\n\t\t{\n\t\t\treturn (Constant)x;\n\t\t}\n\n\t\t#endregion\n\t\t#region 微分\n\n\t\t/// <summary>\n\t\t/// (x による偏)導関数を求める。\n\t\t/// 解析的に計算。\n\t\t/// 解析的に計算できない関数の場合、InvalidOperationException を throw する。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">微分対象となる変数</param>\n\t\t/// <returns>導関数</returns>\n\t\tpublic virtual Function Differentiate(Variable x)\n\t\t{\n\t\t\tthrow new InvalidOperationException(\"微分できません\");\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部構造の最適化\n\n\t\t/// <summary>\n\t\t/// 内部構造を最適化する。\n\t\t/// 例えば、1×f → f, 0×f → 0。\n\t\t/// </summary>\n\t\t/// <returns>最適化後の関数</returns>\n\t\t/// <remarks>\n\t\t/// 一発で100％完璧な最適化が掛かるわけではない。\n\t\t/// 2・3度繰り返すことで、より最適化がかかる場合もあり。\n\t\t/// </remarks>\n\t\tpublic virtual Function Optimize()\n\t\t{\n\t\t\treturn this;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部構造を最適化する。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">反復回数</param>\n\t\t/// <returns>最適化後の関数</returns>\n\t\t/// <remarks>\n\t\t/// 一発で完全な最適化が出来ないので、何度か処理を繰り返す。\n\t\t/// </remarks>\n\t\tpublic Function Optimize(int n)\n\t\t{\n\t\t\tFunction opt = this.Optimize();\n\t\t\tfor(; n>0; --n) opt = opt.Optimize();\n\t\t\treturn opt;\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable メンバ\n\n\t\tpublic abstract Function Clone();\n\n\t\tobject ICloneable.Clone()\n\t\t{\n\t\t\treturn this.Clone();\n\t\t}\n\n\t\t#endregion\n\t\t#region 特殊な関数\n\n\t\t#region 単項関数\n\n\t\tpublic static Unary Exp(Function f)\n\t\t{\n\t\t\treturn new Elementary.Exp(f);\n\t\t}\n\n\t\tpublic static Unary Log(Function f)\n\t\t{\n\t\t\treturn new Elementary.LogE(f);\n\t\t}\n\n\t\tpublic static Unary Log10(Function f)\n\t\t{\n\t\t\treturn new Elementary.Log10(f);\n\t\t}\n\n\t\tpublic static Unary Sin(Function f)\n\t\t{\n\t\t\treturn new Elementary.Sin(f);\n\t\t}\n\n\t\tpublic static Unary Cos(Function f)\n\t\t{\n\t\t\treturn new Elementary.Cos(f);\n\t\t}\n\n\t\tpublic static Unary Tan(Function f)\n\t\t{\n\t\t\treturn new Elementary.Tan(f);\n\t\t}\n\n\t\tpublic static Unary Asin(Function f)\n\t\t{\n\t\t\treturn new Unary(\n\t\t\t\tnew UnaryFunction(Math.Asin),\n\t\t\t\tf);\n\t\t}\n\n\t\tpublic static Unary Acos(Function f)\n\t\t{\n\t\t\treturn new Unary(\n\t\t\t\tnew UnaryFunction(Math.Acos),\n\t\t\t\tf);\n\t\t}\n\n\t\tpublic static Unary Atan(Function f)\n\t\t{\n\t\t\treturn new Unary(\n\t\t\t\tnew UnaryFunction(Math.Atan),\n\t\t\t\tf);\n\t\t}\n\n\t\tpublic static Unary Sinh(Function f)\n\t\t{\n\t\t\treturn new Elementary.Sinh(f);\n\t\t}\n\n\t\tpublic static Unary Cosh(Function f)\n\t\t{\n\t\t\treturn new Elementary.Cosh(f);\n\t\t}\n\n\t\tpublic static Unary Tanh(Function f)\n\t\t{\n\t\t\treturn new Elementary.Tanh(f);\n\t\t}\n\n\t\tpublic static Unary Abs(Function f)\n\t\t{\n\t\t\treturn new Unary(\n\t\t\t\tnew UnaryFunction(Math.Abs),\n\t\t\t\tf);\n\t\t}\n\n\t\tpublic static Unary Sqrt(Function f)\n\t\t{\n\t\t\treturn new Elementary.Sqrt(f);\n\t\t}\n\n\t\t#endregion\n\t\t#region 二項関数\n\n\t\tpublic static Binary Pow(Function f, Function g)\n\t\t{\n\t\t\treturn new Elementary.Pow(f, g);\n\t\t}\n\n\t\tpublic static Binary Log(Function f, Function g)\n\t\t{\n\t\t\treturn new Elementary.Log(f, g);\n\t\t}\n\n\t\tpublic static Binary Atan2(Function f, Function g)\n\t\t{\n\t\t\treturn new Binary(\n\t\t\t\tnew BinaryFunction(Math.Atan2),\n\t\t\t\tf, g);\n\t\t}\n\n\t\t#endregion\n\t\t#region 多項式\n\n\t\tpublic static Unary X(Function f)\n\t\t{\n\t\t\treturn X(f, 1, 1);\n\t\t}\n\n\t\tpublic static Unary X(Function f, int order)\n\t\t{\n\t\t\treturn X(f, order, 1);\n\t\t}\n\n\t\tpublic static Unary X(Function f, int order, double coef)\n\t\t{\n\t\t\treturn new Elementary.Polynomial(f, Mathematics.Expression.Polynomial.X(order, coef));\n\t\t}\n\n\t\t#endregion\n\t\t#region 虚数\n\n\t\tpublic static Function I(Function f)\n\t\t{\n\t\t\treturn new Imaginary(f);\n\t\t}\n\n\t\t#endregion\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Imaginary.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\t/// <summary>\n\t/// 虚数倍。\n\t/// ×i (i は虚数単位)。\n\t/// GetValue (実数値計算)には適用されない。\n\t/// </summary>\n\tpublic class Imaginary : Function\n\t{\n\t\tFunction f;\n\n\t\tpublic Imaginary(Function f)\n\t\t{\n\t\t\tthis.f = f;\n\t\t}\n\n\t\tpublic override System.Collections.ArrayList GetVariableList()\n\t\t{\n\t\t\treturn this.f.GetVariableList();\n\t\t}\n\n\t\tpublic override Function Bind(params SoundLibrary.Mathematics.Function.Function.Parameter[] x)\n\t\t{\n\t\t\treturn new Imaginary(this.f.Bind(x));\n\t\t}\n\n\t\tpublic override Double GetValue(params SoundLibrary.Mathematics.Function.Function.Parameter[] x)\n\t\t{\n\t\t\treturn this.f.GetValue(x);\n\t\t}\n\n\t\tpublic override void GetComplexPart(out Function re, out Function im)\n\t\t{\n\t\t\tFunction r, i;\n\t\t\tthis.f.GetComplexPart(out r, out i);\n\t\t\tre = -i;\n\t\t\tim = r;\n\t\t}\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Imaginary(this.f.Clone());\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Multiple.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\tusing ValueType = System.Double;\n\n\t/// <summary>\n\t/// 定数×関数。\n\t/// </summary>\n\tpublic class Multiple : Function\n\t{\n\t\t#region フィールド\n\n\t\t/// <summary>\n\t\t/// 加算対象関数リスト。\n\t\t/// </summary>\n\t\tValueType factor;\n\n\t\t/// <summary>\n\t\t/// 内包している関数。\n\t\t/// </summary>\n    Function inner;\n\n\t\t#endregion\n\t\t#region プロパティ\n\n\t\tpublic double Factor{get{return this.factor;}}\n\t\tpublic Function Inner{get{return this.inner;}}\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Multiple(ValueType factor, Function f)\n\t\t{\n\t\t\tthis.factor = factor;\n\t\t\tthis.inner  = f;\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\tpublic override System.Collections.ArrayList GetVariableList()\n\t\t{\n\t\t\treturn this.inner.GetVariableList();\n\t\t}\n\n\t\tpublic override ValueType GetValue(params Parameter[] x)\n\t\t{\n\t\t\treturn this.factor * this.inner.GetValue(x);\n\t\t}\n\n\t\tpublic override Function Bind(params Parameter[] x)\n\t\t{\n\t\t\tFunction f = this.inner.Bind(x);\n\n\t\t\tif(f is Constant)\n\t\t\t{\n\t\t\t\tConstant c = f as Constant;\n\t\t\t\treturn (Constant)(this.factor * c.Value);\n\t\t\t}\n\n\t\t\treturn new Multiple(this.factor, f);\n\t\t}\n\n\t\t#endregion\n\t\t#region 複素数対応\n\n\t\tpublic override void GetComplexPart(out Function re, out Function im)\n\t\t{\n\t\t\tthis.inner.GetComplexPart(out re, out im);\n\n\t\t\tre *= this.factor;\n\t\t\tim *= this.factor;\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算子\n\n\t\tpublic override Function Negate()\n\t\t{\n\t\t\treturn new Multiple(-this.factor, this.inner);\n\t\t}\n\n\t\tpublic override Function Add(Function f)\n\t\t{\n\t\t\tMultiple g = f as Multiple;\n\t\t\tif(g != null && this.inner.Equals(g.inner))\n\t\t\t{\n\t\t\t\treturn new Multiple(this.factor + g.factor, this.inner);\n\t\t\t}\n\n\t\t\tVariable v = f as Variable;\n\t\t\tif(v != null && this.inner.Equals(v))\n\t\t\t{\n\t\t\t\treturn new Multiple(this.factor + 1, this.inner);\n\t\t\t}\n\n\t\t\tConstant c = f as Constant;\n\t\t\tif(c != null && (this.inner is Constant))\n\t\t\t{\n\t\t\t\tConstant c0 = this.inner as Constant;\n\t\t\t\treturn (Constant)(c.Value + this.factor * c0.Value);\n\t\t\t}\n\n\t\t\treturn base.Add(f);\n\t\t}\n\n\t\t/*\n\t\tpublic override Function Subtract(Function f)\n\t\t{\n\t\t\tMultiple g = f as Multiple;\n\t\t\tif(g != null && this.inner.Equals(g.inner))\n\t\t\t{\n\t\t\t\treturn new Multiple(this.factor - g.factor, this.inner);\n\t\t\t}\n\n\t\t\tVariable v = f as Variable;\n\t\t\tif(v != null && this.inner.Equals(v))\n\t\t\t{\n\t\t\t\treturn new Multiple(this.factor - 1, this.inner);\n\t\t\t}\n\n\t\t\tConstant c = f as Constant;\n\t\t\tif(c != null && (this.inner is Constant))\n\t\t\t{\n\t\t\t\tConstant c0 = this.inner as Constant;\n\t\t\t\treturn (Constant)(this.factor * c0.Value - c.Value);\n\t\t\t}\n\n\t\t\treturn base.Subtract(f);\n\t\t}\n\t\t*/\n\n\t\tpublic override Function Multiply(Function f)\n\t\t{\n\t\t\tMultiple g = f as Multiple;\n\t\t\tif(g != null)\n\t\t\t{\n\t\t\t\treturn new Multiple(this.factor * g.factor, this.inner * g.inner);\n\t\t\t}\n\n\t\t\tConstant c = f as Constant;\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\tif(this.inner is Constant)\n\t\t\t\t{\n\t\t\t\t\tConstant c0 = this.inner as Constant;\n\t\t\t\t\treturn (Constant)(this.factor * c0.Value * c.Value);\n\t\t\t\t}\n\t\t\t\treturn new Multiple(this.factor * c.Value, this.inner);\n\t\t\t}\n\n\t\t\treturn new Multiple(this.factor, this.inner * f);\n\t\t}\n\n\t\tpublic override Function Divide(Function f)\n\t\t{\n\t\t\tMultiple g = f as Multiple;\n\n\t\t\tif(g != null)\n\t\t\t{\n\t\t\t\treturn new Multiple(this.factor / g.factor, this.inner / g.inner);\n\t\t\t}\n\n\t\t\treturn new Multiple(this.factor, this.inner / f);\n\t\t}\n\n\t\t#endregion\n\t\t#region 微分\n\n\t\tpublic override Function Differentiate(Variable x)\n\t\t{\n\t\t\tFunction f = this.inner.Differentiate(x);\n\n\t\t\tif(f is Constant)\n\t\t\t{\n\t\t\t\tConstant c = f as Constant;\n\t\t\t\treturn (Constant)(this.factor * c.Value);\n\t\t\t}\n\n\t\t\treturn new Multiple(this.factor, f);\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部構造の最適化\n\n\t\tpublic override Function Optimize()\n\t\t{\n\t\t\tif(this.factor == 0)\n\t\t\t\treturn (Constant)0;\n\n\t\t\tFunction f = this.inner.Optimize();\n\n\t\t\tif(this.factor == 1)\n\t\t\t\treturn f;\n\n\t\t\tConstant c = f as Constant;\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\treturn (Constant)(this.factor * c.Value);\n\t\t\t}\n\n\t\t\tMultiple m = f as Multiple;\n\t\t\tif(m != null)\n\t\t\t{\n\t\t\t\treturn new Multiple(this.factor * m.factor, m.inner);\n\t\t\t}\n\n\t\t\tProduct p = f as Product;\n\t\t\tif(p != null)\n\t\t\t{\n\t\t\t\tProduct tmp = p.Clone() as Product;\n\t\t\t\ttmp.AddList((Constant)this.factor);\n\t\t\t\treturn tmp.Optimize();\n\t\t\t}\n\n\t\t\treturn new Multiple(this.factor, f);\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override string ToString()\n\t\t{\n#if DEBUG\n\t\t\treturn \"m\" + this.factor.ToString() + \" * \" + this.inner.ToString();\n#else\n\t\t\treturn this.factor.ToString() + \" * \" + this.inner.ToString();\n#endif\n\t\t}\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tMultiple f = obj as Multiple;\n\n\t\t\tif(f == null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn (this.factor == f.factor) && this.inner.Equals(f.inner);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn (int)(this.inner.GetHashCode() * this.factor);\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Multiple(this.factor, this.inner);\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Product.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\tusing ValueType = System.Double;\n\n\t/// <summary>\n\t/// 関数の積。\n\t/// </summary>\n\tpublic class Product : Series\n\t{\n\t\t#region 初期化\n\n\t\tpublic Product(params Function[] functions) : base(functions) {}\n\t\tpublic Product(ArrayList functions) : base(functions) {}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\tpublic override System.Collections.ArrayList GetVariableList()\n\t\t{\n\t\t\tSystem.Collections.ArrayList list = new System.Collections.ArrayList();\n\n\t\t\tforeach(Function f in this.functions)\n\t\t\t{\n\t\t\t\tlist = Misc.Merge(list, f.GetVariableList());\n\t\t\t}\n\t\t\treturn list;\n\t\t}\n\n\t\tpublic override ValueType GetValue(params Parameter[] x)\n\t\t{\n\t\t\tValueType y = 1;\n\n\t\t\tforeach(Function f in this.functions)\n\t\t\t{\n\t\t\t\ty *= f.GetValue(x);\n\t\t\t}\n\n\t\t\treturn y;\n\t\t}\n\n\t\tpublic override Function Bind(params Parameter[] x)\n\t\t{\n\t\t\tFunction y = (Constant)1;\n\n\t\t\tforeach(Function f in this.functions)\n\t\t\t{\n\t\t\t\tFunction g = f.Bind(x);\n\t\t\t\ty *= g;\n\t\t\t}\n\n\t\t\treturn y;\n\t\t}\n\n\t\t#endregion\n\t\t#region 複素数対応\n\n\t\tpublic override void GetComplexPart(out Function re, out Function im)\n\t\t{\n\t\t\tFunction f;\n\n\t\t\tf = this.functions[0] as Function;\n\t\t\tf.GetComplexPart(out re, out im);\n\n\t\t\tfor(int i=1; i<this.functions.Count; ++i)\n\t\t\t{\n\t\t\t\tFunction re1, im1;\n\n\t\t\t\tf = this.functions[i] as Function;\n\t\t\t\tf.GetComplexPart(out re1, out im1);\n\n\t\t\t\tFunction re0 = re;\n\t\t\t\tre = re0 * re1 - im * im1;\n\t\t\t\tim = re0 * im1 + im * re1;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算\n\n\t\tpublic override Function Multiply(Function f)\n\t\t{\n\t\t\tProduct h = this.Clone() as Product;\n\n\t\t\tif(f is Product)\n\t\t\t{\n\t\t\t\tProduct g = f as Product;\n\t\t\t\th.AddList(g.functions);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\th.AddList(f);\n\t\t\t}\n\t\t\t// f が 0 のときの最適化。\n\n\t\t\treturn h;\n\t\t}\n\n\t\t#endregion\n\t\t#region 微分\n\n\t\tpublic override Function Differentiate(Variable x)\n\t\t{\n\t\t\tArrayList func;\n\t\t\tFunction sum = (Constant)0;\n\n\t\t\tforeach(Function f in this.functions)\n\t\t\t{\n\t\t\t\tfunc = (ArrayList)this.functions.Clone();\n\t\t\t\tfunc.Remove(f);\n\t\t\t\tfunc.Add(f.Differentiate(x));\n\t\t\t\tsum += new Product(func);\n\t\t\t}\n\n\t\t\treturn sum;\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部構造の最適化\n\n\t\tstatic Function Sort(Function f)\n\t\t{\n\t\t\tProduct p = f as Product;\n\t\t\tif(p == null) return f;\n\t\t\tp.functions.Sort();\n\t\t\treturn p;\n\t\t}\n\n\t\t/// <remarks>\n\t\t/// 同じ種類の関数ごとに掛けていった方が最適な構造が得られるため、\n\t\t/// 関数のリストを一度ソートしてから掛けなおす。\n\t\t/// あと、Constant とか Variable とか Function の辺りの乗算を最適化。\n\t\t/// </remarks>\n\t\tpublic override Function Optimize()\n\t\t{\n\t\t\tHashtable table = new Hashtable();\n\n\t\t\t// 種類わけ\n\t\t\tforeach(Function f in this.functions)\n\t\t\t{\n\t\t\t\tFunction g = f.Optimize();\n\n\t\t\t\tType t = g.GetType();\n\t\t\t\tif(table[t] == null)\n\t\t\t\t{\n\t\t\t\t\ttable[t] = g;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttable[t] = (Function)table[t] * g;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 繋ぎなおす\n\t\t\tConstant c = table[typeof(Constant)] as Constant;\n\n\t\t\tif(c != null && c.Equals((Constant)0))\n\t\t\t\treturn (Constant)0;\n\n\t\t\tFunction v = table[typeof(Variable)] as Function;\n\t\t\tMultiple m = table[typeof(Multiple)] as Multiple;\n\n\t\t\tFunction h = (Constant)1;\n\t\t\tif(v != null)\n\t\t\t{\n\t\t\t\th = Sort(v);\n\t\t\t\ttable.Remove(typeof(Variable));\n\t\t\t}\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\ttable.Remove(typeof(Constant));\n\t\t\t}\n\t\t\tif(m != null)\n\t\t\t{\n\t\t\t\tif(c == null)\n\t\t\t\t\tc = (Constant)m.Factor;\n\t\t\t\telse\n\t\t\t\t\tc = (Constant)(c.Value * m.Factor);\n\t\t\t\th *= m.Inner;\n\t\t\t\ttable.Remove(typeof(Multiple));\n\t\t\t}\n\n\t\t\tArrayList func = new ArrayList();\n\n\t\t\tif(!h.Equals((Constant)1))\n\t\t\t{\n\t\t\t\tfunc.Add(h);\n\t\t\t}\n\n\t\t\tforeach(Function f in table.Values)\n\t\t\t{\n\t\t\t\tif(f is Product)\n\t\t\t\t{\n\t\t\t\t\tProduct p = f as Product;\n\t\t\t\t\tfunc.AddRange(p.functions);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(!f.Equals((Constant)1))\n\t\t\t\t\t\tfunc.Add(f);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 特殊な場合\n\t\t\tif(c == null)\n\t\t\t{\n\t\t\t\tif(func.Count == 0)\n\t\t\t\t\treturn (Constant)1;\n\n\t\t\t\tif(func.Count == 1)\n\t\t\t\t\treturn func[0] as Function;\n\t\t\t}\n\n\t\t\t// 掛けなおす。\n\t\t\th = func[0] as Function;\n\t\t\tfor(int i=1; i<func.Count; ++i)\n\t\t\t{\n\t\t\t\th *= func[i] as Function;\n\t\t\t}\n\n\t\t\tif(c == null || c.Equals((Constant)1))\n\t\t\t\treturn h;\n\t\t\treturn new Multiple(c.Value, h);\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tif(!(obj is Product)) return false;\n\t\t\treturn base.Equals(obj);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\tint code = base.GetHashCode();\n\t\t\tcode ^= 45872368;\n\t\t\treturn code;\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\tstring str = \"\";\n#if DEBUG\n\t\t\tstr = \"p\";\n#endif\n\t\t\tstr += this.functions[0].ToString();\n\n\t\t\tfor(int i=1; i<this.functions.Count; ++i)\n\t\t\t{\n\t\t\t\tstring tmp = this.functions[i].ToString();\n\t\t\t\tif(tmp[0] == '-' || tmp.IndexOf('+') >= 0)\n\t\t\t\t{\n\t\t\t\t\tstr += \" * (\" + tmp + \")\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstr += \" * \" + tmp;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn str;\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Product((ArrayList)this.functions.Clone());\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Series.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\t/// <summary>\n\t/// Sum(累和)/Product(累積)クラスの共通基底。\n\t/// </summary>\n\tpublic abstract class Series : Function\n\t{\n\t\t#region フィールド\n\n\t\tprotected ArrayList functions = new ArrayList();\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Series(params Function[] functions)\n\t\t{\n\t\t\tforeach(Function f in functions)\n\t\t\t{\n\t\t\t\tthis.functions.Add(f);\n\t\t\t}\n\t\t}\n\n\t\tpublic Series(ArrayList functions)\n\t\t{\n\t\t\tthis.functions = functions;\n\t\t}\n\n\t\t#endregion\n\t\t#region 関数の追加\n\n\t\t/// <summary>\n\t\t/// 加算対象リストに関数を追加する。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">追加する関数</param>\n\t\tinternal void AddList(Function f)\n\t\t{\n\t\t\tif(f is Constant)\n\t\t\t{\n\t\t\t\tConstant c = f as Constant;\n\t\t\t\tif(c.Value == 0)\n\t\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.functions.Add(f);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 加算対象リストに関数を追加する。\n\t\t/// </summary>\n\t\t/// <param name=\"list\">追加する関数のリスト</param>\n\t\tinternal void AddList(IList list)\n\t\t{\n\t\t\tforeach(Function f in list)\n\t\t\t\tthis.AddList(f);\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tSeries s = obj as Series;\n\t\t\tif(s == null) return false;\n\t\t\tif(this.functions.Count != s.functions.Count) return false;\n\n\t\t\tfor(int i=0; i<this.functions.Count; ++i)\n\t\t\t{\n\t\t\t\tif(!this.functions[i].Equals(s.functions[i])) return false;\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\tint code = 0;\n\t\t\tforeach(Function f in this.functions)\n\t\t\t{\n\t\t\t\tcode <<= 1;\n\t\t\t\tcode ^= f.GetHashCode();\n\t\t\t}\n\n\t\t\treturn code;\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Sum.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\tusing ValueType = System.Double;\n\n\t/// <summary>\n\t/// 関数の和。\n\t/// </summary>\n\tpublic class Sum : Series\n\t{\n\t\t#region 初期化\n\n\t\tpublic Sum(params Function[] functions) : base(functions) {}\n\t\tpublic Sum(ArrayList functions) : base(functions) {}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\tpublic override System.Collections.ArrayList GetVariableList()\n\t\t{\n\t\t\tSystem.Collections.ArrayList list = new System.Collections.ArrayList();\n\n\t\t\tforeach(Function f in this.functions)\n\t\t\t{\n\t\t\t\tlist = Misc.Merge(list, f.GetVariableList());\n\t\t\t}\n\t\t\treturn list;\n\t\t}\n\n\t\tpublic override ValueType GetValue(params Parameter[] x)\n\t\t{\n\t\t\tValueType y = 0;\n\n\t\t\tforeach(Function f in this.functions)\n\t\t\t{\n\t\t\t\ty += f.GetValue(x);\n\t\t\t}\n\n\t\t\treturn y;\n\t\t}\n\n\t\tpublic override Function Bind(params Parameter[] x)\n\t\t{\n\t\t\tFunction y = (Constant)0;\n\n\t\t\tforeach(Function f in this.functions)\n\t\t\t{\n\t\t\t\tFunction g = f.Bind(x);\n\t\t\t\ty += g;\n\t\t\t}\n\n\t\t\treturn y;\n\t\t}\n\n\t\t#endregion\n\t\t#region 複素数対応\n\n\t\tpublic override void GetComplexPart(out Function re, out Function im)\n\t\t{\n\t\t\tFunction f;\n\n\t\t\tf = this.functions[0] as Function;\n\t\t\tf.GetComplexPart(out re, out im);\n\n\t\t\tfor(int i=1; i<this.functions.Count; ++i)\n\t\t\t{\n\t\t\t\tFunction re1, im1;\n\n\t\t\t\tf = this.functions[i] as Function;\n\t\t\t\tf.GetComplexPart(out re1, out im1);\n\n\t\t\t\tre += re1;\n\t\t\t\tim += im1;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算子\n\n\t\tpublic override Function Add(Function f)\n\t\t{\n\t\t\tSum h = (Sum)this.Clone();\n\n\t\t\tif(f is Sum)\n\t\t\t{\n\t\t\t\tSum g = f as Sum;\n\t\t\t\th.AddList(g.functions);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\th.AddList(f);\n\t\t\t}\n\n\t\t\treturn h;\n\t\t}\n\n\t\t#endregion\n\t\t#region 微分\n\n\t\tpublic override Function Differentiate(Variable x)\n\t\t{\n\t\t\tArrayList func = new ArrayList();\n\n\t\t\tforeach(Function f in this.functions)\n\t\t\t{\n\t\t\t\tfunc.Add(f.Differentiate(x));\n\t\t\t}\n\n\t\t\treturn new Sum(func);\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部構造の最適化\n\n\t\t/// <remarks>\n\t\t/// 同じ種類の関数ごとに足していった方が最適な構造が得られるため、\n\t\t/// 関数のリストを一度ソートしてから足しなおす。\n\t\t/// あと、定数 0 が混ざってたら消す。\n\t\t/// </remarks>\n\t\tpublic override Function Optimize()\n\t\t{\n\t\t\tHashtable table = new Hashtable();\n\n\t\t\t// 種類わけ\n\t\t\tforeach(Function f in this.functions)\n\t\t\t{\n\t\t\t\tFunction g = f.Optimize();\n\n\t\t\t\tType t = g.GetType();\n\t\t\t\tif(table[t] == null)\n\t\t\t\t{\n\t\t\t\t\ttable[t] = g;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttable[t] = (Function)table[t] + g;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 繋ぎなおす\n\t\t\tArrayList func = new ArrayList();\n\n\t\t\tforeach(Function f in table.Values)\n\t\t\t{\n\t\t\t\tif(f is Sum)\n\t\t\t\t{\n\t\t\t\t\tSum s = f as Sum;\n\t\t\t\t\tfunc.AddRange(s.functions);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tif(!f.Equals((Constant)0))\n\t\t\t\t\t\tfunc.Add(f);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 特殊な場合\n\t\t\tif(func.Count == 0)\n\t\t\t\treturn (Constant)0;\n\n\t\t\tif(func.Count == 1)\n\t\t\t\treturn func[0] as Function;\n\n\t\t\t// 足しなおす。\n\t\t\tFunction h = func[0] as Function;\n\t\t\tfor(int i=1; i<func.Count; ++i)\n\t\t\t{\n\t\t\t\th += func[i] as Function;\n\t\t\t}\n\n\t\t\treturn h;\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tif(!(obj is Sum)) return false;\n\t\t\treturn base.Equals(obj);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\tint code = base.GetHashCode();\n\t\t\tcode ^= 83742673;\n\t\t\treturn code;\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\tstring str = \"\";\n#if DEBUG\n\t\t\tstr = \"s\";\n#endif\n\t\t\tstr += \"(\" + this.functions[0].ToString();\n\n\t\t\tfor(int i=1; i<this.functions.Count; ++i)\n\t\t\t{\n\t\t\t\tstring tmp = this.functions[i].ToString();\n\t\t\t\tif(tmp[0] == '-')\n\t\t\t\t{\n\t\t\t\t\tstr += \" \" + tmp;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstr += \" + \" + tmp;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstr += \")\";\n\n\t\t\treturn str;\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Sum((ArrayList)this.functions.Clone());\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Unary.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\tusing ValueType = System.Double;\n\n\t/// <summary>\n\t/// 単項関数デリゲート。\n\t/// </summary>\n\tpublic delegate ValueType UnaryFunction(ValueType x);\n\n\t/// <summary>\n\t/// 単項関数。\n\t/// </summary>\n\tpublic class Unary : Function\n\t{\n\t\t#region フィールド\n\n\t\t/// <summary>\n\t\t/// 関数本体。\n\t\t/// </summary>\n\t\tprotected UnaryFunction func;\n\n\t\t/// <summary>\n\t\t/// 内部関数。\n\t\t/// this.GetValue(x) == func(inner.GetValue(x))\n\t\t/// </summary>\n\t\tprotected Function inner;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Unary(UnaryFunction func, Function inner)\n\t\t{\n\t\t\tthis.func = func;\n\t\t\tthis.inner = inner;\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\tpublic override System.Collections.ArrayList GetVariableList()\n\t\t{\n\t\t\treturn this.inner.GetVariableList();\n\t\t}\n\n\t\tpublic override ValueType GetValue(params Parameter[] x)\n\t\t{\n\t\t\treturn this.func(this.inner.GetValue(x));\n\t\t}\n\n\t\tpublic override Function Bind(params Parameter[] x)\n\t\t{\n\t\t\tFunction inner = this.inner.Bind(x);\n\n\t\t\tConstant c = inner as Constant;\n\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\treturn (Constant)this.func(c.Value);\n\t\t\t}\n\n\t\t\tUnary f = this.Clone() as Unary;\n\t\t\tf.inner = inner;\n\t\t\treturn f;\n\t\t}\n\n\t\t#endregion\n\t\t#region 複素数対応\n\n\t\t/// <summary>\n\t\t/// 関数 f(z) を複素関数とみなしたとき、その実部と虚部\n\t\t/// Re[f](Re(z), Im(z)), Im[f](Re(z), Im(z) を求める。\n\t\t/// 例えば、Exp の場合、\n\t\t/// reY = Exp(reX) * Cos(imX),\n\t\t/// imY = Exp(reX) * Sin(imX)\n\t\t/// </summary>\n\t\t/// <param name=\"reX\">パラメータの実部</param>\n\t\t/// <param name=\"imX\">パラメータの虚部</param>\n\t\t/// <param name=\"reY\">関数値の実部</param>\n\t\t/// <param name=\"imY\">関数値の虚部</param>\n\t\tprotected virtual void GetComplexPart(Function reX, Function imX, out Function reY, out Function imY)\n\t\t{\n\t\t\tthrow new InvalidOperationException(\"この関数は複素数未対応です。\");\n\t\t}\n\n\t\tpublic override void GetComplexPart(out Function re, out Function im)\n\t\t{\n\t\t\tthis.inner.GetComplexPart(out re, out im);\n\t\t\tthis.GetComplexPart(re, im, out re, out im);\n\t\t}\n\n\t\t#endregion\n\t\t#region 微分\n\n\t\t/// <summary>\n\t\t/// this.func 自体の導関数を求める。\n\t\t/// </summary>\n\t\t/// <returns>this.func の導関数に相当する Function 型インスタンス</returns>\n\t\tprotected virtual Function Differentiate()\n\t\t{\n\t\t\tthrow new InvalidOperationException(\"微分できません\");\n\t\t}\n\n\t\tpublic override Function Differentiate(Variable x)\n\t\t{\n\t\t\tFunction innerDeriv = this.inner.Differentiate(x);\n\t\t\tFunction deriv = this.Differentiate();\n\n\t\t\treturn innerDeriv * deriv;\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部構造の最適化\n\n\t\tpublic override Function Optimize()\n\t\t{\n\t\t\tFunction f = this.inner.Optimize();\n\t\t\tUnary u = (Unary)this.Clone();\n\t\t\tu.inner = f;\n\t\t\treturn u;\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tprotected virtual string FunctionName()\n\t\t{\n\t\t\treturn string.Empty;\n\t\t}\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn this.FunctionName() + \"(\" + this.inner.ToString() + \")\";\n\t\t}\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tUnary f = obj as Unary;\n\n\t\t\tif(f == null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn this.func.Equals(f.func) && this.inner.Equals(f.inner);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn this.func.GetHashCode() ^ this.inner.GetHashCode();\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Unary((UnaryFunction)this.func.Clone(), this.inner.Clone());\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/Variable.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\tusing ValueType = System.Double;\n\n\t/// <summary>\n\t/// 変数。\n\t/// </summary>\n\tpublic class Variable : Function, IComparable\n\t{\n\t\t#region フィールド\n\n\t\t/// <summary>\n\t\t/// 変数同士を区別するための id。\n\t\t/// </summary>\n\t\tprotected IComparable id;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Variable() : this((int)0){}\n\n\t\tpublic Variable(IComparable id)\n\t\t{\n\t\t\tthis.id = id;\n\t\t}\n\n\t\t#endregion\n\t\t#region 値\n\n\t\tpublic IComparable ID\n\t\t{\n\t\t\tget{return this.id;}\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の計算\n\n\t\tpublic override System.Collections.ArrayList GetVariableList()\n\t\t{\n\t\t\tSystem.Collections.ArrayList list = new System.Collections.ArrayList();\n\t\t\tlist.Add(this);\n\t\t\treturn list;\n\t\t}\n\n\t\tpublic override ValueType GetValue(params Parameter[] x)\n\t\t{\n\t\t\tforeach(Parameter p in x)\n\t\t\t{\n\t\t\t\tif(p.x.Equals(this))\n\t\t\t\t{\n\t\t\t\t\treturn p.val;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn 0; //! エラー\n\t\t}\n\n\t\tpublic override Function Bind(params Parameter[] x)\n\t\t{\n\t\t\tforeach(Parameter p in x)\n\t\t\t{\n\t\t\t\tif(this.Equals(p.x))\n\t\t\t\t{\n\t\t\t\t\treturn (Constant)p.val;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\t#endregion\n\t\t#region 複素数対応\n\n\t\tpublic override void GetComplexPart(out Function re, out Function im)\n\t\t{\n\t\t\tre = this;\n\t\t\tim = (Constant)0;\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算子\n\n\t\tpublic override Function Add(Function f)\n\t\t{\n\t\t\tVariable g = f as Variable;\n\t\t\tif(g != null && this.Equals(g))\n\t\t\t{\n\t\t\t\treturn new Multiple(2, this);\n\t\t\t}\n\n\t\t\tif(f is Constant)\n\t\t\t{\n\t\t\t\treturn base.Add(f);\n\t\t\t}\n\n\t\t\treturn f.Add(this);\n\t\t}\n\n\t\tpublic override Function Multiply(Function f)\n\t\t{\n\t\t\tConstant c = f as Constant;\n\t\t\tif(c != null)\n\t\t\t{\n\t\t\t\treturn new Multiple(c.Value, this);\n\t\t\t}\n\n\t\t\tif(f is Variable)\n\t\t\t{\n\t\t\t\treturn base.Multiply(f);\n\t\t\t}\n\n\t\t\treturn f.Multiply(this);\n\t\t}\n\n\t\t#endregion\n\t\t#region 微分\n\n\t\tpublic override Function Differentiate(Variable x)\n\t\t{\n\t\t\tif(this.Equals(x))\n\t\t\t{\n\t\t\t\treturn (Constant)1;\n\t\t\t}\n\t\t\treturn (Constant)0;\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable\n\n\t\tpublic override Function Clone()\n\t\t{\n\t\t\treturn new Variable(this.id);\n\t\t}\n\n\t\t#endregion\n\t\t#region object\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn this.id.ToString();\n\t\t}\n\n\t\tpublic override bool Equals(object obj)\n\t\t{\n\t\t\tVariable var = obj as Variable;\n\n\t\t\tif(var == null)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn this.id.Equals(var.id);\n\t\t}\n\n\t\tpublic override int GetHashCode()\n\t\t{\n\t\t\treturn this.id.GetHashCode();\n\t\t}\n\n\n\t\t#endregion\n\t\t#region IComparable メンバ\n\n\t\tpublic int CompareTo(object obj)\n\t\t{\n\t\t\tVariable v = (Variable)obj;\n\n\t\t\tif(this.id.GetType().Equals(v.id.GetType()))\n\t\t\t{\n\t\t\t\treturn this.id.CompareTo(v.id);\n\t\t\t}\n\n\t\t\treturn this.id.GetType().GUID.CompareTo(v.id.GetType().GUID);\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Function/VariableTable.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace SoundLibrary.Mathematics.Function\n{\n\tusing ValueType = System.Double;\n\n\t/// <summary>\n\t/// 関数のパラメータ変数のテーブル。\n\t/// </summary>\n\t/// <example>\n\t/// Variable x = ....;\n\t/// Variable y = ....;\n\t/// Function f = ....;\n\t/// VariableTalbe t = f.GetVariableTable();\n\t/// t[x] = 1;\n\t/// t[y] = 2;\n\t/// ValueType result = f[t];\n\t/// </example>\n\tpublic class VariableTable : ICloneable\n\t{\n\t\tHashtable table;\n\n\t\tVariableTable(Hashtable table)\n\t\t{\n\t\t\tthis.table = table;\n\t\t}\n\n\t\tpublic VariableTable(params Variable[] list) : this((IList)list)\n\t\t{\n\t\t}\n\n\t\tpublic VariableTable(IList list)\n\t\t{\n\t\t\tthis.table = new Hashtable();\n\n\t\t\tforeach(Variable v in list)\n\t\t\t{\n\t\t\t\tthis.table.Add(v, (ValueType)0);\n\t\t\t}\n\t\t}\n\n\t\tpublic Function.Parameter[] GetParameterList()\n\t\t{\n\t\t\tFunction.Parameter[] p = new Function.Parameter[this.table.Count];\n\n\t\t\tint i = 0;\n\t\t\tforeach(DictionaryEntry entry in this.table)\n\t\t\t{\n\t\t\t\tp[i] = new Function.Parameter((Variable)entry.Key, (ValueType)entry.Value);\n\t\t\t\t++i;\n\t\t\t}\n\n\t\t\treturn p;\n\t\t}\n\n\t\tpublic ValueType this[Variable v]\n\t\t{\n\t\t\tget{return (ValueType)this.table[v];}\n\t\t\tset{this.table[v] = value;}\n\t\t}\n\n\t\tpublic VariableTable Clone()\n\t\t{\n\t\t\treturn new VariableTable((Hashtable)this.table.Clone());\n\t\t}\n\n\t\t#region ICloneable メンバ\n\n\t\tobject ICloneable.Clone()\n\t\t{\n\t\t\treturn this.Clone();\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Misc.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace SoundLibrary.Mathematics\n{\n\t/// <summary>\n\t/// 未分類の関数群。\n\t/// 分類先が決まり次第、他の場所に移すかも。\n\t/// </summary>\n\tpublic class Misc\n\t{\n\t\t/// <summary>\n\t\t/// 組み合わせの数 nCk を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">n</param>\n\t\t/// <param name=\"k\">k</param>\n\t\t/// <returns>nCk</returns>\n\t\tpublic static int Combination(int n, int k)\n\t\t{\n\t\t\tint c = 1;\n\t\t\tfor(int i=0; i<k;)\n\t\t\t{\n\t\t\t\t++i;\n\t\t\t\tc *= n;\n\t\t\t\tc /= i;\n\t\t\t\t--n;\n\t\t\t}\n\t\t\treturn c;\n\t\t}\n\n\t\tpublic static ArrayList Merge(IList l1, IList l2)\n\t\t{\n\t\t\tArrayList merged = new ArrayList();\n\n\t\t\tint i=0, j=0;\n\t\t\twhile(i<l1.Count && j<l2.Count)\n\t\t\t{\n\t\t\t\tIComparable c1 = (IComparable)l1[i];\n\t\t\t\tIComparable c2 = (IComparable)l2[j];\n\n\t\t\t\tint cmp = c1.CompareTo(c2);\n\t\t\t\tif(cmp < 0)\n\t\t\t\t{\n\t\t\t\t\tmerged.Add(c1);\n\t\t\t\t\t++i;\n\t\t\t\t}\n\t\t\t\telse if(cmp > 0)\n\t\t\t\t{\n\t\t\t\t\tmerged.Add(c2);\n\t\t\t\t\t++j;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tmerged.Add(c1);\n\t\t\t\t\t++i;\n\t\t\t\t\t++j;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor(; i<l1.Count; ++i) merged.Add(l1[i]);\n\t\t\tfor(; j<l2.Count; ++j) merged.Add(l2[j]);\n\n\t\t\treturn merged;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/Statistics.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics\n{\n\t/// <summary>\n\t/// 統計処理関数群を定義。\n\t/// </summary>\n\tpublic class Statistics\n\t{\n\t\t/// <summary>\n\t\t/// 配列 x の和。\n\t\t/// </summary>\n\t\tpublic static double Sum(double[] x)\n\t\t{\n\t\t\tdouble sum = 0;\n\t\t\tfor(int i=0; i<x.Length; ++i)\n\t\t\t\tsum += x[i];\n\t\t\treturn sum;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列 x の自乗和。\n\t\t/// </summary>\n\t\tpublic static double SquareSum(double[] x)\n\t\t{\n\t\t\tdouble sum = 0;\n\t\t\tfor(int i=0; i<x.Length; ++i)\n\t\t\t\tsum += x[i] * x[i];\n\t\t\treturn sum;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列 x と y の積和。\n\t\t/// </summary>\n\t\tpublic static double Mac(double[] x, double[] y)\n\t\t{\n\t\t\tdouble mac = 0;\n\t\t\tfor(int i=0; i<x.Length; ++i)\n\t\t\t\tmac += x[i] * y[i];\n\t\t\treturn mac;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列 x の平均値。\n\t\t/// </summary>\n\t\tpublic static double Average(double[] x)\n\t\t{\n\t\t\treturn Sum(x) / x.Length;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列 x の分散。\n\t\t/// </summary>\n\t\tstatic double Variance(double[] x)\n\t\t{\n\t\t\tdouble var = Average(x);\n\t\t\tvar = var * var;\n\t\t\tvar = SquareSum(x) / x.Length - var;\n\t\t\treturn var;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列 x と y の共分散。\n\t\t/// </summary>\n\t\tpublic static double Covariance(double[] x, double[] y)\n\t\t{\n\t\t\tdouble var = Mac(x, y) / x.Length - Average(x) * Average(y);\n\t\t\treturn var;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/ThreeDimension/AffineMatrix.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.ThreeDimension\n{\n\t/// <summary>\n\t/// アフィン変換用の4×4行列。\n\t/// </summary>\n\t/// <remarks>\n\t/// 4列目は (0, 0, 0, 1) 固定。\n\t/// アフィン行列 B は1次変換行列 A と ベクトル t を用いて、\n\t/// B = (A t)\n\t///     (0 1)\n\t/// と表される。\n\t/// </remarks>\n\tpublic class AffineMatrix\n\t{\n\t\t#region フィールド\n\n\t\tMatrix a;\n\t\tVector t;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic AffineMatrix() : this(new Matrix(), new Vector()) {}\n\n\t\tpublic AffineMatrix(Matrix a) : this(a, new Vector()) {}\n\n\t\tpublic AffineMatrix(Vector t) : this(Matrix.I, t) {}\n\n\t\tpublic AffineMatrix(Matrix a, Vector t)\n\t\t{\n\t\t\tthis.a = a;\n\t\t\tthis.t = t;\n\t\t}\n\n\t\t#endregion\n\t\t#region プロパティ\n\n\t\t/// <summary>\n\t\t/// アフィン変換の1次変換行列部分。\n\t\t/// </summary>\n\t\tpublic Matrix A\n\t\t{\n\t\t\tget{return this.a;}\n\t\t\tset{this.a = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// アフィン変換の平行移動部分。\n\t\t/// </summary>\n\t\tpublic Vector T\n\t\t{\n\t\t\tget{return this.t;}\n\t\t\tset{this.t = value;}\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算子\n\n\t\tpublic static AffineMatrix operator+ (AffineMatrix a, AffineMatrix b)\n\t\t{\n\t\t\treturn new AffineMatrix(a.a + b.a, a.t + b.t);\n\t\t}\n\n\t\tpublic static AffineMatrix operator- (AffineMatrix a, AffineMatrix b)\n\t\t{\n\t\t\treturn new AffineMatrix(a.a - b.a, a.t - b.t);\n\t\t}\n\n\t\tpublic static AffineMatrix operator* (AffineMatrix a, AffineMatrix b)\n\t\t{\n\t\t\treturn new AffineMatrix(a.a * b.a, a.a * b.t + a.t);\n\t\t}\n\n\t\tpublic static AffineMatrix operator/ (AffineMatrix a, AffineMatrix b)\n\t\t{\n\t\t\treturn a * b.Inverse();\n\t\t}\n\n\t\tpublic static Vector operator* (AffineMatrix a, Vector v)\n\t\t{\n\t\t\treturn a.a * v + a.t;\n\t\t}\n\n\t\t#endregion\n\t\t#region 逆元\n\n\t\tpublic AffineMatrix Inverse()\n\t\t{\n\t\t\tMatrix ai = this.a.Inverse();\n\t\t\treturn new AffineMatrix(ai, -(ai * this.t));\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/ThreeDimension/Matrix.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.ThreeDimension\n{\n\t/// <summary>\n\t/// 1次変換用の3×3行列。\n\t/// 回転などは右手系を仮定。\n\t/// </summary>\n\tpublic class Matrix\n\t{\n\t\t#region フィールド\n\n\t\tdouble ax, bx, cx;\n\t\tdouble ay, by, cy;\n\t\tdouble az, bz, cz;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Matrix()\n\t\t\t:this(0, 0, 0, 0, 0, 0, 0, 0, 0) {}\n\n\t\tpublic Matrix(Vector x, Vector y, Vector z)\n\t\t\t:this(\n\t\t\tx.x, y.x, z.x,\n\t\t\tx.y, y.y, z.y,\n\t\t\tx.z, y.z, z.z){}\n\n\t\tpublic Matrix(\n\t\t\tdouble ax, double bx, double cx,\n\t\t\tdouble ay, double by, double cy,\n\t\t\tdouble az, double bz, double cz)\n\t\t{\n\t\t\tthis.Set(\n\t\t\t\tax, bx, cx,\n\t\t\t\tay, by, cy,\n\t\t\t\taz, bz, cz);\n\t\t}\n\n\t\tpublic void Set(\n\t\t\tdouble ax, double bx, double cx,\n\t\t\tdouble ay, double by, double cy,\n\t\t\tdouble az, double bz, double cz)\n\t\t{\n\t\t\tthis.ax = ax;\n\t\t\tthis.bx = bx;\n\t\t\tthis.cx = cx;\n\n\t\t\tthis.ay = ay;\n\t\t\tthis.by = by;\n\t\t\tthis.cy = cy;\n\n\t\t\tthis.az = az;\n\t\t\tthis.bz = bz;\n\t\t\tthis.cz = cz;\n\t\t}\n\n\t\tpublic void Set(Matrix a)\n\t\t{\n\t\t\tthis.ax = a.ax;\n\t\t\tthis.bx = a.bx;\n\t\t\tthis.cx = a.cx;\n\n\t\t\tthis.ay = a.ay;\n\t\t\tthis.by = a.by;\n\t\t\tthis.cy = a.cy;\n\n\t\t\tthis.az = a.az;\n\t\t\tthis.bz = a.bz;\n\t\t\tthis.cz = a.cz;\n\t\t}\n\n\t\t#endregion\n\t\t#region 要素の参照\n\n\t\t#region 行\n\t\t\n\t\tpublic class Row\n\t\t{\n\t\t\tMatrix a;\n\t\t\tint i;\n\t\t\tinternal Row(Matrix a, int i){ this.a = a; this.i = i;}\n\n\t\t\tpublic double X\n\t\t\t{\n\t\t\t\tget\n\t\t\t\t{\n\t\t\t\t\tswitch(i)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: return a.ax;\n\t\t\t\t\t\tcase 1: return a.ay;\n\t\t\t\t\t\tcase 2: return a.az;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tset\n\t\t\t\t{\n\t\t\t\t\tswitch(i)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: a.ax = value; break;\n\t\t\t\t\t\tcase 1: a.ay = value; break;\n\t\t\t\t\t\tcase 2: a.az = value; break;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic double Y\n\t\t\t{\n\t\t\t\tget\n\t\t\t\t{\n\t\t\t\t\tswitch(i)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: return a.bx;\n\t\t\t\t\t\tcase 1: return a.by;\n\t\t\t\t\t\tcase 2: return a.bz;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tset\n\t\t\t\t{\n\t\t\t\t\tswitch(i)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: a.bx = value; break;\n\t\t\t\t\t\tcase 1: a.by = value; break;\n\t\t\t\t\t\tcase 2: a.bz = value; break;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic double Z\n\t\t\t{\n\t\t\t\tget\n\t\t\t\t{\n\t\t\t\t\tswitch(i)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: return a.cx;\n\t\t\t\t\t\tcase 1: return a.cy;\n\t\t\t\t\t\tcase 2: return a.cz;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tset\n\t\t\t\t{\n\t\t\t\t\tswitch(i)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: a.cx = value; break;\n\t\t\t\t\t\tcase 1: a.cy = value; break;\n\t\t\t\t\t\tcase 2: a.cz = value; break;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tpublic static explicit operator Vector (Row r)\n\t\t\t{\n\t\t\t\treturn new Vector(r.X, r.Y, r.Z);\n\t\t\t}\n\t\t}\n\n\t\tpublic Row Rows(int i)\n\t\t{\n\t\t\treturn new Row(this, i);\n\t\t}\n\n\t\t#endregion\n\t\t#region 列\n\t\t\n\t\tpublic class Column\n\t\t{\n\t\t\tMatrix a;\n\t\t\tint i;\n\t\t\tinternal Column(Matrix a, int i){ this.a = a; this.i = i;}\n\n\t\t\tpublic double X\n\t\t\t{\n\t\t\t\tget\n\t\t\t\t{\n\t\t\t\t\tswitch(i)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: return a.ax;\n\t\t\t\t\t\tcase 1: return a.bx;\n\t\t\t\t\t\tcase 2: return a.cx;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tset\n\t\t\t\t{\n\t\t\t\t\tswitch(i)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: a.ax = value; break;\n\t\t\t\t\t\tcase 1: a.bx = value; break;\n\t\t\t\t\t\tcase 2: a.cx = value; break;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic double Y\n\t\t\t{\n\t\t\t\tget\n\t\t\t\t{\n\t\t\t\t\tswitch(i)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: return a.ay;\n\t\t\t\t\t\tcase 1: return a.by;\n\t\t\t\t\t\tcase 2: return a.cy;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tset\n\t\t\t\t{\n\t\t\t\t\tswitch(i)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: a.ay = value; break;\n\t\t\t\t\t\tcase 1: a.by = value; break;\n\t\t\t\t\t\tcase 2: a.cy = value; break;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpublic double Z\n\t\t\t{\n\t\t\t\tget\n\t\t\t\t{\n\t\t\t\t\tswitch(i)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: return a.az;\n\t\t\t\t\t\tcase 1: return a.bz;\n\t\t\t\t\t\tcase 2: return a.cz;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tset\n\t\t\t\t{\n\t\t\t\t\tswitch(i)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: a.az = value; break;\n\t\t\t\t\t\tcase 1: a.bz = value; break;\n\t\t\t\t\t\tcase 2: a.cz = value; break;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\tpublic static explicit operator Vector (Column r)\n\t\t\t{\n\t\t\t\treturn new Vector(r.X, r.Y, r.Z);\n\t\t\t}\n\t\t}\n\n\t\tpublic Column Columns(int i)\n\t\t{\n\t\t\treturn new Column(this, i);\n\t\t}\n\n\t\t#endregion\n\n\t\tpublic double this[int i, int j]\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tswitch(i)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\tswitch(j)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: return this.ax;\n\t\t\t\t\t\tcase 1: return this.bx;\n\t\t\t\t\t\tcase 2: return this.cx;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t\tcase 1:\n\t\t\t\t\tswitch(j)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: return this.ay;\n\t\t\t\t\t\tcase 1: return this.by;\n\t\t\t\t\t\tcase 2: return this.cy;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t\tcase 2:\n\t\t\t\t\tswitch(j)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: return this.az;\n\t\t\t\t\t\tcase 1: return this.bz;\n\t\t\t\t\t\tcase 2: return this.cz;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t}\n\t\t\t}\n\t\t\tset\n\t\t\t{\n\t\t\t\tswitch(i)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\tswitch(j)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: this.ax = value; break;\n\t\t\t\t\t\tcase 1: this.bx = value; break;\n\t\t\t\t\t\tcase 2: this.cx = value; break;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\tswitch(j)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: this.ay = value; break;\n\t\t\t\t\t\tcase 1: this.by = value; break;\n\t\t\t\t\t\tcase 2: this.cy = value; break;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tswitch(j)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 0: this.az = value; break;\n\t\t\t\t\t\tcase 1: this.bz = value; break;\n\t\t\t\t\t\tcase 2: this.cz = value; break;\n\t\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault: throw new IndexOutOfRangeException();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算子\n\n\t\tpublic static Matrix operator+ (Matrix a, Matrix b)\n\t\t{\n\t\t\treturn new Matrix(\n\t\t\t\ta.ax + b.ax, a.bx + b.bx, a.cx + b.cx,\n\t\t\t\ta.ay + b.ay, a.by + b.by, a.cy + b.cy,\n\t\t\t\ta.az + b.az, a.bz + b.bz, a.cz + b.cz);\n\t\t}\n\n\t\tpublic static Matrix operator- (Matrix a, Matrix b)\n\t\t{\n\t\t\treturn new Matrix(\n\t\t\t\ta.ax - b.ax, a.bx - b.bx, a.cx - b.cx,\n\t\t\t\ta.ay - b.ay, a.by - b.by, a.cy - b.cy,\n\t\t\t\ta.az - b.az, a.bz - b.bz, a.cz - b.cz);\n\t\t}\n\n\t\tpublic static Matrix operator* (Matrix a, Matrix b)\n\t\t{\n\t\t\tdouble ax = a.ax * b.ax + a.bx * b.ay + a.cx * b.az;\n\t\t\tdouble ay = a.ay * b.ax + a.by * b.ay + a.cy * b.az;\n\t\t\tdouble az = a.az * b.ax + a.bz * b.ay + a.cz * b.az;\n\n\t\t\tdouble bx = a.ax * b.bx + a.bx * b.by + a.cx * b.bz;\n\t\t\tdouble by = a.ay * b.bx + a.by * b.by + a.cy * b.bz;\n\t\t\tdouble bz = a.az * b.bx + a.bz * b.by + a.cz * b.bz;\n\n\t\t\tdouble cx = a.ax * b.cx + a.bx * b.cy + a.cx * b.cz;\n\t\t\tdouble cy = a.ay * b.cx + a.by * b.cy + a.cy * b.cz;\n\t\t\tdouble cz = a.az * b.cx + a.bz * b.cy + a.cz * b.cz;\n\n\t\t\treturn new Matrix(\n\t\t\t\tax, bx, cx,\n\t\t\t\tay, by, cy,\n\t\t\t\taz, bz, cz);\n\t\t}\n\n\t\tpublic static Matrix operator* (double x, Matrix a)\n\t\t{\n\t\t\treturn new Matrix(\n\t\t\t\tx * a.ax, x * a.bx, x * a.cx,\n\t\t\t\tx * a.ay, x * a.by, x * a.cy,\n\t\t\t\tx * a.az, x * a.bz, x * a.cz);\n\t\t}\n\n\t\tpublic static Matrix operator* (Matrix a, double x){return x * a;}\n\t\tpublic static Matrix operator/ (Matrix a, double x){return (1/x) * a;}\n\n\t\t/// <summary>\n\t\t/// 行列とベクトルの積 A・x を計算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">A</param>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <returns>A・x</returns>\n\t\tpublic static Vector operator* (Matrix a, Vector v)\n\t\t{\n\t\t\tdouble x = a.ax * v.x + a.bx * v.y + a.cx * v.z;\n\t\t\tdouble y = a.ay * v.x + a.by * v.y + a.cy * v.z;\n\t\t\tdouble z = a.az * v.x + a.bz * v.y + a.cz * v.z;\n\t\t\treturn new Vector(x, y, z);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 行列とベクトルの積 x^t・A を計算(x^t は x の転置)。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">A</param>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <returns>x^t・A</returns>\n\t\tpublic static Vector operator* (Vector v, Matrix a)\n\t\t{\n\t\t\tdouble x = a.ax * v.x + a.ay * v.y + a.az * v.z;\n\t\t\tdouble y = a.bx * v.x + a.by * v.y + a.bz * v.z;\n\t\t\tdouble z = a.cx * v.x + a.cy * v.y + a.cz * v.z;\n\t\t\treturn new Vector(x, y, z);\n\t\t}\n\n\t\t#endregion\n\t\t#region 逆行列・余因子・行列式\n\n\t\t/// <summary>\n\t\t/// 逆行列を求める。\n\t\t/// </summary>\n\t\t/// <returns>逆行列</returns>\n\t\tpublic Matrix Inverse()\n\t\t{\n\t\t\tdouble ax = this.by * this.cz - this.bz * this.cy;\n\t\t\tdouble ay = this.bz * this.cx - this.bx * this.cz;\n\t\t\tdouble az = this.bx * this.cy - this.by * this.cx;\n\n\t\t\tdouble bx = this.cy * this.az - this.cz * this.ay;\n\t\t\tdouble by = this.cz * this.ax - this.cx * this.az;\n\t\t\tdouble bz = this.cx * this.ay - this.cy * this.ax;\n\n\t\t\tdouble cx = this.ay * this.bz - this.az * this.by;\n\t\t\tdouble cy = this.az * this.bx - this.ax * this.bz;\n\t\t\tdouble cz = this.ax * this.by - this.ay * this.bx;\n\n\t\t\tdouble det = this.ax * ax + this.ay * ay + this.az * az;\n\n\t\t\treturn new Matrix(\n\t\t\t\tax / det, bx / det, cx / det,\n\t\t\t\tay / det, by / det, cy / det,\n\t\t\t\taz / det, bz / det, cz / det);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 余因子行列を求める。\n\t\t/// </summary>\n\t\t/// <returns>余因子行列</returns>\n\t\tpublic Matrix Adjugate()\n\t\t{\n\t\t\tdouble ax = this.by * this.cz - this.bz * this.cy;\n\t\t\tdouble ay = this.bz * this.cx - this.bx * this.cz;\n\t\t\tdouble az = this.bx * this.cy - this.by * this.cx;\n\n\t\t\tdouble bx = this.cy * this.az - this.cz * this.ay;\n\t\t\tdouble by = this.cz * this.ax - this.cx * this.az;\n\t\t\tdouble bz = this.cx * this.ay - this.cy * this.ax;\n\n\t\t\tdouble cx = this.ay * this.bz - this.az * this.by;\n\t\t\tdouble cy = this.az * this.bx - this.ax * this.bz;\n\t\t\tdouble cz = this.ax * this.by - this.ay * this.bx;\n\n\t\t\treturn new Matrix(\n\t\t\t\tax, bx, cx,\n\t\t\t\tay, by, cy,\n\t\t\t\taz, bz, cz);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 行列式を求める。\n\t\t/// </summary>\n\t\t/// <returns>行列式</returns>\n\t\tpublic double Determinant()\n\t\t{\n\t\t\tdouble ax = this.by * this.cz - this.bz * this.cy;\n\t\t\tdouble ay = this.bz * this.cx - this.bx * this.cz;\n\t\t\tdouble az = this.bx * this.cy - this.by * this.cx;\n\n\t\t\treturn this.ax * ax + this.ay * ay + this.az * az;\n\t\t}\n\n\t\t#endregion\n\t\t#region 特殊な行列を作成\n\n\t\t#region 単位行列・零行列\n\n\t\t/// <summary>\n\t\t/// 単位行列。\n\t\t/// </summary>\n\t\tpublic static Matrix I\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn new Matrix(\n\t\t\t\t\t1, 0, 0,\n\t\t\t\t\t0, 1, 0,\n\t\t\t\t\t0, 0, 1);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 零行列。\n\t\t/// </summary>\n\t\tpublic static Matrix O\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn new Matrix(\n\t\t\t\t\t0, 0, 0,\n\t\t\t\t\t0, 0, 0,\n\t\t\t\t\t0, 0, 0);\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region x, y, z 軸を中心とする回転\n\n\t\t/// <summary>\n\t\t/// X 軸を中心に回転する行列を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"theta\">回転角</param>\n\t\tpublic void RotateX(double theta)\n\t\t{\n\t\t\tdouble cos = Math.Cos(theta);\n\t\t\tdouble sin = Math.Sin(theta);\n\t\t\tthis.Set(\n\t\t\t\t1,   0,    0,\n\t\t\t\t0, cos, -sin,\n\t\t\t\t0, sin,  cos);\n\t\t}\n\n\t\tpublic static Matrix GetRotateX(double theta)\n\t\t{\n\t\t\tMatrix a = new Matrix();\n\t\t\ta.RotateX(theta);\n\t\t\treturn a;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Y 軸を中心に回転する行列を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"theta\">回転角</param>\n\t\tpublic void RotateY(double theta)\n\t\t{\n\t\t\tdouble cos = Math.Cos(theta);\n\t\t\tdouble sin = Math.Sin(theta);\n\t\t\tthis.Set(\n\t\t\t\t cos, 0, sin,\n\t\t\t\t   0, 1,   0,\n\t\t\t\t-sin, 0, cos);\n\t\t}\n\n\t\tpublic static Matrix GetRotateY(double theta)\n\t\t{\n\t\t\tMatrix a = new Matrix();\n\t\t\ta.RotateY(theta);\n\t\t\treturn a;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Z 軸を中心に回転する行列を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"theta\">回転角</param>\n\t\tpublic void RotateZ(double theta)\n\t\t{\n\t\t\tdouble cos = Math.Cos(theta);\n\t\t\tdouble sin = Math.Sin(theta);\n\t\t\tthis.Set(\n\t\t\t\tcos, -sin, 0,\n\t\t\t\tsin,  cos, 0,\n\t\t\t\t  0,    0, 1);\n\t\t}\n\n\t\tpublic static Matrix GetRotateZ(double theta)\n\t\t{\n\t\t\tMatrix a = new Matrix();\n\t\t\ta.RotateZ(theta);\n\t\t\treturn a;\n\t\t}\n\n\t\t#endregion\n\t\t#region 任意の軸を中心とする回転\n\n\t\t/// <summary>\n\t\t/// 軸ベクトル(axis)を中心にθ(theta)回転する行列を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"theta\">回転角</param>\n\t\t/// <param name=\"axis\">回転軸ベクトル</param>\n\t\tpublic void Rotate(double theta, Vector axis)\n\t\t{\n\t\t\taxis /= axis.Abs;\n\n\t\t\tdouble cos = Math.Cos(theta);\n\t\t\tdouble sin = Math.Sin(theta);\n\t\t\tdouble c1  = 1 - cos;\n\n\t\t\tdouble yz = axis.y * axis.z * c1;\n\t\t\tdouble zx = axis.z * axis.x * c1;\n\t\t\tdouble xy = axis.x * axis.y * c1;\n\n\t\t\tdouble x =axis.x * sin;\n\t\t\tdouble y =axis.y * sin;\n\t\t\tdouble z =axis.z * sin;\n\n\t\t\tdouble ax = cos + c1 * axis.x * axis.x;\n\t\t\tdouble ay = xy + z;\n\t\t\tdouble az = zx - y;\n\n\t\t\tdouble bx = xy - z;\n\t\t\tdouble by = cos + c1 * axis.y * axis.y;\n\t\t\tdouble bz = yz + x;\n\n\t\t\tdouble cx = zx + y;\n\t\t\tdouble cy = yz - x;\n\t\t\tdouble cz = cos + c1 * axis.z * axis.z;\n\n\t\t\tthis.Set(\n\t\t\t\tax, bx, cx,\n\t\t\t\tay, by, cy,\n\t\t\t\taz, bz, cz);\n\t\t}\n\n\t\tpublic static Matrix GetRotate(double theta, Vector axis)\n\t\t{\n\t\t\tMatrix a = new Matrix();\n\t\t\ta.Rotate(theta, axis);\n\t\t\treturn a;\n\t\t}\n\n\t\t#endregion\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/ThreeDimension/Quaternion.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.ThreeDimension\n{\n\t/// <summary>\n\t/// ハミルトンの四減数。\n\t/// </summary>\n\tpublic struct Quaternion\n\t{\n\t\t#region フィールド\n\n\t\t/// <summary>\n\t\t/// 実部。\n\t\t/// </summary>\n\t\tpublic double a;\n\n\t\t/// <summary>\n\t\t/// 虚部。\n\t\t/// </summary>\n\t\tpublic Vector  u;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\t/// <summary>\n\t\t/// 実部と虚部ベクトルを指定して初期化。\n\t\t/// a + ii・uu、ii=(i,j,k)、uu＝(p,q,r)。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">実部</param>\n\t\t/// <param name=\"u\">虚部ベクトル</param>\n\t\tpublic Quaternion(double a, Vector u)\n\t\t{\n\t\t\tthis.a = a;\n\t\t\tthis.u = u;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 実部と虚部の要素を指定して初期化。\n\t\t/// a + i p + j q + k r。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">実部</param>\n\t\t/// <param name=\"p\">虚部の i 要素</param>\n\t\t/// <param name=\"q\">虚部の j 要素</param>\n\t\t/// <param name=\"r\">虚部の k 要素</param>\n\t\tpublic Quaternion(double a, double p, double q, double r)\n\t\t\t: this(a, new Vector(p, q, r))\n\t\t{\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算子\n\n\t\t/// <summary>\n\t\t/// x + y。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <param name=\"y\">y</param>\n\t\t/// <returns>x + y</returns>\n\t\tpublic static Quaternion operator+ (Quaternion x, Quaternion y)\n\t\t{\n\t\t\treturn new Quaternion(x.a + y.a, x.u + y.u);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// x - y。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <param name=\"y\">y</param>\n\t\t/// <returns>x - y</returns>\n\t\tpublic static Quaternion operator- (Quaternion x, Quaternion y)\n\t\t{\n\t\t\treturn new Quaternion(x.a - y.a, x.u - y.u);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// -x。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <returns>-x</returns>\n\t\tpublic static Quaternion operator- (Quaternion x)\n\t\t{\n\t\t\treturn new Quaternion(-x.a, -x.u);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// x × y。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <param name=\"y\">y</param>\n\t\t/// <returns>x × y</returns>\n\t\tpublic static Quaternion operator* (Quaternion x, Quaternion y)\n\t\t{\n\t\t\tdouble a = x.a * y.a - Vector.InnerProduct(x.u, y.u);\n\t\t\tVector  u = x.a * y.u + y.a * x.u + Vector.OuterProduct(x.u, y.u);\n\t\t\treturn new Quaternion(a, u);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// x ÷ y。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <param name=\"y\">y</param>\n\t\t/// <returns>x ÷ y</returns>\n\t\tpublic static Quaternion operator/ (Quaternion x, Quaternion y)\n\t\t{\n\t\t\treturn x * y.Inverse();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 実数p × x。\n\t\t/// </summary>\n\t\t/// <param name=\"p\">実数p</param>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <returns>p × x</returns>\n\t\tpublic static Quaternion operator* (double p, Quaternion x)\n\t\t{\n\t\t\treturn new Quaternion(p * x.a, p * x.u);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// x × 実数p。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <param name=\"p\">実数p</param>\n\t\t/// <returns>p × x</returns>\n\t\tpublic static Quaternion operator* (Quaternion x, double p){return p * x;}\n\n\t\t/// <summary>\n\t\t/// x ÷ 実数p。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <param name=\"p\">実数p</param>\n\t\t/// <returns>x ÷ p</returns>\n\t\tpublic static Quaternion operator/ (Quaternion x, double p){return (1/p) * x;}\n\n\t\t#endregion\n\t\t#region その他のメソッド\n\n\t\t/// <summary>\n\t\t/// 二乗ノルム。\n\t\t/// </summary>\n\t\tpublic double Norm\n\t\t{\n\t\t\tget{return this.a * this.a + this.u.Norm;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 共役四元数を求める。\n\t\t/// </summary>\n\t\t/// <returns>共役四元数</returns>\n\t\tpublic Quaternion Conjunction()\n\t\t{\n\t\t\treturn new Quaternion(this.a, -this.u);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 逆数を求める。\n\t\t/// </summary>\n\t\t/// <returns>逆数</returns>\n\t\tpublic Quaternion Inverse()\n\t\t{\n\t\t\treturn this.Conjunction() / this.Norm;\n\t\t}\n\n\t\t#endregion\n\t\t#region 回転がらみの static メソッド\n\n\t\t/// <summary>\n\t\t/// 四元数を使って3次元空間上の回転。\n\t\t/// p × (0, x) × ~p を計算する(~p は p の共役)。\n\t\t/// </summary>\n\t\t/// <param name=\"p\">回転軸/角を表す四元数</param>\n\t\t/// <param name=\"x\">回転させたい点のベクトル</param>\n\t\t/// <returns>回転後の点のベクトル</returns>\n\t\tpublic static Vector Rotate(Quaternion p, Vector x)\n\t\t{\n\t\t\tVector y = (p.a * p.a - p.u.Norm) * x;\n\t\t\ty += 2 * (Vector.InnerProduct(p.u, x) * p.u + p.a * Vector.OuterProduct(p.u, x));\n\t\t\treturn y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 四元数を使って3次元空間上の回転。\n\t\t/// p × x × ~q を計算する(~p は p の共役)。\n\t\t/// </summary>\n\t\t/// <param name=\"p\">p</param>\n\t\t/// <param name=\"x\">x</param>\n\t\t/// <returns>p × x × ~q</returns>\n\t\tpublic static Quaternion Rotate(Quaternion p, Quaternion x)\n\t\t{\n\t\t\treturn new Quaternion(x.a, Rotate(p, x.u));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ベクトル(axis)を軸として、θ(theta)回転するための四元数を計算する。\n\t\t/// </summary>\n\t\t/// <param name=\"theta\">回転角θ</param>\n\t\t/// <param name=\"axis\">回転軸ベクトル</param>\n\t\t/// <returns>回転を表す四元数</returns>\n\t\tpublic static Quaternion Rotator(double theta, Vector axis)\n\t\t{\n\t\t\ttheta *= 0.5;\n\t\t\taxis *= Math.Sin(theta) / axis.Abs;\n\t\t\treturn new Quaternion(Math.Cos(theta), axis);\n\t\t}\n\n\t\t#endregion\n\t\t#region 文字列化\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn \"(\" + this.a.ToString() + \", \" + this.u.ToString() + \")\";\n\t\t}\n\n\t\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Mathematics/ThreeDimension/Vector.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Mathematics.ThreeDimension\n{\n\t/// <summary>\n\t/// 3次元ベクトル。\n\t/// </summary>\n\tpublic struct Vector\n\t{\n\t\t#region フィールド\n\n\t\tpublic double x, y, z;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Vector(double x, double y, double z)\n\t\t{\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t}\n\n\t\t#endregion\n\t\t#region ノルム・絶対値\n\n\t\tpublic double Norm\n\t\t{\n\t\t\tget{return this.x * this.x + this.y * this.y + this.z * this.z;}\n\t\t}\n\n\t\tpublic double Abs\n\t\t{\n\t\t\tget{return Math.Sqrt(this.Norm);}\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算子\n\n\t\tpublic static Vector operator+ (Vector a, Vector b)\n\t\t{\n\t\t\treturn new Vector(a.x + b.x, a.y + b.y, a.z + b.z);\n\t\t}\n\n\t\tpublic static Vector operator- (Vector a, Vector b)\n\t\t{\n\t\t\treturn new Vector(a.x - b.x, a.y - b.y, a.z - b.z);\n\t\t}\n\n\t\tpublic static Vector operator- (Vector a)\n\t\t{\n\t\t\treturn new Vector(-a.x, -a.y, -a.z);\n\t\t}\n\n\t\tpublic static Vector operator* (double p, Vector a)\n\t\t{\n\t\t\treturn new Vector(p * a.x, p * a.y, p * a.z);\n\t\t}\n\n\t\tpublic static Vector operator* (Vector a, double p){return p * a;}\n\t\tpublic static Vector operator/ (Vector a, double p){return (1/p) * a;}\n\n\t\t#endregion\n\t\t#region 内積・外積\n\n\t\tpublic static double InnerProduct(Vector a, Vector b)\n\t\t{\n\t\t\treturn a.x * b.x + a.y * b.y + a.z * b.z;\n\t\t}\n\n\t\tpublic static Vector OuterProduct(Vector a, Vector b)\n\t\t{\n\t\t\tdouble x = a.y * b.z - a.z * b.y;\n\t\t\tdouble y = a.z * b.x - a.x * b.z;\n\t\t\tdouble z = a.x * b.y - a.y * b.x;\n\t\t\treturn new Vector(x, y, z);\n\t\t}\n\n\t\t#endregion\n\t\t#region 文字列化\n\n\t\tpublic override string ToString()\n\t\t{\n\t\t\treturn \"(\" + this.x.ToString() + \", \" + this.y.ToString() + \", \" + this.z.ToString() + \")\";\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Misc/Trace.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Runtime.InteropServices;\n\nnamespace SoundLibrary.Misc\n{\n\t/// <summary>\n\t/// 実行時間計測用のトレースクラス。\n\t///パフォーマンスカウンタを使って実行時間を評価。\n\t/// </summary>\n\tpublic class Trace : IDisposable\n\t{\n\t\t#region DLL Import\n\n\t\t[DllImport(\"kernel32.dll\")]\n\t\tpublic extern static short QueryPerformanceCounter(ref long x);\n\t\t[DllImport(\"kernel32.dll\")]\n\t\tpublic extern static short QueryPerformanceFrequency(ref long x);\n\n\t\t#endregion\n\t\t#region フィールド\n\n\t\tstring message;\n\t\tlong time;\n\t\tTextWriter writer;\n\t\tstring format;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Trace() : this(string.Empty) {}\n\t\tpublic Trace(string message) : this(message, Console.Error, \"{0}: {1}\\n\") {}\n\n\t\tpublic Trace(string message, TextWriter writer, string format)\n\t\t{\n\t\t\tthis.message = message;\n\t\t\tthis.writer  = writer;\n\t\t\tthis.format  = format;\n\n\t\t\tthis.time = 0;\n\t\t\tQueryPerformanceCounter(ref this.time);\n\t\t}\n\n\t\t#endregion\n\t\t#region IDisposable メンバ\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tlong t = 0;\n\t\t\tQueryPerformanceCounter(ref t);\n\t\t\tt = t - this.time;\n\t\t\twriter.Write(format, this.message, t);\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Music/Amplifier.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Music\n{\n\t/// <summary>\n\t/// Amplifier の概要の説明です。\n\t/// </summary>\n\tpublic class Amplifier : Sound\n\t{\n\t\tdouble level;\n\t\tSound sound;\n\n\t\tpublic Amplifier(double level, Sound sound)\n\t\t{\n\t\t\tthis.level = level;\n\t\t\tthis.sound = sound;\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.sound.Length;\n\t\t\t}\n\t\t}\n\n\t\tpublic override double[] ToArray()\n\t\t{\n\t\t\tdouble[] x = this.sound.ToArray();\n\t\t\tfor(int i=0; i<x.Length; ++i) x[i] = this.level * x[i];\n\t\t\treturn x;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Music/CompoundSound.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Music\n{\n\t/// <summary>\n\t/// 合成音。\n\t/// 複数の Sound を合成。\n\t/// </summary>\n\tpublic class CompoundSound : Sound\n\t{\n\t\tSound[] sounds;\n\n\t\t/// <summary>\n\t\t/// 複数の Sound から生成。\n\t\t/// </summary>\n\t\t/// <param name=\"sounds\">合成音を構成する音。</param>\n\t\t/// <exception cref=\"ArgumentException\">sounds の長さがそろっていないときに発生します。</exception>\n\t\tpublic CompoundSound(params Sound[] sounds)\n\t\t{\n\t\t\tint len = sounds[0].Length;\n\t\t\tforeach(Sound sound in sounds)\n\t\t\t{\n\t\t\t\tif(len != sound.Length)\n\t\t\t\t\tthrow new ArgumentException(\"sounds の長さがそろっていません。\");\n\t\t\t}\n\n\t\t\tthis.sounds = sounds;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 長和音生成。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">音の長さ</param>\n\t\t/// <param name=\"freq\">一番下の音の周波数(正規化角周波数)</param>\n\t\t/// <param name=\"amp\">振幅(リニア値)</param>\n\t\t/// <returns></returns>\n\t\tpublic static Sound MajorChord(int length, double freq, double amp)\n\t\t{\n\t\t\treturn new CompoundSound(\n\t\t\t\tnew PureTone(length, freq, amp / 3),\n\t\t\t\tnew PureTone(length, freq * PureTemperament.MAJOR3, amp / 3),\n\t\t\t\tnew PureTone(length, freq * PureTemperament.MINOR3, amp / 3)\n\t\t\t\t);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 単和音生成。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">音の長さ</param>\n\t\t/// <param name=\"freq\">一番下の音の周波数(正規化角周波数)</param>\n\t\t/// <param name=\"amp\">振幅(リニア値)</param>\n\t\t/// <returns></returns>\n\t\tpublic static Sound MinorChord(int length, double freq, double amp)\n\t\t{\n\t\t\treturn new CompoundSound(\n\t\t\t\tnew PureTone(length, freq, amp / 3),\n\t\t\t\tnew PureTone(length, freq * PureTemperament.MINOR3, amp / 3),\n\t\t\t\tnew PureTone(length, freq * PureTemperament.MAJOR3, amp / 3)\n\t\t\t\t);\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.sounds[0].Length;\n\t\t\t}\n\t\t}\n\n\t\tpublic override double[] ToArray()\n\t\t{\n\t\t\tdouble[] x = new double[this.Length];\n\t\t\tforeach(Sound sound in this.sounds)\n\t\t\t{\n\t\t\t\tdouble[] y = sound.ToArray();\n\t\t\t\tfor(int i=0; i<x.Length; ++i)\n\t\t\t\t\tx[i] += y[i];\n\t\t\t}\n\t\t\treturn x;\n\t\t}\n\n\t}//class CompoundSound\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Music/Envelope.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Music\n{\n\t/// <summary>\n\t/// エンベロープ生成用のパラメータ。\n\t/// </summary>\n\tpublic class EnvelopeParameter\n\t{\n\t\tpublic double attackLevel;  // アタックレベル(リニア値)\n\t\tpublic double sustainLevel; // サステインレベル(リニア値)\n\t\tpublic int attackTime;      // アタックタイム(ステップ数)\n\t\tpublic int decayTime;       // ディケイタイム(ステップ数)\n\t\tpublic int releaseTime;     // リリースタイム(ステップ数)\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"al\">アタックレベル(リニア値)</param>\n\t\t/// <param name=\"sl\">サステインレベル(リニア値)</param>\n\t\t/// <param name=\"at\">アタックタイム(ステップ数)</param>\n\t\t/// <param name=\"dt\">リリースタイム(ステップ数)</param>\n\t\t/// <param name=\"rt\">リリースタイム(ステップ数)</param>\n\t\tpublic EnvelopeParameter(double al, double sl, int at, int dt, int rt)\n\t\t{\n\t\t\tthis.attackLevel  = al;\n\t\t\tthis.sustainLevel = sl;\n\t\t\tthis.attackTime   = at;\n\t\t\tthis.decayTime    = dt;\n\t\t\tthis.releaseTime  = rt;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// 元となる Sound にエンベロープ曲線を掛けた Sound を生成する。\n\t/// \n\t/// アタックタイム\n\t/// 　　　　ディケイタイム　　　リリースタイム\n\t/// ←──→←→　　　　　　　　←→\n\t/// 　　　／＼　←アタックレベル\n\t/// 　　／　　＼\n\t/// 　／　　　　￣￣￣￣￣￣￣￣＼ 　←サステインレベル\n\t/// ／　　　　　　　　　　　　　　＼\n\t/// </summary>\n\tpublic class Envelope : Sound\n\t{\n\t\tEnvelopeParameter parameter;\n\t\tSound sound;\n\n\t\t/// <summary>\n\t\t/// エンベロープパラメータと元となる Sound を指定して生成。\n\t\t/// </summary>\n\t\t/// <param name=\"al\">アタックレベル(sound の振幅との相対値)</param>\n\t\t/// <param name=\"sl\">サステインレベル(sound の振幅との相対値)</param>\n\t\t/// <param name=\"at\">アタックタイム(ステップ数)</param>\n\t\t/// <param name=\"dt\">リリースタイム(ステップ数)</param>\n\t\t/// <param name=\"rt\">リリースタイム(ステップ数)</param>\n\t\t/// <param name=\"sound\">元となる音</param>\n\t\tpublic Envelope(double al, double sl, int at, int dt, int rt, Sound sound)\n\t\t\t: this(new EnvelopeParameter(al, sl, at, dt, rt), sound)\n\t\t{\n\t\t}\n\n\t\t/// <summary>\n\t\t/// エンベロープパラメータと元となる Sound を指定して生成。\n\t\t/// </summary>\n\t\t/// <param name=\"sound\">元となる音</param>\n\t\tpublic Envelope(EnvelopeParameter parameter, Sound sound)\n\t\t{\n\t\t\tCheckParameter(parameter, sound.Length);\n\t\t\tthis.parameter = parameter;\n\t\t\tthis.sound = sound;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パラメータの正当性をチェック。\n\t\t/// </summary>\n\t\t/// <param name=\"parameter\">パラメータ</param>\n\t\t/// <param name=\"length\">音の長さ</param>\n\t\tstatic void CheckParameter(EnvelopeParameter parameter, int length)\n\t\t{\n\t\t\tif(parameter.attackTime < 0)\n\t\t\t\tthrow new ArgumentException(\"アタックタイムが負\");\n\t\t\tif(parameter.decayTime < 0)\n\t\t\t\tthrow new ArgumentException(\"ディケイタイムが負\");\n\t\t\tif(parameter.releaseTime < 0)\n\t\t\t\tthrow new ArgumentException(\"リリースタイムが負\");\n\t\t\tif(parameter.attackTime + parameter.decayTime + parameter.releaseTime > length)\n\t\t\t\tthrow new ArgumentException(\"音が短すぎ\");\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.sound.Length;\n\t\t\t}\n\t\t}\n\n\t\tpublic override double[] ToArray()\n\t\t{\n\t\t\tdouble[] x = this.sound.ToArray();\n\t\t\tdouble grad;\n\n\t\t\tdouble al = this.parameter.attackLevel;\n\t\t\tdouble sl = this.parameter.sustainLevel;\n\t\t\tint    at = this.parameter.attackTime;\n\t\t\tint    dt = this.parameter.decayTime;\n\t\t\tint    rt = this.parameter.releaseTime;\n\t\t\tint   len = this.sound.Length;\n\n\t\t\tint i = 0;\n\n\t\t\t// アタック\n\t\t\tgrad = al / at;\n\t\t\tfor(; i <= at; ++i)\n\t\t\t{\n\t\t\t\tint n = i + 1;\n\t\t\t\tx[i] *= n * grad;\n\t\t\t}\n\n\t\t\t// ディケイ\n\t\t\tgrad = grad = (al - sl) / dt;\n\t\t\tfor(; i <= at + dt; ++i)\n\t\t\t{\n\t\t\t\tint n = at + dt - i;\n\t\t\t\tx[i] *= n * grad  + sl;\n\t\t\t}\n\n\t\t\t// サステイン\n\t\t\tfor(; i < len - rt; ++i)\n\t\t\t{\n\t\t\t\tx[i] *= sl;\n\t\t\t}\n\n\t\t\t// リリース\n\t\t\tgrad = sl / rt;\n\t\t\tfor(; i<len; ++i)\t\t\n\t\t\t{\n\t\t\t\tint n = len - i;\n\t\t\t\tx[i] *= n * grad;\n\t\t\t}\n\n\t\t\treturn x;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Music/HarmonicTone.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Music\n{\n\t/// <summary>\n\t/// 正弦波倍音列。\n\t/// </summary>\n\tpublic class HarmonicTone : Sound\n\t{\n\t\tint length;       // 音の長さ\n\t\tdouble frequency; // 基底音の周波数(πで正規化)\n\t\tPolarParameter[] parameters;\n\n\t\t/// <summary>\n\t\t/// 音の長さ、基底音の周波数、倍音列の振幅・位相から生成。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">音の長さ</param>\n\t\t/// <param name=\"freq\">基底音の周波数(正規化角周波数)</param>\n\t\t/// <param name=\"parameters\">倍音列の振幅(リニア値)と位相(rad)</param>\n\t\tpublic HarmonicTone(int length, double freq, params PolarParameter[] parameters)\n\t\t{\n\t\t\tthis.length = length;\n\t\t\tthis.frequency = freq;\n\t\t\tthis.parameters = parameters;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 音の長さ、基底音の周波数、倍音列の振幅から生成。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">音の長さ</param>\n\t\t/// <param name=\"freq\">基底音の周波数(正規化角周波数)</param>\n\t\t/// <param name=\"amps\">倍音列の振幅(リニア値)</param>\n\t\tpublic HarmonicTone(int length, double freq, params double[] amps)\n\t\t{\n\t\t\tthis.length = length;\n\t\t\tthis.frequency = freq;\n\t\t\tthis.parameters = new PolarParameter[amps.Length];\n\t\t\tfor(int i=0; i<amps.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.parameters[i] = new PolarParameter(amps[i], 0);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 音の長さ、基底音の周波数、倍音列の振幅・位相から生成。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">音の長さ</param>\n\t\t/// <param name=\"freq\">基底音の周波数(正規化角周波数)</param>\n\t\t/// <param name=\"amps\">倍音列の振幅(リニア値)</param>\n\t\t/// <param name=\"phase\">倍音列の位相</param>\n\t\tpublic HarmonicTone(int length, double freq, double[] amps, double[] phase)\n\t\t{\n\t\t\tthis.length = length;\n\t\t\tthis.frequency = freq;\n\t\t\tthis.parameters = new PolarParameter[amps.Length];\n\t\t\tfor(int i=0; i<amps.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.parameters[i] = new PolarParameter(amps[i], phase[i]);\n\t\t\t}\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget{return this.length;}\n\t\t}\n\n\t\tpublic double this[int i]\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tdouble x = 0;\n\t\t\t\tfor(int k=0; k<this.parameters.Length; ++k)\n\t\t\t\t{\n\t\t\t\t\tPolarParameter parameter = this.parameters[k];\n\t\t\t\t\tx += parameter.amplitude * Math.Sin(this.frequency * k * i + parameter.phase);\n\t\t\t\t}\n\n\t\t\t\treturn x;\n\t\t\t}\n\t\t}\n\n\t\tpublic override double[] ToArray()\n\t\t{\n\t\t\tdouble[] array = new double[this.Length];\n\t\t\tfor(int i=0; i<this.Length; ++i)\n\t\t\t\tarray[i] = this[i];\n\t\t\treturn array;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Music/PeriodicSound.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Music\n{\n\t/// <summary>\n\t/// 周期音を作る。\n\t/// </summary>\n\tpublic class PeriodicSound : Sound\n\t{\n\t\tint iteration;\n\t\tSound sound;\n\n\t\t/// <summary>\n\t\t/// sound を iteration 回繰り返す音を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"iteration\">反復回数</param>\n\t\t/// <param name=\"sound\">原音</param>\n\t\tpublic PeriodicSound(int iteration, Sound sound)\n\t\t{\n\t\t\tthis.iteration = iteration;\n\t\t\tthis.sound = sound;\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.sound.Length * this.iteration;\n\t\t\t}\n\t\t}\n\n\t\tpublic override double[] ToArray()\n\t\t{\n\t\t\tdouble[] w = this.sound.ToArray();\n\t\t\tdouble[] x = new double[this.Length];\n\n\t\t\tfor(int i=0, j=0; i<iteration; ++i)\n\t\t\t\tfor(int k=0; k<w.Length; ++k, ++j)\n\t\t\t\t\tx[j] = w[k];\n\t\t\treturn x;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Music/PureTone.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Music\n{\n\t/// <summary>\n\t/// 極形式で振幅と位相を保持する構造体。\n\t/// </summary>\n\tpublic struct PolarParameter\n\t{\n\t\tpublic double amplitude;\n\t\tpublic double phase;\n\n\t\tpublic PolarParameter(double amp, double phase)\n\t\t{\n\t\t\tthis.amplitude = amp;\n\t\t\tthis.phase     = phase;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// 正弦波単音。\n\t/// </summary>\n\tpublic class PureTone : Sound\n\t{\n\t\tint length;       // 音の長さ\n\t\tdouble frequency; // 周波数(正規化角周波数)\n\t\tdouble amplitude; // 振幅(リニア値)\n\t\tdouble phase;     // 初期位相(rad)\n\n\t\t/// <summary>\n\t\t/// 振幅、周波数を指定して初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">音の長さ(サンプル数)</param>\n\t\t/// <param name=\"freq\">周波数(正規化角周波数)</param>\n\t\t/// <param name=\"amp\">振幅(リニア値)</param>\n\t\tpublic PureTone(int length, double freq, double amp)\n\t\t{\n\t\t\tthis.length = length;\n\t\t\tthis.frequency = freq;\n\t\t\tthis.amplitude = amp;\n\t\t\tthis.phase = 0;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 振幅、周波数、初期位相を指定して初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">音の長さ(サンプル数)</param>\n\t\t/// <param name=\"freq\">周波数(正規化角周波数)</param>\n\t\t/// <param name=\"amp\">振幅(リニア値)</param>\n\t\t/// <param name=\"phase\">初期位相(rad)</param>\n\t\tpublic PureTone(int length, double freq, double amp, double phase)\n\t\t{\n\t\t\tthis.length = length;\n\t\t\tthis.frequency = freq;\n\t\t\tthis.amplitude = amp;\n\t\t\tthis.phase = phase;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 振幅、周波数、初期位相を指定して初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">音の長さ(サンプル数)</param>\n\t\t/// <param name=\"freq\">周波数(正規化角周波数)</param>\n\t\t/// <param name=\"parameter\">振幅と初期位相</param>\n\t\tpublic PureTone(int length, double freq, PolarParameter parameter)\n\t\t\t: this(length, freq, parameter.amplitude, parameter.phase)\n\t\t{\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget{return this.length;}\n\t\t}\n\n\t\tpublic double this[int i]\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.amplitude * Math.Sin(this.frequency * i + this.phase);\n\t\t\t}\n\t\t}\n\n\t\tpublic override double[] ToArray()\n\t\t{\n\t\t\tdouble[] array = new double[this.Length];\n\t\t\tfor(int i=0; i<this.Length; ++i)\n\t\t\t\tarray[i] = this[i];\n\t\t\treturn array;\n\t\t}\n\n\t}//class PureTone\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Music/Sound.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Music\n{\n\t/// <summary>\n\t/// 1音を表す。\n\t/// </summary>\n\tpublic abstract class Sound\n\t{\n\t\t/// <summary>\n\t\t/// 音の長さ。\n\t\t/// </summary>\n\t\tpublic abstract int Length{get;}\n\n\t\t/// <summary>\n\t\t/// 配列化。\n\t\t/// </summary>\n\t\t/// <returns>音データを格納した配列</returns>\n\t\tpublic abstract double[] ToArray();\n\t}//class Sound\n}//namespace Music\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Music/SoundFromData.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.Data;\n\nnamespace SoundLibrary.Music\n{\n\t/// <summary>\n\t/// IDataGenerator から Sound を作る。\n\t/// </summary>\n\tpublic class SoundFromData : Sound\n\t{\n\t\tIDataGenerator generator;\n\t\tint length;\n\n\t\t/// <summary>\n\t\t/// IDataGenerator と音の長さを指定して初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"generator\">データ生成クラス</param>\n\t\t/// <param name=\"length\">音の長さ</param>\n\t\tpublic SoundFromData(IDataGenerator generator, int length)\n\t\t{\n\t\t\tthis.generator = generator;\n\t\t\tthis.length = length;\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.length;\n\t\t\t}\n\t\t}\n\n\t\tpublic override double[] ToArray()\n\t\t{\n\t\t\tdouble[] x = new double[this.length];\n\n\t\t\tfor(int i=0; i<this.length; ++i)\n\t\t\t\tx[i] = this.generator.Next();\n\n\t\t\treturn x;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Music/SoundWithFilter.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.Filter;\n\nnamespace SoundLibrary.Music\n{\n\t/// <summary>\n\t/// フィルタを掛けた音を生成する。\n\t/// </summary>\n\tpublic class SoundWithFilter : Sound\n\t{\n\t\tSound sound;\n\t\tIFilter filter;\n\t\tint delay; // filter の遅延時間\n\n\t\t/// <summary>\n\t\t/// 元となる Sound、フィルタ、フィルタの遅延時間を指定して生成。\n\t\t/// </summary>\n\t\t/// <param name=\"sound\">元となる音</param>\n\t\t/// <param name=\"filter\">フィルタ</param>\n\t\t/// <param name=\"delay\">filter の遅延時間</param>\n\t\tpublic SoundWithFilter(Sound sound, IFilter filter, int delay)\n\t\t{\n\t\t\tthis.sound = sound;\n\t\t\tthis.filter = filter;\n\t\t\tthis.delay = delay;\n\t\t}\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.sound.Length;\n\t\t\t}\n\t\t}\n\n\t\tpublic override double[] ToArray()\n\t\t{\n\t\t\tdouble[] x = this.sound.ToArray();\n\n\t\t\tint i=0;\n\t\t\tint j=0;\n\t\t\tfor(; i<this.delay; ++i)\n\t\t\t{\n\t\t\t\tfilter.GetValue(x[i]);\n\t\t\t}\n\t\t\tfor(; i<x.Length; ++i, ++j)\n\t\t\t{\n\t\t\t\tx[j] = filter.GetValue(x[i]);\n\t\t\t}\n\t\t\tfor(; j<x.Length; ++j)\n\t\t\t{\n\t\t\t\tx[j] = filter.GetValue(0);\n\t\t\t}\n\n\t\t\treturn x;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Music/Temperament.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Music\n{\n\t/// <summary>\n\t/// 平均律音階定数定義。\n\t/// </summary>\n\tpublic class EqualTemperament\n\t{\n\t\t// 周波数比\n\t\tpublic static readonly double TONE     = Math.Pow(2.0, 1/6.0);\n\t\tpublic static readonly double SEMITONE = Math.Pow(2.0, 1/12.0);\n\t\tpublic static readonly double SHARP  = SEMITONE;\n\t\tpublic static readonly double FLAT   = 1.0 / SEMITONE;\n\t\tpublic const double OCTAVE = 2.0;\n\n\t\t// 音階\n\t\tpublic const double A3 = 440.0;\n\t\tpublic static readonly double B3 = A3 * TONE;\n\t\tpublic static readonly double C3 = B3 * SEMITONE / OCTAVE;\n\t\tpublic static readonly double D3 = C3 * TONE;\n\t\tpublic static readonly double E3 = D3 * TONE;\n\t\tpublic static readonly double F3 = E3 * SEMITONE;\n\t\tpublic static readonly double G3 = F3 * TONE;\n\n\t\tstatic readonly double[] Aarray = new double[]{\n\t\t\tA3 / OCTAVE / OCTAVE / OCTAVE, A3 / OCTAVE / OCTAVE,\n\t\t\tA3 / OCTAVE, A3, A3 * OCTAVE,\n\t\t\tA3 * OCTAVE * OCTAVE, A3 * OCTAVE * OCTAVE * OCTAVE};\n\t\tstatic readonly double[] Barray = new double[]{\n\t\t\tB3 / OCTAVE / OCTAVE / OCTAVE, B3 / OCTAVE / OCTAVE,\n\t\t\tB3 / OCTAVE, B3, B3 * OCTAVE,\n\t\t\tB3 * OCTAVE * OCTAVE, B3 * OCTAVE * OCTAVE * OCTAVE};\n\t\tstatic readonly double[] Carray = new double[]{\n\t\t\tC3 / OCTAVE / OCTAVE / OCTAVE, C3 / OCTAVE / OCTAVE,\n\t\t\tC3 / OCTAVE, C3, C3 * OCTAVE,\n\t\t\tC3 * OCTAVE * OCTAVE, C3 * OCTAVE * OCTAVE * OCTAVE};\n\t\tstatic readonly double[] Darray = new double[]{\n\t\t\tD3 / OCTAVE / OCTAVE / OCTAVE, D3 / OCTAVE / OCTAVE,\n\t\t\tD3 / OCTAVE, D3, D3 * OCTAVE,\n\t\t\tD3 * OCTAVE * OCTAVE, D3 * OCTAVE * OCTAVE * OCTAVE};\n\t\tstatic readonly double[] Earray = new double[]{\n\t\t\tE3 / OCTAVE / OCTAVE / OCTAVE, E3 / OCTAVE / OCTAVE,\n\t\t\tE3 / OCTAVE, E3, E3 * OCTAVE,\n\t\t\tE3 * OCTAVE * OCTAVE, E3 * OCTAVE * OCTAVE * OCTAVE};\n\t\tstatic readonly double[] Farray = new double[]{\n\t\t\tF3 / OCTAVE / OCTAVE / OCTAVE, F3 / OCTAVE / OCTAVE,\n\t\t\tF3 / OCTAVE, F3, F3 * OCTAVE,\n\t\t\tF3 * OCTAVE * OCTAVE, F3 * OCTAVE * OCTAVE * OCTAVE};\n\t\tstatic readonly double[] Garray = new double[]{\n\t\t\tG3 / OCTAVE / OCTAVE / OCTAVE, G3 / OCTAVE / OCTAVE,\n\t\t\tG3 / OCTAVE, G3, G3 * OCTAVE,\n\t\t\tG3 * OCTAVE * OCTAVE, G3 * OCTAVE * OCTAVE * OCTAVE};\n\n\t\tpublic static readonly double DO  = C3;\n\t\tpublic static readonly double RE  = D3;\n\t\tpublic static readonly double MI  = E3;\n\t\tpublic static readonly double FA  = F3;\n\t\tpublic static readonly double SOL = G3;\n\t\tpublic static readonly double LA  = A3;\n\t\tpublic static readonly double SI  = B3;\n\n\t\tpublic static double A(int i){return Aarray[i];}\n\t\tpublic static double B(int i){return Barray[i];}\n\t\tpublic static double C(int i){return Carray[i];}\n\t\tpublic static double D(int i){return Darray[i];}\n\t\tpublic static double E(int i){return Earray[i];}\n\t\tpublic static double F(int i){return Farray[i];}\n\t\tpublic static double G(int i){return Garray[i];}\n\t}//class EqualTemperament\n\n\t/// <summary>\n\t/// 純粋律音階定数定義。\n\t/// </summary>\n\tpublic class PureTemperament\n\t{\n\t\t// 周波数比\n\t\tpublic static readonly double TONE     = Math.Pow(2.0, 1/6.0);\n\t\tpublic static readonly double SEMITONE = Math.Pow(2.0, 1/12.0);\n\t\tpublic static readonly double SHARP  = SEMITONE;\n\t\tpublic static readonly double FLAT   = 1.0 / SEMITONE;\n\t\tpublic const double OCTAVE = 2.0;\n\n\t\tpublic const double MINOR2   = 10.0 / 9.0; // 短2度\n\t\tpublic const double MAJOR2   =  9.0 / 8.0; // 長2度\n\t\tpublic const double MINOR3   =  6.0 / 5.0; // 短3度\n\t\tpublic const double MAJOR3   =  5.0 / 4.0; // 長3度\n\t\tpublic const double PERFECT4 =  4.0 / 3.0; // 完全4度\n\t\tpublic const double PERFECT5 =  3.0 / 2.0; // 完全5度\n\t\tpublic const double MINOR6   =  8.0 / 5.0; // 短6度\n\t\tpublic const double MAJOR6   =  5.0 / 3.0; // 長6度\n\t\tpublic const double MINOR7   =  9.0 / 5.0; // 短7度\n\t\tpublic const double MAJOR7   = 15.0 / 8.0; // 長7度\n\n\t\t// 音階\n\t\tpublic const double A3 = 440.0;\n\t\tpublic static readonly double B3 = A3 * MAJOR2;\n\t\tpublic static readonly double C3 = A3 * MAJOR3   / OCTAVE;\n\t\tpublic static readonly double D3 = A3 * PERFECT4 / OCTAVE;\n\t\tpublic static readonly double E3 = A3 * PERFECT5 / OCTAVE;\n\t\tpublic static readonly double F3 = A3 * MAJOR6   / OCTAVE;\n\t\tpublic static readonly double G3 = A3 * MAJOR7   / OCTAVE;\n\n\t\tstatic readonly double[] Aarray = new double[]{\n\t\t\tA3 / OCTAVE / OCTAVE / OCTAVE, A3 / OCTAVE / OCTAVE,\n\t\t\tA3 / OCTAVE, A3, A3 * OCTAVE,\n\t\t\tA3 * OCTAVE * OCTAVE, A3 * OCTAVE * OCTAVE * OCTAVE};\n\t\tstatic readonly double[] Barray = new double[]{\n\t\t\tB3 / OCTAVE / OCTAVE / OCTAVE, B3 / OCTAVE / OCTAVE,\n\t\t\tB3 / OCTAVE, B3, B3 * OCTAVE,\n\t\t\tB3 * OCTAVE * OCTAVE, B3 * OCTAVE * OCTAVE * OCTAVE};\n\t\tstatic readonly double[] Carray = new double[]{\n\t\t\tC3 / OCTAVE / OCTAVE / OCTAVE, C3 / OCTAVE / OCTAVE,\n\t\t\tC3 / OCTAVE, C3, C3 * OCTAVE,\n\t\t\tC3 * OCTAVE * OCTAVE, C3 * OCTAVE * OCTAVE * OCTAVE};\n\t\tstatic readonly double[] Darray = new double[]{\n\t\t\tD3 / OCTAVE / OCTAVE / OCTAVE, D3 / OCTAVE / OCTAVE,\n\t\t\tD3 / OCTAVE, D3, D3 * OCTAVE,\n\t\t\tD3 * OCTAVE * OCTAVE, D3 * OCTAVE * OCTAVE * OCTAVE};\n\t\tstatic readonly double[] Earray = new double[]{\n\t\t\tE3 / OCTAVE / OCTAVE / OCTAVE, E3 / OCTAVE / OCTAVE,\n\t\t\tE3 / OCTAVE, E3, E3 * OCTAVE,\n\t\t\tE3 * OCTAVE * OCTAVE, E3 * OCTAVE * OCTAVE * OCTAVE};\n\t\tstatic readonly double[] Farray = new double[]{\n\t\t\tF3 / OCTAVE / OCTAVE / OCTAVE, F3 / OCTAVE / OCTAVE,\n\t\t\tF3 / OCTAVE, F3, F3 * OCTAVE,\n\t\t\tF3 * OCTAVE * OCTAVE, F3 * OCTAVE * OCTAVE * OCTAVE};\n\t\tstatic readonly double[] Garray = new double[]{\n\t\t\tG3 / OCTAVE / OCTAVE / OCTAVE, G3 / OCTAVE / OCTAVE,\n\t\t\tG3 / OCTAVE, G3, G3 * OCTAVE,\n\t\t\tG3 * OCTAVE * OCTAVE, G3 * OCTAVE * OCTAVE * OCTAVE};\n\n\t\tpublic static readonly double DO  = C3;\n\t\tpublic static readonly double RE  = D3;\n\t\tpublic static readonly double MI  = E3;\n\t\tpublic static readonly double FA  = F3;\n\t\tpublic static readonly double SOL = G3;\n\t\tpublic static readonly double LA  = A3;\n\t\tpublic static readonly double SI  = B3;\n\n\t\tpublic static double A(int i){return Aarray[i];}\n\t\tpublic static double B(int i){return Barray[i];}\n\t\tpublic static double C(int i){return Carray[i];}\n\t\tpublic static double D(int i){return Darray[i];}\n\t\tpublic static double E(int i){return Earray[i];}\n\t\tpublic static double F(int i){return Farray[i];}\n\t\tpublic static double G(int i){return Garray[i];}\n\t}//class PureTemperament\n}//namespace Wave\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Music/Tremolo.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Music\n{\n\t/// <summary>\n\t/// うなり生成用パラメータ。\n\t/// </summary>\n\tpublic class TremoloParameter\n\t{\n\t\tpublic double rate;  // うなりの周波数(正規化角周波数)。\n\t\tpublic double depth; // うなりの深さ(0～1)。\n\t\tpublic int    delay; // うなりがかかり始める時間(ステップ数)。\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"rate\">うなりの周波数(正規化角周波数)</param>\n\t\t/// <param name=\"depth\">うなりの深さ(0～1)</param>\n\t\t/// <param name=\"delay\">うなりがかかり始める時間(ステップ数)</param>\n\t\tpublic TremoloParameter(double rate, double depth, int delay)\n\t\t{\n\t\t\tthis.rate = rate;\n\t\t\tthis.depth = depth;\n\t\t\tthis.delay = delay;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// 元となる Sound にうなりを掛けた Sound を生成する。\n\t/// </summary>\n\tpublic class Tremolo : Sound\n\t{\n\t\tTremoloParameter parameter;\n\t\tSound sound;\n\n\t\t/// <summary>\n\t\t/// うなりのパラメータと元となる Sound を指定して生成。\n\t\t/// </summary>\n\t\t/// <param name=\"parameter\">うなりのパラメータ</param>\n\t\t/// <param name=\"sound\">元となる音</param>\n\t\tpublic Tremolo(TremoloParameter parameter, Sound sound)\n\t\t{\n\t\t\tif(sound.Length < parameter.delay)\n\t\t\t\tthrow new ArgumentException(\"音が短すぎ\");\n\n\t\t\tthis.parameter = parameter;\n\t\t\tthis.sound = sound;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// うなりパラメータと元となる Sound を指定して生成。\n\t\t/// </summary>\n\t\t/// <param name=\"rate\">うなりの周波数(正規化角周波数)</param>\n\t\t/// <param name=\"depth\">うなりの深さ(0～1)</param>\n\t\t/// <param name=\"delay\">うなりがかかり始める時間(ステップ数)</param>\n\t\t/// <param name=\"sound\">元となる音</param>\n\t\tpublic Tremolo(double rate, double depth, int delay, Sound sound)\n\t\t\t: this(new TremoloParameter(rate, depth, delay), sound)\n\t\t{\n\t\t}\n\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.sound.Length;\n\t\t\t}\n\t\t}\n\n\t\tpublic override double[] ToArray()\n\t\t{\n\t\t\tdouble[] x = this.sound.ToArray();\n\n\t\t\tint delay = this.parameter.delay;\n\t\t\tdouble rate = this.parameter.rate;\n\t\t\tdouble depth = this.parameter.depth;\n\n\t\t\tfor(int i=delay+1; i<x.Length; ++i)\n\t\t\t{\n\t\t\t\tx[i] *= 1 + depth * Math.Sin(rate * (i - delay));\n\t\t\t}\n\n\t\t\treturn x;\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Music/Vibrato.cs",
    "content": "﻿using System;\nusing SoundLibrary.Filter.Delay;\n\nnamespace SoundLibrary.Music\n{\n\t/// <summary>\n\t/// ビブラート生成用パラメータ。\n\t/// </summary>\n\tpublic class VibratoParameter\n\t{\n\t\tpublic double rate;  // ビブラートレート(正規化角周波数)。\n\t\tpublic int    depth; // ビブラートデプス(ステップ数)。\n\t\tpublic int    delay; // ビブラートディレイ(ステップ数)。\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"rate\">ビブラートレート(正規化角周波数)</param>\n\t\t/// <param name=\"depth\">ビブラートデプス(ステップ数)</param>\n\t\t/// <param name=\"delay\">ビブラートディレイ(ステップ数)</param>\n\t\tpublic VibratoParameter(double rate, int depth, int delay)\n\t\t{\n\t\t\tthis.rate = rate;\n\t\t\tthis.depth = depth;\n\t\t\tthis.delay = delay;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// 元となる Sound にビブラート曲線を掛けた Sound を生成する。\n\t/// </summary>\n\tpublic class Vibrato : Sound\n\t{\n\t\tVibratoParameter parameter;\n\t\tSound sound;\n\t\tFractionalDelay delay;\n\n\t\t/// <summary>\n\t\t/// ビブラートパラメータと元となる Sound を指定して生成。\n\t\t/// </summary>\n\t\t/// <param name=\"parameter\">ビブラートパラメータ</param>\n\t\t/// <param name=\"sound\">元となる音</param>\n\t\tpublic Vibrato(VibratoParameter parameter, Sound sound)\n\t\t{\n\t\t\tif(sound.Length < parameter.delay)\n\t\t\t\tthrow new ArgumentException(\"音が短すぎ\");\n\n\t\t\tthis.parameter = parameter;\n\t\t\tthis.sound = sound;\n\n\t\t\tthis.delay = new FractionalDelay(2 * parameter.depth);\n\t\t\tthis.delay.DelayTime = parameter.depth;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ビブラートパラメータと元となる Sound を指定して生成。\n\t\t/// </summary>\n\t\t/// <param name=\"rate\">ビブラートレート(正規化角周波数)</param>\n\t\t/// <param name=\"depth\">ビブラートデプス(0～1)</param>\n\t\t/// <param name=\"delay\">ビブラートディレイ(ステップ数)</param>\n\t\t/// <param name=\"sound\">元となる音</param>\n\t\tpublic Vibrato(double rate, int depth, int delay, Sound sound)\n\t\t\t: this(new VibratoParameter(rate, depth, delay), sound)\n\t\t{\n\t\t}\n\n\n\t\tpublic override int Length\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.sound.Length;\n\t\t\t}\n\t\t}\n\n\t\tpublic override double[] ToArray()\n\t\t{\n\t\t\tdouble[] x = this.sound.ToArray();\n\n\t\t\tint delay = this.parameter.delay;\n\t\t\tdouble rate = this.parameter.rate;\n\t\t\tint depth = this.parameter.depth;\n\n\t\t\tint i=0, j=delay;\n\t\t\tfor(; i<delay; ++i) this.delay.Push(x[i]);\n\t\t\tfor(; i<delay + depth; ++i) this.delay.Push(x[i]);\n\t\t\tfor(; i<x.Length; ++j, ++i)\n\t\t\t{\n\t\t\t\tthis.delay.DelayTime = depth * (1 + Math.Sin(rate * (i - delay)));\n\t\t\t\tx[j] = this.delay.GetValue(x[i]);\n\t\t\t}\n\t\t\tfor(; j<x.Length; ++j) x[j] = this.delay.GetValue(0);\n\n\t\t\treturn x;\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Pipe/CascadePipe.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Pipe\n{\n\t/// <summary>\n\t/// Pipe を直列に繋ぐ。\n\t/// </summary>\n\tpublic class CascadePipe : Pipe\n\t{\n\t\t#region フィールド\n\n\t\tPipe[] pipes;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic CascadePipe(params Pipe[] pipes)\n\t\t\t: base(pipes[0].InputQueue, pipes[pipes.Length - 1].OutputQueue)\n\t\t{\n\t\t\tthis.pipes = pipes;\n\t\t}\n\n\t\t#endregion\n\t\t#region 処理\n\n\t\tpublic override void Process()\n\t\t{\n\t\t\tforeach(Pipe pipe in this.pipes)\n\t\t\t\tpipe.Process();\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Pipe/Monaural/FilteredPipe.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.Filter;\n\nnamespace SoundLibrary.Pipe.Monaural\n{\n\t/// <summary>\n\t/// フィルタ処理を行うパイプ。\n\t/// </summary>\n\tpublic class FilteredPipe : Pipe\n\t{\n\t\t#region フィールド\n\n\t\tIFilter filter;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic FilteredPipe(Queue input, Queue output, IFilter filter)\n\t\t\t: base(input, output)\n\t\t{\n\t\t\tthis.filter = filter;\n\t\t}\n\n\t\t#endregion\n\t\t#region 処理\n\n\t\tpublic override void Process()\n\t\t{\n\t\t\twhile(!this.input.IsEmpty)\n\t\t\t{\n\t\t\t\tdouble val = this.filter.GetValue(this.input.Front);\n\t\t\t\tthis.output.Enqueue(SoundLibrary.Util.ClipShort(val));\n\t\t\t\tthis.input.Dequeue();\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Pipe/Monaural/RateTransposer.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Pipe.Monaural\n{\n\t/// <summary>\n\t/// 移調を行うクラス。\n\t/// データの間を補完して、データ長を変えることで、音程を変更する。\n\t/// 再生時間も変わってしまう。\n\t/// </summary>\n\t/// <remarks>\n\t/// 線形補間によるアップサンプル/ダウンサンプルしているだけなので、\n\t/// 高音質を目指すなら、別途、アンチエイリアスフィルタをかける必要がある。\n\t/// </remarks>\n\tpublic class RateTransposer : Pipe\n\t{\n\t\t#region 定数\n\n\t\tconst double DEFAULT_RATE = 1.0;\n\n\t\t#endregion\n\t\t#region フィールド\n\n\t\t// パラメータ\n\t\tdouble rate; // 変換レート。音程が rate 、再生時間が 1/rate 倍に。\n\n\t\t// 現在の状態\n\t\tshort prev; // 1音前のデータを一時的に保存しておく。\n\t\tdouble delta; // Bresenham アルゴリズム（DDA）的な動作をするための状態変数。\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\t/// <summary>\n\t\t/// デフォルト値で初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"input\">入力キュー</param>\n\t\t/// <param name=\"output\">出力キュー</param>\n\t\tpublic RateTransposer(Queue input, Queue output)\n\t\t\t: this(input, output, DEFAULT_RATE)\n\t\t{\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パラメータの設定。\n\t\t/// </summary>\n\t\t/// <param name=\"input\">入力キュー</param>\n\t\t/// <param name=\"output\">出力キュー</param>\n\t\t/// <param name=\"rate\">変換レート。音程が rate 倍、再生時間が 1/rate 倍に。</param>\n\t\tpublic RateTransposer(Queue input, Queue output, double rate)\n\t\t\t: base(input, output)\n\t\t{\n\t\t\tthis.rate = rate;\n\t\t\tthis.delta = rate / 2;\n\t\t}\n\n\t\t#endregion\n\t\t#region 処理\n\n\t\tpublic override void Process()\n\t\t{\n\t\t\twhile(!this.input.IsEmpty)\n\t\t\t{\n\t\t\t\tif(this.delta >= 0)\n\t\t\t\t{\n\t\t\t\t\tshort data = Interpolate(this.delta, this.input.Front, this.prev);\n\t\t\t\t\tthis.output.Enqueue(data);\n\n\t\t\t\t\tdelta -= this.rate;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis.prev = this.input.Front;\n\t\t\t\t\tthis.input.Dequeue();\n\n\t\t\t\t\tdelta += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 補助関数(private)\n\n\t\t/// <summary>\n\t\t/// 線形補間関数。\n\t\t/// </summary>\n\t\t/// <param name=\"delta\">val1 と val2 を混ぜる割合（整数部分は無視される）</param>\n\t\t/// <param name=\"val1\">値1</param>\n\t\t/// <param name=\"val2\">値2</param>\n\t\t/// <returns></returns>\n\t\tstatic short Interpolate(double delta, short val1, short val2)\n\t\t{\n\t\t\tdelta -= (int)delta;\n\t\t\tdouble val = val1 + delta * (val2 - val1);\n\t\t\treturn (short)val;\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Pipe/Monaural/TimeStretcher.cs",
    "content": "﻿#define A\n\nusing System;\n\nnamespace SoundLibrary.Pipe.Monaural\n{\n\t/// <summary>\n\t/// 時間伸長・短縮処理を行うクラス。\n\t/// 一定間隔でデータを間引き・コピーすることで、\n\t/// 音程を変えることなく再生時間を伸長・短縮する。\n\t/// </summary>\n\tpublic class TimeStretcher : Pipe\n\t{\n\t\t#region 定数\n\n\t\tconst int DEFAULT_SIZE = 2048;\n\t\tconst int DEFAULT_OVERLAP = 256;\n\t\tconst int DEFAULT_MAXSKIP = 512;\n\t\tconst double DEFAULT_RATE = 1.0;\n\n\t\t#endregion\n\t\t#region フィールド\n\n\t\t#region 内部クラス（オーバーラップ用の一時バッファ）\n\n\t\tstruct OverlapBuffer\n\t\t{\n\t\t\tshort[] buffer;\n\t\t\tint write; // 書き込み位置\n\t\t\tint read;  // 読み込み位置\n\n\t\t\tpublic OverlapBuffer(int size, int write)\n\t\t\t{\n\t\t\t\tthis.buffer = new short[size];\n\t\t\t\tthis.write = write;\n\t\t\t\tthis.read = 0;\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// キューのサイズ設定。\n\t\t\t/// </summary>\n\t\t\t/// <param name=\"size\">サイズ</param>\n\t\t\t/// <param name=\"full\">バッファの初期状態（true: full, false: empty で開始）</param>\n\t\t\tpublic void SetSize(int size, int write)\n\t\t\t{\n\t\t\t\tthis.buffer = new short[size];\n\t\t\t\tthis.write = write;\n\t\t\t\tthis.read = 0;\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// 要素数を取得。\n\t\t\t/// </summary>\n\t\t\tpublic int Count\n\t\t\t{\n\t\t\t\tget{return this.buffer.Length;}\n\t\t\t}\n\n\t\t\tpublic short this[int i]\n\t\t\t{\n\t\t\t\tget{return this.buffer[i];}\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// 値を挿入。\n\t\t\t/// </summary>\n\t\t\t/// <param name=\"data\">値</param>\n\t\t\tpublic void Enqueue(short data)\n\t\t\t{\n\t\t\t\tthis.buffer[this.write] = data;\n\t\t\t\t++this.write;\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// 値を取り出し。\n\t\t\t/// </summary>\n\t\t\t/// <returns>値</returns>\n\t\t\tpublic short Dequeue()\n\t\t\t{\n\t\t\t\tshort data = this.buffer[this.read];\n\t\t\t\t++this.read;\n\n\t\t\t\tif(this.read == this.buffer.Length)\n\t\t\t\t{\n\t\t\t\t\tthis.write = this.read = 0;\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// 書き込みバッファが残っているかどうか。\n\t\t\t/// </summary>\n\t\t\t/// <returns>フルなら true</returns>\n\t\t\tpublic bool Full()\n\t\t\t{\n\t\t\t\treturn this.write == this.buffer.Length;\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// 読み出しデータが残っているかどうか。\n\t\t\t/// </summary>\n\t\t\t/// <returns>空っぽなら true</returns>\n\t\t\tpublic bool Empty()\n\t\t\t{\n\t\t\t\treturn this.write == this.read;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\n\t\t// パラメータ\n\t\tint size;\n\t\tint overlapSize;\n\t\tint frameSize;\n\t\tint maxSkip;\n\n\t\tint skip;\n/*\n・概要\n    フレーム 1                       フレーム 2\n  (1)    (2)    (3)                (1)    (2)    (3)\n|----|--------|----|-- ....... --|----|--------|----|-- ....\n\nフレーム k の(3)とフレーム k+1 の(1) をクロスフェードさせて、2つのフレームを繋ぐ。\nただし、オーバーラップ時に音が変にならないように、\n\nk(3) と K+1(1) の相関値が高くなるようにフレームの先頭何サンプルかを読み飛ばす。\n（相関値によって決めた読み飛ばしサンプル数は変数 skip に保存しておく。）\n\n便宜上、\n(1) を overlap(前)\n(2) を non overlap\n(3) を overlap(後)\nと呼ぶ。\n\n・上記のパラメータの意味\n  (1)    (2)    (3)                (1)    (2)    (3)\n|----|--------|----|-- ....... --|----|--------|----|\n<------------------------------->\n<------------>      ↑\n<--->   ↑       frameSize\n  ↑   size\noverlapSize\n\nframeSize = rate * size\n長さ frameSize のデータが長さ size に伸縮する。\n→ 再生時間が 1/rate 倍に。\n */\n\n\t\t// 現在の状態\n\t\tint current;\n\t\t// オーバーラップ用の一時バッファ\n\t\tOverlapBuffer buffer;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\t/// <summary>\n\t\t/// デフォルト値で初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"input\">入力キュー</param>\n\t\t/// <param name=\"output\">出力キュー</param>\n\t\tpublic TimeStretcher(Queue input, Queue output)\n\t\t\t: this(input, output, DEFAULT_SIZE, DEFAULT_OVERLAP, DEFAULT_RATE)\n\t\t{\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パラメータの設定。\n\t\t/// </summary>\n\t\t/// <param name=\"input\">入力キュー</param>\n\t\t/// <param name=\"output\">出力キュー</param>\n\t\t/// <param name=\"size\">ブロックサイズ</param>\n\t\t/// <param name=\"overlap\">オーバーラップさせる部分の長さ</param>\n\t\t/// <param name=\"rate\">変換レート。再生時間が 1/rate 倍に。</param>\n\t\tpublic TimeStretcher(Queue input, Queue output, int size, int overlap, double rate)\n\t\t\t: this(input, output, size, overlap, rate, DEFAULT_MAXSKIP)\n\t\t{\n\t\t}\n\n\t\tpublic TimeStretcher(Queue input, Queue output, int size, int overlap, double rate, int maxSkip)\n\t\t\t: base(input, output)\n\t\t{\n\t\t\tthis.SetParameter(size, overlap, rate, maxSkip);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パラメータの設定。\n\t\t/// </summary>\n\t\t/// <param name=\"size\">ブロックサイズ</param>\n\t\t/// <param name=\"overlap\">オーバーラップさせる部分の長さ</param>\n\t\t/// <param name=\"rate\">変換レート。再生時間が 1/rate 倍に。</param>\n\t\tpublic void SetParameter(int size, int overlap, double rate, int maxSkip)\n\t\t{\n\t\t\tthis.size = size;\n\t\t\tthis.overlapSize = overlap;\n\t\t\tthis.frameSize = (int)(size * rate);\n\t\t\tthis.maxSkip = maxSkip;\n\n\t\t\tthis.last = this.size < this.frameSize ?\n\t\t\t\tthis.frameSize + this.maxSkip :\n\t\t\t\tthis.size + this.overlapSize + this.maxSkip;\n\n\t\t\tthis.buffer = new OverlapBuffer(overlap, overlap);\n\t\t\tthis.current = 0;\n\t\t\tthis.skip = 0;\n\t\t}\n\n\t\t#endregion\n\t\t#region 処理\n\n\t\tint maxCorrelation;\n\t\tint skipNext;\n\t\tint last;\n\n\t\tint Correlation(int pos, int len)\n\t\t{\n\t\t\tlong corr = 0;\n\t\t\tfor(int i=0, j=pos; i<len; ++i, ++j)\n\t\t\t{\n\t\t\t\tshort x = this.buffer[i];\n\t\t\t\tshort y = this.input[j];\n\n\t\t\t\tcorr += x * y;\n\t\t\t}\n\t\t\treturn SoundLibrary.BitOperation.RoundShift(corr, 16);\n#if false\n\t\t\tlong corr = 0;\n\t\t\tlong xabs = 0; long yabs = 0;\n\n// 厳密に相関値を計算（計算量大）。\n// Corr = E[xy]^2 / E[x^2]E[y^2]\n// ここまでする必要はなさげ。\n\n\t\t\tfor(int i=0, j=pos; i<len; ++i, ++j)\n\t\t\t{\n\t\t\t\tshort x = this.buffer[i];\n\t\t\t\tshort y = this.input[j];\n\n\t\t\t\tcorr += x * y;\n\t\t\t\txabs += x * x;\n\t\t\t\tyabs += y * y;\n\t\t\t}\n\t\t\tif(xabs == 0 || yabs == 0)\n\t\t\t{\n\t\t\t\tcorr = int.MaxValue;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfloat temp = xabs;\n\t\t\t\ttemp *= yabs;\n\t\t\t\ttemp = (float)Math.Sqrt(temp);\n\t\t\t\ttemp = corr / temp;\n\t\t\t\tcorr = (long)(int.MaxValue * temp);\n\t\t\t}\n\t\t\treturn (int)corr;\n#endif\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 現在位置(current)を更新する。\n\t\t/// ついでに、ピッチ予測とかの処理も行う。\n\t\t/// </summary>\n\t\tvoid MoveNext()\n\t\t{\n\t\t\tint len = this.buffer.Count;\n\n\t\t\tint start, offset;\n\t\t\tif(this.size < this.frameSize)\n\t\t\t{\n\t\t\t\tstart = this.frameSize;\n\t\t\t\toffset = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstart = this.size + this.overlapSize;\n\t\t\t\toffset = this.frameSize - this.size;\n\t\t\t}\n\n\t\t\tif(this.current >= start &&\n\t\t\t\tthis.current < start + this.maxSkip)\n\t\t\t{\n\t\t\t\tint corr = this.Correlation(this.current +offset, len);\n\n\t\t\t\tif(this.maxCorrelation < corr)\n\t\t\t\t{\n\t\t\t\t\tthis.maxCorrelation = corr;\n\t\t\t\t\tthis.skipNext = this.current + offset;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++this.current;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 現在位置をリセットする(current を 0 に)。\n\t\t/// ついでに、スキップ量を更新。\n\t\t/// </summary>\n\t\tvoid Reset()\n\t\t{\n\t\t\tthis.skip = this.skipNext == 0 ? 0 : this.skipNext - this.frameSize;\n\n\t\t\tthis.maxCorrelation = int.MinValue;\n\t\t\tthis.skipNext = 0;\n\t\t\tthis.current = 0;\n\t\t}\n\n\t\tpublic override void Process()\n\t\t{\n\t\t\t// overlap(前)\n\t\t\twhile(\n\t\t\t\tthis.current < this.overlapSize &&\n\t\t\t\tthis.input.Count > this.current + this.overlapSize + this.skip)\n\t\t\t{\n\t\t\t\tSystem.Diagnostics.Debug.Assert(!this.buffer.Empty());\n\n\t\t\t\tshort temp1 = this.buffer.Dequeue();\n\t\t\t\tshort temp2 = this.input[this.current + this.skip];\n\t\t\t\tshort data = Interpolate(temp1, temp2, this.current, this.overlapSize);\n\t\t\t\tthis.output.Enqueue(data);\n\n\t\t\t\tthis.MoveNext();\n\t\t\t}\n\n\t\t\t// non overlap\n\t\t\twhile(\n\t\t\t\tthis.current >= this.overlapSize &&\n\t\t\t\tthis.current < this.size &&\n\t\t\t\tthis.input.Count > this.current + this.overlapSize + this.skip)\n\t\t\t{\n\t\t\t\tshort data = this.input[this.current + this.skip];\n\t\t\t\tthis.output.Enqueue(data);\n\n\t\t\t\tthis.MoveNext();\n\t\t\t}\n\n\t\t\t// overlap(後)\n\t\t\twhile(\n\t\t\t\tthis.current >= this.size &&\n\t\t\t\tthis.current < this.size + this.overlapSize &&\n\t\t\t\tthis.input.Count > this.current + this.overlapSize + this.skip)\n\t\t\t{\n\t\t\t\tshort data = this.input[this.current + this.skip];\n\t\t\t\tthis.buffer.Enqueue(data);\n\n\t\t\t\tthis.MoveNext();\n\t\t\t}\n\n\t\t\t// 次フレームの開始地点まで読み飛ばし。\n\t\t\twhile(\n\t\t\t\tthis.current >= this.size + this.overlapSize &&\n\t\t\t\tthis.current < this.last &&\n\t\t\t\tthis.input.Count > this.current + this.overlapSize + this.skip)\n\t\t\t{\n\t\t\t\tthis.MoveNext();\n\t\t\t}\n\n\t\t\t// 次のフレームに移行\n\t\t\tif(this.current == this.last)\n\t\t\t{\n\t\t\t\tif(this.input.Count >= this.frameSize)\n\t\t\t\t{\n\t\t\t\t\tthis.input.Dequeue(this.frameSize);\n\t\t\t\t\tthis.Reset();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フレームのスキップ数を求める。\n\t\t/// 前フレームの overlap(後) と現フレームの overlap(前) の相互相関値が高くなるように、\n\t\t/// フレームの最初数サンプルをスキップする。\n\t\t/// </summary>\n\t\t/// <remarks>\n\t\t/// スキップ数を決定するために、何サンプルか後ろのデータを参照するため、\n\t\t/// 入力キューにある程度データがたまらないとスキップ数を決定できない。\n\t\t/// スキップ数を決定できない間は false を返す。\n\t\t/// </remarks>\n\t\t/// <returns>スキップ数を決定できた場合 true を返す</returns>\n\t\tbool SeekSkipSize()\n\t\t{\n\t\t\tif(this.input.Count < this.maxSkip + this.buffer.Count)\n\t\t\t\treturn false;\n\n\t\t\tlong corrMax = long.MinValue;\n\t\t\tthis.skip = 0;\n\n\t\t\tfor(int offset = 0; offset<this.maxSkip; ++offset)\n\t\t\t{\n\t\t\t\tlong corr = 0;\n\t\t\t\tfor(int i=0; i<this.buffer.Count; ++i)\n\t\t\t\t\tcorr += this.input[i + offset] * this.buffer[i];\n\n\t\t\t\tif(corr > corrMax)\n\t\t\t\t{\n\t\t\t\t\tcorrMax = corr;\n\t\t\t\t\tthis.skip = offset;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部関数\n\n\t\t/// <summary>\n\t\t/// a と b の信号をクロスフェードさせながら混ぜる。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">信号 a</param>\n\t\t/// <param name=\"b\">信号 b</param>\n\t\t/// <param name=\"fade\">混ぜる比率</param>\n\t\t/// <param name=\"overlap\">混ぜる区間の長さ</param>\n\t\tstatic short Interpolate(short a, short b, int fade, int overlap)\n\t\t{\n\t\t\tint val = (overlap - fade) * a + fade * b;\n\t\t\tval /= overlap;\n\t\t\treturn (short)val;\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Pipe/Pipe.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Pipe\n{\n\t/// <summary>\n\t/// キューの間に入って処理を行うパイプ。\n\t/// </summary>\n\tpublic abstract class Pipe\n\t{\n\t\t#region フィールド\n\n\t\tprotected Queue input;\n\t\tprotected Queue output;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic Pipe(Queue input, Queue output)\n\t\t{\n\t\t\tthis.input = input;\n\t\t\tthis.output = output;\n\t\t}\n\n\t\t#endregion\n\t\t#region 処理\n\n\t\t/// <summary>\n\t\t/// input キューと output キューの間に挟む処理。\n\t\t/// デフォルトは素通し。\n\t\t/// </summary>\n\t\tpublic virtual void Process()\n\t\t{\n\t\t\twhile(!this.input.IsEmpty)\n\t\t\t{\n\t\t\t\tthis.output.Enqueue(input.Front);\n\t\t\t\tthis.input.Dequeue();\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// キューの間に処理なしで、とにかく input 内のデータをフラッシュする。\n\t\t/// </summary>\n\t\tpublic virtual void Flush()\n\t\t{\n\t\t\twhile(!this.input.IsEmpty)\n\t\t\t{\n\t\t\t\tthis.output.Enqueue(input.Front);\n\t\t\t\tthis.input.Dequeue();\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region プロパティ\n\n\t\t/// <summary>\n\t\t/// 入力キューの取得。\n\t\t/// </summary>\n\t\tpublic Queue InputQueue\n\t\t{\n\t\t\tset{this.input = value;}\n\t\t\tget{return this.input;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 出力キューの取得。\n\t\t/// </summary>\n\t\tpublic Queue OutputQueue\n\t\t{\n\t\t\tset{this.output = value;}\n\t\t\tget{return this.output;}\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Pipe/Queue.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Pipe\n{\n\t/// <summary>\n\t/// FIFO のバッファ。\n\t/// </summary>\n\tpublic class Queue\n\t{\n\t\t#region フィールド\n\n\t\tshort[] buffer;\n\t\tint mask;\n\t\tint bottom;\n\t\tint top;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\t/// <summary>\n\t\t/// 最大要素数 max のキューを作成。\n\t\t/// </summary>\n\t\t/// <param name=\"max\">最大要素数</param>\n\t\tpublic Queue(int max)\n\t\t{\n\t\t\tmax = SoundLibrary.BitOperation.CeilPower2(max);\n\n\t\t\tthis.buffer = new short[max];\n\t\t\tthis.mask = max - 1;\n\t\t\tthis.bottom = 0;\n\t\t\tthis.top = 0;\n\t\t}\n\n\t\t#endregion\n\t\t#region キューの操作\n\n\t\t/// <summary>\n\t\t/// キューが空かどうか。\n\t\t/// </summary>\n\t\t/// <returns>空のとき true</returns>\n\t\tpublic bool IsEmpty\n\t\t{\n\t\t\tget{ return this.bottom == this.top; }\n\t\t}\n\n\t\t/// <summary>\n\t\t/// キューの要素数を取得。\n\t\t/// </summary>\n\t\tpublic int Count\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.mask & (this.bottom - this.top);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// キューに値を入れる。\n\t\t/// </summary>\n\t\t/// <param name=\"val\">値</param>\n\t\tpublic void Enqueue(short val)\n\t\t{\n\t\t\tthis.buffer[this.bottom] = val;\n\t\t\tthis.bottom = this.mask & (this.bottom + 1);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// キューの先頭の要素を取り出す。\n\t\t/// （値は出力しない。\n\t\t///   STL の queue のように、Front で取り出してから Dequeue するように。）\n\t\t/// </summary>\n\t\tpublic void Dequeue()\n\t\t{\n\t\t\tthis.Dequeue(1);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// キューから n 要素取り出す。\n\t\t/// </summary>\n\t\tpublic void Dequeue(int n)\n\t\t{\n\t\t\tthis.top = this.mask & (this.top + n);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 先頭の要素を読み出す。\n\t\t/// </summary>\n\t\tpublic short Front\n\t\t{\n\t\t\tget{return this.buffer[this.top];}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 値の読み書き。\n\t\t/// </summary>\n\t\tpublic short this[int i]\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\ti = this.mask & (this.top + i);\n\t\t\t\treturn this.buffer[i];\n\t\t\t}\n\t\t\tset\n\t\t\t{\n\t\t\t\ti = this.mask & (this.top + i);\n\t\t\t\tthis.buffer[i] = value;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Pipe/Stereo/FilteredPipe.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.Filter;\n\nnamespace SoundLibrary.Pipe.Stereo\n{\n\t/// <summary>\n\t/// フィルタ処理を行うパイプ。\n\t/// </summary>\n\tpublic class FilteredPipe : Pipe\n\t{\n\t\t#region フィールド\n\n\t\tIFilter filterL;\n\t\tIFilter filterR;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic FilteredPipe(Queue input, Queue output, IFilter filter)\n\t\t\t: this(input, output, filter, (IFilter)filter.Clone())\n\t\t{\n\t\t}\n\n\t\tpublic FilteredPipe(Queue input, Queue output, IFilter filterL, IFilter filterR)\n\t\t\t: base(input, output)\n\t\t{\n\t\t\tthis.filterL = filterL;\n\t\t\tthis.filterR = filterR;\n\t\t}\n\n\t\t#endregion\n\t\t#region プロパティ\n\n\t\t/// <summary>\n\t\t/// L チャネルに掛けるフィルタ。\n\t\t/// </summary>\n\t\tpublic IFilter Left\n\t\t{\n\t\t\tget{return this.filterL;}\n\t\t\tset{this.filterL = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// R チャネルに掛けるフィルタ。\n\t\t/// </summary>\n\t\tpublic IFilter Right\n\t\t{\n\t\t\tget{return this.filterR;}\n\t\t\tset{this.filterR = value;}\n\t\t}\n\n\t\t#endregion\n\t\t#region 処理\n\n\t\tpublic override void Process()\n\t\t{\n\t\t\twhile(this.input.Count >= 2)\n\t\t\t{\n\t\t\t\tdouble l = this.filterL.GetValue(this.input.Front);\n\t\t\t\tthis.output.Enqueue(SoundLibrary.Util.ClipShort(l));\n\t\t\t\tthis.input.Dequeue();\n\n\t\t\t\tdouble r = this.filterR.GetValue(this.input.Front);\n\t\t\t\tthis.output.Enqueue(SoundLibrary.Util.ClipShort(r));\n\t\t\t\tthis.input.Dequeue();\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Pipe/Stereo/PitchShifter.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.Filter.Equalizer;\n\nnamespace SoundLibrary.Pipe.Stereo\n{\n\t/// <summary>\n\t/// ピッチシフトを行うクラス。\n\t/// 移調＋アンチエイリアス＋時間伸縮。\n\t/// </summary>\n\tpublic class PitchShifter : Pipe\n\t{\n\t\t#region フィールド\n\n\t\tTimeStretcher  ts; // 時間伸縮\n\t\tRateTransposer rt; // \n\t\tFilteredPipe   fp;\n\n\t\t// rate >= 1 のとき、時間伸縮→アンチエイリアス→移調。\n\t\t// rate <  1 のとき、移調→アンチエイリアス→時間伸縮。\n\t\tCascadePipe cp;\n\t\tPipe[] pipes;\n\n\t\tQueue temp1;\n\t\tQueue temp2;\n\n\t\tParametricEqualizer fl, fr;\n\t\tCoefficient[] cd, cap; // fl, fr の係数と、そのアナログプロトタイプ。\n\t\tParametricEqualizer.Parameter[] peq;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic PitchShifter(Queue input, Queue temp1, Queue temp2, Queue output, int size, int overlap, double rate)\n\t\t\t: this(input, temp1, temp2, output, size, overlap, rate, TimeStretcher.DEFAULT_MAXSKIP)\n\t\t{\n\t\t}\n\n\t\t/// <summary>\n\t\t/// \n\t\t/// </summary>\n\t\tpublic PitchShifter(Queue input, Queue temp1, Queue temp2, Queue output, int size, int overlap, double rate, int maxSkip)\n\t\t\t: base(input, output)\n\t\t{\n\t\t\tthis.cap = new EllipticFilterDesigner(8, 0.99, 0.05).GetAnalogPrototype();\n\t\t\tthis.cd= new Coefficient[this.cap.Length];\n\t\t\tfor(int i=0; i<this.cd.Length; ++i) this.cd[i] = new Coefficient();\n\t\t\tthis.peq = new ParametricEqualizer.Parameter[this.cap.Length];\n\t\t\tfor(int i=0; i<this.peq.Length; ++i) this.peq[i] = new ParametricEqualizer.Parameter();\n\t\t\tthis.pipes = new Pipe[3];\n\n\t\t\tthis.fl = new ParametricEqualizer(this.peq);\n\t\t\tthis.fr = new ParametricEqualizer(this.peq);\n\n\t\t\tthis.ts = new TimeStretcher(input, output, size, overlap, 1.0/rate, maxSkip);\n\t\t\tthis.rt = new RateTransposer(input, output, rate);\n\t\t\tthis.fp = new FilteredPipe(input, output, fl, fr);\n\t\t\tthis.temp1 = temp1;\n\t\t\tthis.temp2 = temp2;\n\n\t\t\tthis.SetRate(rate);\n\t\t\tthis.cp = new CascadePipe(this.pipes);\n\t\t}\n\n\t\tpublic void SetRate(double rate)\n\t\t{\n\t\t\tif(rate >=1)\n\t\t\t{\n\t\t\t\tpipes[0] = this.ts; this.ts.InputQueue = this.input; this.ts.OutputQueue = this.temp1;\n\t\t\t\tpipes[1] = this.fp; this.fp.InputQueue = this.temp1; this.fp.OutputQueue = this.temp2;\n\t\t\t\tpipes[2] = this.rt; this.rt.InputQueue = this.temp2; this.rt.OutputQueue = this.output;\n\t\t\t\tFilterDesigner.BilinearTransform(this.cap, this.cd, Math.PI / rate);\n\t\t\t\tFilterDesigner.ToPeqCoefficient(this.cd, this.peq);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpipes[0] = this.rt; this.rt.InputQueue = this.input; this.rt.OutputQueue = this.temp1;\n\t\t\t\tpipes[1] = this.fp; this.fp.InputQueue = this.temp1; this.fp.OutputQueue = this.temp2;\n\t\t\t\tpipes[2] = this.ts; this.ts.InputQueue = this.temp2; this.ts.OutputQueue = this.output;\n\t\t\t\tFilterDesigner.BilinearTransform(this.cap, this.cd, Math.PI * rate);\n\t\t\t\tFilterDesigner.ToPeqCoefficient(this.cd, this.peq);\n\t\t\t}\n\t\t\tthis.ts.SetRate(1.0/rate);\n\t\t\tthis.rt.Rate = rate;\n\n\t\t\tthis.fl.UpdateGain();\n\t\t\tthis.fr.UpdateGain();\n\t\t}\n\n\t\t#endregion\n\t\t#region 処理\n\n\t\tpublic override void Process()\n\t\t{\n\t\t\tthis.cp.Process();\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Pipe/Stereo/RateTransposer.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Pipe.Stereo\n{\n\t/// <summary>\n\t/// 移調を行うクラス。\n\t/// データの間を補完して、データ長を変えることで、音程を変更する。\n\t/// 再生時間も変わってしまう。\n\t/// </summary>\n\t/// <remarks>\n\t/// 線形補間によるアップサンプル/ダウンサンプルしているだけなので、\n\t/// 高音質を目指すなら、別途、アンチエイリアスフィルタをかける必要がある。\n\t/// </remarks>\n\tpublic class RateTransposer : Pipe\n\t{\n\t\t#region 定数\n\n\t\tconst double DEFAULT_RATE = 1.0;\n\n\t\t#endregion\n\t\t#region フィールド\n\n\t\t// パラメータ\n\t\tdouble rate; // 変換レート。音程が rate 、再生時間が 1/rate 倍に。\n\n\t\t// 現在の状態\n\t\tshort prevL; // 1音前のデータ(L)を一時的に保存しておく。\n\t\tshort prevR; // 1音前のデータ(R)を一時的に保存しておく。\n\t\tdouble delta; // Bresenham アルゴリズム（DDA）的な動作をするための状態変数。\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\t/// <summary>\n\t\t/// デフォルト値で初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"input\">入力キュー</param>\n\t\t/// <param name=\"output\">出力キュー</param>\n\t\tpublic RateTransposer(Queue input, Queue output)\n\t\t\t: this(input, output, DEFAULT_RATE)\n\t\t{\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パラメータの設定。\n\t\t/// </summary>\n\t\t/// <param name=\"input\">入力キュー</param>\n\t\t/// <param name=\"output\">出力キュー</param>\n\t\t/// <param name=\"rate\">変換レート。音程が rate 倍、再生時間が 1/rate 倍に。</param>\n\t\tpublic RateTransposer(Queue input, Queue output, double rate)\n\t\t\t: base(input, output)\n\t\t{\n\t\t\tthis.rate = rate;\n\t\t\tthis.delta = rate / 2;\n\t\t}\n\n\t\t#endregion\n\t\t#region パラメータ設定\n\n\t\t/// <summary>\n\t\t/// 変換レート。音程が rate 、再生時間が 1/rate 倍に。\n\t\t/// </summary>\n\t\tpublic double Rate\n\t\t{\n\t\t\tget{return this.rate;}\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.rate = value;\n\t\t\t\tthis.delta = value / 2;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 処理\n\n\t\tpublic override void Process()\n\t\t{\n\t\t\twhile(this.input.Count >= 2)\n\t\t\t{\n\t\t\t\tif(this.delta >= 0)\n\t\t\t\t{\n\t\t\t\t\tshort l = Interpolate(this.delta, this.input[0], this.prevL);\n\t\t\t\t\tthis.output.Enqueue(l);\n\n\t\t\t\t\tshort r = Interpolate(this.delta, this.input[1], this.prevR);\n\t\t\t\t\tthis.output.Enqueue(r);\n\n\t\t\t\t\tthis.delta -= this.rate;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis.prevL = this.input[0];\n\t\t\t\t\tthis.prevR = this.input[1];\n\t\t\t\t\tthis.input.Dequeue(2);\n\n\t\t\t\t\tthis.delta += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 補助関数(private)\n\n\t\t/// <summary>\n\t\t/// 線形補間関数。\n\t\t/// </summary>\n\t\t/// <param name=\"delta\">val1 と val2 を混ぜる割合（整数部分は無視される）</param>\n\t\t/// <param name=\"val1\">値1</param>\n\t\t/// <param name=\"val2\">値2</param>\n\t\t/// <returns></returns>\n\t\tstatic short Interpolate(double delta, short val1, short val2)\n\t\t{\n\t\t\tdelta -= (int)delta;\n\t\t\tdouble val = val1 + delta * (val2 - val1);\n\t\t\treturn (short)val;\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Pipe/Stereo/TimeStretcher.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Pipe.Stereo\n{\n\t/// <summary>\n\t/// 時間伸長・短縮処理を行うクラス。\n\t/// 一定間隔でデータを間引き・コピーすることで、\n\t/// 音程を変えることなく再生時間を伸長・短縮する。\n\t/// </summary>\n\t/// <remarks>\n\t/// モノラルと処理内容に大差ないんで、クラスを分ける必要ないのかも。\n\t/// </remarks>\n\tpublic class TimeStretcher : Pipe\n\t{\n\t\t#region 定数\n\n\t\tinternal const int DEFAULT_SIZE = 4096;\n\t\tinternal const int DEFAULT_OVERLAP = 512;\n\t\tinternal const int DEFAULT_MAXSKIP = 1024;\n\t\tinternal const double DEFAULT_RATE = 1.0;\n\n\t\t#endregion\n\t\t#region フィールド\n\n\t\t#region 内部クラス（オーバーラップ用の一時バッファ）\n\n\t\tstruct OverlapBuffer\n\t\t{\n\t\t\tshort[] buffer;\n\t\t\tint write; // 書き込み位置\n\t\t\tint read;  // 読み込み位置\n\n\t\t\tpublic OverlapBuffer(int size, int write)\n\t\t\t{\n\t\t\t\tthis.buffer = new short[size];\n\t\t\t\tthis.write = write;\n\t\t\t\tthis.read = 0;\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// キューのサイズ設定。\n\t\t\t/// </summary>\n\t\t\t/// <param name=\"size\">サイズ</param>\n\t\t\t/// <param name=\"full\">バッファの初期状態（true: full, false: empty で開始）</param>\n\t\t\tpublic void SetSize(int size, int write)\n\t\t\t{\n\t\t\t\tthis.buffer = new short[size];\n\t\t\t\tthis.write = write;\n\t\t\t\tthis.read = 0;\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// 要素数を取得。\n\t\t\t/// </summary>\n\t\t\tpublic int Count\n\t\t\t{\n\t\t\t\tget{return this.buffer.Length;}\n\t\t\t}\n\n\t\t\tpublic short this[int i]\n\t\t\t{\n\t\t\t\tget{return this.buffer[i];}\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// 値を挿入。\n\t\t\t/// </summary>\n\t\t\t/// <param name=\"data\">値</param>\n\t\t\tpublic void Enqueue(short data)\n\t\t\t{\n\t\t\t\tthis.buffer[this.write] = data;\n\t\t\t\t++this.write;\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// 値を取り出し。\n\t\t\t/// </summary>\n\t\t\t/// <returns>値</returns>\n\t\t\tpublic short Dequeue()\n\t\t\t{\n\t\t\t\tshort data = this.buffer[this.read];\n\t\t\t\t++this.read;\n\n\t\t\t\tif(this.read == this.buffer.Length)\n\t\t\t\t{\n\t\t\t\t\tthis.write = this.read = 0;\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// 書き込みバッファが残っているかどうか。\n\t\t\t/// </summary>\n\t\t\t/// <returns>フルなら true</returns>\n\t\t\tpublic bool Full()\n\t\t\t{\n\t\t\t\treturn this.write == this.buffer.Length;\n\t\t\t}\n\n\t\t\t/// <summary>\n\t\t\t/// 読み出しデータが残っているかどうか。\n\t\t\t/// </summary>\n\t\t\t/// <returns>空っぽなら true</returns>\n\t\t\tpublic bool Empty()\n\t\t\t{\n\t\t\t\treturn this.write == this.read;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\n\t\t// パラメータ\n\t\tint size;\n\t\tint overlapSize;\n\t\tint frameSize;\n\t\tint maxSkip;\n\n\t\tint skip;\n/*\n・概要\n    フレーム 1                       フレーム 2\n  (1)    (2)    (3)                (1)    (2)    (3)\n|----|--------|----|-- ....... --|----|--------|----|-- ....\n\nフレーム k の(3)とフレーム k+1 の(1) をクロスフェードさせて、2つのフレームを繋ぐ。\nただし、オーバーラップ時に音が変にならないように、\n\nk(3) と K+1(1) の相関値が高くなるようにフレームの先頭何サンプルかを読み飛ばす。\n（相関値によって決めた読み飛ばしサンプル数は変数 skip に保存しておく。）\n\n便宜上、\n(1) を overlap(前)\n(2) を non overlap\n(3) を overlap(後)\nと呼ぶ。\n\n・上記のパラメータの意味\n  (1)    (2)    (3)                (1)    (2)    (3)\n|----|--------|----|-- ....... --|----|--------|----|\n<------------------------------->\n<------------>      ↑\n<--->   ↑       frameSize\n  ↑   size\noverlapSize\n\nframeSize = rate * size\n長さ frameSize のデータが長さ size に伸縮する。\n→ 再生時間が 1/rate 倍に。\n */\n\n\t\t// 現在の状態\n\t\tint current; // 現在位置\n\t\tint last;    // 処理終端位置\n\n\t\t// オーバーラップ用の一時バッファ\n\t\tOverlapBuffer buffer;\n\n\t\t// スキップ位置決定用\n\t\tint maxCorrelation;\n\t\tint skipNext;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\t/// <summary>\n\t\t/// デフォルト値で初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"input\">入力キュー</param>\n\t\t/// <param name=\"output\">出力キュー</param>\n\t\tpublic TimeStretcher(Queue input, Queue output)\n\t\t\t: this(input, output, DEFAULT_SIZE, DEFAULT_OVERLAP, DEFAULT_RATE)\n\t\t{\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パラメータの設定。\n\t\t/// </summary>\n\t\t/// <param name=\"input\">入力キュー</param>\n\t\t/// <param name=\"output\">出力キュー</param>\n\t\t/// <param name=\"size\">ブロックサイズ</param>\n\t\t/// <param name=\"overlap\">オーバーラップさせる部分の長さ</param>\n\t\t/// <param name=\"rate\">変換レート。再生時間が 1/rate 倍に。</param>\n\t\tpublic TimeStretcher(Queue input, Queue output, int size, int overlap, double rate)\n\t\t\t: this(input, output, size, overlap, rate, DEFAULT_MAXSKIP)\n\t\t{\n\t\t}\n\n\t\tpublic TimeStretcher(Queue input, Queue output, int size, int overlap, double rate, int maxSkip)\n\t\t\t: base(input, output)\n\t\t{\n\t\t\tthis.SetParameter(size, overlap, rate, maxSkip);\n\t\t}\n\n\t\t#endregion\n\t\t#region パラメータ設定\n\n\t\t/// <summary>\n\t\t/// パラメータの設定。\n\t\t/// </summary>\n\t\t/// <param name=\"size\">ブロックサイズ</param>\n\t\t/// <param name=\"overlap\">オーバーラップさせる部分の長さ</param>\n\t\t/// <param name=\"rate\">変換レート。再生時間が 1/rate 倍に。</param>\n\t\tpublic void SetParameter(int size, int overlap, double rate, int maxSkip)\n\t\t{\n\t\t\t// ステレオなので、2音ずつ処理 → size 類を全部偶数に。\n\t\t\tthis.size = size & (~1);\n\t\t\tthis.overlapSize = overlap & (~1);\n\t\t\tthis.maxSkip = maxSkip & (~1);\n\n\t\t\tthis.frameSize = (int)(size * rate) & (~1);\n\t\t\tthis.last = this.size < this.frameSize ?\n\t\t\t\tthis.frameSize + this.maxSkip :\n\t\t\t\tthis.size + this.overlapSize + this.maxSkip;\n\n\t\t\tthis.buffer = new OverlapBuffer(overlap, overlap);\n\t\t\tthis.current = 0;\n\t\t\tthis.skip = 0;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 変換レート。音程が rate 、再生時間が 1/rate 倍に。\n\t\t/// </summary>\n\t\tpublic void SetRate(double rate)\n\t\t{\n\t\t\tthis.frameSize = (int)(this.size * rate) & (~1);\n\t\t\tthis.last = this.size < this.frameSize ?\n\t\t\t\tthis.frameSize + this.maxSkip :\n\t\t\t\tthis.size + this.overlapSize + this.maxSkip;\n\t\t}\n\n\t\t#endregion\n\t\t#region 処理\n\n\t\tint Correlation(int pos, int len)\n\t\t{\n\t\t\tlong corr = 0;\n\t\t\tfor(int i=0, j=pos; i<len; ++i, ++j)\n\t\t\t{\n\t\t\t\tshort x = this.buffer[i];\n\t\t\t\tshort y = this.input[j];\n\n\t\t\t\tcorr += x * y;\n\t\t\t}\n\t\t\treturn SoundLibrary.BitOperation.RoundShift(corr, 16);\n#if false\n\t\t\tlong corr = 0;\n\t\t\tlong xabs = 0; long yabs = 0;\n\n// 厳密に相関値を計算（計算量大）。\n// Corr = E[xy]^2 / E[x^2]E[y^2]\n// ここまでする必要はなさげ。\n\n\t\t\tfor(int i=0, j=pos; i<len; ++i, ++j)\n\t\t\t{\n\t\t\t\tshort x = this.buffer[i];\n\t\t\t\tshort y = this.input[j];\n\n\t\t\t\tcorr += x * y;\n\t\t\t\txabs += x * x;\n\t\t\t\tyabs += y * y;\n\t\t\t}\n\t\t\tif(xabs == 0 || yabs == 0)\n\t\t\t{\n\t\t\t\tcorr = int.MaxValue;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tfloat temp = xabs;\n\t\t\t\ttemp *= yabs;\n\t\t\t\ttemp = (float)Math.Sqrt(temp);\n\t\t\t\ttemp = corr / temp;\n\t\t\t\tcorr = (long)(int.MaxValue * temp);\n\t\t\t}\n\t\t\treturn (int)corr;\n#endif\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 現在位置(current)を更新する。\n\t\t/// ついでに、ピッチ予測とかの処理も行う。\n\t\t/// </summary>\n\t\tvoid MoveNext()\n\t\t{\n\t\t\tint len = this.buffer.Count;\n\n\t\t\tint start, offset;\n\t\t\tif(this.size < this.frameSize)\n\t\t\t{\n\t\t\t\tstart = this.frameSize;\n\t\t\t\toffset = 0;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstart = this.size + this.overlapSize;\n\t\t\t\toffset = this.frameSize - this.size;\n\t\t\t}\n\n\t\t\tif(this.current >= start &&\n\t\t\t\tthis.current < start + this.maxSkip &&\n\t\t\t\t(this.current & 1) == 0) // ステレオなので、偶数のときのみスキップサイズを決定。\n\t\t\t{\n\t\t\t\tint corr = this.Correlation(this.current +offset, len);\n\n\t\t\t\tif(this.maxCorrelation < corr)\n\t\t\t\t{\n\t\t\t\t\tthis.maxCorrelation = corr;\n\t\t\t\t\tthis.skipNext = this.current + offset;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++this.current;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 現在位置をリセットする(current を 0 に)。\n\t\t/// ついでに、スキップ量を更新。\n\t\t/// </summary>\n\t\tvoid Reset()\n\t\t{\n\t\t\tthis.skip = this.skipNext == 0 ? 0 : this.skipNext - this.frameSize;\n\n\t\t\tthis.maxCorrelation = int.MinValue;\n\t\t\tthis.skipNext = 0;\n\t\t\tthis.current = 0;\n\t\t}\n\n\t\tpublic override void Process()\n\t\t{\n\t\t\t// overlap(前)\n\t\t\twhile(\n\t\t\t\tthis.current < this.overlapSize &&\n\t\t\t\tthis.input.Count > this.current + this.overlapSize + this.skip)\n\t\t\t{\n\t\t\t\tSystem.Diagnostics.Debug.Assert(!this.buffer.Empty());\n\n\t\t\t\tshort temp1 = this.buffer.Dequeue();\n\t\t\t\tshort temp2 = this.input[this.current + this.skip];\n\t\t\t\tshort data = Interpolate(temp1, temp2, this.current, this.overlapSize);\n\t\t\t\tthis.output.Enqueue(data);\n\n\t\t\t\tthis.MoveNext();\n\t\t\t}\n\n\t\t\t// non overlap\n\t\t\twhile(\n\t\t\t\tthis.current >= this.overlapSize &&\n\t\t\t\tthis.current < this.size &&\n\t\t\t\tthis.input.Count > this.current + this.overlapSize + this.skip)\n\t\t\t{\n\t\t\t\tshort data = this.input[this.current + this.skip];\n\t\t\t\tthis.output.Enqueue(data);\n\n\t\t\t\tthis.MoveNext();\n\t\t\t}\n\n\t\t\t// overlap(後)\n\t\t\twhile(\n\t\t\t\tthis.current >= this.size &&\n\t\t\t\tthis.current < this.size + this.overlapSize &&\n\t\t\t\tthis.input.Count > this.current + this.overlapSize + this.skip)\n\t\t\t{\n\t\t\t\tshort data = this.input[this.current + this.skip];\n\t\t\t\tthis.buffer.Enqueue(data);\n\n\t\t\t\tthis.MoveNext();\n\t\t\t}\n\n\t\t\t// 次フレームの開始地点まで読み飛ばし。\n\t\t\twhile(\n\t\t\t\tthis.current >= this.size + this.overlapSize &&\n\t\t\t\tthis.current < this.last &&\n\t\t\t\tthis.input.Count > this.current + this.overlapSize + this.skip)\n\t\t\t{\n\t\t\t\tthis.MoveNext();\n\t\t\t}\n\n\t\t\t// 次のフレームに移行\n\t\t\tif(this.current == this.last)\n\t\t\t{\n\t\t\t\tif(this.input.Count >= this.frameSize)\n\t\t\t\t{\n\t\t\t\t\tthis.input.Dequeue(this.frameSize);\n\t\t\t\t\tthis.Reset();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t//! ↓もう使ってない。消さないと。\n\n\t\t/// <summary>\n\t\t/// フレームのスキップ数を求める。\n\t\t/// 前フレームの overlap(後) と現フレームの overlap(前) の相互相関値が高くなるように、\n\t\t/// フレームの最初数サンプルをスキップする。\n\t\t/// </summary>\n\t\t/// <remarks>\n\t\t/// スキップ数を決定するために、何サンプルか後ろのデータを参照するため、\n\t\t/// 入力キューにある程度データがたまらないとスキップ数を決定できない。\n\t\t/// スキップ数を決定できない間は false を返す。\n\t\t/// </remarks>\n\t\t/// <returns>スキップ数を決定できた場合 true を返す</returns>\n\t\tbool SeekSkipSize()\n\t\t{\n\t\t\tif(this.input.Count < this.maxSkip + this.buffer.Count)\n\t\t\t\treturn false;\n\n\t\t\tlong corrMax = long.MinValue;\n\t\t\tthis.skip = 0;\n\n\t\t\tfor(int offset = 0; offset<this.maxSkip; ++offset)\n\t\t\t{\n\t\t\t\tlong corr = 0;\n\t\t\t\tfor(int i=0; i<this.buffer.Count; ++i)\n\t\t\t\t\tcorr += this.input[i + offset] * this.buffer[i];\n\n\t\t\t\tif(corr > corrMax)\n\t\t\t\t{\n\t\t\t\t\tcorrMax = corr;\n\t\t\t\t\tthis.skip = offset;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部関数\n\n\t\t/// <summary>\n\t\t/// a と b の信号をクロスフェードさせながら混ぜる。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">信号 a</param>\n\t\t/// <param name=\"b\">信号 b</param>\n\t\t/// <param name=\"fade\">混ぜる比率</param>\n\t\t/// <param name=\"overlap\">混ぜる区間の長さ</param>\n\t\tstatic short Interpolate(short a, short b, int fade, int overlap)\n\t\t{\n\t\t\tint val = (overlap - fade) * a + fade * b;\n\t\t\tval /= overlap;\n\t\t\treturn (short)val;\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/SoundLibrary.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" DefaultTargets=\"Build\">\n  <PropertyGroup>\n    <ProjectType>Local</ProjectType>\n    <ProductVersion>7.10.3077</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{F3ED647C-1985-4020-B27C-2AA8F8F059F8}</ProjectGuid>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ApplicationIcon />\n    <AssemblyKeyContainerName />\n    <AssemblyName>SoundLibrary</AssemblyName>\n    <AssemblyOriginatorKeyFile />\n    <DefaultClientScript>JScript</DefaultClientScript>\n    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>\n    <DefaultTargetSchema>IE50</DefaultTargetSchema>\n    <DelaySign>false</DelaySign>\n    <OutputType>Library</OutputType>\n    <RootNamespace>SoundLibrary</RootNamespace>\n    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>\n    <StartupObject />\n    <FileUpgradeFlags>\n    </FileUpgradeFlags>\n    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>\n    <UpgradeBackupLocation>\n    </UpgradeBackupLocation>\n    <OldToolsVersion>0.0</OldToolsVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <OutputPath>..\\..\\bin\\Debug\\SoundLibrary\\</OutputPath>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <BaseAddress>285212672</BaseAddress>\n    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>\n    <ConfigurationOverrideFile />\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <DocumentationFile />\n    <DebugSymbols>true</DebugSymbols>\n    <FileAlignment>4096</FileAlignment>\n    <NoStdLib>false</NoStdLib>\n    <NoWarn />\n    <Optimize>false</Optimize>\n    <RegisterForComInterop>false</RegisterForComInterop>\n    <RemoveIntegerChecks>false</RemoveIntegerChecks>\n    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\n    <WarningLevel>4</WarningLevel>\n    <DebugType>full</DebugType>\n    <ErrorReport>prompt</ErrorReport>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <OutputPath>..\\..\\bin\\Release\\SoundLibrary\\</OutputPath>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <BaseAddress>285212672</BaseAddress>\n    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>\n    <ConfigurationOverrideFile />\n    <DefineConstants>TRACE</DefineConstants>\n    <DocumentationFile />\n    <DebugSymbols>false</DebugSymbols>\n    <FileAlignment>4096</FileAlignment>\n    <NoStdLib>false</NoStdLib>\n    <NoWarn />\n    <Optimize>true</Optimize>\n    <RegisterForComInterop>false</RegisterForComInterop>\n    <RemoveIntegerChecks>false</RemoveIntegerChecks>\n    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\n    <WarningLevel>4</WarningLevel>\n    <DebugType>none</DebugType>\n    <ErrorReport>prompt</ErrorReport>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"fft\">\n      <Name>fft</Name>\n      <HintPath>fft\\fft.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\">\n      <Name>System</Name>\n    </Reference>\n    <Reference Include=\"System.Data\">\n      <Name>System.Data</Name>\n    </Reference>\n    <Reference Include=\"System.Windows.Forms\">\n      <Name>System.Windows.Forms</Name>\n    </Reference>\n    <Reference Include=\"System.Xml\">\n      <Name>System.XML</Name>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"BitOperation.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Command\\CommandParser.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Data\\DataGenerator.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Data\\FourierSeriesGenerator.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Data\\ImpulseGenerator.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Data\\MixedDataGenerator.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Data\\RampGenerator.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Data\\RandomGenerator.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Data\\SinusoidGenerator.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Data\\StepGenerator.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Data\\TspGenerator.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Data\\WhiteNoiseGenerator.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"FilterGenerator\\BandPassFir.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"FilterGenerator\\Basic.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"FilterGenerator\\Comb.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"FilterGenerator\\Common.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"FilterGenerator\\Connector.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"FilterGenerator\\Equalizer.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"FilterGenerator\\Fir.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"FilterGenerator\\Iir.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"FilterGenerator\\Mixer.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\BandPass\\BandPassFir.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\CircularBuffer.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Connector.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Delay\\Delay.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Delay\\FractionalDelay.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Delay\\IDelay.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Equalizer\\ButterworthFilterDesigner.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Equalizer\\ChebyshevFilterDesigner.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Equalizer\\EllipticFilterDesigner.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Equalizer\\FilterDesigner.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Equalizer\\ParametricEqualizer.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Equalizer\\Type.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Filter.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Fir.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\FractionalCombFilter.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Iir.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Misc\\AllPassFilter.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Misc\\Amplifier.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Misc\\CombFilter.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Misc\\Equalizer.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Misc\\MultiDelay.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Filter\\Mixer.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Array.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Complex.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\ComplexMath.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Constant.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Continuous\\Function.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Continuous\\Range.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Discrete\\CircularConvolution.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Discrete\\CircularCorrelation.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Discrete\\Convolution.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Discrete\\Correlation.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Discrete\\Differential.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Discrete\\Function.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Elliptic.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Expression\\Polynomial.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Expression\\Rational.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Algorithm.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Binary.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\CachedFunction.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\ComplexVariable.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Constant.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Elementary\\Exp.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Elementary\\GeneralPolynomial.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Elementary\\Polynomial.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Fraction.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Function.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Imaginary.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Multiple.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Product.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Series.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Sum.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Unary.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\Variable.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Function\\VariableTable.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Misc.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\Statistics.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\ThreeDimension\\AffineMatrix.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\ThreeDimension\\Matrix.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\ThreeDimension\\Quaternion.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Mathematics\\ThreeDimension\\Vector.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Misc\\Trace.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Music\\Amplifier.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Music\\CompoundSound.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Music\\Envelope.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Music\\HarmonicTone.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Music\\PeriodicSound.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Music\\PureTone.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Music\\Sound.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Music\\SoundFromData.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Music\\SoundWithFilter.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Music\\Temperament.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Music\\Tremolo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Music\\Vibrato.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Pipe\\CascadePipe.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Pipe\\Monaural\\FilteredPipe.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Pipe\\Monaural\\RateTransposer.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Pipe\\Monaural\\TimeStretcher.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Pipe\\Pipe.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Pipe\\Queue.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Pipe\\Stereo\\FilteredPipe.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Pipe\\Stereo\\PitchShifter.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Pipe\\Stereo\\RateTransposer.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Pipe\\Stereo\\TimeStretcher.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"SpectrumAnalysis\\Fft.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"SpectrumAnalysis\\Spectrum.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Stream\\Monaural\\FilteredStream.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Stream\\Monaural\\RateTransposer.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Stream\\Monaural\\TimeStretcher.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Stream\\Monaural\\WaveStream.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Stream\\Stream.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Util.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"WaveAnalysis\\DataList.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"WaveAnalysis\\WaveAnalyzer.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"WaveAnalysis\\WaveData.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"WaveAnalysis\\WaveFrequency.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"WaveAnalysis\\WaveMonaural.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"WaveAnalysis\\WaveMS.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"WaveAnalysis\\WaveTime.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Wave\\FilterAdapter.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Wave\\Util.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Wave\\Wave.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Wave\\WaveReader.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Wave\\WaveWriter.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PreBuildEvent />\n    <PostBuildEvent />\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "Chapters/Old/SoundLibrary/SpectrumAnalysis/Fft.cs",
    "content": "﻿#define CHECK_LENGTH\n\nusing System;\nusing System.Diagnostics;\nusing FftCpp  = Fft.Fft;\nusing CFftCpp = Fft.CFft;\n\nnamespace SoundLibrary.SpectrumAnalysis\n{\n\t/// <summary>\n\t/// Managed C++ で作った Fft クラスのラッパー。\n\t/// FFT の動作の詳細は fft\\fft.cpp の方を参照。\n\t/// </summary>\n\tpublic class Fft\n\t{\n\t\tFftCpp fft;\n\n\t\tpublic Fft(int length)\n\t\t{\n\t\t\tCheckLength(length);\n\n\t\t\tfft = new FftCpp(length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フーリエ変換を行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">変換したいデータ</param>\n\t\tunsafe public void Transform(double[] x)\n\t\t{\n\t\t\tfixed(double* px = x)\n\t\t\t{\n\t\t\t\tfft.Transform(1, px);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 逆フーリエ変換を行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">変換したいデータ</param>\n\t\tunsafe public void Invert(double[] x)\n\t\t{\n\t\t\tfixed(double* px = x)\n\t\t\t{\n\t\t\t\tfft.Transform(-1, px);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// len が2のべき乗かどうか調べ、違ったら例外を投げる。\n\t\t/// </summary>\n\t\t/// <param name=\"len\">調べる長さ</param>\n\t\t[Conditional(\"CHECK_LENGTH\")]\n\t\tpublic static void CheckLength(int len)\n\t\t{\n\t\t\tif(!IsPower2(len))\n\t\t\t\tthrow new ArgumentException(\"引数に2のべき乗以外を指定しちゃ駄目\");\n\t\t}\n\n\t\t/// <summary>\n\t\t/// len が2のべき乗かどうか調べる。\n\t\t/// </summary>\n\t\t/// <param name=\"len\">調べる長さ</param>\n\t\t/// <returns>2のべき乗ならtrue</returns>\n\t\tstatic bool IsPower2(int len)\n\t\t{\n\t\t\tif(len < 0)\n\t\t\t\treturn false;\n\n\t\t\twhile(len != 0)\n\t\t\t{\n\t\t\t\tif(len%2 != 0)\n\t\t\t\t\treturn len/2 == 0;\n\t\t\t\tlen /= 2;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}//class Fft\n\n\t/// <summary>\n\t/// Managed C++ で作った Fft クラスのラッパー。\n\t/// FFT の動作の詳細は fft\\fft.cpp の方を参照。\n\t/// </summary>\n\tpublic class CFft\n\t{\n\t\tCFftCpp fft;\n\n\t\tpublic CFft(int length)\n\t\t{\n\t\t\tFft.CheckLength(length);\n\n\t\t\tfft = new CFftCpp(length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フーリエ変換を行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">変換したいデータ</param>\n\t\tunsafe public void Transform(double[] x)\n\t\t{\n\t\t\tfixed(double* px = x)\n\t\t\t{\n\t\t\t\tfft.Transform(1, px);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 逆フーリエ変換を行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">変換したいデータ</param>\n\t\tunsafe public void Invert(double[] x)\n\t\t{\n\t\t\tfixed(double* px = x)\n\t\t\t{\n\t\t\t\tfft.Transform(-1, px);\n\t\t\t}\n\t\t}\n\t}//class CFft\n}//namespace Spectrum\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/SpectrumAnalysis/Spectrum.cs",
    "content": "﻿using System;\nusing SoundLibrary.Mathematics;\n\nnamespace SoundLibrary.SpectrumAnalysis\n{\n\t/// <summary>\n\t/// 周波数特性クラス。\n\t/// </summary>\n\tpublic class Spectrum : ICloneable\n\t{\n\t\tdouble[] x; // データ格納領域\n\t\tFft fft;\n\n\t\t#region コンストラクタ・構築用メソッド\n\n\t\t/// <summary>\n\t\t/// デフォルトコンストラクタ\n\t\t/// </summary>\n\t\tpublic Spectrum() : this(null){}\n\n\t\t/// <summary>\n\t\t/// 時系列長のみを指定して構築。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">時系列長</param>\n\t\tpublic Spectrum(int length) : this(new double[length]){}\n\n\t\t/// <summary>\n\t\t/// 周波数領域データ(時系列データを Fft クラスで変換したもの)から作成。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">周波数領域データ</param>\n\t\tpublic Spectrum(double[] x)\n\t\t{\n\t\t\tthis.x = x;\n\t\t\tthis.fft = new Fft(x.Length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 時間領域データから作成。\n\t\t/// </summary>\n\t\t/// <param name=\"X\">時間領域データ</param>\n\t\t/// <returns>作成された周波数特性</returns>\n\t\tpublic static Spectrum FromTimeSequence(double[] x)\n\t\t{\n\t\t\tif(x == null) return null;\n\t\t\treturn FromTimeSequence(x, x.Length, 0);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 時間領域データから作成。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">時間領域データ</param>\n\t\t/// <param name=\"length\">データの長さ</param>\n\t\t/// <returns>作成された周波数特性</returns>\n\t\tpublic static Spectrum FromTimeSequence(double[] x, int length)\n\t\t{\n\t\t\treturn FromTimeSequence(x, length, 0);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 時間領域データから作成。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">時間領域データ</param>\n\t\t/// <param name=\"length\">データの長さ</param>\n\t\t/// <param name=\"skip\">読み飛ばす長さ</param>\n\t\t/// <returns>作成された周波数特性</returns>\n\t\tpublic static Spectrum FromTimeSequence(double[] x, int length, int skip)\n\t\t{\n\t\t\tif(x == null) return null;\n\n\t\t\tint len = BitOperation.FloorPower2(length);\n\n\t\t\tdouble[] tmp = new double[len];\n\t\t\tfor(int i=0; i<len; ++i) tmp[i] = x[skip + i];\n\t\t\tFft fft = new Fft(len);\n\t\t\tfft.Transform(tmp);\n\t\t\treturn new Spectrum(tmp);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 遅延 δ[i - delay] の周波数特性を作成する。\n\t\t/// </summary>\n\t\t/// <param name=\"delay\">遅延サンプル数</param>\n\t\t/// <returns>作成された周波数特性</returns>\n\t\tpublic static Spectrum FromDelay(double delay, int length)\n\t\t{\n\t\t\tSpectrum s = new Spectrum(length);\n\t\t\tlength /= 2;\n\t\t\ts.x[0] = 1;\n\t\t\ts.x[1] = Math.Cos(-Math.PI * delay);\n\t\t\tdouble dt = -Math.PI * delay / length;\n\t\t\tdouble t = dt;\n\t\t\tfor(int i=1; i<length; ++i, t += dt)\n\t\t\t{\n\t\t\t\ts[i] = Complex.FromArg(t);\n\t\t\t}\n\n\t\t\treturn s;\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の取得・設定\n\n\t\t/// <summary>\n\t\t/// 周波数領域のデータ数。\n\t\t/// </summary>\n\t\tpublic int Count\n\t\t{\n\t\t\tget{return x.Length/2;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// i 番目のデータを複素数値で返す。\n\t\t/// </summary>\n\t\tpublic Complex this[int i]\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tif(i == 0) this.x[0] = value.Re;\n\t\t\t\telse if(i == x.Length/2) this.x[1] = value.Re;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis.x[2*i]   = value.Re;\n\t\t\t\t\tthis.x[2*i+1] = -value.Im;\n\t\t\t\t}\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\tif(i == 0) return this.x[0];\n\t\t\t\telse if(i == x.Length/2) return this.x[1];\n\t\t\t\treturn new Complex(this.x[2*i], -this.x[2*i+1]);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 時系列を返す。\n\t\t/// </summary>\n\t\tpublic double[] TimeSequence\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tdouble[] x = (double[])this.x.Clone();\n\t\t\t\tthis.fft.Invert(x);\n\t\t\t\tfor(int i=0; i<x.Length; ++i) x[i] *= 2.0/x.Length;\n\t\t\t\treturn x;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 時系列を返す。\n\t\t/// あらかじめ時系列データの格納先を用意しておく。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">データ格納先</param>\n\t\tpublic void GetTimeSequence(double[] x)\n\t\t{\n\t\t\tdouble a = 2.0/x.Length;\n\t\t\tfor(int i=0; i<x.Length; ++i) x[i] = a * this.x[i];\n\t\t\tthis.fft.Invert(x);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 時間領域のデータ数。\n\t\t/// </summary>\n\t\tpublic int TimeLength\n\t\t{\n\t\t\tget{return x.Length;}\n\t\t}\n\n\t\t#endregion\n\t\t#region 演算子・変換メソッド\n\n\t\t/// <summary>\n\t\t/// 単項＋。元のままの値を返す。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド</param>\n\t\t/// <returns>+a</returns>\n\t\tpublic static Spectrum operator+ (Spectrum a)\n\t\t{\n\t\t\treturn a.Clone();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 単項－。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド</param>\n\t\t/// <returns>-a</returns>\n\t\tpublic static Spectrum operator- (Spectrum a)\n\t\t{\n\t\t\tSpectrum c = a.Clone();\n\t\t\tfor(int i=0; i<=c.Count; ++i)\n\t\t\t\tc[i] = -a[i];\n\t\t\treturn c;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// スペクトル同士の和 A(ω) + B(ω)。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>和</returns>\n\t\tpublic static Spectrum operator+ (Spectrum a, Spectrum b)\n\t\t{\n\t\t\tSpectrum c = a.Clone();\n\t\t\tfor(int i=0; i<=c.Count; ++i)\n\t\t\t\tc[i] += b[i];\n\t\t\treturn c;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// スペクトル同士の差 A(ω) - B(ω)。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>差</returns>\n\t\tpublic static Spectrum operator- (Spectrum a, Spectrum b)\n\t\t{\n\t\t\tSpectrum c = a.Clone();\n\t\t\tfor(int i=0; i<=c.Count; ++i)\n\t\t\t\tc[i] -= b[i];\n\t\t\treturn c;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// スペクトル同士の積 A(ω) * B(ω)。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>積</returns>\n\t\tpublic static Spectrum operator* (Spectrum a, Spectrum b)\n\t\t{\n\t\t\tSpectrum c = a.Clone();\n\t\t\tfor(int i=0; i<=c.Count; ++i)\n\t\t\t\tc[i] *= b[i];\n\t\t\treturn c;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// スペクトル×実数の積 A(ω) * x。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"x\">右オペランド</param>\n\t\t/// <returns>積</returns>\n\t\tpublic static Spectrum operator* (Spectrum a, double x)\n\t\t{\n\t\t\tSpectrum c = a.Clone();\n\t\t\tfor(int i=0; i<=c.Count; ++i)\n\t\t\t\tc[i] *= x;\n\t\t\treturn c;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// スペクトル×実数の積 x * A(ω)。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">左オペランド</param>\n\t\t/// <param name=\"a\">右オペランド</param>\n\t\t/// <returns>積</returns>\n\t\tpublic static Spectrum operator* (double x, Spectrum a)\n\t\t{\n\t\t\treturn a * x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// スペクトル同士の商 A(ω) / B(ω)。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>商</returns>\n\t\tpublic static Spectrum operator/ (Spectrum a, Spectrum b)\n\t\t{\n\t\t\tSpectrum c = a.Clone();\n\t\t\tfor(int i=0; i<=c.Count; ++i)\n\t\t\t\tc[i] /= b[i];\n\t\t\treturn c;\n\t\t}\n\n\t\tpublic Spectrum Invert()\n\t\t{\n\t\t\tSpectrum c = this.Clone();\n\t\t\tfor(int i=0; i<=c.Count; ++i)\n\t\t\t\tc[i] = this[i].Invert();\n\t\t\treturn c;\n\t\t}\n\n\t\t#endregion\n\t\t#region 実部・虚部\n\n\t\t/// <summary>\n\t\t/// 実部を配列化して取得。\n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic double[] GetRe()\n\t\t{\n\t\t\tdouble[] tmp = new double[this.x.Length / 2];\n\t\t\tfor(int i=0; i<tmp.Length; ++i) tmp[i] = this[i].Re;\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 虚部を配列化して取得。\n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic double[] GetIm()\n\t\t{\n\t\t\tdouble[] tmp = new double[this.x.Length / 2];\n\t\t\tfor(int i=0; i<tmp.Length; ++i) tmp[i] = this[i].Im;\n\t\t\treturn tmp;\n\t\t}\n\n\t\t#endregion\n\t\t#region 振幅特性\n\n\t\t/// <summary>\n\t\t/// パワースペクトル[dB]を取得。\n\t\t/// </summary>\n\t\tpublic double[] GetPower()\n\t\t{\n\t\t\tdouble[] tmp = new double[this.x.Length / 2];\n\t\t\tfor(int i=0; i<tmp.Length; ++i) tmp[i] = this[i].Power;\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 振幅特性を取得。\n\t\t/// </summary>\n\t\tpublic double[] GetAmplitude()\n\t\t{\n\t\t\tdouble[] tmp = new double[this.x.Length / 2];\n\t\t\tfor(int i=0; i<tmp.Length; ++i) tmp[i] = this[i].Abs;\n\t\t\treturn tmp;\n\t\t}\n\n\t\t#endregion\n\t\t#region 位相特性\n\n\t\t/// <summary>\n\t\t/// 位相特性を取得。\n\t\t/// </summary>\n\t\tpublic double[] GetPhase()\n\t\t{\n\t\t\tdouble[] tmp = new double[this.x.Length / 2];\n\t\t\ttmp[0] = 0;\n\t\t\tfor(int i=1; i<tmp.Length; ++i) tmp[i] = this[i].Arg;\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 位相特性(アンラップしたもの)を取得。\n\t\t/// </summary>\n\t\tpublic double[] GetUnwrapPhase()\n\t\t{\n\t\t\tdouble[] tmp = this.GetPhase();\n\t\t\tSpectrum.Unwrap(tmp);\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 位相特性(アンラップしたもの)を取得。\n\t\t/// </summary>\n\t\t/// <param name=\"skip\">最初 skip サンプルはアンラップしない</param>\n\t\tpublic double[] GetUnwrapPhase(int skip)\n\t\t{\n\t\t\tdouble[] tmp = this.GetPhase();\n\t\t\tSpectrum.Unwrap(tmp, skip);\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 位相のアンラッピングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"phase\">位相の入った配列</param>\n\t\tpublic static void Unwrap(double[] phase)\n\t\t{\n\t\t\tdouble tmp = 0;\n\t\t\tdouble prev = phase[0];\n\n\t\t\tfor(int i=1; i<phase.Length; ++i)\n\t\t\t{\n\t\t\t\tdouble dif = phase[i] - prev;\n\t\t\t\tprev = phase[i];\n\t\t\t\tif(dif < -Math.PI) tmp += 2 * Math.PI;\n\t\t\t\tif(dif >  Math.PI) tmp -= 2 * Math.PI;\n\t\t\t\tphase[i] += tmp;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 位相のアンラッピングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"phase\">位相の入った配列</param>\n\t\t/// <param name=\"start\">アンラッピングの開始地点</param>\n\t\tpublic static void Unwrap(double[] phase, int start)\n\t\t{\n\t\t\tdouble tmp = 0;\n\t\t\tdouble prev = phase[start];\n\n\t\t\tfor(int i=start+1; i<phase.Length; ++i)\n\t\t\t{\n\t\t\t\tdouble dif = phase[i] - prev;\n\t\t\t\tprev = phase[i];\n\t\t\t\tif(dif < -Math.PI) tmp += 2 * Math.PI;\n\t\t\t\tif(dif >  Math.PI) tmp -= 2 * Math.PI;\n\t\t\t\tphase[i] += tmp;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 最小位相・オールパス位相\n\n\t\t/// <summary>\n\t\t/// 最小位相を求める。\n\t\t/// </summary>\n\t\tpublic double[] GetMinimumPhase()\n\t\t{\n\t\t\tint N = this.x.Length / 2;\n\t\t\tdouble[] tmp = new double[2*N];\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\ttmp[2*i]         = Math.Log(this[i].LinearPower);\n\t\t\t\ttmp[2*i+1]       = 0;\n\t\t\t}\n\n\t\t\tCFft cfft = new CFft(2*N);\n\t\t\tcfft.Invert(tmp);\n\n\t\t\ttmp[0] /= 2; tmp[1] /= 2;\n\t\t\ttmp[N] /= 2; tmp[N+1] /= 2;\n\t\t\tfor(int i=N+1; i<2*N; ++i)\n\t\t\t\ttmp[i] = 0;\n\n\t\t\tcfft.Transform(tmp);\n\n\t\t\tdouble[] y = new double[N];\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\ty[i] = -tmp[2*i+1] / N;\n\t\t\t}\n\n\t\t\treturn y;\n\t\t}//GetMinimumPhase\n\n\t\t/// <summary>\n\t\t/// オールパス位相を求める。\n\t\t/// </summary>\n\t\tpublic double[] GetAllpassPhase()\n\t\t{\n\t\t\tdouble[] p  = GetPhase();\n\t\t\tSpectrum.Unwrap(p);\n\t\t\tdouble[] mp = GetMinimumPhase();\n\t\t\tint n = p.Length;\n\n\t\t\tfor(int i=0; i<n; ++i) p[i] -= mp[i];\n\n\t\t\treturn p;\n\t\t}//GetAllpassPhase\n\n\t\t#endregion\n\t\t#region 位相遅延・群遅延特性\n\n\t\t/// <summary>\n\t\t/// 位相遅延特性を取得。\n\t\t/// </summary>\n\t\tpublic static double[] GetPhaseDelay(double[] phase, double fs)\n\t\t{\n\t\t\tdouble df = fs / phase.Length;\n\t\t\tdouble dw = 2 * Math.PI * df;\n\t\t\tdouble[] tmp = new Double[phase.Length];\n\n\t\t\ttmp[0] = tmp[1] = -phase[1] / dw;\n\t\t\tfor(int i=2; i<tmp.Length; ++i) tmp[i] = -phase[i] / (dw * i);\n\t\t\treturn tmp;\n\t\t}\n\n\t\tpublic double[] GetPhaseDelay()\n\t\t{\n\t\t\tdouble[] phase = this.GetUnwrapPhase(this.Count / 100);\n\n\t\t\tdouble dw = 2 * Math.PI / phase.Length;\n\t\t\tdouble[] tmp = new Double[phase.Length];\n\n\t\t\ttmp[0] = tmp[1] = -phase[1] / dw;\n\t\t\tfor(int i=2; i<tmp.Length; ++i) tmp[i] = -phase[i] / (dw * i);\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 群遅延特性を取得。\n\t\t/// F(ω) = x + j y, θ=∠F,\n\t\t/// gd = -dθ/dω = -(d/dω)Im[log F] = -Im[(d/dω)log F]\n\t\t/// = -Im[F'/F] = -Im[(x'+jy') / (x+jy) = (x'y - xy') / (x*x + y*y)\n\t\t/// </summary>\n\t\tpublic double[] GetGroupDelay()\n\t\t{\n\t\t\tdouble[] re = this.GetRe();\n\t\t\tdouble[] im = this.GetIm();\n\t\t\tdouble[] dre = SoundLibrary.Mathematics.Discrete.Differential.Derive(re);\n\t\t\tdouble[] dim = SoundLibrary.Mathematics.Discrete.Differential.Derive(im);\n\t\t\tdouble[] tmp = new Double[re.Length];\n\t\t\tdouble c = tmp.Length / Math.PI;\n\n\t\t\tfor(int i=0; i<tmp.Length; ++i)\n\t\t\t{\n\t\t\t\tdouble d = re[i] * re[i] + im[i] * im[i];\n\t\t\t\ttmp[i] = im[i] * dre[i] - re[i] * dim[i];\n\t\t\t\ttmp[i] *= c / d;\n\t\t\t}\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 群遅延特性を取得。\n\t\t/// </summary>\n\t\t[System.Obsolete(\"GetGroupDelay の妥当性が確かめられ次第削除します\")]\n\t\tpublic double[] GetGroupDelay0()\n\t\t{\n\t\t\tdouble[] tmp = this.GetUnwrapPhase(this.Count / 100);\n\n\t\t\ttmp = SoundLibrary.Mathematics.Discrete.Differential.Derive(tmp);\n\t\t\tdouble c = tmp.Length / Math.PI;\n\n\t\t\tfor(int i=0; i<tmp.Length; ++i) tmp[i] *= -c;\n\t\t\treturn tmp;\n\t\t}\n\n\t\t#endregion\n\t\t#region 遅延関係、非推奨メソッド(Obsolete にするなり、削除するなりしたい)\n\n\t\t/// <summary>\n\t\t/// 平均ディレイ(＝オールパス位相の平均勾配×-1)を求める。\n\t\t/// </summary>\n\t\tpublic double GetMeanDelay()\n\t\t{\n\t\t\tdouble[] p = this.GetUnwrapPhase(this.Count / 100);\n\t\t\tdouble[] mp = GetMinimumPhase();\n\t\t\tint n = p.Length;\n\t\t\tdouble delay = 0;\n\n\t\t\tfor(int i=0; i<n; ++i) delay += p[i] - mp[i];\n\t\t\tdelay *= -2.0 / (n * (n - 1));\n\n\t\t\treturn delay;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 位相から平均ディレイを除いた部分を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"delay\">位相から平均ディレイを除いた部分</param>\n\t\tpublic double[] GetPhase0(double delay)\n\t\t{\n\t\t\tdouble[] p = this.GetUnwrapPhase(this.Count / 100);\n\t\t\tint n = p.Length;\n\n\t\t\tfor(int i=0; i<n; ++i) p[i] += delay * i;\n\n\t\t\treturn p;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 位相から平均ディレイを除いた部分を求める。\n\t\t/// </summary>\n\t\tpublic double[] GetPhase0()\n\t\t{\n\t\t\tdouble[] p = this.GetUnwrapPhase(this.Count / 100);\n\t\t\tdouble[] mp = GetMinimumPhase();\n\t\t\tint n = p.Length;\n\t\t\tdouble x = 0;\n\n\t\t\tfor(int i=0; i<n; ++i) x += p[i] - mp[i];\n\t\t\tx *= -2.0 / (n * n);\n\n\t\t\tfor(int i=0; i<n; ++i) p[i] += x * i;\n\n\t\t\treturn p;\n\t\t}\n\n\t\t#endregion\n\t\t#region 形式の変換\n\n\t\t/// <summary>\n\t\t/// 振幅特性の平均値が0dBになるように正規化\n\t\t/// </summary>\n\t\tpublic void Normalize()\n\t\t{\n\t\t\tdouble level = 0;\n\t\t\tfor(int i=0; i<this.Count; ++i) level += Math.Log(this[i].LinearPower);\n\t\t\tlevel /= 2 * this.Count;\n\t\t\tlevel = Math.Exp(-level);\n\t\t\tfor(int i=0; i<this.Count; ++i) this[i] *= level;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 最小位相化する。\n\t\t/// </summary>\n\t\tpublic void ConvertToMinimumPhase()\n\t\t{\n\t\t\tdouble[] amp = this.GetAmplitude();\n\t\t\tdouble[] phase = this.GetMinimumPhase();\n\t\t\tint len = this.Count;\n\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\tthis[i] = Complex.FromPolar(amp[i], phase[i]);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 最小位相化した周波数特性を生成する。\n\t\t/// </summary>\n\t\t/// <returns>最小位相化した周波数特性</returns>\n\t\tpublic Spectrum GetMinimumPahsedSpectrum()\n\t\t{\n\t\t\tSpectrum s = this.Clone();\n\t\t\ts.ConvertToMinimumPhase();\n\t\t\treturn s;\n\t\t}\n\n\t\t#endregion\n\t\t#region ICloneable メンバ\n\n\t\t/// <summary>\n\t\t/// インスタンスのコピーを作成。\n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic Spectrum Clone()\n\t\t{\n\t\t\treturn new Spectrum((double[])this.x.Clone());\n\t\t}\n\n\t\tobject System.ICloneable.Clone()\n\t\t{\n\t\t\treturn this.Clone();\n\t\t}\n\n\t\t#endregion\n\t\t#region static 関数\n\n\t\t/// <summary>\n\t\t/// x をヒルベルト変換する。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">変換元</param>\n\t\t/// <returns>変換後</returns>\n\t\tpublic static double[] HilbertTransform(double[] x)\n\t\t{\n\t\t\tint N = x.Length;\n\t\t\tdouble[] tmp = new double[2*N];\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\ttmp[2*i]         = x[i];\n\t\t\t\ttmp[2*i+1]       = 0;\n\t\t\t}\n\n\t\t\tCFft cfft = new CFft(2*N);\n\t\t\tcfft.Invert(tmp);\n\n\t\t\ttmp[0] /= 2; tmp[1] /= 2;\n\t\t\ttmp[N] /= 2; tmp[N+1] /= 2;\n\t\t\tfor(int i=N+1; i<2*N; ++i)\n\t\t\t\ttmp[i] = 0;\n\n\t\t\tcfft.Transform(tmp);\n\n\t\t\tdouble[] y = new double[x.Length];\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\tx[i] = tmp[2*i]   * 2 / N;\n\t\t\t\ty[i] = tmp[2*i+1] * 2 / N;\n\t\t\t}\n\n\t\t\treturn y;\n\t\t}//HilbertTransform\n\n\t\t/// <summary>\n\t\t/// データのスムージングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"data\"></param>\n\t\tpublic static void Smooth(double[] data)\n\t\t{\n\t\t\tdouble sum = data[0] + data[1] + data[2];\n\t\t\tdata[0] = sum / 3;\n\t\t\tsum += data[3];\n\t\t\tdata[1] = sum / 4;\n\t\t\tsum += data[4];\n\t\t\tdata[1] = sum / 5;\n\t\t\tint i=3;\n\t\t\tfor(; i<data.Length-2; ++i)\n\t\t\t{\n\t\t\t\tsum -= data[i-3];\n\t\t\t\tsum += data[i+2];\n\t\t\t\tdata[i] = sum / 5;\n\t\t\t}\n\t\t\tsum -= data[i-3];\n\t\t\tdata[i] = sum / 4;\n\t\t\t++i;\n\t\t\tsum -= data[i-3];\n\t\t\tdata[i] = sum / 3;\n\t\t}\n\n\t\t#endregion\n\t}//class Spectrum\n}//namespace SpectrumAnalysis\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/SpectrumAnalysis/readme.txt",
    "content": "//==============================================================================\n// g̓Cu\n\nCopyright(C) 2003 Iwanaga Nobuyuki\ne-mail   : iwanaga@ise.eng.osaka-u.ac.jp\nweb page : http://www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/\n\n//----------------------------------------------------------\n// Tv\n\nnf[^g̈ɕϊAUʑ߂郉CuB\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Stream/Monaural/FilteredStream.cs",
    "content": "﻿#define CHECK_RANGE\n\nusing System;\n\nusing SoundLibrary.Filter;\n\nnamespace SoundLibrary.Stream.Monaural\n{\n\t/// <summary>\n\t/// Stream にフィルタを掛ける。\n\t/// </summary>\n\tpublic class FilteredStream : Stream\n\t{\n\t\t#region フィールド\n\n\t\tStream stream; // inner stream\n\t\tIFilter filter;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\t/// <summary>\n\t\t/// stream に filter を掛ける。\n\t\t/// </summary>\n\t\t/// <param name=\"stream\">内部ストリーム</param>\n\t\t/// <param name=\"filter\">掛けたいフィルター</param>\n\t\tpublic FilteredStream(Stream stream, IFilter filter)\n\t\t{\n\t\t\tthis.stream = stream;\n\t\t\tthis.filter = filter;\n\t\t}\n\n\t\t#endregion\n\t\t#region Stream メンバ\n\n\t\tpublic override int FillBuffer(short[] buffer, int offset, int size)\n\t\t{\n\t\t\tsize = this.stream.FillBuffer(buffer, offset, size);\n\n\t\t\tfor(int i=0; i<size; ++i)\n\t\t\t{\n\t\t\t\tdouble val= this.filter.GetValue(buffer[i]);\n#if CHECK_RANGE\n\t\t\tif(val > short.MaxValue) val = short.MaxValue;\n\t\t\tif(val < short.MinValue) val = short.MinValue;\n#endif\n\t\t\t\tbuffer[i] = (short)val;\n\t\t\t}\n\n\t\t\treturn size;\n\t\t}\n\n\t\tpublic override bool Skip(int size)\n\t\t{\n\t\t\treturn this.stream.Skip(size);\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Stream/Monaural/RateTransposer.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Stream.Monaural\n{\n\t/// <summary>\n\t/// 移調ストリーム。\n\t/// 別のストリームから読み出した音を移調して出力する。\n\t/// 音程と再生速度の両方が変わる。\n\t/// 線形補間によるアップサンプル/ダウンサンプルしているだけなので、\n\t/// 高音質を目指すなら、別途、アンチエイリアスフィルタをかける必要がある。\n\t/// </summary>\n\tpublic class RateTransposer : Stream\n\t{\n\t\t#region フィールド\n\n\t\tStream stream; // inner stream\n\t\tdouble rate; // 変換レート。音程が rate 、再生時間が 1/rate 倍に。\n\t\tshort[] inputBuffer; // 入力用バッファ。\n\t\tshort prev; // 1音前のデータを一時的に保存しておく。\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"stream\">内部ストリーム</param>\n\t\t/// <param name=\"rate\">変換レート</param>\n\t\tpublic RateTransposer(Stream stream, double rate)\n\t\t{\n\t\t\tthis.stream = stream;\n\t\t\tthis.rate = rate;\n\t\t\tthis.inputBuffer = null;\n\t\t\tthis.prev = 0;\n\t\t}\n\n\t\t#endregion\n\t\t#region プロパティ\n\n\t\t/// <summary>\n\t\t/// 変換レート。\n\t\t/// 音程が rate 、再生時間が 1/rate 倍に。\n\t\t/// </summary>\n\t\tpublic double Rate\n\t\t{\n\t\t\tget{return this.rate;}\n\t\t\tset{this.rate = value;}\n\t\t}\n\n\t\t#endregion\n\t\t#region Stream メンバ\n\n\t\tpublic override int FillBuffer(short[] buffer, int offset, int size)\n\t\t{\n\t\t\t// データを入力ストリームから読み出す。\n\n\t\t\tint inputSize = (int)(size * this.rate);\n\n\t\t\tif(this.inputBuffer == null || this.inputBuffer.Length < inputSize)\n\t\t\t{\n\t\t\t\tthis.inputBuffer = new short[inputSize];\n\t\t\t}\n\n\t\t\tint readSize = this.stream.FillBuffer(this.inputBuffer, 0, inputSize);\n\n\t\t\tif(readSize != inputSize)\n\t\t\t{\n\t\t\t\tsize = (int)(readSize / this.rate);\n\t\t\t}\n\n\t\t\tdouble delta = this.rate / 2;\n\n\t\t\t// サンプリングレートを変更しつつ出力バッファにデータをコピー。\n\t\t\t// Bresenham アルゴリズム的な動作。\n\n\t\t\tfor(int i=0, j=offset;;)\n\t\t\t{\n\t\t\t\twhile(delta >= 0)\n\t\t\t\t{\n\t\t\t\t\tbuffer[j] = Interpolate(delta, this.prev, this.inputBuffer[i]); //! ←これ、prev と input[i] が逆。\n\t\t\t\t\tthis.prev = this.inputBuffer[i]; //! ← これって delta < 0 の側にあるべきでは？\n\n\t\t\t\t\tdelta -= this.rate;\n\t\t\t\t\t++j;\n\t\t\t\t\tif(j - offset >= size)\n\t\t\t\t\t\tgoto END;\n\t\t\t\t}\n\n\t\t\t\twhile(delta < 0)\n\t\t\t\t{\n\t\t\t\t\tdelta += 1;\n\t\t\t\t\t++i;\n\t\t\t\t\tif(i >= inputSize)\n\t\t\t\t\t\tgoto END;\n\t\t\t\t}\n\t\t\t\t//! ↑\n\t\t\t\t// while(!(j >= size + offset || i >= inputSize))\n\t\t\t\t//   if(delta >= 0) ....\n\t\t\t\t//   else ....\n\t\t\t\t// の方が自然なのでは？\n\t\t\t}\n\t\t\tEND:\n\t\t\treturn size;\n\t\t}\n\n\t\tpublic override bool Skip(int size)\n\t\t{\n\t\t\tint inputSize = (int)(size * this.rate);\n\t\t\treturn this.stream.Skip(inputSize);\n\t\t}\n\n\t\t#endregion\n\t\t#region 補助関数(private)\n\n\t\t/// <summary>\n\t\t/// 線形補間関数。\n\t\t/// </summary>\n\t\t/// <param name=\"delta\">val1 と val2 を混ぜる割合（整数部分は無視される）</param>\n\t\t/// <param name=\"val1\">値1</param>\n\t\t/// <param name=\"val2\">値2</param>\n\t\t/// <returns></returns>\n\t\tstatic short Interpolate(double delta, short val1, short val2)\n\t\t{\n\t\t\tdelta -= (int)delta;\n\t\t\tdouble val = val1 + delta * (val2 - val1);\n#if CHECK_RANGE\n\t\t\tif(val > short.MaxValue) val = short.MaxValue;\n\t\t\tif(val < short.MinValue) val = short.MinValue;\n#endif\n\t\t\treturn (short)val;\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Stream/Monaural/TimeStretcher.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Stream.Monaural\n{\n\t/// <summary>\n\t/// TimeStretcher の概要の説明です。\n\t/// </summary>\n\tpublic class TimeStretcher : Stream\n\t{\n\t\t#region フィールド\n\n\t\tStream stream; // inner stream\n\t\tdouble rate; // 変換レート。再生時間が 1/rate 倍に。\n\t\tshort[] inputBuffer; // 入力用バッファ。\n\t\tint readSize; // 既に読み出された状態にあるデータの長さ。\n\t\tshort[] overlapBuffer; // オーバーラップ用バッファ。\n\t\tint margin; // オフセット探索用のマージン。\n\n\t\tconst int DEFAULT_OVERLAP = 512;\n\t\tconst int DEFAULT_MARGIN = 1024;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"stream\">内部ストリーム</param>\n\t\t/// <param name=\"rate\">変換レート</param>\n\t\tpublic TimeStretcher(Stream stream, double rate) : this(stream, rate, DEFAULT_OVERLAP, DEFAULT_MARGIN)\n\t\t{\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"stream\">内部ストリーム</param>\n\t\t/// <param name=\"rate\">変換レート</param>\n\t\t/// <param name=\"overlapSize\">オーバーラップ部分の長さ</param>\n\t\tpublic TimeStretcher(Stream stream, double rate, int overlapSize, int margin)\n\t\t{\n\t\t\tthis.stream = stream;\n\t\t\tthis.rate = rate;\n\t\t\tthis.inputBuffer = null;\n\t\t\tthis.readSize = 0;\n\t\t\tthis.overlapBuffer = new short[overlapSize];\n\t\t\tthis.margin = margin;\n\t\t}\n\n\t\t#endregion\n\t\t#region プロパティ\n\n\t\t/// <summary>\n\t\t/// 変換レート。\n\t\t/// 再生時間が 1/rate 倍に。\n\t\t/// </summary>\n\t\tpublic double Rate\n\t\t{\n\t\t\tget{return this.rate;}\n\t\t\tset{this.rate = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 変換レート。\n\t\t/// 再生時間が temp 倍に。\n\t\t/// </summary>\n\t\tpublic double Tempo\n\t\t{\n\t\t\tget{return 1 / this.rate;}\n\t\t\tset{this.rate = 1 / value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 読み出しデータのマージン。\n\t\t/// </summary>\n\t\tpublic int Margin\n\t\t{\n\t\t\tget{return this.margin;}\n\t\t\tset{this.margin = value;}\n\t\t}\n\n\t\t#endregion\n\t\t#region Stream メンバ\n\n\t\t/// <remarks>\n\t\t/// size が overlapSize よりも小さいとき、動作保証対象外。\n\t\t/// </remarks>\n\t\tpublic override int FillBuffer(short[] buffer, int offset, int size)\n\t\t{\n\t\t\t// データを入力ストリームから読み出す。\n\t\t\tint overlap = this.overlapBuffer.Length;\n\n\t\t\tint frameSize = (int)(size * this.rate);\n\t\t\tint inputSize = size + overlap + this.margin;\n\n\t\t\tif(this.inputBuffer == null || this.inputBuffer.Length < inputSize)\n\t\t\t{\n\t\t\t\tthis.inputBuffer = new short[inputSize];\n\t\t\t}\n\n\t\t\tif(inputSize > this.readSize)\n\t\t\t{\n\t\t\t\tint readSize = this.stream.FillBuffer(this.inputBuffer, this.readSize, inputSize - this.readSize);\n\n\t\t\t\tif(readSize + this.readSize != inputSize)\n\t\t\t\t{\n\t\t\t\t\tsize = Math.Min(readSize + this.readSize, size);\n\t\t\t\t\tfor(int i=readSize + this.readSize; i<inputSize; ++i)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.inputBuffer[i] = 0;\n\t\t\t\t\t}\n\t\t\t\t\tinputSize = readSize + this.readSize;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// フレーム開始オフセットの決定。\n\t\t\tint frameOffset = GetOffset(this.overlapBuffer, this.inputBuffer, this.margin);\n\n\t\t\t// オーバーラップ部分のコピー。\n\t\t\tCrossfade(this.overlapBuffer, this.inputBuffer, frameOffset, buffer);\n\n\t\t\tif(size > overlap)\n\t\t\t{\n\t\t\t\t// 非オーバーラップ部分のコピー。\n\t\t\t\tSoundLibrary.Wave.Util.MemCopy(this.inputBuffer, overlap + frameOffset, buffer, overlap, size - overlap);\n\n\t\t\t\t// 次のフレーム用のオーバーラップデータを一時バッファにコピー。\n\t\t\t\tSoundLibrary.Wave.Util.MemCopy(this.inputBuffer, size + frameOffset, this.overlapBuffer, 0, overlap);\n\t\t\t}\n\n\t\t\t// 次のフレームの準備。\n\t\t\tif(inputSize > frameSize)\n\t\t\t{\n\t\t\t\t// 過剰に読んだ分は残しておく。\n\t\t\t\tSoundLibrary.Wave.Util.MemCopy(this.inputBuffer, frameSize, this.inputBuffer, 0, inputSize - frameSize);\n\t\t\t\tthis.readSize = inputSize - frameSize;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// 読み足りない分、空読みする。\n\t\t\t\tint skipSize = frameSize - inputSize;\n\t\t\t\tthis.stream.Skip(skipSize);\n\t\t\t\tthis.readSize = 0;\n\t\t\t}\n\n\t\t\treturn size;\n\t\t}\n\n\t\tpublic override bool Skip(int size)\n\t\t{\n\t\t\tint inputSize = (int)(size * this.rate);\n\t\t\treturn this.stream.Skip(inputSize);\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部関数\n\n\t\t/// <summary>\n\t\t/// a と b の信号をクロスフェードさせながら混ぜる。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">信号 a</param>\n\t\t/// <param name=\"b\">信号 b</param>\n\t\t/// <param name=\"offset\">b のオフセット</param>\n\t\t/// <param name=\"dest\">混ぜた信号の書き込み先</param>\n\t\tstatic void Crossfade(short[] a, short[] b, int offset, short[] dest)\n\t\t{\n\t\t\tint len = a.Length;\n\n\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t{\n\t\t\t\tint val = ((len - i) * a[i] + i * b[i + offset]) / len;\n\t\t\t\tdest[i] = (short)val;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 2つの信号 a と b を混ぜるとき、最も違和感なく混ざる位置オフセットを探す。\n\t\t/// a と b の相互相関が最も高い位置を探す。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">信号 a</param>\n\t\t/// <param name=\"b\">信号 b</param>\n\t\t/// <param name=\"max\">探索範囲 [0, max)</param>\n\t\t/// <returns>位置オフセット</returns>\n\t\tstatic int GetOffset(short[] a, short[] b, int max)\n\t\t{\n\t\t\t//return 0;\n\t\t\t//*\n\t\t\tdouble maxVal = int.MinValue;\n\t\t\tint offset = 0;\n\t\t\tfor(int i=0; i<max; ++i)\n\t\t\t{\n\t\t\t\tdouble x = Correlation(a, b, i);\n\t\t\t\tif(x > maxVal)\n\t\t\t\t{\n\t\t\t\t\tmaxVal = x;\n\t\t\t\t\toffset = i;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn offset;\n\t\t\t//*/\n\t\t}\n\n\t\t/// <summary>\n\t\t/// a と b+offset の相関値を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">信号 a</param>\n\t\t/// <param name=\"b\">信号 b</param>\n\t\t/// <param name=\"offset\">b のオフセット</param>\n\t\t/// <returns></returns>\n\t\tstatic double Correlation(short[] a, short[] b, int offset)\n\t\t{\n\t\t\tdouble x = 0;\n\t\t\tdouble ax = 0;\n\t\t\tdouble bx = 0;\n\t\t\tfor(int i=0; i<a.Length; ++i)\n\t\t\t{\n\t\t\t\tshort ai = a[i];\n\t\t\t\tshort bi = b[i + offset];\n\t\t\t\tx += ai * bi;\n\t\t\t\tax += ai * ai;\n\t\t\t\tbx += bi * bi;\n\t\t\t}\n\t\t\tax *= bx;\n\t\t\tif(ax == 0)\n\t\t\t\treturn int.MaxValue;\n\t\t\treturn x * x / ax;\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Stream/Monaural/WaveStream.cs",
    "content": "﻿using System;\nusing SoundLibrary.Wave;\n\nnamespace SoundLibrary.Stream.Monaural\n{\n\t/// <summary>\n\t/// WaveReader からデータを読み出し続けるだけのストリーム。\n\t/// </summary>\n\tpublic class WaveStream : Stream, IDisposable\n\t{\n\t\t#region フィールド\n\n\t\tWaveReader reader;\n\t\tbyte[] buffer;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\tpublic WaveStream(WaveReader reader)\n\t\t{\n\t\t\tthis.reader = reader;\n\t\t\tthis.buffer = null;\n\t\t}\n\n\t\t#endregion\n\t\t#region Stream メンバ\n\n\t\tpublic override int FillBuffer(short[] buffer, int offset, int size)\n\t\t{\n\t\t\tif(this.buffer == null || this.buffer.Length < size * 2)\n\t\t\t{\n\t\t\t\tthis.buffer = new byte[size * 2];\n\t\t\t}\n\n\t\t\tsize = this.reader.ReadRawData(this.buffer, 0, size * 2);\n\n\t\t\tSoundLibrary.Wave.Util.MemCopy(this.buffer, 0, buffer, offset, size);\n\n\t\t\treturn size / 2;\n\t\t}\n\n\t\tpublic override bool Skip(int size)\n\t\t{\n\t\t\treturn this.reader.Skip(size);\n\t\t}\n\n\t\t#endregion\n\t\t#region IDisposable メンバ\n\n\t\tpublic void Close()\n\t\t{\n\t\t\tthis.reader.Close();\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tthis.Close();\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Stream/Stream.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Stream\n{\n\t/// <summary>\n\t/// 音声ストリーム用インタフェース。\n\t/// めんどくさいんで、16ビットPCM限定。\n\t/// モノラル版。\n\t/// </summary>\n\tpublic abstract class Stream\n\t{\n\t\t/// <summary>\n\t\t/// バッファにデータを読み込む。\n\t\t/// </summary>\n\t\t/// <param name=\"buffer\">データ読み込み先のバッファ</param>\n\t\t/// <param name=\"offset\">データを書き込み始める場所のオフセット</param>\n\t\t/// <param name=\"size\">読み出したいデータ長</param>\n\t\t/// <returns>実際に読み込んだデータ長</returns>\n\t\tpublic abstract int FillBuffer(short[] buffer, int offset, int size);\n\n\t\t/// <summary>\n\t\t/// バッファにデータを読み込む。\n\t\t/// </summary>\n\t\t/// <param name=\"buffer\">データ読み込み先のバッファ</param>\n\t\t/// <returns>実際に読み込んだデータ長</returns>\n\t\tpublic int FillBuffer(short[] buffer)\n\t\t{\n\t\t\treturn this.FillBuffer(buffer, 0, buffer.Length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データを空読みする。\n\t\t/// </summary>\n\t\t/// <param name=\"size\">空読みしたいサイズ</param>\n\t\t/// <returns>実際から読みしたサイズ</returns>\n\t\tpublic abstract bool Skip(int size);\n\t}\n\n\t/// <summary>\n\t/// 音声ストリームにバッファを付けたもの。\n\t/// </summary>\n\tpublic class BufferedStream\n\t{\n\t\t#region 定数・フィールド\n\n\t\tconst int DEFAULT_BUFFER_SIZE = 1024;\n\n\t\tStream stream;\n\t\tshort[] buffer;\n\t\tint current;\n\t\tint last;\n\n\t\t#endregion\n\t\t#region 初期化\n\n\t\t/// <summary>\n\t\t/// デフォルトサイズのバッファを用意。\n\t\t/// </summary>\n\t\t/// <param name=\"stream\">入力元のストリーム</param>\n\t\tpublic BufferedStream(Stream stream) : this(stream, DEFAULT_BUFFER_SIZE) {}\n\n\t\t/// <summary>\n\t\t/// バッファサイズを指定してバッファを用意。\n\t\t/// </summary>\n\t\t/// <param name=\"stream\">入力元のストリーム</param>\n\t\t/// <param name=\"size\">バッファサイズ</param>\n\t\tpublic BufferedStream(Stream stream, int size) : this(stream, new short[size]) {}\n\n\t\t/// <summary>\n\t\t/// バッファを直接指定。\n\t\t/// </summary>\n\t\t/// <param name=\"stream\">入力元のストリーム</param>\n\t\t/// <param name=\"buffer\">バッファ</param>\n\t\tpublic BufferedStream(Stream stream, short[] buffer)\n\t\t{\n\t\t\tthis.stream = stream;\n\t\t\tthis.buffer = buffer;\n\t\t\tthis.current = -1;\n\t\t\tthis.last = 0;\n\t\t}\n\n\t\t#endregion\n\t\t#region 値の取得など\n\n\t\t/// <summary>\n\t\t/// 次のデータに移動。\n\t\t/// </summary>\n\t\t/// <returns>まだデータがバッファ内に残っているかどうか</returns>\n\t\tpublic bool MoveNext()\n\t\t{\n\t\t\t++this.current;\n\n\t\t\tif(this.current >= this.last)\n\t\t\t{\n\t\t\t\tthis.last = this.stream.FillBuffer(this.buffer);\t\t\t\t\n\t\t\t\tthis.current = 0;\n\t\t\t}\n\n\t\t\treturn this.last != 0;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 値の取得。\n\t\t/// </summary>\n\t\tpublic short Value\n\t\t{\n\t\t\tget{return this.buffer[this.current];}\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Util.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary\n{\n\t//! C# 2.0 が正式公開されたら static クラスに。\n\n\t/// <summary>\n\t/// 共通関数群。\n\t/// </summary>\n\tpublic class Util\n\t{\n\t\t#region 正規化・dB⇔リニア値\n\n\t\t/// <summary>\n\t\t/// 周波数を正規化。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">正規化したい周波数</param>\n\t\t/// <param name=\"fs\">サンプリング周波数</param>\n\t\t/// <returns>正規化角周波数</returns>\n\t\tpublic static double Normalize(double f, double fs)\n\t\t{\n\t\t\treturn 2 * Math.PI / fs * f;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 正規化角周波数を元の周波数に戻す。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">正規化角周波数</param>\n\t\t/// <param name=\"fs\">サンプリング周波数</param>\n\t\t/// <returns>元の周波数</returns>\n\t\tpublic static double Denormalize(double w, double fs)\n\t\t{\n\t\t\treturn fs / (2 * Math.PI) * w;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 周波数を正規化。\n\t\t/// サンプリング周波数は 48000Hz。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">正規化したい周波数</param>\n\t\t/// <returns></returns>\n\t\tpublic static double Normalize(double w)\n\t\t{\n\t\t\treturn Normalize(w, 48000);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 複素数の絶対値(パワーのdB値)を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"re\">実部</param>\n\t\t/// <param name=\"im\">虚部</param>\n\t\t/// <returns>パワーのdB値</returns>\n\t\tpublic static double Amp(double re, double im)\n\t\t{\n\t\t\treturn 10 * Math.Log10(re*re + im*im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 絶対値(パワーのdB値)を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"re\">リニア値</param>\n\t\t/// <returns>パワーのdB値</returns>\n\t\tpublic static double Amp(double re)\n\t\t{\n\t\t\treturn 20 * Math.Log10(Math.Abs(re));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 複素数の偏角を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"re\">実部</param>\n\t\t/// <param name=\"im\">虚部</param>\n\t\t/// <returns>偏角</returns>\n\t\tpublic static double Phase(double re, double im)\n\t\t{\n\t\t\treturn Math.Atan2(im, re);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// dB値 → リニア値に変換。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">dB値</param>\n\t\t/// <returns>リニア値</returns>\n\t\tpublic static double DBToLinear(double x)\n\t\t{\n\t\t\treturn Math.Pow(10, x/20);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// リニア値 → dB値に変換。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">リニア値</param>\n\t\t/// <returns>dB値</returns>\n\t\tpublic static double LinearToDB(double x)\n\t\t{\n\t\t\treturn 20 * Math.Log10(x);\n\t\t}\n\n\t\t#endregion\n\t\t#region 値のクリッピング\n\n\t\t/// <summary>\n\t\t/// 値を short の範囲にクリッピングする。\n\t\t/// </summary>\n\t\t/// <param name=\"val\">値</param>\n\t\t/// <returns>クリッピング後の値</returns>\n\t\t/// <remarks>C# 2.0 が正式公開されたら generics 化すると思う。</remarks>\n\t\tpublic static short ClipShort(double val)\n\t\t{\n\t\t\tif(val < short.MinValue) val = short.MinValue;\n\t\t\telse if(val > short.MaxValue) val = short.MaxValue;\n\t\t\treturn (short)val;\n\t\t}\n\n\t\t#endregion\n\t\t#region インパルス応答\n\n\t\t/// <summary>\n\t\t/// フィルタのインパルス応答を計算する。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">フィルタ</param>\n\t\t/// <param name=\"len\">インパルス応答の長さ</param>\n\t\t/// <returns>インパルス応答</returns>\n\t\tpublic static double[] GetImpulseResponse(Filter.IFilter f, int len)\n\t\t{\n\t\t\tdouble[] x = new double[len];\n\t\t\tx[0] = f.GetValue(1);\n\t\t\tfor(int i=1; i<len; ++i)\n\t\t\t\tx[i] = f.GetValue(0);\n\t\t\treturn x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタの周波数応答を計算する。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">フィルタ</param>\n\t\t/// <param name=\"len\">インパルス応答の長さ</param>\n\t\t/// <returns>周波数応答</returns>\n\t\tpublic static SpectrumAnalysis.Spectrum GetFrequencyResponse(Filter.IFilter f, int len)\n\t\t{\n\t\t\tlen = SoundLibrary.BitOperation.FloorPower2(len);\n\t\t\tdouble[] x = GetImpulseResponse(f, len);\n\t\t\treturn SpectrumAnalysis.Spectrum.FromTimeSequence(x);\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Wave/FilterAdapter.cs",
    "content": "﻿using System;\nusing SoundLibrary.Filter;\n\nnamespace SoundLibrary.Wave\n{\n\tpublic interface IStereoFilter\n\t{\n\t\tvoid Filter(ref short l, ref short r);\n\t\tvoid Clear();\n\t}\n\n\t/// <summary>\n\t/// IFilter → Stereo1SampleFilter 用アダプタ。\n\t/// 入力 (Xl, Xr), 出力 (Yl, Yr)、\n\t/// Yl = Hll Xl + Hrl Xr\n\t/// Yr = Hlr Xl + Hrr Xr\n\t/// </summary>\n\tpublic class CrossStereoFilter : IStereoFilter\n\t{\n\t\t#region フィールド\n\n\t\tIFilter ll; // 特性 Hll を持つフィルタ。\n\t\tIFilter lr; // 特性 Hlr を持つフィルタ。\n\t\tIFilter rl; // 特性 Hrl を持つフィルタ。\n\t\tIFilter rr; // 特性 Hrr を持つフィルタ。\n\n\t\t#endregion\n\t\t#region コンストラクタ\n\n\t\t/// <summary>\n\t\t/// Hll, Hlr, Hrl, Hrr を別個に指定。\n\t\t/// </summary>\n\t\t/// <param name=\"ll\">特性 Hll を持つフィルタ</param>\n\t\t/// <param name=\"lr\">特性 Hlr を持つフィルタ</param>\n\t\t/// <param name=\"rl\">特性 Hrl を持つフィルタ</param>\n\t\t/// <param name=\"rr\">特性 Hrr を持つフィルタ</param>\n\t\tpublic CrossStereoFilter(IFilter ll, IFilter lr, IFilter rl, IFilter rr)\n\t\t{\n\t\t\tthis.ll = ll;\n\t\t\tthis.lr = lr;\n\t\t\tthis.rl = rl;\n\t\t\tthis.rr = rr;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Hll ＝ Hrr, Hlr ＝ Hrlの場合。\n\t\t/// </summary>\n\t\t/// <param name=\"ll\">特性 Hll を持つフィルタ</param>\n\t\t/// <param name=\"lr\">特性 Hlr を持つフィルタ</param>\n\t\tpublic CrossStereoFilter(IFilter ll, IFilter lr)\n\t\t{\n\t\t\tthis.ll = ll;\n\t\t\tthis.lr = lr;\n\t\t\tthis.rl = (IFilter)lr.Clone();\n\t\t\tthis.rr = (IFilter)ll.Clone();\n\t\t}\n\n\t\t#endregion\n\n\t\tpublic void Filter(ref short l, ref short r)\n\t\t{\n\t\t\tdouble xl = this.ll.GetValue(l) + this.rl.GetValue(r);\n\t\t\tdouble xr = this.lr.GetValue(l) + this.rr.GetValue(r);\n\t\t\tl = SoundLibrary.Wave.Util.ClipToShort(xl);\n\t\t\tr = SoundLibrary.Wave.Util.ClipToShort(xr);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 状態の初期化。\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tthis.ll.Clear();\n\t\t\tthis.lr.Clear();\n\t\t\tthis.rl.Clear();\n\t\t\tthis.rr.Clear();\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// IFilter → Stereo1SampleFilter 用アダプタ。\n\t/// L/R それぞれに別個のフィルタを適用。\n\t/// 入力 (Xl, Xr), 出力 (Yl, Yr)、\n\t/// Yl = Hl Xl\n\t/// Yr = Hr Xr\n\t/// </summary>\n\tpublic class StereoFilter : IStereoFilter\n\t{\n\t\t#region フィールド\n\n\t\tIFilter l; // 特性 Hl を持つフィルタ。\n\t\tIFilter r; // 特性 Hr を持つフィルタ。\n\n\t\t#endregion\n\t\t#region コンストラクタ\n\n\t\t/// <summary>\n\t\t/// Hl, Hr を別個に指定。\n\t\t/// </summary>\n\t\t/// <param name=\"l\">特性 Hl を持つフィルタ</param>\n\t\t/// <param name=\"r\">特性 Hr を持つフィルタ</param>\n\t\tpublic StereoFilter(IFilter l, IFilter r)\n\t\t{\n\t\t\tthis.l = l;\n\t\t\tthis.r = r;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Hl ＝ Hr の場合。\n\t\t/// </summary>\n\t\t/// <param name=\"l\">特性 Hl を持つフィルタ</param>\n\t\tpublic StereoFilter(IFilter l)\n\t\t{\n\t\t\tthis.l = l;\n\t\t\tthis.r = (IFilter)l.Clone();\n\t\t}\n\n\t\t#endregion\n\n\t\tpublic void Filter(ref short l, ref short r)\n\t\t{\n\t\t\tdouble xl = this.l.GetValue(l);\n\t\t\tdouble xr = this.r.GetValue(r);\n\t\t\tl = SoundLibrary.Wave.Util.ClipToShort(xl);\n\t\t\tr = SoundLibrary.Wave.Util.ClipToShort(xr);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 状態の初期化。\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tthis.l.Clear();\n\t\t\tthis.r.Clear();\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// IFilter → Stereo1SampleFilter 用アダプタ。\n\t/// ステレオ音をモノラル化してからフィルタリング。\n\t/// 入力 (Xl, Xr), 出力 (Yl, Yr)、\n\t/// X = (Xl * Xr) / 2\n\t/// Yl = Yr = H X\n\t/// </summary>\n\tpublic class StereoToMonauralFilter : IStereoFilter\n\t{\n\t\t#region フィールド\n\n\t\tIFilter f; // 特性 H を持つフィルタ。\n\n\t\t#endregion\n\t\t#region コンストラクタ\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">特性 H を持つフィルタ</param>\n\t\tpublic StereoToMonauralFilter(IFilter f)\n\t\t{\n\t\t\tthis.f = f;\n\t\t}\n\n\t\t#endregion\n\n\t\tpublic void Filter(ref short l, ref short r)\n\t\t{\n\t\t\tdouble x = this.f.GetValue(0.5 * ((int)l + r));\n\t\t\tl = r = SoundLibrary.Wave.Util.ClipToShort(x);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 状態の初期化。\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tthis.f.Clear();\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// IFilter → Monaural1SampleFilter 用アダプタ。\n\t/// Y = H X\n\t/// </summary>\n\tpublic class MonauralFilter\n\t{\n\t\t#region フィールド\n\n\t\tIFilter f; // 特性 H を持つフィルタ。\n\n\t\t#endregion\n\t\t#region コンストラクタ\n\n\t\t/// <summary>\n\t\t/// 初期化。\n\t\t/// </summary>\n\t\t/// <param name=\"f\">特性 H を持つフィルタ</param>\n\t\tpublic MonauralFilter(IFilter f)\n\t\t{\n\t\t\tthis.f = f;\n\t\t}\n\n\t\t#endregion\n\n\t\tpublic void Filter(ref short l)\n\t\t{\n\t\t\tdouble x = this.f.GetValue(l);\n\t\t\tl = SoundLibrary.Wave.Util.ClipToShort(x);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 状態の初期化。\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tthis.f.Clear();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Wave/Util.cs",
    "content": "﻿using System;\n\nnamespace SoundLibrary.Wave\n{\n\t/// <summary>\n\t/// ステレオ音を1サンプル単位でフィルタリングする関数。\n\t/// </summary>\n\tpublic delegate void Stereo1SampleFilter(ref short lVal, ref short rVal);\n\n\t/// <summary>\n\t/// モノラル音を1サンプル単位でフィルタリングする関数。\n\t/// </summary>\n\tpublic delegate void Monaural1SampleFilter(ref short val);\n\n\t/// <summary>\n\t/// SoundLibrary.Wave 内で使うユーティリティ関数の定義。\n\t/// </summary>\n\tpublic class Util\n\t{\n\t\t#region RIFF/WAV ファイルヘッダ中の定数\n\n\t\tpublic static readonly byte[] RIFF = System.Text.Encoding.ASCII.GetBytes(\"RIFF\");\n\t\tpublic static readonly byte[] WAVE = System.Text.Encoding.ASCII.GetBytes(\"WAVE\");\n\t\tpublic static readonly byte[] FMT  = System.Text.Encoding.ASCII.GetBytes(\"fmt \");\n\t\tpublic static readonly byte[] DATA = System.Text.Encoding.ASCII.GetBytes(\"data\");\n\n\t\t#endregion\n\t\t#region 2つの配列の比較\n\n\t\tpublic static bool Equal(byte[] a, byte[] b)\n\t\t{\n\t\t\treturn a[0] == b[0] && a[1] == b[1] && a[2] == b[2] && a[3] == b[3];\n\n\t\t\t/*\n\t\t\tunsafe\n\t\t\t{\n\t\t\t\tfixed(byte* pa = a, pb = b)\n\t\t\t\t{\n\t\t\t\t\treturn *(int*)pa == *(int*)pb;\n\t\t\t\t}\n\t\t\t}\n\t\t\t//*/\n\t\t}\n\n\t\t#endregion\n\t\t#region MemCopy\n\n\t\tpublic static void MemCopy(byte[] orig, short[] dest)\n\t\t{\n\t\t\tMemCopy(orig, dest, orig.Length);\n\t\t}\n\n\t\tpublic static void MemCopy(byte[] orig, short[] dest, int length)\n\t\t{\n\t\t\tunsafe\n\t\t\t{\n\t\t\t\tfixed(void* po = orig, pd = dest)\n\t\t\t\t{\n\t\t\t\t\tMemCopy(po, pd, length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic static void MemCopy(short[] orig, byte[] dest)\n\t\t{\n\t\t\tMemCopy(orig, dest, orig.Length * 2);\n\t\t}\n\n\t\tpublic static void MemCopy(short[] orig, byte[] dest, int length)\n\t\t{\n\t\t\tunsafe\n\t\t\t{\n\t\t\t\tfixed(void* po = orig, pd = dest)\n\t\t\t\t{\n\t\t\t\t\tMemCopy(po, pd, length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic static void MemCopy(byte[] orig, byte[] dest)\n\t\t{\n\t\t\tunsafe\n\t\t\t{\n\t\t\t\tfixed(void* po = orig, pd = dest)\n\t\t\t\t{\n\t\t\t\t\tMemCopy(po, pd, orig.Length);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tunsafe public static void MemCopy(void* orig, void* dest, int length)\n\t\t{\n\t\t\tint length16 = length - (length % (sizeof(int) * 16));\n\t\t\tint* end = ((int*)orig) + length16 / sizeof(int);\n\t\t\tint* p1 = (int*)orig;\n\t\t\tint* p2 = (int*)dest;\n\t\t\twhile(p1!=end)\n\t\t\t{\n\t\t\t\t*p2 = *p1; ++p1; ++p2;\n\t\t\t\t*p2 = *p1; ++p1; ++p2;\n\t\t\t\t*p2 = *p1; ++p1; ++p2;\n\t\t\t\t*p2 = *p1; ++p1; ++p2;\n\t\t\t}\n\n\t\t\tbyte* bend = (byte*)orig + length;\n\t\t\tbyte* bp1 = (byte*)p1;\n\t\t\tbyte* bp2 = (byte*)p2;\n\t\t\tfor(; bp1!=bend; ++bp1, ++bp2)\n\t\t\t\t*bp2 = *bp1;\n\t\t}\n\n\t\tpublic static void MemCopy(short[] orig, int origOffset, short[] dest, int destOffset, int length)\n\t\t{\n\t\t\tunsafe\n\t\t\t{\n\t\t\t\tfixed(short* po = orig)\n\t\t\t\t{\n\t\t\t\t\tfixed(short* pd = dest)\n\t\t\t\t\t{\n\t\t\t\t\t\tMemCopy(po + origOffset, pd + destOffset, sizeof(short) * length);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic static void MemCopy(byte[] orig, int origOffset, short[] dest, int destOffset, int length)\n\t\t{\n\t\t\tunsafe\n\t\t\t{\n\t\t\t\tfixed(byte* po = orig)\n\t\t\t\t{\n\t\t\t\t\tfixed(short* pd = dest)\n\t\t\t\t\t{\n\t\t\t\t\t\tMemCopy(po + origOffset, pd + destOffset, sizeof(byte) * length);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic static void MemCopy(short[] orig, int origOffset, byte[] dest, int destOffset, int length)\n\t\t{\n\t\t\tunsafe\n\t\t\t{\n\t\t\t\tfixed(short* po = orig)\n\t\t\t\t{\n\t\t\t\t\tfixed(byte* pd = dest)\n\t\t\t\t\t{\n\t\t\t\t\t\tMemCopy(po + origOffset, pd + destOffset, sizeof(short) * length);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpublic static void MemCopy(byte[] orig, int origOffset, byte[] dest, int destOffset, int length)\n\t\t{\n\t\t\tunsafe\n\t\t\t{\n\t\t\t\tfixed(byte* po = orig)\n\t\t\t\t{\n\t\t\t\t\tfixed(byte* pd = dest)\n\t\t\t\t\t{\n\t\t\t\t\t\tMemCopy(po + origOffset, pd + destOffset, sizeof(byte) * length);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 型変換（Wave 格納形式 → double 等）\n\n\t\t/// <summary>\n\t\t/// wave 格納形式（128バイアス表現）→ short\n\t\t/// </summary>\n\t\t/// <param name=\"x\">128バイアス表現のデータ</param>\n\t\t/// <returns>short 値</returns>\n\t\tinternal static short BiasedByteToShort(byte x)\n\t\t{\n\t\t\treturn (short)((short)x - 128);\n\t\t}\n\n\t\t#endregion\n\t\t#region 型変換（double 等 → Wave 格納形式、short, byte の範囲に収まるように値をクリップ）\n\n\t\t/// <summary>\n\t\t/// → byte の変換。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">元</param>\n\t\t/// <returns>後</returns>\n\t\tinternal static byte ClipToByte(double x)\n\t\t{\n\t\t\tx += 128;\n\t\t\tif(x < 0) x = 0;\n\t\t\telse if(x > 255) x = 255;\n\t\t\treturn (byte)x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// → byte の変換。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">元</param>\n\t\t/// <returns>後</returns>\n\t\tinternal static byte ClipToByte(float x)\n\t\t{\n\t\t\tx += 128;\n\t\t\tif(x < 0) x = 0;\n\t\t\telse if(x > 255) x = 255;\n\t\t\treturn (byte)x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// → byte の変換。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">元</param>\n\t\t/// <returns>後</returns>\n\t\tinternal static byte ClipToByte(short x)\n\t\t{\n\t\t\tx += 128;\n\t\t\tif(x < 0) x = 0;\n\t\t\telse if(x > 255) x = 255;\n\t\t\treturn (byte)x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// → short の変換。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">元</param>\n\t\t/// <returns>後</returns>\n\t\tinternal static short ClipToShort(double x)\n\t\t{\n\t\t\tif(x < short.MinValue) x = short.MinValue;\n\t\t\telse if(x > short.MaxValue) x = short.MaxValue;\n\t\t\treturn (short)x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// → short の変換。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">元</param>\n\t\t/// <returns>後</returns>\n\t\tinternal static short ClipToShort(float x)\n\t\t{\n\t\t\tif(x < short.MinValue) x = short.MinValue;\n\t\t\telse if(x > short.MaxValue) x = short.MaxValue;\n\t\t\treturn (short)x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// → short の変換。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">元</param>\n\t\t/// <returns>後</returns>\n\t\tinternal static short ClipToShort(short x)\n\t\t{\n\t\t\treturn x;\n\t\t}\n\n\t\t#endregion\n\t\t#region Raw Data に対するフィルタリング\n\n\t\t/// <summary>\n\t\t/// Raw Wav Data に対してフィルタリングする。\n\t\t/// ステレオ版。\n\t\t/// </summary>\n\t\t/// <param name=\"data\">Raw Data</param>\n\t\t/// <param name=\"filter\">フィルタ</param>\n\t\t/// <param name=\"is16bit\">Raw Data の形式が16ビットか8ビットか。</param>\n\t\tpublic static void FilteringRawData(byte[] data, Stereo1SampleFilter filter, bool is16bit)\n\t\t{\n\t\t\tunsafe\n\t\t\t{\n\t\t\t\tfixed(byte* begin = data)\n\t\t\t\t{\n\t\t\t\t\tif(is16bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tshort* end = (short*)(begin + (data.Length & (~3)));\n\t\t\t\t\t\tfor(short* p = (short*)begin; p != (short*)end; p += 2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfilter(ref *p, ref *(p + 1));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbyte* end = begin + (data.Length & (~1));\n\t\t\t\t\t\tfor(byte* p = begin; p != end; p += 2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tshort l = BiasedByteToShort(*p);\n\t\t\t\t\t\t\tshort r = BiasedByteToShort(*(p + 1));\n\t\t\t\t\t\t\tfilter(ref l, ref r);\n\t\t\t\t\t\t\t*p = ClipToByte(l);\n\t\t\t\t\t\t\t*(p + 1) = ClipToByte(r);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Raw Wav Data に対してフィルタリングする。\n\t\t/// モノラル版。\n\t\t/// </summary>\n\t\t/// <param name=\"data\">Raw Data</param>\n\t\t/// <param name=\"filter\">フィルタ</param>\n\t\t/// <param name=\"is16bit\">Raw Data の形式が16ビットか8ビットか。</param>\n\t\tpublic static void FilteringRawData(byte[] data, Monaural1SampleFilter filter, bool is16bit)\n\t\t{\n\t\t\tunsafe\n\t\t\t{\n\t\t\t\tfixed(byte* begin = data)\n\t\t\t\t{\n\t\t\t\t\tif(is16bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tshort* end = (short*)(begin + (data.Length & (~1)));\n\t\t\t\t\t\tfor(short* p = (short*)begin; p != (short*)end; ++p)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfilter(ref *p);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbyte* end = begin + data.Length;\n\t\t\t\t\t\tfor(byte* p = begin; p != end; ++p)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tshort l = BiasedByteToShort(*p);\n\t\t\t\t\t\t\tfilter(ref l);\n\t\t\t\t\t\t\t*p = ClipToByte(l);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Wave/Wave.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace SoundLibrary.Wave\n{\n\t/// <summary>\n\t/// WaveReader/WaveWriter で使う例外クラス。\n\t/// </summary>\n\tpublic class WaveException : Exception\n\t{\n\t\tpublic WaveException(){}\n\t\tpublic WaveException(string message) : base(message) {}\n\t\tpublic WaveException(string message, Exception innerException) : base(message, innerException) {}\n\t}\n\n\t/// <summary>\n\t/// Wave ファイルのフォーマットヘッダ。\n\t/// </summary>\n\t[StructLayout(LayoutKind.Sequential, Pack=1)]\n\tpublic struct FormatHeader\n\t{\n\t\t#region フィールド\n\n\t\tpublic short id;         // データ形式\n\t\tpublic short ch;         // チャネル数\n\t\tpublic int   sampleRate; // サンプリングレート\n\t\tpublic int   dataRate;   // データレート(＝チャネル数×ブロックサイズ)\n\t\tpublic short blockSize;  // ブロックサイズ(＝チャネル数×バイト/チャネル)\n\t\tpublic short sampleBit;  // 1サンプル辺りのビット数\n\n\t\tpublic const bool Stereo = true;\n\t\tpublic const bool Mono   = false;\n\t\tpublic const bool Bit16 = true;\n\t\tpublic const bool Bit8  = false;\n\n\t\t#endregion\n\t\t#region コンストラクタ\n\n\t\t/// <summary>\n\t\t/// サンプリングレート等のパラメータからヘッダ作成。\n\t\t/// </summary>\n\t\t/// <param name=\"rate\">サンプリングレート</param>\n\t\t/// <param name=\"stereo\">true ならステレオ、false ならモノラル</param>\n\t\t/// <param name=\"type\">true なら16bit/sample、false なら8bit/sample</param>\n\t\tpublic FormatHeader(int rate, bool stereo, bool type)\n\t\t{\n\t\t\tthis.id         = 1;\n\t\t\tthis.ch         = stereo ? (short)2 : (short)1;\n\t\t\tthis.sampleRate = rate;\n\t\t\tthis.blockSize  = (short)(this.ch * (type ? 2 : 1));\n\t\t\tthis.dataRate   = rate * this.blockSize;\n\t\t\tthis.sampleBit  = type ? (short)16 : (short)8;\n\t\t}\n\n\t\t#endregion\n\t\t#region プロパティ\n\n\t\t/// <summary>\n\t\t/// サンプルレート。\n\t\t/// </summary>\n\t\tpublic int Rate\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.sampleRate = value;\n\t\t\t\tthis.dataRate = value * this.blockSize;\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.sampleRate;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// サンプルビットが16ビットかどうか。\n\t\t/// </summary>\n\t\tpublic bool Is16Bit\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.blockSize  = (short)(this.ch * (value ? 2 : 1));\n\t\t\t\tthis.sampleBit  = value ? (short)16 : (short)8;\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.sampleBit == 16;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// チャネルがステレオかどうか。\n\t\t/// </summary>\n\t\tpublic bool IsStereo\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.ch = value ? (short)2 : (short)1;\n\t\t\t\tthis.blockSize = (short)(this.sampleBit / 8 * this.ch);\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.ch == 2;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t}//class FormatHeader\n}//namespace Wave\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Wave/WaveReader.cs",
    "content": "﻿using System;\nusing System.IO;\n\nnamespace SoundLibrary.Wave\n{\n\t/// <summary>\n\t/// RIFF Wave 形式のファイルから音声データを読み出す。\n\t/// </summary>\n\tpublic class WaveReader : IDisposable\n\t{\n\t\tBinaryReader reader;\n\t\tFormatHeader header;\n\t\tuint dataLength = 0;\n\n\t\tpublic WaveReader(){}\n\n\t\t/// <summary>\n\t\t/// ファイル名を指定して開く。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">Wave ファイル名</param>\n\t\tpublic WaveReader(string filename)\n\t\t{\n\t\t\tthis.Open(filename);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ストリームから開く。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元ストリーム</param>\n\t\tpublic WaveReader(BinaryReader reader)\n\t\t{\n\t\t\tthis.Open(reader);\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tthis.Close();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave ファイルストリームからヘッダを読み出す。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元のストリーム</param>\n\t\t/// <returns>読み出したヘッダ</returns>\n\t\tpublic static FormatHeader ReadHeader(BinaryReader reader)\n\t\t{\n\t\t\tbyte[] buf;\n\n\t\t\tbuf= reader.ReadBytes(4);\n\n\t\t\tif(!Util.Equal(buf, Util.RIFF))\n\t\t\t{\n\t\t\t\tthrow new WaveException(\"このファイルはRIFF形式ではありません。\");\n\t\t\t}\n\n\t\t\treader.ReadBytes(4); //ファイルサイズ読み飛ばし。\n\n\t\t\tbuf= reader.ReadBytes(4);\n\t\t\tif(!Util.Equal(buf, Util.WAVE))\n\t\t\t{\n\t\t\t\tthrow new WaveException(\"このファイルはwave形式ではありません。\");\n\t\t\t}\n\n\t\t\t// fmt chunk 読み出し\n\t\t\tFormatHeader header;\n\t\t\twhile(true)\n\t\t\t{\n\t\t\t\tbuf = reader.ReadBytes(4);\n\t\t\t\tint length = reader.ReadInt32();\n\t\t\t\tbyte[] data = reader.ReadBytes(length);\n\n\t\t\t\tif(length < 16)\n\t\t\t\t{\n\t\t\t\t\tthrow new WaveException(\"ヘッダ長が短すぎます。\");\n\t\t\t\t}\n\t\t\t\tif(Util.Equal(buf, Util.FMT))\n\t\t\t\t{\n\t\t\t\t\tunsafe\n\t\t\t\t\t{\n\t\t\t\t\t\tfixed(byte* p= data)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\theader = *(FormatHeader*)p;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn header;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave ファイルストリームからデータチャンクを探す。\n\t\t/// fmt chunk よりも data chunk が後ろにあると言う前提で、\n\t\t/// ReadHeader の後に呼び出す。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元のストリーム</param>\n\t\t/// <returns>データチャンクサイズ(バイト数)</returns>\n\t\tpublic static int ReadDataChunk(BinaryReader reader)\n\t\t{\n\t\t\tint length = 0;\n\n\t\t\twhile(true)\n\t\t\t{\n\t\t\t\tbyte[] buf = reader.ReadBytes(4);\n\t\t\t\tlength = reader.ReadInt32();\n\n\t\t\t\tif(length < 16)\n\t\t\t\t{\n\t\t\t\t\tthrow new WaveException(\"ヘッダ長が短すぎます。\");\n\t\t\t\t}\n\t\t\t\tif(Util.Equal(buf, Util.DATA))\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\treader.ReadBytes(length);\n\t\t\t}\n\t\t\treturn length;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave の生データをそのまま読み出す。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元</param>\n\t\t/// <param name=\"data\">読み出し先</param>\n\t\t/// <returns>読み出したデータ</returns>\n\t\tpublic static int ReadRawData(BinaryReader reader, byte[] data)\n\t\t{\n\t\t\treturn ReadRawData(reader, data, 0, data.Length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave の生データをそのまま読み出す。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元</param>\n\t\t/// <param name=\"data\">読み出し先</param>\n\t\t/// <param name=\"offset\">読み出し先の開始地点</param>\n\t\t/// <returns>実際読み出したデータの長さ</returns>\n\t\tpublic static int ReadRawData(BinaryReader reader, byte[] data, int offset)\n\t\t{\n\t\t\treturn ReadRawData(reader, data, offset, data.Length - offset);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave の生データをそのまま読み出す。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元</param>\n\t\t/// <param name=\"data\">読み出し先</param>\n\t\t/// <param name=\"offset\">読み出し先の開始地点</param>\n\t\t/// <param name=\"length\">読み出す長さ(バイト数)</param>\n\t\t/// <returns>実際読み出したデータの長さ</returns>\n\t\tpublic static int ReadRawData(BinaryReader reader, byte[] data, int offset, int length)\n\t\t{\n\t\t\treturn reader.Read(data, offset, length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave の生データをそのまま読み出す。\n\t\t/// </summary>\n\t\t/// <param name=\"data\">読込先</param>\n\t\t/// <param name=\"offset\">読込先の開始オフセット(バイト数)</param>\n\t\t/// <param name=\"length\">読み出す長さ(バイト数)</param>\n\t\t/// <returns>実際に読み込んだ長さ(バイト数)</returns>\n\t\tpublic int ReadRawData(byte[] data, int offset, int length)\n\t\t{\n\t\t\tif(this.dataLength * this.header.blockSize < length)\n\t\t\t\tlength = (int)(this.dataLength * this.header.blockSize);\n\n\t\t\tlength = WaveReader.ReadRawData(this.reader, data, offset, length);\n\t\t\tthis.dataLength -= (uint)(length / this.header.blockSize);\n\t\t\treturn length;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave の生データをそのまま読み出す。\n\t\t/// </summary>\n\t\t/// <param name=\"data\">データ格納先</param>\n\t\t/// <returns>読み込んだ長さ(サンプル数)</returns>\n\t\tpublic int ReadRawData(byte[] data)\n\t\t{\n\t\t\treturn this.ReadRawData(data, 0, data.Length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元ストリーム</param>\n\t\t/// <param name=\"header\">Wave ヘッダ</param>\n\t\t/// <param name=\"length\">読み出したい長さ</param>\n\t\t/// <param name=\"l\">読み出し先配列(L ch)</param>\n\t\t/// <param name=\"r\">読み出し先配列(R ch)</param>\n\t\t/// <returns>読み出したデータサンプル数</returns>\n\t\tpublic static int Read(BinaryReader reader, FormatHeader header, double[]l, double[] r)\n\t\t{\n\t\t\tuint length = (uint)l.Length;\n\n\t\t\tint i = 0;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif(!header.IsStereo) // モノラル\n\t\t\t\t{\n\t\t\t\t\tif(!header.Is16Bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (double)(reader.ReadByte() - 128);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (double)reader.ReadInt16();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse //ステレオ\n\t\t\t\t{\n\t\t\t\t\tif(!header.Is16Bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (double)(reader.ReadByte() - 128);\n\t\t\t\t\t\t\tr[i] = (double)(reader.ReadByte() - 128);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (double)reader.ReadInt16();\n\t\t\t\t\t\t\tr[i] = (double)reader.ReadInt16();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//ステレオ\n\t\t\t}\n\t\t\tcatch(EndOfStreamException){}\n\t\t\tcatch(IOException){}\n\n\t\t\treturn i;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元ストリーム</param>\n\t\t/// <param name=\"header\">Wave ヘッダ</param>\n\t\t/// <param name=\"length\">読み出したい長さ</param>\n\t\t/// <param name=\"l\">読み出し先配列(L ch)</param>\n\t\t/// <param name=\"r\">読み出し先配列(R ch)</param>\n\t\t/// <returns>読み出したデータサンプル数</returns>\n\t\tpublic static int Read(BinaryReader reader, FormatHeader header, uint length, out double[]l, out double[] r)\n\t\t{\n\t\t\tif(header.IsStereo)\n\t\t\t{\n\t\t\t\tl = new double[length];\n\t\t\t\tr = new double[length];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tl = new double[length];\n\t\t\t\tr = null;\n\t\t\t}\n\t\t\treturn WaveReader.Read(reader, header, l, r);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元ストリーム</param>\n\t\t/// <param name=\"header\">Wave ヘッダ</param>\n\t\t/// <param name=\"length\">読み出したい長さ</param>\n\t\t/// <param name=\"l\">読み出し先配列(L ch)</param>\n\t\t/// <param name=\"r\">読み出し先配列(R ch)</param>\n\t\t/// <returns>読み出したデータサンプル数</returns>\n\t\tpublic static int Read(BinaryReader reader, FormatHeader header, float[]l, float[] r)\n\t\t{\n\t\t\tuint length = (uint)l.Length;\n\n\t\t\tint i = 0;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif(!header.IsStereo) // モノラル\n\t\t\t\t{\n\t\t\t\t\tif(!header.Is16Bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (float)(reader.ReadByte() - 128);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (float)reader.ReadInt16();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse //ステレオ\n\t\t\t\t{\n\t\t\t\t\tif(!header.Is16Bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (float)(reader.ReadByte() - 128);\n\t\t\t\t\t\t\tr[i] = (float)(reader.ReadByte() - 128);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (float)reader.ReadInt16();\n\t\t\t\t\t\t\tr[i] = (float)reader.ReadInt16();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//ステレオ\n\t\t\t}\n\t\t\tcatch(EndOfStreamException){}\n\t\t\tcatch(IOException){}\n\n\t\t\treturn i;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元ストリーム</param>\n\t\t/// <param name=\"header\">Wave ヘッダ</param>\n\t\t/// <param name=\"length\">読み出したい長さ</param>\n\t\t/// <param name=\"l\">読み出し先配列(L ch)</param>\n\t\t/// <param name=\"r\">読み出し先配列(R ch)</param>\n\t\t/// <returns>読み出したデータサンプル数</returns>\n\t\tpublic static int Read(BinaryReader reader, FormatHeader header, uint length, out float[]l, out float[] r)\n\t\t{\n\t\t\tif(header.IsStereo)\n\t\t\t{\n\t\t\t\tl = new float[length];\n\t\t\t\tr = new float[length];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tl = new float[length];\n\t\t\t\tr = null;\n\t\t\t}\n\t\t\treturn WaveReader.Read(reader, header, l, r);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元ストリーム</param>\n\t\t/// <param name=\"header\">Wave ヘッダ</param>\n\t\t/// <param name=\"length\">読み出したい長さ</param>\n\t\t/// <param name=\"l\">読み出し先配列(L ch)</param>\n\t\t/// <param name=\"r\">読み出し先配列(R ch)</param>\n\t\t/// <returns>読み出したデータサンプル数</returns>\n\t\tpublic static int Read(BinaryReader reader, FormatHeader header, short[]l, short[] r)\n\t\t{\n\t\t\tuint length = (uint)l.Length;\n\n\t\t\tint i = 0;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif(!header.IsStereo) // モノラル\n\t\t\t\t{\n\t\t\t\t\tif(!header.Is16Bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (short)(reader.ReadByte() - 128);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (short)reader.ReadInt16();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse //ステレオ\n\t\t\t\t{\n\t\t\t\t\tif(!header.Is16Bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (short)(reader.ReadByte() - 128);\n\t\t\t\t\t\t\tr[i] = (short)(reader.ReadByte() - 128);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (short)reader.ReadInt16();\n\t\t\t\t\t\t\tr[i] = (short)reader.ReadInt16();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//ステレオ\n\t\t\t}\n\t\t\tcatch(EndOfStreamException){}\n\t\t\tcatch(IOException){}\n\n\t\t\treturn i;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元ストリーム</param>\n\t\t/// <param name=\"header\">Wave ヘッダ</param>\n\t\t/// <param name=\"length\">読み出したい長さ</param>\n\t\t/// <param name=\"l\">読み出し先配列(L ch)</param>\n\t\t/// <param name=\"r\">読み出し先配列(R ch)</param>\n\t\t/// <returns>読み出したデータサンプル数</returns>\n\t\tpublic static int Read(BinaryReader reader, FormatHeader header, uint length, out short[]l, out short[] r)\n\t\t{\n\t\t\tif(header.IsStereo)\n\t\t\t{\n\t\t\t\tl = new short[length];\n\t\t\t\tr = new short[length];\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tl = new short[length];\n\t\t\t\tr = null;\n\t\t\t}\n\t\t\treturn WaveReader.Read(reader, header, l, r);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ読み飛ばし。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">読み出し元ストリーム</param>\n\t\t/// <param name=\"header\">Wave ヘッダ</param>\n\t\t/// <param name=\"length\">読み出したい長さ</param>\n\t\t/// <returns>ストリームの最後まで達した場合は false</returns>\n\t\tpublic static bool Skip(BinaryReader reader, FormatHeader header, int length)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\tint readSize;\n\t\t\t\tif(!header.IsStereo) // モノラル\n\t\t\t\t\tif(!header.Is16Bit) readSize = length;\n\t\t\t\t\telse         readSize = length * 2;\n\t\t\t\telse          // ステレオ\n\t\t\t\t\tif(!header.Is16Bit) readSize = length * 2;\n\t\t\t\telse         readSize = length * 4;\n\t\t\t\treader.ReadBytes(readSize);\n\t\t\t}\n\t\t\tcatch(EndOfStreamException)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave ファイルを開く。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">Wave ファイル名</param>\n\t\tpublic void Open(string filename)\n\t\t{\n\t\t\tOpen(new BinaryReader(new BufferedStream(File.OpenRead(filename))));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave ファイルを開く。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">Wave ファイルを格納したストリーム</param>\n\t\tpublic void Open(BinaryReader reader)\n\t\t{\n\t\t\tif(this.reader != null)\n\t\t\t{\n\t\t\t\tthis.reader.Close();\n\t\t\t}\n\n\t\t\tthis.reader = reader;\n\n\t\t\t// ヘッダ読み出し\n\t\t\tthis.header = WaveReader.ReadHeader(reader);\n\n\t\t\tif(this.header.id != 0x0001)\n\t\t\t{\n\t\t\t\tthrow new WaveException(\"対応していないフォーマットです。\");\n\t\t\t}\n\n\t\t\t// data chunk 読み出し\n\t\t\tint length = ReadDataChunk(reader);\n\t\t\tthis.dataLength = (uint)(length / this.header.blockSize);\n\t\t}//Open\n\n\t\t/// <summary>\n\t\t/// Wave ファイルを閉じる。\n\t\t/// </summary>\n\t\tpublic void Close()\n\t\t{\n\t\t\tif(this.reader != null)\n\t\t\t{\n\t\t\t\tthis.reader.Close();\n\t\t\t\tthis.reader = null;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ヘッダ情報の取得。\n\t\t/// </summary>\n\t\tpublic FormatHeader Header\n\t\t{\n\t\t\tget{return this.header;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 残りのデータ長を帰す。\n\t\t/// </summary>\n\t\tpublic uint Length\n\t\t{\n\t\t\tget{return this.dataLength;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データの読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"l\">左チャネルのデータ格納先。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ格納先。</param>\n\t\t/// <returns>実際に読み出したサンプル数。</returns>\n\t\tpublic int Read(double[] l, double[] r)\n\t\t{\n\t\t\tuint length = (uint)l.Length;\n\t\t\tint i = WaveReader.Read(this.reader, this.header, l, r);\n\t\t\tthis.dataLength -= (uint)i;\n\t\t\treturn i;\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// データの読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"l\">左チャネルのデータ格納先。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ格納先。</param>\n\t\t/// <returns>実際に読み出したサンプル数。</returns>\n\t\tpublic int Read(float[] l, float[] r)\n\t\t{\n\t\t\tuint length = (uint)l.Length;\n\t\t\tint i = WaveReader.Read(this.reader, this.header, l, r);\n\t\t\tthis.dataLength -= (uint)i;\n\t\t\treturn i;\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// データの読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"l\">左チャネルのデータ格納先。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ格納先。</param>\n\t\t/// <returns>実際に読み出したサンプル数。</returns>\n\t\tpublic int Read(short[] l, short[] r)\n\t\t{\n\t\t\tuint length = (uint)l.Length;\n\t\t\tint i = WaveReader.Read(this.reader, this.header, l, r);\n\t\t\tthis.dataLength -= (uint)i;\n\t\t\treturn i;\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// データの読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">読み出すサンプル数。</param>\n\t\t/// <param name=\"l\">左チャネルのデータ格納先。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ格納先。</param>\n\t\t/// <returns>実際に読み出したサンプル数。</returns>\n\t\tpublic int Read(uint length, out double[] l, out double[] r)\n\t\t{\n\t\t\tl = null;\n\t\t\tr = null;\n\t\t\tif(this.reader == null) return 0;\n\n\t\t\tint i = WaveReader.Read(this.reader, this.header, length, out l, out r);\n\t\t\tthis.dataLength -= (uint)i;\n\t\t\treturn i;\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// データの読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">読み出すサンプル数。</param>\n\t\t/// <param name=\"l\">左チャネルのデータ格納先。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ格納先。</param>\n\t\t/// <returns>実際に読み出したサンプル数。</returns>\n\t\tpublic int Read(uint length, out float[] l, out float[] r)\n\t\t{\n\t\t\tl = null;\n\t\t\tr = null;\n\t\t\tif(this.reader == null) return 0;\n\n\t\t\tint i = WaveReader.Read(this.reader, this.header, length, out l, out r);\n\t\t\tthis.dataLength -= (uint)i;\n\t\t\treturn i;\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// データの読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">読み出すサンプル数。</param>\n\t\t/// <param name=\"l\">左チャネルのデータ格納先。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ格納先。</param>\n\t\t/// <returns>実際に読み出したサンプル数。</returns>\n\t\tpublic int Read(uint length, out short[] l, out short[] r)\n\t\t{\n\t\t\tl = null;\n\t\t\tr = null;\n\t\t\tif(this.reader == null) return 0;\n\n\t\t\tint i = WaveReader.Read(this.reader, this.header, length, out l, out r);\n\t\t\tthis.dataLength -= (uint)i;\n\t\t\treturn i;\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// データを読み飛ばす。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">読み飛ばす長さ</param>\n\t\t/// <returns>ファイルの末尾まで到達したら false を返す</returns>\n\t\tpublic bool Skip(int length)\n\t\t{\n\t\t\tif(this.reader == null) return false;\n\n\t\t\tif(!WaveReader.Skip(this.reader, this.header, length))\n\t\t\t{\n\t\t\t\tthis.dataLength = 0;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.dataLength -= (uint)length;\n\t\t\treturn true;\n\t\t}//Skip\n\n\t\t/// <summary>\n\t\t/// ウェーブデータの先頭に戻る。\n\t\t/// </summary>\n\t\tpublic void Restart()\n\t\t{\n\t\t\tthis.reader.BaseStream.Seek(0, SeekOrigin.Begin);\n\t\t\tWaveReader.ReadDataChunk(this.reader);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 1サンプル読み出す。\n\t\t/// モノラル16ビット以外の場合、サポート対象外。\n\t\t/// </summary>\n\t\t/// <returns>1サンプル分のデータ</returns>\n\t\tpublic short ReadShort()\n\t\t{\n\t\t\tif(!this.header.Is16Bit || this.header.IsStereo)\n\t\t\t\treturn 0;\n\n\t\t\tshort data = this.reader.ReadInt16();\n\t\t\t--this.dataLength;\n\t\t\treturn data;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 1サンプル読み出す。\n\t\t/// モノラル16ビット以外の場合、サポート対象外。\n\t\t/// </summary>\n\t\t/// <returns>1サンプル分のデータ</returns>\n\t\tpublic void ReadShort(out short l, out short r)\n\t\t{\n\t\t\tSystem.Diagnostics.Debug.Assert(this.header.Is16Bit);\n\n\t\t\tif(this.header.IsStereo)\n\t\t\t{\n\t\t\t\tl = this.reader.ReadInt16();\n\t\t\t\tr = this.reader.ReadInt16();\n\t\t\t\t--this.dataLength;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tl = this.reader.ReadInt16();\n\t\t\t\tr = 0;\n\t\t\t\t--this.dataLength;\n\t\t\t}\n\t\t}\n\t}//class WaveReader\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Wave/WaveWriter.cs",
    "content": "﻿using System;\nusing System.IO;\n\nnamespace SoundLibrary.Wave\n{\n\t/// <summary>\n\t/// RIFF Wave 形式のファイルに音声データを書き込む。\n\t/// </summary>\n\tpublic class WaveWriter : IDisposable\n\t{\n\t\tBinaryWriter writer;\n\t\tFormatHeader header;\n\t\tuint dataLength = 0;\n\n\t\tpublic WaveWriter(){}\n\n\t\t/// <summary>\n\t\t/// ファイル名を指定して開く。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">書き込み先 Wave ファイル名</param>\n\t\t/// <param name=\"header\">Wave のヘッダ</param>\n\t\tpublic WaveWriter(string filename, FormatHeader header)\n\t\t{\n\t\t\tthis.Open(filename, header);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ストリームに書き込む。\n\t\t/// </summary>\n\t\t/// <param name=\"writer\">書き込み先ストリーム</param>\n\t\t/// <param name=\"header\">Wave のヘッダ</param>\n\t\tpublic WaveWriter(BinaryWriter writer, FormatHeader header)\n\t\t{\n\t\t\tthis.Open(writer, header);\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tthis.Close();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave ファイルを開く。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">Wave ファイル名</param>\n\t\tpublic void Open(string filename, FormatHeader header)\n\t\t{\n\t\t\tOpen(new BinaryWriter(new BufferedStream(File.Create(filename))), header);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave ヘッダ(RIFF, fmt chunk, data chunk のデータ長まで)をストリームに書き出す。\n\t\t/// </summary>\n\t\t/// <param name=\"writer\">書き込み先ストリーム</param>\n\t\t/// <param name=\"header\">Wave のヘッダ</param>\n\t\t/// <param name=\"length\">データ長(サンプル数)</param>\n\t\tpublic static void WriteHeader(BinaryWriter writer, FormatHeader header, int length)\n\t\t{\n\t\t\tbyte[] buf;\n\n\t\t\tlength *= header.blockSize;\n\n\t\t\twriter.Write(Util.RIFF);\n\t\t\twriter.Write((uint)length + 36u);\n\t\t\twriter.Write(Util.WAVE);\n\t\t\twriter.Write(Util.FMT);\n\t\t\twriter.Write((uint)16);\n\n\t\t\tunsafe\n\t\t\t{\n\t\t\t\tbuf = new byte[16];\n\t\t\t\tfixed(byte* p = buf)\n\t\t\t\t{\n\t\t\t\t\t*(FormatHeader*)p = header;\n\t\t\t\t}\n\t\t\t}\n\t\t\twriter.Write(buf);\n\t\t\twriter.Write(Util.DATA);\n\t\t\twriter.Write((uint)length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ヘッダのデータ長の部分を修正する。\n\t\t/// </summary>\n\t\t/// <param name=\"writer\">書き込み先ストリーム</param>\n\t\t/// <param name=\"length\">修正後のデータ長(サンプル数)</param>\n\t\t/// <param name=\"blockSize\">ブロックサイズ</param>\n\t\tpublic static void ModifyHeader(BinaryWriter writer, int length, int blockSize)\n\t\t{\n\t\t\tlength = length * blockSize;\n\n\t\t\twriter.Seek(4, SeekOrigin.Begin);\n\t\t\twriter.Write((uint)length + 36u);\n\n\t\t\twriter.Seek(40, SeekOrigin.Begin);\n\t\t\twriter.Write((uint)length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ書き出し。\n\t\t/// </summary>\n\t\t/// <param name=\"writer\">書き込み先ストリーム</param>\n\t\t/// <param name=\"header\">Wave ヘッダ</param>\n\t\t/// <param name=\"l\">書き込みたいデータ(L ch)</param>\n\t\t/// <param name=\"r\">書き込みたいデータ(R ch)</param>\n\t\t/// <returns></returns>\n\t\tpublic static int Write(BinaryWriter writer, FormatHeader header, double[] l, double[] r)\n\t\t{\n\t\t\tint i = 0;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tint length = l.Length;\n\n\t\t\t\tif(!header.IsStereo) // モノラル\n\t\t\t\t{\n\t\t\t\t\tif(!header.Is16Bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(Util.ClipToByte(l[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(Util.ClipToShort(l[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse // ステレオ\n\t\t\t\t{\n\t\t\t\t\tif(!header.Is16Bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(Util.ClipToByte(l[i]));\n\t\t\t\t\t\t\twriter.Write(Util.ClipToByte(r[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(Util.ClipToShort(l[i]));\n\t\t\t\t\t\t\twriter.Write(Util.ClipToShort(r[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//ステレオ\n\t\t\t}\n\t\t\tcatch(IOException){return 0;}\n\t\t\treturn i;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ書き出し。\n\t\t/// </summary>\n\t\t/// <param name=\"writer\">書き込み先ストリーム</param>\n\t\t/// <param name=\"header\">Wave ヘッダ</param>\n\t\t/// <param name=\"l\">書き込みたいデータ(L ch)</param>\n\t\t/// <param name=\"r\">書き込みたいデータ(R ch)</param>\n\t\t/// <returns></returns>\n\t\tpublic static int Write(BinaryWriter writer, FormatHeader header, float[] l, float[] r)\n\t\t{\n\t\t\tint i = 0;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tint length = l.Length;\n\n\t\t\t\tif(!header.IsStereo) // モノラル\n\t\t\t\t{\n\t\t\t\t\tif(!header.Is16Bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(Util.ClipToByte(l[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(Util.ClipToShort(l[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse // ステレオ\n\t\t\t\t{\n\t\t\t\t\tif(!header.Is16Bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(Util.ClipToByte(l[i]));\n\t\t\t\t\t\t\twriter.Write(Util.ClipToByte(r[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(Util.ClipToShort(l[i]));\n\t\t\t\t\t\t\twriter.Write(Util.ClipToShort(r[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//ステレオ\n\t\t\t}\n\t\t\tcatch(IOException){return 0;}\n\t\t\treturn i;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ書き出し。\n\t\t/// </summary>\n\t\t/// <param name=\"writer\">書き込み先ストリーム</param>\n\t\t/// <param name=\"header\">Wave ヘッダ</param>\n\t\t/// <param name=\"l\">書き込みたいデータ(L ch)</param>\n\t\t/// <param name=\"r\">書き込みたいデータ(R ch)</param>\n\t\t/// <returns></returns>\n\t\tpublic static int Write(BinaryWriter writer, FormatHeader header, short[] l, short[] r)\n\t\t{\n\t\t\tint i = 0;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tint length = l.Length;\n\n\t\t\t\tif(!header.IsStereo) // モノラル\n\t\t\t\t{\n\t\t\t\t\tif(!header.Is16Bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(Util.ClipToByte(l[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(Util.ClipToShort(l[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse // ステレオ\n\t\t\t\t{\n\t\t\t\t\tif(!header.Is16Bit)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(Util.ClipToByte(l[i]));\n\t\t\t\t\t\t\twriter.Write(Util.ClipToByte(r[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(Util.ClipToShort(l[i]));\n\t\t\t\t\t\t\twriter.Write(Util.ClipToShort(r[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//ステレオ\n\t\t\t}\n\t\t\tcatch(IOException){return 0;}\n\t\t\treturn i;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave ファイルを開く。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">Wave ファイルを格納したストリーム</param>\n\t\tpublic void Open(BinaryWriter writer, FormatHeader header)\n\t\t{\n\t\t\tif(this.writer != null)\n\t\t\t{\n\t\t\t\tthis.writer.Close();\n\t\t\t}\n\n\t\t\tthis.writer = writer;\n\t\t\tthis.header = header;\n\n\t\t\tWaveWriter.WriteHeader(writer, header, 0); // データ長は仮に0を入れておく。\n\t\t}//Open\n\n\t\t/// <summary>\n\t\t/// Wave ファイルを閉じる。\n\t\t/// </summary>\n\t\tpublic void Close()\n\t\t{\n\t\t\tif(writer == null) return;\n\n\t\t\tWaveWriter.ModifyHeader(this.writer, (int)this.dataLength, this.header.blockSize);\n\n\t\t\twriter.Close();\n\t\t\twriter = null;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データの書き込み。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">書き込むサンプル数。</param>\n\t\t/// <param name=\"l\">左チャネルのデータ。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ。</param>\n\t\t/// <returns>実際に書き込んだサンプル数。</returns>\n\t\tpublic int Write(double[] l, double[] r)\n\t\t{\n\t\t\tif(this.writer == null) return 0;\n\n\t\t\tuint length = (uint)l.Length;\n\t\t\tint i = WaveWriter.Write(this.writer, this.header, l, r);\n\n\t\t\tthis.dataLength += (uint)i;\n\t\t\treturn i;\n\t\t}//Write\n\n\t\t/// <summary>\n\t\t/// データの書き込み。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">書き込むサンプル数。</param>\n\t\t/// <param name=\"l\">左チャネルのデータ。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ。</param>\n\t\t/// <returns>実際に書き込んだサンプル数。</returns>\n\t\tpublic int Write(float[] l, float[] r)\n\t\t{\n\t\t\tif(this.writer == null) return 0;\n\n\t\t\tuint length = (uint)l.Length;\n\t\t\tint i = WaveWriter.Write(this.writer, this.header, l, r);\n\t\n\t\t\tthis.dataLength += (uint)i;\n\t\t\treturn i;\n\t\t}//Write\n\n\t\t/// <summary>\n\t\t/// データの書き込み。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">書き込むサンプル数。</param>\n\t\t/// <param name=\"l\">左チャネルのデータ。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ。</param>\n\t\t/// <returns>実際に書き込んだサンプル数。</returns>\n\t\tpublic int Write(short[] l, short[] r)\n\t\t{\n\t\t\tif(this.writer == null) return 0;\n\n\t\t\tuint length = (uint)l.Length;\n\t\t\tint i = WaveWriter.Write(this.writer, this.header, l, r);\n\t\n\t\t\tthis.dataLength += (uint)i;\n\t\t\treturn i;\n\t\t}//Write\n\n\t\t/// <summary>\n\t\t/// Wave の生データをそのまま書き込む。\n\t\t/// </summary>\n\t\t/// <param name=\"writer\">書き込み先</param>\n\t\t/// <param name=\"data\">書き込むデータ</param>\n\t\tpublic static void WriteRawData(BinaryWriter writer, byte[] data)\n\t\t{\n\t\t\twriter.Write(data);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave の生データをそのまま書き込む。\n\t\t/// </summary>\n\t\t/// <param name=\"writer\">書き込み先</param>\n\t\t/// <param name=\"data\">書き込むデータ</param>\n\t\t/// <param name=\"length\">書き込む長さ(バイト数)</param>\n\t\tpublic static void WriteRawData(BinaryWriter writer, byte[] data, int length)\n\t\t{\n\t\t\twriter.Write(data, 0, length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave の生データをそのまま書き込む。\n\t\t/// </summary>\n\t\t/// <param name=\"data\">書き込むデータ</param>\n\t\tpublic void WriteRawData(byte[] data)\n\t\t{\n\t\t\tthis.WriteRawData(data, data.Length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave の生データをそのまま書き込む。\n\t\t/// </summary>\n\t\t/// <param name=\"data\">書き込むデータ</param>\n\t\t/// <param name=\"length\">書き込む長さ(バイト数)</param>\n\t\tpublic void WriteRawData(byte[] data, int length)\n\t\t{\n\t\t\tWaveWriter.WriteRawData(this.writer, data, length);\n\t\t\tthis.dataLength += (uint)(length / this.header.blockSize);\n\t\t}\n\n\t\tpublic uint Length\n\t\t{\n\t\t\tget{return this.dataLength;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 1サンプル読み出す。\n\t\t/// モノラル16ビット以外の場合、サポート対象外。\n\t\t/// </summary>\n\t\t/// <param name=\"data\">1サンプル分のデータ</param>\n\t\tpublic void WriteShort(short data)\n\t\t{\n\t\t\tif(!this.header.Is16Bit || this.header.IsStereo)\n\t\t\t\treturn;\n\n\t\t\tthis.writer.Write(data);\n\t\t\t++this.dataLength;\n\t\t}\n\n\t\tpublic void WriteShort(short l, short r)\n\t\t{\n\t\t\tSystem.Diagnostics.Debug.Assert(this.header.Is16Bit);\n\n\t\t\tif(this.header.IsStereo)\n\t\t\t{\n\t\t\t\tthis.writer.Write(l);\n\t\t\t\tthis.writer.Write(r);\n\t\t\t\t++this.dataLength;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.writer.Write(l);\n\t\t\t\t++this.dataLength;\n\t\t\t}\n\t\t}\n\t}//class WaveWriter\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/Wave/readme.txt",
    "content": "//==============================================================================\n// Wave ǂݏCu\n\nCopyright(C) 2003 Iwanaga Nobuyuki\ne-mail   : iwanaga@ise.eng.osaka-u.ac.jp\nweb page : http://www-ise2.ise.eng.osaka-u.ac.jp/~iwanaga/\n\n//----------------------------------------------------------\n// Tv\n\nWave `̉f[^ǂݏ邽߂̃CuB\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/WaveAnalysis/DataList.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Text;\nusing System.Collections;\n\nnamespace SoundLibrary.WaveAnalysis\n{\n\t/// <summary>\n\t/// データリストの項目。\n\t/// </summary>\n\tpublic class DataItem\n\t{\n\t\tpublic string title;\n\t\tpublic double[] data;\n\n\t\tpublic DataItem(string title, double[] data)\n\t\t{\n\t\t\tthis.title = title;\n\t\t\tthis.data = data;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// 特性データのリスト。\n\t/// </summary>\n\tpublic class DataList\n\t{\n\t\tArrayList list = new ArrayList();\n\t\tint count = -1;\n\n\t\t/// <summary>\n\t\t/// 項目の追加\n\t\t/// </summary>\n\t\t/// <param name=\"title\">項目名</param>\n\t\t/// <param name=\"data\">データ</param>\n\t\tpublic void Add(string title, double[] data)\n\t\t{\n\t\t\tif(this.count == -1) this.count = data.Length;\n\t\t\telse if(this.count != data.Length) return;\n\n\t\t\tlist.Add(new DataItem(title, data));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データリストを CSV 形式でファイルに保存。\n\t\t/// </summary>\n\t\t/// <param name=\"writer\">書き込み先</param>\n\t\t/// <param name=\"delim\">区切り文字</param>\n\t\t/// <param name=\"outputTitle\">ヘッダ行を出力するかどうか</param>\n\t\tpublic void Save(StreamWriter writer, char delim, bool outputTitle)\n\t\t{\n\t\t\tif(this.count == -1) return;\n\n\t\t\tif(outputTitle)\n\t\t\t{\n\t\t\t\tint i=0;\n\t\t\t\tfor(; i<list.Count-1; ++i)\n\t\t\t\t{\n\t\t\t\t\twriter.Write(\"{0}{1}\", ((DataItem)this.list[i]).title, delim);\n\t\t\t\t}\n\t\t\t\twriter.Write(\"{0}\\n\", ((DataItem)this.list[i]).title);\n\t\t\t}\n\n\t\t\tfor(int j=0; j<this.count; ++j)\n\t\t\t{\n\t\t\t\tint i=0;\n\t\t\t\tfor(; i<list.Count-1; ++i)\n\t\t\t\t{\n\t\t\t\t\twriter.Write(\"{0}{1}\", ((DataItem)this.list[i]).data[j], delim);\n\t\t\t\t}\n\t\t\t\twriter.Write(\"{0}\\n\", ((DataItem)this.list[i]).data[j]);\n\t\t\t}\n\t\t}//Save\n\n\t\t/// <summary>\n\t\t/// データリストを CSV 形式でファイルに保存。\n\t\t/// </summary>\n\t\t/// <param name=\"writer\">書き込み先</param>\n\t\t/// <param name=\"delim\">区切り文字</param>\n\t\tpublic void Save(StreamWriter writer, char delim)\n\t\t{\n\t\t\tthis.Save(writer, delim, false);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データリストを CSV 形式でファイルに保存。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">出力ファイル名</param>\n\t\t/// <param name=\"delim\">区切り文字</param>\n\t\t/// <param name=\"outputTitle\">ヘッダ行を出力するかどうか</param>\n\t\tpublic void Save(string filename, char delim, bool outputHeader)\n\t\t{\n\t\t\tusing(StreamWriter writer = new StreamWriter(filename, false, Encoding.Default))\n\t\t\t{\n\t\t\t\tthis.Save(writer, delim, outputHeader);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データリストを CSV 形式でファイルに保存。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">出力ファイル名</param>\n\t\t/// <param name=\"delim\">区切り文字</param>\n\t\tpublic void Save(string filename, char delim)\n\t\t{\n\t\t\tthis.Save(filename, delim, false);\n\t\t}\n\t}//class DataList\n}//namespace WaveAnalysis\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/WaveAnalysis/WaveAnalyzer.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.SpectrumAnalysis;\nusing SoundLibrary.Wave;\n\nnamespace SoundLibrary.WaveAnalysis\n{\n\t/// <summary>\n\t/// Wave ファイル解析用クラス。\n\t/// </summary>\n\tpublic class WaveAnalyzer\n\t{\n\t\tWaveData data = new WaveTime(); // データ音\n\n\t\t/// <summary>\n\t\t/// データ Wave の取得\n\t\t/// </summary>\n\t\tpublic WaveData Data\n\t\t{\n\t\t\tget{return this.data;}\n\t\t\tset{this.data = value;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列のピーク値を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">配列</param>\n\t\t/// <returns>ピーク値</returns>\n\t\tstatic double GetPeekValue(double[] x)\n\t\t{\n\t\t\tif(x == null) return 0;\n\n\t\t\tdouble peek = 0;\n\t\t\tfor(int i=0; i<x.Length; ++i)\n\t\t\t{\n\t\t\t\tif(Math.Abs(x[i]) > peek) peek = Math.Abs(x[i]);\n\t\t\t}\n\t\t\treturn peek;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 無音区間の長さを求める。\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"x\">配列</param>\n\t\t/// <param name=\"threshold\">閾値</param>\n\t\t/// <returns>区間長</returns>\n\t\tstatic int GetSilentLength(double[] x, double threshold)\n\t\t{\n\t\t\tif(x == null) return int.MaxValue;\n\n\t\t\tint skip;\n\t\t\tfor(skip=0; skip<x.Length; ++skip)\n\t\t\t{\n\t\t\t\tif(Math.Abs(x[skip]) >= threshold) break;\n\t\t\t}\n\t\t\treturn skip;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列をコピー\n\t\t/// </summary>\n\t\t/// <param name=\"src\">コピー元</param>\n\t\t/// <param name=\"index\">コピー開始位置</param>\n\t\t/// <param name=\"length\">コピーする長さ</param>\n\t\t/// <returns></returns>\n\t\tstatic double[] CopyArray(double[] src, int index, int length)\n\t\t{\n\t\t\tdouble[] dst = new double[length];\n\t\t\tfor(int i=0; i<length; ++i) dst[i] = src[i + index];\n\t\t\treturn dst;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列をコピー\n\t\t/// コピー後の配列の長さの方が長い場合、後ろを0詰め\n\t\t/// </summary>\n\t\t/// <param name=\"src\">コピー元</param>\n\t\t/// <param name=\"index\">コピー開始位置</param>\n\t\t/// <param name=\"length\">コピーする長さ</param>\n\t\t/// <param name=\"dstLength\">コピー後の配列の長さ</param>\n\t\t/// <returns></returns>\n\t\tstatic double[] CopyArray(double[] src, int index, int length, int dstLength)\n\t\t{\n\t\t\tif(length > dstLength)\n\t\t\t\treturn CopyArray(src, index, length);\n\n\t\t\tdouble[] dst = new double[dstLength];\n\t\t\tint i;\n\t\t\tfor(i=0; i<length; ++i) dst[i] = src[i + index];\n\t\t\tfor(; i<dstLength; ++i) dst[i] = 0;\n\t\t\treturn dst;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ファイルから Wave データを読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <returns>読み出したデータ</returns>\n\t\tstatic WaveData Read(string filename, int skip, int length)\n\t\t{\n\t\t\tWaveReader reader = null;\n\t\t\tFormatHeader header;\n\t\t\tdouble[] l;\n\t\t\tdouble[] r;\n\n\t\t\tusing(reader = new WaveReader(filename))\n\t\t\t{\n\t\t\t\theader = reader.Header;\n\t\t\t\treader.Skip(skip);\n\t\t\t\treader.Read((uint)length, out l, out r);\n\t\t\t}\n\n\t\t\tif(header.IsStereo)\n\t\t\t\treturn new WaveTime(header, l, r);\n\t\t\treturn new WaveMonaural(header, l);\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// ファイルから Wave データを読み出し。\n\t\t/// (後ろ0詰め)\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <param name=\"dstLength\">コピー後の配列の長さ</param>\n\t\t/// <returns>読み出したデータ</returns>\n\t\tstatic WaveData Read(string filename, int skip, int length, int dstLength)\n\t\t{\n\t\t\tWaveReader reader = null;\n\t\t\tFormatHeader header;\n\t\t\tdouble[] l;\n\t\t\tdouble[] r;\n\n\t\t\tusing(reader = new WaveReader(filename))\n\t\t\t{\n\t\t\t\theader = reader.Header;\n\t\t\t\treader.Skip(skip);\n\t\t\t\treader.Read((uint)length, out l, out r);\n\t\t\t}\n\n\t\t\tif(header.IsStereo)\n\t\t\t\treturn new WaveTime(header, CopyArray(l, 0, length, dstLength), CopyArray(r, 0, length, dstLength));\n\t\t\treturn new WaveMonaural(header, CopyArray(l, 0, length, dstLength));\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// ファイルから Wave データを読み出し。\n\t\t/// (後ろ0詰め)\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <param name=\"threshold\">閾値。この値以下の音は無音とみなす</param>\n\t\t/// <param name=\"relative\">閾値にピーク値からみた相対値を使う</param>\n\t\t/// <param name=\"dstLength\">コピー後の配列の長さ</param>\n\t\t/// <returns>読み出したデータ</returns>\n\t\tstatic WaveData Read(\n\t\t\tstring filename, int skip, int length,\n\t\t\tdouble threshold ,bool relative, int dstLength)\n\t\t{\n\t\t\tWaveReader reader = null;\n\t\t\tFormatHeader header;\n\t\t\tdouble[] l;\n\t\t\tdouble[] r;\n\n\t\t\tusing(reader = new WaveReader(filename))\n\t\t\t{\n\t\t\t\theader = reader.Header;\n\t\t\t\treader.Read(reader.Length, out l, out r);\n\t\t\t}\n\n\t\t\tif(relative) threshold *= Math.Max(GetPeekValue(l), GetPeekValue(r));\n\t\t\tskip += Math.Min(GetSilentLength(l, threshold), GetSilentLength(r, threshold));\n\t\t\tif(skip < 0 || skip + length >= l.Length) skip = 0;\n\n\t\t\tif(header.IsStereo)\n\t\t\t\treturn new WaveTime(header, CopyArray(l, skip, length, dstLength), CopyArray(r, skip, length, dstLength));\n\t\t\treturn new WaveMonaural(header, CopyArray(l, skip, length, dstLength));\n\t\t}//Read\n\n\n\t\t/// <summary>\n\t\t/// ファイルから Wave データを読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <param name=\"threshold\">閾値。この値以下の音は無音とみなす</param>\n\t\t/// <param name=\"relative\">閾値にピーク値からみた相対値を使う</param>\n\t\t/// <returns>読み出したデータ</returns>\n\t\tstatic WaveData Read(\n\t\t\tstring filename, int skip, int length,\n\t\t\tdouble threshold ,bool relative)\n\t\t{\n\t\t\treturn Read(filename, skip, length, threshold, relative, length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ wave の読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\tpublic void ReadData(string filename, int skip, int length)\n\t\t{\n\t\t\tthis.data = WaveAnalyzer.Read(filename, skip, length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ wave の読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <param name=\"dstLength\">コピー後の配列の長さ</param>\n\t\tpublic void ReadData(string filename, int skip, int length, int dstLength)\n\t\t{\n\t\t\tthis.data = WaveAnalyzer.Read(filename, skip, length, dstLength);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ wave の読み出し。\n\t\t/// 無音区間の除去を行う。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <param name=\"threshold\">閾値</param>\n\t\t/// <param name=\"relative\">閾値にピーク値から見た相対値を使う</param>\n\t\tpublic void ReadData(string filename, int skip, int length, double threshold, bool relative)\n\t\t{\n\t\t\tthis.data = WaveAnalyzer.Read(filename, skip, length, threshold, relative);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ wave の読み出し。\n\t\t/// 無音区間の除去を行う。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <param name=\"threshold\">閾値</param>\n\t\t/// <param name=\"relative\">閾値にピーク値から見た相対値を使う</param>\n\t\t/// <param name=\"dstLength\">コピー後の配列の長さ</param>\n\t\tpublic void ReadData(string filename, int skip, int length, double threshold, bool relative, int dstLength)\n\t\t{\n\t\t\tthis.data = WaveAnalyzer.Read(filename, skip, length, threshold, relative, dstLength);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ wave の書き込み。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\tpublic void WirteData(string filename)\n\t\t{\n\t\t\tusing(WaveWriter writer = new WaveWriter(filename, this.data.Header))\n\t\t\t{\n\t\t\t\twriter.Write(this.data.TimeL, this.data.TimeR);\n\t\t\t}\n\t\t}\n\t}//class WaveAnalyzer\n}//namespace WaveAnalysis\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/WaveAnalysis/WaveData.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.SpectrumAnalysis;\nusing SoundLibrary.Wave;\n\nnamespace SoundLibrary.WaveAnalysis\n{\n\t/// <summary>\n\t/// Wave データ格納用クラス。\n\t/// 効率を考えて、時系列のままデータを保持しておく WaveTime と、\n\t/// 周波数領域に変換してデータを保持しておく WaveFrequency と、\n\t/// Middle/Side 形式でデータを保持しておく WaveMS に分ける。\n\t/// このクラスは抽象基底クラス。\n\t/// </summary>\n\tpublic abstract class WaveData\n\t{\n\t\tFormatHeader header;\n\n\t\t#region コンストラクタ\n\n\t\tpublic WaveData(){}\n\n\t\tpublic WaveData(FormatHeader header)\n\t\t{\n\t\t\tthis.header = header;\n\t\t}\n\n\t\t#endregion\n\t\t#region Wave ヘッダ・時系列データの取得\n\n\t\t/// <summary>\n\t\t/// Wave ヘッダを取得。\n\t\t/// </summary>\n\t\tpublic FormatHeader Header{get{return this.header;}}\n\n\t\t/// <summary>\n\t\t/// 時系列 L ch 信号を取得。\n\t\t/// </summary>\n\t\tpublic abstract double[] TimeL{set; get;}\n\n\t\t/// <summary>\n\t\t/// 時系列 R ch 信号を取得。\n\t\t/// </summary>\n\t\tpublic abstract double[] TimeR{set; get;}\n\n\t\t/// <summary>\n\t\t/// 時系列の長さ。\n\t\t/// </summary>\n\t\tpublic virtual int TimeLength\n\t\t{\n\t\t\tget{return this.TimeL.Length;}\n\t\t}\n\n\t\t#endregion\n\t\t#region 周波数特性の取得・設定\n\n\t\t/// <summary>\n\t\t/// 周波数特性 L ch 信号を取得。\n\t\t/// </summary>\n\t\tpublic abstract Spectrum Left{set; get;}\n\n\t\t/// <summary>\n\t\t/// 周波数特性 R ch 信号を取得。\n\t\t/// </summary>\n\t\tpublic abstract Spectrum Right{set; get;}\n\n\t\t/// <summary>\n\t\t/// 周波数特性 Middle (L + R) ch 信号を取得。\n\t\t/// </summary>\n\t\tpublic virtual Spectrum Middle\n\t\t{\n\t\t\tget{return this.Left + this.Right;}\n\t\t\tset{this.SetMS(value, this.Side);}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 周波数特性 Side (L - R) ch 信号を取得。\n\t\t/// </summary>\n\t\tpublic virtual Spectrum Side\n\t\t{\n\t\t\tget{return this.Left - this.Right;}\n\t\t\tset{this.SetMS(this.Middle, value);}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Left/Right ch 信号を設定。\n\t\t/// </summary>\n\t\t/// <param name=\"middle\">M ch</param>\n\t\t/// <param name=\"side\">S ch</param>\n\t\tpublic virtual void SetLR(Spectrum left, Spectrum right)\n\t\t{\n\t\t\tthis.Left = left;\n\t\t\tthis.Right = right;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Middle/Side ch 信号を設定。\n\t\t/// </summary>\n\t\t/// <param name=\"middle\">M ch</param>\n\t\t/// <param name=\"side\">S ch</param>\n\t\tpublic virtual void SetMS(Spectrum middle, Spectrum side)\n\t\t{\n\t\t\tthis.Left  = 0.5 * (middle + side);\n\t\t\tthis.Right = 0.5 * (middle - side);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 周波数特性の長さ。\n\t\t/// </summary>\n\t\tpublic virtual int Count\n\t\t{\n\t\t\tget{return this.Left.Count;}\n\t\t}\n\n\t\t#endregion\n\t\t#region 内部形式の変換\n\n\t\t/// <summary>\n\t\t/// 内部形式を時系列に変換。\n\t\t/// </summary>\n\t\t/// <returns>内部形式を時系列で持つ WaveData</returns>\n\t\tpublic WaveTime ToTime()\n\t\t{\n\t\t\treturn new WaveTime(this.header, this.TimeL, this.TimeR);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部形式を周波数特性に変換。\n\t\t/// </summary>\n\t\t/// <returns>内部形式を周波数特性で持つ WaveData</returns>\n\t\tpublic WaveFrequency ToSpectrum()\n\t\t{\n\t\t\treturn new WaveFrequency(this.header, this.Left, this.Right);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部形式を周波数特性(Middle/Side)に変換。\n\t\t/// </summary>\n\t\t/// <returns>内部形式を周波数特性で持つ WaveData</returns>\n\t\tpublic WaveMS ToMS()\n\t\t{\n\t\t\treturn new WaveMS(this.header, this.Middle, this.Side);\n\t\t}\n\n\t\t#endregion\n\t\t#region 周波数特性の解析・特性調整など\n\n\t\t/// <summary>\n\t\t/// 左右の時間差を取得。\n\t\t/// 正: Left ch の方が遅い。\n\t\t/// 負: Right ch の方が遅い。\n\t\t/// </summary>\n\t\t/// <returns>左右の時間差</returns>\n\t\tpublic int GetDelay()\n\t\t{\n\t\t\treturn SoundLibrary.Mathematics.Discrete.Function.Argmax(\n\t\t\t\tnew SoundLibrary.Mathematics.Discrete.Correlation(this.TimeL, this.TimeR));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 遅延を与える。\n\t\t/// </summary>\n\t\t/// <param name=\"delay\">遅延時間</param>\n\t\t/// <returns>遅延を与えた後のデータ</returns>\n\t\tpublic WaveData AddDelay(int delay)\n\t\t{\n\t\t\tWaveTime w = this.ToTime();\n\t\t\tdouble[] l = w.TimeL;\n\t\t\tdouble[] r = w.TimeR;\n\n\t\t\tint i = l.Length - 1;\n\t\t\tint n = i - delay;\n\t\t\tfor(; n>=0; --i, --n)\n\t\t\t{\n\t\t\t\tl[i] = l[n];\n\t\t\t\tr[i] = r[n];\n\t\t\t}\n\t\t\tfor(; i>=0; --i)\n\t\t\t{\n\t\t\t\tl[i] = 0;\n\t\t\t\tr[i] = 0;\n\t\t\t}\n\t\t\treturn w;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 最小位相化する。\n\t\t/// 左右の信号の遅延差も付加。\n\t\t/// </summary>\n\t\t/// <param name=\"baseDelay\">L/R 両方にかける遅延</param>\n\t\t/// <returns>最小位相化したのデータ</returns>\n\t\tpublic WaveData ConvertToMinimumPhase(int baseDelay)\n\t\t{\n\t\t\tint delay = this.GetDelay();\n\n\t\t\tWaveFrequency w = this.ToSpectrum();\n\t\t\tw.Left.ConvertToMinimumPhase();\n\t\t\tw.Right.ConvertToMinimumPhase();\n\n\t\t\tw.Left  *= Spectrum.FromDelay(baseDelay + delay/2, this.Left.TimeLength);\n\t\t\tw.Right *= Spectrum.FromDelay(baseDelay - delay/2, this.Right.TimeLength);\n\n\t\t\treturn w;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 最小位相化する。\n\t\t/// 左右の信号の遅延差も付加。\n\t\t/// </summary>\n\t\tpublic WaveData ConvertToMinimumPhase()\n\t\t{\n\t\t\treturn this.ConvertToMinimumPhase(32);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// F = this<br />\n\t\t/// [Gl Gr]   [Fl Fr]^-1<br />\n\t\t/// [Gr Gl] = [Fr Fl]   <br />\n\t\t/// G を求める。\n\t\t/// </summary>\n\t\t/// <returns>G</returns>\n\t\tpublic WaveData Invert()\n\t\t{\n\t\t\treturn new WaveMS(this.header, this.Middle.Invert(), this.Side.Invert());\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Al = a.Left, Ar = a.Right<br />\n\t\t/// Bl = b.Left, Br = b.Right<br />\n\t\t/// Cl = c.Left, Cr = c.Right<br />\n\t\t/// [Cl]   [Bl Br][Al]   [Al Ar][Bl]<br />\n\t\t/// [Cr] = [Br Bl][Ar] = [Ar Al][Br]<br />\n\t\t/// \n\t\t/// c を求める。\n\t\t/// c.Middle = a.Middle * b.Middle,\n\t\t/// c.Side = a.Side * b.Side\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド1</param>\n\t\t/// <param name=\"b\">オペランド1</param>\n\t\t/// <returns>計算結果</returns>\n\t\tpublic static WaveData operator* (WaveData a, WaveData b)\n\t\t{\n\t\t\treturn new WaveMS(a.header, a.Middle * b.Middle, a.Side * b.Side);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Al = a.Left, Ar = a.Right<br />\n\t\t/// Bl = b.Left, Br = b.Right<br />\n\t\t/// Cl = c.Left, Cr = c.Right<br />\n\t\t/// [Cl]   [Bl Br]^-1[Al]<br />\n\t\t/// [Cr] = [Br Bl]   [Ar]<br />\n\t\t/// \n\t\t/// c を求める。\n\t\t/// c.Middle = a.Middle / b.Middle,\n\t\t/// c.Side = a.Side / b.Side\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド1</param>\n\t\t/// <param name=\"b\">オペランド1</param>\n\t\t/// <returns>計算結果</returns>\n\t\tpublic static WaveData operator/ (WaveData a, WaveData b)\n\t\t{\n\t\t\treturn new WaveMS(a.header, a.Middle / b.Middle, a.Side / b.Side);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Left/Right に s を掛ける。\n\t\t/// </summary>\n\t\t/// <param name=\"s\">周波数特性</param>\n\t\tpublic virtual void Mul(Spectrum s)\n\t\t{\n\t\t\tthis.Left *= s;\n\t\t\tthis.Right *= s;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Left/Right を s で割る。\n\t\t/// </summary>\n\t\t/// <param name=\"s\">周波数特性</param>\n\t\tpublic virtual void Div(Spectrum s)\n\t\t{\n\t\t\tthis.Left /= s;\n\t\t\tthis.Right /= s;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// b.Left = a.Left * s, b.Right = a.Right * s;\n\t\t/// </summary>\n\t\t/// <param name=\"a\">被乗数</param>\n\t\t/// <param name=\"s\">乗数</param>\n\t\t/// <returns>乗算結果</returns>\n\t\tpublic static WaveData operator* (WaveData a, Spectrum s)\n\t\t{\n\t\t\tWaveData b = a.ToSpectrum();\n\t\t\tb.Mul(s);\n\t\t\treturn b;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// b.Left = a.Left / s, b.Right = a.Right / s;\n\t\t/// </summary>\n\t\t/// <param name=\"a\">被除数</param>\n\t\t/// <param name=\"s\">除数</param>\n\t\t/// <returns>除算結果</returns>\n\t\tpublic static WaveData operator/ (WaveData a, Spectrum s)\n\t\t{\n\t\t\tWaveData b = a.ToSpectrum();\n\t\t\tb.Div(s);\n\t\t\treturn b;\n\t\t}\n\n\t\t#endregion\n\t\t#region ↓あんまりいらない気がする。\n\t\t/// <summary>\n\t\t/// データの特性を取得。\n\t\t/// </summary>\n\t\t/// <param name=\"spectrum\">スペクトル</param>\n\t\t/// <param name=\"type\">特性の種類</param>\n\t\t/// <returns>特性</returns>\n\t\tpublic static double[] GetData(Spectrum spectrum, Property type)\n\t\t{\n\t\t\tswitch(type)\n\t\t\t{\n\t\t\t\tcase Property.Amplitude:\n\t\t\t\t{\n\t\t\t\t\tdouble[] tmp = spectrum.GetPower();\n\t\t\t\t\tSpectrum.Smooth(tmp);\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t\tcase Property.Phase:\n\t\t\t\t{\n\t\t\t\t\tdouble[] tmp = spectrum.GetPhase();\n\t\t\t\t\tSpectrum.Unwrap(tmp);\n\t\t\t\t\tSpectrum.Smooth(tmp);\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t\tcase Property.MinimumPhase:\n\t\t\t\t{\n\t\t\t\t\tdouble[] tmp = spectrum.GetMinimumPhase();\n\t\t\t\t\tSpectrum.Smooth(tmp);\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t\tcase Property.AllPassPhase:\n\t\t\t\t{\n\t\t\t\t\tdouble[] tmp  = spectrum.GetPhase();\n\t\t\t\t\tdouble[] tmp2 = spectrum.GetMinimumPhase();\n\t\t\t\t\tfor(int i=0; i<tmp.Length; ++i) tmp[i] += tmp2[i];\n\t\t\t\t\tSpectrum.Unwrap(tmp);\n\t\t\t\t\tSpectrum.Smooth(tmp);\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t\t/*\n\t\t\t\tcase Property.PhaseDelay:\n\t\t\t\t{\n\t\t\t\t\tdouble[] tmp = spectrum.GetPhase();\n\t\t\t\t\tSpectrum.Unwrap(tmp);\n\t\t\t\t\tSpectrum.Smooth(tmp);\n\t\t\t\t\treturn Spectrum.GetPhaseDalay(tmp, 48000);\n\t\t\t\t}\n\t\t\t\tcase Property.GroupDelay:\n\t\t\t\t{\n\t\t\t\t\tdouble[] tmp = spectrum.GetPhase();\n\t\t\t\t\tSpectrum.Unwrap(tmp);\n\t\t\t\t\tSpectrum.Smooth(tmp);\n\t\t\t\t\treturn Spectrum.GetGroupDalay(tmp, 48000);\n\t\t\t\t}\n\t\t\t\t*/\n\t\t\t\tdefault:\n\t\t\t\t\treturn spectrum.TimeSequence;\n\t\t\t}\n\t\t}//GetData\n\n\t\t/// <summary>\n\t\t/// データの特性を取得。\n\t\t/// </summary>\n\t\t/// <param name=\"channel\">取得したいチャネル</param>\n\t\t/// <param name=\"type\">取得したい特性</param>\n\t\t/// <returns>特性</returns>\n\t\tpublic double[] GetData(Channel channel, Property type)\n\t\t{\n\t\t\tswitch(channel)\n\t\t\t{\n\t\t\t\tcase Channel.Left:   return GetData(this.Left, type);\n\t\t\t\tcase Channel.Right:  return GetData(this.Right, type);\n\t\t\t\tcase Channel.LR:     return GetData(this.Left / this.Right, type);\n\t\t\t\tcase Channel.RL:     return GetData(this.Right / this.Left, type);\n\t\t\t\tcase Channel.Middle: return GetData(this.Middle, type);\n\t\t\t\tcase Channel.Side:   return GetData(this.Side, type);\n\t\t\t\tcase Channel.MS:     return GetData(this.Middle / this.Side, type);\n\t\t\t\tcase Channel.SM:     return GetData(this.Side / this.Middle, type);\n\t\t\t\tdefault: return null;\n\t\t\t}\n\t\t}//GetData\n\n\t\t/// <summary>\n\t\t/// スペクトルの取得。\n\t\t/// </summary>\n\t\t/// <param name=\"channel\">取得したいチャネル</param>\n\t\t/// <returns>スペクトル</returns>\n\t\tpublic Spectrum GetSpectrum(Channel channel)\n\t\t{\n\t\t\tswitch(channel)\n\t\t\t{\n\t\t\t\tcase Channel.Left:   return this.Left;\n\t\t\t\tcase Channel.Right:  return this.Right;\n\t\t\t\tcase Channel.LR:     return this.Left / this.Right;\n\t\t\t\tcase Channel.RL:     return this.Right / this.Left;\n\t\t\t\tcase Channel.Middle: return this.Middle;\n\t\t\t\tcase Channel.Side:   return this.Side;\n\t\t\t\tcase Channel.MS:     return this.Middle / this.Side;\n\t\t\t\tcase Channel.SM:     return this.Side / this.Middle;\n\t\t\t\tdefault: return null;\n\t\t\t}\n\t\t}//GetSpectrum\n\n\t\t/// <summary>\n\t\t/// チャネルのタイプ。\n\t\t/// </summary>\n\t\tpublic enum Channel\n\t\t{\n\t\t\tLeft,   // L チャネル\n\t\t\tRight,  // R チャネル\n\t\t\tLR,     // Left / Right\n\t\t\tRL,     // Right / Left\n\t\t\tMiddle, // M チャネル\n\t\t\tSide,   // S チャネル\n\t\t\tMS,     // Middle / Side\n\t\t\tSM,     // Side / Middle\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 特性のタイプ。\n\t\t/// </summary>\n\t\tpublic enum Property\n\t\t{\n\t\t\tAmplitude,    // 振幅特性\n\t\t\tPhase,        // 位相特性\n\t\t\tPhaseDelay,   // 位相遅延特性\n\t\t\tGroupDelay,   // 群遅延特性\n\t\t\tMinimumPhase, // 最小位相特性\n\t\t\tAllPassPhase, // オールパス位相特性\n\t\t\tTimeSequence, // 時系列データ\n\t\t}\n\t\t#endregion\n\t}//class Wave\n}//namespace WaveAnalysis\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/WaveAnalysis/WaveFrequency.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.SpectrumAnalysis;\nusing SoundLibrary.Wave;\n\nnamespace SoundLibrary.WaveAnalysis\n{\n\t/// <summary>\n\t/// Wave データ格納用クラス。\n\t/// 周波数系列でデータを保持。\n\t/// </summary>\n\tpublic class WaveFrequency : WaveData\n\t{\n\t\tSpectrum l; // L ch 周波数系列\n\t\tSpectrum r; // R ch 周波数系列\n\n\t\tpublic WaveFrequency(){}\n\n\t\tpublic WaveFrequency(FormatHeader header, Spectrum l, Spectrum r) : base(header)\n\t\t{\n\t\t\tthis.l = l;\n\t\t\tthis.r = r;\n\t\t}\n\n\t\tpublic override double[] TimeL\n\t\t{\n\t\t\tset{this.l = Spectrum.FromTimeSequence(value);}\n\t\t\tget{return this.l.TimeSequence;}\n\t\t}\n\n\t\tpublic override double[] TimeR\n\t\t{\n\t\t\tset{this.r = Spectrum.FromTimeSequence(value);}\n\t\t\tget{return this.r.TimeSequence;}\n\t\t}\n\n\t\tpublic override int TimeLength\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.l.TimeLength;\n\t\t\t}\n\t\t}\n\n\t\tpublic override Spectrum Left\n\t\t{\n\t\t\tset{this.l = value;}\n\t\t\tget{return this.l;}\n\t\t}\n\n\t\tpublic override Spectrum Right\n\t\t{\n\t\t\tset{this.r = value;}\n\t\t\tget{return this.r;}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/WaveAnalysis/WaveMS.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.SpectrumAnalysis;\nusing SoundLibrary.Wave;\n\nnamespace SoundLibrary.WaveAnalysis\n{\n\t/// <summary>\n\t/// Wave データ格納用クラス。\n\t/// 周波数系列(Middle/Side 形式)でデータを保持。\n\t/// </summary>\n\tpublic class WaveMS : WaveData\n\t{\n\t\tSpectrum m; // M (L + R) ch 周波数系列\n\t\tSpectrum s; // S (L - R) ch 周波数系列\n\n\t\tpublic WaveMS(){}\n\n\t\tpublic WaveMS(FormatHeader header, Spectrum m, Spectrum s) : base(header)\n\t\t{\n\t\t\tthis.m = m;\n\t\t\tthis.s = s;\n\t\t}\n\n\t\tpublic override double[] TimeL\n\t\t{\n\t\t\tset{this.Left = Spectrum.FromTimeSequence(value);}\n\t\t\tget{return this.Left.TimeSequence;}\n\t\t}\n\n\t\tpublic override double[] TimeR\n\t\t{\n\t\t\tset{this.Right = Spectrum.FromTimeSequence(value);}\n\t\t\tget{return this.Right.TimeSequence;}\n\t\t}\n\n\t\tpublic override int TimeLength\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.m.TimeLength;\n\t\t\t}\n\t\t}\n\n\t\tpublic override Spectrum Left\n\t\t{\n\t\t\tset{this.SetLR(value, this.Right);}\n\t\t\tget{return 0.5 * (this.m + this.s);}\n\t\t}\n\n\t\tpublic override Spectrum Right\n\t\t{\n\t\t\tset{this.SetLR(this.Left, value);}\n\t\t\tget{return 0.5 * (this.m - this.s);}\n\t\t}\n\n\t\tpublic override Spectrum Middle\n\t\t{\n\t\t\tget{return this.m;}\n\t\t\tset{this.m = value;}\n\t\t}\n\n\t\tpublic override Spectrum Side\n\t\t{\n\t\t\tget{return this.s;}\n\t\t\tset{this.s = value;}\n\t\t}\n\n\t\tpublic override void SetLR(Spectrum left, Spectrum right)\n\t\t{\n\t\t\tthis.m = left + right;\n\t\t\tthis.s = left - right;\n\t\t}\n\n\t\tpublic override void SetMS(Spectrum middle, Spectrum side)\n\t\t{\n\t\t\tthis.m = middle;\n\t\t\tthis.s = side;\n\t\t}\n\t\tpublic override void Mul(Spectrum s)\n\t\t{\n\t\t\tthis.m *= s;\n\t\t\tthis.s *= s;\n\t\t}\n\n\t\tpublic override void Div(Spectrum s)\n\t\t{\n\t\t\tthis.m /= s;\n\t\t\tthis.s /= s;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/WaveAnalysis/WaveMonaural.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.SpectrumAnalysis;\nusing SoundLibrary.Wave;\n\nnamespace SoundLibrary.WaveAnalysis\n{\n\t/// <summary>\n\t/// Wave データ格納用クラス。\n\t/// モノラル版。\n\t/// </summary>\n\tpublic class WaveMonaural : WaveData\n\t{\n\t\tdouble[] l;  // L ch 時系列\n\n\t\tpublic WaveMonaural(){}\n\n\t\tpublic WaveMonaural(FormatHeader header, double[] l) : base(header)\n\t\t{\n\t\t\tthis.l = l;\n\t\t}\n\n\t\tpublic override double[] TimeL\n\t\t{\n\t\t\tset{this.l = value;}\n\t\t\tget{return this.l;}\n\t\t}\n\n\t\tpublic override double[] TimeR\n\t\t{\n\t\t\tset{this.l = value;}\n\t\t\tget{return this.l;}\n\t\t}\n\n\t\tpublic override Spectrum Left\n\t\t{\n\t\t\tset{this.l = value.TimeSequence;}\n\t\t\tget{return Spectrum.FromTimeSequence(this.l);}\n\t\t}\n\n\t\tpublic override Spectrum Right\n\t\t{\n\t\t\tset{this.l = value.TimeSequence;}\n\t\t\tget{return Spectrum.FromTimeSequence(this.l);}\n\t\t}\n\n\t\tpublic override void SetLR(Spectrum left, Spectrum right)\n\t\t{\n\t\t\tthis.l = (0.5 * (left + right)).TimeSequence;\n\t\t}\n\n\t\tpublic override void SetMS(Spectrum left, Spectrum right)\n\t\t{\n\t\t\tthis.l = (0.5 * (left + right)).TimeSequence;\n\t\t}\n\n\t\tpublic override Spectrum Middle\n\t\t{\n\t\t\tset{this.l = value.TimeSequence;}\n\t\t\tget{return Spectrum.FromTimeSequence(this.l);}\n\t\t}\n\n\t\tpublic override Spectrum Side\n\t\t{\n\t\t\tset{this.l = value.TimeSequence;}\n\t\t\tget{return Spectrum.FromTimeSequence(this.l);}\n\t\t}\n\n\t\tpublic override void Mul(Spectrum s)\n\t\t{\n\t\t\tthis.Left *= s;\n\t\t}\n\n\t\tpublic override void Div(Spectrum s)\n\t\t{\n\t\t\tthis.Left /= s;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/WaveAnalysis/WaveTime.cs",
    "content": "﻿using System;\n\nusing SoundLibrary.SpectrumAnalysis;\nusing SoundLibrary.Wave;\n\nnamespace SoundLibrary.WaveAnalysis\n{\n\t/// <summary>\n\t/// Wave データ格納用クラス。\n\t/// 時系列でデータを保持。\n\t/// </summary>\n\tpublic class WaveTime : WaveData\n\t{\n\t\tdouble[] l;  // L ch 時系列\n\t\tdouble[] r;  // R ch 時系列\n\n\t\tpublic WaveTime(){}\n\n\t\tpublic WaveTime(FormatHeader header, double[] l, double[] r) : base(header)\n\t\t{\n\t\t\tthis.l = l;\n\t\t\tthis.r = r;\n\t\t}\n\n\t\tpublic override double[] TimeL\n\t\t{\n\t\t\tset{this.l = value;}\n\t\t\tget{return this.l;}\n\t\t}\n\n\t\tpublic override double[] TimeR\n\t\t{\n\t\t\tset{this.r = value;}\n\t\t\tget{return this.r;}\n\t\t}\n\n\t\tpublic override Spectrum Left\n\t\t{\n\t\t\tset{this.l = value.TimeSequence;}\n\t\t\tget{return Spectrum.FromTimeSequence(this.l);}\n\t\t}\n\n\t\tpublic override Spectrum Right\n\t\t{\n\t\t\tset{this.r = value.TimeSequence;}\n\t\t\tget{return Spectrum.FromTimeSequence(this.r);}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/Data/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.Data</title>\n</head>\n<body>\n\n<h1>Data</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>IDataGenerator</td>\n<td>\ng̃f[^𐶐NX̋ʃC^tF[XB\n</td>\n</tr>\n<tr>\n<td>InpulseGenerator</td>\n<td>\nCpX𐶐B\n</td>\n</tr>\n<tr>\n<td>SinusoidGenerator</td>\n<td>\ng𐶐B\n</td>\n</tr>\n<tr>\n<td>StepGenerator</td>\n<td>\nXebv֐𐶐B\n</td>\n</tr>\n<tr>\n<td>RandomGenerator</td>\n<td>\n𐶐B\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/Filter/BandPass/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../../style.css\" />\n<title>SoundLibrary.Filter.BandPass</title>\n</head>\n<body>\n\n<h1>BandPass</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>WindowFunction, IWindow</td>\n<td>\n֐p̃fQ[g/C^tF[XB\n</td>\n</tr>\n<tr>\n<td>LowPassFilter, HighPassFilter, BandPassFilter</td>\n<td>\n`ʑ FIR tB^p[pX/nCpX/ohpXtB^B\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/Filter/Delay/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../../style.css\" />\n<title>SoundLibrary.Filter.Delay</title>\n</head>\n<body>\n\n<h1>Delay</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>IDelay</td>\n<td>\nx̊C^tF[XB\n</td>\n</tr>\n<tr>\n<td>Delay</td>\n<td>\nxB\n</td>\n</tr>\n<tr>\n<td>FractionalDelay</td>\n<td>\nxB\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/Filter/Equalizer/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../../style.css\" />\n<title>SoundLibrary.Filter.Equalizer</title>\n</head>\n<body>\n\n<h1>Equalizer</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>ParametricEqualizer</td>\n<td>\npgbNCRCUB\n2 IIR tB^𒼗ɕׂ\\B\nIIR tB^p[pXEnCpXEohpXtB^A\ns[LOEVFrOtB^Ȃǂ̐݌v@\\tB\n</td>\n</tr>\n<tr>\n<td>FilterDesigner</td>\n<td>\nIIR tB^̌W݌vsNX̒ۊB\nButterworthFilterDesigner ͂̃NX̃TuNXƂĒ`B\ntB^̗_/ɁAAiOvg^CvWA\nfBW^tB^WAParametricEqualizer NX݊`̌WvZ\\B\n</td>\n</tr>\n<tr>\n<td>ButterworthFilterDesigner</td>\n<td>\no^[[XtB^̌W݌vsB\n</td>\n</tr>\n<tr>\n<td>ChebyshevFilterDesigner</td>\n<td>\n`FrVFt/t`FrVFttB^̌W݌vsB\n</td>\n</tr>\n<tr>\n<td>EllipticFilterDesigner</td>\n<td>\nȉ~tB^̌W݌vsB\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/Filter/Misc/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../../style.css\" />\n<title>SoundLibrary.Filter.Misc</title>\n</head>\n<body>\n\n<h1>Misc</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>CombFilter</td>\n<td>\nRtB^B\n</td>\n</tr>\n<tr>\n<td>Amplifier</td>\n<td>\n͂萔{邾̃NXB\n</td>\n</tr>\n<tr>\n<td>AllPassFilter</td>\n<td>\nI[pXtB^B\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/Filter/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.Filter</title>\n</head>\n<body>\n\n<h1>Filter</h1>\n\n<h2>TutH_</h2>\n<table>\n<tr>\n<td><a href=\"Delay/index.html\">Delay</a></td>\n<td>\nxBxxB\n</td>\n</tr>\n<tr>\n<td><a href=\"BandPass/index.html\">BandPass</a></td>\n<td>\n`ʑ FIR p[pXEohpXEnCpXtB^B\n̏A|@̂݁iv@ɂ͖ΉjB\n</td>\n</tr>\n<tr>\n<td><a href=\"Equalizer/index.html\">Equalizer</a></td>\n<td>\n2 IIR tB^̒ڑpCRCUB\nRBJ Audio EQ Cookbook ŏЉĂtB^A\no^[[XA`FrVFtAȉ~tB^gB\n</td>\n</tr>\n<tr>\n<td><a href=\"Misc/index.html\">Misc</a></td>\n<td>\n̑̃tB^B\nRtB^ȂǁB\n</td>\n</tr>\n</table>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>IFilter</td>\n<td>\nSẴtB^̊{C^tF[XB\n</td>\n</tr>\n<tr>\n<td>CircularBuffer</td>\n<td>\nzobt@B\n</td>\n</tr>\n<tr>\n<td>SerialConnector, PallarelConnector</td>\n<td>\ntB^𒼗/ɌqtB^B\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/Mathematics/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.Mathematics</title>\n</head>\n<body>\n\n<h1>Mathematics</h1>\n\n<h2>TutH_</h2>\n<table>\n<tr>\n<td>Function</td>\n<td>\nw֐m̉揜A֐̍A􍞂ݓsB\nf = Cos; g = Sin; h = f * g;\ndouble x = h[10];\nƏƂŁASin(10) * Cos(10) ̒lvZł悤ȃNX`B\n</td>\n</tr>\n<tr>\n<td>ThreeDimention</td>\n<td>\n3̃xNgEsAAtBϊA4NXȂǂ`B\n</td>\n</tr>\n</table>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>Constant</td>\n<td>\nw萔`B\n</td>\n</tr>\n<tr>\n<td>Complex</td>\n<td>\nf^NXB\n</td>\n</tr>\n<tr>\n<td>Elliptic</td>\n<td>\nȉ~֐B\n</td>\n</tr>\n<tr>\n<td>ComplexMath</td>\n<td>\nSystem.Math Œ`Ă֐𕡑fɊǵB\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/Music/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.Music</title>\n</head>\n<body>\n\n<h1>Music</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>Sound</td>\n<td>\n\\NX̒ۊB\n</td>\n</tr>\n<tr>\n<td>PureTone</td>\n<td>\nPig`j𐶐B\n</td>\n</tr>\n<tr>\n<td>HarmonicTone</td>\n<td>\n{iP̐{d˂́j𐶐B\n</td>\n</tr>\n<tr>\n<td>Envelope</td>\n<td>\nPureTone gĐɃGx[vijB\n</td>\n</tr>\n<tr>\n<td>Tremolo</td>\n<td>\nAgiʂIɕωjB\n</td>\n</tr>\n<tr>\n<td>Vibrato</td>\n<td>\nAru[giIɕωj\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/Pipe/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.Pipe</title>\n</head>\n<body>\n\n<h1>Pipe</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>Queue</td>\n<td>\nf[^i[p̃L[B\n</td>\n</tr>\n<tr>\n<td>Pipe</td>\n<td>\nFIFO Ńf[^L[ǂݍ    L[ɏoNX̒ۊB\n</td>\n</tr>\n<tr>\n<td>FilteredPipe</td>\n<td>\nǂݍ  tB^[  oB\nmpƃXeIpB\niMonaural/FilteredPipe  Stereo/FilteredPipej\n</td>\n</tr>\n<tr>\n<td>RateTransposer</td>\n<td>\nڒiύXAĐԂɕςjsB\nmpƃXeIpB\n</td>\n</tr>\n<tr>\n<td>TimeStretcher</td>\n<td>\nԐLkiςɍĐԂςjsB\nmpƃXeIpB\n</td>\n</tr>\n<tr>\n<td>PitchShifter</td>\n<td>\nsb`VtgiĐԂςɉςjsB\ni_ł̓XeIp̂݁Bj\n</td>\n</tr>\n<tr>\n<td>CascadePipe</td>\n<td>\n Pipe 𒼗ɌqNXB\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/SpectrumAnalysis/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.SpectrumAnalysis</title>\n</head>\n<body>\n\n<h1>SpectrumAnalysis</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>Fft</td>\n<td>\nM FFT sNXB\n</td>\n</tr>\n<tr>\n<td>CFft</td>\n<td>\nfM FFT sNXB\n</td>\n</tr>\n<tr>\n<td>Spectrum</td>\n<td>\ngig̈Mj\\NXB\nn FFTAgm̉揜A\nUEʑȂǂ̌vZ\\B\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/Wave/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.Wave</title>\n</head>\n<body>\n\n<h1>Wave</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>WaveReader</td>\n<td>\n.wav `̃t@C特f[^ǂݍށB\n</td>\n</tr>\n<tr>\n<td>WaveWriter</td>\n<td>\n.wav `̃t@Cɉf[^oB\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/WaveAnalysis/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.</title>\n</head>\n<body>\n\n<h1></h1>\n\n<h2>TutH_</h2>\n<table>\n<tr>\n<td><a href=\"/index.html\"></a></td>\n<td>\n</td>\n</tr>\n<tr>\n<td><a href=\"/index.html\"></a></td>\n<td>\n</td>\n</tr>\n</table>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td></td>\n<td>\n</td>\n</tr>\n<tr>\n<td></td>\n<td>\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"style.css\" />\n<title>SoundLibrary</title>\n</head>\n<body>\n\n<h1>SoundLibrary</h1>\n\n<h2>TutH_</h2>\n\n<table>\n<tr>\n<td><a href=\"Mathematics/index.html\">Mathematics</a></td>\n<td>\ñCuŎgw֐╡fNXȂǂ`B\n</td>\n</tr>\n<tr>\n<td><a href=\"Filter/index.html\">Filter</a></td>\n<td>\ntB^CuB\nxAFIR/IIRtB^ьW݌vp̃R[h܂܂Ă܂B\n</td>\n</tr>\n<tr>\n<td><a href=\"Wave/index.html\">Wave</a></td>\n<td>\n8bit/16bit PCM ` Wave t@Cǂݏ郉CuB\nADPCM Ƃɂ͖ΉB\n</td>\n</tr>\n<tr>\n<td><a href=\"SpectrumAnalysis/index.html\">SpectrumAnalysis</a></td>\n<td>\ng͗pCuB\nFFT gpB\n</td>\n</tr>\n<tr>\n<td><a href=\"Music/index.html\">Music</a></td>\n<td>\n郉CuB\ngd˂č{Ƀru[gGx[voB\n</td>\n</tr>\n<td><a href=\"Data/index.html\">Data</a></td>\n<td>\ngȂǂ̃f[^𐶐B\ntB^̃fobOpɍ́i낱ƎdlύX邩jB\nMusic Ɠ肷邩B\n</td>\n</tr>\n<tr>\n<td><a href=\"Pipe/index.html\">Pipe</a></td>\n<td>\nFIFO Ńf[^ǂݏoosNXQ`B\nf[^́AĐxύXEڒEsb`VtgȂǂsB\n</td>\n</tr>\n<tr>\n<td>Command</td>\n<td>\nR}hC^AvP[VpCuB\nR}hCȂǂ߂邽߂̃p[T[B\n</td>\n</tr>\n<tr>\n<td>WaveAnalysis</td>\n<td>\nWave ǂݏof[^̎g͂sȂB\nWave  SpectrumAnalysis gāA\nẼ`l̍ƂvZ肷邾B\n</td>\n</tr>\n<tr>\n<td>Stream</td>\n<td>\nObsoleteB\nPipe ɈڍsB\n</td>\n</tr>\n<tr>\n<td>Misc</td>\n<td>\n̑XB\nfobOp̃NXȂǁB\n</td>\n</tr>\n</table>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>Util</td>\n<td>[eBeB֐QBfVxl  jAlA~b  Tv̕ϊȂǁB</td>\n</tr>\n<tr>\n<td>BitOperation</td>\n<td>rbgpNXBrbg}XNA2̙pȂǂvZB</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/documents/style.css",
    "content": "body\n{\n\tcolor:#000000;\n\tbackground-color:#FFFFFF;\n}\n\nh1{font-size:140%; background-color:#ccccff; border:1pt solid #000000;padding-left:0.2em;}\nh2{font-size:120%; font-weight:normal; background-color:#ccccff; border:1pt solid #000000;padding-left:0.2em;}\nh3{font-size:110%; color:6a5acd;}\n\nh3.sample{font-size:100%; font-weight:normal; background-color:#ccffff; border:1pt solid #000000;padding-left:0.5em;}\n\npre{font-family:monospace; color:black; border:thin solid #3333cc; padding:0.2em 0em 0.2em 0.5em;}\npre.dos{font-family:monospace; color:black; border:thin solid #ff9999; padding:0.2em 0em 0.2em 0.5em;}\n\nsup{font-size:80%;}\nsub{font-size:80%;}\n\nspan.keyword{color:#0000ff;}\nspan.string{color:#008080;}\nspan.comment{color:#008000;}\nspan.input{background-color:#ccffcc;}\n\nem{font-style:normal; font-weight:normal;background-color:#fff0f0;}\n\ntable{background:#333366;vertical-align:middle;}\ntable.noborder{background-color:transparent;}\ntr{vertical-align:middle;text-align:left;}\nth{padding:0.3em;margin:0pt;border:0pt;color:#000000;background-color:#99ccff;font-weight:normal;vertical-align:middle;text-align:left;}\ntd{padding:0.3em;margin:0pt;border:0pt;color:#000000;background-color:#ffffff;vertical-align:middle;text-align:left;}\n\nimg{border:0;}\np.fig{text-align:center;}\np.fig td{text-align:center;}\n\nspan.ver2{color:#ff0000; font:italic; background:#ffeeee; padding:0em 0.4em 0em 0.1em;}\n\na:link   {color:#3333cc;}\na:visited{color:#3333cc;}\na:active {color:#3333cc;}\na:hover  {color:#aa3333;}\n\nv\\:* { behavior: url(#default#VML); }\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/fft/Makefile",
    "content": "CL   = \"C:\\Program Files\\Microsoft Visual Studio .NET 2003\\Vc7\\bin\\cl.exe\"\nCLOPTION = /CLR /nologo /c\nLINK = \"C:\\Program Files\\Microsoft Visual Studio .NET 2003\\Vc7\\bin\\link.exe\"\n\nall:fft.dll\n\nfftsg.obj: fftsg.c\n\t$(CL) $(CLOPTION) fftsg.c\n\nfft.obj: fft.cpp\n\t$(CL) $(CLOPTION) fft.cpp\n\nfft.dll: fftsg.obj fft.obj\n\t$(LINK) -dll /out:fft.dll /nologo fftsg.obj fft.obj\n\nclean:\n\trm *.obj\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/fft/fft.cpp",
    "content": "/*********************************************************************\nfftsg.c ̓e Managed R[h痘p邽߂̃bp[B\nfftsg.c  rdft (ԗ̈̎M̎g) gĂ܂B\n\n[gp@]\nEt[Gϊ\nFft::Fft(length);\nlength: ϊM̒B\n\nFft::Transform(sgn, a);\nsgn: ϊ̕B\n     1 ŏA-1 ŋtB\na  : ϊ̃f[^B\n\nϊÕf[^`́A\nԗ̈̎M\na[k] = x[k];\n(0 <= k < N)\n\nϊ̃f[^`́A\na[0]    :        Re(X[0])\na[1]    : ōg Re(X[N/2])\na[2*i]  : ̎     Re(X[i])\na[2*i+1]: ̋     Im(X[i])\n(0 < i < N/2)\n\nFft::Transform(1, x);\n̋tϊ\nFft::Transform(-1, x);\nfor(int i=0; i<N, ++i)\n  x[i] *= 2/N;\n\nEft[Gϊ\nFft::Fft(length);\nlength: ϊM̒B\n        (a ̒  x ̒2{)\n\nCFft::Transform(sgn, x);\nsgn: ϊ̕B\n     1 ŏA-1 ŋtB\nx  : ϊ̃f[^B\n\nϊÕf[^`́A\na[2*i]  : ̎ Re(x[k])\na[2*i+1]: ̋ Im(x[k])\n(0 <= k < N/2)\n\nϊ̃f[^`́A\na[2*i]  : ̎ Re(X[i])\na[2*i+1]: ̋ Im(X[i])\n(0 < i= < N/2)\n\nCFft::Transform(1, x);\n̋tϊ\nCFft::Transform(-1, x);\nfor(int i=0; i<N, ++i)\n  x[i] *= 2/N;\n\n *********************************************************************/\n\n#using <mscorlib.dll>\nusing namespace System;\n\nextern \"C\"\n{\n\tvoid rdft(int n, int isgn, double *a, int *ip, double *w);\n\tvoid cdft(int n, int isgn, double *a, int *ip, double *w);\n};\n\nnamespace Fft\n{\n\t//==================================================================\n\t// t[GϊNXB\n\t__gc public class Fft\n\t{\n\t\tint length; // FFT ̒\n\t\tdouble* w; // bit reversal p[N̈\n\t\tint* ip;   // sin/cos e[up[N̈\n\n\tpublic:\n\t\tFft(int length)\n\t\t{\n\t\t\tthis->length = length;\n\t\t\tthis->ip = new int[(int)(2 + Math::Ceiling(Math::Sqrt(length / 2)))];\n\t\t\tthis->ip[0] = 0;\n\t\t\tthis->w = new double[length / 2];\n\t\t}\n\n\t\tvoid Transform(int sgn, double* x)\n\t\t{\n\t\t\trdft(this->length, sgn, x, this->ip, this->w);\n\t\t}\n\t};\n\n\t//==================================================================\n\t// ft[GϊNXB\n\t__gc public class CFft\n\t{\n\t\tint length; // FFT ̒\n\t\tdouble* w; // bit reversal p[N̈\n\t\tint* ip;   // sin/cos e[up[N̈\n\n\tpublic:\n\t\tCFft(int length)\n\t\t{\n\t\t\tthis->length = length;\n\t\t\tthis->ip = new int[(int)(2 + Math::Ceiling(Math::Sqrt(length / 2)))];\n\t\t\tthis->ip[0] = 0;\n\t\t\tthis->w = new double[length / 2];\n\t\t}\n\n\t\tvoid Transform(int sgn, double* x)\n\t\t{\n\t\t\tcdft(this->length, sgn, x, this->ip, this->w);\n\t\t}\n\t};\n};\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/fft/fftsg.c",
    "content": "/*\nFast Fourier/Cosine/Sine Transform\n    dimension   :one\n    data length :power of 2\n    decimation  :frequency\n    radix       :split-radix\n    data        :inplace\n    table       :use\nfunctions\n    cdft: Complex Discrete Fourier Transform\n    rdft: Real Discrete Fourier Transform\n    ddct: Discrete Cosine Transform\n    ddst: Discrete Sine Transform\n    dfct: Cosine Transform of RDFT (Real Symmetric DFT)\n    dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)\nfunction prototypes\n    void cdft(int, int, double *, int *, double *);\n    void rdft(int, int, double *, int *, double *);\n    void ddct(int, int, double *, int *, double *);\n    void ddst(int, int, double *, int *, double *);\n    void dfct(int, double *, double *, int *, double *);\n    void dfst(int, double *, double *, int *, double *);\nmacro definitions\n    USE_CDFT_PTHREADS : default=not defined\n        CDFT_THREADS_BEGIN_N  : must be >= 512, default=8192\n        CDFT_4THREADS_BEGIN_N : must be >= 512, default=65536\n    USE_CDFT_WINTHREADS : default=not defined\n        CDFT_THREADS_BEGIN_N  : must be >= 512, default=32768\n        CDFT_4THREADS_BEGIN_N : must be >= 512, default=524288\n\n\n-------- Complex DFT (Discrete Fourier Transform) --------\n    [definition]\n        <case1>\n            X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n\n        <case2>\n            X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n\n        (notes: sum_j=0^n-1 is a summation from j=0 to n-1)\n    [usage]\n        <case1>\n            ip[0] = 0; // first time only\n            cdft(2*n, 1, a, ip, w);\n        <case2>\n            ip[0] = 0; // first time only\n            cdft(2*n, -1, a, ip, w);\n    [parameters]\n        2*n            :data length (int)\n                        n >= 1, n = power of 2\n        a[0...2*n-1]   :input/output data (double *)\n                        input data\n                            a[2*j] = Re(x[j]), \n                            a[2*j+1] = Im(x[j]), 0<=j<n\n                        output data\n                            a[2*k] = Re(X[k]), \n                            a[2*k+1] = Im(X[k]), 0<=k<n\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n/2-1]   :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            cdft(2*n, -1, a, ip, w);\n        is \n            cdft(2*n, 1, a, ip, w);\n            for (j = 0; j <= 2 * n - 1; j++) {\n                a[j] *= 1.0 / n;\n            }\n        .\n\n\n-------- Real DFT / Inverse of Real DFT --------\n    [definition]\n        <case1> RDFT\n            R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2\n            I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0<k<n/2\n        <case2> IRDFT (excluding scale)\n            a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + \n                   sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + \n                   sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k<n\n    [usage]\n        <case1>\n            ip[0] = 0; // first time only\n            rdft(n, 1, a, ip, w);\n        <case2>\n            ip[0] = 0; // first time only\n            rdft(n, -1, a, ip, w);\n    [parameters]\n        n              :data length (int)\n                        n >= 2, n = power of 2\n        a[0...n-1]     :input/output data (double *)\n                        <case1>\n                            output data\n                                a[2*k] = R[k], 0<=k<n/2\n                                a[2*k+1] = I[k], 0<k<n/2\n                                a[1] = R[n/2]\n                        <case2>\n                            input data\n                                a[2*j] = R[j], 0<=j<n/2\n                                a[2*j+1] = I[j], 0<j<n/2\n                                a[1] = R[n/2]\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/2)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n/2-1]   :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            rdft(n, 1, a, ip, w);\n        is \n            rdft(n, -1, a, ip, w);\n            for (j = 0; j <= n - 1; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\n-------- DCT (Discrete Cosine Transform) / Inverse of DCT --------\n    [definition]\n        <case1> IDCT (excluding scale)\n            C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n\n        <case2> DCT\n            C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k<n\n    [usage]\n        <case1>\n            ip[0] = 0; // first time only\n            ddct(n, 1, a, ip, w);\n        <case2>\n            ip[0] = 0; // first time only\n            ddct(n, -1, a, ip, w);\n    [parameters]\n        n              :data length (int)\n                        n >= 2, n = power of 2\n        a[0...n-1]     :input/output data (double *)\n                        output data\n                            a[k] = C[k], 0<=k<n\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/2)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n*5/4-1] :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            ddct(n, -1, a, ip, w);\n        is \n            a[0] *= 0.5;\n            ddct(n, 1, a, ip, w);\n            for (j = 0; j <= n - 1; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\n-------- DST (Discrete Sine Transform) / Inverse of DST --------\n    [definition]\n        <case1> IDST (excluding scale)\n            S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n\n        <case2> DST\n            S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0<k<=n\n    [usage]\n        <case1>\n            ip[0] = 0; // first time only\n            ddst(n, 1, a, ip, w);\n        <case2>\n            ip[0] = 0; // first time only\n            ddst(n, -1, a, ip, w);\n    [parameters]\n        n              :data length (int)\n                        n >= 2, n = power of 2\n        a[0...n-1]     :input/output data (double *)\n                        <case1>\n                            input data\n                                a[j] = A[j], 0<j<n\n                                a[0] = A[n]\n                            output data\n                                a[k] = S[k], 0<=k<n\n                        <case2>\n                            output data\n                                a[k] = S[k], 0<k<n\n                                a[0] = S[n]\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/2)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n*5/4-1] :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            ddst(n, -1, a, ip, w);\n        is \n            a[0] *= 0.5;\n            ddst(n, 1, a, ip, w);\n            for (j = 0; j <= n - 1; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\n-------- Cosine Transform of RDFT (Real Symmetric DFT) --------\n    [definition]\n        C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n\n    [usage]\n        ip[0] = 0; // first time only\n        dfct(n, a, t, ip, w);\n    [parameters]\n        n              :data length - 1 (int)\n                        n >= 2, n = power of 2\n        a[0...n]       :input/output data (double *)\n                        output data\n                            a[k] = C[k], 0<=k<=n\n        t[0...n/2]     :work area (double *)\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/4)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/4+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n*5/8-1] :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            a[0] *= 0.5;\n            a[n] *= 0.5;\n            dfct(n, a, t, ip, w);\n        is \n            a[0] *= 0.5;\n            a[n] *= 0.5;\n            dfct(n, a, t, ip, w);\n            for (j = 0; j <= n; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\n-------- Sine Transform of RDFT (Real Anti-symmetric DFT) --------\n    [definition]\n        S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n\n    [usage]\n        ip[0] = 0; // first time only\n        dfst(n, a, t, ip, w);\n    [parameters]\n        n              :data length + 1 (int)\n                        n >= 2, n = power of 2\n        a[0...n-1]     :input/output data (double *)\n                        output data\n                            a[k] = S[k], 0<k<n\n                        (a[0] is used for work area)\n        t[0...n/2-1]   :work area (double *)\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/4)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/4+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n*5/8-1] :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            dfst(n, a, t, ip, w);\n        is \n            dfst(n, a, t, ip, w);\n            for (j = 1; j <= n - 1; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\nAppendix :\n    The cos/sin table is recalculated when the larger table required.\n    w[] and ip[] are compatible with all routines.\n*/\n\n#include<math.h>\n\nvoid cdft(int n, int isgn, double *a, int *ip, double *w)\n{\n    void makewt(int nw, int *ip, double *w);\n    void cftfsub(int n, double *a, int *ip, int nw, double *w);\n    void cftbsub(int n, double *a, int *ip, int nw, double *w);\n    int nw;\n    \n    nw = ip[0];\n    if (n > (nw << 2)) {\n        nw = n >> 2;\n        makewt(nw, ip, w);\n    }\n    if (isgn >= 0) {\n        cftfsub(n, a, ip, nw, w);\n    } else {\n        cftbsub(n, a, ip, nw, w);\n    }\n}\n\n\nvoid rdft(int n, int isgn, double *a, int *ip, double *w)\n{\n    void makewt(int nw, int *ip, double *w);\n    void makect(int nc, int *ip, double *c);\n    void cftfsub(int n, double *a, int *ip, int nw, double *w);\n    void cftbsub(int n, double *a, int *ip, int nw, double *w);\n    void rftfsub(int n, double *a, int nc, double *c);\n    void rftbsub(int n, double *a, int nc, double *c);\n    int nw, nc;\n    double xi;\n    \n    nw = ip[0];\n    if (n > (nw << 2)) {\n        nw = n >> 2;\n        makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > (nc << 2)) {\n        nc = n >> 2;\n        makect(nc, ip, w + nw);\n    }\n    if (isgn >= 0) {\n        if (n > 4) {\n            cftfsub(n, a, ip, nw, w);\n            rftfsub(n, a, nc, w + nw);\n        } else if (n == 4) {\n            cftfsub(n, a, ip, nw, w);\n        }\n        xi = a[0] - a[1];\n        a[0] += a[1];\n        a[1] = xi;\n    } else {\n        a[1] = 0.5 * (a[0] - a[1]);\n        a[0] -= a[1];\n        if (n > 4) {\n            rftbsub(n, a, nc, w + nw);\n            cftbsub(n, a, ip, nw, w);\n        } else if (n == 4) {\n            cftbsub(n, a, ip, nw, w);\n        }\n    }\n}\n\n\nvoid ddct(int n, int isgn, double *a, int *ip, double *w)\n{\n    void makewt(int nw, int *ip, double *w);\n    void makect(int nc, int *ip, double *c);\n    void cftfsub(int n, double *a, int *ip, int nw, double *w);\n    void cftbsub(int n, double *a, int *ip, int nw, double *w);\n    void rftfsub(int n, double *a, int nc, double *c);\n    void rftbsub(int n, double *a, int nc, double *c);\n    void dctsub(int n, double *a, int nc, double *c);\n    int j, nw, nc;\n    double xr;\n    \n    nw = ip[0];\n    if (n > (nw << 2)) {\n        nw = n >> 2;\n        makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > nc) {\n        nc = n;\n        makect(nc, ip, w + nw);\n    }\n    if (isgn < 0) {\n        xr = a[n - 1];\n        for (j = n - 2; j >= 2; j -= 2) {\n            a[j + 1] = a[j] - a[j - 1];\n            a[j] += a[j - 1];\n        }\n        a[1] = a[0] - xr;\n        a[0] += xr;\n        if (n > 4) {\n            rftbsub(n, a, nc, w + nw);\n            cftbsub(n, a, ip, nw, w);\n        } else if (n == 4) {\n            cftbsub(n, a, ip, nw, w);\n        }\n    }\n    dctsub(n, a, nc, w + nw);\n    if (isgn >= 0) {\n        if (n > 4) {\n            cftfsub(n, a, ip, nw, w);\n            rftfsub(n, a, nc, w + nw);\n        } else if (n == 4) {\n            cftfsub(n, a, ip, nw, w);\n        }\n        xr = a[0] - a[1];\n        a[0] += a[1];\n        for (j = 2; j < n; j += 2) {\n            a[j - 1] = a[j] - a[j + 1];\n            a[j] += a[j + 1];\n        }\n        a[n - 1] = xr;\n    }\n}\n\n\nvoid ddst(int n, int isgn, double *a, int *ip, double *w)\n{\n    void makewt(int nw, int *ip, double *w);\n    void makect(int nc, int *ip, double *c);\n    void cftfsub(int n, double *a, int *ip, int nw, double *w);\n    void cftbsub(int n, double *a, int *ip, int nw, double *w);\n    void rftfsub(int n, double *a, int nc, double *c);\n    void rftbsub(int n, double *a, int nc, double *c);\n    void dstsub(int n, double *a, int nc, double *c);\n    int j, nw, nc;\n    double xr;\n    \n    nw = ip[0];\n    if (n > (nw << 2)) {\n        nw = n >> 2;\n        makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > nc) {\n        nc = n;\n        makect(nc, ip, w + nw);\n    }\n    if (isgn < 0) {\n        xr = a[n - 1];\n        for (j = n - 2; j >= 2; j -= 2) {\n            a[j + 1] = -a[j] - a[j - 1];\n            a[j] -= a[j - 1];\n        }\n        a[1] = a[0] + xr;\n        a[0] -= xr;\n        if (n > 4) {\n            rftbsub(n, a, nc, w + nw);\n            cftbsub(n, a, ip, nw, w);\n        } else if (n == 4) {\n            cftbsub(n, a, ip, nw, w);\n        }\n    }\n    dstsub(n, a, nc, w + nw);\n    if (isgn >= 0) {\n        if (n > 4) {\n            cftfsub(n, a, ip, nw, w);\n            rftfsub(n, a, nc, w + nw);\n        } else if (n == 4) {\n            cftfsub(n, a, ip, nw, w);\n        }\n        xr = a[0] - a[1];\n        a[0] += a[1];\n        for (j = 2; j < n; j += 2) {\n            a[j - 1] = -a[j] - a[j + 1];\n            a[j] -= a[j + 1];\n        }\n        a[n - 1] = -xr;\n    }\n}\n\n\nvoid dfct(int n, double *a, double *t, int *ip, double *w)\n{\n    void makewt(int nw, int *ip, double *w);\n    void makect(int nc, int *ip, double *c);\n    void cftfsub(int n, double *a, int *ip, int nw, double *w);\n    void rftfsub(int n, double *a, int nc, double *c);\n    void dctsub(int n, double *a, int nc, double *c);\n    int j, k, l, m, mh, nw, nc;\n    double xr, xi, yr, yi;\n    \n    nw = ip[0];\n    if (n > (nw << 3)) {\n        nw = n >> 3;\n        makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > (nc << 1)) {\n        nc = n >> 1;\n        makect(nc, ip, w + nw);\n    }\n    m = n >> 1;\n    yi = a[m];\n    xi = a[0] + a[n];\n    a[0] -= a[n];\n    t[0] = xi - yi;\n    t[m] = xi + yi;\n    if (n > 2) {\n        mh = m >> 1;\n        for (j = 1; j < mh; j++) {\n            k = m - j;\n            xr = a[j] - a[n - j];\n            xi = a[j] + a[n - j];\n            yr = a[k] - a[n - k];\n            yi = a[k] + a[n - k];\n            a[j] = xr;\n            a[k] = yr;\n            t[j] = xi - yi;\n            t[k] = xi + yi;\n        }\n        t[mh] = a[mh] + a[n - mh];\n        a[mh] -= a[n - mh];\n        dctsub(m, a, nc, w + nw);\n        if (m > 4) {\n            cftfsub(m, a, ip, nw, w);\n            rftfsub(m, a, nc, w + nw);\n        } else if (m == 4) {\n            cftfsub(m, a, ip, nw, w);\n        }\n        a[n - 1] = a[0] - a[1];\n        a[1] = a[0] + a[1];\n        for (j = m - 2; j >= 2; j -= 2) {\n            a[2 * j + 1] = a[j] + a[j + 1];\n            a[2 * j - 1] = a[j] - a[j + 1];\n        }\n        l = 2;\n        m = mh;\n        while (m >= 2) {\n            dctsub(m, t, nc, w + nw);\n            if (m > 4) {\n                cftfsub(m, t, ip, nw, w);\n                rftfsub(m, t, nc, w + nw);\n            } else if (m == 4) {\n                cftfsub(m, t, ip, nw, w);\n            }\n            a[n - l] = t[0] - t[1];\n            a[l] = t[0] + t[1];\n            k = 0;\n            for (j = 2; j < m; j += 2) {\n                k += l << 2;\n                a[k - l] = t[j] - t[j + 1];\n                a[k + l] = t[j] + t[j + 1];\n            }\n            l <<= 1;\n            mh = m >> 1;\n            for (j = 0; j < mh; j++) {\n                k = m - j;\n                t[j] = t[m + k] - t[m + j];\n                t[k] = t[m + k] + t[m + j];\n            }\n            t[mh] = t[m + mh];\n            m = mh;\n        }\n        a[l] = t[0];\n        a[n] = t[2] - t[1];\n        a[0] = t[2] + t[1];\n    } else {\n        a[1] = a[0];\n        a[2] = t[0];\n        a[0] = t[1];\n    }\n}\n\n\nvoid dfst(int n, double *a, double *t, int *ip, double *w)\n{\n    void makewt(int nw, int *ip, double *w);\n    void makect(int nc, int *ip, double *c);\n    void cftfsub(int n, double *a, int *ip, int nw, double *w);\n    void rftfsub(int n, double *a, int nc, double *c);\n    void dstsub(int n, double *a, int nc, double *c);\n    int j, k, l, m, mh, nw, nc;\n    double xr, xi, yr, yi;\n    \n    nw = ip[0];\n    if (n > (nw << 3)) {\n        nw = n >> 3;\n        makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > (nc << 1)) {\n        nc = n >> 1;\n        makect(nc, ip, w + nw);\n    }\n    if (n > 2) {\n        m = n >> 1;\n        mh = m >> 1;\n        for (j = 1; j < mh; j++) {\n            k = m - j;\n            xr = a[j] + a[n - j];\n            xi = a[j] - a[n - j];\n            yr = a[k] + a[n - k];\n            yi = a[k] - a[n - k];\n            a[j] = xr;\n            a[k] = yr;\n            t[j] = xi + yi;\n            t[k] = xi - yi;\n        }\n        t[0] = a[mh] - a[n - mh];\n        a[mh] += a[n - mh];\n        a[0] = a[m];\n        dstsub(m, a, nc, w + nw);\n        if (m > 4) {\n            cftfsub(m, a, ip, nw, w);\n            rftfsub(m, a, nc, w + nw);\n        } else if (m == 4) {\n            cftfsub(m, a, ip, nw, w);\n        }\n        a[n - 1] = a[1] - a[0];\n        a[1] = a[0] + a[1];\n        for (j = m - 2; j >= 2; j -= 2) {\n            a[2 * j + 1] = a[j] - a[j + 1];\n            a[2 * j - 1] = -a[j] - a[j + 1];\n        }\n        l = 2;\n        m = mh;\n        while (m >= 2) {\n            dstsub(m, t, nc, w + nw);\n            if (m > 4) {\n                cftfsub(m, t, ip, nw, w);\n                rftfsub(m, t, nc, w + nw);\n            } else if (m == 4) {\n                cftfsub(m, t, ip, nw, w);\n            }\n            a[n - l] = t[1] - t[0];\n            a[l] = t[0] + t[1];\n            k = 0;\n            for (j = 2; j < m; j += 2) {\n                k += l << 2;\n                a[k - l] = -t[j] - t[j + 1];\n                a[k + l] = t[j] - t[j + 1];\n            }\n            l <<= 1;\n            mh = m >> 1;\n            for (j = 1; j < mh; j++) {\n                k = m - j;\n                t[j] = t[m + k] + t[m + j];\n                t[k] = t[m + k] - t[m + j];\n            }\n            t[0] = t[m + mh];\n            m = mh;\n        }\n        a[l] = t[0];\n    }\n    a[0] = 0;\n}\n\n\n/* -------- initializing routines -------- */\n\n\n#include <math.h>\n\nvoid makewt(int nw, int *ip, double *w)\n{\n    void makeipt(int nw, int *ip);\n    int j, nwh, nw0, nw1;\n    double delta, wn4r, wk1r, wk1i, wk3r, wk3i;\n    \n    ip[0] = nw;\n    ip[1] = 1;\n    if (nw > 2) {\n        nwh = nw >> 1;\n        delta = atan(1.0) / nwh;\n        wn4r = cos(delta * nwh);\n        w[0] = 1;\n        w[1] = wn4r;\n        if (nwh == 4) {\n            w[2] = cos(delta * 2);\n            w[3] = sin(delta * 2);\n        } else if (nwh > 4) {\n            makeipt(nw, ip);\n            w[2] = 0.5 / cos(delta * 2);\n            w[3] = 0.5 / cos(delta * 6);\n            for (j = 4; j < nwh; j += 4) {\n                w[j] = cos(delta * j);\n                w[j + 1] = sin(delta * j);\n                w[j + 2] = cos(3 * delta * j);\n                w[j + 3] = -sin(3 * delta * j);\n            }\n        }\n        nw0 = 0;\n        while (nwh > 2) {\n            nw1 = nw0 + nwh;\n            nwh >>= 1;\n            w[nw1] = 1;\n            w[nw1 + 1] = wn4r;\n            if (nwh == 4) {\n                wk1r = w[nw0 + 4];\n                wk1i = w[nw0 + 5];\n                w[nw1 + 2] = wk1r;\n                w[nw1 + 3] = wk1i;\n            } else if (nwh > 4) {\n                wk1r = w[nw0 + 4];\n                wk3r = w[nw0 + 6];\n                w[nw1 + 2] = 0.5 / wk1r;\n                w[nw1 + 3] = 0.5 / wk3r;\n                for (j = 4; j < nwh; j += 4) {\n                    wk1r = w[nw0 + 2 * j];\n                    wk1i = w[nw0 + 2 * j + 1];\n                    wk3r = w[nw0 + 2 * j + 2];\n                    wk3i = w[nw0 + 2 * j + 3];\n                    w[nw1 + j] = wk1r;\n                    w[nw1 + j + 1] = wk1i;\n                    w[nw1 + j + 2] = wk3r;\n                    w[nw1 + j + 3] = wk3i;\n                }\n            }\n            nw0 = nw1;\n        }\n    }\n}\n\n\nvoid makeipt(int nw, int *ip)\n{\n    int j, l, m, m2, p, q;\n    \n    ip[2] = 0;\n    ip[3] = 16;\n    m = 2;\n    for (l = nw; l > 32; l >>= 2) {\n        m2 = m << 1;\n        q = m2 << 3;\n        for (j = m; j < m2; j++) {\n            p = ip[j] << 2;\n            ip[m + j] = p;\n            ip[m2 + j] = p + q;\n        }\n        m = m2;\n    }\n}\n\n\nvoid makect(int nc, int *ip, double *c)\n{\n    int j, nch;\n    double delta;\n    \n    ip[1] = nc;\n    if (nc > 1) {\n        nch = nc >> 1;\n        delta = atan(1.0) / nch;\n        c[0] = cos(delta * nch);\n        c[nch] = 0.5 * c[0];\n        for (j = 1; j < nch; j++) {\n            c[j] = 0.5 * cos(delta * j);\n            c[nc - j] = 0.5 * sin(delta * j);\n        }\n    }\n}\n\n\n/* -------- child routines -------- */\n\n\n#ifdef USE_CDFT_PTHREADS\n#define USE_CDFT_THREADS\n#ifndef CDFT_THREADS_BEGIN_N\n#define CDFT_THREADS_BEGIN_N 8192\n#endif\n#ifndef CDFT_4THREADS_BEGIN_N\n#define CDFT_4THREADS_BEGIN_N 65536\n#endif\n#include <pthread.h>\n#include <stdio.h>\n#include <stdlib.h>\n#define cdft_thread_t pthread_t\n#define cdft_thread_create(thp,func,argp) { \\\n    if (pthread_create(thp, NULL, func, (void *) argp) != 0) { \\\n        fprintf(stderr, \"cdft thread error\\n\"); \\\n        exit(1); \\\n    } \\\n}\n#define cdft_thread_wait(th) { \\\n    if (pthread_join(th, NULL) != 0) { \\\n        fprintf(stderr, \"cdft thread error\\n\"); \\\n        exit(1); \\\n    } \\\n}\n#endif /* USE_CDFT_PTHREADS */\n\n\n#ifdef USE_CDFT_WINTHREADS\n#define USE_CDFT_THREADS\n#ifndef CDFT_THREADS_BEGIN_N\n#define CDFT_THREADS_BEGIN_N 32768\n#endif\n#ifndef CDFT_4THREADS_BEGIN_N\n#define CDFT_4THREADS_BEGIN_N 524288\n#endif\n#include <windows.h>\n#include <stdio.h>\n#include <stdlib.h>\n#define cdft_thread_t HANDLE\n#define cdft_thread_create(thp,func,argp) { \\\n    DWORD thid; \\\n    *(thp) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, (LPVOID) argp, 0, &thid); \\\n    if (*(thp) == 0) { \\\n        fprintf(stderr, \"cdft thread error\\n\"); \\\n        exit(1); \\\n    } \\\n}\n#define cdft_thread_wait(th) { \\\n    WaitForSingleObject(th, INFINITE); \\\n    CloseHandle(th); \\\n}\n#endif /* USE_CDFT_WINTHREADS */\n\n\nvoid cftfsub(int n, double *a, int *ip, int nw, double *w)\n{\n    void bitrv2(int n, int *ip, double *a);\n    void bitrv216(double *a);\n    void bitrv208(double *a);\n    void cftf1st(int n, double *a, double *w);\n    void cftrec4(int n, double *a, int nw, double *w);\n    void cftleaf(int n, int isplt, double *a, int nw, double *w);\n    void cftfx41(int n, double *a, int nw, double *w);\n    void cftf161(double *a, double *w);\n    void cftf081(double *a, double *w);\n    void cftf040(double *a);\n    void cftx020(double *a);\n#ifdef USE_CDFT_THREADS\n    void cftrec4_th(int n, double *a, int nw, double *w);\n#endif /* USE_CDFT_THREADS */\n    \n    if (n > 8) {\n        if (n > 32) {\n            cftf1st(n, a, &w[nw - (n >> 2)]);\n#ifdef USE_CDFT_THREADS\n            if (n > CDFT_THREADS_BEGIN_N) {\n                cftrec4_th(n, a, nw, w);\n            } else \n#endif /* USE_CDFT_THREADS */\n            if (n > 512) {\n                cftrec4(n, a, nw, w);\n            } else if (n > 128) {\n                cftleaf(n, 1, a, nw, w);\n            } else {\n                cftfx41(n, a, nw, w);\n            }\n            bitrv2(n, ip, a);\n        } else if (n == 32) {\n            cftf161(a, &w[nw - 8]);\n            bitrv216(a);\n        } else {\n            cftf081(a, w);\n            bitrv208(a);\n        }\n    } else if (n == 8) {\n        cftf040(a);\n    } else if (n == 4) {\n        cftx020(a);\n    }\n}\n\n\nvoid cftbsub(int n, double *a, int *ip, int nw, double *w)\n{\n    void bitrv2conj(int n, int *ip, double *a);\n    void bitrv216neg(double *a);\n    void bitrv208neg(double *a);\n    void cftb1st(int n, double *a, double *w);\n    void cftrec4(int n, double *a, int nw, double *w);\n    void cftleaf(int n, int isplt, double *a, int nw, double *w);\n    void cftfx41(int n, double *a, int nw, double *w);\n    void cftf161(double *a, double *w);\n    void cftf081(double *a, double *w);\n    void cftb040(double *a);\n    void cftx020(double *a);\n#ifdef USE_CDFT_THREADS\n    void cftrec4_th(int n, double *a, int nw, double *w);\n#endif /* USE_CDFT_THREADS */\n    \n    if (n > 8) {\n        if (n > 32) {\n            cftb1st(n, a, &w[nw - (n >> 2)]);\n#ifdef USE_CDFT_THREADS\n            if (n > CDFT_THREADS_BEGIN_N) {\n                cftrec4_th(n, a, nw, w);\n            } else \n#endif /* USE_CDFT_THREADS */\n            if (n > 512) {\n                cftrec4(n, a, nw, w);\n            } else if (n > 128) {\n                cftleaf(n, 1, a, nw, w);\n            } else {\n                cftfx41(n, a, nw, w);\n            }\n            bitrv2conj(n, ip, a);\n        } else if (n == 32) {\n            cftf161(a, &w[nw - 8]);\n            bitrv216neg(a);\n        } else {\n            cftf081(a, w);\n            bitrv208neg(a);\n        }\n    } else if (n == 8) {\n        cftb040(a);\n    } else if (n == 4) {\n        cftx020(a);\n    }\n}\n\n\nvoid bitrv2(int n, int *ip, double *a)\n{\n    int j, j1, k, k1, l, m, nh, nm;\n    double xr, xi, yr, yi;\n    \n    m = 1;\n    for (l = n >> 2; l > 8; l >>= 2) {\n        m <<= 1;\n    }\n    nh = n >> 1;\n    nm = 4 * m;\n    if (l == 8) {\n        for (k = 0; k < m; k++) {\n            for (j = 0; j < k; j++) {\n                j1 = 4 * j + 2 * ip[m + k];\n                k1 = 4 * k + 2 * ip[m + j];\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nh;\n                k1 += 2;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += 2;\n                k1 += nh;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nh;\n                k1 -= 2;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n            }\n            k1 = 4 * k + 2 * ip[m + k];\n            j1 = k1 + 2;\n            k1 += nh;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 += nm;\n            k1 += 2 * nm;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 += nm;\n            k1 -= nm;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 -= 2;\n            k1 -= nh;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 += nh + 2;\n            k1 += nh + 2;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 -= nh - nm;\n            k1 += 2 * nm - 2;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n        }\n    } else {\n        for (k = 0; k < m; k++) {\n            for (j = 0; j < k; j++) {\n                j1 = 4 * j + ip[m + k];\n                k1 = 4 * k + ip[m + j];\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nh;\n                k1 += 2;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += 2;\n                k1 += nh;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nh;\n                k1 -= 2;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n            }\n            k1 = 4 * k + ip[m + k];\n            j1 = k1 + 2;\n            k1 += nh;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 += nm;\n            k1 += nm;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n        }\n    }\n}\n\n\nvoid bitrv2conj(int n, int *ip, double *a)\n{\n    int j, j1, k, k1, l, m, nh, nm;\n    double xr, xi, yr, yi;\n    \n    m = 1;\n    for (l = n >> 2; l > 8; l >>= 2) {\n        m <<= 1;\n    }\n    nh = n >> 1;\n    nm = 4 * m;\n    if (l == 8) {\n        for (k = 0; k < m; k++) {\n            for (j = 0; j < k; j++) {\n                j1 = 4 * j + 2 * ip[m + k];\n                k1 = 4 * k + 2 * ip[m + j];\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nh;\n                k1 += 2;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += 2;\n                k1 += nh;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nh;\n                k1 -= 2;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n            }\n            k1 = 4 * k + 2 * ip[m + k];\n            j1 = k1 + 2;\n            k1 += nh;\n            a[j1 - 1] = -a[j1 - 1];\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            a[k1 + 3] = -a[k1 + 3];\n            j1 += nm;\n            k1 += 2 * nm;\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 += nm;\n            k1 -= nm;\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 -= 2;\n            k1 -= nh;\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 += nh + 2;\n            k1 += nh + 2;\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 -= nh - nm;\n            k1 += 2 * nm - 2;\n            a[j1 - 1] = -a[j1 - 1];\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            a[k1 + 3] = -a[k1 + 3];\n        }\n    } else {\n        for (k = 0; k < m; k++) {\n            for (j = 0; j < k; j++) {\n                j1 = 4 * j + ip[m + k];\n                k1 = 4 * k + ip[m + j];\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nh;\n                k1 += 2;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += 2;\n                k1 += nh;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nh;\n                k1 -= 2;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n            }\n            k1 = 4 * k + ip[m + k];\n            j1 = k1 + 2;\n            k1 += nh;\n            a[j1 - 1] = -a[j1 - 1];\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            a[k1 + 3] = -a[k1 + 3];\n            j1 += nm;\n            k1 += nm;\n            a[j1 - 1] = -a[j1 - 1];\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            a[k1 + 3] = -a[k1 + 3];\n        }\n    }\n}\n\n\nvoid bitrv216(double *a)\n{\n    double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, \n        x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i, \n        x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i;\n    \n    x1r = a[2];\n    x1i = a[3];\n    x2r = a[4];\n    x2i = a[5];\n    x3r = a[6];\n    x3i = a[7];\n    x4r = a[8];\n    x4i = a[9];\n    x5r = a[10];\n    x5i = a[11];\n    x7r = a[14];\n    x7i = a[15];\n    x8r = a[16];\n    x8i = a[17];\n    x10r = a[20];\n    x10i = a[21];\n    x11r = a[22];\n    x11i = a[23];\n    x12r = a[24];\n    x12i = a[25];\n    x13r = a[26];\n    x13i = a[27];\n    x14r = a[28];\n    x14i = a[29];\n    a[2] = x8r;\n    a[3] = x8i;\n    a[4] = x4r;\n    a[5] = x4i;\n    a[6] = x12r;\n    a[7] = x12i;\n    a[8] = x2r;\n    a[9] = x2i;\n    a[10] = x10r;\n    a[11] = x10i;\n    a[14] = x14r;\n    a[15] = x14i;\n    a[16] = x1r;\n    a[17] = x1i;\n    a[20] = x5r;\n    a[21] = x5i;\n    a[22] = x13r;\n    a[23] = x13i;\n    a[24] = x3r;\n    a[25] = x3i;\n    a[26] = x11r;\n    a[27] = x11i;\n    a[28] = x7r;\n    a[29] = x7i;\n}\n\n\nvoid bitrv216neg(double *a)\n{\n    double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, \n        x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i, \n        x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, \n        x13r, x13i, x14r, x14i, x15r, x15i;\n    \n    x1r = a[2];\n    x1i = a[3];\n    x2r = a[4];\n    x2i = a[5];\n    x3r = a[6];\n    x3i = a[7];\n    x4r = a[8];\n    x4i = a[9];\n    x5r = a[10];\n    x5i = a[11];\n    x6r = a[12];\n    x6i = a[13];\n    x7r = a[14];\n    x7i = a[15];\n    x8r = a[16];\n    x8i = a[17];\n    x9r = a[18];\n    x9i = a[19];\n    x10r = a[20];\n    x10i = a[21];\n    x11r = a[22];\n    x11i = a[23];\n    x12r = a[24];\n    x12i = a[25];\n    x13r = a[26];\n    x13i = a[27];\n    x14r = a[28];\n    x14i = a[29];\n    x15r = a[30];\n    x15i = a[31];\n    a[2] = x15r;\n    a[3] = x15i;\n    a[4] = x7r;\n    a[5] = x7i;\n    a[6] = x11r;\n    a[7] = x11i;\n    a[8] = x3r;\n    a[9] = x3i;\n    a[10] = x13r;\n    a[11] = x13i;\n    a[12] = x5r;\n    a[13] = x5i;\n    a[14] = x9r;\n    a[15] = x9i;\n    a[16] = x1r;\n    a[17] = x1i;\n    a[18] = x14r;\n    a[19] = x14i;\n    a[20] = x6r;\n    a[21] = x6i;\n    a[22] = x10r;\n    a[23] = x10i;\n    a[24] = x2r;\n    a[25] = x2i;\n    a[26] = x12r;\n    a[27] = x12i;\n    a[28] = x4r;\n    a[29] = x4i;\n    a[30] = x8r;\n    a[31] = x8i;\n}\n\n\nvoid bitrv208(double *a)\n{\n    double x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i;\n    \n    x1r = a[2];\n    x1i = a[3];\n    x3r = a[6];\n    x3i = a[7];\n    x4r = a[8];\n    x4i = a[9];\n    x6r = a[12];\n    x6i = a[13];\n    a[2] = x4r;\n    a[3] = x4i;\n    a[6] = x6r;\n    a[7] = x6i;\n    a[8] = x1r;\n    a[9] = x1i;\n    a[12] = x3r;\n    a[13] = x3i;\n}\n\n\nvoid bitrv208neg(double *a)\n{\n    double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, \n        x5r, x5i, x6r, x6i, x7r, x7i;\n    \n    x1r = a[2];\n    x1i = a[3];\n    x2r = a[4];\n    x2i = a[5];\n    x3r = a[6];\n    x3i = a[7];\n    x4r = a[8];\n    x4i = a[9];\n    x5r = a[10];\n    x5i = a[11];\n    x6r = a[12];\n    x6i = a[13];\n    x7r = a[14];\n    x7i = a[15];\n    a[2] = x7r;\n    a[3] = x7i;\n    a[4] = x3r;\n    a[5] = x3i;\n    a[6] = x5r;\n    a[7] = x5i;\n    a[8] = x1r;\n    a[9] = x1i;\n    a[10] = x6r;\n    a[11] = x6i;\n    a[12] = x2r;\n    a[13] = x2i;\n    a[14] = x4r;\n    a[15] = x4i;\n}\n\n\nvoid cftf1st(int n, double *a, double *w)\n{\n    int j, j0, j1, j2, j3, k, m, mh;\n    double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, \n        wd1r, wd1i, wd3r, wd3i;\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, \n        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;\n    \n    mh = n >> 3;\n    m = 2 * mh;\n    j1 = m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[0] + a[j2];\n    x0i = a[1] + a[j2 + 1];\n    x1r = a[0] - a[j2];\n    x1i = a[1] - a[j2 + 1];\n    x2r = a[j1] + a[j3];\n    x2i = a[j1 + 1] + a[j3 + 1];\n    x3r = a[j1] - a[j3];\n    x3i = a[j1 + 1] - a[j3 + 1];\n    a[0] = x0r + x2r;\n    a[1] = x0i + x2i;\n    a[j1] = x0r - x2r;\n    a[j1 + 1] = x0i - x2i;\n    a[j2] = x1r - x3i;\n    a[j2 + 1] = x1i + x3r;\n    a[j3] = x1r + x3i;\n    a[j3 + 1] = x1i - x3r;\n    wn4r = w[1];\n    csc1 = w[2];\n    csc3 = w[3];\n    wd1r = 1;\n    wd1i = 0;\n    wd3r = 1;\n    wd3i = 0;\n    k = 0;\n    for (j = 2; j < mh - 2; j += 4) {\n        k += 4;\n        wk1r = csc1 * (wd1r + w[k]);\n        wk1i = csc1 * (wd1i + w[k + 1]);\n        wk3r = csc3 * (wd3r + w[k + 2]);\n        wk3i = csc3 * (wd3i + w[k + 3]);\n        wd1r = w[k];\n        wd1i = w[k + 1];\n        wd3r = w[k + 2];\n        wd3i = w[k + 3];\n        j1 = j + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j] + a[j2];\n        x0i = a[j + 1] + a[j2 + 1];\n        x1r = a[j] - a[j2];\n        x1i = a[j + 1] - a[j2 + 1];\n        y0r = a[j + 2] + a[j2 + 2];\n        y0i = a[j + 3] + a[j2 + 3];\n        y1r = a[j + 2] - a[j2 + 2];\n        y1i = a[j + 3] - a[j2 + 3];\n        x2r = a[j1] + a[j3];\n        x2i = a[j1 + 1] + a[j3 + 1];\n        x3r = a[j1] - a[j3];\n        x3i = a[j1 + 1] - a[j3 + 1];\n        y2r = a[j1 + 2] + a[j3 + 2];\n        y2i = a[j1 + 3] + a[j3 + 3];\n        y3r = a[j1 + 2] - a[j3 + 2];\n        y3i = a[j1 + 3] - a[j3 + 3];\n        a[j] = x0r + x2r;\n        a[j + 1] = x0i + x2i;\n        a[j + 2] = y0r + y2r;\n        a[j + 3] = y0i + y2i;\n        a[j1] = x0r - x2r;\n        a[j1 + 1] = x0i - x2i;\n        a[j1 + 2] = y0r - y2r;\n        a[j1 + 3] = y0i - y2i;\n        x0r = x1r - x3i;\n        x0i = x1i + x3r;\n        a[j2] = wk1r * x0r - wk1i * x0i;\n        a[j2 + 1] = wk1r * x0i + wk1i * x0r;\n        x0r = y1r - y3i;\n        x0i = y1i + y3r;\n        a[j2 + 2] = wd1r * x0r - wd1i * x0i;\n        a[j2 + 3] = wd1r * x0i + wd1i * x0r;\n        x0r = x1r + x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3r * x0r + wk3i * x0i;\n        a[j3 + 1] = wk3r * x0i - wk3i * x0r;\n        x0r = y1r + y3i;\n        x0i = y1i - y3r;\n        a[j3 + 2] = wd3r * x0r + wd3i * x0i;\n        a[j3 + 3] = wd3r * x0i - wd3i * x0r;\n        j0 = m - j;\n        j1 = j0 + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j0] + a[j2];\n        x0i = a[j0 + 1] + a[j2 + 1];\n        x1r = a[j0] - a[j2];\n        x1i = a[j0 + 1] - a[j2 + 1];\n        y0r = a[j0 - 2] + a[j2 - 2];\n        y0i = a[j0 - 1] + a[j2 - 1];\n        y1r = a[j0 - 2] - a[j2 - 2];\n        y1i = a[j0 - 1] - a[j2 - 1];\n        x2r = a[j1] + a[j3];\n        x2i = a[j1 + 1] + a[j3 + 1];\n        x3r = a[j1] - a[j3];\n        x3i = a[j1 + 1] - a[j3 + 1];\n        y2r = a[j1 - 2] + a[j3 - 2];\n        y2i = a[j1 - 1] + a[j3 - 1];\n        y3r = a[j1 - 2] - a[j3 - 2];\n        y3i = a[j1 - 1] - a[j3 - 1];\n        a[j0] = x0r + x2r;\n        a[j0 + 1] = x0i + x2i;\n        a[j0 - 2] = y0r + y2r;\n        a[j0 - 1] = y0i + y2i;\n        a[j1] = x0r - x2r;\n        a[j1 + 1] = x0i - x2i;\n        a[j1 - 2] = y0r - y2r;\n        a[j1 - 1] = y0i - y2i;\n        x0r = x1r - x3i;\n        x0i = x1i + x3r;\n        a[j2] = wk1i * x0r - wk1r * x0i;\n        a[j2 + 1] = wk1i * x0i + wk1r * x0r;\n        x0r = y1r - y3i;\n        x0i = y1i + y3r;\n        a[j2 - 2] = wd1i * x0r - wd1r * x0i;\n        a[j2 - 1] = wd1i * x0i + wd1r * x0r;\n        x0r = x1r + x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3i * x0r + wk3r * x0i;\n        a[j3 + 1] = wk3i * x0i - wk3r * x0r;\n        x0r = y1r + y3i;\n        x0i = y1i - y3r;\n        a[j3 - 2] = wd3i * x0r + wd3r * x0i;\n        a[j3 - 1] = wd3i * x0i - wd3r * x0r;\n    }\n    wk1r = csc1 * (wd1r + wn4r);\n    wk1i = csc1 * (wd1i + wn4r);\n    wk3r = csc3 * (wd3r - wn4r);\n    wk3i = csc3 * (wd3i - wn4r);\n    j0 = mh;\n    j1 = j0 + m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[j0 - 2] + a[j2 - 2];\n    x0i = a[j0 - 1] + a[j2 - 1];\n    x1r = a[j0 - 2] - a[j2 - 2];\n    x1i = a[j0 - 1] - a[j2 - 1];\n    x2r = a[j1 - 2] + a[j3 - 2];\n    x2i = a[j1 - 1] + a[j3 - 1];\n    x3r = a[j1 - 2] - a[j3 - 2];\n    x3i = a[j1 - 1] - a[j3 - 1];\n    a[j0 - 2] = x0r + x2r;\n    a[j0 - 1] = x0i + x2i;\n    a[j1 - 2] = x0r - x2r;\n    a[j1 - 1] = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    a[j2 - 2] = wk1r * x0r - wk1i * x0i;\n    a[j2 - 1] = wk1r * x0i + wk1i * x0r;\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    a[j3 - 2] = wk3r * x0r + wk3i * x0i;\n    a[j3 - 1] = wk3r * x0i - wk3i * x0r;\n    x0r = a[j0] + a[j2];\n    x0i = a[j0 + 1] + a[j2 + 1];\n    x1r = a[j0] - a[j2];\n    x1i = a[j0 + 1] - a[j2 + 1];\n    x2r = a[j1] + a[j3];\n    x2i = a[j1 + 1] + a[j3 + 1];\n    x3r = a[j1] - a[j3];\n    x3i = a[j1 + 1] - a[j3 + 1];\n    a[j0] = x0r + x2r;\n    a[j0 + 1] = x0i + x2i;\n    a[j1] = x0r - x2r;\n    a[j1 + 1] = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    a[j2] = wn4r * (x0r - x0i);\n    a[j2 + 1] = wn4r * (x0i + x0r);\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    a[j3] = -wn4r * (x0r + x0i);\n    a[j3 + 1] = -wn4r * (x0i - x0r);\n    x0r = a[j0 + 2] + a[j2 + 2];\n    x0i = a[j0 + 3] + a[j2 + 3];\n    x1r = a[j0 + 2] - a[j2 + 2];\n    x1i = a[j0 + 3] - a[j2 + 3];\n    x2r = a[j1 + 2] + a[j3 + 2];\n    x2i = a[j1 + 3] + a[j3 + 3];\n    x3r = a[j1 + 2] - a[j3 + 2];\n    x3i = a[j1 + 3] - a[j3 + 3];\n    a[j0 + 2] = x0r + x2r;\n    a[j0 + 3] = x0i + x2i;\n    a[j1 + 2] = x0r - x2r;\n    a[j1 + 3] = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    a[j2 + 2] = wk1i * x0r - wk1r * x0i;\n    a[j2 + 3] = wk1i * x0i + wk1r * x0r;\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    a[j3 + 2] = wk3i * x0r + wk3r * x0i;\n    a[j3 + 3] = wk3i * x0i - wk3r * x0r;\n}\n\n\nvoid cftb1st(int n, double *a, double *w)\n{\n    int j, j0, j1, j2, j3, k, m, mh;\n    double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, \n        wd1r, wd1i, wd3r, wd3i;\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, \n        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;\n    \n    mh = n >> 3;\n    m = 2 * mh;\n    j1 = m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[0] + a[j2];\n    x0i = -a[1] - a[j2 + 1];\n    x1r = a[0] - a[j2];\n    x1i = -a[1] + a[j2 + 1];\n    x2r = a[j1] + a[j3];\n    x2i = a[j1 + 1] + a[j3 + 1];\n    x3r = a[j1] - a[j3];\n    x3i = a[j1 + 1] - a[j3 + 1];\n    a[0] = x0r + x2r;\n    a[1] = x0i - x2i;\n    a[j1] = x0r - x2r;\n    a[j1 + 1] = x0i + x2i;\n    a[j2] = x1r + x3i;\n    a[j2 + 1] = x1i + x3r;\n    a[j3] = x1r - x3i;\n    a[j3 + 1] = x1i - x3r;\n    wn4r = w[1];\n    csc1 = w[2];\n    csc3 = w[3];\n    wd1r = 1;\n    wd1i = 0;\n    wd3r = 1;\n    wd3i = 0;\n    k = 0;\n    for (j = 2; j < mh - 2; j += 4) {\n        k += 4;\n        wk1r = csc1 * (wd1r + w[k]);\n        wk1i = csc1 * (wd1i + w[k + 1]);\n        wk3r = csc3 * (wd3r + w[k + 2]);\n        wk3i = csc3 * (wd3i + w[k + 3]);\n        wd1r = w[k];\n        wd1i = w[k + 1];\n        wd3r = w[k + 2];\n        wd3i = w[k + 3];\n        j1 = j + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j] + a[j2];\n        x0i = -a[j + 1] - a[j2 + 1];\n        x1r = a[j] - a[j2];\n        x1i = -a[j + 1] + a[j2 + 1];\n        y0r = a[j + 2] + a[j2 + 2];\n        y0i = -a[j + 3] - a[j2 + 3];\n        y1r = a[j + 2] - a[j2 + 2];\n        y1i = -a[j + 3] + a[j2 + 3];\n        x2r = a[j1] + a[j3];\n        x2i = a[j1 + 1] + a[j3 + 1];\n        x3r = a[j1] - a[j3];\n        x3i = a[j1 + 1] - a[j3 + 1];\n        y2r = a[j1 + 2] + a[j3 + 2];\n        y2i = a[j1 + 3] + a[j3 + 3];\n        y3r = a[j1 + 2] - a[j3 + 2];\n        y3i = a[j1 + 3] - a[j3 + 3];\n        a[j] = x0r + x2r;\n        a[j + 1] = x0i - x2i;\n        a[j + 2] = y0r + y2r;\n        a[j + 3] = y0i - y2i;\n        a[j1] = x0r - x2r;\n        a[j1 + 1] = x0i + x2i;\n        a[j1 + 2] = y0r - y2r;\n        a[j1 + 3] = y0i + y2i;\n        x0r = x1r + x3i;\n        x0i = x1i + x3r;\n        a[j2] = wk1r * x0r - wk1i * x0i;\n        a[j2 + 1] = wk1r * x0i + wk1i * x0r;\n        x0r = y1r + y3i;\n        x0i = y1i + y3r;\n        a[j2 + 2] = wd1r * x0r - wd1i * x0i;\n        a[j2 + 3] = wd1r * x0i + wd1i * x0r;\n        x0r = x1r - x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3r * x0r + wk3i * x0i;\n        a[j3 + 1] = wk3r * x0i - wk3i * x0r;\n        x0r = y1r - y3i;\n        x0i = y1i - y3r;\n        a[j3 + 2] = wd3r * x0r + wd3i * x0i;\n        a[j3 + 3] = wd3r * x0i - wd3i * x0r;\n        j0 = m - j;\n        j1 = j0 + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j0] + a[j2];\n        x0i = -a[j0 + 1] - a[j2 + 1];\n        x1r = a[j0] - a[j2];\n        x1i = -a[j0 + 1] + a[j2 + 1];\n        y0r = a[j0 - 2] + a[j2 - 2];\n        y0i = -a[j0 - 1] - a[j2 - 1];\n        y1r = a[j0 - 2] - a[j2 - 2];\n        y1i = -a[j0 - 1] + a[j2 - 1];\n        x2r = a[j1] + a[j3];\n        x2i = a[j1 + 1] + a[j3 + 1];\n        x3r = a[j1] - a[j3];\n        x3i = a[j1 + 1] - a[j3 + 1];\n        y2r = a[j1 - 2] + a[j3 - 2];\n        y2i = a[j1 - 1] + a[j3 - 1];\n        y3r = a[j1 - 2] - a[j3 - 2];\n        y3i = a[j1 - 1] - a[j3 - 1];\n        a[j0] = x0r + x2r;\n        a[j0 + 1] = x0i - x2i;\n        a[j0 - 2] = y0r + y2r;\n        a[j0 - 1] = y0i - y2i;\n        a[j1] = x0r - x2r;\n        a[j1 + 1] = x0i + x2i;\n        a[j1 - 2] = y0r - y2r;\n        a[j1 - 1] = y0i + y2i;\n        x0r = x1r + x3i;\n        x0i = x1i + x3r;\n        a[j2] = wk1i * x0r - wk1r * x0i;\n        a[j2 + 1] = wk1i * x0i + wk1r * x0r;\n        x0r = y1r + y3i;\n        x0i = y1i + y3r;\n        a[j2 - 2] = wd1i * x0r - wd1r * x0i;\n        a[j2 - 1] = wd1i * x0i + wd1r * x0r;\n        x0r = x1r - x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3i * x0r + wk3r * x0i;\n        a[j3 + 1] = wk3i * x0i - wk3r * x0r;\n        x0r = y1r - y3i;\n        x0i = y1i - y3r;\n        a[j3 - 2] = wd3i * x0r + wd3r * x0i;\n        a[j3 - 1] = wd3i * x0i - wd3r * x0r;\n    }\n    wk1r = csc1 * (wd1r + wn4r);\n    wk1i = csc1 * (wd1i + wn4r);\n    wk3r = csc3 * (wd3r - wn4r);\n    wk3i = csc3 * (wd3i - wn4r);\n    j0 = mh;\n    j1 = j0 + m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[j0 - 2] + a[j2 - 2];\n    x0i = -a[j0 - 1] - a[j2 - 1];\n    x1r = a[j0 - 2] - a[j2 - 2];\n    x1i = -a[j0 - 1] + a[j2 - 1];\n    x2r = a[j1 - 2] + a[j3 - 2];\n    x2i = a[j1 - 1] + a[j3 - 1];\n    x3r = a[j1 - 2] - a[j3 - 2];\n    x3i = a[j1 - 1] - a[j3 - 1];\n    a[j0 - 2] = x0r + x2r;\n    a[j0 - 1] = x0i - x2i;\n    a[j1 - 2] = x0r - x2r;\n    a[j1 - 1] = x0i + x2i;\n    x0r = x1r + x3i;\n    x0i = x1i + x3r;\n    a[j2 - 2] = wk1r * x0r - wk1i * x0i;\n    a[j2 - 1] = wk1r * x0i + wk1i * x0r;\n    x0r = x1r - x3i;\n    x0i = x1i - x3r;\n    a[j3 - 2] = wk3r * x0r + wk3i * x0i;\n    a[j3 - 1] = wk3r * x0i - wk3i * x0r;\n    x0r = a[j0] + a[j2];\n    x0i = -a[j0 + 1] - a[j2 + 1];\n    x1r = a[j0] - a[j2];\n    x1i = -a[j0 + 1] + a[j2 + 1];\n    x2r = a[j1] + a[j3];\n    x2i = a[j1 + 1] + a[j3 + 1];\n    x3r = a[j1] - a[j3];\n    x3i = a[j1 + 1] - a[j3 + 1];\n    a[j0] = x0r + x2r;\n    a[j0 + 1] = x0i - x2i;\n    a[j1] = x0r - x2r;\n    a[j1 + 1] = x0i + x2i;\n    x0r = x1r + x3i;\n    x0i = x1i + x3r;\n    a[j2] = wn4r * (x0r - x0i);\n    a[j2 + 1] = wn4r * (x0i + x0r);\n    x0r = x1r - x3i;\n    x0i = x1i - x3r;\n    a[j3] = -wn4r * (x0r + x0i);\n    a[j3 + 1] = -wn4r * (x0i - x0r);\n    x0r = a[j0 + 2] + a[j2 + 2];\n    x0i = -a[j0 + 3] - a[j2 + 3];\n    x1r = a[j0 + 2] - a[j2 + 2];\n    x1i = -a[j0 + 3] + a[j2 + 3];\n    x2r = a[j1 + 2] + a[j3 + 2];\n    x2i = a[j1 + 3] + a[j3 + 3];\n    x3r = a[j1 + 2] - a[j3 + 2];\n    x3i = a[j1 + 3] - a[j3 + 3];\n    a[j0 + 2] = x0r + x2r;\n    a[j0 + 3] = x0i - x2i;\n    a[j1 + 2] = x0r - x2r;\n    a[j1 + 3] = x0i + x2i;\n    x0r = x1r + x3i;\n    x0i = x1i + x3r;\n    a[j2 + 2] = wk1i * x0r - wk1r * x0i;\n    a[j2 + 3] = wk1i * x0i + wk1r * x0r;\n    x0r = x1r - x3i;\n    x0i = x1i - x3r;\n    a[j3 + 2] = wk3i * x0r + wk3r * x0i;\n    a[j3 + 3] = wk3i * x0i - wk3r * x0r;\n}\n\n\n#ifdef USE_CDFT_THREADS\nstruct cdft_arg_st {\n    int n0;\n    int n;\n    double *a;\n    int nw;\n    double *w;\n};\ntypedef struct cdft_arg_st cdft_arg_t;\n\n\nvoid cftrec4_th(int n, double *a, int nw, double *w)\n{\n    void *cftrec1_th(void *p);\n    void *cftrec2_th(void *p);\n    int i, idiv4, m, nthread;\n    cdft_thread_t th[4];\n    cdft_arg_t ag[4];\n    \n    nthread = 2;\n    idiv4 = 0;\n    m = n >> 1;\n    if (n > CDFT_4THREADS_BEGIN_N) {\n        nthread = 4;\n        idiv4 = 1;\n        m >>= 1;\n    }\n    for (i = 0; i < nthread; i++) {\n        ag[i].n0 = n;\n        ag[i].n = m;\n        ag[i].a = &a[i * m];\n        ag[i].nw = nw;\n        ag[i].w = w;\n        if (i != idiv4) {\n            cdft_thread_create(&th[i], cftrec1_th, &ag[i]);\n        } else {\n            cdft_thread_create(&th[i], cftrec2_th, &ag[i]);\n        }\n    }\n    for (i = 0; i < nthread; i++) {\n        cdft_thread_wait(th[i]);\n    }\n}\n\n\nvoid *cftrec1_th(void *p)\n{\n    int cfttree(int n, int j, int k, double *a, int nw, double *w);\n    void cftleaf(int n, int isplt, double *a, int nw, double *w);\n    void cftmdl1(int n, double *a, double *w);\n    int isplt, j, k, m, n, n0, nw;\n    double *a, *w;\n    \n    n0 = ((cdft_arg_t *) p)->n0;\n    n = ((cdft_arg_t *) p)->n;\n    a = ((cdft_arg_t *) p)->a;\n    nw = ((cdft_arg_t *) p)->nw;\n    w = ((cdft_arg_t *) p)->w;\n    m = n0;\n    while (m > 512) {\n        m >>= 2;\n        cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);\n    }\n    cftleaf(m, 1, &a[n - m], nw, w);\n    k = 0;\n    for (j = n - m; j > 0; j -= m) {\n        k++;\n        isplt = cfttree(m, j, k, a, nw, w);\n        cftleaf(m, isplt, &a[j - m], nw, w);\n    }\n    return (void *) 0;\n}\n\n\nvoid *cftrec2_th(void *p)\n{\n    int cfttree(int n, int j, int k, double *a, int nw, double *w);\n    void cftleaf(int n, int isplt, double *a, int nw, double *w);\n    void cftmdl2(int n, double *a, double *w);\n    int isplt, j, k, m, n, n0, nw;\n    double *a, *w;\n    \n    n0 = ((cdft_arg_t *) p)->n0;\n    n = ((cdft_arg_t *) p)->n;\n    a = ((cdft_arg_t *) p)->a;\n    nw = ((cdft_arg_t *) p)->nw;\n    w = ((cdft_arg_t *) p)->w;\n    k = 1;\n    m = n0;\n    while (m > 512) {\n        m >>= 2;\n        k <<= 2;\n        cftmdl2(m, &a[n - m], &w[nw - m]);\n    }\n    cftleaf(m, 0, &a[n - m], nw, w);\n    k >>= 1;\n    for (j = n - m; j > 0; j -= m) {\n        k++;\n        isplt = cfttree(m, j, k, a, nw, w);\n        cftleaf(m, isplt, &a[j - m], nw, w);\n    }\n    return (void *) 0;\n}\n#endif /* USE_CDFT_THREADS */\n\n\nvoid cftrec4(int n, double *a, int nw, double *w)\n{\n    int cfttree(int n, int j, int k, double *a, int nw, double *w);\n    void cftleaf(int n, int isplt, double *a, int nw, double *w);\n    void cftmdl1(int n, double *a, double *w);\n    int isplt, j, k, m;\n    \n    m = n;\n    while (m > 512) {\n        m >>= 2;\n        cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);\n    }\n    cftleaf(m, 1, &a[n - m], nw, w);\n    k = 0;\n    for (j = n - m; j > 0; j -= m) {\n        k++;\n        isplt = cfttree(m, j, k, a, nw, w);\n        cftleaf(m, isplt, &a[j - m], nw, w);\n    }\n}\n\n\nint cfttree(int n, int j, int k, double *a, int nw, double *w)\n{\n    void cftmdl1(int n, double *a, double *w);\n    void cftmdl2(int n, double *a, double *w);\n    int i, isplt, m;\n    \n    if ((k & 3) != 0) {\n        isplt = k & 1;\n        if (isplt != 0) {\n            cftmdl1(n, &a[j - n], &w[nw - (n >> 1)]);\n        } else {\n            cftmdl2(n, &a[j - n], &w[nw - n]);\n        }\n    } else {\n        m = n;\n        for (i = k; (i & 3) == 0; i >>= 2) {\n            m <<= 2;\n        }\n        isplt = i & 1;\n        if (isplt != 0) {\n            while (m > 128) {\n                cftmdl1(m, &a[j - m], &w[nw - (m >> 1)]);\n                m >>= 2;\n            }\n        } else {\n            while (m > 128) {\n                cftmdl2(m, &a[j - m], &w[nw - m]);\n                m >>= 2;\n            }\n        }\n    }\n    return isplt;\n}\n\n\nvoid cftleaf(int n, int isplt, double *a, int nw, double *w)\n{\n    void cftmdl1(int n, double *a, double *w);\n    void cftmdl2(int n, double *a, double *w);\n    void cftf161(double *a, double *w);\n    void cftf162(double *a, double *w);\n    void cftf081(double *a, double *w);\n    void cftf082(double *a, double *w);\n    \n    if (n == 512) {\n        cftmdl1(128, a, &w[nw - 64]);\n        cftf161(a, &w[nw - 8]);\n        cftf162(&a[32], &w[nw - 32]);\n        cftf161(&a[64], &w[nw - 8]);\n        cftf161(&a[96], &w[nw - 8]);\n        cftmdl2(128, &a[128], &w[nw - 128]);\n        cftf161(&a[128], &w[nw - 8]);\n        cftf162(&a[160], &w[nw - 32]);\n        cftf161(&a[192], &w[nw - 8]);\n        cftf162(&a[224], &w[nw - 32]);\n        cftmdl1(128, &a[256], &w[nw - 64]);\n        cftf161(&a[256], &w[nw - 8]);\n        cftf162(&a[288], &w[nw - 32]);\n        cftf161(&a[320], &w[nw - 8]);\n        cftf161(&a[352], &w[nw - 8]);\n        if (isplt != 0) {\n            cftmdl1(128, &a[384], &w[nw - 64]);\n            cftf161(&a[480], &w[nw - 8]);\n        } else {\n            cftmdl2(128, &a[384], &w[nw - 128]);\n            cftf162(&a[480], &w[nw - 32]);\n        }\n        cftf161(&a[384], &w[nw - 8]);\n        cftf162(&a[416], &w[nw - 32]);\n        cftf161(&a[448], &w[nw - 8]);\n    } else {\n        cftmdl1(64, a, &w[nw - 32]);\n        cftf081(a, &w[nw - 8]);\n        cftf082(&a[16], &w[nw - 8]);\n        cftf081(&a[32], &w[nw - 8]);\n        cftf081(&a[48], &w[nw - 8]);\n        cftmdl2(64, &a[64], &w[nw - 64]);\n        cftf081(&a[64], &w[nw - 8]);\n        cftf082(&a[80], &w[nw - 8]);\n        cftf081(&a[96], &w[nw - 8]);\n        cftf082(&a[112], &w[nw - 8]);\n        cftmdl1(64, &a[128], &w[nw - 32]);\n        cftf081(&a[128], &w[nw - 8]);\n        cftf082(&a[144], &w[nw - 8]);\n        cftf081(&a[160], &w[nw - 8]);\n        cftf081(&a[176], &w[nw - 8]);\n        if (isplt != 0) {\n            cftmdl1(64, &a[192], &w[nw - 32]);\n            cftf081(&a[240], &w[nw - 8]);\n        } else {\n            cftmdl2(64, &a[192], &w[nw - 64]);\n            cftf082(&a[240], &w[nw - 8]);\n        }\n        cftf081(&a[192], &w[nw - 8]);\n        cftf082(&a[208], &w[nw - 8]);\n        cftf081(&a[224], &w[nw - 8]);\n    }\n}\n\n\nvoid cftmdl1(int n, double *a, double *w)\n{\n    int j, j0, j1, j2, j3, k, m, mh;\n    double wn4r, wk1r, wk1i, wk3r, wk3i;\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;\n    \n    mh = n >> 3;\n    m = 2 * mh;\n    j1 = m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[0] + a[j2];\n    x0i = a[1] + a[j2 + 1];\n    x1r = a[0] - a[j2];\n    x1i = a[1] - a[j2 + 1];\n    x2r = a[j1] + a[j3];\n    x2i = a[j1 + 1] + a[j3 + 1];\n    x3r = a[j1] - a[j3];\n    x3i = a[j1 + 1] - a[j3 + 1];\n    a[0] = x0r + x2r;\n    a[1] = x0i + x2i;\n    a[j1] = x0r - x2r;\n    a[j1 + 1] = x0i - x2i;\n    a[j2] = x1r - x3i;\n    a[j2 + 1] = x1i + x3r;\n    a[j3] = x1r + x3i;\n    a[j3 + 1] = x1i - x3r;\n    wn4r = w[1];\n    k = 0;\n    for (j = 2; j < mh; j += 2) {\n        k += 4;\n        wk1r = w[k];\n        wk1i = w[k + 1];\n        wk3r = w[k + 2];\n        wk3i = w[k + 3];\n        j1 = j + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j] + a[j2];\n        x0i = a[j + 1] + a[j2 + 1];\n        x1r = a[j] - a[j2];\n        x1i = a[j + 1] - a[j2 + 1];\n        x2r = a[j1] + a[j3];\n        x2i = a[j1 + 1] + a[j3 + 1];\n        x3r = a[j1] - a[j3];\n        x3i = a[j1 + 1] - a[j3 + 1];\n        a[j] = x0r + x2r;\n        a[j + 1] = x0i + x2i;\n        a[j1] = x0r - x2r;\n        a[j1 + 1] = x0i - x2i;\n        x0r = x1r - x3i;\n        x0i = x1i + x3r;\n        a[j2] = wk1r * x0r - wk1i * x0i;\n        a[j2 + 1] = wk1r * x0i + wk1i * x0r;\n        x0r = x1r + x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3r * x0r + wk3i * x0i;\n        a[j3 + 1] = wk3r * x0i - wk3i * x0r;\n        j0 = m - j;\n        j1 = j0 + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j0] + a[j2];\n        x0i = a[j0 + 1] + a[j2 + 1];\n        x1r = a[j0] - a[j2];\n        x1i = a[j0 + 1] - a[j2 + 1];\n        x2r = a[j1] + a[j3];\n        x2i = a[j1 + 1] + a[j3 + 1];\n        x3r = a[j1] - a[j3];\n        x3i = a[j1 + 1] - a[j3 + 1];\n        a[j0] = x0r + x2r;\n        a[j0 + 1] = x0i + x2i;\n        a[j1] = x0r - x2r;\n        a[j1 + 1] = x0i - x2i;\n        x0r = x1r - x3i;\n        x0i = x1i + x3r;\n        a[j2] = wk1i * x0r - wk1r * x0i;\n        a[j2 + 1] = wk1i * x0i + wk1r * x0r;\n        x0r = x1r + x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3i * x0r + wk3r * x0i;\n        a[j3 + 1] = wk3i * x0i - wk3r * x0r;\n    }\n    j0 = mh;\n    j1 = j0 + m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[j0] + a[j2];\n    x0i = a[j0 + 1] + a[j2 + 1];\n    x1r = a[j0] - a[j2];\n    x1i = a[j0 + 1] - a[j2 + 1];\n    x2r = a[j1] + a[j3];\n    x2i = a[j1 + 1] + a[j3 + 1];\n    x3r = a[j1] - a[j3];\n    x3i = a[j1 + 1] - a[j3 + 1];\n    a[j0] = x0r + x2r;\n    a[j0 + 1] = x0i + x2i;\n    a[j1] = x0r - x2r;\n    a[j1 + 1] = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    a[j2] = wn4r * (x0r - x0i);\n    a[j2 + 1] = wn4r * (x0i + x0r);\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    a[j3] = -wn4r * (x0r + x0i);\n    a[j3 + 1] = -wn4r * (x0i - x0r);\n}\n\n\nvoid cftmdl2(int n, double *a, double *w)\n{\n    int j, j0, j1, j2, j3, k, kr, m, mh;\n    double wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i;\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i;\n    \n    mh = n >> 3;\n    m = 2 * mh;\n    wn4r = w[1];\n    j1 = m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[0] - a[j2 + 1];\n    x0i = a[1] + a[j2];\n    x1r = a[0] + a[j2 + 1];\n    x1i = a[1] - a[j2];\n    x2r = a[j1] - a[j3 + 1];\n    x2i = a[j1 + 1] + a[j3];\n    x3r = a[j1] + a[j3 + 1];\n    x3i = a[j1 + 1] - a[j3];\n    y0r = wn4r * (x2r - x2i);\n    y0i = wn4r * (x2i + x2r);\n    a[0] = x0r + y0r;\n    a[1] = x0i + y0i;\n    a[j1] = x0r - y0r;\n    a[j1 + 1] = x0i - y0i;\n    y0r = wn4r * (x3r - x3i);\n    y0i = wn4r * (x3i + x3r);\n    a[j2] = x1r - y0i;\n    a[j2 + 1] = x1i + y0r;\n    a[j3] = x1r + y0i;\n    a[j3 + 1] = x1i - y0r;\n    k = 0;\n    kr = 2 * m;\n    for (j = 2; j < mh; j += 2) {\n        k += 4;\n        wk1r = w[k];\n        wk1i = w[k + 1];\n        wk3r = w[k + 2];\n        wk3i = w[k + 3];\n        kr -= 4;\n        wd1i = w[kr];\n        wd1r = w[kr + 1];\n        wd3i = w[kr + 2];\n        wd3r = w[kr + 3];\n        j1 = j + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j] - a[j2 + 1];\n        x0i = a[j + 1] + a[j2];\n        x1r = a[j] + a[j2 + 1];\n        x1i = a[j + 1] - a[j2];\n        x2r = a[j1] - a[j3 + 1];\n        x2i = a[j1 + 1] + a[j3];\n        x3r = a[j1] + a[j3 + 1];\n        x3i = a[j1 + 1] - a[j3];\n        y0r = wk1r * x0r - wk1i * x0i;\n        y0i = wk1r * x0i + wk1i * x0r;\n        y2r = wd1r * x2r - wd1i * x2i;\n        y2i = wd1r * x2i + wd1i * x2r;\n        a[j] = y0r + y2r;\n        a[j + 1] = y0i + y2i;\n        a[j1] = y0r - y2r;\n        a[j1 + 1] = y0i - y2i;\n        y0r = wk3r * x1r + wk3i * x1i;\n        y0i = wk3r * x1i - wk3i * x1r;\n        y2r = wd3r * x3r + wd3i * x3i;\n        y2i = wd3r * x3i - wd3i * x3r;\n        a[j2] = y0r + y2r;\n        a[j2 + 1] = y0i + y2i;\n        a[j3] = y0r - y2r;\n        a[j3 + 1] = y0i - y2i;\n        j0 = m - j;\n        j1 = j0 + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j0] - a[j2 + 1];\n        x0i = a[j0 + 1] + a[j2];\n        x1r = a[j0] + a[j2 + 1];\n        x1i = a[j0 + 1] - a[j2];\n        x2r = a[j1] - a[j3 + 1];\n        x2i = a[j1 + 1] + a[j3];\n        x3r = a[j1] + a[j3 + 1];\n        x3i = a[j1 + 1] - a[j3];\n        y0r = wd1i * x0r - wd1r * x0i;\n        y0i = wd1i * x0i + wd1r * x0r;\n        y2r = wk1i * x2r - wk1r * x2i;\n        y2i = wk1i * x2i + wk1r * x2r;\n        a[j0] = y0r + y2r;\n        a[j0 + 1] = y0i + y2i;\n        a[j1] = y0r - y2r;\n        a[j1 + 1] = y0i - y2i;\n        y0r = wd3i * x1r + wd3r * x1i;\n        y0i = wd3i * x1i - wd3r * x1r;\n        y2r = wk3i * x3r + wk3r * x3i;\n        y2i = wk3i * x3i - wk3r * x3r;\n        a[j2] = y0r + y2r;\n        a[j2 + 1] = y0i + y2i;\n        a[j3] = y0r - y2r;\n        a[j3 + 1] = y0i - y2i;\n    }\n    wk1r = w[m];\n    wk1i = w[m + 1];\n    j0 = mh;\n    j1 = j0 + m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[j0] - a[j2 + 1];\n    x0i = a[j0 + 1] + a[j2];\n    x1r = a[j0] + a[j2 + 1];\n    x1i = a[j0 + 1] - a[j2];\n    x2r = a[j1] - a[j3 + 1];\n    x2i = a[j1 + 1] + a[j3];\n    x3r = a[j1] + a[j3 + 1];\n    x3i = a[j1 + 1] - a[j3];\n    y0r = wk1r * x0r - wk1i * x0i;\n    y0i = wk1r * x0i + wk1i * x0r;\n    y2r = wk1i * x2r - wk1r * x2i;\n    y2i = wk1i * x2i + wk1r * x2r;\n    a[j0] = y0r + y2r;\n    a[j0 + 1] = y0i + y2i;\n    a[j1] = y0r - y2r;\n    a[j1 + 1] = y0i - y2i;\n    y0r = wk1i * x1r - wk1r * x1i;\n    y0i = wk1i * x1i + wk1r * x1r;\n    y2r = wk1r * x3r - wk1i * x3i;\n    y2i = wk1r * x3i + wk1i * x3r;\n    a[j2] = y0r - y2r;\n    a[j2 + 1] = y0i - y2i;\n    a[j3] = y0r + y2r;\n    a[j3 + 1] = y0i + y2i;\n}\n\n\nvoid cftfx41(int n, double *a, int nw, double *w)\n{\n    void cftf161(double *a, double *w);\n    void cftf162(double *a, double *w);\n    void cftf081(double *a, double *w);\n    void cftf082(double *a, double *w);\n    \n    if (n == 128) {\n        cftf161(a, &w[nw - 8]);\n        cftf162(&a[32], &w[nw - 32]);\n        cftf161(&a[64], &w[nw - 8]);\n        cftf161(&a[96], &w[nw - 8]);\n    } else {\n        cftf081(a, &w[nw - 8]);\n        cftf082(&a[16], &w[nw - 8]);\n        cftf081(&a[32], &w[nw - 8]);\n        cftf081(&a[48], &w[nw - 8]);\n    }\n}\n\n\nvoid cftf161(double *a, double *w)\n{\n    double wn4r, wk1r, wk1i, \n        x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, \n        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, \n        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, \n        y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, \n        y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;\n    \n    wn4r = w[1];\n    wk1r = w[2];\n    wk1i = w[3];\n    x0r = a[0] + a[16];\n    x0i = a[1] + a[17];\n    x1r = a[0] - a[16];\n    x1i = a[1] - a[17];\n    x2r = a[8] + a[24];\n    x2i = a[9] + a[25];\n    x3r = a[8] - a[24];\n    x3i = a[9] - a[25];\n    y0r = x0r + x2r;\n    y0i = x0i + x2i;\n    y4r = x0r - x2r;\n    y4i = x0i - x2i;\n    y8r = x1r - x3i;\n    y8i = x1i + x3r;\n    y12r = x1r + x3i;\n    y12i = x1i - x3r;\n    x0r = a[2] + a[18];\n    x0i = a[3] + a[19];\n    x1r = a[2] - a[18];\n    x1i = a[3] - a[19];\n    x2r = a[10] + a[26];\n    x2i = a[11] + a[27];\n    x3r = a[10] - a[26];\n    x3i = a[11] - a[27];\n    y1r = x0r + x2r;\n    y1i = x0i + x2i;\n    y5r = x0r - x2r;\n    y5i = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    y9r = wk1r * x0r - wk1i * x0i;\n    y9i = wk1r * x0i + wk1i * x0r;\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    y13r = wk1i * x0r - wk1r * x0i;\n    y13i = wk1i * x0i + wk1r * x0r;\n    x0r = a[4] + a[20];\n    x0i = a[5] + a[21];\n    x1r = a[4] - a[20];\n    x1i = a[5] - a[21];\n    x2r = a[12] + a[28];\n    x2i = a[13] + a[29];\n    x3r = a[12] - a[28];\n    x3i = a[13] - a[29];\n    y2r = x0r + x2r;\n    y2i = x0i + x2i;\n    y6r = x0r - x2r;\n    y6i = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    y10r = wn4r * (x0r - x0i);\n    y10i = wn4r * (x0i + x0r);\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    y14r = wn4r * (x0r + x0i);\n    y14i = wn4r * (x0i - x0r);\n    x0r = a[6] + a[22];\n    x0i = a[7] + a[23];\n    x1r = a[6] - a[22];\n    x1i = a[7] - a[23];\n    x2r = a[14] + a[30];\n    x2i = a[15] + a[31];\n    x3r = a[14] - a[30];\n    x3i = a[15] - a[31];\n    y3r = x0r + x2r;\n    y3i = x0i + x2i;\n    y7r = x0r - x2r;\n    y7i = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    y11r = wk1i * x0r - wk1r * x0i;\n    y11i = wk1i * x0i + wk1r * x0r;\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    y15r = wk1r * x0r - wk1i * x0i;\n    y15i = wk1r * x0i + wk1i * x0r;\n    x0r = y12r - y14r;\n    x0i = y12i - y14i;\n    x1r = y12r + y14r;\n    x1i = y12i + y14i;\n    x2r = y13r - y15r;\n    x2i = y13i - y15i;\n    x3r = y13r + y15r;\n    x3i = y13i + y15i;\n    a[24] = x0r + x2r;\n    a[25] = x0i + x2i;\n    a[26] = x0r - x2r;\n    a[27] = x0i - x2i;\n    a[28] = x1r - x3i;\n    a[29] = x1i + x3r;\n    a[30] = x1r + x3i;\n    a[31] = x1i - x3r;\n    x0r = y8r + y10r;\n    x0i = y8i + y10i;\n    x1r = y8r - y10r;\n    x1i = y8i - y10i;\n    x2r = y9r + y11r;\n    x2i = y9i + y11i;\n    x3r = y9r - y11r;\n    x3i = y9i - y11i;\n    a[16] = x0r + x2r;\n    a[17] = x0i + x2i;\n    a[18] = x0r - x2r;\n    a[19] = x0i - x2i;\n    a[20] = x1r - x3i;\n    a[21] = x1i + x3r;\n    a[22] = x1r + x3i;\n    a[23] = x1i - x3r;\n    x0r = y5r - y7i;\n    x0i = y5i + y7r;\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    x0r = y5r + y7i;\n    x0i = y5i - y7r;\n    x3r = wn4r * (x0r - x0i);\n    x3i = wn4r * (x0i + x0r);\n    x0r = y4r - y6i;\n    x0i = y4i + y6r;\n    x1r = y4r + y6i;\n    x1i = y4i - y6r;\n    a[8] = x0r + x2r;\n    a[9] = x0i + x2i;\n    a[10] = x0r - x2r;\n    a[11] = x0i - x2i;\n    a[12] = x1r - x3i;\n    a[13] = x1i + x3r;\n    a[14] = x1r + x3i;\n    a[15] = x1i - x3r;\n    x0r = y0r + y2r;\n    x0i = y0i + y2i;\n    x1r = y0r - y2r;\n    x1i = y0i - y2i;\n    x2r = y1r + y3r;\n    x2i = y1i + y3i;\n    x3r = y1r - y3r;\n    x3i = y1i - y3i;\n    a[0] = x0r + x2r;\n    a[1] = x0i + x2i;\n    a[2] = x0r - x2r;\n    a[3] = x0i - x2i;\n    a[4] = x1r - x3i;\n    a[5] = x1i + x3r;\n    a[6] = x1r + x3i;\n    a[7] = x1i - x3r;\n}\n\n\nvoid cftf162(double *a, double *w)\n{\n    double wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, \n        x0r, x0i, x1r, x1i, x2r, x2i, \n        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, \n        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, \n        y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, \n        y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;\n    \n    wn4r = w[1];\n    wk1r = w[4];\n    wk1i = w[5];\n    wk3r = w[6];\n    wk3i = -w[7];\n    wk2r = w[8];\n    wk2i = w[9];\n    x1r = a[0] - a[17];\n    x1i = a[1] + a[16];\n    x0r = a[8] - a[25];\n    x0i = a[9] + a[24];\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    y0r = x1r + x2r;\n    y0i = x1i + x2i;\n    y4r = x1r - x2r;\n    y4i = x1i - x2i;\n    x1r = a[0] + a[17];\n    x1i = a[1] - a[16];\n    x0r = a[8] + a[25];\n    x0i = a[9] - a[24];\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    y8r = x1r - x2i;\n    y8i = x1i + x2r;\n    y12r = x1r + x2i;\n    y12i = x1i - x2r;\n    x0r = a[2] - a[19];\n    x0i = a[3] + a[18];\n    x1r = wk1r * x0r - wk1i * x0i;\n    x1i = wk1r * x0i + wk1i * x0r;\n    x0r = a[10] - a[27];\n    x0i = a[11] + a[26];\n    x2r = wk3i * x0r - wk3r * x0i;\n    x2i = wk3i * x0i + wk3r * x0r;\n    y1r = x1r + x2r;\n    y1i = x1i + x2i;\n    y5r = x1r - x2r;\n    y5i = x1i - x2i;\n    x0r = a[2] + a[19];\n    x0i = a[3] - a[18];\n    x1r = wk3r * x0r - wk3i * x0i;\n    x1i = wk3r * x0i + wk3i * x0r;\n    x0r = a[10] + a[27];\n    x0i = a[11] - a[26];\n    x2r = wk1r * x0r + wk1i * x0i;\n    x2i = wk1r * x0i - wk1i * x0r;\n    y9r = x1r - x2r;\n    y9i = x1i - x2i;\n    y13r = x1r + x2r;\n    y13i = x1i + x2i;\n    x0r = a[4] - a[21];\n    x0i = a[5] + a[20];\n    x1r = wk2r * x0r - wk2i * x0i;\n    x1i = wk2r * x0i + wk2i * x0r;\n    x0r = a[12] - a[29];\n    x0i = a[13] + a[28];\n    x2r = wk2i * x0r - wk2r * x0i;\n    x2i = wk2i * x0i + wk2r * x0r;\n    y2r = x1r + x2r;\n    y2i = x1i + x2i;\n    y6r = x1r - x2r;\n    y6i = x1i - x2i;\n    x0r = a[4] + a[21];\n    x0i = a[5] - a[20];\n    x1r = wk2i * x0r - wk2r * x0i;\n    x1i = wk2i * x0i + wk2r * x0r;\n    x0r = a[12] + a[29];\n    x0i = a[13] - a[28];\n    x2r = wk2r * x0r - wk2i * x0i;\n    x2i = wk2r * x0i + wk2i * x0r;\n    y10r = x1r - x2r;\n    y10i = x1i - x2i;\n    y14r = x1r + x2r;\n    y14i = x1i + x2i;\n    x0r = a[6] - a[23];\n    x0i = a[7] + a[22];\n    x1r = wk3r * x0r - wk3i * x0i;\n    x1i = wk3r * x0i + wk3i * x0r;\n    x0r = a[14] - a[31];\n    x0i = a[15] + a[30];\n    x2r = wk1i * x0r - wk1r * x0i;\n    x2i = wk1i * x0i + wk1r * x0r;\n    y3r = x1r + x2r;\n    y3i = x1i + x2i;\n    y7r = x1r - x2r;\n    y7i = x1i - x2i;\n    x0r = a[6] + a[23];\n    x0i = a[7] - a[22];\n    x1r = wk1i * x0r + wk1r * x0i;\n    x1i = wk1i * x0i - wk1r * x0r;\n    x0r = a[14] + a[31];\n    x0i = a[15] - a[30];\n    x2r = wk3i * x0r - wk3r * x0i;\n    x2i = wk3i * x0i + wk3r * x0r;\n    y11r = x1r + x2r;\n    y11i = x1i + x2i;\n    y15r = x1r - x2r;\n    y15i = x1i - x2i;\n    x1r = y0r + y2r;\n    x1i = y0i + y2i;\n    x2r = y1r + y3r;\n    x2i = y1i + y3i;\n    a[0] = x1r + x2r;\n    a[1] = x1i + x2i;\n    a[2] = x1r - x2r;\n    a[3] = x1i - x2i;\n    x1r = y0r - y2r;\n    x1i = y0i - y2i;\n    x2r = y1r - y3r;\n    x2i = y1i - y3i;\n    a[4] = x1r - x2i;\n    a[5] = x1i + x2r;\n    a[6] = x1r + x2i;\n    a[7] = x1i - x2r;\n    x1r = y4r - y6i;\n    x1i = y4i + y6r;\n    x0r = y5r - y7i;\n    x0i = y5i + y7r;\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    a[8] = x1r + x2r;\n    a[9] = x1i + x2i;\n    a[10] = x1r - x2r;\n    a[11] = x1i - x2i;\n    x1r = y4r + y6i;\n    x1i = y4i - y6r;\n    x0r = y5r + y7i;\n    x0i = y5i - y7r;\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    a[12] = x1r - x2i;\n    a[13] = x1i + x2r;\n    a[14] = x1r + x2i;\n    a[15] = x1i - x2r;\n    x1r = y8r + y10r;\n    x1i = y8i + y10i;\n    x2r = y9r - y11r;\n    x2i = y9i - y11i;\n    a[16] = x1r + x2r;\n    a[17] = x1i + x2i;\n    a[18] = x1r - x2r;\n    a[19] = x1i - x2i;\n    x1r = y8r - y10r;\n    x1i = y8i - y10i;\n    x2r = y9r + y11r;\n    x2i = y9i + y11i;\n    a[20] = x1r - x2i;\n    a[21] = x1i + x2r;\n    a[22] = x1r + x2i;\n    a[23] = x1i - x2r;\n    x1r = y12r - y14i;\n    x1i = y12i + y14r;\n    x0r = y13r + y15i;\n    x0i = y13i - y15r;\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    a[24] = x1r + x2r;\n    a[25] = x1i + x2i;\n    a[26] = x1r - x2r;\n    a[27] = x1i - x2i;\n    x1r = y12r + y14i;\n    x1i = y12i - y14r;\n    x0r = y13r - y15i;\n    x0i = y13i + y15r;\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    a[28] = x1r - x2i;\n    a[29] = x1i + x2r;\n    a[30] = x1r + x2i;\n    a[31] = x1i - x2r;\n}\n\n\nvoid cftf081(double *a, double *w)\n{\n    double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, \n        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, \n        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;\n    \n    wn4r = w[1];\n    x0r = a[0] + a[8];\n    x0i = a[1] + a[9];\n    x1r = a[0] - a[8];\n    x1i = a[1] - a[9];\n    x2r = a[4] + a[12];\n    x2i = a[5] + a[13];\n    x3r = a[4] - a[12];\n    x3i = a[5] - a[13];\n    y0r = x0r + x2r;\n    y0i = x0i + x2i;\n    y2r = x0r - x2r;\n    y2i = x0i - x2i;\n    y1r = x1r - x3i;\n    y1i = x1i + x3r;\n    y3r = x1r + x3i;\n    y3i = x1i - x3r;\n    x0r = a[2] + a[10];\n    x0i = a[3] + a[11];\n    x1r = a[2] - a[10];\n    x1i = a[3] - a[11];\n    x2r = a[6] + a[14];\n    x2i = a[7] + a[15];\n    x3r = a[6] - a[14];\n    x3i = a[7] - a[15];\n    y4r = x0r + x2r;\n    y4i = x0i + x2i;\n    y6r = x0r - x2r;\n    y6i = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    x2r = x1r + x3i;\n    x2i = x1i - x3r;\n    y5r = wn4r * (x0r - x0i);\n    y5i = wn4r * (x0r + x0i);\n    y7r = wn4r * (x2r - x2i);\n    y7i = wn4r * (x2r + x2i);\n    a[8] = y1r + y5r;\n    a[9] = y1i + y5i;\n    a[10] = y1r - y5r;\n    a[11] = y1i - y5i;\n    a[12] = y3r - y7i;\n    a[13] = y3i + y7r;\n    a[14] = y3r + y7i;\n    a[15] = y3i - y7r;\n    a[0] = y0r + y4r;\n    a[1] = y0i + y4i;\n    a[2] = y0r - y4r;\n    a[3] = y0i - y4i;\n    a[4] = y2r - y6i;\n    a[5] = y2i + y6r;\n    a[6] = y2r + y6i;\n    a[7] = y2i - y6r;\n}\n\n\nvoid cftf082(double *a, double *w)\n{\n    double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, \n        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, \n        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;\n    \n    wn4r = w[1];\n    wk1r = w[2];\n    wk1i = w[3];\n    y0r = a[0] - a[9];\n    y0i = a[1] + a[8];\n    y1r = a[0] + a[9];\n    y1i = a[1] - a[8];\n    x0r = a[4] - a[13];\n    x0i = a[5] + a[12];\n    y2r = wn4r * (x0r - x0i);\n    y2i = wn4r * (x0i + x0r);\n    x0r = a[4] + a[13];\n    x0i = a[5] - a[12];\n    y3r = wn4r * (x0r - x0i);\n    y3i = wn4r * (x0i + x0r);\n    x0r = a[2] - a[11];\n    x0i = a[3] + a[10];\n    y4r = wk1r * x0r - wk1i * x0i;\n    y4i = wk1r * x0i + wk1i * x0r;\n    x0r = a[2] + a[11];\n    x0i = a[3] - a[10];\n    y5r = wk1i * x0r - wk1r * x0i;\n    y5i = wk1i * x0i + wk1r * x0r;\n    x0r = a[6] - a[15];\n    x0i = a[7] + a[14];\n    y6r = wk1i * x0r - wk1r * x0i;\n    y6i = wk1i * x0i + wk1r * x0r;\n    x0r = a[6] + a[15];\n    x0i = a[7] - a[14];\n    y7r = wk1r * x0r - wk1i * x0i;\n    y7i = wk1r * x0i + wk1i * x0r;\n    x0r = y0r + y2r;\n    x0i = y0i + y2i;\n    x1r = y4r + y6r;\n    x1i = y4i + y6i;\n    a[0] = x0r + x1r;\n    a[1] = x0i + x1i;\n    a[2] = x0r - x1r;\n    a[3] = x0i - x1i;\n    x0r = y0r - y2r;\n    x0i = y0i - y2i;\n    x1r = y4r - y6r;\n    x1i = y4i - y6i;\n    a[4] = x0r - x1i;\n    a[5] = x0i + x1r;\n    a[6] = x0r + x1i;\n    a[7] = x0i - x1r;\n    x0r = y1r - y3i;\n    x0i = y1i + y3r;\n    x1r = y5r - y7r;\n    x1i = y5i - y7i;\n    a[8] = x0r + x1r;\n    a[9] = x0i + x1i;\n    a[10] = x0r - x1r;\n    a[11] = x0i - x1i;\n    x0r = y1r + y3i;\n    x0i = y1i - y3r;\n    x1r = y5r + y7r;\n    x1i = y5i + y7i;\n    a[12] = x0r - x1i;\n    a[13] = x0i + x1r;\n    a[14] = x0r + x1i;\n    a[15] = x0i - x1r;\n}\n\n\nvoid cftf040(double *a)\n{\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;\n    \n    x0r = a[0] + a[4];\n    x0i = a[1] + a[5];\n    x1r = a[0] - a[4];\n    x1i = a[1] - a[5];\n    x2r = a[2] + a[6];\n    x2i = a[3] + a[7];\n    x3r = a[2] - a[6];\n    x3i = a[3] - a[7];\n    a[0] = x0r + x2r;\n    a[1] = x0i + x2i;\n    a[2] = x1r - x3i;\n    a[3] = x1i + x3r;\n    a[4] = x0r - x2r;\n    a[5] = x0i - x2i;\n    a[6] = x1r + x3i;\n    a[7] = x1i - x3r;\n}\n\n\nvoid cftb040(double *a)\n{\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;\n    \n    x0r = a[0] + a[4];\n    x0i = a[1] + a[5];\n    x1r = a[0] - a[4];\n    x1i = a[1] - a[5];\n    x2r = a[2] + a[6];\n    x2i = a[3] + a[7];\n    x3r = a[2] - a[6];\n    x3i = a[3] - a[7];\n    a[0] = x0r + x2r;\n    a[1] = x0i + x2i;\n    a[2] = x1r + x3i;\n    a[3] = x1i - x3r;\n    a[4] = x0r - x2r;\n    a[5] = x0i - x2i;\n    a[6] = x1r - x3i;\n    a[7] = x1i + x3r;\n}\n\n\nvoid cftx020(double *a)\n{\n    double x0r, x0i;\n    \n    x0r = a[0] - a[2];\n    x0i = a[1] - a[3];\n    a[0] += a[2];\n    a[1] += a[3];\n    a[2] = x0r;\n    a[3] = x0i;\n}\n\n\nvoid rftfsub(int n, double *a, int nc, double *c)\n{\n    int j, k, kk, ks, m;\n    double wkr, wki, xr, xi, yr, yi;\n    \n    m = n >> 1;\n    ks = 2 * nc / m;\n    kk = 0;\n    for (j = 2; j < m; j += 2) {\n        k = n - j;\n        kk += ks;\n        wkr = 0.5 - c[nc - kk];\n        wki = c[kk];\n        xr = a[j] - a[k];\n        xi = a[j + 1] + a[k + 1];\n        yr = wkr * xr - wki * xi;\n        yi = wkr * xi + wki * xr;\n        a[j] -= yr;\n        a[j + 1] -= yi;\n        a[k] += yr;\n        a[k + 1] -= yi;\n    }\n}\n\n\nvoid rftbsub(int n, double *a, int nc, double *c)\n{\n    int j, k, kk, ks, m;\n    double wkr, wki, xr, xi, yr, yi;\n    \n    m = n >> 1;\n    ks = 2 * nc / m;\n    kk = 0;\n    for (j = 2; j < m; j += 2) {\n        k = n - j;\n        kk += ks;\n        wkr = 0.5 - c[nc - kk];\n        wki = c[kk];\n        xr = a[j] - a[k];\n        xi = a[j + 1] + a[k + 1];\n        yr = wkr * xr + wki * xi;\n        yi = wkr * xi - wki * xr;\n        a[j] -= yr;\n        a[j + 1] -= yi;\n        a[k] += yr;\n        a[k + 1] -= yi;\n    }\n}\n\n\nvoid dctsub(int n, double *a, int nc, double *c)\n{\n    int j, k, kk, ks, m;\n    double wkr, wki, xr;\n    \n    m = n >> 1;\n    ks = nc / n;\n    kk = 0;\n    for (j = 1; j < m; j++) {\n        k = n - j;\n        kk += ks;\n        wkr = c[kk] - c[nc - kk];\n        wki = c[kk] + c[nc - kk];\n        xr = wki * a[j] - wkr * a[k];\n        a[j] = wkr * a[j] + wki * a[k];\n        a[k] = xr;\n    }\n    a[m] *= c[0];\n}\n\n\nvoid dstsub(int n, double *a, int nc, double *c)\n{\n    int j, k, kk, ks, m;\n    double wkr, wki, xr;\n    \n    m = n >> 1;\n    ks = nc / n;\n    kk = 0;\n    for (j = 1; j < m; j++) {\n        k = n - j;\n        kk += ks;\n        wkr = c[kk] - c[nc - kk];\n        wki = c[kk] + c[nc - kk];\n        xr = wki * a[k] - wkr * a[j];\n        a[k] = wkr * a[k] + wki * a[j];\n        a[j] = xr;\n    }\n    a[m] *= c[0];\n}\n\n"
  },
  {
    "path": "Chapters/Old/SoundLibrary/fft/readme.txt",
    "content": "FFT ̓lbg痎ƂĂCugĂ܂B\n҂͂火B\n\n    Copyright(C) 1996-2001 Takuya OOURA\n    email: ooura@mmm.t.u-tokyo.ac.jp\n    download: http://momonga.t.u-tokyo.ac.jp/~ooura/fft.html\n\nManaged C++ gĂŃRpCɂ cl.exe KvłB\n(.NET Framework SDK ƁA\n \"C:\\Program Files\\Microsoft Visual Studio .NET\\Vc7\\bin\\cl.exe\"\n ɃCXg[܂B)\n\nVisual C++ .net ͎ĂȂ̂ŁAR}hCŃRpC܂B\nMakefile tĂ܂B\nmake ̎sO vsvars32.bat sKv܂B\n\n(vsvars32.bat ̃tpX\n\"C:\\Program Files\\Microsoft Visual Studio .NET 2003\\Vc7\\bin\\vsvars32.bat\")\n"
  },
  {
    "path": "Chapters/Old/UserInputSample/UserInputSample/App.xaml",
    "content": "﻿<Application x:Class=\"UserInputSample.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Chapters/Old/UserInputSample/UserInputSample/App.xaml.cs",
    "content": "﻿using System.Windows;\n\nnamespace UserInputSample\n{\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/UserInputSample/UserInputSample/DelegateCommand.cs",
    "content": "﻿using System;\nusing System.Windows.Input;\n\nnamespace UserInputSample\n{\n    public class DelegateCommand : ICommand\n    {\n        private readonly Action _executer;\n\n        public DelegateCommand(Action executer) { _executer = executer; }\n\n        public void Execute(object? parameter) => _executer();\n\n        public bool CanExecute(object? parameter) => true;\n\n        public event EventHandler? CanExecuteChanged;\n\n        public void RaiseCanExecuteChanged()\n        {\n            CanExecuteChanged?.Invoke(this, null!);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/UserInputSample/UserInputSample/InputData.cs",
    "content": "﻿using System.Windows.Input;\n\nnamespace UserInputSample\n{\n    public class InputData : NotificationObject\n    {\n        void Run()\n        {\n            //TODO: ↓ここに演習問題の回答コードを書いてください\n\n            Result = A + B;\n        }\n\n        public double A\n        {\n            get => _a;\n            set { _a = value; RaisePropertyChanged(nameof(A)); }\n        }\n        private double _a;\n\n        public double B\n        {\n            get => _b;\n            set { _b = value; RaisePropertyChanged(nameof(B)); }\n        }\n        private double _b;\n\n        public double C\n        {\n            get => _c;\n            set { _c = value; RaisePropertyChanged(nameof(C)); }\n        }\n        private double _c;\n\n        public double D\n        {\n            get => _d;\n            set { _d = value; RaisePropertyChanged(nameof(D)); }\n        }\n        private double _d;\n\n        public double E\n        {\n            get => _e;\n            set { _e = value; RaisePropertyChanged(nameof(E)); }\n        }\n        private double _e;\n\n        public double Result\n        {\n            get { return _r; }\n            set { _r = value; RaisePropertyChanged(\"Result\"); }\n        }\n        private double _r;\n\n        public ICommand RunCommand => _runCommand ??= new DelegateCommand(Run);\n        public ICommand? _runCommand;\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/UserInputSample/UserInputSample/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"UserInputSample.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        Title=\"演習問題用ひな形\" SizeToContent=\"WidthAndHeight\">\n    <Window.Resources>\n        <Style TargetType=\"TextBlock\">\n            <Setter Property=\"Padding\" Value=\"5\" />\n            <Setter Property=\"HorizontalAlignment\" Value=\"Right\" />\n        </Style>\n    </Window.Resources>\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"auto\" />\n            <RowDefinition Height=\"auto\" />\n            <RowDefinition Height=\"auto\" />\n            <RowDefinition Height=\"auto\" />\n            <RowDefinition Height=\"auto\" />\n            <RowDefinition Height=\"auto\" />\n            <RowDefinition Height=\"auto\" />\n        </Grid.RowDefinitions>\n        <Grid.ColumnDefinitions>\n            <ColumnDefinition Width=\"auto\" />\n            <ColumnDefinition Width=\"200\" />\n        </Grid.ColumnDefinitions>\n\n        <TextBlock Text=\"A\" Grid.Row=\"0\" />\n        <TextBox Text=\"{Binding A}\" Grid.Row=\"0\" Grid.Column=\"1\" />\n\n        <TextBlock Text=\"B\" Grid.Row=\"1\" />\n        <TextBox Text=\"{Binding B}\" Grid.Row=\"1\" Grid.Column=\"1\" />\n\n        <TextBlock Text=\"C\" Grid.Row=\"2\" />\n        <TextBox Text=\"{Binding C}\" Grid.Row=\"2\" Grid.Column=\"1\" />\n\n        <TextBlock Text=\"D\" Grid.Row=\"3\" />\n        <TextBox Text=\"{Binding D}\" Grid.Row=\"3\" Grid.Column=\"1\" />\n\n        <TextBlock Text=\"E\" Grid.Row=\"4\" />\n        <TextBox Text=\"{Binding E}\" Grid.Row=\"4\" Grid.Column=\"1\" />\n        \n        <Button Content=\"実行\"\n                Command=\"{Binding RunCommand}\"\n                IsDefault=\"True\"\n                Grid.ColumnSpan=\"2\" Grid.Row=\"5\" />\n\n        <TextBlock Text=\"結果\" Grid.Row=\"6\" />\n        <TextBox Text=\"{Binding Result}\" Grid.Row=\"6\" Grid.Column=\"1\" />\n    </Grid>\n</Window>\n"
  },
  {
    "path": "Chapters/Old/UserInputSample/UserInputSample/MainWindow.xaml.cs",
    "content": "﻿using System.Windows;\n\nnamespace UserInputSample\n{\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n\n            DataContext = new InputData();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/UserInputSample/UserInputSample/NotificationObject.cs",
    "content": "﻿using System.ComponentModel;\n\nnamespace UserInputSample\n{\n    public class NotificationObject : INotifyPropertyChanged\n    {\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        public void RaisePropertyChanged(string propertyName)\n            => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n    }\n}\n"
  },
  {
    "path": "Chapters/Old/UserInputSample/UserInputSample/UserInputSample.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>net5.0-windows</TargetFramework>\n    <UseWPF>true</UseWPF>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Old/UserInputSample/UserInputSample.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30428.66\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"UserInputSample\", \"UserInputSample\\UserInputSample.csproj\", \"{B655E38F-09EB-4659-B961-C15F4FC0F6A3}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{B655E38F-09EB-4659-B961-C15F4FC0F6A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B655E38F-09EB-4659-B961-C15F4FC0F6A3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B655E38F-09EB-4659-B961-C15F4FC0F6A3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B655E38F-09EB-4659-B961-C15F4FC0F6A3}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {91B80AB8-C4CA-4350-9C57-CA9C796E84FE}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Old/reversi/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n//\n// アセンブリに関する一般情報は以下の \n// 属性セットを通して制御されます。アセンブリに関連付けられている \n// 情報を変更するには、これらの属性値を変更してください。\n//\n[assembly: AssemblyTitle(\"\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"\")]\n[assembly: AssemblyCopyright(\"\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\t\t\n\n//\n// アセンブリのバージョン情報は、以下の 4 つの属性で構成されます :\n//\n//      メジャー バージョン\n//      マイナ バージョン \n//      ビルド番号\n//      リビジョン\n//\n// 下にあるように、'*' を使って、すべての値を指定するか、 \n// ビルドおよびリビジョン番号を既定値にすることができます :\n\n[assembly: AssemblyVersion(\"1.0.*\")]\n\n//\n// アセンブリに署名するには、使用するキーを指定しなければなりません。アセンブリ署名に関する \n// 詳細については、Microsoft .NET Framework ドキュメントを参照してください。\n//\n// 下の属性を使って、署名に使うキーを制御します。\n//\n// メモ : \n//   (*) キーが指定されないと、アセンブリは署名されません。\n//   (*) KeyName は、コンピュータにインストールされている暗号サービス プロバイダ (CSP) を\n//       表します。KeyFile は、キーを含む\n//       ファイルです。\n//   (*) KeyFile および KeyName の値が共に指定されている場合、 \n//       以下の処理化発生します :\n//       (1) KeyName が CSP に見つかった場合、そのキーが使われます。\n//       (2) KeyName が存在せず、KeyFile が存在する場合、\n//           KeyFile にあるキーが CSP にインストールされ、使われます。\n//   (*) KeyFile を作成するには、sn.exe (Strong Name) ユーティリティを使ってください。\n//       KeyFile を指定するとき、KeyFile の場所は、\n//       プロジェクト出力 ディレクトリへの相対パスでなければなりません。パスは、\n//       %Project Directory%\\obj\\<configuration> です。たとえば、KeyFile がプロジェクト ディレクトリにある場合、\n//       AssemblyKeyFile 属性を \n//       [assembly: AssemblyKeyFile(\"..\\\\..\\\\mykey.snk\")] として指定します。\n//   (*) 遅延署名は高度なオプションです。詳細については Microsoft .NET Framework\n//       ドキュメントを参照してください。\n//\n[assembly: AssemblyDelaySign(false)]\n[assembly: AssemblyKeyFile(\"\")]\n[assembly: AssemblyKeyName(\"\")]\n"
  },
  {
    "path": "Chapters/Old/reversi/OptionForm.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Windows.Forms;\n\nnamespace Reversi\n{\n\t/// <summary>\n\t/// OptionForm の概要の説明です。\n\t/// </summary>\n\tpublic class OptionForm : System.Windows.Forms.Form\n\t{\n\t\tprivate System.Windows.Forms.Button ok_button;\n\t\tprivate System.Windows.Forms.Button cancel_button;\n\t\tprivate System.Windows.Forms.Label label1;\n\t\tprivate System.Windows.Forms.TextBox textBoardHeight;\n\t\tprivate System.Windows.Forms.Label label2;\n\t\tprivate System.Windows.Forms.TextBox textBoardWidth;\n\t\t/// <summary>\n\t\t/// 必要なデザイナ変数です。\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.Container components = null;\n\n\t\tprivate ReversiMainForm.Option option;\n\n\t\tpublic OptionForm(ReversiMainForm.Option option)\n\t\t{\n\t\t\t//\n\t\t\t// Windows フォーム デザイナ サポートに必要です。\n\t\t\t//\n\t\t\tInitializeComponent();\n\n\t\t\tthis.option = option;\n\t\t\ttextBoardWidth.Text = option.board_width.ToString();\n\t\t\ttextBoardHeight.Text = option.board_height.ToString();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 使用されているリソースに後処理を実行します。\n\t\t/// </summary>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif( disposing )\n\t\t\t{\n\t\t\t\tif(components != null)\n\t\t\t\t{\n\t\t\t\t\tcomponents.Dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Windows Form Designer generated code\n\t\t/// <summary>\n\t\t/// デザイナ サポートに必要なメソッドです。このメソッドの内容を\n\t\t/// コード エディタで変更しないでください。\n\t\t/// </summary>\n\t\tprivate void InitializeComponent()\n\t\t{\n\t\t\tSystem.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(OptionForm));\n\t\t\tthis.ok_button = new System.Windows.Forms.Button();\n\t\t\tthis.cancel_button = new System.Windows.Forms.Button();\n\t\t\tthis.label1 = new System.Windows.Forms.Label();\n\t\t\tthis.textBoardHeight = new System.Windows.Forms.TextBox();\n\t\t\tthis.label2 = new System.Windows.Forms.Label();\n\t\t\tthis.textBoardWidth = new System.Windows.Forms.TextBox();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// ok_button\n\t\t\t// \n\t\t\tthis.ok_button.Location = new System.Drawing.Point(72, 128);\n\t\t\tthis.ok_button.Name = \"ok_button\";\n\t\t\tthis.ok_button.Size = new System.Drawing.Size(64, 24);\n\t\t\tthis.ok_button.TabIndex = 0;\n\t\t\tthis.ok_button.Text = \"OK\";\n\t\t\tthis.ok_button.Click += new System.EventHandler(this.ok_button_Click);\n\t\t\t// \n\t\t\t// cancel_button\n\t\t\t// \n\t\t\tthis.cancel_button.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n\t\t\tthis.cancel_button.Location = new System.Drawing.Point(144, 128);\n\t\t\tthis.cancel_button.Name = \"cancel_button\";\n\t\t\tthis.cancel_button.Size = new System.Drawing.Size(64, 24);\n\t\t\tthis.cancel_button.TabIndex = 1;\n\t\t\tthis.cancel_button.Text = \"キャンセル\";\n\t\t\t// \n\t\t\t// label1\n\t\t\t// \n\t\t\tthis.label1.AutoSize = true;\n\t\t\tthis.label1.Location = new System.Drawing.Point(8, 16);\n\t\t\tthis.label1.Name = \"label1\";\n\t\t\tthis.label1.Size = new System.Drawing.Size(85, 12);\n\t\t\tthis.label1.TabIndex = 2;\n\t\t\tthis.label1.Text = \"盤面のサイズ 縦\";\n\t\t\t// \n\t\t\t// textBoardHeight\n\t\t\t// \n\t\t\tthis.textBoardHeight.Location = new System.Drawing.Point(96, 12);\n\t\t\tthis.textBoardHeight.Name = \"textBoardHeight\";\n\t\t\tthis.textBoardHeight.Size = new System.Drawing.Size(32, 19);\n\t\t\tthis.textBoardHeight.TabIndex = 3;\n\t\t\tthis.textBoardHeight.Text = \"8\";\n\t\t\t// \n\t\t\t// label2\n\t\t\t// \n\t\t\tthis.label2.AutoSize = true;\n\t\t\tthis.label2.Location = new System.Drawing.Point(128, 16);\n\t\t\tthis.label2.Name = \"label2\";\n\t\t\tthis.label2.Size = new System.Drawing.Size(29, 12);\n\t\t\tthis.label2.TabIndex = 4;\n\t\t\tthis.label2.Text = \"×横\";\n\t\t\t// \n\t\t\t// textBoardWidth\n\t\t\t// \n\t\t\tthis.textBoardWidth.Location = new System.Drawing.Point(160, 12);\n\t\t\tthis.textBoardWidth.Name = \"textBoardWidth\";\n\t\t\tthis.textBoardWidth.Size = new System.Drawing.Size(32, 19);\n\t\t\tthis.textBoardWidth.TabIndex = 5;\n\t\t\tthis.textBoardWidth.Text = \"8\";\n\t\t\t// \n\t\t\t// OptionForm\n\t\t\t// \n\t\t\tthis.AcceptButton = this.ok_button;\n\t\t\tthis.AutoScaleBaseSize = new System.Drawing.Size(5, 12);\n\t\t\tthis.CancelButton = this.cancel_button;\n\t\t\tthis.ClientSize = new System.Drawing.Size(216, 157);\n\t\t\tthis.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.textBoardWidth,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.label2,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.textBoardHeight,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.label1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.cancel_button,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.ok_button});\n\t\t\tthis.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n\t\t\tthis.MaximizeBox = false;\n\t\t\tthis.MinimizeBox = false;\n\t\t\tthis.Name = \"OptionForm\";\n\t\t\tthis.Text = \"オプション設定\";\n\t\t\tthis.ResumeLayout(false);\n\n\t\t}\n\t\t#endregion\n\n\t\tprivate void ok_button_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\toption.board_width = Convert.ToInt32(textBoardWidth.Text);\n\t\t\toption.board_height = Convert.ToInt32(textBoardHeight.Text);\n\t\t\tthis.Close();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/reversi/OptionForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <xsd:schema id=\"root\" targetNamespace=\"\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <data name=\"$this.Name\">\n    <value>OptionForm</value>\n  </data>\n  <data name=\"$this.Icon\" mimetype=\"text/microsoft-urt/binary-serialized/base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFRTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj0xLjAuMjQxMS4wLCBD\n        dWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABNTeXN0ZW0u\n        RHJhd2luZy5JY29uAgAAAAhJY29uRGF0YQhJY29uU2l6ZQcEAhNTeXN0ZW0uRHJhd2luZy5TaXplAgAA\n        AAIAAAAJAwAAAAX/////E1N5c3RlbS5EcmF3aW5nLlNpemUCAAAABXdpZHRoBmhlaWdodAAACAgCAAAA\n        IAAAACAAAAAPAwAAAP4CAAACAAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAA\n        AAIAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8A\n        AP8AAAD//wD/AAAA/wD/AP//AAD///8AIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi\n        IiIiIiIiIiIiIiIiIiIiIiIiIiIiIv//IiIiIiIiIiIiIiIiIv////8iIiIiIiIiIiIiIi//////8iIi\n        IiIiIiIiIiL///////8iIiIiIiIiIiIi////////IiIiIiIiIiIiL/////////IiIiIiIiIiIi//////\n        ///yIiIiIiIiIiIv////////8iIiIiIiIiIiL/////////IiIiIiIiIiIiL///////8iIiIiIiIiIiIi\n        ////////IiIiIiIiIiIiIi//////8iIiIiIiIgAAIiIi/////yIiIiIiIgAAAAAiIiL//yIiIiIiIiAA\n        AAAAAiIiIiIiIiIiIiIAAAAAAAAiIiIiIiIiIiIiAAAAAAAAIiIiIiIiIiIiIAAAAAAAAAIiIiIiIiIi\n        IiAAAAAAAAACIiIiIiIiIiIgAAAAAAAAAiIiIiIiIiIiIAAAAAAAAAIiIiIiIiIiIiIAAAAAAAAiIiIi\n        IiIiIiIiAAAAAAAAIiIiIiIiIiIiIiAAAAAAAiIiIiIiIiIiIiIiAAAAACIiIiIiIiIiIiIiIiIAACIi\n        IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAs=\n</value>\n  </data>\n  <resheader name=\"ResMimeType\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"Version\">\n    <value>1.0.0.0</value>\n  </resheader>\n  <resheader name=\"Reader\">\n    <value>System.Resources.ResXResourceReader</value>\n  </resheader>\n  <resheader name=\"Writer\">\n    <value>System.Resources.ResXResourceWriter</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Chapters/Old/reversi/Reversi.csproj",
    "content": "<VisualStudioProject>\n    <CSHARP\n        ProjectType = \"Local\"\n        ProductVersion = \"7.0.9254\"\n        SchemaVersion = \"1.0\"\n        ProjectGuid = \"{B1083115-4316-43AA-8E8D-5B50ED13AB18}\"\n    >\n        <Build>\n            <Settings\n                ApplicationIcon = \"reversi.ico\"\n                AssemblyKeyContainerName = \"\"\n                AssemblyName = \"Reversi\"\n                AssemblyOriginatorKeyFile = \"\"\n                DefaultClientScript = \"JScript\"\n                DefaultHTMLPageLayout = \"Grid\"\n                DefaultTargetSchema = \"IE50\"\n                DelaySign = \"false\"\n                NoStandardLibraries = \"false\"\n                OutputType = \"WinExe\"\n                RootNamespace = \"Reversi\"\n                StartupObject = \"\"\n            >\n                <Config\n                    Name = \"Debug\"\n                    AllowUnsafeBlocks = \"false\"\n                    BaseAddress = \"285212672\"\n                    CheckForOverflowUnderflow = \"false\"\n                    ConfigurationOverrideFile = \"\"\n                    DefineConstants = \"DEBUG;TRACE\"\n                    DocumentationFile = \"\"\n                    DebugSymbols = \"true\"\n                    FileAlignment = \"4096\"\n                    IncrementalBuild = \"true\"\n                    Optimize = \"false\"\n                    OutputPath = \"bin\\Debug\\\"\n                    RegisterForComInterop = \"false\"\n                    RemoveIntegerChecks = \"false\"\n                    TreatWarningsAsErrors = \"false\"\n                    WarningLevel = \"4\"\n                />\n                <Config\n                    Name = \"Release\"\n                    AllowUnsafeBlocks = \"false\"\n                    BaseAddress = \"285212672\"\n                    CheckForOverflowUnderflow = \"false\"\n                    ConfigurationOverrideFile = \"\"\n                    DefineConstants = \"TRACE\"\n                    DocumentationFile = \"\"\n                    DebugSymbols = \"false\"\n                    FileAlignment = \"4096\"\n                    IncrementalBuild = \"true\"\n                    Optimize = \"true\"\n                    OutputPath = \"bin\\Release\\\"\n                    RegisterForComInterop = \"false\"\n                    RemoveIntegerChecks = \"false\"\n                    TreatWarningsAsErrors = \"false\"\n                    WarningLevel = \"4\"\n                />\n            </Settings>\n            <References>\n                <Reference\n                    Name = \"System\"\n                    AssemblyName = \"System\"\n                />\n                <Reference\n                    Name = \"System.Data\"\n                    AssemblyName = \"System.Data\"\n                />\n                <Reference\n                    Name = \"System.Drawing\"\n                    AssemblyName = \"System.Drawing\"\n                />\n                <Reference\n                    Name = \"System.Windows.Forms\"\n                    AssemblyName = \"System.Windows.Forms\"\n                />\n                <Reference\n                    Name = \"System.XML\"\n                    AssemblyName = \"System.Xml\"\n                />\n            </References>\n        </Build>\n        <Files>\n            <Include>\n                <File\n                    RelPath = \"AssemblyInfo.cs\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"licenses.licx\"\n                    BuildAction = \"Content\"\n                />\n                <File\n                    RelPath = \"OptionForm.cs\"\n                    SubType = \"Form\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"OptionForm.resx\"\n                    DependentUpon = \"OptionForm.cs\"\n                    BuildAction = \"EmbeddedResource\"\n                />\n                <File\n                    RelPath = \"ReversiBoard.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"ReversiForm.cs\"\n                    SubType = \"Form\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"ReversiForm.resx\"\n                    DependentUpon = \"ReversiForm.cs\"\n                    BuildAction = \"EmbeddedResource\"\n                />\n                <File\n                    RelPath = \"ReversiPanel.cs\"\n                    SubType = \"Component\"\n                    BuildAction = \"Compile\"\n                />\n            </Include>\n        </Files>\n    </CSHARP>\n</VisualStudioProject>\n\n"
  },
  {
    "path": "Chapters/Old/reversi/Reversi.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 7.00\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Reversi\", \"Reversi.csproj\", \"{B1083115-4316-43AA-8E8D-5B50ED13AB18}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfiguration) = preSolution\n\t\tConfigName.0 = Debug\n\t\tConfigName.1 = Release\n\tEndGlobalSection\n\tGlobalSection(ProjectDependencies) = postSolution\n\tEndGlobalSection\n\tGlobalSection(ProjectConfiguration) = postSolution\n\t\t{B1083115-4316-43AA-8E8D-5B50ED13AB18}.Debug.ActiveCfg = Debug|.NET\n\t\t{B1083115-4316-43AA-8E8D-5B50ED13AB18}.Debug.Build.0 = Debug|.NET\n\t\t{B1083115-4316-43AA-8E8D-5B50ED13AB18}.Release.ActiveCfg = Release|.NET\n\t\t{B1083115-4316-43AA-8E8D-5B50ED13AB18}.Release.Build.0 = Release|.NET\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityAddIns) = postSolution\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Old/reversi/ReversiBoard.cs",
    "content": "﻿using System;\n\nnamespace Reversi\n{\n\t/// <summary>\n\t/// リバー利の駒の状態\n\t/// </summary>\n\tpublic enum ReversiColor\n\t{\n\t\tWall = 0, //盤面の淵\n\t\tBlack,    //黒い駒\n\t\tWhite,    //白い駒\n\t\tNone      //マス目に何も置かれていない状態\n\t}\n\n\t/// <summary>\n\t/// リバーシの盤面\n\t/// </summary>\n\tpublic class ReversiBoard\n\t{\n\t\tprivate readonly int width;\n\t\tprivate readonly int height;\n\t\tprivate ReversiColor[,] board;\n\n\t\t/// <summary>\n\t\t/// 盤面の初期化\n\t\t/// 盤面の幅は自由に決めれる\n\t\t/// </summary>\n\t\t/// <param name=\"width\">盤面の幅</param>\n\t\t/// <param name=\"height\">盤面の高さ</param>\n\t\tpublic ReversiBoard(int width, int height)\n\t\t{\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\t//盤面用のメモリ確保\n\t\t\tthis.board = new ReversiColor[width+2, height+2];//周りに番兵を置くので+2\n\t\t\t//盤面の淵以外をNoneにクリア\n\t\t\tfor(int x=1; x<=width; ++x)\n\t\t\t\tfor(int y=1; y<=height; ++y)\n\t\t\t\t{\n\t\t\t\t\tthis.board[x, y] = ReversiColor.None;\n\t\t\t\t}\n\t\t\t//盤面の淵に番兵を置く\n\t\t\tfor(int i=0; i<width+2; i++)\n\t\t\t{\n\t\t\t\tthis.board[i, 0] = ReversiColor.Wall;\n\t\t\t\tthis.board[i, height+1] = ReversiColor.Wall;\n\t\t\t}\n\t\t\tfor(int i=1; i<height+1; i++)\n\t\t\t{\n\t\t\t\tthis.board[0, i] = ReversiColor.Wall;\n\t\t\t\tthis.board[width+1, i] = ReversiColor.Wall;\n\t\t\t}\n\t\t\t//盤面の中央に最初の駒を置く\n\t\t\tthis.board[width/2  , height/2  ] = ReversiColor.Black;\n\t\t\tthis.board[width/2  , height/2+1] = ReversiColor.White;\n\t\t\tthis.board[width/2+1, height/2  ] = ReversiColor.White;\n\t\t\tthis.board[width/2+1, height/2+1] = ReversiColor.Black;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 盤面のコピーを作成するコンストラクタ\n\t\t/// </summary>\n\t\t/// <param name=\"b\">コピー元</param>\n\t\tprotected ReversiBoard(ReversiBoard b)\n\t\t{\n\t\t\tthis.width = b.width;\n\t\t\tthis.height = b.height;\n\t\t\t//盤面用のメモリ確保\n\t\t\tthis.board = new ReversiColor[b.width+2, b.height+2];//周りに番兵を置くので+2\n\t\t\t//盤面の淵以外をNoneにクリア\n\t\t\tfor(int x=0; x<b.width+2; ++x)\n\t\t\t\tfor(int y=0; y<b.height+2; ++y)\n\t\t\t\t{\n\t\t\t\t\tthis.board[x, y] = b.board[x, y];\n\t\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 自分自身のコピーを生成\n\t\t/// </summary>\n\t\tpublic ReversiBoard Clone()\n\t\t{\n\t\t\treturn new ReversiBoard(this);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 盤面の初期化\n\t\t/// 盤面のサイズはデフォルトでは8×8\n\t\t/// </summary>\n\t\tpublic ReversiBoard():this(8, 8){}\n\n\t\t//=========================================================\n\t\t// public methods\n\n\t\t/// <summary>\n\t\t/// 座標(x,y)にコマをおけるかどうかを調べる\n\t\t/// <param name=\"x\">調べる場所のx座標 0～width-1</param>\n\t\t/// <param name=\"y\">調べる場所のy座標 0～width-1</param>\n\t\t/// <returns>置けるかどうか</returns>\n\t\t/// </summary>\n\t\tpublic bool Check(int x, int y, ReversiColor color)\n\t\t{\n\t\t\t++x; ++y;\n\t\t\treturn this.board[x,y] == ReversiColor.None &&\n\t\t\t\t( CheckLine(x, y, -1,  0, color)  //左\n\t\t\t\t|| CheckLine(x, y,  1,  0, color)  //右\n\t\t\t\t|| CheckLine(x, y,  0, -1, color)  //上\n\t\t\t\t|| CheckLine(x, y,  0,  1, color)  //下\n\t\t\t\t|| CheckLine(x, y, -1, -1, color)  //左上\n\t\t\t\t|| CheckLine(x, y,  1, -1, color)  //右上\n\t\t\t\t|| CheckLine(x, y, -1,  1, color)  //左下\n\t\t\t\t|| CheckLine(x, y,  1,  1, color));//右上\n\t\t}\n\t\t\n\t\t/// <summary>\n\t\t/// 盤面に置けるますがあるかどうかを調べる\n\t\t/// </summary>\n\t\t/// <returns>置けるますが存在するかどうか</returns>\n\t\tpublic bool CheckAll(ReversiColor color)\n\t\t{\n\t\t\tfor(int x=1; x<=this.width; ++x)\n\t\t\t\tfor(int y=1; y<=this.height; ++y)\n\t\t\t\t\tif(Check(x,y, color)) return true;\n\n\t\t\treturn false;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// set 盤面に新たに駒を置き、盤面の更新を行う\n\t\t/// get 盤面に置かれた駒の色を返す\n\t\t/// x : 0～width-1\n\t\t/// y : 0～height-1\n\t\t/// </summary>\n\t\tpublic ReversiColor this[int x, int y]\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\t++x; ++y;\n\t\t\t\tthis.board[x,y] = value;//そのマス目にこまを置く\n\t\t\t\tUpdateLine(x, y, -1,  0, value);//左\n\t\t\t\tUpdateLine(x, y,  1,  0, value);//右\n\t\t\t\tUpdateLine(x, y,  0, -1, value);//上\n\t\t\t\tUpdateLine(x, y,  0,  1, value);//下\n\t\t\t\tUpdateLine(x, y, -1, -1, value);//左上\n\t\t\t\tUpdateLine(x, y,  1, -1, value);//右上\n\t\t\t\tUpdateLine(x, y, -1,  1, value);//左下\n\t\t\t\tUpdateLine(x, y,  1,  1, value);//右上\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\tif(x >= this.width || x < 0 || y >= this.height || y < 0)\n\t\t\t\t\treturn ReversiColor.Wall;\n\t\t\t\treturn this.board[x+1, y+1];\n\t\t\t}\n\t\t}\n\n\t\tpublic int Width{get{return width;}}\n\t\tpublic int Height{get{return height;}}\n\n\t\t/// <summary>\n\t\t/// 駒の数を数える\n\t\t/// </summary>\n\t\t/// <param name=\"black_num\">黒い駒の数を返す</param>\n\t\t/// <param name=\"white_num\">白い駒の数を返す</param>\n\t\tpublic void CountUp(out int black_num, out int white_num)\n\t\t{\n\t\t\tblack_num = 0;\n\t\t\twhite_num = 0;\n\t\t\tfor(int x=1; x<=width; ++x)\n\t\t\t\tfor(int y=1; y<=height; ++y)\n\t\t\t\t{\n\t\t\t\t\tif(board[x, y] == ReversiColor.Black) black_num++;\n\t\t\t\t\tif(board[x, y] == ReversiColor.White) white_num++;\n\t\t\t\t}\n\t\t}\n\n\t\tpublic int GetScore(ReversiColor color)\n\t\t{\n\t\t\tint black, white;\n\t\t\tthis.CountUp(out black, out white);\n\t\t\tif(color == ReversiColor.Black) return black;\n\t\t\tif(color == ReversiColor.White) return white;\n\t\t\treturn 0;\n\t\t}\n\n\t\t//=========================================================\n\t\t// private methods\n\n\t\t/// <summary>\n\t\t/// 盤面の更新を1ラインずつ行う\n\t\t/// <param name=\"x\">置く場所のx座標</param>\n\t\t/// <param name=\"y\">置く場所のy座標</param>\n\t\t/// <param name=\"color\">置く駒の色</param>\n\t\t/// </summary>\n\t\tprivate void UpdateLine(int x, int y, int dx, int dy, ReversiColor color)\n\t\t{\n\t\t\tint i, j;\n\t\t\tReversiColor inverse_color = InverseColor(color);\n\t\t\tfor(i=x+dx, j=y+dy; this.board[i,j] == inverse_color; i+=dx, j+=dy);\n\t\t\tif(!(i==x+dx && j==y+dy) && this.board[i,j]==color)\n\t\t\t\tfor(i-=dx, j-=dy; !(i==x && j==y); i-=dx, j-=dy)\n\t\t\t\t\tthis.board[i,j] = color;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 駒の色と逆の色を返す\n\t\t/// </summary>\n\t\t/// <param name=\"color\">駒の色</param>\n\t\t/// <returns>逆の色</returns>\n\t\tstatic public ReversiColor InverseColor(ReversiColor color)\n\t\t{\n\t\t\tif(color == ReversiColor.Black) return ReversiColor.White;\n\t\t\tif(color == ReversiColor.White) return ReversiColor.Black;\n\t\t\treturn color;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 座標(x,y)にコマをおけるかどうか、1ライン分調べる\n\t\t/// (Checkメソッドで利用する)\n\t\t/// <param name=\"x\">調べる場所のx座標</param>\n\t\t/// <param name=\"y\">調べる場所のy座標</param>\n\t\t/// <returns>置けるかどうか</returns>\n\t\t/// </summary>\n\t\tprivate bool CheckLine(int x, int y, int dx, int dy, ReversiColor color)\n\t\t{\n\t\t\tint i, j;\n\t\t\tReversiColor inverse_color = InverseColor(color);\n\t\t\tfor(i=x+dx, j=y+dy; this.board[i,j] == inverse_color; i+=dx, j+=dy);\n\t\t\treturn !(i==x+dx && j==y+dy) && this.board[i,j]==color;\n\t\t}\n\n\t}//class ReversiBoard\n}\n"
  },
  {
    "path": "Chapters/Old/reversi/ReversiForm.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing System.Data;\n\nnamespace Reversi\n{\n\t/// <summary>\n\t/// Form1 の概要の説明です。\n\t/// </summary>\n\tpublic class ReversiMainForm : System.Windows.Forms.Form\n\t{\n\t\t/// <summary>\n\t\t/// オプション設定値\n\t\t/// </summary>\n\t\tpublic class Option\n\t\t{\n\t\t\tpublic int board_width = 8;  //盤面の横幅\n\t\t\tpublic int board_height = 8; //盤面の高さ\n\t\t\tpublic int max_lookahead = 5;//CPUの先読み段数(多分、多いほうが強い)\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 必要なデザイナ変数です。\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.Container components = null;\n\n\t\tprivate ReversiBoard board; //リバーシの盤面\n\t\tprivate Option option = new Option();\n\t\tprivate ReversiPanel panel;\n\t\tprivate System.Windows.Forms.StatusBar status_bar;\n\t\tprivate System.Windows.Forms.MenuItem menu_start;\n\t\tprivate System.Windows.Forms.MenuItem menu_option;\n\t\tprivate System.Windows.Forms.MenuItem menu_quit;\n\t\tprivate System.Windows.Forms.MainMenu mainMenu; //盤面を表示するためのパネル\n\t\tprivate ReversiColor phase; //今、白黒どちらの攻撃中か\n\n\t\tpublic ReversiMainForm()\n\t\t{\n\t\t\t//\n\t\t\t// Windows フォーム デザイナ サポートに必要です。\n\t\t\t//\n\t\t\tInitializeComponent();\n\n\t\t\tthis.panel = new ReversiPanel();\n\t\t\tthis.panel.Location = new Point(0, 0);\n\t\t\tthis.panel.CellClick += new CellClickHandler(OnCellClick);\n\t\t\tthis.Controls.Add(panel);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 使用されているリソースに後処理を実行します。\n\t\t/// </summary>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif( disposing )\n\t\t\t{\n\t\t\t\tif (components != null) \n\t\t\t\t{\n\t\t\t\t\tcomponents.Dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Windows Form Designer generated code\n\t\t/// <summary>\n\t\t/// デザイナ サポートに必要です。このメソッドの内容を\n\t\t/// コード エディタで変更しないでください。\n\t\t/// </summary>\n\t\tprivate void InitializeComponent()\n\t\t{\n\t\t\tSystem.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(ReversiMainForm));\n\t\t\tthis.mainMenu = new System.Windows.Forms.MainMenu();\n\t\t\tthis.menu_start = new System.Windows.Forms.MenuItem();\n\t\t\tthis.menu_option = new System.Windows.Forms.MenuItem();\n\t\t\tthis.menu_quit = new System.Windows.Forms.MenuItem();\n\t\t\tthis.status_bar = new System.Windows.Forms.StatusBar();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// mainMenu\n\t\t\t// \n\t\t\tthis.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.menu_start,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.menu_option,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.menu_quit});\n\t\t\t// \n\t\t\t// menu_start\n\t\t\t// \n\t\t\tthis.menu_start.Index = 0;\n\t\t\tthis.menu_start.Text = \"ゲーム開始\";\n\t\t\tthis.menu_start.Click += new System.EventHandler(this.menu_start_Click);\n\t\t\t// \n\t\t\t// menu_option\n\t\t\t// \n\t\t\tthis.menu_option.Index = 1;\n\t\t\tthis.menu_option.Text = \"オプション\";\n\t\t\tthis.menu_option.Click += new System.EventHandler(this.menu_option_Click);\n\t\t\t// \n\t\t\t// menu_quit\n\t\t\t// \n\t\t\tthis.menu_quit.Index = 2;\n\t\t\tthis.menu_quit.Text = \"終了\";\n\t\t\tthis.menu_quit.Click += new System.EventHandler(this.menu_quit_Click);\n\t\t\t// \n\t\t\t// status_bar\n\t\t\t// \n\t\t\tthis.status_bar.Anchor = ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n\t\t\t\t| System.Windows.Forms.AnchorStyles.Right);\n\t\t\tthis.status_bar.Dock = System.Windows.Forms.DockStyle.None;\n\t\t\tthis.status_bar.Location = new System.Drawing.Point(0, -4);\n\t\t\tthis.status_bar.Name = \"status_bar\";\n\t\t\tthis.status_bar.Size = new System.Drawing.Size(296, 20);\n\t\t\tthis.status_bar.TabIndex = 0;\n\t\t\t// \n\t\t\t// ReversiMainForm\n\t\t\t// \n\t\t\tthis.AutoScaleBaseSize = new System.Drawing.Size(5, 12);\n\t\t\tthis.ClientSize = new System.Drawing.Size(298, 19);\n\t\t\tthis.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.status_bar});\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;\n\t\t\tthis.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n\t\t\tthis.MaximizeBox = false;\n\t\t\tthis.Menu = this.mainMenu;\n\t\t\tthis.MinimizeBox = false;\n\t\t\tthis.Name = \"ReversiMainForm\";\n\t\t\tthis.Text = \"Reversi\";\n\t\t\tthis.ResumeLayout(false);\n\n\t\t}\n\t\t#endregion\n\n\t\t/// <summary>\n\t\t/// アプリケーションのメイン エントリ ポイントです。\n\t\t/// </summary>\n\t\t[STAThread]\n\t\tstatic void Main() \n\t\t{\n\t\t\tApplication.Run(new ReversiMainForm());\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 対人戦時、セル(x,y)がクリックされたときの処理\n\t\t/// </summary>\n\t\tprotected void OnCellClick(int x, int y)\n\t\t{\n\t\t\tif(!this.board.Check(x, y, this.phase))\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.board[x, y] = this.phase;\n\t\t\tthis.panel.UpdateBoard();\n\t\t\tthis.phase = ReversiBoard.InverseColor(this.phase);\n\t\t\tShowPhaseMessage();\n\t\t\tif(!this.board.CheckAll(this.phase))\n\t\t\t{\n\t\t\t\tGameSet();\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ゲーム終了時の処理\n\t\t/// </summary>\n\t\tprivate void GameSet()\n\t\t{\n\t\t\tint black_num, white_num;\n\t\t\tthis.board.CountUp(out black_num, out white_num);\n\t\t\tif(black_num > white_num)\n\t\t\t\tstatus_bar.Text = black_num + \"対\" + white_num + \"で黒の勝ち\";\n\t\t\telse if(black_num < white_num)\n\t\t\t\tstatus_bar.Text = black_num + \"対\" + white_num + \"で白の勝ち\";\n\t\t\telse\n\t\t\t\tstatus_bar.Text = black_num + \"対\" + white_num + \"で引き分け\";\n\t\t\t\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ゲーム開始の処理\n\t\t/// </summary>\n\t\tprivate void GameStart()\n\t\t{\n\t\t\tthis.board = new ReversiBoard(option.board_width, option.board_height);\n\n\t\t\tthis.panel.Board = this.board;\n\n\t\t\tthis.ClientSize = new Size(this.panel.Width, this.panel.Height + this.status_bar.Height);\n\n\t\t\tthis.phase = ReversiColor.Black;\n\t\t\tShowPhaseMessage();\n\t\t}\n\n\t\tprivate void ShowPhaseMessage()\n\t\t{\n\t\t\tif(this.phase == ReversiColor.Black) status_bar.Text = \"黒の番です\";\n\t\t\tif(this.phase == ReversiColor.White) status_bar.Text = \"白の番です\";\n\t\t}\n\n\t\tprivate void ShowErrorMessage()\n\t\t{\n\t\t\tstatus_bar.Text = \"そこには置けません\";\n\t\t}\n\n\t\tprivate void menu_start_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tGameStart();\n\t\t}\n\n\t\tprivate void menu_quit_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tDialogResult res = MessageBox.Show(\"終了しますか？\", \"終了の確認\", MessageBoxButtons.OKCancel);\n\t\t\tif(res == DialogResult.OK)\n\t\t\t\tthis.Close();\n\t\t}\n\n\t\tprivate void menu_option_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tOptionForm opt_form = new OptionForm(option);\n\t\t\topt_form.ShowDialog();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/reversi/ReversiForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <xsd:schema id=\"root\" targetNamespace=\"\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <data name=\"mainMenu.Location\" type=\"System.Drawing.Point, System.Drawing\">\n    <value>17, 17</value>\n  </data>\n  <data name=\"$this.Name\">\n    <value>ReversiMainForm</value>\n  </data>\n  <data name=\"$this.Icon\" mimetype=\"text/microsoft-urt/binary-serialized/base64\">\n    <value>\n        AAEAAAD/////AQAAAAAAAAAMAgAAAFRTeXN0ZW0uRHJhd2luZywgVmVyc2lvbj0xLjAuMjQxMS4wLCBD\n        dWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWIwM2Y1ZjdmMTFkNTBhM2EFAQAAABNTeXN0ZW0u\n        RHJhd2luZy5JY29uAgAAAAhJY29uRGF0YQhJY29uU2l6ZQcEAhNTeXN0ZW0uRHJhd2luZy5TaXplAgAA\n        AAIAAAAJAwAAAAX/////E1N5c3RlbS5EcmF3aW5nLlNpemUCAAAABXdpZHRoBmhlaWdodAAACAgCAAAA\n        IAAAACAAAAAPAwAAAP4CAAACAAABAAEAICAQAAAAAADoAgAAFgAAACgAAAAgAAAAQAAAAAEABAAAAAAA\n        AAIAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8A\n        AP8AAAD//wD/AAAA/wD/AP//AAD///8AIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIi\n        IiIiIiIiIiIiIiIiIiIiIiIiIiIiIv//IiIiIiIiIiIiIiIiIv////8iIiIiIiIiIiIiIi//////8iIi\n        IiIiIiIiIiL///////8iIiIiIiIiIiIi////////IiIiIiIiIiIiL/////////IiIiIiIiIiIi//////\n        ///yIiIiIiIiIiIv////////8iIiIiIiIiIiL/////////IiIiIiIiIiIiL///////8iIiIiIiIiIiIi\n        ////////IiIiIiIiIiIiIi//////8iIiIiIiIgAAIiIi/////yIiIiIiIgAAAAAiIiL//yIiIiIiIiAA\n        AAAAAiIiIiIiIiIiIiIAAAAAAAAiIiIiIiIiIiIiAAAAAAAAIiIiIiIiIiIiIAAAAAAAAAIiIiIiIiIi\n        IiAAAAAAAAACIiIiIiIiIiIgAAAAAAAAAiIiIiIiIiIiIAAAAAAAAAIiIiIiIiIiIiIAAAAAAAAiIiIi\n        IiIiIiIiAAAAAAAAIiIiIiIiIiIiIiAAAAAAAiIiIiIiIiIiIiIiAAAAACIiIiIiIiIiIiIiIiIAACIi\n        IiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAs=\n</value>\n  </data>\n  <resheader name=\"ResMimeType\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"Version\">\n    <value>1.0.0.0</value>\n  </resheader>\n  <resheader name=\"Reader\">\n    <value>System.Resources.ResXResourceReader</value>\n  </resheader>\n  <resheader name=\"Writer\">\n    <value>System.Resources.ResXResourceWriter</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Chapters/Old/reversi/ReversiPanel.cs",
    "content": "﻿using System;\nusing System.Drawing;\n\nnamespace Reversi\n{\n\t/// <summary>\n\t/// ReversiPanelの位置(x,y)にあるセルがクリックされたときに呼び出されるデリゲート\n\t/// </summary>\n\tpublic delegate void CellClickHandler(int x, int y);\n\n\t/// <summary>\n\t/// ReversiPanle の概要の説明です。\n\t/// </summary>\n\tpublic class ReversiPanel : System.Windows.Forms.Panel\n\t{\n\t\t/// <summary>\n\t\t/// オセロのセルクラス\n\t\t/// </summary>\n\t\tinternal class ReversiCell : System.Windows.Forms.PictureBox\n\t\t{\n\t\t\tpublic readonly int x;\n\t\t\tpublic readonly int y;\n\t\t\tprivate ReversiPanel parent;\n\n\t\t\tpublic void SetColor(ReversiColor color)\n\t\t\t{\n\t\t\t\tImage img = parent.none_image;\n\t\t\t\tif(color == ReversiColor.Black) img = parent.black_image;\n\t\t\t\tif(color == ReversiColor.White) img = parent.white_image;\n\t\t\t\tif(this.Image != img) this.Image = img;\n\t\t\t}\n\n\t\t\tpublic ReversiCell(int x, int y, ReversiPanel parent)\n\t\t\t{\n\t\t\t\tthis.x = x;\n\t\t\t\tthis.y = y;\n\t\t\t\tthis.parent = parent;\n\t\t\t}\n\t\t}//class ReversiCell\n\n\n\t\t//---------------------------------------------------------\n\t\tpublic event CellClickHandler CellClick;//セルがクリックされたときに呼ばれるハンドラ\n\n\t\tprotected System.Drawing.Image black_image; //黒い駒の絵\n\t\tprotected System.Drawing.Image white_image; //白い駒の絵\n\t\tprotected System.Drawing.Image none_image;  //何もないマスの絵\n\n\t\tprivate ReversiBoard board;\n\t\tprivate ReversiCell[,] cells;\n\n\t\tpublic ReversiPanel(ReversiBoard board, string image_name)\n\t\t{\n\t\t\tnone_image  = System.Drawing.Image.FromFile(@\"image\\\" + image_name + \"n.png\");\n\t\t\twhite_image = System.Drawing.Image.FromFile(@\"image\\\" + image_name + \"w.png\");\n\t\t\tblack_image = System.Drawing.Image.FromFile(@\"image\\\" + image_name + \"b.png\");\n\n\t\t\tthis.board = board;\n\t\t\tif(board != null)\n\t\t\t\tCreateCells();\n\t\t\telse\n\t\t\t\tthis.Size = new Size(0, 0);\n\t\t}\n\n\t\tpublic ReversiBoard Board\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tif(this.board == null || this.board.Width!=value.Width || this.board.Height!=value.Height)\n\t\t\t\t{\n\t\t\t\t\tthis.board = value;\n\t\t\t\t\tCreateCells();\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis.board = value;\n\t\t\t\t\tUpdateBoard();\n\t\t\t\t}\n\t\t\t}\n\t\t\tget{return this.board;}\n\t\t}\n\n\t\tpublic ReversiPanel(ReversiBoard board) : this(board, \"32\"){}\n\n\t\tpublic ReversiPanel() : this(null){}\n\n\t\tpublic void UpdateBoard()\n\t\t{\n\t\t\tfor(int x=0; x<board.Width; ++x)\n\t\t\t\tfor(int y=0; y<board.Height; ++y)\n\t\t\t\t{\n\t\t\t\t\tReversiCell cell = this.cells[x,y];\n\t\t\t\t\tcell.SetColor(board[x, y]);\n\t\t\t\t}\n\t\t\tInvalidate();\n\t\t}\n\n\t\tprotected void OnCellClick(object sender, EventArgs args)\n\t\t{\n\t\t\tReversiCell cell = (ReversiCell)sender;\n\t\t\tif(CellClick != null)CellClick(cell.x, cell.y);\n\t\t}\n\n\t\tprivate void CreateCells()\n\t\t{\n\t\t\tint image_width  = none_image.Width;\n\t\t\tint image_height = none_image.Height;\n\n\t\t\tcells = new ReversiCell[board.Width, board.Height];\n\t\t\tthis.Controls.Clear();\n\t\t\tfor(int x=0; x<board.Width; ++x)\n\t\t\t\tfor(int y=0; y<board.Height; ++y)\n\t\t\t\t{\n\t\t\t\t\tReversiCell cell = new ReversiCell(x, y, this);\n\t\t\t\t\tcell.Location = new Point(image_width*x, image_height*y);\n\t\t\t\t\tcell.Size = new Size(image_width, image_height);\n\t\t\t\t\tcell.SetColor(board[x, y]);\n\t\t\t\t\tcell.Click += new EventHandler(OnCellClick);\n\t\t\t\t\tthis.Controls.Add(cell);\n\t\t\t\t\tthis.cells[x,y] = cell;\n\t\t\t\t}\n\t\t\tthis.Width = board.Width * image_width;\n\t\t\tthis.Height = board.Height * image_height;\n\t\t}\n\t}//class ReversiPanel\n}//namespace Reversi\n"
  },
  {
    "path": "Chapters/Old/reversi/licenses.licx",
    "content": "System.Windows.Forms.Panel, System.Windows.Forms, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Windows.Forms.TextBox, System.Windows.Forms, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Windows.Forms.MenuItem, System.Windows.Forms, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Windows.Forms.StatusBar, System.Windows.Forms, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Windows.Forms.Label, System.Windows.Forms, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Windows.Forms.MainMenu, System.Windows.Forms, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Windows.Forms.Button, System.Windows.Forms, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Windows.Forms.PictureBox, System.Windows.Forms, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Windows.Forms.Form, System.Windows.Forms, Version=1.0.2411.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\n"
  },
  {
    "path": "Chapters/Old/spctrum/AppMain/AppSettings.cs",
    "content": "﻿using System;\n\nnamespace AppMain\n{\n\t/// <summary>\n\t/// アプリケーションの設定。\n\t/// </summary>\n\tpublic class AppSettings\n\t{\n\t\tpublic int left;\n\t\tpublic int top;\n\t\tpublic int width;\n\t\tpublic int height;\n\n\t\tpublic WaveLoadFormSettings loadForm = new WaveLoadFormSettings();\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/spctrum/AppMain/MainForm.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing System.Xml.Serialization;\nusing System.IO;\n\nusing Wave;\nusing Graph;\nusing WaveAnalysis;\n\nnamespace AppMain\n{\n\t/// <summary>\n\t/// MainForm の概要の説明です。\n\t/// </summary>\n\tpublic class MainForm : System.Windows.Forms.Form\n\t{\n\t\tprivate System.Windows.Forms.MainMenu mainMenu;\n\t\tprivate System.Windows.Forms.MenuItem menuItemFile;\n\t\tprivate System.Windows.Forms.MenuItem menuItemEnd;\n\t\t/// <summary>\n\t\t/// 必要なデザイナ変数です。\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.Container components = null;\n\t\tprivate System.Windows.Forms.MenuItem menuItemFileOpen;\n\n\t\t#region 手動行進用領域\n\t\tAppSettings appSettings = new AppSettings();\n\t\tconst string settingFileName = @\"\\setting.xml\";\n\n\t\t/// <summary>\n\t\t/// アプリの設定をデフォルト設定にする。\n\t\t/// 設定ファイルがなかった場合に呼ばれる。\n\t\t/// </summary>\n\t\tprivate void SetAppSettings()\n\t\t{\n\t\t\tthis.appSettings.loadForm.skipLength   = \"0\";\n\t\t\tthis.appSettings.loadForm.readLength   = \"1024\";\n\t\t\tthis.appSettings.loadForm.removeSilent = false;\n\t\t\tthis.appSettings.loadForm.threshold    = \"0\";\n\t\t\tthis.appSettings.loadForm.relative     = false;\n\n\t\t\tthis.appSettings.loadForm.useReference = false;\n\t\t\tthis.appSettings.loadForm.isNormalized = false;\n\t\t\tthis.appSettings.loadForm.type         = 0;\n\n\t\t\tthis.appSettings.loadForm.skipLengthRef   = \"0\";\n\t\t\tthis.appSettings.loadForm.removeSilentRef = false;\n\t\t\tthis.appSettings.loadForm.thresholdRef    = \"0\";\n\t\t\tthis.appSettings.loadForm.relativeRef     = false;\n\t\t}//SetAppSettings\n\n\t\t/// <summary>\n\t\t/// アプリの設定を設定ファイルから読み込む。\n\t\t/// </summary>\n\t\tprivate void LoadAppSettings()\n\t\t{\n\t\t\tStreamReader reader = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tXmlSerializer serializer = new XmlSerializer(typeof(AppSettings));\n\t\t\t\treader = new StreamReader(Application.StartupPath + MainForm.settingFileName);\n\t\t\t\tthis.appSettings = (AppSettings)serializer.Deserialize(reader);\n\t\t\t}\n\t\t\tcatch(FileNotFoundException)\n\t\t\t{\n\t\t\t\tthis.SetAppSettings();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcatch(Exception ex)\n\t\t\t{\n\t\t\t\tMessageBox.Show(ex.Message);\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tif(reader != null) reader.Close();\n\t\t\t}\n\t\t\tthis.Left   = this.appSettings.left;\n\t\t\tthis.Top    = this.appSettings.top;\n\t\t\tthis.Width  = this.appSettings.width;\n\t\t\tthis.Height = this.appSettings.height;\n\t\t}//LoadAppSettings\n\n\t\t/// <summary>\n\t\t/// アプリの設定を設定ファイルに保存する。\n\t\t/// </summary>\n\t\tprivate void SaveAppSettings()\n\t\t{\n\t\t\tthis.appSettings.left   = this.Left;\n\t\t\tthis.appSettings.top    = this.Top;\n\t\t\tthis.appSettings.width  = this.Width;\n\t\t\tthis.appSettings.height = this.Height;\n\n\t\t\tStreamWriter writer = null;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tXmlSerializer serializer = new XmlSerializer(typeof(AppSettings));\n\t\t\t\twriter = new StreamWriter(Application.StartupPath + MainForm.settingFileName);\n\t\t\t\tserializer.Serialize(writer, this.appSettings);\n\t\t\t}\n\t\t\tcatch(Exception ex)\n\t\t\t{\n\t\t\t\tMessageBox.Show(ex.Message);\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\tif(writer != null) writer.Close();\n\t\t\t}\n\t\t}//SaveAppSettings\n\n\t\t/// <summary>\n\t\t/// 初期化\n\t\t/// </summary>\n\t\tprivate void Initialize()\n\t\t{\n\t\t\tthis.LoadAppSettings();\n\t\t}\n\n\t\tpublic void CreateWaveForm(string title, WaveData wave)\n\t\t{\n\t\t\tWaveGraphForm form = new WaveGraphForm(wave);\n\t\t\tform.Text = title;\n\t\t\tform.MdiParent = this;\n\t\t\tform.Show();\n\t\t}\n\t\t#endregion\n\n\t\tpublic MainForm()\n\t\t{\n\t\t\tInitializeComponent();\n\n\t\t\tInitialize();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 使用されているリソースに後処理を実行します。\n\t\t/// </summary>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif( disposing )\n\t\t\t{\n\t\t\t\tif(components != null)\n\t\t\t\t{\n\t\t\t\t\tcomponents.Dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Windows Form Designer generated code\n\t\t/// <summary>\n\t\t/// デザイナ サポートに必要なメソッドです。このメソッドの内容を\n\t\t/// コード エディタで変更しないでください。\n\t\t/// </summary>\n\t\tprivate void InitializeComponent()\n\t\t{\n\t\t\tSystem.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(MainForm));\n\t\t\tthis.mainMenu = new System.Windows.Forms.MainMenu();\n\t\t\tthis.menuItemFile = new System.Windows.Forms.MenuItem();\n\t\t\tthis.menuItemFileOpen = new System.Windows.Forms.MenuItem();\n\t\t\tthis.menuItemEnd = new System.Windows.Forms.MenuItem();\n\t\t\t// \n\t\t\t// mainMenu\n\t\t\t// \n\t\t\tthis.mainMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.menuItemFile});\n\t\t\t// \n\t\t\t// menuItemFile\n\t\t\t// \n\t\t\tthis.menuItemFile.Index = 0;\n\t\t\tthis.menuItemFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.menuItemFileOpen,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.menuItemEnd});\n\t\t\tthis.menuItemFile.Text = \"ファイル\";\n\t\t\t// \n\t\t\t// menuItemFileOpen\n\t\t\t// \n\t\t\tthis.menuItemFileOpen.Index = 0;\n\t\t\tthis.menuItemFileOpen.Text = \"開く\";\n\t\t\tthis.menuItemFileOpen.Click += new System.EventHandler(this.menuItemFileOpen_Click);\n\t\t\t// \n\t\t\t// menuItemEnd\n\t\t\t// \n\t\t\tthis.menuItemEnd.Index = 1;\n\t\t\tthis.menuItemEnd.Text = \"終了\";\n\t\t\tthis.menuItemEnd.Click += new System.EventHandler(this.menuItemEnd_Click);\n\t\t\t// \n\t\t\t// MainForm\n\t\t\t// \n\t\t\tthis.AutoScaleBaseSize = new System.Drawing.Size(5, 12);\n\t\t\tthis.ClientSize = new System.Drawing.Size(632, 433);\n\t\t\tthis.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n\t\t\tthis.IsMdiContainer = true;\n\t\t\tthis.Menu = this.mainMenu;\n\t\t\tthis.Name = \"MainForm\";\n\t\t\tthis.Text = \"Wave Analyzer\";\n\t\t\tthis.Closed += new System.EventHandler(this.MainForm_Closed);\n\n\t\t}\n\t\t#endregion\n\n\t\t/// <summary>\n\t\t/// アプリケーションのメイン エントリ ポイントです。\n\t\t/// </summary>\n//\t\t[STAThread]\n\t\tstatic void Main(string[] args)\n\t\t{\n//!\t\t\tAppTest.Hoge(args);\n\t\t\tApplication.Run(new MainForm());\n\t\t}\n\n\t\tprivate void menuItemEnd_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.Close();\n\t\t}\n\n\t\tprivate void menuItemFileOpen_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tWaveLoadForm dlg = new WaveLoadForm();\n\t\t\tdlg.Setting = this.appSettings.loadForm;\n\t\t\tif(dlg.ShowDialog() != DialogResult.OK) return;\n\t\t\tthis.appSettings.loadForm = dlg.Setting;\n\n\t\t\tWaveData wave;\n\t\t\tstring dataName;\n\t\t\ttry\n\t\t\t{\n\t\t\t\twave = dlg.CreateWave();\n\t\t\t\tdataName = dlg.DataFileName;\n\t\t\t}\n\t\t\tcatch(Exception exc)\n\t\t\t{\n\t\t\t\tMessageBox.Show(\"ファイルの読み込み中にエラーが発生しました。\\n\" + exc.Message);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tCreateWaveForm(dataName, wave);\n\t\t}\n\n\t\tprivate void MainForm_Closed(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.SaveAppSettings();\n\t\t}\n\t}//class MainForm\n}//namespace AppMain\n"
  },
  {
    "path": "Chapters/Old/spctrum/AppMain/MainForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n            Microsoft ResX Schema \n        \n            Version 1.3\n                \n            The primary goals of this format is to allow a simple XML format \n            that is mostly human readable. The generation and parsing of the \n            various data types are done through the TypeConverter classes \n            associated with the data types.\n        \n            Example:\n        \n                ... ado.net/XML headers & schema ...\n                <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n                <resheader name=\"version\">1.3</resheader>\n                <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n                <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n                <data name=\"Name1\">this is my long string</data>\n                <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n                <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n                    [base64 mime encoded serialized .NET Framework object]\n                </data>\n                <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n                    [base64 mime encoded string representing a byte array form of the .NET Framework object]\n                </data>\n        \n            There are any number of \"resheader\" rows that contain simple \n            name/value pairs.\n            \n            Each data row contains a name, and value. The row also contains a \n            type or mimetype. Type corresponds to a .NET class that support \n            text/value conversion through the TypeConverter architecture. \n            Classes that don't support this are serialized and stored with the \n            mimetype set.\n                     \n            The mimetype is used for serialized objects, and tells the \n            ResXResourceReader how to depersist the object. This is currently not \n            extensible. For a given mimetype the value must be set accordingly:\n        \n            Note - application/x-microsoft.net.object.binary.base64 is the format \n                   that the ResXResourceWriter will generate, however the reader can \n                   read any of the formats listed below.\n        \n            mimetype: application/x-microsoft.net.object.binary.base64\n            value   : The object must be serialized with \n                    : System.Serialization.Formatters.Binary.BinaryFormatter\n                    : and then encoded with base64 encoding.\n        \n            mimetype: application/x-microsoft.net.object.soap.base64\n            value   : The object must be serialized with \n                    : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n                    : and then encoded with base64 encoding.\n            mimetype: application/x-microsoft.net.object.bytearray.base64\n            value   : The object must be serialized into a byte array \n                    : using a System.ComponentModel.TypeConverter\n                    : and then encoded with base64 encoding.\n        -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>1.3</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"mainMenu.Location\" type=\"System.Drawing.Point, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </data>\n  <data name=\"$this.Name\">\n    <value>MainForm</value>\n  </data>\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAIAICAQAAAAAADoAgAAJgAAABAQEAAAAAAAKAEAAA4DAAAoAAAAIAAAAEAAAAABAAQAAAAAAIAC\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/\n        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd3d3d3d3d3d3d3d3d3dwBEREREREREREREREREREcAT/\n        ////////////////9HAE//////////////////RwBP/////////////////0cAT/////////////////\n        9HAE//////////////////RwBP/////////////////0cAT/////////////////9HAE////////////\n        //////RwBP/////////////////0cAT/////////////////9HAE//////////////////RwBP//////\n        ///////////0cAT/////////////////9HAE//////////////////RwBP/////////////////0cAT/\n        ////////////////9HAE//////////////////RwBP/////////////////0cASIiIiIiIiIiIiIiIiI\n        hHAERERERERERERERERERERwBExMTExMTExMTE7Ozkl0cATMzMzMzMzMzMzMzMzMxAAARERERERERERE\n        REREREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////\n        /////////////8AAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAA\n        AAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAA8AAAAf/////////////\n        //8oAAAAEAAAACAAAAABAAQAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAgAAAAICAAIAA\n        AACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAB3d3d3d3\n        d3dERERERERER0////////hHT///////+EdP///////4R0////////hHT///////+EdP///////4R0//\n        //////hHT///////+EdIiIiIiIiIR0zMzMzMzMxHxERERERERMAAAAAAAAAAAAAAAAAAAAAA//8AAIAA\n        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAD//wAA//8AAA==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "Chapters/Old/spctrum/AppMain/WaveGraphForm.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing System.IO;\n\nusing Graph;\nusing SpectrumAnalysis;\nusing WaveAnalysis;\n\nnamespace AppMain\n{\n\t/// <summary>\n\t/// WaveForm の概要の説明です。\n\t/// </summary>\n\tpublic class WaveGraphForm : System.Windows.Forms.Form\n\t{\n\t\t#region 手動更新領域\n\t\tWaveData wave;\n\n\t\tstatic readonly Brush brush = new SolidBrush(SystemColors.WindowText);\n\t\tstatic readonly Font  font  = new Font(FontFamily.GenericSansSerif, 8);\n\t\tstatic readonly Pen[] pens  = new Pen[]{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t new Pen(Color.Black),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t new Pen(Color.Crimson),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t new Pen(Color.DarkBlue),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t new Pen(Color.DarkGreen),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t new Pen(Color.Brown),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t new Pen(Color.DarkViolet)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t };\n\n\t\t#endregion\n\n\t\tprivate System.Windows.Forms.Label labelChannel;\n\t\tprivate System.Windows.Forms.Label labelType;\n\t\tprivate System.Windows.Forms.ComboBox comboType;\n\t\tprivate System.Windows.Forms.Label labelXAxis;\n\t\tprivate System.Windows.Forms.ComboBox comboXAxis;\n\t\tprivate System.Windows.Forms.GroupBox groupXAxis;\n\t\tprivate System.Windows.Forms.CheckBox checkXLog;\n\t\tprivate System.Windows.Forms.GroupBox groupYAxis;\n\t\tprivate System.Windows.Forms.Label labelYMax;\n\t\tprivate System.Windows.Forms.Label labelYMin;\n\t\tprivate System.Windows.Forms.CheckBox checkYAxisAuto;\n\t\tprivate System.Windows.Forms.TextBox textYMax;\n\t\tprivate System.Windows.Forms.TextBox textYMin;\n\t\tprivate System.Windows.Forms.CheckBox checkYLog;\n\t\tprivate System.Windows.Forms.Button buttonShowGraph;\n\t\tprivate System.Windows.Forms.Button buttonClose;\n\t\tprivate System.Windows.Forms.ComboBox comboChannel1;\n\t\tprivate System.Windows.Forms.CheckBox checkOneGraph;\n\t\tprivate System.Windows.Forms.ComboBox comboChannel2;\n\t\tprivate System.Windows.Forms.Button buttonSave;\n\n\t\t/// <summary>\n\t\t/// 必要なデザイナ変数です。\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.Container components = null;\n\n\t\tpublic WaveGraphForm(WaveData wave)\n\t\t{\n\t\t\tInitializeComponent();\n\n\t\t\tthis.wave = wave;\n\n\t\t\tthis.comboChannel1.SelectedIndex = 0;\n\t\t\tthis.comboChannel2.SelectedIndex = 1;\n\t\t\tthis.comboType.SelectedIndex = 0;\n\t\t\tthis.comboXAxis.SelectedIndex = 0;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 使用されているリソースに後処理を実行します。\n\t\t/// </summary>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif( disposing )\n\t\t\t{\n\t\t\t\tif(components != null)\n\t\t\t\t{\n\t\t\t\t\tcomponents.Dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Windows Form Designer generated code\n\t\t/// <summary>\n\t\t/// デザイナ サポートに必要なメソッドです。このメソッドの内容を\n\t\t/// コード エディタで変更しないでください。\n\t\t/// </summary>\n\t\tprivate void InitializeComponent()\n\t\t{\n\t\t\tthis.labelChannel = new System.Windows.Forms.Label();\n\t\t\tthis.labelType = new System.Windows.Forms.Label();\n\t\t\tthis.comboChannel1 = new System.Windows.Forms.ComboBox();\n\t\t\tthis.comboType = new System.Windows.Forms.ComboBox();\n\t\t\tthis.labelXAxis = new System.Windows.Forms.Label();\n\t\t\tthis.comboXAxis = new System.Windows.Forms.ComboBox();\n\t\t\tthis.groupXAxis = new System.Windows.Forms.GroupBox();\n\t\t\tthis.checkXLog = new System.Windows.Forms.CheckBox();\n\t\t\tthis.groupYAxis = new System.Windows.Forms.GroupBox();\n\t\t\tthis.textYMax = new System.Windows.Forms.TextBox();\n\t\t\tthis.checkYAxisAuto = new System.Windows.Forms.CheckBox();\n\t\t\tthis.labelYMax = new System.Windows.Forms.Label();\n\t\t\tthis.labelYMin = new System.Windows.Forms.Label();\n\t\t\tthis.textYMin = new System.Windows.Forms.TextBox();\n\t\t\tthis.checkYLog = new System.Windows.Forms.CheckBox();\n\t\t\tthis.buttonShowGraph = new System.Windows.Forms.Button();\n\t\t\tthis.buttonClose = new System.Windows.Forms.Button();\n\t\t\tthis.comboChannel2 = new System.Windows.Forms.ComboBox();\n\t\t\tthis.checkOneGraph = new System.Windows.Forms.CheckBox();\n\t\t\tthis.buttonSave = new System.Windows.Forms.Button();\n\t\t\tthis.groupXAxis.SuspendLayout();\n\t\t\tthis.groupYAxis.SuspendLayout();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// labelChannel\n\t\t\t// \n\t\t\tthis.labelChannel.Location = new System.Drawing.Point(8, 8);\n\t\t\tthis.labelChannel.Name = \"labelChannel\";\n\t\t\tthis.labelChannel.Size = new System.Drawing.Size(48, 16);\n\t\t\tthis.labelChannel.TabIndex = 2;\n\t\t\tthis.labelChannel.Text = \"チャネル\";\n\t\t\tthis.labelChannel.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// labelType\n\t\t\t// \n\t\t\tthis.labelType.Location = new System.Drawing.Point(8, 56);\n\t\t\tthis.labelType.Name = \"labelType\";\n\t\t\tthis.labelType.Size = new System.Drawing.Size(48, 16);\n\t\t\tthis.labelType.TabIndex = 3;\n\t\t\tthis.labelType.Text = \"特性\";\n\t\t\tthis.labelType.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// comboChannel1\n\t\t\t// \n\t\t\tthis.comboChannel1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.comboChannel1.Items.AddRange(new object[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"Left\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"Right\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"L/R\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"R/L\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"Middle\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"Side\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"M/S\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"S/M\"});\n\t\t\tthis.comboChannel1.Location = new System.Drawing.Point(56, 8);\n\t\t\tthis.comboChannel1.Name = \"comboChannel1\";\n\t\t\tthis.comboChannel1.Size = new System.Drawing.Size(80, 20);\n\t\t\tthis.comboChannel1.TabIndex = 4;\n\t\t\t// \n\t\t\t// comboType\n\t\t\t// \n\t\t\tthis.comboType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.comboType.Items.AddRange(new object[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"振幅特性\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"位相特性\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"位相遅延特性\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"群遅延特性\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"最小位相\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"オールパス位相\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"時系列\"});\n\t\t\tthis.comboType.Location = new System.Drawing.Point(56, 56);\n\t\t\tthis.comboType.Name = \"comboType\";\n\t\t\tthis.comboType.Size = new System.Drawing.Size(96, 20);\n\t\t\tthis.comboType.TabIndex = 5;\n\t\t\t// \n\t\t\t// labelXAxis\n\t\t\t// \n\t\t\tthis.labelXAxis.Location = new System.Drawing.Point(8, 16);\n\t\t\tthis.labelXAxis.Name = \"labelXAxis\";\n\t\t\tthis.labelXAxis.Size = new System.Drawing.Size(56, 16);\n\t\t\tthis.labelXAxis.TabIndex = 6;\n\t\t\tthis.labelXAxis.Text = \"表示項目\";\n\t\t\tthis.labelXAxis.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// comboXAxis\n\t\t\t// \n\t\t\tthis.comboXAxis.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.comboXAxis.Items.AddRange(new object[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"周波数\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"角周波数\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"正規化周波数\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"正規化角周波数\"});\n\t\t\tthis.comboXAxis.Location = new System.Drawing.Point(64, 16);\n\t\t\tthis.comboXAxis.Name = \"comboXAxis\";\n\t\t\tthis.comboXAxis.Size = new System.Drawing.Size(121, 20);\n\t\t\tthis.comboXAxis.TabIndex = 7;\n\t\t\t// \n\t\t\t// groupXAxis\n\t\t\t// \n\t\t\tthis.groupXAxis.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.checkXLog,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.comboXAxis,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.labelXAxis});\n\t\t\tthis.groupXAxis.Location = new System.Drawing.Point(8, 88);\n\t\t\tthis.groupXAxis.Name = \"groupXAxis\";\n\t\t\tthis.groupXAxis.Size = new System.Drawing.Size(192, 64);\n\t\t\tthis.groupXAxis.TabIndex = 8;\n\t\t\tthis.groupXAxis.TabStop = false;\n\t\t\tthis.groupXAxis.Text = \"X軸\";\n\t\t\t// \n\t\t\t// checkXLog\n\t\t\t// \n\t\t\tthis.checkXLog.Enabled = false;\n\t\t\tthis.checkXLog.Location = new System.Drawing.Point(64, 40);\n\t\t\tthis.checkXLog.Name = \"checkXLog\";\n\t\t\tthis.checkXLog.Size = new System.Drawing.Size(88, 16);\n\t\t\tthis.checkXLog.TabIndex = 8;\n\t\t\tthis.checkXLog.Text = \"対数\";\n\t\t\t// \n\t\t\t// groupYAxis\n\t\t\t// \n\t\t\tthis.groupYAxis.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.textYMax,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.checkYAxisAuto,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.labelYMax,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.labelYMin,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.textYMin,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.checkYLog});\n\t\t\tthis.groupYAxis.Location = new System.Drawing.Point(8, 152);\n\t\t\tthis.groupYAxis.Name = \"groupYAxis\";\n\t\t\tthis.groupYAxis.Size = new System.Drawing.Size(192, 112);\n\t\t\tthis.groupYAxis.TabIndex = 9;\n\t\t\tthis.groupYAxis.TabStop = false;\n\t\t\tthis.groupYAxis.Text = \"Y軸\";\n\t\t\t// \n\t\t\t// textYMax\n\t\t\t// \n\t\t\tthis.textYMax.Enabled = false;\n\t\t\tthis.textYMax.Location = new System.Drawing.Point(64, 40);\n\t\t\tthis.textYMax.Name = \"textYMax\";\n\t\t\tthis.textYMax.TabIndex = 2;\n\t\t\tthis.textYMax.Text = \"0\";\n\t\t\tthis.textYMax.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n\t\t\t// \n\t\t\t// checkYAxisAuto\n\t\t\t// \n\t\t\tthis.checkYAxisAuto.Checked = true;\n\t\t\tthis.checkYAxisAuto.CheckState = System.Windows.Forms.CheckState.Checked;\n\t\t\tthis.checkYAxisAuto.Location = new System.Drawing.Point(8, 16);\n\t\t\tthis.checkYAxisAuto.Name = \"checkYAxisAuto\";\n\t\t\tthis.checkYAxisAuto.Size = new System.Drawing.Size(168, 24);\n\t\t\tthis.checkYAxisAuto.TabIndex = 1;\n\t\t\tthis.checkYAxisAuto.Text = \"表示範囲を自動で設定する\";\n\t\t\tthis.checkYAxisAuto.CheckedChanged += new System.EventHandler(this.checkYAxisAuto_CheckedChanged);\n\t\t\t// \n\t\t\t// labelYMax\n\t\t\t// \n\t\t\tthis.labelYMax.Enabled = false;\n\t\t\tthis.labelYMax.Location = new System.Drawing.Point(16, 40);\n\t\t\tthis.labelYMax.Name = \"labelYMax\";\n\t\t\tthis.labelYMax.Size = new System.Drawing.Size(48, 16);\n\t\t\tthis.labelYMax.TabIndex = 0;\n\t\t\tthis.labelYMax.Text = \"最大値\";\n\t\t\tthis.labelYMax.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// labelYMin\n\t\t\t// \n\t\t\tthis.labelYMin.Enabled = false;\n\t\t\tthis.labelYMin.Location = new System.Drawing.Point(16, 64);\n\t\t\tthis.labelYMin.Name = \"labelYMin\";\n\t\t\tthis.labelYMin.Size = new System.Drawing.Size(48, 16);\n\t\t\tthis.labelYMin.TabIndex = 0;\n\t\t\tthis.labelYMin.Text = \"最小値\";\n\t\t\tthis.labelYMin.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// textYMin\n\t\t\t// \n\t\t\tthis.textYMin.Enabled = false;\n\t\t\tthis.textYMin.Location = new System.Drawing.Point(64, 64);\n\t\t\tthis.textYMin.Name = \"textYMin\";\n\t\t\tthis.textYMin.TabIndex = 2;\n\t\t\tthis.textYMin.Text = \"0\";\n\t\t\tthis.textYMin.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n\t\t\t// \n\t\t\t// checkYLog\n\t\t\t// \n\t\t\tthis.checkYLog.Enabled = false;\n\t\t\tthis.checkYLog.Location = new System.Drawing.Point(64, 88);\n\t\t\tthis.checkYLog.Name = \"checkYLog\";\n\t\t\tthis.checkYLog.Size = new System.Drawing.Size(88, 16);\n\t\t\tthis.checkYLog.TabIndex = 8;\n\t\t\tthis.checkYLog.Text = \"対数\";\n\t\t\t// \n\t\t\t// buttonShowGraph\n\t\t\t// \n\t\t\tthis.buttonShowGraph.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);\n\t\t\tthis.buttonShowGraph.Location = new System.Drawing.Point(208, 210);\n\t\t\tthis.buttonShowGraph.Name = \"buttonShowGraph\";\n\t\t\tthis.buttonShowGraph.TabIndex = 10;\n\t\t\tthis.buttonShowGraph.Text = \"グラフ表示\";\n\t\t\tthis.buttonShowGraph.Click += new System.EventHandler(this.buttonShowGraph_Click);\n\t\t\t// \n\t\t\t// buttonClose\n\t\t\t// \n\t\t\tthis.buttonClose.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);\n\t\t\tthis.buttonClose.Location = new System.Drawing.Point(208, 242);\n\t\t\tthis.buttonClose.Name = \"buttonClose\";\n\t\t\tthis.buttonClose.TabIndex = 11;\n\t\t\tthis.buttonClose.Text = \"閉じる\";\n\t\t\tthis.buttonClose.Click += new System.EventHandler(this.buttonClose_Click);\n\t\t\t// \n\t\t\t// comboChannel2\n\t\t\t// \n\t\t\tthis.comboChannel2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.comboChannel2.Items.AddRange(new object[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"Left\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"Right\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"L/R\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"R/L\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"Middle\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"Side\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"M/S\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"S/M\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"なし\"});\n\t\t\tthis.comboChannel2.Location = new System.Drawing.Point(144, 8);\n\t\t\tthis.comboChannel2.Name = \"comboChannel2\";\n\t\t\tthis.comboChannel2.Size = new System.Drawing.Size(80, 20);\n\t\t\tthis.comboChannel2.TabIndex = 4;\n\t\t\t// \n\t\t\t// checkOneGraph\n\t\t\t// \n\t\t\tthis.checkOneGraph.Location = new System.Drawing.Point(16, 32);\n\t\t\tthis.checkOneGraph.Name = \"checkOneGraph\";\n\t\t\tthis.checkOneGraph.Size = new System.Drawing.Size(112, 16);\n\t\t\tthis.checkOneGraph.TabIndex = 12;\n\t\t\tthis.checkOneGraph.Text = \"同一グラフに表示\";\n\t\t\t// \n\t\t\t// buttonSave\n\t\t\t// \n\t\t\tthis.buttonSave.Location = new System.Drawing.Point(208, 176);\n\t\t\tthis.buttonSave.Name = \"buttonSave\";\n\t\t\tthis.buttonSave.TabIndex = 13;\n\t\t\tthis.buttonSave.Text = \"保存\";\n\t\t\tthis.buttonSave.Click += new System.EventHandler(this.buttonSave_Click);\n\t\t\t// \n\t\t\t// WaveGraphForm\n\t\t\t// \n\t\t\tthis.AutoScaleBaseSize = new System.Drawing.Size(5, 12);\n\t\t\tthis.ClientSize = new System.Drawing.Size(288, 271);\n\t\t\tthis.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.buttonSave,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.checkOneGraph,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.buttonClose,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.buttonShowGraph,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.groupYAxis,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.groupXAxis,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.comboType,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.comboChannel1,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.labelType,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.labelChannel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.comboChannel2});\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n\t\t\tthis.MaximizeBox = false;\n\t\t\tthis.Name = \"WaveGraphForm\";\n\t\t\tthis.Text = \"WaveGraphForm\";\n\t\t\tthis.groupXAxis.ResumeLayout(false);\n\t\t\tthis.groupYAxis.ResumeLayout(false);\n\t\t\tthis.ResumeLayout(false);\n\n\t\t}\n\t\t#endregion\n\n\t\tprivate void buttonClose_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.Close();\n\t\t}\n\n\t\tprivate double[] GetLabel(out double labelMax)\n\t\t{\n\t\t\tif(this.comboType.SelectedIndex >= 6)\n\t\t\t{\n\t\t\t\tint len = this.wave.Left.TimeLength;\n\t\t\t\tdouble[] tmp = new double[len];\n\t\t\t\tfor(int i=0; i<len ;++i) tmp[i] = i;\n\t\t\t\tlabelMax = len;\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tint len = this.wave.Left.Count - 1;\n\t\t\t\tdouble[] tmp = new double[len];\n\t\t\t\tdouble df;\n\n\t\t\t\tswitch(this.comboXAxis.SelectedIndex)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\tdf = 0.5 * this.wave.Header.sampleRate / len;\n\t\t\t\t\t\tlabelMax = 0.5 * this.wave.Header.sampleRate;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tdf = Math.PI * this.wave.Header.sampleRate / len;\n\t\t\t\t\t\tlabelMax = Math.PI * this.wave.Header.sampleRate;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tdf = 0.5 / len;\n\t\t\t\t\t\tlabelMax = 0.5;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\tdf = Math.PI / len;\n\t\t\t\t\t\tlabelMax = 4;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tdf = 0;\n\t\t\t\t\t\tlabelMax = 0;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tfor(int i=0; i<len; ++i)\n\t\t\t\t\ttmp[i] = df * i;\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t}\n\n\t\tprivate void ShowSingleGraph(params double[][] data)\n\t\t{\n\t\t\tGraphForm form = new GraphForm();\n\n\t\t\tdouble labelMax;\n\t\t\tdouble[] label = GetLabel(out labelMax);\n\n\t\t\tfor(int i=0; i<data.Length; ++i)\n\t\t\t{\n\t\t\t\tint k = i % pens.Length;\n\t\t\t\tform.Graph.AddEntry(label, data[i], pens[k]);\n\t\t\t}\n\n\t\t\tform.Graph.SetXAxis(0, labelMax, 4, font, brush);\n\t\t\tif(this.checkYAxisAuto.Checked)\n\t\t\t{\n\t\t\t\tform.Graph.SetYAxis(0, 0, 5, font, brush);\n\t\t\t\tform.Graph.AutoScaleY();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdouble min = double.Parse(this.textYMin.Text);\n\t\t\t\tdouble max = double.Parse(this.textYMax.Text);\n\t\t\t\tform.Graph.SetYAxis(min, max, 5, font, brush);\n\t\t\t}\n\n\t\t\tform.Text = this.Text;\n\t\t\tform.MdiParent = this.MdiParent;\n\t\t\tform.Show();\n\t\t}\n\n\t\tprivate void ShowTwinGraph(double[] data1, double[] data2)\n\t\t{\n\t\t\tGraphForm2 form = new GraphForm2();\n\n\t\t\tdouble labelMax;\n\t\t\tdouble[] label = GetLabel(out labelMax);\n\n\t\t\tform.GraphL.AddEntry(label, data1, pens[0]);\n\t\t\tform.GraphR.AddEntry(label, data2, pens[1]);\n\n\t\t\tform.GraphL.SetXAxis(0, labelMax, 4, font, brush);\n\t\t\tform.GraphR.SetXAxis(0, labelMax, 4, font, brush);\n\t\t\tif(this.checkYAxisAuto.Checked)\n\t\t\t{\n\t\t\t\tform.GraphL.SetYAxis(0, 0, 5, font, brush);\n\t\t\t\tform.GraphL.AutoScaleY();\n\t\t\t\tform.GraphR.SetYAxis(0, 0, 5, font, brush);\n\t\t\t\tform.GraphR.AutoScaleY();\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdouble min = double.Parse(this.textYMin.Text);\n\t\t\t\tdouble max = double.Parse(this.textYMax.Text);\n\t\t\t\tform.GraphL.SetYAxis(min, max, 5, font, brush);\n\t\t\t\tform.GraphR.SetYAxis(min, max, 5, font, brush);\n\t\t\t}\n\n\t\t\tform.Text = this.Text;\n\t\t\tform.MdiParent = this.MdiParent;\n\t\t\tform.Show();\n\t\t}\n\n\t\tprivate void buttonShowGraph_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tdouble[] data1 = this.wave.GetData((Channel)this.comboChannel1.SelectedIndex, (Property)this.comboType.SelectedIndex);\n\t\t\tdouble[] data2 = this.wave.GetData((Channel)this.comboChannel2.SelectedIndex, (Property)this.comboType.SelectedIndex);\n\n\t\t\tif(data2 == null)\n\t\t\t\tthis.ShowSingleGraph(data1);\n\t\t\telse if(this.checkOneGraph.Checked)\n\t\t\t\tthis.ShowSingleGraph(data1, data2);\n\t\t\telse\n\t\t\t\tthis.ShowTwinGraph(data1, data2);\n\t\t}\n\n\t\tprivate void checkYAxisAuto_CheckedChanged(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.labelYMin.Enabled = !this.checkYAxisAuto.Checked;\n\t\t\tthis.labelYMax.Enabled = !this.checkYAxisAuto.Checked;\n\t\t\tthis.textYMin.Enabled = !this.checkYAxisAuto.Checked;\n\t\t\tthis.textYMax.Enabled = !this.checkYAxisAuto.Checked;\n\t\t}\n\n\t\tprivate void buttonSave_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tWaveSaveForm form = new WaveSaveForm(this.wave, new FileInfo(this.Text));\n\t\t\tform.Text = this.Text;\n\t\t\tform.MdiParent = this.MdiParent;\n\t\t\tform.Show();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/spctrum/AppMain/WaveGraphForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n            Microsoft ResX Schema \n        \n            Version 1.3\n                \n            The primary goals of this format is to allow a simple XML format \n            that is mostly human readable. The generation and parsing of the \n            various data types are done through the TypeConverter classes \n            associated with the data types.\n        \n            Example:\n        \n                ... ado.net/XML headers & schema ...\n                <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n                <resheader name=\"version\">1.3</resheader>\n                <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n                <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n                <data name=\"Name1\">this is my long string</data>\n                <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n                <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n                    [base64 mime encoded serialized .NET Framework object]\n                </data>\n                <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n                    [base64 mime encoded string representing a byte array form of the .NET Framework object]\n                </data>\n        \n            There are any number of \"resheader\" rows that contain simple \n            name/value pairs.\n            \n            Each data row contains a name, and value. The row also contains a \n            type or mimetype. Type corresponds to a .NET class that support \n            text/value conversion through the TypeConverter architecture. \n            Classes that don't support this are serialized and stored with the \n            mimetype set.\n                     \n            The mimetype is used for serialized objects, and tells the \n            ResXResourceReader how to depersist the object. This is currently not \n            extensible. For a given mimetype the value must be set accordingly:\n        \n            Note - application/x-microsoft.net.object.binary.base64 is the format \n                   that the ResXResourceWriter will generate, however the reader can \n                   read any of the formats listed below.\n        \n            mimetype: application/x-microsoft.net.object.binary.base64\n            value   : The object must be serialized with \n                    : System.Serialization.Formatters.Binary.BinaryFormatter\n                    : and then encoded with base64 encoding.\n        \n            mimetype: application/x-microsoft.net.object.soap.base64\n            value   : The object must be serialized with \n                    : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n                    : and then encoded with base64 encoding.\n            mimetype: application/x-microsoft.net.object.bytearray.base64\n            value   : The object must be serialized into a byte array \n                    : using a System.ComponentModel.TypeConverter\n                    : and then encoded with base64 encoding.\n        -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>1.3</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"$this.Name\">\n    <value>WaveGraphForm</value>\n  </data>\n</root>"
  },
  {
    "path": "Chapters/Old/spctrum/AppMain/WaveLoadForm.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Windows.Forms;\n\nusing WaveAnalysis;\n\nnamespace AppMain\n{\n\t/// <summary>\n\t/// WaveLoadForm の設定項目\n\t/// </summary>\n\tpublic class WaveLoadFormSettings\n\t{\n\t\tpublic string skipLength;\n\t\tpublic string readLength;\n\t\tpublic bool removeSilent;\n\t\tpublic string threshold;\n\t\tpublic bool relative;\n\n\t\tpublic bool useReference;\n\t\tpublic bool isNormalized;\n\t\tpublic int type;\n\n\t\tpublic string skipLengthRef;\n\t\tpublic bool removeSilentRef;\n\t\tpublic string thresholdRef;\n\t\tpublic bool relativeRef;\n\t}\n\n\t/// <summary>\n\t/// Wave ファイル読込み用のダイアログ。\n\t/// </summary>\n\tpublic class WaveLoadForm : System.Windows.Forms.Form\n\t{\n\t\t#region 手動更新領域\n\t\t/// <summary>\n\t\t/// Wave データ作成。\n\t\t/// </summary>\n\t\t/// <returns>作成した Wave</returns>\n\t\tpublic WaveData CreateWave()\n\t\t{\n\t\t\tWaveAnalyzer analyzer = new WaveAnalyzer();\n\n\t\t\t// データ読込み\n\t\t{\n\t\t\tint skip = int.Parse(this.textSkipLength.Text);\n\t\t\tint length = int.Parse(this.textReadLength.Text);\n\t\t\tif(this.checkRemoveSilent.Checked)\n\t\t\t{\n\t\t\t\tdouble threshold = double.Parse(this.textThreshold.Text);\n\t\t\t\tbool relative = this.checkRelativeThreshold.Checked;\n\n\t\t\t\tanalyzer.ReadData(this.textDataName.Text, skip, length, threshold, relative);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tanalyzer.ReadData(this.textDataName.Text, skip, length);\n\t\t\t}\n\t\t}\n\n\t\t\t// リファレンス逆畳み込み\n\t\t\tif(this.checkUseReference.Checked)\n\t\t\t{\n\t\t\t\tint skip = int.Parse(this.textSkipLengthRef.Text);\n\t\t\t\tint length = int.Parse(this.textReadLength.Text);\n\t\t\t\tReferenceType type = (ReferenceType)this.comboReferenceType.SelectedIndex;\n\t\t\t\tbool isNormalized = this.checkNormalize.Checked;\n\n\t\t\t\tif(this.checkRemoveSilent.Checked)\n\t\t\t\t{\n\t\t\t\t\tdouble threshold = double.Parse(this.textThresholdRef.Text);\n\t\t\t\t\tbool relative = this.checkRelativeThresholdRef.Checked;\n\n\t\t\t\t\tanalyzer.DeconvoluteReference(this.textReferenceName.Text, skip, length, type, isNormalized, threshold, relative);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tanalyzer.DeconvoluteReference(this.textReferenceName.Text, skip, length, type, isNormalized);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn analyzer.Data;\n\t\t}//CreateWave\n\n\t\t/// <summary>\n\t\t/// データのファイル名\n\t\t/// </summary>\n\t\tpublic string DataFileName\n\t\t{\n\t\t\tget{return this.textDataName.Text;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 設定の取得・更新\n\t\t/// </summary>\n\t\tpublic WaveLoadFormSettings Setting\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.textSkipLength.Text            = value.skipLength;\n\t\t\t\tthis.textReadLength.Text            = value.readLength;\n\t\t\t\tthis.checkRemoveSilent.Checked      = value.removeSilent;\n\t\t\t\tthis.textThreshold.Text             = value.threshold;\n\t\t\t\tthis.checkRelativeThreshold.Checked = value.relative;\n\n\t\t\t\tthis.checkUseReference.Checked = value.useReference;\n\t\t\t\tthis.checkNormalize.Checked    = value.isNormalized;\n\t\t\t\tthis.comboReferenceType.SelectedIndex = value.type;\n\n\t\t\t\tthis.textSkipLengthRef.Text            = value.skipLengthRef;\n\t\t\t\tthis.checkRemoveSilentRef.Checked      = value.removeSilentRef;\n\t\t\t\tthis.textThresholdRef.Text             = value.thresholdRef;\n\t\t\t\tthis.checkRelativeThresholdRef.Checked = value.relativeRef;\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\tWaveLoadFormSettings setting = new WaveLoadFormSettings();\n\n\t\t\t\tsetting.skipLength   = this.textSkipLength.Text;\n\t\t\t\tsetting.readLength   = this.textReadLength.Text;\n\t\t\t\tsetting.removeSilent = this.checkRemoveSilent.Checked;\n\t\t\t\tsetting.threshold    = this.textThreshold.Text;\n\t\t\t\tsetting.relative     = this.checkRelativeThreshold.Checked;\n\n\t\t\t\tsetting.useReference = this.checkUseReference.Checked;\n\t\t\t\tsetting.isNormalized = this.checkNormalize.Checked;\n\t\t\t\tsetting.type         = this.comboReferenceType.SelectedIndex;\n\n\t\t\t\tsetting.skipLengthRef   = this.textSkipLengthRef.Text;\n\t\t\t\tsetting.removeSilentRef = this.checkRemoveSilentRef.Checked;\n\t\t\t\tsetting.thresholdRef    = this.textThresholdRef.Text;\n\t\t\t\tsetting.relativeRef     = this.checkRelativeThresholdRef.Checked;\n\n\t\t\t\treturn setting;\n\t\t\t}\n\t\t}//Setting\n\t\t#endregion\n\n\t\tprivate System.Windows.Forms.TextBox textDataName;\n\t\tprivate System.Windows.Forms.TextBox textReferenceName;\n\t\tprivate System.Windows.Forms.Button buttonData;\n\t\tprivate System.Windows.Forms.Button buttonReference;\n\t\tprivate System.Windows.Forms.CheckBox checkRemoveSilent;\n\t\tprivate System.Windows.Forms.TextBox textThreshold;\n\t\tprivate System.Windows.Forms.Label labelThreshold;\n\t\tprivate System.Windows.Forms.CheckBox checkRelativeThreshold;\n\t\tprivate System.Windows.Forms.GroupBox groupRemoveSilent;\n\t\tprivate System.Windows.Forms.Label labelDataName;\n\t\tprivate System.Windows.Forms.GroupBox groupData;\n\t\tprivate System.Windows.Forms.GroupBox groupReference;\n\t\tprivate System.Windows.Forms.CheckBox checkUseReference;\n\t\tprivate System.Windows.Forms.Label labelReferenceName;\n\t\tprivate System.Windows.Forms.CheckBox checkNormalize;\n\t\tprivate System.Windows.Forms.GroupBox groupRange;\n\t\tprivate System.Windows.Forms.Label labelSkipLength;\n\t\tprivate System.Windows.Forms.Label labelReadLength;\n\t\tprivate System.Windows.Forms.TextBox textSkipLength;\n\t\tprivate System.Windows.Forms.TextBox textReadLength;\n\t\tprivate System.Windows.Forms.GroupBox groupRemoveSilentRef;\n\t\tprivate System.Windows.Forms.TextBox textThresholdRef;\n\t\tprivate System.Windows.Forms.Label labelThresholdRef;\n\t\tprivate System.Windows.Forms.CheckBox checkRelativeThresholdRef;\n\t\tprivate System.Windows.Forms.CheckBox checkRemoveSilentRef;\n\t\tprivate System.Windows.Forms.GroupBox groupRangeRef;\n\t\tprivate System.Windows.Forms.TextBox textSkipLengthRef;\n\t\tprivate System.Windows.Forms.Label labelSkipLengthRef;\n\t\tprivate System.Windows.Forms.Button buttonOk;\n\t\tprivate System.Windows.Forms.Button buttonCancel;\n\t\tprivate System.Windows.Forms.Label labelReferenceType;\n\t\tprivate System.Windows.Forms.ComboBox comboReferenceType;\n\t\t/// <summary>\n\t\t/// 必要なデザイナ変数です。\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.Container components = null;\n\n\t\tpublic WaveLoadForm()\n\t\t{\n\t\t\tInitializeComponent();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 使用されているリソースに後処理を実行します。\n\t\t/// </summary>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif( disposing )\n\t\t\t{\n\t\t\t\tif(components != null)\n\t\t\t\t{\n\t\t\t\t\tcomponents.Dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Windows Form Designer generated code\n\t\t/// <summary>\n\t\t/// デザイナ サポートに必要なメソッドです。このメソッドの内容を\n\t\t/// コード エディタで変更しないでください。\n\t\t/// </summary>\n\t\tprivate void InitializeComponent()\n\t\t{\n\t\t\tthis.textDataName = new System.Windows.Forms.TextBox();\n\t\t\tthis.textReferenceName = new System.Windows.Forms.TextBox();\n\t\t\tthis.buttonData = new System.Windows.Forms.Button();\n\t\t\tthis.buttonReference = new System.Windows.Forms.Button();\n\t\t\tthis.checkRemoveSilent = new System.Windows.Forms.CheckBox();\n\t\t\tthis.textThreshold = new System.Windows.Forms.TextBox();\n\t\t\tthis.labelThreshold = new System.Windows.Forms.Label();\n\t\t\tthis.checkRelativeThreshold = new System.Windows.Forms.CheckBox();\n\t\t\tthis.groupRemoveSilent = new System.Windows.Forms.GroupBox();\n\t\t\tthis.labelDataName = new System.Windows.Forms.Label();\n\t\t\tthis.groupData = new System.Windows.Forms.GroupBox();\n\t\t\tthis.groupRange = new System.Windows.Forms.GroupBox();\n\t\t\tthis.textSkipLength = new System.Windows.Forms.TextBox();\n\t\t\tthis.labelReadLength = new System.Windows.Forms.Label();\n\t\t\tthis.labelSkipLength = new System.Windows.Forms.Label();\n\t\t\tthis.textReadLength = new System.Windows.Forms.TextBox();\n\t\t\tthis.checkUseReference = new System.Windows.Forms.CheckBox();\n\t\t\tthis.groupReference = new System.Windows.Forms.GroupBox();\n\t\t\tthis.comboReferenceType = new System.Windows.Forms.ComboBox();\n\t\t\tthis.labelReferenceType = new System.Windows.Forms.Label();\n\t\t\tthis.checkNormalize = new System.Windows.Forms.CheckBox();\n\t\t\tthis.labelReferenceName = new System.Windows.Forms.Label();\n\t\t\tthis.groupRemoveSilentRef = new System.Windows.Forms.GroupBox();\n\t\t\tthis.textThresholdRef = new System.Windows.Forms.TextBox();\n\t\t\tthis.labelThresholdRef = new System.Windows.Forms.Label();\n\t\t\tthis.checkRelativeThresholdRef = new System.Windows.Forms.CheckBox();\n\t\t\tthis.checkRemoveSilentRef = new System.Windows.Forms.CheckBox();\n\t\t\tthis.groupRangeRef = new System.Windows.Forms.GroupBox();\n\t\t\tthis.textSkipLengthRef = new System.Windows.Forms.TextBox();\n\t\t\tthis.labelSkipLengthRef = new System.Windows.Forms.Label();\n\t\t\tthis.buttonOk = new System.Windows.Forms.Button();\n\t\t\tthis.buttonCancel = new System.Windows.Forms.Button();\n\t\t\tthis.groupRemoveSilent.SuspendLayout();\n\t\t\tthis.groupData.SuspendLayout();\n\t\t\tthis.groupRange.SuspendLayout();\n\t\t\tthis.groupReference.SuspendLayout();\n\t\t\tthis.groupRemoveSilentRef.SuspendLayout();\n\t\t\tthis.groupRangeRef.SuspendLayout();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// textDataName\n\t\t\t// \n\t\t\tthis.textDataName.Location = new System.Drawing.Point(64, 16);\n\t\t\tthis.textDataName.Name = \"textDataName\";\n\t\t\tthis.textDataName.Size = new System.Drawing.Size(192, 19);\n\t\t\tthis.textDataName.TabIndex = 0;\n\t\t\tthis.textDataName.Text = \"\";\n\t\t\t// \n\t\t\t// textReferenceName\n\t\t\t// \n\t\t\tthis.textReferenceName.Location = new System.Drawing.Point(64, 64);\n\t\t\tthis.textReferenceName.Name = \"textReferenceName\";\n\t\t\tthis.textReferenceName.Size = new System.Drawing.Size(192, 19);\n\t\t\tthis.textReferenceName.TabIndex = 12;\n\t\t\tthis.textReferenceName.Text = \"\";\n\t\t\t// \n\t\t\t// buttonData\n\t\t\t// \n\t\t\tthis.buttonData.Location = new System.Drawing.Point(264, 16);\n\t\t\tthis.buttonData.Name = \"buttonData\";\n\t\t\tthis.buttonData.Size = new System.Drawing.Size(40, 23);\n\t\t\tthis.buttonData.TabIndex = 1;\n\t\t\tthis.buttonData.Text = \"参照\";\n\t\t\tthis.buttonData.Click += new System.EventHandler(this.buttonData_Click);\n\t\t\t// \n\t\t\t// buttonReference\n\t\t\t// \n\t\t\tthis.buttonReference.Location = new System.Drawing.Point(264, 64);\n\t\t\tthis.buttonReference.Name = \"buttonReference\";\n\t\t\tthis.buttonReference.Size = new System.Drawing.Size(40, 23);\n\t\t\tthis.buttonReference.TabIndex = 13;\n\t\t\tthis.buttonReference.Text = \"参照\";\n\t\t\tthis.buttonReference.Click += new System.EventHandler(this.buttonReference_Click);\n\t\t\t// \n\t\t\t// checkRemoveSilent\n\t\t\t// \n\t\t\tthis.checkRemoveSilent.Location = new System.Drawing.Point(8, 16);\n\t\t\tthis.checkRemoveSilent.Name = \"checkRemoveSilent\";\n\t\t\tthis.checkRemoveSilent.Size = new System.Drawing.Size(128, 24);\n\t\t\tthis.checkRemoveSilent.TabIndex = 4;\n\t\t\tthis.checkRemoveSilent.Text = \"無音区間を除去する\";\n\t\t\tthis.checkRemoveSilent.CheckedChanged += new System.EventHandler(this.checkRemoveSilent_CheckedChanged);\n\t\t\t// \n\t\t\t// textThreshold\n\t\t\t// \n\t\t\tthis.textThreshold.Enabled = false;\n\t\t\tthis.textThreshold.Location = new System.Drawing.Point(144, 40);\n\t\t\tthis.textThreshold.Name = \"textThreshold\";\n\t\t\tthis.textThreshold.Size = new System.Drawing.Size(56, 19);\n\t\t\tthis.textThreshold.TabIndex = 6;\n\t\t\tthis.textThreshold.Text = \"0\";\n\t\t\tthis.textThreshold.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n\t\t\t// \n\t\t\t// labelThreshold\n\t\t\t// \n\t\t\tthis.labelThreshold.Location = new System.Drawing.Point(144, 24);\n\t\t\tthis.labelThreshold.Name = \"labelThreshold\";\n\t\t\tthis.labelThreshold.Size = new System.Drawing.Size(32, 16);\n\t\t\tthis.labelThreshold.TabIndex = 1;\n\t\t\tthis.labelThreshold.Text = \"閾値\";\n\t\t\tthis.labelThreshold.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// checkRelativeThreshold\n\t\t\t// \n\t\t\tthis.checkRelativeThreshold.Enabled = false;\n\t\t\tthis.checkRelativeThreshold.Location = new System.Drawing.Point(8, 40);\n\t\t\tthis.checkRelativeThreshold.Name = \"checkRelativeThreshold\";\n\t\t\tthis.checkRelativeThreshold.Size = new System.Drawing.Size(128, 24);\n\t\t\tthis.checkRelativeThreshold.TabIndex = 5;\n\t\t\tthis.checkRelativeThreshold.Text = \"閾値に相対値を使う\";\n\t\t\t// \n\t\t\t// groupRemoveSilent\n\t\t\t// \n\t\t\tthis.groupRemoveSilent.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.textThreshold,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.labelThreshold,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.checkRelativeThreshold,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.checkRemoveSilent});\n\t\t\tthis.groupRemoveSilent.Location = new System.Drawing.Point(176, 56);\n\t\t\tthis.groupRemoveSilent.Name = \"groupRemoveSilent\";\n\t\t\tthis.groupRemoveSilent.Size = new System.Drawing.Size(208, 72);\n\t\t\tthis.groupRemoveSilent.TabIndex = 5;\n\t\t\tthis.groupRemoveSilent.TabStop = false;\n\t\t\tthis.groupRemoveSilent.Text = \"無音区間の除去\";\n\t\t\t// \n\t\t\t// labelDataName\n\t\t\t// \n\t\t\tthis.labelDataName.Location = new System.Drawing.Point(8, 16);\n\t\t\tthis.labelDataName.Name = \"labelDataName\";\n\t\t\tthis.labelDataName.Size = new System.Drawing.Size(56, 16);\n\t\t\tthis.labelDataName.TabIndex = 18;\n\t\t\tthis.labelDataName.Text = \"ファイル名\";\n\t\t\tthis.labelDataName.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// groupData\n\t\t\t// \n\t\t\tthis.groupData.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.labelDataName,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.textDataName,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.buttonData,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.groupRange,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.groupRemoveSilent,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.checkUseReference});\n\t\t\tthis.groupData.Location = new System.Drawing.Point(8, 8);\n\t\t\tthis.groupData.Name = \"groupData\";\n\t\t\tthis.groupData.Size = new System.Drawing.Size(392, 160);\n\t\t\tthis.groupData.TabIndex = 7;\n\t\t\tthis.groupData.TabStop = false;\n\t\t\tthis.groupData.Text = \"データファイル\";\n\t\t\t// \n\t\t\t// groupRange\n\t\t\t// \n\t\t\tthis.groupRange.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.textSkipLength,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.labelReadLength,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.labelSkipLength,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.textReadLength});\n\t\t\tthis.groupRange.Location = new System.Drawing.Point(8, 56);\n\t\t\tthis.groupRange.Name = \"groupRange\";\n\t\t\tthis.groupRange.Size = new System.Drawing.Size(160, 72);\n\t\t\tthis.groupRange.TabIndex = 9;\n\t\t\tthis.groupRange.TabStop = false;\n\t\t\tthis.groupRange.Text = \"読込み区間\";\n\t\t\t// \n\t\t\t// textSkipLength\n\t\t\t// \n\t\t\tthis.textSkipLength.Location = new System.Drawing.Point(72, 16);\n\t\t\tthis.textSkipLength.Name = \"textSkipLength\";\n\t\t\tthis.textSkipLength.Size = new System.Drawing.Size(80, 19);\n\t\t\tthis.textSkipLength.TabIndex = 2;\n\t\t\tthis.textSkipLength.Text = \"0\";\n\t\t\tthis.textSkipLength.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n\t\t\t// \n\t\t\t// labelReadLength\n\t\t\t// \n\t\t\tthis.labelReadLength.Location = new System.Drawing.Point(8, 40);\n\t\t\tthis.labelReadLength.Name = \"labelReadLength\";\n\t\t\tthis.labelReadLength.Size = new System.Drawing.Size(64, 16);\n\t\t\tthis.labelReadLength.TabIndex = 1;\n\t\t\tthis.labelReadLength.Text = \"読込み長\";\n\t\t\tthis.labelReadLength.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// labelSkipLength\n\t\t\t// \n\t\t\tthis.labelSkipLength.Location = new System.Drawing.Point(8, 16);\n\t\t\tthis.labelSkipLength.Name = \"labelSkipLength\";\n\t\t\tthis.labelSkipLength.Size = new System.Drawing.Size(64, 16);\n\t\t\tthis.labelSkipLength.TabIndex = 0;\n\t\t\tthis.labelSkipLength.Text = \"読飛ばし長\";\n\t\t\tthis.labelSkipLength.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// textReadLength\n\t\t\t// \n\t\t\tthis.textReadLength.Location = new System.Drawing.Point(72, 40);\n\t\t\tthis.textReadLength.Name = \"textReadLength\";\n\t\t\tthis.textReadLength.Size = new System.Drawing.Size(80, 19);\n\t\t\tthis.textReadLength.TabIndex = 3;\n\t\t\tthis.textReadLength.Text = \"1024\";\n\t\t\tthis.textReadLength.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n\t\t\t// \n\t\t\t// checkUseReference\n\t\t\t// \n\t\t\tthis.checkUseReference.Location = new System.Drawing.Point(8, 128);\n\t\t\tthis.checkUseReference.Name = \"checkUseReference\";\n\t\t\tthis.checkUseReference.Size = new System.Drawing.Size(160, 24);\n\t\t\tthis.checkUseReference.TabIndex = 7;\n\t\t\tthis.checkUseReference.Text = \"リファレンスデータを使用する\";\n\t\t\tthis.checkUseReference.CheckedChanged += new System.EventHandler(this.checkUseReference_CheckedChanged);\n\t\t\t// \n\t\t\t// groupReference\n\t\t\t// \n\t\t\tthis.groupReference.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.comboReferenceType,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.labelReferenceType,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.checkNormalize,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.labelReferenceName,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.buttonReference,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.textReferenceName,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.groupRemoveSilentRef,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.groupRangeRef});\n\t\t\tthis.groupReference.Enabled = false;\n\t\t\tthis.groupReference.Location = new System.Drawing.Point(8, 168);\n\t\t\tthis.groupReference.Name = \"groupReference\";\n\t\t\tthis.groupReference.Size = new System.Drawing.Size(392, 176);\n\t\t\tthis.groupReference.TabIndex = 8;\n\t\t\tthis.groupReference.TabStop = false;\n\t\t\tthis.groupReference.Text = \"リファレンスデータ\";\n\t\t\t// \n\t\t\t// comboReferenceType\n\t\t\t// \n\t\t\tthis.comboReferenceType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.comboReferenceType.Items.AddRange(new object[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"両側チャネル\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"左チャネル\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"右チャネル\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"逆側チャネル\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"クロストーク\"});\n\t\t\tthis.comboReferenceType.Location = new System.Drawing.Point(96, 40);\n\t\t\tthis.comboReferenceType.Name = \"comboReferenceType\";\n\t\t\tthis.comboReferenceType.Size = new System.Drawing.Size(121, 20);\n\t\t\tthis.comboReferenceType.TabIndex = 15;\n\t\t\t// \n\t\t\t// labelReferenceType\n\t\t\t// \n\t\t\tthis.labelReferenceType.Location = new System.Drawing.Point(16, 40);\n\t\t\tthis.labelReferenceType.Name = \"labelReferenceType\";\n\t\t\tthis.labelReferenceType.Size = new System.Drawing.Size(88, 16);\n\t\t\tthis.labelReferenceType.TabIndex = 14;\n\t\t\tthis.labelReferenceType.Text = \"リファレンスタイプ\";\n\t\t\tthis.labelReferenceType.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// checkNormalize\n\t\t\t// \n\t\t\tthis.checkNormalize.Location = new System.Drawing.Point(8, 16);\n\t\t\tthis.checkNormalize.Name = \"checkNormalize\";\n\t\t\tthis.checkNormalize.Size = new System.Drawing.Size(176, 24);\n\t\t\tthis.checkNormalize.TabIndex = 8;\n\t\t\tthis.checkNormalize.Text = \"リファレンスデータを正規化する\";\n\t\t\t// \n\t\t\t// labelReferenceName\n\t\t\t// \n\t\t\tthis.labelReferenceName.Location = new System.Drawing.Point(8, 64);\n\t\t\tthis.labelReferenceName.Name = \"labelReferenceName\";\n\t\t\tthis.labelReferenceName.Size = new System.Drawing.Size(56, 16);\n\t\t\tthis.labelReferenceName.TabIndex = 7;\n\t\t\tthis.labelReferenceName.Text = \"ファイル名\";\n\t\t\tthis.labelReferenceName.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// groupRemoveSilentRef\n\t\t\t// \n\t\t\tthis.groupRemoveSilentRef.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.textThresholdRef,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.labelThresholdRef,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.checkRelativeThresholdRef,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t this.checkRemoveSilentRef});\n\t\t\tthis.groupRemoveSilentRef.Location = new System.Drawing.Point(176, 96);\n\t\t\tthis.groupRemoveSilentRef.Name = \"groupRemoveSilentRef\";\n\t\t\tthis.groupRemoveSilentRef.Size = new System.Drawing.Size(208, 72);\n\t\t\tthis.groupRemoveSilentRef.TabIndex = 10;\n\t\t\tthis.groupRemoveSilentRef.TabStop = false;\n\t\t\tthis.groupRemoveSilentRef.Text = \"無音区間の除去\";\n\t\t\t// \n\t\t\t// textThresholdRef\n\t\t\t// \n\t\t\tthis.textThresholdRef.Enabled = false;\n\t\t\tthis.textThresholdRef.Location = new System.Drawing.Point(144, 40);\n\t\t\tthis.textThresholdRef.Name = \"textThresholdRef\";\n\t\t\tthis.textThresholdRef.Size = new System.Drawing.Size(56, 19);\n\t\t\tthis.textThresholdRef.TabIndex = 17;\n\t\t\tthis.textThresholdRef.Text = \"0\";\n\t\t\tthis.textThresholdRef.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n\t\t\t// \n\t\t\t// labelThresholdRef\n\t\t\t// \n\t\t\tthis.labelThresholdRef.Location = new System.Drawing.Point(144, 24);\n\t\t\tthis.labelThresholdRef.Name = \"labelThresholdRef\";\n\t\t\tthis.labelThresholdRef.Size = new System.Drawing.Size(32, 16);\n\t\t\tthis.labelThresholdRef.TabIndex = 1;\n\t\t\tthis.labelThresholdRef.Text = \"閾値\";\n\t\t\tthis.labelThresholdRef.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// checkRelativeThresholdRef\n\t\t\t// \n\t\t\tthis.checkRelativeThresholdRef.Enabled = false;\n\t\t\tthis.checkRelativeThresholdRef.Location = new System.Drawing.Point(8, 40);\n\t\t\tthis.checkRelativeThresholdRef.Name = \"checkRelativeThresholdRef\";\n\t\t\tthis.checkRelativeThresholdRef.Size = new System.Drawing.Size(128, 24);\n\t\t\tthis.checkRelativeThresholdRef.TabIndex = 16;\n\t\t\tthis.checkRelativeThresholdRef.Text = \"閾値に相対値を使う\";\n\t\t\t// \n\t\t\t// checkRemoveSilentRef\n\t\t\t// \n\t\t\tthis.checkRemoveSilentRef.Location = new System.Drawing.Point(8, 16);\n\t\t\tthis.checkRemoveSilentRef.Name = \"checkRemoveSilentRef\";\n\t\t\tthis.checkRemoveSilentRef.Size = new System.Drawing.Size(128, 24);\n\t\t\tthis.checkRemoveSilentRef.TabIndex = 15;\n\t\t\tthis.checkRemoveSilentRef.Text = \"無音区間を除去する\";\n\t\t\tthis.checkRemoveSilentRef.CheckedChanged += new System.EventHandler(this.checkRemoveSilentRef_CheckedChanged);\n\t\t\t// \n\t\t\t// groupRangeRef\n\t\t\t// \n\t\t\tthis.groupRangeRef.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.textSkipLengthRef,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.labelSkipLengthRef});\n\t\t\tthis.groupRangeRef.Location = new System.Drawing.Point(8, 96);\n\t\t\tthis.groupRangeRef.Name = \"groupRangeRef\";\n\t\t\tthis.groupRangeRef.Size = new System.Drawing.Size(160, 72);\n\t\t\tthis.groupRangeRef.TabIndex = 11;\n\t\t\tthis.groupRangeRef.TabStop = false;\n\t\t\tthis.groupRangeRef.Text = \"読込み区間\";\n\t\t\t// \n\t\t\t// textSkipLengthRef\n\t\t\t// \n\t\t\tthis.textSkipLengthRef.Location = new System.Drawing.Point(72, 16);\n\t\t\tthis.textSkipLengthRef.Name = \"textSkipLengthRef\";\n\t\t\tthis.textSkipLengthRef.Size = new System.Drawing.Size(80, 19);\n\t\t\tthis.textSkipLengthRef.TabIndex = 14;\n\t\t\tthis.textSkipLengthRef.Text = \"0\";\n\t\t\tthis.textSkipLengthRef.TextAlign = System.Windows.Forms.HorizontalAlignment.Right;\n\t\t\t// \n\t\t\t// labelSkipLengthRef\n\t\t\t// \n\t\t\tthis.labelSkipLengthRef.Location = new System.Drawing.Point(8, 16);\n\t\t\tthis.labelSkipLengthRef.Name = \"labelSkipLengthRef\";\n\t\t\tthis.labelSkipLengthRef.Size = new System.Drawing.Size(64, 16);\n\t\t\tthis.labelSkipLengthRef.TabIndex = 0;\n\t\t\tthis.labelSkipLengthRef.Text = \"読飛ばし長\";\n\t\t\tthis.labelSkipLengthRef.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// buttonOk\n\t\t\t// \n\t\t\tthis.buttonOk.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);\n\t\t\tthis.buttonOk.Location = new System.Drawing.Point(248, 352);\n\t\t\tthis.buttonOk.Name = \"buttonOk\";\n\t\t\tthis.buttonOk.TabIndex = 9;\n\t\t\tthis.buttonOk.Text = \"OK\";\n\t\t\tthis.buttonOk.Click += new System.EventHandler(this.buttonOk_Click);\n\t\t\t// \n\t\t\t// buttonCancel\n\t\t\t// \n\t\t\tthis.buttonCancel.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);\n\t\t\tthis.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;\n\t\t\tthis.buttonCancel.Location = new System.Drawing.Point(328, 352);\n\t\t\tthis.buttonCancel.Name = \"buttonCancel\";\n\t\t\tthis.buttonCancel.TabIndex = 10;\n\t\t\tthis.buttonCancel.Text = \"cancel\";\n\t\t\tthis.buttonCancel.Click += new System.EventHandler(this.buttonCancel_Click);\n\t\t\t// \n\t\t\t// WaveLoadForm\n\t\t\t// \n\t\t\tthis.AcceptButton = this.buttonOk;\n\t\t\tthis.AutoScaleBaseSize = new System.Drawing.Size(5, 12);\n\t\t\tthis.CancelButton = this.buttonCancel;\n\t\t\tthis.ClientSize = new System.Drawing.Size(410, 383);\n\t\t\tthis.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.buttonCancel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.buttonOk,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.groupReference,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.groupData});\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n\t\t\tthis.MaximizeBox = false;\n\t\t\tthis.MinimizeBox = false;\n\t\t\tthis.Name = \"WaveLoadForm\";\n\t\t\tthis.Text = \"Wave ファイル読込み設定\";\n\t\t\tthis.groupRemoveSilent.ResumeLayout(false);\n\t\t\tthis.groupData.ResumeLayout(false);\n\t\t\tthis.groupRange.ResumeLayout(false);\n\t\t\tthis.groupReference.ResumeLayout(false);\n\t\t\tthis.groupRemoveSilentRef.ResumeLayout(false);\n\t\t\tthis.groupRangeRef.ResumeLayout(false);\n\t\t\tthis.ResumeLayout(false);\n\n\t\t}\n\t\t#endregion\n\n\t\tprivate void buttonData_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tOpenFileDialog dlg = new OpenFileDialog();\n\t\t\tdlg.Filter = \"wave file(*.wav)|*.wav\";\n\n\t\t\tdlg.Title = \"データファイルの選択\";\n\t\t\tif(dlg.ShowDialog() != DialogResult.OK) return;\n\t\t\tthis.textDataName.Text = dlg.FileName;\n\t\t}\n\n\t\tprivate void buttonReference_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tOpenFileDialog dlg = new OpenFileDialog();\n\t\t\tdlg.Filter = \"wave file(*.wav)|*.wav\";\n\n\t\t\tdlg.Title = \"リファレンスファイルの選択\";\n\t\t\tif(dlg.ShowDialog() != DialogResult.OK) return;\n\t\t\tthis.textReferenceName.Text = dlg.FileName;\n\t\t}\n\n\t\tprivate void buttonOk_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.DialogResult = DialogResult.OK;\n\t\t\tthis.Close();\n\t\t}\n\n\t\tprivate void buttonCancel_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.Close();\n\t\t}\n\n\t\tprivate void checkRemoveSilent_CheckedChanged(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.checkRelativeThreshold.Enabled = this.checkRemoveSilent.Checked;\n\t\t\tthis.textThreshold.Enabled = this.checkRemoveSilent.Checked;\n\t\t}\n\n\t\tprivate void checkRemoveSilentRef_CheckedChanged(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.checkRelativeThresholdRef.Enabled = this.checkRemoveSilentRef.Checked;\n\t\t\tthis.textThresholdRef.Enabled = this.checkRemoveSilentRef.Checked;\n\t\t}\n\n\t\tprivate void checkUseReference_CheckedChanged(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.groupReference.Enabled = this.checkUseReference.Checked;\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/spctrum/AppMain/WaveLoadForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n            Microsoft ResX Schema \n        \n            Version 1.3\n                \n            The primary goals of this format is to allow a simple XML format \n            that is mostly human readable. The generation and parsing of the \n            various data types are done through the TypeConverter classes \n            associated with the data types.\n        \n            Example:\n        \n                ... ado.net/XML headers & schema ...\n                <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n                <resheader name=\"version\">1.3</resheader>\n                <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n                <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n                <data name=\"Name1\">this is my long string</data>\n                <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n                <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n                    [base64 mime encoded serialized .NET Framework object]\n                </data>\n                <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n                    [base64 mime encoded string representing a byte array form of the .NET Framework object]\n                </data>\n        \n            There are any number of \"resheader\" rows that contain simple \n            name/value pairs.\n            \n            Each data row contains a name, and value. The row also contains a \n            type or mimetype. Type corresponds to a .NET class that support \n            text/value conversion through the TypeConverter architecture. \n            Classes that don't support this are serialized and stored with the \n            mimetype set.\n                     \n            The mimetype is used for serialized objects, and tells the \n            ResXResourceReader how to depersist the object. This is currently not \n            extensible. For a given mimetype the value must be set accordingly:\n        \n            Note - application/x-microsoft.net.object.binary.base64 is the format \n                   that the ResXResourceWriter will generate, however the reader can \n                   read any of the formats listed below.\n        \n            mimetype: application/x-microsoft.net.object.binary.base64\n            value   : The object must be serialized with \n                    : System.Serialization.Formatters.Binary.BinaryFormatter\n                    : and then encoded with base64 encoding.\n        \n            mimetype: application/x-microsoft.net.object.soap.base64\n            value   : The object must be serialized with \n                    : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n                    : and then encoded with base64 encoding.\n            mimetype: application/x-microsoft.net.object.bytearray.base64\n            value   : The object must be serialized into a byte array \n                    : using a System.ComponentModel.TypeConverter\n                    : and then encoded with base64 encoding.\n        -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>1.3</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"$this.Name\">\n    <value>WaveLoadForm</value>\n  </data>\n</root>"
  },
  {
    "path": "Chapters/Old/spctrum/AppMain/WaveSaveForm.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing System.IO;\nusing System.Text;\n\nusing SpectrumAnalysis;\nusing WaveAnalysis;\n\nnamespace AppMain\n{\n\t/// <summary>\n\t/// 特性を CSV 形式でファイルに書き出す。\n\t/// </summary>\n\tpublic class WaveSaveForm : System.Windows.Forms.Form\n\t{\n\t\t#region 手動更新領域\n\t\tWaveData wave;\n\t\tFileInfo file;\n\t\t#endregion\n\n\t\tprivate System.Windows.Forms.Label labelChannel;\n\t\tprivate System.Windows.Forms.CheckedListBox checkedListType;\n\t\tprivate System.Windows.Forms.Label labelType;\n\t\tprivate System.Windows.Forms.CheckBox checkUnrap;\n\t\tprivate System.Windows.Forms.TextBox textFolder;\n\t\tprivate System.Windows.Forms.Label labelFolder;\n\t\tprivate System.Windows.Forms.Button buttonFolderDefault;\n\t\tprivate System.Windows.Forms.Label labelName;\n\t\tprivate System.Windows.Forms.TextBox textName;\n\t\tprivate System.Windows.Forms.Button buttonNameDefault;\n\t\tprivate System.Windows.Forms.Button buttonSave;\n\t\tprivate System.Windows.Forms.Button buttonClose;\n\t\tprivate System.Windows.Forms.Label labelDelim;\n\t\tprivate System.Windows.Forms.ComboBox comboDelim;\n\t\tprivate System.Windows.Forms.ComboBox comboChannel;\n\t\t/// <summary>\n\t\t/// 必要なデザイナ変数です。\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.Container components = null;\n\n\t\tpublic WaveSaveForm(WaveData wave, FileInfo file)\n\t\t{\n\t\t\tInitializeComponent();\n\n\t\t\tthis.wave = wave;\n\t\t\tthis.file = file;\n\n\t\t\tthis.comboChannel.SelectedIndex = 0;\n\t\t\tthis.comboDelim.SelectedIndex = 0;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 使用されているリソースに後処理を実行します。\n\t\t/// </summary>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif( disposing )\n\t\t\t{\n\t\t\t\tif(components != null)\n\t\t\t\t{\n\t\t\t\t\tcomponents.Dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Windows Form Designer generated code\n\t\t/// <summary>\n\t\t/// デザイナ サポートに必要なメソッドです。このメソッドの内容を\n\t\t/// コード エディタで変更しないでください。\n\t\t/// </summary>\n\t\tprivate void InitializeComponent()\n\t\t{\n\t\t\tthis.labelChannel = new System.Windows.Forms.Label();\n\t\t\tthis.checkedListType = new System.Windows.Forms.CheckedListBox();\n\t\t\tthis.labelType = new System.Windows.Forms.Label();\n\t\t\tthis.checkUnrap = new System.Windows.Forms.CheckBox();\n\t\t\tthis.textFolder = new System.Windows.Forms.TextBox();\n\t\t\tthis.labelFolder = new System.Windows.Forms.Label();\n\t\t\tthis.buttonFolderDefault = new System.Windows.Forms.Button();\n\t\t\tthis.labelName = new System.Windows.Forms.Label();\n\t\t\tthis.textName = new System.Windows.Forms.TextBox();\n\t\t\tthis.buttonNameDefault = new System.Windows.Forms.Button();\n\t\t\tthis.buttonSave = new System.Windows.Forms.Button();\n\t\t\tthis.buttonClose = new System.Windows.Forms.Button();\n\t\t\tthis.labelDelim = new System.Windows.Forms.Label();\n\t\t\tthis.comboDelim = new System.Windows.Forms.ComboBox();\n\t\t\tthis.comboChannel = new System.Windows.Forms.ComboBox();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// labelChannel\n\t\t\t// \n\t\t\tthis.labelChannel.Location = new System.Drawing.Point(8, 8);\n\t\t\tthis.labelChannel.Name = \"labelChannel\";\n\t\t\tthis.labelChannel.Size = new System.Drawing.Size(48, 16);\n\t\t\tthis.labelChannel.TabIndex = 5;\n\t\t\tthis.labelChannel.Text = \"チャネル\";\n\t\t\tthis.labelChannel.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// checkedListType\n\t\t\t// \n\t\t\tthis.checkedListType.Items.AddRange(new object[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"振幅特性\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"位相特性\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"位相遅延特性\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"群遅延特性\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"最小位相\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \"オールパス位相\"});\n\t\t\tthis.checkedListType.Location = new System.Drawing.Point(176, 8);\n\t\t\tthis.checkedListType.Name = \"checkedListType\";\n\t\t\tthis.checkedListType.Size = new System.Drawing.Size(112, 46);\n\t\t\tthis.checkedListType.TabIndex = 9;\n\t\t\t// \n\t\t\t// labelType\n\t\t\t// \n\t\t\tthis.labelType.Location = new System.Drawing.Point(144, 8);\n\t\t\tthis.labelType.Name = \"labelType\";\n\t\t\tthis.labelType.Size = new System.Drawing.Size(32, 16);\n\t\t\tthis.labelType.TabIndex = 5;\n\t\t\tthis.labelType.Text = \"特性\";\n\t\t\tthis.labelType.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// checkUnrap\n\t\t\t// \n\t\t\tthis.checkUnrap.Checked = true;\n\t\t\tthis.checkUnrap.CheckState = System.Windows.Forms.CheckState.Checked;\n\t\t\tthis.checkUnrap.Location = new System.Drawing.Point(184, 56);\n\t\t\tthis.checkUnrap.Name = \"checkUnrap\";\n\t\t\tthis.checkUnrap.TabIndex = 10;\n\t\t\tthis.checkUnrap.Text = \"位相をアンラップ\";\n\t\t\t// \n\t\t\t// textFolder\n\t\t\t// \n\t\t\tthis.textFolder.Location = new System.Drawing.Point(64, 88);\n\t\t\tthis.textFolder.Name = \"textFolder\";\n\t\t\tthis.textFolder.Size = new System.Drawing.Size(136, 19);\n\t\t\tthis.textFolder.TabIndex = 11;\n\t\t\tthis.textFolder.Text = \"\";\n\t\t\t// \n\t\t\t// labelFolder\n\t\t\t// \n\t\t\tthis.labelFolder.Location = new System.Drawing.Point(8, 88);\n\t\t\tthis.labelFolder.Name = \"labelFolder\";\n\t\t\tthis.labelFolder.Size = new System.Drawing.Size(48, 16);\n\t\t\tthis.labelFolder.TabIndex = 5;\n\t\t\tthis.labelFolder.Text = \"フォルダ\";\n\t\t\tthis.labelFolder.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// buttonFolderDefault\n\t\t\t// \n\t\t\tthis.buttonFolderDefault.Location = new System.Drawing.Point(208, 88);\n\t\t\tthis.buttonFolderDefault.Name = \"buttonFolderDefault\";\n\t\t\tthis.buttonFolderDefault.Size = new System.Drawing.Size(80, 23);\n\t\t\tthis.buttonFolderDefault.TabIndex = 13;\n\t\t\tthis.buttonFolderDefault.Text = \"元と同じ\";\n\t\t\tthis.buttonFolderDefault.Click += new System.EventHandler(this.buttonFolderDefault_Click);\n\t\t\t// \n\t\t\t// labelName\n\t\t\t// \n\t\t\tthis.labelName.Location = new System.Drawing.Point(8, 120);\n\t\t\tthis.labelName.Name = \"labelName\";\n\t\t\tthis.labelName.Size = new System.Drawing.Size(56, 16);\n\t\t\tthis.labelName.TabIndex = 5;\n\t\t\tthis.labelName.Text = \"ファイル名\";\n\t\t\tthis.labelName.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// textName\n\t\t\t// \n\t\t\tthis.textName.Location = new System.Drawing.Point(64, 120);\n\t\t\tthis.textName.Name = \"textName\";\n\t\t\tthis.textName.Size = new System.Drawing.Size(136, 19);\n\t\t\tthis.textName.TabIndex = 11;\n\t\t\tthis.textName.Text = \"\";\n\t\t\t// \n\t\t\t// buttonNameDefault\n\t\t\t// \n\t\t\tthis.buttonNameDefault.Location = new System.Drawing.Point(208, 120);\n\t\t\tthis.buttonNameDefault.Name = \"buttonNameDefault\";\n\t\t\tthis.buttonNameDefault.Size = new System.Drawing.Size(80, 23);\n\t\t\tthis.buttonNameDefault.TabIndex = 13;\n\t\t\tthis.buttonNameDefault.Text = \"元と同じ\";\n\t\t\tthis.buttonNameDefault.Click += new System.EventHandler(this.buttonNameDefault_Click);\n\t\t\t// \n\t\t\t// buttonSave\n\t\t\t// \n\t\t\tthis.buttonSave.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);\n\t\t\tthis.buttonSave.Location = new System.Drawing.Point(136, 184);\n\t\t\tthis.buttonSave.Name = \"buttonSave\";\n\t\t\tthis.buttonSave.TabIndex = 14;\n\t\t\tthis.buttonSave.Text = \"保存\";\n\t\t\tthis.buttonSave.Click += new System.EventHandler(this.buttonSave_Click);\n\t\t\t// \n\t\t\t// buttonClose\n\t\t\t// \n\t\t\tthis.buttonClose.Anchor = (System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right);\n\t\t\tthis.buttonClose.Location = new System.Drawing.Point(218, 184);\n\t\t\tthis.buttonClose.Name = \"buttonClose\";\n\t\t\tthis.buttonClose.TabIndex = 15;\n\t\t\tthis.buttonClose.Text = \"閉じる\";\n\t\t\tthis.buttonClose.Click += new System.EventHandler(this.buttonClose_Click);\n\t\t\t// \n\t\t\t// labelDelim\n\t\t\t// \n\t\t\tthis.labelDelim.Location = new System.Drawing.Point(8, 152);\n\t\t\tthis.labelDelim.Name = \"labelDelim\";\n\t\t\tthis.labelDelim.Size = new System.Drawing.Size(64, 16);\n\t\t\tthis.labelDelim.TabIndex = 5;\n\t\t\tthis.labelDelim.Text = \"区切り文字\";\n\t\t\tthis.labelDelim.TextAlign = System.Drawing.ContentAlignment.BottomLeft;\n\t\t\t// \n\t\t\t// comboDelim\n\t\t\t// \n\t\t\tthis.comboDelim.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.comboDelim.Items.AddRange(new object[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"コンマ\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"タブ\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"スペース\"});\n\t\t\tthis.comboDelim.Location = new System.Drawing.Point(80, 152);\n\t\t\tthis.comboDelim.Name = \"comboDelim\";\n\t\t\tthis.comboDelim.Size = new System.Drawing.Size(72, 20);\n\t\t\tthis.comboDelim.TabIndex = 16;\n\t\t\t// \n\t\t\t// comboChannel\n\t\t\t// \n\t\t\tthis.comboChannel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;\n\t\t\tthis.comboChannel.Items.AddRange(new object[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"Left\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"Right\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"L/R\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"R/L\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"Middle\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"Side\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"M/S\",\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\"S/M\"});\n\t\t\tthis.comboChannel.Location = new System.Drawing.Point(56, 8);\n\t\t\tthis.comboChannel.Name = \"comboChannel\";\n\t\t\tthis.comboChannel.Size = new System.Drawing.Size(80, 20);\n\t\t\tthis.comboChannel.TabIndex = 17;\n\t\t\t// \n\t\t\t// WaveSaveForm\n\t\t\t// \n\t\t\tthis.AutoScaleBaseSize = new System.Drawing.Size(5, 12);\n\t\t\tthis.ClientSize = new System.Drawing.Size(298, 215);\n\t\t\tthis.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.comboChannel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.comboDelim,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.buttonClose,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.buttonSave,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.buttonFolderDefault,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.textFolder,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.checkUnrap,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.checkedListType,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.labelChannel,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.labelType,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.labelFolder,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.labelName,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.textName,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.buttonNameDefault,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.labelDelim});\n\t\t\tthis.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;\n\t\t\tthis.Name = \"WaveSaveForm\";\n\t\t\tthis.Text = \"WaveSaveForm\";\n\t\t\tthis.ResumeLayout(false);\n\n\t\t}\n\t\t#endregion\n\n\t\tprivate void buttonFolderDefault_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.textFolder.Text = file.DirectoryName;\n\t\t}\n\n\t\tprivate void buttonNameDefault_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.textName.Text = (file.Name.Split('.'))[0];\n\t\t}\n\n\t\tprivate void buttonClose_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.Close();\n\t\t}\n\n\t\tprivate void buttonSave_Click(object sender, System.EventArgs e)\n\t\t{\n\t\t\tstring filename = this.textFolder.Text + '\\\\';\n\t\t\tfilename += this.textName.Text + \".csv\";\n\n\t\t\tif(File.Exists(filename))\n\t\t\t{\n\t\t\t\tif(MessageBox.Show(\"ファイルがすでに存在しています。\\n上書きしますか？\", \"上書き確認\",\n\t\t\t\t\tMessageBoxButtons.YesNo) != DialogResult.Yes)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tDataList list = new DataList();\n\n\t\t\tChannel channel = (Channel)this.comboChannel.SelectedIndex;\n\t\t\tSpectrum spectrum = this.wave.GetSpectrum(channel);\n\t\t\tint m = this.checkedListType.CheckedIndices.Count;\n\n\t\t\tint length = this.wave.Count;\n\t\t\tdouble fs = this.wave.Header.sampleRate;\n\t\t\tdouble[] label = new double[length];\n\t\t\tfor(int i=0; i<length; ++i)\n\t\t\t{\n\t\t\t\tlabel[i] = fs / length * i;\n\t\t\t}\n\t\t\tlist.Add(\"周波数\", label);\n\n\t\t\tfor(int i=0; i<m; ++i)\n\t\t\t{\n\t\t\t\tProperty type = (Property)this.checkedListType.CheckedIndices[i];\n\t\t\t\tdouble[] data = WaveData.GetData(spectrum, type);\n\t\t\t\tstring title = (string)this.checkedListType.CheckedItems[i];\n\t\t\t\tlist.Add(title, data);\n\t\t\t}\n\n\t\t\tchar delim;\n\t\t\tswitch(this.comboDelim.SelectedIndex)\n\t\t\t{\n\t\t\t\tcase 0: delim = ','; break;\n\t\t\t\tcase 1: delim = '\\t'; break;\n\t\t\t\tdefault: delim = ' '; break;\n\t\t\t}\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tlist.Save(filename, delim, false);\n\t\t\t}\n\t\t\tcatch(Exception ex)\n\t\t\t{\n\t\t\t\tMessageBox.Show(ex.Message);\n\t\t\t}\n\t\t}\n\t}//class WaveSaveForm\n}//namespace AppMain\n"
  },
  {
    "path": "Chapters/Old/spctrum/AppMain/WaveSaveForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n            Microsoft ResX Schema \n        \n            Version 1.3\n                \n            The primary goals of this format is to allow a simple XML format \n            that is mostly human readable. The generation and parsing of the \n            various data types are done through the TypeConverter classes \n            associated with the data types.\n        \n            Example:\n        \n                ... ado.net/XML headers & schema ...\n                <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n                <resheader name=\"version\">1.3</resheader>\n                <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n                <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n                <data name=\"Name1\">this is my long string</data>\n                <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n                <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n                    [base64 mime encoded serialized .NET Framework object]\n                </data>\n                <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n                    [base64 mime encoded string representing a byte array form of the .NET Framework object]\n                </data>\n        \n            There are any number of \"resheader\" rows that contain simple \n            name/value pairs.\n            \n            Each data row contains a name, and value. The row also contains a \n            type or mimetype. Type corresponds to a .NET class that support \n            text/value conversion through the TypeConverter architecture. \n            Classes that don't support this are serialized and stored with the \n            mimetype set.\n                     \n            The mimetype is used for serialized objects, and tells the \n            ResXResourceReader how to depersist the object. This is currently not \n            extensible. For a given mimetype the value must be set accordingly:\n        \n            Note - application/x-microsoft.net.object.binary.base64 is the format \n                   that the ResXResourceWriter will generate, however the reader can \n                   read any of the formats listed below.\n        \n            mimetype: application/x-microsoft.net.object.binary.base64\n            value   : The object must be serialized with \n                    : System.Serialization.Formatters.Binary.BinaryFormatter\n                    : and then encoded with base64 encoding.\n        \n            mimetype: application/x-microsoft.net.object.soap.base64\n            value   : The object must be serialized with \n                    : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n                    : and then encoded with base64 encoding.\n            mimetype: application/x-microsoft.net.object.bytearray.base64\n            value   : The object must be serialized into a byte array \n                    : using a System.ComponentModel.TypeConverter\n                    : and then encoded with base64 encoding.\n        -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>1.3</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"$this.Name\">\n    <value>WaveSaveForm</value>\n  </data>\n</root>"
  },
  {
    "path": "Chapters/Old/spctrum/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\n\n//\n// アセンブリに関する一般情報は以下の \n// 属性セットを通して制御されます。アセンブリに関連付けられている \n// 情報を変更するには、これらの属性値を変更してください。\n//\n[assembly: AssemblyTitle(\"\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"\")]\n[assembly: AssemblyCopyright(\"\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\t\t\n\n//\n// アセンブリのバージョン情報は、以下の 4 つの属性で構成されます :\n//\n//      メジャー バージョン\n//      マイナ バージョン \n//      ビルド番号\n//      リビジョン\n//\n// 下にあるように、'*' を使って、すべての値を指定するか、 \n// ビルドおよびリビジョン番号を既定値にすることができます :\n\n[assembly: AssemblyVersion(\"1.0.*\")]\n\n//\n// アセンブリに署名するには、使用するキーを指定しなければなりません。 \n// アセンブリ署名に関する詳細については、Microsoft .NET Framework ドキュメントを参照してください。\n//\n// 下記の属性を使って、署名に使うキーを制御します。 \n//\n// メモ : \n//   (*) キーが指定されないと、アセンブリは署名されません。\n//   (*) KeyName は、コンピュータにインストールされている\n//        暗号サービス プロバイダ (CSP) のキーを表します。KeyFile は、\n//       キーを含むファイルです。\n//   (*) KeyFile および KeyName の値が共に指定されている場合は、 \n//       以下の処理が行われます :\n//       (1) KeyName が CSP に見つかった場合、そのキーが使われます。\n//       (2) KeyName が存在せず、KeyFile が存在する場合、 \n//           KeyFile にあるキーが CSP にインストールされ、使われます。\n//   (*) KeyFile を作成するには、sn.exe (厳密な名前) ユーティリティを使ってください。\n//       KeyFile を指定するとき、KeyFile の場所は、\n//       プロジェクト出力 ディレクトリへの相対パスでなければなりません。\n//       パスは、%Project Directory%\\obj\\<configuration> です。たとえば、KeyFile がプロジェクト ディレクトリにある場合、\n//       AssemblyKeyFile 属性を \n//       [assembly: AssemblyKeyFile(\"..\\\\..\\\\mykey.snk\")] として指定します。\n//   (*) 遅延署名は高度なオプションです。\n//       詳細については Microsoft .NET Framework ドキュメントを参照してください。\n//\n[assembly: AssemblyDelaySign(false)]\n[assembly: AssemblyKeyFile(\"\")]\n[assembly: AssemblyKeyName(\"\")]\n"
  },
  {
    "path": "Chapters/Old/spctrum/Class1.cs",
    "content": "﻿#define GAIN\n//#define PHASE\n//#define OUTPUT_COEF\n\nusing System;\nusing System.Drawing;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Windows.Forms;\nusing System.Xml.Serialization;\nusing System.IO;\nusing System.Text;\n\nusing Wave;\nusing Filter;\nusing SpectrumAnalysis;\n\nnamespace AppMain\n{\n\t/// <summary>\n\t/// Class1 の概要の説明です。\n\t/// </summary>\n\tpublic class AppTest\n\t{\n\t\t/// <summary>\n\t\t/// アプリケーションのメイン エントリ ポイントです。\n\t\t/// </summary>\n\t\t[STAThread]\n\t\tstatic void _Main(string[] args)\n\t\t{\n\t\t\tconst int N = 1024;\n\t\t\tdouble[] x = new double[N];\n\n\t\t\tIFilter filter = new ShelvingEqualizer(Common.Normalize(1000), 1);\n\n\t\t\t// インパルス応答取得\n\t\t\tfilter.Clear();\n\t\t\t/*\n\t\t\tfilter.GetValue(1);\n\t\t\tfor(int i=0; i<16; ++i)\n\t\t\t\tfilter.GetValue(0);\n\t\t\t\t*/\n\t\t\tfilter.GetValue(1);\n\t\t\tfor(int i=1; i<N; ++i)\n\t\t\t\tx[i] = filter.GetValue(0);\n\n#if TIME_SEQUENCE\n\t\t\tint n = N;\n\t\t\tdouble[] t = new double[n];\n\t\t\tfor(int i=0; i<n; ++i) t[i] = i;\n\n\t\t\tGraph.GraphForm gf = new Graph.GraphForm();\n\t\t\tgf.Graph.AddEntry(t, x, new Pen(Color.Crimson));\n\t\t\tgf.Graph.SetXAxis(0, n, 5, new Font(FontFamily.GenericSerif, 12), new SolidBrush(Color.Black));\n\t\t\tgf.Graph.SetYAxis(0, 2, 5, new Font(FontFamily.GenericSerif, 12), new SolidBrush(Color.Black));\n\t\t\tgf.Size = new Size(640, 480);\n\t\t\tgf.ShowDialog();\n#elif PHASE\n\t\t\tSpectrum spec = Spectrum.FromTimeSequence(x, 1);\n\n\t\t\tint n = spec.Count;\n\t\t\tdouble[] t = new double[n];\n\t\t\tfor(int i=0; i<n; ++i) t[i] = i;\n\n\t\t\tdouble[] y = spec.GetPhase();\n\t\t\tSpectrum.Unwrap(y);\n\n\t\t\tGraph.GraphForm gf = new Graph.GraphForm();\n\t\t\tgf.Graph.AddEntry(t, y, new Pen(Color.Crimson));\n\t\t\tgf.Graph.SetXAxis(0, n, 4, new Font(FontFamily.GenericSerif, 12), new SolidBrush(Color.Black));\n\t\t\tgf.Graph.SetYAxis(-50, 0, 4, new Font(FontFamily.GenericSerif, 12), new SolidBrush(Color.Black));\n\t\t\tgf.Size = new Size(640, 480);\n\t\t\tgf.ShowDialog();\n#elif GAIN\n\t\t\tSpectrum spec = Spectrum.FromTimeSequence(x, 1);\n\n\t\t\tint n = spec.Count;\n\t\t\tdouble[] t = new double[n];\n\t\t\tfor(int i=0; i<n; ++i) t[i] = i;\n\n\t\t\tdouble[] y = spec.GetAmplitude();\n\n\t\t\tGraph.GraphForm gf = new Graph.GraphForm();\n\t\t\tgf.Graph.AddEntry(t, y, new Pen(Color.Crimson));\n\t\t\tgf.Graph.SetXAxis(0, n, 4, new Font(FontFamily.GenericSerif, 12), new SolidBrush(Color.Black));\n\t\t\tgf.Graph.SetYAxis(0, 4, 4, new Font(FontFamily.GenericSerif, 12), new SolidBrush(Color.Black));\n\t\t\tgf.Size = new Size(640, 480);\n\t\t\tgf.ShowDialog();\n#endif\n\n#if false\n\t\t\tconst int N = 512;\n\t\t\tdouble[] x = new double[N];\n\t\t\tdouble[] x0 = new double[N];\n\t\t\tdouble[] y0 = new double[N];\n/*\n\t\t\tRandom rnd = new Random();\n\t\t\tx0[0] = 1;\n\t\t\tx0[1] = 1;\n\t\t\ty0[0] = 0;\n\t\t\ty0[1] = 0;\n\t\t\tfor(int i=1; i<N/2; ++i)\n\t\t\t{\n\t\t\t\tx0[2*i]   = rnd.NextDouble();\n\t\t\t\tx0[2*i+1] = rnd.NextDouble();\n\t\t\t\ty0[2*i]   = -x0[2*i+1];\n\t\t\t\ty0[2*i+1] = x0[2*i];\n\t\t\t}\n\t\t\tFft fft = new Fft(N);\n\t\t\tfft.Invert(x0);\n\t\t\tfft.Invert(y0);\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t\tx[i] = x0[i];\n//*/\n//*\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\tx[i] = 100;\n\t\t\t\tfor(int k=1; k<200; ++k)\n\t\t\t\t\tx[i] += short.MaxValue / 4 / k * Math.Cos(Math.PI / 512 * 32 * i * k);\n\t\t\t\tx0[i] = x[i];\n\t\t\t\ty0[i] = 0;\n\t\t\t\tfor(int k=1; k<200; ++k)\n\t\t\t\t\ty0[i] += short.MaxValue / 4 / k * Math.Sin(Math.PI / 512 * 32 * i * k);\n\t\t\t}\n//*/\n\n\t\t\tdouble[] y = Spectrum.HilbertTransform(x);\n\n\t\t\tusing(StreamWriter writer = new StreamWriter(\"z.csv\", false, Encoding.Default))\n\t\t\t{\n/*\n\t\t\t\tfor(int i=0; i<x.Length; ++i)\n\t\t\t\t\twriter.Write(\"{0},{1},{2},{3},{4}\\n\", i, x0[i], x[i], y0[i], y[i]);\n//*/\t\t\t\t\t\n//*\n\t\t\t\tSpectrum a0 = Spectrum.FromTimeSequence(x0);\n\t\t\t\tSpectrum a  = Spectrum.FromTimeSequence(x);\n\t\t\t\tSpectrum b0 = Spectrum.FromTimeSequence(y0);\n\t\t\t\tSpectrum b  = Spectrum.FromTimeSequence(y);\n\n\t\t\t\tfor(int i=0; i<a.Count; ++i)\n\t\t\t\t{\n\t\t\t\t\twriter.Write(\"{0},{1},{2},{3},{4}\\n\", i, a0[i].Abs, a[i].Abs, b0[i].Abs, b[i].Abs);\n//\t\t\t\t\twriter.Write(\"{0},{1},{2},{3},{4}\\n\", i, a0[i].Arg, a[i].Arg, b0[i].Arg, b[i].Arg);\n\t\t\t\t}\n//*/\n\t\t\t}\n\n#elif false\n\t\t\tconst int N = 1024;\n\n\t\t\tdouble[] lp = new double[N];\n\t\t\tIFilter lpf = new LowPassFir(16, Common.Normalize(2000));\n\t\t\tlp[0] = lpf.GetValue(1);\n\t\t\tfor(int i=1; i<N; ++i) lp[i] = lpf.GetValue(0);\n\n\t\t\tdouble[] bp = new double[N];\n\t\t\tIFilter bpf = new BandPassFir(16, Common.Normalize(2000), Common.Normalize(8000));\n\t\t\tlp[0] = bpf.GetValue(1);\n\t\t\tfor(int i=1; i<N; ++i) bp[i] = bpf.GetValue(0);\n\n\t\t\tdouble[] hp = new double[N];\n\t\t\tIFilter hpf = new HighPassFir(16, Common.Normalize(8000));\n\t\t\tlp[0] = hpf.GetValue(1);\n\t\t\tfor(int i=1; i<N; ++i) hp[i] = hpf.GetValue(0);\n\n\t\t\tFft fft = new Fft(N);\n\t\t\tfft.Transform(1, lp);\n\t\t\tfft.Transform(1, bp);\n\t\t\tfft.Transform(1, hp);\n\n\t\t\tusing(StreamWriter writer = new StreamWriter(\"z.csv\", false, Encoding.Default))\n\t\t\t{\n\t\t\t\tdouble la = Common.Amp(lp[0]);\n\t\t\t\tdouble ba = Common.Amp(bp[0]);\n\t\t\t\tdouble ha = Common.Amp(hp[0]);\n\t\t\t\twriter.Write(\"{0},{1},{2},{3}\\n\", 0, la, ba, ha);\n\n\t\t\t\tfor(int i=1; i<N/2; ++i)\n\t\t\t\t{\n\t\t\t\t\tla = Common.Amp(lp[2*i] * lp[2*i] + lp[2*i+1] * lp[2*i+1]);\n\t\t\t\t\tba = Common.Amp(bp[2*i] * bp[2*i] + bp[2*i+1] * bp[2*i+1]);\n\t\t\t\t\tha = Common.Amp(hp[2*i] * hp[2*i] + hp[2*i+1] * hp[2*i+1]);\n\n\t\t\t\t\twriter.Write(\"{0},{1},{2},{3}\\n\", i, la, ba, ha);\n\t\t\t\t}\n\n\t\t\t\tla = Common.Amp(lp[1]);\n\t\t\t\tba = Common.Amp(bp[1]);\n\t\t\t\tha = Common.Amp(hp[1]);\n\t\t\t\twriter.Write(\"{0},{1},{2},{3}\\n\", N/2, la, ba, ha);\n\t\t\t}\n#elif false\n\t\t\tuint length;\n\t\t\tdouble[] l;\n\t\t\tdouble[] r;\n\t\t\tFormatHeader header;\n\n\t\t\tusing(WaveReader reader = new WaveReader(@\"TD100V00H030.wav\"))\n\t\t\t{\n\t\t\t\theader = reader.Header;\n\t\t\t\tlength = reader.Length;\n\t\t\t\tint tmp = reader.Read(length, out l, out r);\n\t\t\t}\n\n\t\t\tIFilter lpf = new LowPassFir(16, Common.Normalize(4500));\n\t\t\tIFilter bpf = new BandPassFir(16, Common.Normalize(4500), Common.Normalize(10000));\n\t\t\tIFilter hpf = new HighPassFir(16, Common.Normalize(10000));\n\n\t\t\tfor(int i=0; i<l.Length; ++i)\n\t\t\t{\n\t\t\t\tdouble lp = lpf.GetValue(l[i]);\n\t\t\t\tdouble bp = bpf.GetValue(l[i]);\n\t\t\t\tdouble hp = hpf.GetValue(l[i]);\n\t\t\t\tl[i] = lp + bp + hp;\n\t\t\t}\n\t\t\tif(r != null)\n\t\t\t\tfor(int i=0; i<l.Length; ++i)\n\t\t\t\t{\n\t\t\t\t\tdouble lp = lpf.GetValue(r[i]);\n\t\t\t\t\tdouble bp = bpf.GetValue(r[i]);\n\t\t\t\t\tdouble hp = hpf.GetValue(r[i]);\n\t\t\t\t\tr[i] = lp + bp + hp;\n\t\t\t\t}\n\n\t\t\tusing(WaveWriter writer = new WaveWriter(\"z.wav\", header))\n\t\t\t{\n\t\t\t\twriter.Write(l, r);\n\t\t\t}\n\n#elif false\n\t\t\tusing(StreamWriter writer = new StreamWriter(\"z.csv\", false, Encoding.Default))\n\t\t\t{\n\t\t\t\tfor(int i=0; i<l.Length; ++i)\n\t\t\t\t{\n\t\t\t\t\twriter.Write(\"{0},{1},{2}\\n\", i, l[i], r[i]);\n\t\t\t\t}\n\t\t\t}\n#endif\n\t\t}\n\t\tstatic void Write(StreamWriter writer, string title, Delay f)\n\t\t{\n\t\t\twriter.Write(\"{0}\\n{1}\\n\", title, f.Taps);\n\t\t}\n\t\tstatic void Write(StreamWriter writer, string title, OddLinearFir f)\n\t\t{\n\t\t\twriter.Write(\"{0}\\n\", title);\n\t\t\tdouble[] c = f.Coefficient;\n\t\t\twriter.Write(\"{0}\", f.Coefficient[0]);\n\t\t\tfor(int i=1; i<c.Length; ++i)\n\t\t\t\twriter.Write(\", {0}\", f.Coefficient[i]);\n\t\t\twriter.Write(\"\\n\");\n\t\t}\n\t\tstatic void Write(StreamWriter writer, string title, IirFilter f)\n\t\t{\n\t\t\twriter.Write(\"{0}\\n\", title);\n\t\t\twriter.Write(\"{0}\", f.A[0]);\n\t\t\tfor(int i=1; i<f.A.Length; ++i)\n\t\t\t\twriter.Write(\", {0}\", f.A[i]);\n\t\t\twriter.Write(\"\\n\");\n\t\t\twriter.Write(\"{0}\", f.B[0]);\n\t\t\tfor(int i=1; i<f.B.Length; ++i)\n\t\t\t\twriter.Write(\", {0}\", f.B[i]);\n\t\t\twriter.Write(\"\\n\");\n\t\t}\n\n\t\tstatic IFilter GetFilter()\n\t\t{\n\t\t\tdouble Fl = Common.Normalize(5000);\n\t\t\tdouble Fh = Common.Normalize(15000);\n\n\t\t\tLowPassFir  lpf = new LowPassFir(16, Fl);\n\t\t\tBandPassFir bpf = new BandPassFir(16, Fl, Fh);\n\t\t\tHighPassFir hpf = new HighPassFir(16, Fh);\n\t\t\tPeakingEqualizer peql = new PeakingEqualizer(Common.Normalize(900), 3, 1.5);\n\t\t\tPeakingEqualizer peqm = new PeakingEqualizer(Common.Normalize(8000), 5, 2);\n\t\t\tPeakingEqualizer peqh = new PeakingEqualizer(Common.Normalize(20000), 2, 4);\n\t\t\tDelay dl = new Delay(4);\n\t\t\tDelay dm = new Delay(8);\n\t\t\tDelay dh = new Delay(16);\n\n#if OUTPUT_COEF\n\t\t\tusing(StreamWriter writer = new StreamWriter(\"coef.txt\"))\n\t\t\t{\n\t\t\t\tWrite(writer, \"LPF\", lpf);\n\t\t\t\tWrite(writer, \"BPF\", bpf);\n\t\t\t\tWrite(writer, \"HPF\", hpf);\n\t\t\t\tWrite(writer, \"PEQ L\", peql);\n\t\t\t\tWrite(writer, \"PEQ M\", peqm);\n\t\t\t\tWrite(writer, \"PEQ H\", peqh);\n\t\t\t\tWrite(writer, \"DLY L\", dl);\n\t\t\t\tWrite(writer, \"DLY M\", dm);\n\t\t\t\tWrite(writer, \"DLY H\", dh);\n\t\t\t}\n#endif\n\n\t\t\tIFilter low = new SerialConnector(new IFilter[]{lpf, peql, dl});\n\t\t\tIFilter mid = new SerialConnector(new IFilter[]{bpf, peqm, dm});\n\t\t\tIFilter hig = new SerialConnector(new IFilter[]{hpf, peqh, dh});\n\n\t\t\tIFilter filter = new Mixer(\n\t\t\t\tnew IFilter[]{low, mid, hig},\n\t\t\t\tnew Double[]{2, 1, 0.5});\n\n\t\t\treturn filter;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/spctrum/Filter/CircularBuffer.cs",
    "content": "﻿using System;\nusing System.Collections;\n\nnamespace Filter\n{\n\t/// <summary>\n\t/// 循環バッファ\n\t/// </summary>\n\tpublic class CircularBuffer : IEnumerable\n\t{\n\t\tdouble[] buff;\n\n\t\t/// <summary>\n\t\t/// 循環バッファコンストラクタ。\n\t\t/// </summary>\n\t\t/// <param name=\"len\">循環バッファの長さ。</param>\n\t\tpublic CircularBuffer(int len)\n\t\t{\n\t\t\tthis.buff = new double[len];\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファ内の要素のアクセス。\n\t\t/// </summary>\n\t\tpublic double this[int n]\n\t\t{\n\t\t\tset{this.buff[n] = value;}\n\t\t\tget{return this.buff[n];}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファの末尾に値を挿入。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">挿入する値。</param>\n\t\tpublic void PushBack(double x)\n\t\t{\n\t\t\tfor(int i=0; i<this.buff.Length-1; ++i)\n\t\t\t{\n\t\t\t\tthis.buff[i] = this.buff[i+1];\n\t\t\t}\n\t\t\tthis.buff[this.buff.Length-1] = x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファの末尾に値を挿入。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">挿入する値。</param>\n\t\tpublic void PushFront(double x)\n\t\t{\n\t\t\tfor(int i=this.buff.Length-1; i>0; --i)\n\t\t\t{\n\t\t\t\tthis.buff[i] = this.buff[i-1];\n\t\t\t}\n\t\t\tthis.buff[0] = x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 循環バッファの先頭の要素を返す。\n\t\t/// </summary>\n\t\tpublic double Top\n\t\t{\n\t\t\tget{return this.buff[0];}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// バッファ長(＝this.buff.Length)を返す。\n\t\t/// </summary>\n\t\tpublic int Length\n\t\t{\n\t\t\tget{return this.buff.Length;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// this.buff の列挙子を返す。\n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic IEnumerator GetEnumerator()\n\t\t{\n\t\t\treturn this.buff.GetEnumerator();\n\t\t}\n\t}//class CircularBuffer\n}\n"
  },
  {
    "path": "Chapters/Old/spctrum/Filter/Connector.cs",
    "content": "﻿using System;\n\nnamespace Filter\n{\n\t/// <summary>\n\t/// Connector の概要の説明です。\n\t/// </summary>\n\tpublic class SerialConnector : IFilter\n\t{\n\t\tIFilter[] filters;\n\n\t\tpublic SerialConnector(IFilter[] filters)\n\t\t{\n\t\t\tthis.filters = filters;\n\t\t}\n\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tforeach(IFilter f in this.filters)\n\t\t\t\tx = f.GetValue(x);\n\t\t\treturn x;\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tforeach(IFilter f in this.filters)\n\t\t\t\tf.Clear();\n\t\t}\n\t}//class SerialConnector\n\n\t/// <summary>\n\t/// Connector の概要の説明です。\n\t/// </summary>\n\tpublic class PallarelConnector : IFilter\n\t{\n\t\tIFilter[] filters;\n\n\t\tpublic PallarelConnector(IFilter[] filters)\n\t\t{\n\t\t\tthis.filters = filters;\n\t\t}\n\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tdouble tmp = 0;\n\t\t\tforeach(IFilter f in this.filters)\n\t\t\t\ttmp += f.GetValue(x);\n\t\t\treturn tmp;\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tforeach(IFilter f in this.filters)\n\t\t\t\tf.Clear();\n\t\t}\n\t}//class PallarelConnector\n\n\t/// <summary>\n\t/// Connector の概要の説明です。\n\t/// </summary>\n\tpublic class Mixer : IFilter\n\t{\n\t\tIFilter[] filters;\n\t\tdouble[] gains;\n\n\t\tpublic Mixer(IFilter[] filters, double[] gains)\n\t\t{\n\t\t\tthis.filters = filters;\n\t\t\tthis.gains = gains;\n\t\t}\n\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tdouble tmp = 0;\n\t\t\tfor(int i=0; i<this.filters.Length; ++i)\n\t\t\t\ttmp += this.filters[i].GetValue(x) * this.gains[i];\n\t\t\treturn tmp;\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tforeach(IFilter f in this.filters)\n\t\t\t\tf.Clear();\n\t\t}\n\t}//class Mixer\n}//namespace Filter\n"
  },
  {
    "path": "Chapters/Old/spctrum/Filter/Filter.cs",
    "content": "﻿using System;\n\nnamespace Filter\n{\n\t/// <summary>\n\t/// 音声処理用フィルタインターフェース。\n\t/// </summary>\n\tpublic interface IFilter\n\t{\n\t\t/// <summary>\n\t\t/// フィルタリングを行い、その結果を返す。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力。</returns>\n\t\tdouble GetValue(double x);\n\n\t\t/// <summary>\n\t\t/// フィルタの内部状態をクリアする。\n\t\t/// </summary>\n\t\tvoid Clear();\n\t}\n}//namespace Filter\n"
  },
  {
    "path": "Chapters/Old/spctrum/Filter/Fir.cs",
    "content": "﻿using System;\n\nnamespace Filter\n{\n\t/// <summary>\n\t/// 窓関数用の delegate\n\t/// </summary>\n\tpublic delegate double WindowFunction(double x);\n\n\t/// <summary>\n\t/// FIR フィルタ関係の共通関数群\n\t/// </summary>\n\tclass FirCommon\n\t{\n\t\t/// <summary>\n\t\t/// 線形位相ローパス/バンドパス/ハイパスフィルタのフィルタタイプ。\n\t\t/// </summary>\n\t\tpublic enum FirFilterType\n\t\t{\n\t\t\tLPF, BPF, HPF\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 線形位相バンドパスフィルタの係数を計算する。\n\t\t/// 右側半分のみを計算。\n\t\t/// </summary>\n\t\t/// <param name=\"type\">フィルタタイプ</param>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"w\">遮断周波数(BPF の場合は遮断帯域幅、HPF の場合は π-遮断周波数)</param>\n\t\t/// <param name=\"w0\">(BPF のみ) 中心周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\t/// <returns>係数の右側半分を計算したもの</returns>\n\t\tpublic static void CalcLinearBPFCoefficient(FirFilterType type, double[] coef, double w, double w0, WindowFunction window)\n\t\t{\n\t\t\tint n = coef.Length;\n\t\t\tdouble sum;\n\n\t\t\tsum = coef[0] = window(0) * w;\n\t\t\tfor(int i=1; i<n; ++i)\n\t\t\t{\n\t\t\t\tdouble tmp = window(i) * Math.Sin(w * i) / i;\n\t\t\t\tsum += tmp * 2;\n\n\t\t\t\tif(type == FirFilterType.LPF)\n\t\t\t\t{\n\t\t\t\t\tcoef[i] = tmp;\n\t\t\t\t}\n\t\t\t\telse if(type == FirFilterType.HPF)\n\t\t\t\t{\n\t\t\t\t\tif(i%2 != 0)\n\t\t\t\t\t\tcoef[i] = -tmp;\n\t\t\t\t\telse\n\t\t\t\t\t\tcoef[i] = tmp;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcoef[i] = 2 * Math.Cos(w0 * i) * tmp;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor(int i=0; i<n; ++i)\n\t\t\t{\n\t\t\t\tcoef[i] /= sum;\n\t\t\t}\n\t\t}//GetLinearBPFCoefficient\n\n\t\t/// <summary>\n\t\t/// 窓関数用。常に1を返す関数。\n\t\t/// </summary>\n\t\tpublic static double Constant1(double x)\n\t\t{\n\t\t\treturn 1;\n\t\t}\n\t}//class FirCommon\n\n\t/// <summary>\n\t/// FIR フィルタクラス。\n\t/// </summary>\n\tpublic class FirFilter : IFilter\n\t{\n\t\tprotected double[] coef; // 係数配列\n\t\tprotected CircularBuffer buff; // 遅延バッファ\n\n\t\t/// <summary>\n\t\t/// デフォルトコンストラクタ\n\t\t/// </summary>\n\t\tpublic FirFilter() : this(null){}\n\n\t\t/// <summary>\n\t\t/// タップ数を指定して FIR を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"taps\">タップ数</param>\n\t\tpublic FirFilter(int taps) : this(new double[taps]){}\n\n\t\t/// <summary>\n\t\t/// 係数を指定して FIR を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"coef\">係数を格納した配列。</param>\n\t\tpublic FirFilter(double[] coef)\n\t\t{\n\t\t\tthis.Coefficient = coef;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// N: フィルタ次数 (= this.coef.Length - 1)\n\t\t/// x: 入力\n\t\t/// y: 出力\n\t\t/// c[i]: 係数配列\n\t\t/// d[i]: i+1 サンプル前の x の値\n\t\t/// とすると、\n\t\t/// y = x*c[N] + Σ_{i=0}^{N-1} d[i]*c[N-1-i]\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tint N = this.coef.Length - 1;\n\t\t\tdouble y = this.coef[N] * x;\n\t\t\tfor(int i=0; i<N-1; ++i)\n\t\t\t{\n\t\t\t\ty += this.buff[i] * this.coef[i];\n\t\t\t}\n\t\t\tthis.buff.PushBack(x);\n\t\t\treturn y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tfor(int i=0; i<this.buff.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.buff[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 係数の取得/設定\n\t\t/// </summary>\n\t\tpublic double[] Coefficient\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.coef = value;\n\t\t\t\tif(value == null)\n\t\t\t\t\tthis.buff = null;\n\t\t\t\telse\n\t\t\t\t\tthis.buff = new CircularBuffer(coef.Length - 1);\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn this.coef;\n\t\t\t}\n\t\t}\n\t}//class FirFilter\n\n\t/// <summary>\n\t/// 線形位相 FIR フィルタクラス。\n\t/// 係数が実対象であることを利用して計算量/メモリ量削減。\n\t/// 奇数タップバージョン\n\t/// (タップ数 2n + 1 で、coef[n-i] == coef[n+i] foreach i)\n\t/// </summary>\n\tpublic class OddLinearFir : IFilter\n\t{\n\t\tprotected double[] coef;\n\t\tprotected CircularBuffer buff;\n\n\t\t/// <summary>\n\t\t/// デフォルトコンストラクタ\n\t\t/// </summary>\n\t\tpublic OddLinearFir() : this(null){}\n\n\t\t/// <summary>\n\t\t/// タップ数を指定して FIR を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数 ＝ 2n + 1</param>\n\t\tpublic OddLinearFir(int n) : this(new double[n+1]){}\n\n\t\t/// <summary>\n\t\t/// 係数を指定して FIR を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"coef\">係数を格納した配列。</param>\n\t\tpublic OddLinearFir(double[] coef)\n\t\t{\n\t\t\tthis.Coefficient = coef;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// n: タップ数が 2n + 1 (n = this.coef.Length - 1)\n\t\t/// x: 入力\n\t\t/// y: 出力\n\t\t/// c[i]: 係数配列\n\t\t/// d[i]: i+1 サンプル前の x の値\n\t\t/// とすると、\n\t\t/// y = d[n]*c[0] + Σ_{i=1}^{n} (d[n+i] + d[n-i])*c[i]\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tthis.buff.PushBack(x);\n\n\t\t\tint n = this.coef.Length - 1;\n\t\t\tdouble y = this.coef[0] * this.buff[n];\n\t\t\tfor(int i=1; i<=n; ++i)\n\t\t\t{\n\t\t\t\ty += this.coef[i] * (this.buff[n+i] + this.buff[n-i]);\n\t\t\t}\n\t\t\treturn y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tfor(int i=0; i<this.buff.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.buff[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 係数の取得/設定\n\t\t/// </summary>\n\t\tpublic double[] Coefficient\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tthis.coef = value;\n\t\t\t\tif(value == null)\n\t\t\t\t\tthis.buff = null;\n\t\t\t\telse\n\t\t\t\t\tthis.buff = new CircularBuffer(2*coef.Length - 1);\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\tint n = this.coef.Length;\n\t\t\t\tdouble[] tmp = new double[this.coef.Length * 2 - 1];\n\t\t\t\tfor(int i=0; i<n; ++i)\n\t\t\t\t{\n\t\t\t\t\ttmp[n-1 + i] = tmp [n-1 - i] = this.coef[i];\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t}\n\t}//class OddLinearFir\n\n\t/// <summary>\n\t/// ローパス FIR フィルタ。\n\t/// </summary>\n\tpublic class LowPassFir : OddLinearFir\n\t{\n\t\t/// <summary>\n\t\t/// ローパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"w\">遮断周波数</param>\n\t\tpublic LowPassFir(int n, double w) : this(n, w, new WindowFunction(FirCommon.Constant1)){}\n\t\t\n\t\t/// <summary>\n\t\t/// ローパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"w\">遮断周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic LowPassFir(int n, double w, WindowFunction window) : base(n)\n\t\t{\n\t\t\tFirCommon.CalcLinearBPFCoefficient(FirCommon.FirFilterType.LPF, this.coef, w, 0, window);\n\t\t}\n\t}//class LowPassFir\n\n\t/// <summary>\n\t/// ハイパス FIR フィルタ。\n\t/// </summary>\n\tpublic class HighPassFir : OddLinearFir\n\t{\n\t\t/// <summary>\n\t\t/// ハイパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"w\">遮断周波数</param>\n\t\tpublic HighPassFir(int n, double w) : this(n, w, new WindowFunction(FirCommon.Constant1)){}\n\t\t\n\t\t/// <summary>\n\t\t/// ハイパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"w\">遮断周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic HighPassFir(int n, double w, WindowFunction window) : base(n)\n\t\t{\n\t\t\tFirCommon.CalcLinearBPFCoefficient(FirCommon.FirFilterType.HPF, this.coef, Math.PI - w, 0, window);\n\t\t}\n\t}//class HighPassFir\n\n\t/// <summary>\n\t/// バンドパス FIR フィルタ。\n\t/// </summary>\n\tpublic class BandPassFir : OddLinearFir\n\t{\n\t\t/// <summary>\n\t\t/// バンドパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"wl\">下限周波数</param>\n\t\t/// <param name=\"wh\">上限周波数</param>\n\t\tpublic BandPassFir(int n, double wl, double wh) : this(n, wl, wh, new WindowFunction(FirCommon.Constant1)){}\n\t\t\n\t\t/// <summary>\n\t\t/// バンドパスフィルタを作成\n\t\t/// </summary>\n\t\t/// <param name=\"n\">タップ数＝2n+1</param>\n\t\t/// <param name=\"wl\">下限周波数</param>\n\t\t/// <param name=\"wh\">上限周波数</param>\n\t\t/// <param name=\"window\">窓関数</param>\n\t\tpublic BandPassFir(int n, double wl, double wh, WindowFunction window) : base(n)\n\t\t{\n\t\t\tFirCommon.CalcLinearBPFCoefficient(FirCommon.FirFilterType.BPF, this.coef, (wl - wh)/2, (wl + wh)/2, window);\n\t\t}\n\t}//class BandPassFir\n\n\tpublic class Delay : IFilter\n\t{\n\t\tCircularBuffer buf;\n\n\t\t/// <summary>\n\t\t/// コンストラクタ\n\t\t/// </summary>\n\t\t/// <param name=\"taps\">遅延タップ数</param>\n\t\tpublic Delay(int taps)\n\t\t{\n\t\t\tthis.buf = new CircularBuffer(taps);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tdouble tmp = this.buf.Top;\n\t\t\tthis.buf.PushBack(x);\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tfor(int i=0; i<this.buf.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.buf[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\tpublic int Taps{get{return this.buf.Length;}}\n\t}//class Delay\n}//namespace Filter\n"
  },
  {
    "path": "Chapters/Old/spctrum/Filter/Iir.cs",
    "content": "﻿using System;\n\nnamespace Filter\n{\n\t/// <summary>\n\t/// IIR フィルタクラス。\n\t/// </summary>\n\tpublic class IirFilter : IFilter\n\t{\n\t\tdouble[] a; // 分母係数配列\n\t\tdouble[] b; // 分子係数配列\n\t\tCircularBuffer buff; // 遅延バッファ\n\n\t\t/// <summary>\n\t\t/// デフォルトコンストラクタ。\n\t\t/// </summary>\n\t\tpublic IirFilter() : this(null, null) {}\n\n\t\t/// <summary>\n\t\t/// 次数を指定して IIR を作る。\n\t\t/// </summary>\n\t\t/// <param name=\"order\">IIR の次数</param>\n\t\tpublic IirFilter(int order) : this(new double[order], new double[order + 1]) {}\n\n\t\t/// <summary>\n\t\t/// 係数を指定して IIR を作る。\n\t\t/// 作りたい IIR の伝達関数が、\n\t\t///      Σ_0^N B_i z^i\n\t\t/// Y = ---------------- X\n\t\t///      Σ_0^N A_i z^i\n\t\t/// であるとき、\n\t\t/// a[i] = - A_(i+1) / A_0    (i = 1～N)\n\t\t/// b[i] = B_i / A_0        (i = 0～N)\n\t\t/// </summary>\n\t\t/// <param name=\"a\">分母係数配列</param>\n\t\t/// <param name=\"b\">分子係数配列</param>\n\t\tpublic IirFilter(double[] a, double[] b)\n\t\t{\n\t\t\tthis.SetCoefficient(a, b);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フィルタリングを行う。\n\t\t/// N: フィルタ次数 (= this.a.Length = this.b.Length - 1)\n\t\t/// x: 入力\n\t\t/// t: 中間データ\n\t\t/// y: 出力\n\t\t/// a[i]: 分母係数配列\n\t\t/// b[i]: 分子係数配列\n\t\t/// d[i]: i+1 サンプル前の t の値\n\t\t/// とすると、\n\t\t/// t = x + Σ_{i=0}^{N-1} a[i]d[i]\n\t\t/// y = t * b[0] + Σ_{i=0}^{N} b[i+1]d[i]\n\t\t/// </summary>\n\t\t/// <param name=\"x\">フィルタ入力。</param>\n\t\t/// <returns>フィルタ出力</returns>\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tint N = this.a.Length;\n\t\t\tdouble t = x;\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\tt += this.buff[i] * this.a[i];\n\t\t\t}\n\t\t\tdouble y = t * this.b[0];\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\ty += this.buff[i] * this.b[i+1];\n\t\t\t}\n\t\t\tthis.buff.PushFront(t);\n\t\t\treturn y;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 内部状態のクリア\n\t\t/// </summary>\n\t\tpublic void Clear()\n\t\t{\n\t\t\tfor(int i=0; i<this.buff.Length; ++i)\n\t\t\t{\n\t\t\t\tthis.buff[i] = 0;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 係数の設定\n\t\t/// </summary>\n\t\t/// <param name=\"a\">分母係数配列</param>\n\t\t/// <param name=\"b\">分子係数配列</param>\n\t\tpublic void SetCoefficient(double[] a, double[]b)\n\t\t{\n\t\t\tif(a == null || b == null ||\n\t\t\t\ta.Length + 1 != b.Length)\n\t\t\t{\n\t\t\t\tthis.buff = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.buff = new CircularBuffer(a.Length);\n\t\t\tthis.a = a;\n\t\t\tthis.b = b;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 分母係数配列の取得\n\t\t/// </summary>\n\t\tpublic double[] A\n\t\t{\n\t\t\tget{return this.a;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 分母係数配列の取得\n\t\t/// </summary>\n\t\tpublic double[] B\n\t\t{\n\t\t\tget{return this.b;}\n\t\t}\n\t}//class IirFilter\n\n\t/// <summary>\n\t/// 2次IIRを用いたピーキングイコライザ。\n\t/// </summary>\n\tpublic class PeakingEqualizer : IirFilter\n\t{\n\t\t/// <summary>\n\t\t/// ピーキングイコライザを作成。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">中心周波数</param>\n\t\t/// <param name=\"Q\">Q値</param>\n\t\t/// <param name=\"A\">増幅率(リニア値)</param>\n\t\tpublic PeakingEqualizer(double w, double Q, double A) : base(2)\n\t\t{\n#if true\n\t\t\tdouble a = Math.Sqrt(A);\n\t\t\tdouble sn = Math.Sin(w);\n\t\t\tdouble cs = Math.Cos(w);\n\t\t\tdouble alpha = sn / (2 * Q);\n\t\t\tdouble a0 = 1 + alpha / a;\n\t\t\tdouble a1 = -2 * cs;\n\t\t\tdouble a2 = 1 - alpha / a;\n\t\t\tdouble b0 = 1 + alpha * a;\n\t\t\tdouble b1 = -2 * cs;\n\t\t\tdouble b2 = 1 - alpha * a;\n\n\t\t\tthis.A[0] = -a1 / a0;\n\t\t\tthis.A[1] = -a2 / a0;\n\t\t\tthis.B[0] = b0 / a0;\n\t\t\tthis.B[1] = b1 / a0;\n\t\t\tthis.B[2] = b2 / a0;\n#else\n\t\t\tdouble g = A;\n\t\t\tdouble Ft = 1 / Math.Tan(w / 2);\n\n\t\t\tdouble term1 = 1.0 + Ft*g/Q + Ft*Ft;\n\t\t\tdouble term2 = 1.0 + Ft/Q + Ft*Ft;\n\n\t\t\t//Peekを作る\n\t\t\tif(A > 1)\n\t\t\t{\n\t\t\t\tthis.B[0] = term1 / term2;\n\t\t\t\tthis.B[1] = 2.0*(1.0 - Ft*Ft)/term2;\n\t\t\t\tthis.B[2] = (1.0 - Ft*g/Q + Ft*Ft) / term2;\n\t\t\t\tthis.A[0] = - this.B[1];\n\t\t\t\tthis.A[1] = - (1.0 - Ft/Q + Ft*Ft)/ term2;\n\t\t\t}\n\t\t\t//dipを作る\n\t\t\telse if(A < 1)\n\t\t\t{\n\t\t\t\tthis.B[0] = term2 / term1;\n\t\t\t\tthis.B[1] = 2.0*(1.0 - Ft*Ft)/term1;\n\t\t\t\tthis.B[2] = (1.0 - Ft / Q + Ft*Ft) / term1;\n\t\t\t\tthis.A[0] = - this.B[1];\n\t\t\t\tthis.A[1] = - (1.0 - Ft*g/Q + Ft*Ft)/ term1;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.B[0] = 1.0;\n\t\t\t\tthis.B[1] = 0.0;\n\t\t\t\tthis.B[2] = 0.0;\n\t\t\t\tthis.A[0] = 0.0; \n\t\t\t\tthis.A[1] = 0.0;   \n\t\t\t}\n#endif\n\t\t}\n\t}//class PeakingEqualizer\n\n\n\t/// <summary>\n\t/// 2次IIRを用いたピーキングイコライザ。\n\t/// </summary>\n\tpublic class ShelvingEqualizer : IirFilter\n\t{\n\t\t/// <summary>\n\t\t/// ピーキングイコライザを作成。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">中心周波数</param>\n\t\t/// <param name=\"A\">増幅率(リニア値)</param>\n\t\tpublic ShelvingEqualizer(double w, double A) : base(1)\n\t\t{\n\t\t\tdouble tn = (Math.Sin(w) - 1) / Math.Cos(w);\n\t\t\tdouble g = 1/A;//Math.Sqrt(A);\n\n\t\t\tdouble term1 = g*(1.0+tn) - (1.0-tn);\n\t\t\tdouble term2 = g*(1.0+tn) + (1.0-tn);\n\n\t\t\tif(g > 1)\n\t\t\t{\n\t\t\t\tthis.A[0]= term1/term2;\n\t\t\t\tthis.B[0]= 2.0/term2;\n\t\t\t\tthis.B[1]= tn;\n\t\t\t}\n\t\t\telse if(g < 1)\n\t\t\t{\n\t\t\t\tthis.A[0]= tn;\n\t\t\t\tthis.B[0]= term2/2.0;\n\t\t\t\tthis.B[1]= term1/term2; \n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.A[0]= 0.0;\n\t\t\t\tthis.B[0]= 1.0;\n\t\t\t\tthis.B[1]= 0.0;\n\t\t\t}\n\t\t}\n\t}//class ShelvingEqualizer\n}//namespace Filter\n"
  },
  {
    "path": "Chapters/Old/spctrum/Graph/Graph.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Drawing;\nusing System.Data;\nusing System.Windows.Forms;\n\nnamespace Graph\n{\n\t/// <summary>\n\t/// グラフを表示するコントロールクラス。\n\t/// </summary>\n\tpublic class Graph : System.Windows.Forms.UserControl\n\t{\n\t\tprivate System.Windows.Forms.Panel plotArea;\n\t\t/// <summary>\n\t\t/// 必要なデザイナ変数です。\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.Container components = null;\n\n\t\t#region 手動更新用領域\n\t\t/// <summary>\n\t\t/// グラフの項目。\n\t\t/// </summary>\n\t\tpublic class Entry\n\t\t{\n\t\t\tpublic double[] x; // x 方向データ\n\t\t\tpublic double[] y; // y 方向データ\n\t\t\tpublic Pen pen;    // グラフ描写用のペン\n\n\t\t\tpublic Entry(double[] x, double[] y, Pen pen)\n\t\t\t{\n\t\t\t\tthis.x = x;\n\t\t\t\tthis.y = y;\n\t\t\t\tthis.pen = pen;\n\t\t\t}\n\n\t\t\tpublic bool IsInvalid()\n\t\t\t{\n\t\t\t\treturn this.x == null\n\t\t\t\t\t|| this.y == null\n\t\t\t\t\t|| this.x.Length != this.y.Length\n\t\t\t\t\t|| this.pen == null;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 軸の設定。\n\t\t/// </summary>\n\t\tpublic class AxisSetting\n\t\t{\n\t\t\tpublic double min;  // 最小値\n\t\t\tpublic double max;  // 最大値\n\t\t\tpublic int split;   // 分割数\n\t\t\tpublic Font font;   // フォント\n\t\t\tpublic Brush brush; // ブラシ\n\n\t\t\tpublic AxisSetting() : this(0, 0, 0, null, null){}\n\n\t\t\tpublic AxisSetting(double min, double max, int split, Font font, Brush brush)\n\t\t\t{\n\t\t\t\tthis.min = min;\n\t\t\t\tthis.max = max;\n\t\t\t\tthis.split = split;\n\t\t\t\tthis.font = font;\n\t\t\t\tthis.brush = brush;\n\t\t\t}\n\n\t\t\tpublic bool IsInvalid()\n\t\t\t{\n\t\t\t\treturn this.min >= this.max\n\t\t\t\t\t|| this.split == 0\n\t\t\t\t\t|| this.font == null\n\t\t\t\t\t|| this.brush == null;\n\t\t\t}\n\t\t}\n\n\t\tprivate System.Windows.Forms.Panel xAxis;\n\t\tprivate System.Windows.Forms.Panel yAxis;\n\t\tArrayList entries = new ArrayList(); // y 軸データ\n\t\tAxisSetting xAxisSetting = new AxisSetting();\n\t\tAxisSetting yAxisSetting = new AxisSetting();\n\n\t\tpublic void AddEntry(double[] x, double[] y, Pen pen)\n\t\t{\n\t\t\tif(x.Length != y.Length)\n\t\t\t\treturn;\n\n\t\t\tthis.entries.Add(new Entry(x, y, pen));\n\t\t}\n\n\t\tpublic void SetXAxis(double min, double max, int split, Font font, Brush brush)\n\t\t{\n\t\t\tthis.xAxisSetting = new AxisSetting(min, max, split, font, brush);\n\t\t}\n\n\t\tpublic void SetYAxis(double min, double max, int split, Font font, Brush brush)\n\t\t{\n\t\t\tthis.yAxisSetting = new AxisSetting(min, max, split, font, brush);\n\t\t}\n\n\t\tpublic double XMin\n\t\t{\n\t\t\tset{this.xAxisSetting.min = value;}\n\t\t\tget{return this.xAxisSetting.min;}\n\t\t}\n\n\t\tpublic double XMax\n\t\t{\n\t\t\tset{this.xAxisSetting.max = value;}\n\t\t\tget{return this.xAxisSetting.max;}\n\t\t}\n\n\t\tpublic double YMin\n\t\t{\n\t\t\tset{this.yAxisSetting.min = value;}\n\t\t\tget{return this.yAxisSetting.min;}\n\t\t}\n\n\t\tpublic double YMax\n\t\t{\n\t\t\tset{this.yAxisSetting.max = value;}\n\t\t\tget{return this.yAxisSetting.max;}\n\t\t}\n\n\t\tpublic void AutoScale()\n\t\t{\n\t\t\tdouble xMin = double.MaxValue;\n\t\t\tdouble xMax = double.MinValue;\n\t\t\tdouble yMin = double.MaxValue;\n\t\t\tdouble yMax = double.MinValue;\n\t\t\tforeach(Entry entry in this.entries)\n\t\t\t{\n\t\t\t\tif(entry.IsInvalid()) continue;\n\t\t\t\tMaxMinValue(entry.x, ref xMin, ref xMax);\n\t\t\t\tMaxMinValue(entry.y, ref yMin, ref yMax);\n\t\t\t}\n\n\t\t\tint xn = this.xAxisSetting.split;\n\t\t\tint yn = this.yAxisSetting.split;\n\t\t\tthis.XMin = Math.Floor(xMin / xn) * xn;\n\t\t\tthis.XMax = Math.Ceiling(xMax / xn) * xn;\n\t\t\tthis.YMin = Math.Floor(yMin / yn) * yn;\n\t\t\tthis.YMax = Math.Ceiling(yMax / yn) * yn;\n\t\t}\n\n\t\tpublic void AutoScaleX()\n\t\t{\n\t\t\tdouble xMin = double.MaxValue;\n\t\t\tdouble xMax = double.MinValue;\n\t\t\tforeach(Entry entry in this.entries)\n\t\t\t{\n\t\t\t\tif(entry.IsInvalid()) continue;\n\t\t\t\tMaxMinValue(entry.x, ref xMin, ref xMax);\n\t\t\t}\n\n\t\t\tint xn = this.xAxisSetting.split;\n\t\t\tthis.XMin = Math.Floor(xMin / xn) * xn;\n\t\t\tthis.XMax = Math.Ceiling(xMax / xn) * xn;\n\t\t}\n\n\t\tpublic void AutoScaleY()\n\t\t{\n\t\t\tdouble yMin = double.MaxValue;\n\t\t\tdouble yMax = double.MinValue;\n\t\t\tforeach(Entry entry in this.entries)\n\t\t\t{\n\t\t\t\tif(entry.IsInvalid()) continue;\n\t\t\t\tMaxMinValue(entry.y, ref yMin, ref yMax);\n\t\t\t}\n\n\t\t\tint yn = this.yAxisSetting.split;\n\t\t\tthis.YMin = Math.Floor(yMin / yn) * yn;\n\t\t\tthis.YMax = Math.Ceiling(yMax / yn) * yn;\n\t\t}\n\n\t\tvoid MaxMinValue(double[] array, ref double min, ref double max)\n\t\t{\n\t\t\tforeach(double val in array)\n\t\t\t{\n\t\t\t\tif(min > val) min = val;\n\t\t\t\tif(max < val) max = val;\n\t\t\t}\n\t\t}\n\n\t\tprotected virtual void DrawGraph(Graphics g, Entry entry)\n\t\t{\n\t\t\tif(entry.IsInvalid()) return;\n\n\t\t\tdouble[] x = entry.x;\n\t\t\tdouble[] y = entry.y;\n\t\t\tPen pen = entry.pen;\n\n\t\t\tint n = x.Length;\n\t\t\tPointF[] points = new PointF[n];\n\t\t\tdouble width = this.XMax - this.XMin;\n\t\t\tif(width == 0) width = 1;\n\t\t\tdouble height = this.YMax - this.YMin;\n\t\t\tif(height == 0) height = 1;\n\t\t\tfor(int i=0; i<n; ++i)\n\t\t\t{\n\t\t\t\tpoints[i].X = (float)((x[i] - this.XMin) / width ) * this.plotArea.Width;\n\t\t\t\tpoints[i].Y = (float)((this.YMax - y[i]) / height) * this.plotArea.Height;\n\t\t\t}\n\t\t\tg.DrawLines(pen, points);\n\t\t}\n\t\t#endregion\n\n\t\tpublic Graph()\n\t\t{\n\t\t\tInitializeComponent();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 使用されているリソースに後処理を実行します。\n\t\t/// </summary>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif( disposing )\n\t\t\t{\n\t\t\t\tif(components != null)\n\t\t\t\t{\n\t\t\t\t\tcomponents.Dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Component Designer generated code\n\t\t/// <summary>\n\t\t/// デザイナ サポートに必要なメソッドです。このメソッドの内容を\n\t\t/// コード エディタで変更しないでください。\n\t\t/// </summary>\n\t\tprivate void InitializeComponent()\n\t\t{\n\t\t\tthis.plotArea = new System.Windows.Forms.Panel();\n\t\t\tthis.xAxis = new System.Windows.Forms.Panel();\n\t\t\tthis.yAxis = new System.Windows.Forms.Panel();\n\t\t\tthis.SuspendLayout();\n\t\t\t// \n\t\t\t// plotArea\n\t\t\t// \n\t\t\tthis.plotArea.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n\t\t\t\t| System.Windows.Forms.AnchorStyles.Left) \n\t\t\t\t| System.Windows.Forms.AnchorStyles.Right);\n\t\t\tthis.plotArea.BackColor = System.Drawing.SystemColors.Window;\n\t\t\tthis.plotArea.Location = new System.Drawing.Point(48, 8);\n\t\t\tthis.plotArea.Name = \"plotArea\";\n\t\t\tthis.plotArea.Size = new System.Drawing.Size(424, 320);\n\t\t\tthis.plotArea.TabIndex = 0;\n\t\t\tthis.plotArea.Resize += new System.EventHandler(this.plotArea_Resize);\n\t\t\tthis.plotArea.Paint += new System.Windows.Forms.PaintEventHandler(this.plotArea_Paint);\n\t\t\t// \n\t\t\t// xAxis\n\t\t\t// \n\t\t\tthis.xAxis.Anchor = ((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) \n\t\t\t\t| System.Windows.Forms.AnchorStyles.Right);\n\t\t\tthis.xAxis.Location = new System.Drawing.Point(48, 328);\n\t\t\tthis.xAxis.Name = \"xAxis\";\n\t\t\tthis.xAxis.Size = new System.Drawing.Size(424, 24);\n\t\t\tthis.xAxis.TabIndex = 1;\n\t\t\tthis.xAxis.Resize += new System.EventHandler(this.xAxis_Resize);\n\t\t\tthis.xAxis.Paint += new System.Windows.Forms.PaintEventHandler(this.xAxis_Paint);\n\t\t\t// \n\t\t\t// yAxis\n\t\t\t// \n\t\t\tthis.yAxis.Anchor = ((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) \n\t\t\t\t| System.Windows.Forms.AnchorStyles.Left);\n\t\t\tthis.yAxis.Location = new System.Drawing.Point(8, 8);\n\t\t\tthis.yAxis.Name = \"yAxis\";\n\t\t\tthis.yAxis.Size = new System.Drawing.Size(40, 320);\n\t\t\tthis.yAxis.TabIndex = 2;\n\t\t\tthis.yAxis.Resize += new System.EventHandler(this.yAxis_Resize);\n\t\t\tthis.yAxis.Paint += new System.Windows.Forms.PaintEventHandler(this.yAxis_Paint);\n\t\t\t// \n\t\t\t// Graph\n\t\t\t// \n\t\t\tthis.BackColor = System.Drawing.SystemColors.Window;\n\t\t\tthis.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.xAxis,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.plotArea,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.yAxis});\n\t\t\tthis.Name = \"Graph\";\n\t\t\tthis.Size = new System.Drawing.Size(480, 360);\n\t\t\tthis.ResumeLayout(false);\n\n\t\t}\n\t\t#endregion\n\n\t\tprivate void plotArea_Paint(object sender, System.Windows.Forms.PaintEventArgs e)\n\t\t{\n\t\t\tforeach(Entry entry in this.entries)\n\t\t\t{\n\t\t\t\tDrawGraph(e.Graphics, entry);\n\t\t\t}\n\t\t}\n\n\t\tprivate void plotArea_Resize(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.plotArea.Refresh();\n\t\t}\n\n\t\tprivate void xAxis_Paint(object sender, System.Windows.Forms.PaintEventArgs e)\n\t\t{\n\t\t\tif(this.xAxisSetting.IsInvalid()) return;\n\n\t\t\tdouble min  = this.xAxisSetting.min;\n\t\t\tdouble max  = this.xAxisSetting.max;\n\t\t\tint n       = this.xAxisSetting.split;\n\t\t\tFont font   = this.xAxisSetting.font;\n\t\t\tBrush brush = this.xAxisSetting.brush;\n\n\t\t\tfor(int i=0; i<n; ++i)\n\t\t\t{\n\t\t\t\tdouble val = (max - min) / n * i + min;\n\t\t\t\tstring str = val.ToString();\n\t\t\t\tfloat x = (float)(this.xAxis.Width / n * i);\n\t\t\t\te.Graphics.DrawString(str, font, brush, x, 0);\n\t\t\t}\n\t\t}\n\n\t\tprivate void xAxis_Resize(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.xAxis.Refresh();\n\t\t}\n\n\t\tprivate void yAxis_Paint(object sender, System.Windows.Forms.PaintEventArgs e)\n\t\t{\n\t\t\tif(this.yAxisSetting.IsInvalid()) return;\n\n\t\t\tdouble min  = this.yAxisSetting.min;\n\t\t\tdouble max  = this.yAxisSetting.max;\n\t\t\tint n       = this.yAxisSetting.split;\n\t\t\tFont font   = this.yAxisSetting.font;\n\t\t\tBrush brush = this.yAxisSetting.brush;\n\n\t\t\tfor(int i=0; i<n; ++i)\n\t\t\t{\n\t\t\t\tdouble val = (max - min) / n * i + min;\n\t\t\t\tstring str = val.ToString();\n\t\t\t\tfloat y = (float)(this.yAxis.Height / n * (n - i)) - (font.Size + 5);\n\t\t\t\te.Graphics.DrawString(str, font, brush, 0, y);\n\t\t\t}\n\t\t}\n\n\t\tprivate void yAxis_Resize(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.yAxis.Refresh();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/spctrum/Graph/Graph.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n            Microsoft ResX Schema \n        \n            Version 1.3\n                \n            The primary goals of this format is to allow a simple XML format \n            that is mostly human readable. The generation and parsing of the \n            various data types are done through the TypeConverter classes \n            associated with the data types.\n        \n            Example:\n        \n                ... ado.net/XML headers & schema ...\n                <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n                <resheader name=\"version\">1.3</resheader>\n                <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n                <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n                <data name=\"Name1\">this is my long string</data>\n                <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n                <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n                    [base64 mime encoded serialized .NET Framework object]\n                </data>\n                <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n                    [base64 mime encoded string representing a byte array form of the .NET Framework object]\n                </data>\n        \n            There are any number of \"resheader\" rows that contain simple \n            name/value pairs.\n            \n            Each data row contains a name, and value. The row also contains a \n            type or mimetype. Type corresponds to a .NET class that support \n            text/value conversion through the TypeConverter architecture. \n            Classes that don't support this are serialized and stored with the \n            mimetype set.\n                     \n            The mimetype is used for serialized objects, and tells the \n            ResXResourceReader how to depersist the object. This is currently not \n            extensible. For a given mimetype the value must be set accordingly:\n        \n            Note - application/x-microsoft.net.object.binary.base64 is the format \n                   that the ResXResourceWriter will generate, however the reader can \n                   read any of the formats listed below.\n        \n            mimetype: application/x-microsoft.net.object.binary.base64\n            value   : The object must be serialized with \n                    : System.Serialization.Formatters.Binary.BinaryFormatter\n                    : and then encoded with base64 encoding.\n        \n            mimetype: application/x-microsoft.net.object.soap.base64\n            value   : The object must be serialized with \n                    : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n                    : and then encoded with base64 encoding.\n            mimetype: application/x-microsoft.net.object.bytearray.base64\n            value   : The object must be serialized into a byte array \n                    : using a System.ComponentModel.TypeConverter\n                    : and then encoded with base64 encoding.\n        -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>1.3</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"$this.Name\">\n    <value>Graph</value>\n  </data>\n</root>"
  },
  {
    "path": "Chapters/Old/spctrum/Graph/GraphForm.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Windows.Forms;\n\nnamespace Graph\n{\n\t/// <summary>\n\t/// TestForm の概要の説明です。\n\t/// </summary>\n\tpublic class GraphForm : System.Windows.Forms.Form\n\t{\n\t\t/// <summary>\n\t\t/// 必要なデザイナ変数です。\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.Container components = null;\n\n\t\t#region 手動更新用領域\n\t\tprivate Graph graph;\n\n\t\tpublic Graph Graph\n\t\t{\n\t\t\tget{return this.graph;}\n\t\t}\n\t\t#endregion\n\n\t\tpublic GraphForm()\n\t\t{\n\t\t\tInitializeComponent();\n\n\t\t\tthis.graph = new Graph();\n\t\t\tthis.graph.Location = new System.Drawing.Point(0, 0);\n\t\t\tthis.graph.Size = this.ClientSize;\n\t\t\tthis.graph.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;\n\t\t\tthis.graph.AutoScale();\n\n\t\t\tthis.Controls.Add(this.graph);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 使用されているリソースに後処理を実行します。\n\t\t/// </summary>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif( disposing )\n\t\t\t{\n\t\t\t\tif(components != null)\n\t\t\t\t{\n\t\t\t\t\tcomponents.Dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Windows Form Designer generated code\n\t\t/// <summary>\n\t\t/// デザイナ サポートに必要なメソッドです。このメソッドの内容を\n\t\t/// コード エディタで変更しないでください。\n\t\t/// </summary>\n\t\tprivate void InitializeComponent()\n\t\t{\n\t\t\tSystem.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(GraphForm));\n\t\t\t// \n\t\t\t// GraphForm\n\t\t\t// \n\t\t\tthis.AutoScaleBaseSize = new System.Drawing.Size(5, 12);\n\t\t\tthis.ClientSize = new System.Drawing.Size(292, 273);\n\t\t\tthis.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n\t\t\tthis.Name = \"GraphForm\";\n\n\t\t}\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/spctrum/Graph/GraphForm.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n            Microsoft ResX Schema \n        \n            Version 1.3\n                \n            The primary goals of this format is to allow a simple XML format \n            that is mostly human readable. The generation and parsing of the \n            various data types are done through the TypeConverter classes \n            associated with the data types.\n        \n            Example:\n        \n                ... ado.net/XML headers & schema ...\n                <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n                <resheader name=\"version\">1.3</resheader>\n                <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n                <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n                <data name=\"Name1\">this is my long string</data>\n                <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n                <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n                    [base64 mime encoded serialized .NET Framework object]\n                </data>\n                <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n                    [base64 mime encoded string representing a byte array form of the .NET Framework object]\n                </data>\n        \n            There are any number of \"resheader\" rows that contain simple \n            name/value pairs.\n            \n            Each data row contains a name, and value. The row also contains a \n            type or mimetype. Type corresponds to a .NET class that support \n            text/value conversion through the TypeConverter architecture. \n            Classes that don't support this are serialized and stored with the \n            mimetype set.\n                     \n            The mimetype is used for serialized objects, and tells the \n            ResXResourceReader how to depersist the object. This is currently not \n            extensible. For a given mimetype the value must be set accordingly:\n        \n            Note - application/x-microsoft.net.object.binary.base64 is the format \n                   that the ResXResourceWriter will generate, however the reader can \n                   read any of the formats listed below.\n        \n            mimetype: application/x-microsoft.net.object.binary.base64\n            value   : The object must be serialized with \n                    : System.Serialization.Formatters.Binary.BinaryFormatter\n                    : and then encoded with base64 encoding.\n        \n            mimetype: application/x-microsoft.net.object.soap.base64\n            value   : The object must be serialized with \n                    : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n                    : and then encoded with base64 encoding.\n            mimetype: application/x-microsoft.net.object.bytearray.base64\n            value   : The object must be serialized into a byte array \n                    : using a System.ComponentModel.TypeConverter\n                    : and then encoded with base64 encoding.\n        -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>1.3</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"$this.Name\">\n    <value>GraphForm</value>\n  </data>\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAIAEBAQAAAAAAAoAQAAJgAAACAgEAAAAAAA6AIAAE4BAAAoAAAAEAAAACAAAAABAAQAAAAAAIAA\n        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/\n        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAH///////wAAf///////AAB/iIiIiI8AAH+Xh3h3\n        jwAAf5mczHefAAB8yJycyZ8AAH/MjJnMzwAAf3zMeJmPAAB/iIiIiY8AAH93h3h3jwAAf3eHeHePAAB/\n        iIiIgAAAAH/////39wAAf/////dwAAB3d3d3dwAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMAB\n        AADAAQAAwAEAAMABAADAAQAAwAEAAMADAADABwAAwA8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAA\n        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD/\n        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAHiIiIiIiIiIiIiIiIAAAAB///////////\n        ////+AAAAAf///////////////gAAAAH///////////////4AAAAB///////////////+AAAAAf/////\n        //////////gAAAAH/4iIiIiIiIiIGP/4AAAAB/8YeHh4eHh4eBj/+AAAAAf/x4eIh4eIh4cY//gAAAAH\n        /8F4cXh4eHFxeP/4AAAAB/+Mh4GHjMiBEYj/+AAAAAf/fBhxGMzMcRF4//gAAAAH/4wYGBzIjMiBiP/4\n        AAAAB/98cRh8eHjIeHj/+AAAAAf/jMEYjIeIzMeI//gAAAAH/3jIGMwYeBjMyP/4AAAAB/+HzIjHF4gX\n        h4j/+AAAAAf/eHzMyHF4GHh4//gAAAAH/4iIiIiBgYiIiP/4AAAAB/94eHh4eBF4eHj/+AAAAAf/h4eI\n        h4cRh4eI//gAAAAH/3h4eHh4cXh4eP/4AAAAB/+Hh4iHh4iHh4j/+AAAAAf/eHh4eHh4eHh4//gAAAAH\n        /4iIiIiIiIiIcAAAAAAAB////////////3/4cAAAAAf///////////9/hwAAAAAH////////////eHAA\n        AAAAB////////////3cAAAAAAAf///////////9wAAAAAAAHd3d3d3d3d3d3cAAAAADgAAAH4AAAB+AA\n        AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA\n        AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAA/gAAAf4AAAP+AAAH/gAAD/4AAB/w==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "Chapters/Old/spctrum/Graph/GraphForm2.cs",
    "content": "﻿using System;\nusing System.Drawing;\nusing System.Collections;\nusing System.ComponentModel;\nusing System.Windows.Forms;\n\nusing Wave;\n\nnamespace Graph\n{\n\t/// <summary>\n\t/// WaveForm の概要の説明です。\n\t/// </summary>\n\tpublic class GraphForm2 : System.Windows.Forms.Form\n\t{\n\t\t/// <summary>\n\t\t/// 必要なデザイナ変数です。\n\t\t/// </summary>\n\t\tprivate System.ComponentModel.Container components = null;\n\n\t\t#region 手動行進用領域\n\t\tGraph graphL = new Graph();\n\t\tGraph graphR = new Graph();\n\n\t\tpublic Graph GraphL\n\t\t{\n\t\t\tget{return this.graphL;}\n\t\t}\n\n\t\tpublic Graph GraphR\n\t\t{\n\t\t\tget{return this.graphR;}\n\t\t}\n\n\t\tpublic void ResizeGraph()\n\t\t{\n\t\t\tthis.graphL.Left   = 0;\n\t\t\tthis.graphL.Width  = this.ClientSize.Width;\n\t\t\tthis.graphL.Top    = 0;\n\t\t\tthis.graphL.Height = this.ClientSize.Height / 2;\n\n\t\t\tthis.graphR.Left   = 0;\n\t\t\tthis.graphR.Width  = this.ClientSize.Width;\n\t\t\tthis.graphR.Top    = this.ClientSize.Height / 2 + 1;\n\t\t\tthis.graphR.Height = this.ClientSize.Height / 2;\n\t\t}\n\t\t#endregion\n\n\t\tpublic GraphForm2()\n\t\t{\n\t\t\tInitializeComponent();\n\n\t\t\tthis.graphL = new Graph();\n\t\t\tthis.graphR = new Graph();\n\n\t\t\tthis.ResizeGraph();\n\t\t\tthis.Controls.AddRange(new System.Windows.Forms.Control[] {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.graphL,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tthis.graphR});\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 使用されているリソースに後処理を実行します。\n\t\t/// </summary>\n\t\tprotected override void Dispose( bool disposing )\n\t\t{\n\t\t\tif( disposing )\n\t\t\t{\n\t\t\t\tif(components != null)\n\t\t\t\t{\n\t\t\t\t\tcomponents.Dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.Dispose( disposing );\n\t\t}\n\n\t\t#region Windows Form Designer generated code\n\t\t/// <summary>\n\t\t/// デザイナ サポートに必要なメソッドです。このメソッドの内容を\n\t\t/// コード エディタで変更しないでください。\n\t\t/// </summary>\n\t\tprivate void InitializeComponent()\n\t\t{\n\t\t\tSystem.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(GraphForm2));\n\t\t\t// \n\t\t\t// GraphForm2\n\t\t\t// \n\t\t\tthis.AutoScaleBaseSize = new System.Drawing.Size(5, 12);\n\t\t\tthis.ClientSize = new System.Drawing.Size(292, 273);\n\t\t\tthis.Icon = ((System.Drawing.Icon)(resources.GetObject(\"$this.Icon\")));\n\t\t\tthis.Name = \"GraphForm2\";\n\t\t\tthis.Resize += new System.EventHandler(this.WaveForm_Resize);\n\n\t\t}\n\t\t#endregion\n\n\t\tprivate void WaveForm_Resize(object sender, System.EventArgs e)\n\t\t{\n\t\t\tthis.ResizeGraph();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/Old/spctrum/Graph/GraphForm2.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n            Microsoft ResX Schema \n        \n            Version 1.3\n                \n            The primary goals of this format is to allow a simple XML format \n            that is mostly human readable. The generation and parsing of the \n            various data types are done through the TypeConverter classes \n            associated with the data types.\n        \n            Example:\n        \n                ... ado.net/XML headers & schema ...\n                <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n                <resheader name=\"version\">1.3</resheader>\n                <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n                <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n                <data name=\"Name1\">this is my long string</data>\n                <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n                <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n                    [base64 mime encoded serialized .NET Framework object]\n                </data>\n                <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n                    [base64 mime encoded string representing a byte array form of the .NET Framework object]\n                </data>\n        \n            There are any number of \"resheader\" rows that contain simple \n            name/value pairs.\n            \n            Each data row contains a name, and value. The row also contains a \n            type or mimetype. Type corresponds to a .NET class that support \n            text/value conversion through the TypeConverter architecture. \n            Classes that don't support this are serialized and stored with the \n            mimetype set.\n                     \n            The mimetype is used for serialized objects, and tells the \n            ResXResourceReader how to depersist the object. This is currently not \n            extensible. For a given mimetype the value must be set accordingly:\n        \n            Note - application/x-microsoft.net.object.binary.base64 is the format \n                   that the ResXResourceWriter will generate, however the reader can \n                   read any of the formats listed below.\n        \n            mimetype: application/x-microsoft.net.object.binary.base64\n            value   : The object must be serialized with \n                    : System.Serialization.Formatters.Binary.BinaryFormatter\n                    : and then encoded with base64 encoding.\n        \n            mimetype: application/x-microsoft.net.object.soap.base64\n            value   : The object must be serialized with \n                    : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n                    : and then encoded with base64 encoding.\n            mimetype: application/x-microsoft.net.object.bytearray.base64\n            value   : The object must be serialized into a byte array \n                    : using a System.ComponentModel.TypeConverter\n                    : and then encoded with base64 encoding.\n        -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>1.3</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"$this.Name\">\n    <value>GraphForm2</value>\n  </data>\n  <data name=\"$this.Icon\" type=\"System.Drawing.Icon, System.Drawing, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n    <value>\n        AAABAAIAEBAQAAAAAAAoAQAAJgAAACAgEAAAAAAA6AIAAE4BAAAoAAAAEAAAACAAAAABAAQAAAAAAIAA\n        AAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/\n        AAAA//8A/wAAAP8A/wD//wAA////AAAAAAAAAAAAAH///////wAAf///////AAB/iIiIiI8AAH+Xh3h3\n        jwAAf5mczHefAAB8yJycyZ8AAH/MjJnMzwAAf3zMeJmPAAB/iIiIiY8AAH93h3h3jwAAf3eHeHePAAB/\n        iIiIgAAAAH/////39wAAf/////dwAAB3d3d3dwAAwAEAAMABAADAAQAAwAEAAMABAADAAQAAwAEAAMAB\n        AADAAQAAwAEAAMABAADAAQAAwAEAAMADAADABwAAwA8AACgAAAAgAAAAQAAAAAEABAAAAAAAAAIAAAAA\n        AAAAAAAAEAAAABAAAAAAAAAAAACAAACAAAAAgIAAgAAAAIAAgACAgAAAgICAAMDAwAAAAP8AAP8AAAD/\n        /wD/AAAA/wD/AP//AAD///8AAAAAAAAAAAAAAAAAAAAAAAAHiIiIiIiIiIiIiIiIAAAAB///////////\n        ////+AAAAAf///////////////gAAAAH///////////////4AAAAB///////////////+AAAAAf/////\n        //////////gAAAAH/4iIiIiIiIiIGP/4AAAAB/8YeHh4eHh4eBj/+AAAAAf/x4eIh4eIh4cY//gAAAAH\n        /8F4cXh4eHFxeP/4AAAAB/+Mh4GHjMiBEYj/+AAAAAf/fBhxGMzMcRF4//gAAAAH/4wYGBzIjMiBiP/4\n        AAAAB/98cRh8eHjIeHj/+AAAAAf/jMEYjIeIzMeI//gAAAAH/3jIGMwYeBjMyP/4AAAAB/+HzIjHF4gX\n        h4j/+AAAAAf/eHzMyHF4GHh4//gAAAAH/4iIiIiBgYiIiP/4AAAAB/94eHh4eBF4eHj/+AAAAAf/h4eI\n        h4cRh4eI//gAAAAH/3h4eHh4cXh4eP/4AAAAB/+Hh4iHh4iHh4j/+AAAAAf/eHh4eHh4eHh4//gAAAAH\n        /4iIiIiIiIiIcAAAAAAAB////////////3/4cAAAAAf///////////9/hwAAAAAH////////////eHAA\n        AAAAB////////////3cAAAAAAAf///////////9wAAAAAAAHd3d3d3d3d3d3cAAAAADgAAAH4AAAB+AA\n        AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AA\n        AAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAAfgAAAH4AAAB+AAAA/gAAAf4AAAP+AAAH/gAAD/4AAB/w==\n</value>\n  </data>\n</root>"
  },
  {
    "path": "Chapters/Old/spctrum/Spectrum.csproj",
    "content": "<VisualStudioProject>\n    <CSHARP\n        ProjectType = \"Local\"\n        ProductVersion = \"7.0.9466\"\n        SchemaVersion = \"1.0\"\n        ProjectGuid = \"{71167ED2-CCDF-4740-A43B-E07AB721BA77}\"\n    >\n        <Build>\n            <Settings\n                ApplicationIcon = \"resource\\App.ico\"\n                AssemblyKeyContainerName = \"\"\n                AssemblyName = \"Spectrum\"\n                AssemblyOriginatorKeyFile = \"\"\n                DefaultClientScript = \"JScript\"\n                DefaultHTMLPageLayout = \"Grid\"\n                DefaultTargetSchema = \"IE50\"\n                DelaySign = \"false\"\n                OutputType = \"WinExe\"\n                RootNamespace = \"\"\n                StartupObject = \"\"\n            >\n                <Config\n                    Name = \"Debug\"\n                    AllowUnsafeBlocks = \"true\"\n                    BaseAddress = \"285212672\"\n                    CheckForOverflowUnderflow = \"false\"\n                    ConfigurationOverrideFile = \"\"\n                    DefineConstants = \"DEBUG;TRACE\"\n                    DocumentationFile = \"\"\n                    DebugSymbols = \"true\"\n                    FileAlignment = \"4096\"\n                    IncrementalBuild = \"true\"\n                    Optimize = \"false\"\n                    OutputPath = \"bin\\Debug\\\"\n                    RegisterForComInterop = \"false\"\n                    RemoveIntegerChecks = \"false\"\n                    TreatWarningsAsErrors = \"false\"\n                    WarningLevel = \"4\"\n                />\n                <Config\n                    Name = \"Release\"\n                    AllowUnsafeBlocks = \"true\"\n                    BaseAddress = \"285212672\"\n                    CheckForOverflowUnderflow = \"false\"\n                    ConfigurationOverrideFile = \"\"\n                    DefineConstants = \"TRACE\"\n                    DocumentationFile = \"\"\n                    DebugSymbols = \"false\"\n                    FileAlignment = \"4096\"\n                    IncrementalBuild = \"false\"\n                    Optimize = \"true\"\n                    OutputPath = \"bin\\Release\\\"\n                    RegisterForComInterop = \"false\"\n                    RemoveIntegerChecks = \"false\"\n                    TreatWarningsAsErrors = \"false\"\n                    WarningLevel = \"4\"\n                />\n            </Settings>\n            <References>\n                <Reference\n                    Name = \"System\"\n                    AssemblyName = \"System\"\n                    HintPath = \"..\\..\\..\\..\\..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.dll\"\n                />\n                <Reference\n                    Name = \"System.Data\"\n                    AssemblyName = \"System.Data\"\n                    HintPath = \"..\\..\\..\\..\\..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.Data.dll\"\n                />\n                <Reference\n                    Name = \"System.XML\"\n                    AssemblyName = \"System.Xml\"\n                    HintPath = \"..\\..\\..\\..\\..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.XML.dll\"\n                />\n                <Reference\n                    Name = \"fft\"\n                    AssemblyName = \"fft\"\n                    HintPath = \"fft\\fft.dll\"\n                />\n                <Reference\n                    Name = \"System.Drawing\"\n                    AssemblyName = \"System.Drawing\"\n                    HintPath = \"..\\..\\..\\..\\..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.Drawing.dll\"\n                />\n                <Reference\n                    Name = \"System.Windows.Forms\"\n                    AssemblyName = \"System.Windows.Forms\"\n                    HintPath = \"..\\..\\..\\..\\..\\..\\WINDOWS\\Microsoft.NET\\Framework\\v1.0.3705\\System.Windows.Forms.dll\"\n                />\n            </References>\n        </Build>\n        <Files>\n            <Include>\n                <File\n                    RelPath = \"AssemblyInfo.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"Class1.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"AppMain\\AppSettings.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"AppMain\\MainForm.cs\"\n                    SubType = \"Form\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"AppMain\\MainForm.resx\"\n                    DependentUpon = \"MainForm.cs\"\n                    BuildAction = \"EmbeddedResource\"\n                />\n                <File\n                    RelPath = \"AppMain\\WaveGraphForm.cs\"\n                    SubType = \"Form\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"AppMain\\WaveGraphForm.resx\"\n                    DependentUpon = \"WaveGraphForm.cs\"\n                    BuildAction = \"EmbeddedResource\"\n                />\n                <File\n                    RelPath = \"AppMain\\WaveLoadForm.cs\"\n                    SubType = \"Form\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"AppMain\\WaveLoadForm.resx\"\n                    DependentUpon = \"WaveLoadForm.cs\"\n                    BuildAction = \"EmbeddedResource\"\n                />\n                <File\n                    RelPath = \"AppMain\\WaveSaveForm.cs\"\n                    SubType = \"Form\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"AppMain\\WaveSaveForm.resx\"\n                    DependentUpon = \"WaveSaveForm.cs\"\n                    BuildAction = \"EmbeddedResource\"\n                />\n                <File\n                    RelPath = \"Filter\\CircularBuffer.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"Filter\\Connector.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"Filter\\Filter.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"Filter\\Fir.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"Filter\\Iir.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"Graph\\Graph.cs\"\n                    SubType = \"UserControl\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"Graph\\Graph.resx\"\n                    DependentUpon = \"Graph.cs\"\n                    BuildAction = \"EmbeddedResource\"\n                />\n                <File\n                    RelPath = \"Graph\\GraphForm.cs\"\n                    SubType = \"Form\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"Graph\\GraphForm.resx\"\n                    DependentUpon = \"GraphForm.cs\"\n                    BuildAction = \"EmbeddedResource\"\n                />\n                <File\n                    RelPath = \"Graph\\GraphForm2.cs\"\n                    SubType = \"Form\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"Graph\\GraphForm2.resx\"\n                    DependentUpon = \"GraphForm2.cs\"\n                    BuildAction = \"EmbeddedResource\"\n                />\n                <File\n                    RelPath = \"resource\\App.ico\"\n                    BuildAction = \"Content\"\n                />\n                <File\n                    RelPath = \"resource\\Graph.ico\"\n                    BuildAction = \"Content\"\n                />\n                <File\n                    RelPath = \"SpectrumAnalysis\\Common.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"SpectrumAnalysis\\Complex.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"SpectrumAnalysis\\Fft.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"SpectrumAnalysis\\Spectrum.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"Wave\\Wave.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"WaveAnalysis\\DataList.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"WaveAnalysis\\WaveAnalyzer.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n                <File\n                    RelPath = \"WaveAnalysis\\WaveData.cs\"\n                    SubType = \"Code\"\n                    BuildAction = \"Compile\"\n                />\n            </Include>\n        </Files>\n    </CSHARP>\n</VisualStudioProject>\n\n"
  },
  {
    "path": "Chapters/Old/spctrum/SpectrumAnalysis/Common.cs",
    "content": "﻿using System;\n\nnamespace SpectrumAnalysis\n{\n\t/// <summary>\n\t/// Spectrum 名前空間内の共通関数群\n\t/// </summary>\n\tclass Common\n\t{\n\t\t/// <summary>\n\t\t/// 周波数を正規化。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">正規化したい周波数</param>\n\t\t/// <param name=\"ws\">サンプリング周波数</param>\n\t\t/// <returns></returns>\n\t\tpublic static double Normalize(double w, double ws)\n\t\t{\n\t\t\treturn 2 * Math.PI / ws * w;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 周波数を正規化。\n\t\t/// サンプリング周波数は 48000Hz。\n\t\t/// </summary>\n\t\t/// <param name=\"w\">正規化したい周波数</param>\n\t\t/// <returns></returns>\n\t\tpublic static double Normalize(double w)\n\t\t{\n\t\t\treturn Normalize(w, 48000);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 複素数の絶対値(パワーのdB値)を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"re\">実部</param>\n\t\t/// <param name=\"im\">虚部</param>\n\t\t/// <returns>パワーのdB値</returns>\n\t\tpublic static double Amp(double re, double im)\n\t\t{\n\t\t\treturn 10 * Math.Log10(re*re + im*im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 絶対値(パワーのdB値)を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"re\">リニア値</param>\n\t\t/// <returns>パワーのdB値</returns>\n\t\tpublic static double Amp(double re)\n\t\t{\n\t\t\treturn 20 * Math.Log10(Math.Abs(re));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 複素数の偏角を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"re\">実部</param>\n\t\t/// <param name=\"im\">虚部</param>\n\t\t/// <returns>偏角</returns>\n\t\tpublic static double Phase(double re, double im)\n\t\t{\n\t\t\treturn Math.Atan2(im, re);\n\t\t}\n\t}//class Common\n}"
  },
  {
    "path": "Chapters/Old/spctrum/SpectrumAnalysis/Complex.cs",
    "content": "﻿using System;\n\nnamespace SpectrumAnalysis\n{\n\t/// <summary>\n\t/// 複素数クラス。\n\t/// </summary>\n\tpublic struct Complex\n\t{\n\t\tdouble re; // 実部\n\t\tdouble im; // 虚部\n\n\t\t/// <summary>\n\t\t/// 実部を指定して構築。\n\t\t/// </summary>\n\t\t/// <param name=\"re\">実部</param>\n\t\tpublic Complex(double re) : this(re, 0){}\n\n\t\t/// <summary>\n\t\t/// 実部、虚部を指定して構築。\n\t\t/// </summary>\n\t\t/// <param name=\"re\">実部</param>\n\t\t/// <param name=\"im\">虚部</param>\n\t\tpublic Complex(double re, double im)\n\t\t{\n\t\t\tthis.re = re;\n\t\t\tthis.im = im;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// コピーコンストラクタ。\n\t\t/// </summary>\n\t\t/// <param name=\"z\">コピー元</param>\n\t\tpublic Complex(Complex z)\n\t\t{\n\t\t\tthis.re = z.re;\n\t\t\tthis.im = z.im;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// double → Complex の暗黙の方変換。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">double 値</param>\n\t\t/// <returns>x を Complex 化したもの</returns>\n\t\tpublic static implicit operator Complex(double x)\n\t\t{\n\t\t\treturn new Complex(x);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 実部\n\t\t/// </summary>\n\t\tpublic double Re\n\t\t{\n\t\t\tset{this.re = value;}\n\t\t\tget{return this.re;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 虚部\n\t\t/// </summary>\n\t\tpublic double Im\n\t\t{\n\t\t\tset{this.im = value;}\n\t\t\tget{return this.im;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パワー(絶対値の二乗)のリニア値。\n\t\t/// </summary>\n\t\tpublic double LinearPower\n\t\t{\n\t\t\tget{return this.re * this.re + this.im * this.im;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パワー(絶対値の二乗)の dB 値。\n\t\t/// </summary>\n\t\tpublic double Power\n\t\t{\n\t\t\tget{return 10 * Math.Log10(this.LinearPower);}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 絶対値\n\t\t/// </summary>\n\t\tpublic double Abs\n\t\t{\n\t\t\tget{return Math.Sqrt(this.LinearPower);}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 偏角\n\t\t/// </summary>\n\t\tpublic double Arg\n\t\t{\n\t\t\tget{return Math.Atan2(this.im, this.re);}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 共役複素数。\n\t\t/// </summary>\n\t\t/// <returns>this の共役</returns>\n\t\tpublic Complex Conjugate()\n\t\t{\n\t\t\treturn new Complex(this.re, -this.im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 逆数。\n\t\t/// </summary>\n\t\t/// <returns>this の逆数</returns>\n\t\tpublic Complex Invert()\n\t\t{\n\t\t\tdouble pow = this.LinearPower;\n\t\t\treturn new Complex(this.re/pow, -this.im/pow);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 単項+。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド</param>\n\t\t/// <returns>+a</returns>\n\t\tpublic static Complex operator+ (Complex a)\n\t\t{\n\t\t\treturn new Complex(a);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 単項-。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">オペランド</param>\n\t\t/// <returns>-a</returns>\n\t\tpublic static Complex operator- (Complex a)\n\t\t{\n\t\t\treturn new Complex(-a.re, -a.im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 加算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>加算結果</returns>\n\t\tpublic static Complex operator+ (Complex a, Complex b)\n\t\t{\n\t\t\tdouble re = a.re + b.re;\n\t\t\tdouble im = a.im + b.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t\tpublic static Complex operator+ (double a, Complex b)\n\t\t{\n\t\t\tdouble re = a + b.re;\n\t\t\tdouble im = b.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t\tpublic static Complex operator+ (Complex a, double b)\n\t\t{\n\t\t\tdouble re = a.re + b;\n\t\t\tdouble im = a.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 減算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>減算結果</returns>\n\t\tpublic static Complex operator- (Complex a, Complex b)\n\t\t{\n\t\t\tdouble re = a.re - b.re;\n\t\t\tdouble im = a.im - b.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t\tpublic static Complex operator- (double a, Complex b)\n\t\t{\n\t\t\tdouble re = a - b.re;\n\t\t\tdouble im = -b.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t\tpublic static Complex operator- (Complex a, double b)\n\t\t{\n\t\t\tdouble re = a.re - b;\n\t\t\tdouble im = a.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 乗算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>乗算結果</returns>\n\t\tpublic static Complex operator* (Complex a, Complex b)\n\t\t{\n\t\t\tdouble re = a.re * b.re - a.im * b.im;\n\t\t\tdouble im = a.im * b.re + a.re * b.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t\tpublic static Complex operator* (double a, Complex b)\n\t\t{\n\t\t\tdouble re = a * b.re;\n\t\t\tdouble im = a * b.im;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t\tpublic static Complex operator* (Complex a, double b)\n\t\t{\n\t\t\tdouble re = a.re * b;\n\t\t\tdouble im = a.im * b;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 除算。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>除算結果</returns>\n\t\tpublic static Complex operator/ (Complex a, Complex b)\n\t\t{\n\t\t\treturn a * b.Invert();\n\t\t}\n\t\tpublic static Complex operator/ (double a, Complex b)\n\t\t{\n\t\t\treturn a * b.Invert();\n\t\t}\n\t\tpublic static Complex operator/ (Complex a, double b)\n\t\t{\n\t\t\tdouble re = a.re / b;\n\t\t\tdouble im = a.im / b;\n\t\t\treturn new Complex(re, im);\n\t\t}\n\t}//class Complex\n}\n"
  },
  {
    "path": "Chapters/Old/spctrum/SpectrumAnalysis/Fft.cs",
    "content": "﻿#define CHECK_LENGTH\n\nusing System;\nusing System.Diagnostics;\nusing FftCpp  = Fft.Fft;\nusing CFftCpp = Fft.CFft;\n\nnamespace SpectrumAnalysis\n{\n\t/// <summary>\n\t/// Managed C++ で作った Fft クラスのラッパー。\n\t/// FFT の動作の詳細は fft\\fft.cpp の方を参照。\n\t/// </summary>\n\tpublic class Fft\n\t{\n\t\tFftCpp fft;\n\n\t\tpublic Fft(int length)\n\t\t{\n\t\t\tCheckLength(length);\n\n\t\t\tfft = new FftCpp(length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フーリエ変換を行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">変換したいデータ</param>\n\t\tunsafe public void Transform(double[] x)\n\t\t{\n\t\t\tfixed(double* px = x)\n\t\t\t{\n\t\t\t\tfft.Transform(1, px);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 逆フーリエ変換を行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">変換したいデータ</param>\n\t\tunsafe public void Invert(double[] x)\n\t\t{\n\t\t\tfixed(double* px = x)\n\t\t\t{\n\t\t\t\tfft.Transform(-1, px);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// len が2のべき乗かどうか調べ、違ったら例外を投げる。\n\t\t/// </summary>\n\t\t/// <param name=\"len\">調べる長さ</param>\n\t\t[Conditional(\"CHECK_LENGTH\")]\n\t\tpublic static void CheckLength(int len)\n\t\t{\n\t\t\tif(!IsPower2(len))\n\t\t\t\tthrow new ArgumentException(\"引数に2のべき乗以外を指定しちゃ駄目\");\n\t\t}\n\n\t\t/// <summary>\n\t\t/// len が2のべき乗かどうか調べる。\n\t\t/// </summary>\n\t\t/// <param name=\"len\">調べる長さ</param>\n\t\t/// <returns>2のべき乗ならtrue</returns>\n\t\tstatic bool IsPower2(int len)\n\t\t{\n\t\t\tif(len < 0)\n\t\t\t\treturn false;\n\n\t\t\twhile(len != 0)\n\t\t\t{\n\t\t\t\tif(len%2 != 0)\n\t\t\t\t\treturn len/2 == 0;\n\t\t\t\tlen /= 2;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t}\n\t}//class Fft\n\n\t/// <summary>\n\t/// Managed C++ で作った Fft クラスのラッパー。\n\t/// FFT の動作の詳細は fft\\fft.cpp の方を参照。\n\t/// </summary>\n\tpublic class CFft\n\t{\n\t\tCFftCpp fft;\n\n\t\tpublic CFft(int length)\n\t\t{\n\t\t\tFft.CheckLength(length);\n\n\t\t\tfft = new CFftCpp(length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// フーリエ変換を行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">変換したいデータ</param>\n\t\tunsafe public void Transform(double[] x)\n\t\t{\n\t\t\tfixed(double* px = x)\n\t\t\t{\n\t\t\t\tfft.Transform(1, px);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 逆フーリエ変換を行う。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">変換したいデータ</param>\n\t\tunsafe public void Invert(double[] x)\n\t\t{\n\t\t\tfixed(double* px = x)\n\t\t\t{\n\t\t\t\tfft.Transform(-1, px);\n\t\t\t}\n\t\t}\n\t}//class CFft\n}//namespace Spectrum\n"
  },
  {
    "path": "Chapters/Old/spctrum/SpectrumAnalysis/Spectrum.cs",
    "content": "﻿using System;\n\nusing Wave;\n\nnamespace SpectrumAnalysis\n{\n\t/// <summary>\n\t/// 周波数特性クラス。\n\t/// </summary>\n\tpublic class Spectrum\n\t{\n\t\tdouble sampleRate; // サンプリングレート\n\t\tdouble[] x; // データ格納領域\n\n\t\tpublic Spectrum(){}\n\n\t\t/// <summary>\n\t\t/// 周波数領域データから作成\n\t\t/// </summary>\n\t\t/// <param name=\"x\">周波数領域データ</param>\n\t\t/// <param name=\"sampleRate\">サンプリングレート</param>\n\t\tpublic Spectrum(double[] x, double sampleRate)\n\t\t{\n\t\t\tthis.x = x;\n\t\t\tthis.sampleRate = sampleRate;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 時間領域データから作成。\n\t\t/// </summary>\n\t\t/// <param name=\"X\">時間領域データ</param>\n\t\t/// <param name=\"sampleRate\">サンプリングレート</param>\n\t\t/// <returns>作成された</returns>\n\t\tpublic static Spectrum FromTimeSequence(double[] x, double sampleRate)\n\t\t{\n\t\t\tif(x == null) return null;\n\t\t\treturn FromTimeSequence(x.Length, x, sampleRate);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 時間領域データから作成。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">データの長さ</param>\n\t\t/// <param name=\"X\">時間領域データ</param>\n\t\t/// <param name=\"sampleRate\">サンプリングレート</param>\n\t\t/// <returns>作成された</returns>\n\t\tpublic static Spectrum FromTimeSequence(int length, double[] x, double sampleRate)\n\t\t{\n\t\t\tif(x == null) return null;\n\n\t\t\tint len = Power2(length);\n\n\t\t\tdouble[] tmp = new double[len];\n\t\t\tfor(int i=0; i<len; ++i) tmp[i] = x[i];\n\t\t\tFft fft = new Fft(len);\n\t\t\tfft.Transform(tmp);\n\t\t\treturn new Spectrum(tmp, sampleRate);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 時間領域データから作成。\n\t\t/// </summary>\n\t\t/// <param name=\"skip\">読み飛ばす長さ</param>\n\t\t/// <param name=\"length\">データの長さ</param>\n\t\t/// <param name=\"X\">時間領域データ</param>\n\t\t/// <param name=\"sampleRate\">サンプリングレート</param>\n\t\t/// <returns>作成された</returns>\n\t\tpublic static Spectrum FromTimeSequence(int skip, int length, double[] x, double sampleRate)\n\t\t{\n\t\t\tif(x == null) return null;\n\n\t\t\tint len = Power2(length);\n\n\t\t\tdouble[] tmp = new double[len];\n\t\t\tfor(int i=0; i<len; ++i) tmp[i] = x[skip + i];\n\t\t\tFft fft = new Fft(len);\n\t\t\tfft.Transform(tmp);\n\t\t\treturn new Spectrum(tmp, sampleRate);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// インスタンスのコピーを作成。\n\t\t/// </summary>\n\t\t/// <returns></returns>\n\t\tpublic Spectrum Clone()\n\t\t{\n\t\t\treturn new Spectrum((double[])this.x.Clone(), this.sampleRate);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// len を超えない最大の2のべきを求める。\n\t\t/// </summary>\n\t\t/// <param name=\"len\"></param>\n\t\t/// <returns></returns>\n\t\tpublic static int Power2(int len)\n\t\t{\n\t\t\tint n = 1;\n\t\t\tfor(; len!=1; len/=2, n*=2);\n\t\t\treturn n;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 周波数領域のデータ数。\n\t\t/// </summary>\n\t\tpublic int Count\n\t\t{\n\t\t\tget{return x.Length/2;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 時間領域のデータ数。\n\t\t/// </summary>\n\t\tpublic int TimeLength\n\t\t{\n\t\t\tget{return x.Length;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// i 番目のデータを複素数値で返す。\n\t\t/// </summary>\n\t\tpublic Complex this[int i]\n\t\t{\n\t\t\tset\n\t\t\t{\n\t\t\t\tif(i == 0) this.x[0] = value.Re;\n\t\t\t\telse if(i == x.Length/2) this.x[1] = value.Re;\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis.x[2*i]   = value.Re;\n\t\t\t\t\tthis.x[2*i+1] = -value.Im;\n\t\t\t\t}\n\t\t\t}\n\t\t\tget\n\t\t\t{\n\t\t\t\tif(i == 0) return this.x[0];\n\t\t\t\telse if(i == x.Length/2) return this.x[1];\n\t\t\t\treturn new Complex(this.x[2*i], -this.x[2*i+1]);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 振幅特性の平均値が0dBになるように正規化\n\t\t/// </summary>\n\t\tpublic void Normalize()\n\t\t{\n\t\t\tdouble level = 0;\n\t\t\tfor(int i=0; i<this.Count; ++i) level += Math.Log(this[i].LinearPower);\n\t\t\tlevel /= 2 * this.Count;\n\t\t\tlevel = Math.Exp(-level);\n\t\t\tfor(int i=0; i<this.Count; ++i) this[i] *= level;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 時系列を返す。\n\t\t/// </summary>\n\t\tpublic double[] TimeSequence\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\tdouble[] x = (double[])this.x.Clone();\n\t\t\t\tFft fft = new Fft(x.Length);\n\t\t\t\tfft.Invert(x);\n\t\t\t\tfor(int i=0; i<x.Length; ++i) x[i] *= 2.0/x.Length;\n\t\t\t\treturn x;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// x をヒルベルト変換する。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">変換元</param>\n\t\t/// <returns>変換後</returns>\n\t\tpublic static double[] HilbertTransform(double[] x)\n\t\t{\n\t\t\tint N = x.Length;\n\t\t\tdouble[] tmp = new double[2*N];\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\ttmp[2*i]         = x[i];\n\t\t\t\ttmp[2*i+1]       = 0;\n\t\t\t}\n\n\t\t\tCFft fft = new CFft(2*N);\n\t\t\tfft.Invert(tmp);\n\n\t\t\ttmp[0] /= 2; tmp[1] /= 2;\n\t\t\ttmp[N] /= 2; tmp[N+1] /= 2;\n\t\t\tfor(int i=N+1; i<2*N; ++i)\n\t\t\t\ttmp[i] = 0;\n\n\t\t\tfft.Transform(tmp);\n\n\t\t\tdouble[] y = new double[x.Length];\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\tx[i] = tmp[2*i]   * 2 / N;\n\t\t\t\ty[i] = tmp[2*i+1] * 2 / N;\n\t\t\t}\n\n\t\t\treturn y;\n\t\t}//HilbertTransform\n\n\t\t/// <summary>\n\t\t/// スペクトル同士の和 A(ω) + B(ω)。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>和</returns>\n\t\tpublic static Spectrum operator+ (Spectrum a, Spectrum b)\n\t\t{\n\t\t\tSpectrum c = a.Clone();\n\t\t\tfor(int i=0; i<a.Count; ++i)\n\t\t\t\tc[i] += b[i];\n\t\t\treturn c;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// スペクトル同士の差 A(ω) - B(ω)。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>差</returns>\n\t\tpublic static Spectrum operator- (Spectrum a, Spectrum b)\n\t\t{\n\t\t\tSpectrum c = a.Clone();\n\t\t\tfor(int i=0; i<a.Count; ++i)\n\t\t\t\tc[i] -= b[i];\n\t\t\treturn c;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// スペクトル同士の積 A(ω) * B(ω)。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>積</returns>\n\t\tpublic static Spectrum operator* (Spectrum a, Spectrum b)\n\t\t{\n\t\t\tSpectrum c = a.Clone();\n\t\t\tfor(int i=0; i<a.Count; ++i)\n\t\t\t\tc[i] *= b[i];\n\t\t\treturn c;\n\t\t}\n\t\tpublic static Spectrum operator* (Spectrum a, double x)\n\t\t{\n\t\t\tSpectrum c = a.Clone();\n\t\t\tfor(int i=0; i<a.Count; ++i)\n\t\t\t\tc[i] *= x;\n\t\t\treturn c;\n\t\t}\n\t\tpublic static Spectrum operator* (double x, Spectrum a)\n\t\t{\n\t\t\treturn a * x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// スペクトル同士の商 A(ω) / B(ω)。\n\t\t/// </summary>\n\t\t/// <param name=\"a\">左オペランド</param>\n\t\t/// <param name=\"b\">右オペランド</param>\n\t\t/// <returns>商</returns>\n\t\tpublic static Spectrum operator/ (Spectrum a, Spectrum b)\n\t\t{\n\t\t\tSpectrum c = a.Clone();\n\t\t\tfor(int i=0; i<a.Count; ++i)\n\t\t\t\tc[i] /= b[i];\n\t\t\treturn c;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// パワースペクトル[dB]を取得。\n\t\t/// </summary>\n\t\tpublic double[] GetPower()\n\t\t{\n\t\t\tdouble[] tmp = new double[this.x.Length / 2];\n\t\t\tfor(int i=0; i<tmp.Length; ++i) tmp[i] = this[i].Power;\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 振幅特性を取得。\n\t\t/// </summary>\n\t\tpublic double[] GetAmplitude()\n\t\t{\n\t\t\tdouble[] tmp = new double[this.x.Length / 2];\n\t\t\tfor(int i=0; i<tmp.Length; ++i) tmp[i] = this[i].Abs;\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データのスムージングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"data\"></param>\n\t\tpublic static void Smooth(double[] data)\n\t\t{\n\t\t\tdouble sum = data[0] + data[1] + data[2];\n\t\t\tdata[0] = sum / 3;\n\t\t\tsum += data[3];\n\t\t\tdata[1] = sum / 4;\n\t\t\tsum += data[4];\n\t\t\tdata[1] = sum / 5;\n\t\t\tint i=3;\n\t\t\tfor(; i<data.Length-2; ++i)\n\t\t\t{\n\t\t\t\tsum -= data[i-3];\n\t\t\t\tsum += data[i+2];\n\t\t\t\tdata[i] = sum / 5;\n\t\t\t}\n\t\t\tsum -= data[i-3];\n\t\t\tdata[i] = sum / 4;\n\t\t\t++i;\n\t\t\tsum -= data[i-3];\n\t\t\tdata[i] = sum / 3;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 位相特性を取得。\n\t\t/// </summary>\n\t\tpublic double[] GetPhase()\n\t\t{\n\t\t\tdouble[] tmp = new double[this.x.Length / 2];\n\t\t\tfor(int i=0; i<tmp.Length; ++i) tmp[i] = this[i].Arg;\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 位相のアンラッピングを行う。\n\t\t/// </summary>\n\t\t/// <param name=\"phase\">位相の入った配列</param>\n\t\tpublic static void Unwrap(double[] phase)\n\t\t{\n\t\t\tdouble tmp = 0;\n\t\t\tdouble prev = phase[0];\n\n\t\t\tfor(int i=1; i<phase.Length; ++i)\n\t\t\t{\n\t\t\t\tdouble dif = phase[i] - prev;\n\t\t\t\tprev = phase[i];\n\t\t\t\tif(dif < -Math.PI) tmp += 2 * Math.PI;\n\t\t\t\tif(dif >  Math.PI) tmp -= 2 * Math.PI;\n\t\t\t\tphase[i] += tmp;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 位相特性を取得。\n\t\t/// </summary>\n\t\tpublic static double[] GetPhaseDalay(double[] phase, double fs)\n\t\t{\n\t\t\tdouble df = fs / phase.Length;\n\t\t\tdouble dw = 2 * Math.PI * df;\n\t\t\tdouble[] tmp = new Double[phase.Length];\n\n\t\t\ttmp[0] = tmp[1] = -phase[1] / dw;\n\t\t\tfor(int i=2; i<tmp.Length; ++i) tmp[i] = -phase[i] / (dw * i);\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 群特性を取得。\n\t\t/// </summary>\n\t\tpublic static double[] GetGroupDalay(double[] phase, double fs)\n\t\t{\n\t\t\tdouble df = fs / phase.Length;\n\t\t\tdouble dw = 2 * Math.PI * df;\n\t\t\tdouble[] tmp = new Double[phase.Length];\n\n\t\t\ttmp[0] = tmp[1] = (phase[1] - phase[0]) / dw;\n\t\t\tint i=2;\n\t\t\tfor(; i<tmp.Length-1; ++i) tmp[i] = (phase[i-1] - phase[i+1]) / (2 * dw);\n\t\t\ttmp[i] = (phase[i-1] - phase[i]) / dw;\n\t\t\treturn tmp;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 最小位相を求める。\n\t\t/// </summary>\n\t\t/// <returns>変換後</returns>\n\t\tpublic double[] GetMinimumPhase()\n\t\t{\n\t\t\tint N = this.x.Length / 2;\n\t\t\tdouble[] tmp = new double[2*N];\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\ttmp[2*i]         = Math.Log(this[i].LinearPower);\n\t\t\t\ttmp[2*i+1]       = 0;\n\t\t\t}\n\n\t\t\tCFft fft = new CFft(2*N);\n\t\t\tfft.Invert(tmp);\n\n\t\t\ttmp[0] /= 2; tmp[1] /= 2;\n\t\t\ttmp[N] /= 2; tmp[N+1] /= 2;\n\t\t\tfor(int i=N+1; i<2*N; ++i)\n\t\t\t\ttmp[i] = 0;\n\n\t\t\tfft.Transform(tmp);\n\n\t\t\tdouble[] y = new double[N];\n\t\t\tfor(int i=0; i<N; ++i)\n\t\t\t{\n\t\t\t\ty[i] = tmp[2*i+1] / N;\n\t\t\t}\n\n\t\t\treturn y;\n\t\t}//HilbertTransform\n\t}//class Spectrum\n}\n"
  },
  {
    "path": "Chapters/Old/spctrum/Wave/Wave.cs",
    "content": "﻿using System;\nusing System.IO;\n\nnamespace Wave\n{\n\t/// <summary>\n\t/// WaveReader/WaveWriter で使う例外クラス。\n\t/// </summary>\n\tpublic class WaveException : Exception\n\t{\n\t\tpublic WaveException(){}\n\t\tpublic WaveException(string message) : base(message) {}\n\t\tpublic WaveException(string message, Exception innerException) : base(message, innerException) {}\n\t}\n\n\t/// <summary>\n\t/// Wave ファイルのフォーマットヘッダ。\n\t/// </summary>\n\tpublic class FormatHeader\n\t{\n\t\tpublic short id;         // データ形式\n\t\tpublic short ch;         // チャネル数\n\t\tpublic int   sampleRate; // サンプリングレート\n\t\tpublic int   dataRate;   // データレート(＝チャネル数×ブロックサイズ)\n\t\tpublic short blockSize;  // ブロックサイズ(＝チャネル数×バイト/チャネル)\n\t\tpublic short sampleBit;  // 1サンプル辺りのビット数\n\n\t\tpublic const bool Stereo = true;\n\t\tpublic const bool Mono   = false;\n\t\tpublic const bool Bit16 = true;\n\t\tpublic const bool Bit8  = false;\n\n\t\tpublic FormatHeader(){}\n\n\t\t/// <summary>\n\t\t/// サンプリングレート等のパラメータからヘッダ作成。\n\t\t/// </summary>\n\t\t/// <param name=\"rate\">サンプリングレート</param>\n\t\t/// <param name=\"stereo\">true ならステレオ、false ならモノラル</param>\n\t\t/// <param name=\"type\">true なら16bit/sample、false なら8bit/sample</param>\n\t\tpublic FormatHeader(int rate, bool stereo, bool type)\n\t\t{\n\t\t\tthis.id         = 1;\n\t\t\tthis.ch         = stereo ? (short)2 : (short)1;\n\t\t\tthis.sampleRate = rate;\n\t\t\tthis.blockSize  = (short)(this.ch * (type ? 2 : 1));\n\t\t\tthis.dataRate   = rate * this.blockSize;\n\t\t\tthis.sampleBit  = type ? (short)16 : (short)8;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// BinaryReader からヘッダ読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\"></param>\n\t\tpublic FormatHeader(BinaryReader reader)\n\t\t{\n\t\t\tReadFromStream(reader);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// BinaryReader からヘッダ読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\"></param>\n\t\tpublic void ReadFromStream(BinaryReader reader)\n\t\t{\n\t\t\tthis.id         = reader.ReadInt16();\n\t\t\tthis.ch         = reader.ReadInt16();\n\t\t\tthis.sampleRate = reader.ReadInt32();\n\t\t\tthis.dataRate   = reader.ReadInt32();\n\t\t\tthis.blockSize  = reader.ReadInt16();\n\t\t\tthis.sampleBit  = reader.ReadInt16();\n\t\t}\n\n\t\tpublic void WriteToStream(BinaryWriter writer)\n\t\t{\n\t\t\twriter.Write(this.id        );\n\t\t\twriter.Write(this.ch        );\n\t\t\twriter.Write(this.sampleRate);\n\t\t\twriter.Write(this.dataRate  );\n\t\t\twriter.Write(this.blockSize );\n\t\t\twriter.Write(this.sampleBit );\n\t\t}\n\t}//class FormatHeader\n\n\t/// <summary>\n\t/// RIFF Wave 形式のファイルから音声データを読み出す。\n\t/// </summary>\n\tpublic class WaveReader : IDisposable\n\t{\n\t\tBinaryReader reader = null;\n\t\tFormatHeader header = null;\n\t\tuint dataLength = 0;\n\n\t\tpublic WaveReader(){}\n\n\t\tpublic WaveReader(string filename)\n\t\t{\n\t\t\tthis.Open(filename);\n\t\t}\n\n\t\tpublic WaveReader(BinaryReader reader)\n\t\t{\n\t\t\tthis.Open(reader);\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tthis.Close();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave ファイルを開く。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">Wave ファイル名</param>\n\t\tpublic void Open(string filename)\n\t\t{\n\t\t\tOpen(new BinaryReader(File.OpenRead(filename)));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave ファイルを開く。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">Wave ファイルを格納したストリーム</param>\n\t\tpublic void Open(BinaryReader reader)\n\t\t{\n\t\t\tif(this.reader != null)\n\t\t\t{\n\t\t\t\tthis.reader.Close();\n\t\t\t}\n\n\t\t\tthis.reader = reader;\n\t\t\tbyte[] buf;\n\n\t\t\tbuf= this.reader.ReadBytes(4);\n\t\t\tif(buf[0] != 'R' || buf[1] != 'I' || buf[2] != 'F' || buf[3] != 'F')\n\t\t\t{\n\t\t\t\tthrow new WaveException(\"このファイルはRIFF形式ではありません。\");\n\t\t\t}\n\n\t\t\tthis.reader.ReadBytes(4); //ファイルサイズ読み飛ばし。\n\n\t\t\tbuf= this.reader.ReadBytes(4);\n\t\t\tif(buf[0] != 'W' || buf[1] != 'A' || buf[2] != 'V' || buf[3] != 'E')\n\t\t\t{\n\t\t\t\tthrow new WaveException(\"このファイルはwave形式ではありません。\");\n\t\t\t}\n\n\t\t\tbuf= this.reader.ReadBytes(4);\n\t\t\tif(buf[0] != 'f' || buf[1] != 'm' || buf[2] != 't' || buf[3] != ' ')\n\t\t\t{\n\t\t\t\tthrow new WaveException(\"fmtタグが見つかりませんでした。\");\n\t\t\t}\n\n\t\t\tint headerLength = this.reader.ReadInt32();\n\t\t\tif(headerLength < 16)\n\t\t\t{\n\t\t\t\tthrow new WaveException(\"ヘッダ長が短すぎます。\");\n\t\t\t}\n\n\t\t\tthis.header = new FormatHeader(this.reader);\n\t\t\tif(header.id != 0x0001)\n\t\t\t{\n\t\t\t\tthrow new WaveException(\"対応していないフォーマットです。\");\n\t\t\t}\n\n\t\t\tif(headerLength != 16)\n\t\t\t{\n\t\t\t\tthis.reader.ReadBytes(headerLength - 16); // ヘッダーの残りの部分読み飛ばし。\n\t\t\t}\n\n\t\t\tbuf= this.reader.ReadBytes(4);\n\t\t\tif(buf[0] != 'd' || buf[1] != 'a' || buf[2] != 't' || buf[3] != 'a')\n\t\t\t{\n\t\t\t\tthrow new WaveException(\"dataタグが見つかりませんでした。\");\n\t\t\t}\n\n\t\t\tthis.dataLength = (uint)(this.reader.ReadUInt32() / this.header.blockSize);\n\t\t}//Open\n\n\t\t/// <summary>\n\t\t/// Wave ファイルを閉じる。\n\t\t/// </summary>\n\t\tpublic void Close()\n\t\t{\n\t\t\tif(reader == null) return;\n\n\t\t\treader.Close();\n\t\t\treader =null;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ヘッダ情報の取得。\n\t\t/// </summary>\n\t\tpublic FormatHeader Header\n\t\t{\n\t\t\tget{return this.header;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 残りのデータ長を帰す。\n\t\t/// </summary>\n\t\tpublic uint Length\n\t\t{\n\t\t\tget{return this.dataLength;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データの読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">読み出すサンプル数。</param>\n\t\t/// <param name=\"l\">左チャネルのデータ格納先。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ格納先。</param>\n\t\t/// <returns>実際に読み出したサンプル数。</returns>\n\t\tpublic int Read(uint length, out double[] l, out double[] r)\n\t\t{\n\t\t\tl = null;\n\t\t\tr = null;\n\t\t\tif(this.reader == null) return 0;\n\n\t\t\tint i = 0;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif(this.header.ch == 1) // モノラル\n\t\t\t\t{\n\t\t\t\t\tl = new double[length];\n\n\t\t\t\t\tif(this.header.sampleBit == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (double)(this.reader.ReadByte() - 128);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(header.sampleBit == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (double)this.reader.ReadInt16();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//モノラル\n\t\t\t\telse if(header.ch == 2) // ステレオ\n\t\t\t\t{\n\t\t\t\t\tl = new double[length];\n\t\t\t\t\tr = new double[length];\n\n\t\t\t\t\tif(header.sampleBit == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (double)(this.reader.ReadByte() - 128);\n\t\t\t\t\t\t\tr[i] = (double)(this.reader.ReadByte() - 128);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(header.sampleBit == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (double)this.reader.ReadInt16();\n\t\t\t\t\t\t\tr[i] = (double)this.reader.ReadInt16();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//ステレオ\n\t\t\t}\n\t\t\tcatch(EndOfStreamException){}\n\t\t\tcatch(IOException){}\n\n\t\t\tthis.dataLength -= (uint)i;\n\t\t\treturn i;\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// データの読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">読み出すサンプル数。</param>\n\t\t/// <param name=\"l\">左チャネルのデータ格納先。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ格納先。</param>\n\t\t/// <returns>実際に読み出したサンプル数。</returns>\n\t\tpublic int Read(uint length, out float[] l, out float[] r)\n\t\t{\n\t\t\tl = null;\n\t\t\tr = null;\n\t\t\tif(this.reader == null) return 0;\n\n\t\t\tint i = 0;\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif(this.header.ch == 1) // モノラル\n\t\t\t\t{\n\t\t\t\t\tl = new float[length];\n\n\t\t\t\t\tif(this.header.sampleBit == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (float)(this.reader.ReadByte() - 128);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(header.sampleBit == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (float)this.reader.ReadInt16();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//モノラル\n\t\t\t\telse if(header.ch == 2) // ステレオ\n\t\t\t\t{\n\t\t\t\t\tl = new float[length];\n\t\t\t\t\tr = new float[length];\n\n\t\t\t\t\tif(header.sampleBit == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (float)(this.reader.ReadByte() - 128);\n\t\t\t\t\t\t\tr[i] = (float)(this.reader.ReadByte() - 128);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(header.sampleBit == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tl[i] = (float)this.reader.ReadInt16();\n\t\t\t\t\t\t\tr[i] = (float)this.reader.ReadInt16();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//ステレオ\n\t\t\t}\n\t\t\tcatch(EndOfStreamException){}\n\t\t\tcatch(IOException){}\n\n\t\t\tthis.dataLength -= (uint)i;\n\t\t\treturn i;\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// データを読み飛ばす。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">読み飛ばす長さ</param>\n\t\t/// <returns>ファイルの末尾まで到達したら false を返す</returns>\n\t\tpublic bool Skip(int length)\n\t\t{\n\t\t\tif(this.reader == null) return false;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif(header.ch == 1) // モノラル\n\t\t\t\t{\n\t\t\t\t\tif(header.sampleBit == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.reader.ReadBytes(length);\n\t\t\t\t\t}\n\n\t\t\t\t\tif(header.sampleBit == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.reader.ReadBytes(length * 2);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(header.ch == 2) // ステレオ\n\t\t\t\t{\n\t\t\t\t\tif(header.sampleBit == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.reader.ReadBytes(length * 2);\n\t\t\t\t\t}\n\t\t\t\t\telse if(header.sampleBit == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.reader.ReadBytes(length * 4);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tcatch(EndOfStreamException)\n\t\t\t{\n\t\t\t\tthis.dataLength = 0;\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.dataLength -= (uint)length;\n\t\t\treturn true;\n\t\t}//Skip\n\t}//class WaveReader\n\n\t/// <summary>\n\t/// RIFF Wave 形式のファイルに音声データを書き込む。\n\t/// </summary>\n\tpublic class WaveWriter : IDisposable\n\t{\n\t\tBinaryWriter writer = null;\n\t\tFormatHeader header = null;\n\t\tuint dataLength = 0;\n\n\t\tpublic WaveWriter(){}\n\n\t\tpublic WaveWriter(string filename, FormatHeader header)\n\t\t{\n\t\t\tthis.Open(filename, header);\n\t\t}\n\n\t\tpublic WaveWriter(BinaryWriter writer, FormatHeader header)\n\t\t{\n\t\t\tthis.Open(writer, header);\n\t\t}\n\n\t\tpublic void Dispose()\n\t\t{\n\t\t\tthis.Close();\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave ファイルを開く。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">Wave ファイル名</param>\n\t\tpublic void Open(string filename, FormatHeader header)\n\t\t{\n\t\t\tOpen(new BinaryWriter(File.OpenWrite(filename)), header);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// Wave ファイルを開く。\n\t\t/// </summary>\n\t\t/// <param name=\"reader\">Wave ファイルを格納したストリーム</param>\n\t\tpublic void Open(BinaryWriter writer, FormatHeader header)\n\t\t{\n\t\t\tif(this.writer != null)\n\t\t\t{\n\t\t\t\tthis.writer.Close();\n\t\t\t}\n\n\t\t\tthis.writer = writer;\n\t\t\tthis.header = header;\n\t\t\tbyte[] buf;\n\n\t\t\tbuf = System.Text.Encoding.ASCII.GetBytes(\"RIFF\");\n\t\t\tthis.writer.Write(buf);\n\n\t\t\tthis.writer.Write((uint)0); //データ長(仮の値を入れておく)\n\n\t\t\tbuf = System.Text.Encoding.ASCII.GetBytes(\"WAVE\");\n\t\t\tthis.writer.Write(buf);\n\n\t\t\tbuf = System.Text.Encoding.ASCII.GetBytes(\"fmt \");\n\t\t\tthis.writer.Write(buf);\n\n\t\t\tthis.writer.Write((uint)16);\n\t\t\tthis.header.WriteToStream(writer);\n\n\t\t\tbuf = System.Text.Encoding.ASCII.GetBytes(\"data\");\n\t\t\tthis.writer.Write(buf);\n\n\t\t\tthis.writer.Write((uint)0); //データ長(仮の値を入れておく)\n\t\t}//Open\n\n\t\t/// <summary>\n\t\t/// Wave ファイルを閉じる。\n\t\t/// </summary>\n\t\tpublic void Close()\n\t\t{\n\t\t\tif(writer == null) return;\n\n\t\t\tuint length = (uint)(this.dataLength * this.header.blockSize);\n\n\t\t\twriter.Seek(40, SeekOrigin.Begin);\n\t\t\twriter.Write(length);\n\n\t\t\twriter.Seek(4, SeekOrigin.Begin);\n\t\t\twriter.Write(length + 36u);\n\n\t\t\twriter.Close();\n\t\t\twriter = null;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データの書き込み。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">書き込むサンプル数。</param>\n\t\t/// <param name=\"l\">左チャネルのデータ。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ。</param>\n\t\t/// <returns>実際に書き込んだサンプル数。</returns>\n\t\tpublic int Write(double[] l, double[] r)\n\t\t{\n\t\t\tif(this.writer == null) return 0;\n\n\t\t\tuint length = (uint)l.Length;\n\t\t\tint i = 0;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif(header.ch == 1) // モノラル\n\t\t\t\t{\n\t\t\t\t\tif(header.sampleBit == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(this.DoubleToByte(l[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(header.sampleBit == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(this.DoubleToShort(l[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//モノラル\n\t\t\t\telse if(header.ch == 2) // ステレオ\n\t\t\t\t{\n\t\t\t\t\tif(header.sampleBit == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(this.DoubleToByte(l[i]));\n\t\t\t\t\t\t\twriter.Write(this.DoubleToByte(r[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(header.sampleBit == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(this.DoubleToShort(l[i]));\n\t\t\t\t\t\t\twriter.Write(this.DoubleToShort(r[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//ステレオ\n\t\t\t}\n\t\t\tcatch(IOException){return 0;}\n\t\n\t\t\tthis.dataLength += (uint)i;\n\t\t\treturn i;\n\t\t}//Write\n\n\t\t/// <summary>\n\t\t/// データの書き込み。\n\t\t/// </summary>\n\t\t/// <param name=\"length\">書き込むサンプル数。</param>\n\t\t/// <param name=\"l\">左チャネルのデータ。</param>\n\t\t/// <param name=\"r\">右チャネルのデータ。</param>\n\t\t/// <returns>実際に書き込んだサンプル数。</returns>\n\t\tpublic int Write(float[] l, float[] r)\n\t\t{\n\t\t\tif(this.writer == null) return 0;\n\n\t\t\tuint length = (uint)l.Length;\n\t\t\tint i = 0;\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tif(header.ch == 1) // モノラル\n\t\t\t\t{\n\t\t\t\t\tif(header.sampleBit == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(this.DoubleToByte(l[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(header.sampleBit == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(this.DoubleToShort(l[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//モノラル\n\t\t\t\telse if(header.ch == 2) // ステレオ\n\t\t\t\t{\n\t\t\t\t\tif(header.sampleBit == 8)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(this.DoubleToByte(l[i]));\n\t\t\t\t\t\t\twriter.Write(this.DoubleToByte(r[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if(header.sampleBit == 16)\n\t\t\t\t\t{\n\t\t\t\t\t\tfor(i=0; i<length; ++i)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\twriter.Write(this.DoubleToShort(l[i]));\n\t\t\t\t\t\t\twriter.Write(this.DoubleToShort(r[i]));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}//ステレオ\n\t\t\t}\n\t\t\tcatch(IOException){return 0;}\n\t\n\t\t\tthis.dataLength += (uint)i;\n\t\t\treturn i;\n\t\t}//Write\n\n\t\t/// <summary>\n\t\t/// double → byte の変換。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">元</param>\n\t\t/// <returns>後</returns>\n\t\tprivate byte DoubleToByte(double x)\n\t\t{\n\t\t\tx += 128;\n\t\t\tif(x < 0) x = 0;\n\t\t\telse if(x > 255) x = 255;\n\t\t\treturn (byte)x;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// double → short の変換。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">元</param>\n\t\t/// <returns>後</returns>\n\t\tprivate short DoubleToShort(double x)\n\t\t{\n\t\t\tif(x < short.MinValue) x = short.MinValue;\n\t\t\telse if(x > short.MaxValue) x = short.MaxValue;\n\t\t\treturn (short)x;\n\t\t}\n\t}//class WaveWriter\n}//namespace Wave\n"
  },
  {
    "path": "Chapters/Old/spctrum/WaveAnalysis/DataList.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Text;\nusing System.Collections;\n\nnamespace WaveAnalysis\n{\n\t/// <summary>\n\t/// データリストの項目。\n\t/// </summary>\n\tpublic class DataItem\n\t{\n\t\tpublic string title;\n\t\tpublic double[] data;\n\n\t\tpublic DataItem(string title, double[] data)\n\t\t{\n\t\t\tthis.title = title;\n\t\t\tthis.data = data;\n\t\t}\n\t}\n\n\t/// <summary>\n\t/// 特性データのリスト。\n\t/// </summary>\n\tpublic class DataList\n\t{\n\t\tArrayList list = new ArrayList();\n\t\tint count = -1;\n\n\t\t/// <summary>\n\t\t/// 項目の追加\n\t\t/// </summary>\n\t\t/// <param name=\"title\">項目名</param>\n\t\t/// <param name=\"data\">データ</param>\n\t\tpublic void Add(string title, double[] data)\n\t\t{\n\t\t\tif(this.count == -1) this.count = data.Length;\n\t\t\telse if(this.count != data.Length) return;\n\n\t\t\tlist.Add(new DataItem(title, data));\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データリストを CSV 形式でファイルに保存。\n\t\t/// </summary>\n\t\t/// <param name=\"writer\">書き込み先</param>\n\t\t/// <param name=\"delim\">区切り文字</param>\n\t\t/// <param name=\"outputTitle\">ヘッダ行を出力するかどうか</param>\n\t\tpublic void Save(StreamWriter writer, char delim, bool outputTitle)\n\t\t{\n\t\t\tif(this.count == -1) return;\n\n\t\t\tif(outputTitle)\n\t\t\t{\n\t\t\t\tint i=0;\n\t\t\t\tfor(; i<list.Count-1; ++i)\n\t\t\t\t{\n\t\t\t\t\twriter.Write(\"{0}{1}\", ((DataItem)this.list[i]).title, delim);\n\t\t\t\t}\n\t\t\t\twriter.Write(\"{0}\\n\", ((DataItem)this.list[i]).title);\n\t\t\t}\n\n\t\t\tfor(int j=0; j<this.count; ++j)\n\t\t\t{\n\t\t\t\tint i=0;\n\t\t\t\tfor(; i<list.Count-1; ++i)\n\t\t\t\t{\n\t\t\t\t\twriter.Write(\"{0}{1}\", ((DataItem)this.list[i]).data[j], delim);\n\t\t\t\t}\n\t\t\t\twriter.Write(\"{0}\\n\", ((DataItem)this.list[i]).data[j]);\n\t\t\t}\n\t\t}//Save\n\n\t\t/// <summary>\n\t\t/// データリストを CSV 形式でファイルに保存。\n\t\t/// </summary>\n\t\t/// <param name=\"writer\">書き込み先</param>\n\t\t/// <param name=\"delim\">区切り文字</param>\n\t\tpublic void Save(StreamWriter writer, char delim)\n\t\t{\n\t\t\tthis.Save(writer, delim, false);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データリストを CSV 形式でファイルに保存。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">出力ファイル名</param>\n\t\t/// <param name=\"delim\">区切り文字</param>\n\t\t/// <param name=\"outputTitle\">ヘッダ行を出力するかどうか</param>\n\t\tpublic void Save(string filename, char delim, bool outputHeader)\n\t\t{\n\t\t\tusing(StreamWriter writer = new StreamWriter(filename, false, Encoding.Default))\n\t\t\t{\n\t\t\t\tthis.Save(writer, delim, outputHeader);\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データリストを CSV 形式でファイルに保存。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">出力ファイル名</param>\n\t\t/// <param name=\"delim\">区切り文字</param>\n\t\tpublic void Save(string filename, char delim)\n\t\t{\n\t\t\tthis.Save(filename, delim, false);\n\t\t}\n\t}//class DataList\n}//namespace WaveAnalysis\n"
  },
  {
    "path": "Chapters/Old/spctrum/WaveAnalysis/WaveAnalyzer.cs",
    "content": "﻿using System;\n\nusing SpectrumAnalysis;\nusing Wave;\n\nnamespace WaveAnalysis\n{\n\t/// <summary>\n\t/// Wave データ格納用クラス。\n\t/// 周波数系列でデータを保持。\n\t/// </summary>\n\tclass WaveFrequency : WaveData\n\t{\n\t\tSpectrum l; // L ch 周波数系列\n\t\tSpectrum r; // R ch 周波数系列\n\n\t\tpublic WaveFrequency(){}\n\n\t\tpublic WaveFrequency(FormatHeader header, Spectrum l, Spectrum r) : base(header)\n\t\t{\n\t\t\tthis.l = l;\n\t\t\tthis.r = r;\n\t\t}\n\n\t\tpublic override double[] TimeL\n\t\t{\n\t\t\tset{this.l = Spectrum.FromTimeSequence(value, this.Header.sampleRate);}\n\t\t\tget{return this.l.TimeSequence;}\n\t\t}\n\n\t\tpublic override double[] TimeR\n\t\t{\n\t\t\tset{this.r = Spectrum.FromTimeSequence(value, this.Header.sampleRate);}\n\t\t\tget{return this.r.TimeSequence;}\n\t\t}\n\n\t\tpublic override Spectrum Left\n\t\t{\n\t\t\tset{this.l = value;}\n\t\t\tget{return this.l;}\n\t\t}\n\n\t\tpublic override Spectrum Right\n\t\t{\n\t\t\tset{this.r = value;}\n\t\t\tget{return this.r;}\n\t\t}\n\t}//class WaveFrequency\n\n\t/// <summary>\n\t/// リファレンス音のタイプ\n\t/// </summary>\n\tpublic enum ReferenceType\n\t{\n\t\tBoth,    // 両 ch 使う\n\t\tLeft,    // L ch だけ使う\n\t\tRight,   // R ch だけ使う\n\t\tReverse, // L,R 逆側 ch を使う\n\t\tCross,   // L が直接音、R がクロストーク音のとき\n\t\t// (L がクロストーク音、R が直接音でも結果は同じ)\n\t\t// a = data.L, b = data.R\n\t\t// c = ref.L,  d = ref.R\n\t\t// [a b][c d]-1              [ac-bd bc-ad]\n\t\t// [b a][d c]   = 1/(c^2-d^2)[bc-ad ac-bd]\n\t\t// ∴\n\t\t// data.L = (ac-bd) / (c^2-d^2)\n\t\t// data.R = (bc-ad) / (c^2-d^2)\n\t}//enum ReferenceType\n\n\t/// <summary>\n\t/// Wave ファイル解析用クラス。\n\t/// </summary>\n\tpublic class WaveAnalyzer\n\t{\n\t\tWaveData data = new WaveTime(); // データ音\n\n\t\t/// <summary>\n\t\t/// データ Wave の取得\n\t\t/// </summary>\n\t\tpublic WaveData Data{get{return this.data;}}\n\n\t\t/// <summary>\n\t\t/// 配列のピーク値を求める。\n\t\t/// </summary>\n\t\t/// <param name=\"x\">配列</param>\n\t\t/// <returns>ピーク値</returns>\n\t\tstatic double GetPeekValue(double[] x)\n\t\t{\n\t\t\tif(x == null) return 0;\n\n\t\t\tdouble peek = 0;\n\t\t\tfor(int i=0; i<x.Length; ++i)\n\t\t\t{\n\t\t\t\tif(Math.Abs(x[i]) > peek) peek = Math.Abs(x[i]);\n\t\t\t}\n\t\t\treturn peek;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 無音区間の長さを求める。\n\t\t/// \n\t\t/// </summary>\n\t\t/// <param name=\"x\">配列</param>\n\t\t/// <param name=\"threshold\">閾値</param>\n\t\t/// <returns>区間長</returns>\n\t\tstatic int GetSilentLength(double[] x, double threshold)\n\t\t{\n\t\t\tif(x == null) return int.MaxValue;\n\n\t\t\tint skip;\n\t\t\tfor(skip=0; skip<x.Length; ++skip)\n\t\t\t{\n\t\t\t\tif(Math.Abs(x[skip]) >= threshold) break;\n\t\t\t}\n\t\t\treturn skip;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 配列をコピー\n\t\t/// </summary>\n\t\t/// <param name=\"src\">コピー元</param>\n\t\t/// <param name=\"index\">コピー開始位置</param>\n\t\t/// <param name=\"length\">コピーする長さ</param>\n\t\t/// <returns></returns>\n\t\tstatic double[] CopyArray(double[] src, int index, int length)\n\t\t{\n\t\t\tdouble[] dst = new double[length];\n\t\t\tfor(int i=0; i<length; ++i) dst[i] = src[i + index];\n\t\t\treturn dst;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// ファイルから Wave データを読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <returns>読み出したデータ</returns>\n\t\tstatic WaveData Read(string filename, int skip, int length)\n\t\t{\n\t\t\tWaveReader reader = null;\n\t\t\tFormatHeader header;\n\t\t\tdouble[] l;\n\t\t\tdouble[] r;\n\n\t\t\tusing(reader = new WaveReader(filename))\n\t\t\t{\n\t\t\t\theader = reader.Header;\n\t\t\t\treader.Skip(skip);\n\t\t\t\treader.Read((uint)length, out l, out r);\n\t\t\t}\n\n\t\t\treturn new WaveTime(header, l, r);\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// ファイルから Wave データを読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <param name=\"threshold\">閾値。この値以下の音は無音とみなす</param>\n\t\t/// <param name=\"relative\">閾値にピーク値からみた相対値を使う</param>\n\t\t/// <returns>読み出したデータ</returns>\n\t\tstatic WaveData Read(\n\t\t\tstring filename, int skip, int length,\n\t\t\tdouble threshold ,bool relative)\n\t\t{\n\t\t\tWaveReader reader = null;\n\t\t\tFormatHeader header;\n\t\t\tdouble[] l;\n\t\t\tdouble[] r;\n\n\t\t\tusing(reader = new WaveReader(filename))\n\t\t\t{\n\t\t\t\theader = reader.Header;\n\t\t\t\treader.Skip(0);\n\t\t\t\treader.Read(reader.Length, out l, out r);\n\t\t\t}\n\n\t\t\tif(relative) threshold *= Math.Max(GetPeekValue(l), GetPeekValue(r));\n\t\t\tskip += Math.Min(GetSilentLength(l, threshold), GetSilentLength(r, threshold));\n\t\t\tif(skip < 0 || skip + length >= l.Length) skip = 0;\n\n\t\t\treturn new WaveTime(header, CopyArray(l, skip, length), CopyArray(r, skip, length));\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// ファイルから Wave データを読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <param name=\"threshold\">閾値。この値以下の音は無音とみなす</param>\n\t\t/// <param name=\"relative\">閾値にピーク値からみた相対値を使う</param>\n\t\t/// <param name=\"type\">リファレンスのタイプ</param>\n\t\t/// <returns>読み出したデータ</returns>\n\t\tstatic WaveData Read(\n\t\t\tstring filename, int skip, int length,\n\t\t\tdouble threshold ,bool relative, ReferenceType type)\n\t\t{\n\t\t\tWaveReader reader = null;\n\t\t\tFormatHeader header;\n\t\t\tdouble[] l;\n\t\t\tdouble[] r;\n\n\t\t\tusing(reader = new WaveReader(filename))\n\t\t\t{\n\t\t\t\theader = reader.Header;\n\n\t\t\t\t// R ch を使いたいのに wave ファイルがモノラルの場合\n\t\t\t\tif(type != ReferenceType.Left && reader.Header.ch == 1)\n\t\t\t\t{\n\t\t\t\t\treturn new WaveTime();\n\t\t\t\t}\n\n\t\t\t\treader.Skip(0);\n\t\t\t\treader.Read(reader.Length, out l, out r);\n\t\t\t}\n\n\t\t\tif(type == ReferenceType.Left)\n\t\t\t{\n\t\t\t\tif(relative) threshold *= GetPeekValue(l);\n\t\t\t\tskip += GetSilentLength(l, threshold);\n\t\t\t}\n\t\t\telse if(type == ReferenceType.Right)\n\t\t\t{\n\t\t\t\tif(relative) threshold *= GetPeekValue(r);\n\t\t\t\tskip += GetSilentLength(r, threshold);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tif(relative) threshold *= Math.Max(GetPeekValue(l), GetPeekValue(r));\n\t\t\t\tskip += Math.Min(GetSilentLength(l, threshold), GetSilentLength(r, threshold));\n\t\t\t}\n\t\t\tif(skip < 0 || skip + length >= l.Length) skip = 0;\n\n\t\t\treturn new WaveTime(header, CopyArray(l, skip, length), CopyArray(r, skip, length));\n\t\t}//Read\n\n\t\t/// <summary>\n\t\t/// データ wave の読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\tpublic void ReadData(string filename, int skip, int length)\n\t\t{\n\t\t\tthis.data = WaveAnalyzer.Read(filename, skip, length);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ wave の読み出し。\n\t\t/// 無音区間の除去を行う。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <param name=\"threshold\">閾値</param>\n\t\t/// <param name=\"relative\">閾値にピーク値から見た相対値を使う</param>\n\t\tpublic void ReadData(string filename, int skip, int length, double threshold, bool relative)\n\t\t{\n\t\t\tthis.data = WaveAnalyzer.Read(filename, skip, length, threshold, relative);\n\t\t}\n\n\t\tstatic void Deconvolute(ref WaveData data, WaveData reference, ReferenceType type, bool isNormalize)\n\t\t{\n\t\t\tdata = data.ToSpectrum();\n\t\t\treference =reference.ToSpectrum();\n\n\t\t\tif(isNormalize)\n\t\t\t{\n\t\t\t\treference.Left.Normalize();\n\t\t\t\treference.Right.Normalize();\n\t\t\t}\n\n\t\t\tswitch(type)\n\t\t\t{\n\t\t\t\tcase ReferenceType.Left:\n\t\t\t\t\tdata.Left /= reference.Left;\n\t\t\t\t\tdata.Right /= reference.Left;\n\t\t\t\t\tbreak;\n\t\t\t\tcase ReferenceType.Right:\n\t\t\t\t\tdata.Left /= reference.Right;\n\t\t\t\t\tdata.Right /= reference.Right;\n\t\t\t\t\tbreak;\n\t\t\t\tcase ReferenceType.Both:\n\t\t\t\t\tdata.Left /= reference.Left;\n\t\t\t\t\tdata.Right /= reference.Right;\n\t\t\t\t\tbreak;\n\t\t\t\tcase ReferenceType.Cross:\n\t\t\t\t\tSpectrum a = data.Left;\n\t\t\t\t\tSpectrum b = data.Right;\n\t\t\t\t\tSpectrum c = reference.Left;\n\t\t\t\t\tSpectrum d = reference.Right;\n\t\t\t\t\tSpectrum det = c*c - d*d;\n\t\t\t\t\tdata.Left  = (a*c - b*d) / det;\n\t\t\t\t\tdata.Right = (b*c - a*d) / det;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// リファレンス wave の読み出し。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <param name=\"type\">リファレンスのタイプ</param>\n\t\t/// <param name=\"isNormalize\">リファレンスの振幅特性を正規化するかどうか</param>\n\t\tpublic void DeconvoluteReference(\n\t\t\tstring filename, int skip, int length,\n\t\t\tReferenceType type, bool isNormalize)\n\t\t{\n\t\t\tWaveData reference = WaveAnalyzer.Read(filename, skip, length);\n\t\t\tDeconvolute(ref this.data, reference, type, isNormalize);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// リファレンス wave の読み出し。\n\t\t/// 無音区間の除去を行う。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\t/// <param name=\"length\">読み込む長さ</param>\n\t\t/// <param name=\"skip\">ファイルの先頭を読み飛ばす長さ</param>\n\t\t/// <param name=\"type\">リファレンスのタイプ</param>\n\t\t/// <param name=\"isNormalize\">リファレンスの振幅特性を正規化するかどうか</param>\n\t\t/// <param name=\"threshold\">閾値</param>\n\t\t/// <param name=\"relative\">閾値にピーク値から見た相対値を使う</param>\n\t\tpublic void DeconvoluteReference(\n\t\t\tstring filename, int skip, int length,\n\t\t\tReferenceType type, bool isNormalize,\n\t\t\tdouble threshold, bool relative)\n\t\t{\n\t\t\tWaveData reference = WaveAnalyzer.Read(filename, skip, length, threshold, relative, type);\n\t\t\tDeconvolute(ref this.data, reference, type, isNormalize);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データ wave の書き込み。\n\t\t/// </summary>\n\t\t/// <param name=\"filename\">ファイル名</param>\n\t\tpublic void WirteData(string filename)\n\t\t{\n\t\t\tusing(WaveWriter writer = new WaveWriter(filename, this.data.Header))\n\t\t\t{\n\t\t\t\twriter.Write(this.data.TimeL, this.data.TimeR);\n\t\t\t}\n\t\t}\n\t}//class WaveAnalyzer\n}//namespace WaveAnalysis\n"
  },
  {
    "path": "Chapters/Old/spctrum/WaveAnalysis/WaveData.cs",
    "content": "﻿using System;\n\nusing SpectrumAnalysis;\nusing Wave;\n\nnamespace WaveAnalysis\n{\n\t/// <summary>\n\t/// Wave データ格納用クラス。\n\t/// </summary>\n\tpublic abstract class WaveData\n\t{\n\t\tFormatHeader header;\n\n\t\tpublic WaveData(){}\n\t\tpublic WaveData(FormatHeader header)\n\t\t{\n\t\t\tthis.header = header;\n\t\t}\n\n\t\tpublic FormatHeader Header{get{return this.header;}}\n\n\t\tpublic abstract double[] TimeL{set; get;}\n\t\tpublic abstract double[] TimeR{set; get;}\n\t\tpublic abstract Spectrum Left{set; get;}\n\t\tpublic abstract Spectrum Right{set; get;}\n\n\t\tpublic Spectrum Middle\n\t\t{\n\t\t\tget{return this.Left + this.Right;}\n\t\t}\n\n\t\tpublic Spectrum Side\n\t\t{\n\t\t\tget{return this.Left - this.Right;}\n\t\t}\n\n\t\tpublic WaveData ToTime()\n\t\t{\n\t\t\treturn new WaveTime(this.header, this.TimeL, this.TimeR);\n\t\t}\n\n\t\tpublic WaveData ToSpectrum()\n\t\t{\n\t\t\treturn new WaveFrequency(this.header, this.Left, this.Right);\n\t\t}\n\n\t\tpublic int Count\n\t\t{\n\t\t\tget{return this.Left.Count - 1;}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// データの特性を取得。\n\t\t/// </summary>\n\t\t/// <param name=\"spectrum\">スペクトル</param>\n\t\t/// <param name=\"type\">特性の種類</param>\n\t\t/// <returns>特性</returns>\n\t\tpublic static double[] GetData(Spectrum spectrum, Property type)\n\t\t{\n\t\t\tswitch(type)\n\t\t\t{\n\t\t\t\tcase Property.Amplitude:\n\t\t\t\t{\n\t\t\t\t\tdouble[] tmp = spectrum.GetPower();\n\t\t\t\t\tSpectrum.Smooth(tmp);\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t\tcase Property.Phase:\n\t\t\t\t{\n\t\t\t\t\tdouble[] tmp = spectrum.GetPhase();\n\t\t\t\t\tSpectrum.Unwrap(tmp);\n\t\t\t\t\tSpectrum.Smooth(tmp);\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t\tcase Property.MinimumPhase:\n\t\t\t\t{\n\t\t\t\t\tdouble[] tmp = spectrum.GetMinimumPhase();\n\t\t\t\t\tSpectrum.Smooth(tmp);\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t\tcase Property.AllPassPhase:\n\t\t\t\t{\n\t\t\t\t\tdouble[] tmp  = spectrum.GetPhase();\n\t\t\t\t\tdouble[] tmp2 = spectrum.GetMinimumPhase();\n\t\t\t\t\tfor(int i=0; i<tmp.Length; ++i) tmp[i] += tmp2[i];\n\t\t\t\t\tSpectrum.Unwrap(tmp);\n\t\t\t\t\tSpectrum.Smooth(tmp);\n\t\t\t\t\treturn tmp;\n\t\t\t\t}\n\t\t\t\tcase Property.PhaseDelay:\n\t\t\t\t{\n\t\t\t\t\tdouble[] tmp = spectrum.GetPhase();\n\t\t\t\t\tSpectrum.Unwrap(tmp);\n\t\t\t\t\tSpectrum.Smooth(tmp);\n\t\t\t\t\treturn Spectrum.GetPhaseDalay(tmp, 48000);\n\t\t\t\t}\n\t\t\t\tcase Property.GroupDelay:\n\t\t\t\t{\n\t\t\t\t\tdouble[] tmp = spectrum.GetPhase();\n\t\t\t\t\tSpectrum.Unwrap(tmp);\n\t\t\t\t\tSpectrum.Smooth(tmp);\n\t\t\t\t\treturn Spectrum.GetGroupDalay(tmp, 48000);\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\treturn spectrum.TimeSequence;\n\t\t\t}\n\t\t}//GetData\n\n\t\t/// <summary>\n\t\t/// データの特性を取得。\n\t\t/// </summary>\n\t\t/// <param name=\"channel\">取得したいチャネル</param>\n\t\t/// <param name=\"type\">取得したい特性</param>\n\t\t/// <returns>特性</returns>\n\t\tpublic double[] GetData(Channel channel, Property type)\n\t\t{\n\t\t\tswitch(channel)\n\t\t\t{\n\t\t\t\tcase Channel.Left:   return GetData(this.Left, type);\n\t\t\t\tcase Channel.Right:  return GetData(this.Right, type);\n\t\t\t\tcase Channel.LR:     return GetData(this.Left / this.Right, type);\n\t\t\t\tcase Channel.RL:     return GetData(this.Right / this.Left, type);\n\t\t\t\tcase Channel.Middle: return GetData(this.Middle, type);\n\t\t\t\tcase Channel.Side:   return GetData(this.Side, type);\n\t\t\t\tcase Channel.MS:     return GetData(this.Middle / this.Side, type);\n\t\t\t\tcase Channel.SM:     return GetData(this.Side / this.Middle, type);\n\t\t\t\tdefault: return null;\n\t\t\t}\n\t\t}//GetData\n\n\t\t/// <summary>\n\t\t/// スペクトルの取得。\n\t\t/// </summary>\n\t\t/// <param name=\"channel\">取得したいチャネル</param>\n\t\t/// <returns>スペクトル</returns>\n\t\tpublic Spectrum GetSpectrum(Channel channel)\n\t\t{\n\t\t\tswitch(channel)\n\t\t\t{\n\t\t\t\tcase Channel.Left:   return this.Left;\n\t\t\t\tcase Channel.Right:  return this.Right;\n\t\t\t\tcase Channel.LR:     return this.Left / this.Right;\n\t\t\t\tcase Channel.RL:     return this.Right / this.Left;\n\t\t\t\tcase Channel.Middle: return this.Middle;\n\t\t\t\tcase Channel.Side:   return this.Side;\n\t\t\t\tcase Channel.MS:     return this.Middle / this.Side;\n\t\t\t\tcase Channel.SM:     return this.Side / this.Middle;\n\t\t\t\tdefault: return null;\n\t\t\t}\n\t\t}//GetSpectrum\n\t}//class Wave\n\n\t/// <summary>\n\t/// Wave データ格納用クラス。\n\t/// 時系列でデータを保持。\n\t/// </summary>\n\tclass WaveTime : WaveData\n\t{\n\t\tdouble[] l;  // L ch 時系列\n\t\tdouble[] r;  // R ch 時系列\n\n\t\tpublic WaveTime(){}\n\n\t\tpublic WaveTime(FormatHeader header, double[] l, double[] r) : base(header)\n\t\t{\n\t\t\tthis.l = l;\n\t\t\tthis.r = r;\n\t\t}\n\n\t\tpublic override double[] TimeL\n\t\t{\n\t\t\tset{this.l = value;}\n\t\t\tget{return this.l;}\n\t\t}\n\n\t\tpublic override double[] TimeR\n\t\t{\n\t\t\tset{this.r = value;}\n\t\t\tget{return this.r;}\n\t\t}\n\n\t\tpublic override Spectrum Left\n\t\t{\n\t\t\tset{this.l = value.TimeSequence;}\n\t\t\tget{return Spectrum.FromTimeSequence(this.l, this.Header.sampleRate);}\n\t\t}\n\n\t\tpublic override Spectrum Right\n\t\t{\n\t\t\tset{this.r = value.TimeSequence;}\n\t\t\tget{return Spectrum.FromTimeSequence(this.r, this.Header.sampleRate);}\n\t\t}\n\t}//class WaveTime\n\n\t/// <summary>\n\t/// チャネルのタイプ。\n\t/// </summary>\n\tpublic enum Channel\n\t{\n\t\tLeft,   // L チャネル\n\t\tRight,  // R チャネル\n\t\tLR,     // Left / Right\n\t\tRL,     // Right / Left\n\t\tMiddle, // M チャネル\n\t\tSide,   // S チャネル\n\t\tMS,     // Middle / Side\n\t\tSM,     // Side / Middle\n\t}\n\n\t/// <summary>\n\t/// 特性のタイプ。\n\t/// </summary>\n\tpublic enum Property\n\t{\n\t\tAmplitude,    // 振幅特性\n\t\tPhase,        // 位相特性\n\t\tPhaseDelay,   // 位相遅延特性\n\t\tGroupDelay,   // 群遅延特性\n\t\tMinimumPhase, // 最小位相特性\n\t\tAllPassPhase, // オールパス位相特性\n\t\tTimeSequence, // 時系列データ\n\t}\n}//namespace WaveAnalysis\n"
  },
  {
    "path": "Chapters/Old/spctrum/fft/Makefile",
    "content": "CL   = \"C:\\Program Files\\Microsoft Visual Studio .NET\\Vc7\\bin\\cl.exe\"\nCLOPTION = /CLR /nologo /c\nLINK = \"C:\\Program Files\\Microsoft Visual Studio .NET\\Vc7\\bin\\link.exe\"\n\nall:fft.dll\n\nfftsg.obj: fftsg.c\n\t$(CL) $(CLOPTION) fftsg.c\n\nfft.obj: fft.cpp\n\t$(CL) $(CLOPTION) fft.cpp\n\nfft.dll: fftsg.obj fft.obj\n\t$(LINK) -dll /out:fft.dll /nologo fftsg.obj fft.obj\n\nclean:\n\trm *.obj\n"
  },
  {
    "path": "Chapters/Old/spctrum/fft/fft.cpp",
    "content": "/*********************************************************************\nfftsg.c ̓e Managed R[h痘p邽߂̃bp[B\nfftsg.c  rdft (ԗ̈̎M̎g) gĂ܂B\n\n[gp@]\nEt[Gϊ\nFft::Fft(length);\nlength: ϊM̒B\n\nFft::Transform(sgn, a);\nsgn: ϊ̕B\n     1 ŏA-1 ŋtB\na  : ϊ̃f[^B\n\nϊÕf[^`́A\nԗ̈̎M\na[k] = x[k];\n(0 <= k < N)\n\nϊ̃f[^`́A\na[0]    :        Re(X[0])\na[1]    : ōg Re(X[N/2])\na[2*i]  : ̎     Re(X[i])\na[2*i+1]: ̋     Im(X[i])\n(0 < i < N/2)\n\nFft::Transform(1, x);\n̋tϊ\nFft::Transform(-1, x);\nfor(int i=0; i<N, ++i)\n  x[i] *= 2/N;\n\nEft[Gϊ\nFft::Fft(length);\nlength: ϊM̒B\n        (a ̒  x ̒2{)\n\nCFft::Transform(sgn, x);\nsgn: ϊ̕B\n     1 ŏA-1 ŋtB\nx  : ϊ̃f[^B\n\nϊÕf[^`́A\na[2*i]  : ̎ Re(x[k])\na[2*i+1]: ̋ Im(x[k])\n(0 <= k < N/2)\n\nϊ̃f[^`́A\na[2*i]  : ̎ Re(X[i])\na[2*i+1]: ̋ Im(X[i])\n(0 < i= < N/2)\n\nCFft::Transform(1, x);\n̋tϊ\nCFft::Transform(-1, x);\nfor(int i=0; i<N, ++i)\n  x[i] *= 2/N;\n\n *********************************************************************/\n\n#using <mscorlib.dll>\nusing namespace System;\n\nextern \"C\"\n{\n\tvoid rdft(int n, int isgn, double *a, int *ip, double *w);\n\tvoid cdft(int n, int isgn, double *a, int *ip, double *w);\n};\n\nnamespace Fft\n{\n\t//==================================================================\n\t// t[GϊNXB\n\t__gc public class Fft\n\t{\n\t\tint length; // FFT ̒\n\t\tdouble* w; // bit reversal p[N̈\n\t\tint* ip;   // sin/cos e[up[N̈\n\n\tpublic:\n\t\tFft(int length)\n\t\t{\n\t\t\tthis->length = length;\n\t\t\tthis->ip = new int[(int)(2 + Math::Ceiling(Math::Sqrt(length / 2)))];\n\t\t\tthis->ip[0] = 0;\n\t\t\tthis->w = new double[length / 2];\n\t\t}\n\n\t\tvoid Transform(int sgn, double* x)\n\t\t{\n\t\t\trdft(this->length, sgn, x, this->ip, this->w);\n\t\t}\n\t};\n\n\t//==================================================================\n\t// ft[GϊNXB\n\t__gc public class CFft\n\t{\n\t\tint length; // FFT ̒\n\t\tdouble* w; // bit reversal p[N̈\n\t\tint* ip;   // sin/cos e[up[N̈\n\n\tpublic:\n\t\tCFft(int length)\n\t\t{\n\t\t\tthis->length = length;\n\t\t\tthis->ip = new int[(int)(2 + Math::Ceiling(Math::Sqrt(length / 2)))];\n\t\t\tthis->ip[0] = 0;\n\t\t\tthis->w = new double[length / 2];\n\t\t}\n\n\t\tvoid Transform(int sgn, double* x)\n\t\t{\n\t\t\tcdft(this->length, sgn, x, this->ip, this->w);\n\t\t}\n\t};\n};\n"
  },
  {
    "path": "Chapters/Old/spctrum/fft/fftsg.c",
    "content": "/*\nFast Fourier/Cosine/Sine Transform\n    dimension   :one\n    data length :power of 2\n    decimation  :frequency\n    radix       :split-radix\n    data        :inplace\n    table       :use\nfunctions\n    cdft: Complex Discrete Fourier Transform\n    rdft: Real Discrete Fourier Transform\n    ddct: Discrete Cosine Transform\n    ddst: Discrete Sine Transform\n    dfct: Cosine Transform of RDFT (Real Symmetric DFT)\n    dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)\nfunction prototypes\n    void cdft(int, int, double *, int *, double *);\n    void rdft(int, int, double *, int *, double *);\n    void ddct(int, int, double *, int *, double *);\n    void ddst(int, int, double *, int *, double *);\n    void dfct(int, double *, double *, int *, double *);\n    void dfst(int, double *, double *, int *, double *);\nmacro definitions\n    USE_CDFT_PTHREADS : default=not defined\n        CDFT_THREADS_BEGIN_N  : must be >= 512, default=8192\n        CDFT_4THREADS_BEGIN_N : must be >= 512, default=65536\n    USE_CDFT_WINTHREADS : default=not defined\n        CDFT_THREADS_BEGIN_N  : must be >= 512, default=32768\n        CDFT_4THREADS_BEGIN_N : must be >= 512, default=524288\n\n\n-------- Complex DFT (Discrete Fourier Transform) --------\n    [definition]\n        <case1>\n            X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n\n        <case2>\n            X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n\n        (notes: sum_j=0^n-1 is a summation from j=0 to n-1)\n    [usage]\n        <case1>\n            ip[0] = 0; // first time only\n            cdft(2*n, 1, a, ip, w);\n        <case2>\n            ip[0] = 0; // first time only\n            cdft(2*n, -1, a, ip, w);\n    [parameters]\n        2*n            :data length (int)\n                        n >= 1, n = power of 2\n        a[0...2*n-1]   :input/output data (double *)\n                        input data\n                            a[2*j] = Re(x[j]), \n                            a[2*j+1] = Im(x[j]), 0<=j<n\n                        output data\n                            a[2*k] = Re(X[k]), \n                            a[2*k+1] = Im(X[k]), 0<=k<n\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n/2-1]   :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            cdft(2*n, -1, a, ip, w);\n        is \n            cdft(2*n, 1, a, ip, w);\n            for (j = 0; j <= 2 * n - 1; j++) {\n                a[j] *= 1.0 / n;\n            }\n        .\n\n\n-------- Real DFT / Inverse of Real DFT --------\n    [definition]\n        <case1> RDFT\n            R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2\n            I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0<k<n/2\n        <case2> IRDFT (excluding scale)\n            a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + \n                   sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + \n                   sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k<n\n    [usage]\n        <case1>\n            ip[0] = 0; // first time only\n            rdft(n, 1, a, ip, w);\n        <case2>\n            ip[0] = 0; // first time only\n            rdft(n, -1, a, ip, w);\n    [parameters]\n        n              :data length (int)\n                        n >= 2, n = power of 2\n        a[0...n-1]     :input/output data (double *)\n                        <case1>\n                            output data\n                                a[2*k] = R[k], 0<=k<n/2\n                                a[2*k+1] = I[k], 0<k<n/2\n                                a[1] = R[n/2]\n                        <case2>\n                            input data\n                                a[2*j] = R[j], 0<=j<n/2\n                                a[2*j+1] = I[j], 0<j<n/2\n                                a[1] = R[n/2]\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/2)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n/2-1]   :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            rdft(n, 1, a, ip, w);\n        is \n            rdft(n, -1, a, ip, w);\n            for (j = 0; j <= n - 1; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\n-------- DCT (Discrete Cosine Transform) / Inverse of DCT --------\n    [definition]\n        <case1> IDCT (excluding scale)\n            C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n\n        <case2> DCT\n            C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k<n\n    [usage]\n        <case1>\n            ip[0] = 0; // first time only\n            ddct(n, 1, a, ip, w);\n        <case2>\n            ip[0] = 0; // first time only\n            ddct(n, -1, a, ip, w);\n    [parameters]\n        n              :data length (int)\n                        n >= 2, n = power of 2\n        a[0...n-1]     :input/output data (double *)\n                        output data\n                            a[k] = C[k], 0<=k<n\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/2)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n*5/4-1] :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            ddct(n, -1, a, ip, w);\n        is \n            a[0] *= 0.5;\n            ddct(n, 1, a, ip, w);\n            for (j = 0; j <= n - 1; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\n-------- DST (Discrete Sine Transform) / Inverse of DST --------\n    [definition]\n        <case1> IDST (excluding scale)\n            S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n\n        <case2> DST\n            S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0<k<=n\n    [usage]\n        <case1>\n            ip[0] = 0; // first time only\n            ddst(n, 1, a, ip, w);\n        <case2>\n            ip[0] = 0; // first time only\n            ddst(n, -1, a, ip, w);\n    [parameters]\n        n              :data length (int)\n                        n >= 2, n = power of 2\n        a[0...n-1]     :input/output data (double *)\n                        <case1>\n                            input data\n                                a[j] = A[j], 0<j<n\n                                a[0] = A[n]\n                            output data\n                                a[k] = S[k], 0<=k<n\n                        <case2>\n                            output data\n                                a[k] = S[k], 0<k<n\n                                a[0] = S[n]\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/2)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n*5/4-1] :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            ddst(n, -1, a, ip, w);\n        is \n            a[0] *= 0.5;\n            ddst(n, 1, a, ip, w);\n            for (j = 0; j <= n - 1; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\n-------- Cosine Transform of RDFT (Real Symmetric DFT) --------\n    [definition]\n        C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n\n    [usage]\n        ip[0] = 0; // first time only\n        dfct(n, a, t, ip, w);\n    [parameters]\n        n              :data length - 1 (int)\n                        n >= 2, n = power of 2\n        a[0...n]       :input/output data (double *)\n                        output data\n                            a[k] = C[k], 0<=k<=n\n        t[0...n/2]     :work area (double *)\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/4)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/4+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n*5/8-1] :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            a[0] *= 0.5;\n            a[n] *= 0.5;\n            dfct(n, a, t, ip, w);\n        is \n            a[0] *= 0.5;\n            a[n] *= 0.5;\n            dfct(n, a, t, ip, w);\n            for (j = 0; j <= n; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\n-------- Sine Transform of RDFT (Real Anti-symmetric DFT) --------\n    [definition]\n        S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n\n    [usage]\n        ip[0] = 0; // first time only\n        dfst(n, a, t, ip, w);\n    [parameters]\n        n              :data length + 1 (int)\n                        n >= 2, n = power of 2\n        a[0...n-1]     :input/output data (double *)\n                        output data\n                            a[k] = S[k], 0<k<n\n                        (a[0] is used for work area)\n        t[0...n/2-1]   :work area (double *)\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/4)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/4+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n*5/8-1] :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            dfst(n, a, t, ip, w);\n        is \n            dfst(n, a, t, ip, w);\n            for (j = 1; j <= n - 1; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\nAppendix :\n    The cos/sin table is recalculated when the larger table required.\n    w[] and ip[] are compatible with all routines.\n*/\n\n\nvoid cdft(int n, int isgn, double *a, int *ip, double *w)\n{\n    void makewt(int nw, int *ip, double *w);\n    void cftfsub(int n, double *a, int *ip, int nw, double *w);\n    void cftbsub(int n, double *a, int *ip, int nw, double *w);\n    int nw;\n    \n    nw = ip[0];\n    if (n > (nw << 2)) {\n        nw = n >> 2;\n        makewt(nw, ip, w);\n    }\n    if (isgn >= 0) {\n        cftfsub(n, a, ip, nw, w);\n    } else {\n        cftbsub(n, a, ip, nw, w);\n    }\n}\n\n\nvoid rdft(int n, int isgn, double *a, int *ip, double *w)\n{\n    void makewt(int nw, int *ip, double *w);\n    void makect(int nc, int *ip, double *c);\n    void cftfsub(int n, double *a, int *ip, int nw, double *w);\n    void cftbsub(int n, double *a, int *ip, int nw, double *w);\n    void rftfsub(int n, double *a, int nc, double *c);\n    void rftbsub(int n, double *a, int nc, double *c);\n    int nw, nc;\n    double xi;\n    \n    nw = ip[0];\n    if (n > (nw << 2)) {\n        nw = n >> 2;\n        makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > (nc << 2)) {\n        nc = n >> 2;\n        makect(nc, ip, w + nw);\n    }\n    if (isgn >= 0) {\n        if (n > 4) {\n            cftfsub(n, a, ip, nw, w);\n            rftfsub(n, a, nc, w + nw);\n        } else if (n == 4) {\n            cftfsub(n, a, ip, nw, w);\n        }\n        xi = a[0] - a[1];\n        a[0] += a[1];\n        a[1] = xi;\n    } else {\n        a[1] = 0.5 * (a[0] - a[1]);\n        a[0] -= a[1];\n        if (n > 4) {\n            rftbsub(n, a, nc, w + nw);\n            cftbsub(n, a, ip, nw, w);\n        } else if (n == 4) {\n            cftbsub(n, a, ip, nw, w);\n        }\n    }\n}\n\n\nvoid ddct(int n, int isgn, double *a, int *ip, double *w)\n{\n    void makewt(int nw, int *ip, double *w);\n    void makect(int nc, int *ip, double *c);\n    void cftfsub(int n, double *a, int *ip, int nw, double *w);\n    void cftbsub(int n, double *a, int *ip, int nw, double *w);\n    void rftfsub(int n, double *a, int nc, double *c);\n    void rftbsub(int n, double *a, int nc, double *c);\n    void dctsub(int n, double *a, int nc, double *c);\n    int j, nw, nc;\n    double xr;\n    \n    nw = ip[0];\n    if (n > (nw << 2)) {\n        nw = n >> 2;\n        makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > nc) {\n        nc = n;\n        makect(nc, ip, w + nw);\n    }\n    if (isgn < 0) {\n        xr = a[n - 1];\n        for (j = n - 2; j >= 2; j -= 2) {\n            a[j + 1] = a[j] - a[j - 1];\n            a[j] += a[j - 1];\n        }\n        a[1] = a[0] - xr;\n        a[0] += xr;\n        if (n > 4) {\n            rftbsub(n, a, nc, w + nw);\n            cftbsub(n, a, ip, nw, w);\n        } else if (n == 4) {\n            cftbsub(n, a, ip, nw, w);\n        }\n    }\n    dctsub(n, a, nc, w + nw);\n    if (isgn >= 0) {\n        if (n > 4) {\n            cftfsub(n, a, ip, nw, w);\n            rftfsub(n, a, nc, w + nw);\n        } else if (n == 4) {\n            cftfsub(n, a, ip, nw, w);\n        }\n        xr = a[0] - a[1];\n        a[0] += a[1];\n        for (j = 2; j < n; j += 2) {\n            a[j - 1] = a[j] - a[j + 1];\n            a[j] += a[j + 1];\n        }\n        a[n - 1] = xr;\n    }\n}\n\n\nvoid ddst(int n, int isgn, double *a, int *ip, double *w)\n{\n    void makewt(int nw, int *ip, double *w);\n    void makect(int nc, int *ip, double *c);\n    void cftfsub(int n, double *a, int *ip, int nw, double *w);\n    void cftbsub(int n, double *a, int *ip, int nw, double *w);\n    void rftfsub(int n, double *a, int nc, double *c);\n    void rftbsub(int n, double *a, int nc, double *c);\n    void dstsub(int n, double *a, int nc, double *c);\n    int j, nw, nc;\n    double xr;\n    \n    nw = ip[0];\n    if (n > (nw << 2)) {\n        nw = n >> 2;\n        makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > nc) {\n        nc = n;\n        makect(nc, ip, w + nw);\n    }\n    if (isgn < 0) {\n        xr = a[n - 1];\n        for (j = n - 2; j >= 2; j -= 2) {\n            a[j + 1] = -a[j] - a[j - 1];\n            a[j] -= a[j - 1];\n        }\n        a[1] = a[0] + xr;\n        a[0] -= xr;\n        if (n > 4) {\n            rftbsub(n, a, nc, w + nw);\n            cftbsub(n, a, ip, nw, w);\n        } else if (n == 4) {\n            cftbsub(n, a, ip, nw, w);\n        }\n    }\n    dstsub(n, a, nc, w + nw);\n    if (isgn >= 0) {\n        if (n > 4) {\n            cftfsub(n, a, ip, nw, w);\n            rftfsub(n, a, nc, w + nw);\n        } else if (n == 4) {\n            cftfsub(n, a, ip, nw, w);\n        }\n        xr = a[0] - a[1];\n        a[0] += a[1];\n        for (j = 2; j < n; j += 2) {\n            a[j - 1] = -a[j] - a[j + 1];\n            a[j] -= a[j + 1];\n        }\n        a[n - 1] = -xr;\n    }\n}\n\n\nvoid dfct(int n, double *a, double *t, int *ip, double *w)\n{\n    void makewt(int nw, int *ip, double *w);\n    void makect(int nc, int *ip, double *c);\n    void cftfsub(int n, double *a, int *ip, int nw, double *w);\n    void rftfsub(int n, double *a, int nc, double *c);\n    void dctsub(int n, double *a, int nc, double *c);\n    int j, k, l, m, mh, nw, nc;\n    double xr, xi, yr, yi;\n    \n    nw = ip[0];\n    if (n > (nw << 3)) {\n        nw = n >> 3;\n        makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > (nc << 1)) {\n        nc = n >> 1;\n        makect(nc, ip, w + nw);\n    }\n    m = n >> 1;\n    yi = a[m];\n    xi = a[0] + a[n];\n    a[0] -= a[n];\n    t[0] = xi - yi;\n    t[m] = xi + yi;\n    if (n > 2) {\n        mh = m >> 1;\n        for (j = 1; j < mh; j++) {\n            k = m - j;\n            xr = a[j] - a[n - j];\n            xi = a[j] + a[n - j];\n            yr = a[k] - a[n - k];\n            yi = a[k] + a[n - k];\n            a[j] = xr;\n            a[k] = yr;\n            t[j] = xi - yi;\n            t[k] = xi + yi;\n        }\n        t[mh] = a[mh] + a[n - mh];\n        a[mh] -= a[n - mh];\n        dctsub(m, a, nc, w + nw);\n        if (m > 4) {\n            cftfsub(m, a, ip, nw, w);\n            rftfsub(m, a, nc, w + nw);\n        } else if (m == 4) {\n            cftfsub(m, a, ip, nw, w);\n        }\n        a[n - 1] = a[0] - a[1];\n        a[1] = a[0] + a[1];\n        for (j = m - 2; j >= 2; j -= 2) {\n            a[2 * j + 1] = a[j] + a[j + 1];\n            a[2 * j - 1] = a[j] - a[j + 1];\n        }\n        l = 2;\n        m = mh;\n        while (m >= 2) {\n            dctsub(m, t, nc, w + nw);\n            if (m > 4) {\n                cftfsub(m, t, ip, nw, w);\n                rftfsub(m, t, nc, w + nw);\n            } else if (m == 4) {\n                cftfsub(m, t, ip, nw, w);\n            }\n            a[n - l] = t[0] - t[1];\n            a[l] = t[0] + t[1];\n            k = 0;\n            for (j = 2; j < m; j += 2) {\n                k += l << 2;\n                a[k - l] = t[j] - t[j + 1];\n                a[k + l] = t[j] + t[j + 1];\n            }\n            l <<= 1;\n            mh = m >> 1;\n            for (j = 0; j < mh; j++) {\n                k = m - j;\n                t[j] = t[m + k] - t[m + j];\n                t[k] = t[m + k] + t[m + j];\n            }\n            t[mh] = t[m + mh];\n            m = mh;\n        }\n        a[l] = t[0];\n        a[n] = t[2] - t[1];\n        a[0] = t[2] + t[1];\n    } else {\n        a[1] = a[0];\n        a[2] = t[0];\n        a[0] = t[1];\n    }\n}\n\n\nvoid dfst(int n, double *a, double *t, int *ip, double *w)\n{\n    void makewt(int nw, int *ip, double *w);\n    void makect(int nc, int *ip, double *c);\n    void cftfsub(int n, double *a, int *ip, int nw, double *w);\n    void rftfsub(int n, double *a, int nc, double *c);\n    void dstsub(int n, double *a, int nc, double *c);\n    int j, k, l, m, mh, nw, nc;\n    double xr, xi, yr, yi;\n    \n    nw = ip[0];\n    if (n > (nw << 3)) {\n        nw = n >> 3;\n        makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > (nc << 1)) {\n        nc = n >> 1;\n        makect(nc, ip, w + nw);\n    }\n    if (n > 2) {\n        m = n >> 1;\n        mh = m >> 1;\n        for (j = 1; j < mh; j++) {\n            k = m - j;\n            xr = a[j] + a[n - j];\n            xi = a[j] - a[n - j];\n            yr = a[k] + a[n - k];\n            yi = a[k] - a[n - k];\n            a[j] = xr;\n            a[k] = yr;\n            t[j] = xi + yi;\n            t[k] = xi - yi;\n        }\n        t[0] = a[mh] - a[n - mh];\n        a[mh] += a[n - mh];\n        a[0] = a[m];\n        dstsub(m, a, nc, w + nw);\n        if (m > 4) {\n            cftfsub(m, a, ip, nw, w);\n            rftfsub(m, a, nc, w + nw);\n        } else if (m == 4) {\n            cftfsub(m, a, ip, nw, w);\n        }\n        a[n - 1] = a[1] - a[0];\n        a[1] = a[0] + a[1];\n        for (j = m - 2; j >= 2; j -= 2) {\n            a[2 * j + 1] = a[j] - a[j + 1];\n            a[2 * j - 1] = -a[j] - a[j + 1];\n        }\n        l = 2;\n        m = mh;\n        while (m >= 2) {\n            dstsub(m, t, nc, w + nw);\n            if (m > 4) {\n                cftfsub(m, t, ip, nw, w);\n                rftfsub(m, t, nc, w + nw);\n            } else if (m == 4) {\n                cftfsub(m, t, ip, nw, w);\n            }\n            a[n - l] = t[1] - t[0];\n            a[l] = t[0] + t[1];\n            k = 0;\n            for (j = 2; j < m; j += 2) {\n                k += l << 2;\n                a[k - l] = -t[j] - t[j + 1];\n                a[k + l] = t[j] - t[j + 1];\n            }\n            l <<= 1;\n            mh = m >> 1;\n            for (j = 1; j < mh; j++) {\n                k = m - j;\n                t[j] = t[m + k] + t[m + j];\n                t[k] = t[m + k] - t[m + j];\n            }\n            t[0] = t[m + mh];\n            m = mh;\n        }\n        a[l] = t[0];\n    }\n    a[0] = 0;\n}\n\n\n/* -------- initializing routines -------- */\n\n\n#include <math.h>\n\nvoid makewt(int nw, int *ip, double *w)\n{\n    void makeipt(int nw, int *ip);\n    int j, nwh, nw0, nw1;\n    double delta, wn4r, wk1r, wk1i, wk3r, wk3i;\n    \n    ip[0] = nw;\n    ip[1] = 1;\n    if (nw > 2) {\n        nwh = nw >> 1;\n        delta = atan(1.0) / nwh;\n        wn4r = cos(delta * nwh);\n        w[0] = 1;\n        w[1] = wn4r;\n        if (nwh == 4) {\n            w[2] = cos(delta * 2);\n            w[3] = sin(delta * 2);\n        } else if (nwh > 4) {\n            makeipt(nw, ip);\n            w[2] = 0.5 / cos(delta * 2);\n            w[3] = 0.5 / cos(delta * 6);\n            for (j = 4; j < nwh; j += 4) {\n                w[j] = cos(delta * j);\n                w[j + 1] = sin(delta * j);\n                w[j + 2] = cos(3 * delta * j);\n                w[j + 3] = -sin(3 * delta * j);\n            }\n        }\n        nw0 = 0;\n        while (nwh > 2) {\n            nw1 = nw0 + nwh;\n            nwh >>= 1;\n            w[nw1] = 1;\n            w[nw1 + 1] = wn4r;\n            if (nwh == 4) {\n                wk1r = w[nw0 + 4];\n                wk1i = w[nw0 + 5];\n                w[nw1 + 2] = wk1r;\n                w[nw1 + 3] = wk1i;\n            } else if (nwh > 4) {\n                wk1r = w[nw0 + 4];\n                wk3r = w[nw0 + 6];\n                w[nw1 + 2] = 0.5 / wk1r;\n                w[nw1 + 3] = 0.5 / wk3r;\n                for (j = 4; j < nwh; j += 4) {\n                    wk1r = w[nw0 + 2 * j];\n                    wk1i = w[nw0 + 2 * j + 1];\n                    wk3r = w[nw0 + 2 * j + 2];\n                    wk3i = w[nw0 + 2 * j + 3];\n                    w[nw1 + j] = wk1r;\n                    w[nw1 + j + 1] = wk1i;\n                    w[nw1 + j + 2] = wk3r;\n                    w[nw1 + j + 3] = wk3i;\n                }\n            }\n            nw0 = nw1;\n        }\n    }\n}\n\n\nvoid makeipt(int nw, int *ip)\n{\n    int j, l, m, m2, p, q;\n    \n    ip[2] = 0;\n    ip[3] = 16;\n    m = 2;\n    for (l = nw; l > 32; l >>= 2) {\n        m2 = m << 1;\n        q = m2 << 3;\n        for (j = m; j < m2; j++) {\n            p = ip[j] << 2;\n            ip[m + j] = p;\n            ip[m2 + j] = p + q;\n        }\n        m = m2;\n    }\n}\n\n\nvoid makect(int nc, int *ip, double *c)\n{\n    int j, nch;\n    double delta;\n    \n    ip[1] = nc;\n    if (nc > 1) {\n        nch = nc >> 1;\n        delta = atan(1.0) / nch;\n        c[0] = cos(delta * nch);\n        c[nch] = 0.5 * c[0];\n        for (j = 1; j < nch; j++) {\n            c[j] = 0.5 * cos(delta * j);\n            c[nc - j] = 0.5 * sin(delta * j);\n        }\n    }\n}\n\n\n/* -------- child routines -------- */\n\n\n#ifdef USE_CDFT_PTHREADS\n#define USE_CDFT_THREADS\n#ifndef CDFT_THREADS_BEGIN_N\n#define CDFT_THREADS_BEGIN_N 8192\n#endif\n#ifndef CDFT_4THREADS_BEGIN_N\n#define CDFT_4THREADS_BEGIN_N 65536\n#endif\n#include <pthread.h>\n#include <stdio.h>\n#include <stdlib.h>\n#define cdft_thread_t pthread_t\n#define cdft_thread_create(thp,func,argp) { \\\n    if (pthread_create(thp, NULL, func, (void *) argp) != 0) { \\\n        fprintf(stderr, \"cdft thread error\\n\"); \\\n        exit(1); \\\n    } \\\n}\n#define cdft_thread_wait(th) { \\\n    if (pthread_join(th, NULL) != 0) { \\\n        fprintf(stderr, \"cdft thread error\\n\"); \\\n        exit(1); \\\n    } \\\n}\n#endif /* USE_CDFT_PTHREADS */\n\n\n#ifdef USE_CDFT_WINTHREADS\n#define USE_CDFT_THREADS\n#ifndef CDFT_THREADS_BEGIN_N\n#define CDFT_THREADS_BEGIN_N 32768\n#endif\n#ifndef CDFT_4THREADS_BEGIN_N\n#define CDFT_4THREADS_BEGIN_N 524288\n#endif\n#include <windows.h>\n#include <stdio.h>\n#include <stdlib.h>\n#define cdft_thread_t HANDLE\n#define cdft_thread_create(thp,func,argp) { \\\n    DWORD thid; \\\n    *(thp) = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) func, (LPVOID) argp, 0, &thid); \\\n    if (*(thp) == 0) { \\\n        fprintf(stderr, \"cdft thread error\\n\"); \\\n        exit(1); \\\n    } \\\n}\n#define cdft_thread_wait(th) { \\\n    WaitForSingleObject(th, INFINITE); \\\n    CloseHandle(th); \\\n}\n#endif /* USE_CDFT_WINTHREADS */\n\n\nvoid cftfsub(int n, double *a, int *ip, int nw, double *w)\n{\n    void bitrv2(int n, int *ip, double *a);\n    void bitrv216(double *a);\n    void bitrv208(double *a);\n    void cftf1st(int n, double *a, double *w);\n    void cftrec4(int n, double *a, int nw, double *w);\n    void cftleaf(int n, int isplt, double *a, int nw, double *w);\n    void cftfx41(int n, double *a, int nw, double *w);\n    void cftf161(double *a, double *w);\n    void cftf081(double *a, double *w);\n    void cftf040(double *a);\n    void cftx020(double *a);\n#ifdef USE_CDFT_THREADS\n    void cftrec4_th(int n, double *a, int nw, double *w);\n#endif /* USE_CDFT_THREADS */\n    \n    if (n > 8) {\n        if (n > 32) {\n            cftf1st(n, a, &w[nw - (n >> 2)]);\n#ifdef USE_CDFT_THREADS\n            if (n > CDFT_THREADS_BEGIN_N) {\n                cftrec4_th(n, a, nw, w);\n            } else \n#endif /* USE_CDFT_THREADS */\n            if (n > 512) {\n                cftrec4(n, a, nw, w);\n            } else if (n > 128) {\n                cftleaf(n, 1, a, nw, w);\n            } else {\n                cftfx41(n, a, nw, w);\n            }\n            bitrv2(n, ip, a);\n        } else if (n == 32) {\n            cftf161(a, &w[nw - 8]);\n            bitrv216(a);\n        } else {\n            cftf081(a, w);\n            bitrv208(a);\n        }\n    } else if (n == 8) {\n        cftf040(a);\n    } else if (n == 4) {\n        cftx020(a);\n    }\n}\n\n\nvoid cftbsub(int n, double *a, int *ip, int nw, double *w)\n{\n    void bitrv2conj(int n, int *ip, double *a);\n    void bitrv216neg(double *a);\n    void bitrv208neg(double *a);\n    void cftb1st(int n, double *a, double *w);\n    void cftrec4(int n, double *a, int nw, double *w);\n    void cftleaf(int n, int isplt, double *a, int nw, double *w);\n    void cftfx41(int n, double *a, int nw, double *w);\n    void cftf161(double *a, double *w);\n    void cftf081(double *a, double *w);\n    void cftb040(double *a);\n    void cftx020(double *a);\n#ifdef USE_CDFT_THREADS\n    void cftrec4_th(int n, double *a, int nw, double *w);\n#endif /* USE_CDFT_THREADS */\n    \n    if (n > 8) {\n        if (n > 32) {\n            cftb1st(n, a, &w[nw - (n >> 2)]);\n#ifdef USE_CDFT_THREADS\n            if (n > CDFT_THREADS_BEGIN_N) {\n                cftrec4_th(n, a, nw, w);\n            } else \n#endif /* USE_CDFT_THREADS */\n            if (n > 512) {\n                cftrec4(n, a, nw, w);\n            } else if (n > 128) {\n                cftleaf(n, 1, a, nw, w);\n            } else {\n                cftfx41(n, a, nw, w);\n            }\n            bitrv2conj(n, ip, a);\n        } else if (n == 32) {\n            cftf161(a, &w[nw - 8]);\n            bitrv216neg(a);\n        } else {\n            cftf081(a, w);\n            bitrv208neg(a);\n        }\n    } else if (n == 8) {\n        cftb040(a);\n    } else if (n == 4) {\n        cftx020(a);\n    }\n}\n\n\nvoid bitrv2(int n, int *ip, double *a)\n{\n    int j, j1, k, k1, l, m, nh, nm;\n    double xr, xi, yr, yi;\n    \n    m = 1;\n    for (l = n >> 2; l > 8; l >>= 2) {\n        m <<= 1;\n    }\n    nh = n >> 1;\n    nm = 4 * m;\n    if (l == 8) {\n        for (k = 0; k < m; k++) {\n            for (j = 0; j < k; j++) {\n                j1 = 4 * j + 2 * ip[m + k];\n                k1 = 4 * k + 2 * ip[m + j];\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nh;\n                k1 += 2;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += 2;\n                k1 += nh;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nh;\n                k1 -= 2;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n            }\n            k1 = 4 * k + 2 * ip[m + k];\n            j1 = k1 + 2;\n            k1 += nh;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 += nm;\n            k1 += 2 * nm;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 += nm;\n            k1 -= nm;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 -= 2;\n            k1 -= nh;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 += nh + 2;\n            k1 += nh + 2;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 -= nh - nm;\n            k1 += 2 * nm - 2;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n        }\n    } else {\n        for (k = 0; k < m; k++) {\n            for (j = 0; j < k; j++) {\n                j1 = 4 * j + ip[m + k];\n                k1 = 4 * k + ip[m + j];\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nh;\n                k1 += 2;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += 2;\n                k1 += nh;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nh;\n                k1 -= 2;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = a[j1 + 1];\n                yr = a[k1];\n                yi = a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n            }\n            k1 = 4 * k + ip[m + k];\n            j1 = k1 + 2;\n            k1 += nh;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 += nm;\n            k1 += nm;\n            xr = a[j1];\n            xi = a[j1 + 1];\n            yr = a[k1];\n            yi = a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n        }\n    }\n}\n\n\nvoid bitrv2conj(int n, int *ip, double *a)\n{\n    int j, j1, k, k1, l, m, nh, nm;\n    double xr, xi, yr, yi;\n    \n    m = 1;\n    for (l = n >> 2; l > 8; l >>= 2) {\n        m <<= 1;\n    }\n    nh = n >> 1;\n    nm = 4 * m;\n    if (l == 8) {\n        for (k = 0; k < m; k++) {\n            for (j = 0; j < k; j++) {\n                j1 = 4 * j + 2 * ip[m + k];\n                k1 = 4 * k + 2 * ip[m + j];\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nh;\n                k1 += 2;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += 2;\n                k1 += nh;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nh;\n                k1 -= 2;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= 2 * nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n            }\n            k1 = 4 * k + 2 * ip[m + k];\n            j1 = k1 + 2;\n            k1 += nh;\n            a[j1 - 1] = -a[j1 - 1];\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            a[k1 + 3] = -a[k1 + 3];\n            j1 += nm;\n            k1 += 2 * nm;\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 += nm;\n            k1 -= nm;\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 -= 2;\n            k1 -= nh;\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 += nh + 2;\n            k1 += nh + 2;\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            j1 -= nh - nm;\n            k1 += 2 * nm - 2;\n            a[j1 - 1] = -a[j1 - 1];\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            a[k1 + 3] = -a[k1 + 3];\n        }\n    } else {\n        for (k = 0; k < m; k++) {\n            for (j = 0; j < k; j++) {\n                j1 = 4 * j + ip[m + k];\n                k1 = 4 * k + ip[m + j];\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nh;\n                k1 += 2;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += 2;\n                k1 += nh;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 += nm;\n                k1 += nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nh;\n                k1 -= 2;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n                j1 -= nm;\n                k1 -= nm;\n                xr = a[j1];\n                xi = -a[j1 + 1];\n                yr = a[k1];\n                yi = -a[k1 + 1];\n                a[j1] = yr;\n                a[j1 + 1] = yi;\n                a[k1] = xr;\n                a[k1 + 1] = xi;\n            }\n            k1 = 4 * k + ip[m + k];\n            j1 = k1 + 2;\n            k1 += nh;\n            a[j1 - 1] = -a[j1 - 1];\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            a[k1 + 3] = -a[k1 + 3];\n            j1 += nm;\n            k1 += nm;\n            a[j1 - 1] = -a[j1 - 1];\n            xr = a[j1];\n            xi = -a[j1 + 1];\n            yr = a[k1];\n            yi = -a[k1 + 1];\n            a[j1] = yr;\n            a[j1 + 1] = yi;\n            a[k1] = xr;\n            a[k1 + 1] = xi;\n            a[k1 + 3] = -a[k1 + 3];\n        }\n    }\n}\n\n\nvoid bitrv216(double *a)\n{\n    double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, \n        x5r, x5i, x7r, x7i, x8r, x8i, x10r, x10i, \n        x11r, x11i, x12r, x12i, x13r, x13i, x14r, x14i;\n    \n    x1r = a[2];\n    x1i = a[3];\n    x2r = a[4];\n    x2i = a[5];\n    x3r = a[6];\n    x3i = a[7];\n    x4r = a[8];\n    x4i = a[9];\n    x5r = a[10];\n    x5i = a[11];\n    x7r = a[14];\n    x7i = a[15];\n    x8r = a[16];\n    x8i = a[17];\n    x10r = a[20];\n    x10i = a[21];\n    x11r = a[22];\n    x11i = a[23];\n    x12r = a[24];\n    x12i = a[25];\n    x13r = a[26];\n    x13i = a[27];\n    x14r = a[28];\n    x14i = a[29];\n    a[2] = x8r;\n    a[3] = x8i;\n    a[4] = x4r;\n    a[5] = x4i;\n    a[6] = x12r;\n    a[7] = x12i;\n    a[8] = x2r;\n    a[9] = x2i;\n    a[10] = x10r;\n    a[11] = x10i;\n    a[14] = x14r;\n    a[15] = x14i;\n    a[16] = x1r;\n    a[17] = x1i;\n    a[20] = x5r;\n    a[21] = x5i;\n    a[22] = x13r;\n    a[23] = x13i;\n    a[24] = x3r;\n    a[25] = x3i;\n    a[26] = x11r;\n    a[27] = x11i;\n    a[28] = x7r;\n    a[29] = x7i;\n}\n\n\nvoid bitrv216neg(double *a)\n{\n    double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, \n        x5r, x5i, x6r, x6i, x7r, x7i, x8r, x8i, \n        x9r, x9i, x10r, x10i, x11r, x11i, x12r, x12i, \n        x13r, x13i, x14r, x14i, x15r, x15i;\n    \n    x1r = a[2];\n    x1i = a[3];\n    x2r = a[4];\n    x2i = a[5];\n    x3r = a[6];\n    x3i = a[7];\n    x4r = a[8];\n    x4i = a[9];\n    x5r = a[10];\n    x5i = a[11];\n    x6r = a[12];\n    x6i = a[13];\n    x7r = a[14];\n    x7i = a[15];\n    x8r = a[16];\n    x8i = a[17];\n    x9r = a[18];\n    x9i = a[19];\n    x10r = a[20];\n    x10i = a[21];\n    x11r = a[22];\n    x11i = a[23];\n    x12r = a[24];\n    x12i = a[25];\n    x13r = a[26];\n    x13i = a[27];\n    x14r = a[28];\n    x14i = a[29];\n    x15r = a[30];\n    x15i = a[31];\n    a[2] = x15r;\n    a[3] = x15i;\n    a[4] = x7r;\n    a[5] = x7i;\n    a[6] = x11r;\n    a[7] = x11i;\n    a[8] = x3r;\n    a[9] = x3i;\n    a[10] = x13r;\n    a[11] = x13i;\n    a[12] = x5r;\n    a[13] = x5i;\n    a[14] = x9r;\n    a[15] = x9i;\n    a[16] = x1r;\n    a[17] = x1i;\n    a[18] = x14r;\n    a[19] = x14i;\n    a[20] = x6r;\n    a[21] = x6i;\n    a[22] = x10r;\n    a[23] = x10i;\n    a[24] = x2r;\n    a[25] = x2i;\n    a[26] = x12r;\n    a[27] = x12i;\n    a[28] = x4r;\n    a[29] = x4i;\n    a[30] = x8r;\n    a[31] = x8i;\n}\n\n\nvoid bitrv208(double *a)\n{\n    double x1r, x1i, x3r, x3i, x4r, x4i, x6r, x6i;\n    \n    x1r = a[2];\n    x1i = a[3];\n    x3r = a[6];\n    x3i = a[7];\n    x4r = a[8];\n    x4i = a[9];\n    x6r = a[12];\n    x6i = a[13];\n    a[2] = x4r;\n    a[3] = x4i;\n    a[6] = x6r;\n    a[7] = x6i;\n    a[8] = x1r;\n    a[9] = x1i;\n    a[12] = x3r;\n    a[13] = x3i;\n}\n\n\nvoid bitrv208neg(double *a)\n{\n    double x1r, x1i, x2r, x2i, x3r, x3i, x4r, x4i, \n        x5r, x5i, x6r, x6i, x7r, x7i;\n    \n    x1r = a[2];\n    x1i = a[3];\n    x2r = a[4];\n    x2i = a[5];\n    x3r = a[6];\n    x3i = a[7];\n    x4r = a[8];\n    x4i = a[9];\n    x5r = a[10];\n    x5i = a[11];\n    x6r = a[12];\n    x6i = a[13];\n    x7r = a[14];\n    x7i = a[15];\n    a[2] = x7r;\n    a[3] = x7i;\n    a[4] = x3r;\n    a[5] = x3i;\n    a[6] = x5r;\n    a[7] = x5i;\n    a[8] = x1r;\n    a[9] = x1i;\n    a[10] = x6r;\n    a[11] = x6i;\n    a[12] = x2r;\n    a[13] = x2i;\n    a[14] = x4r;\n    a[15] = x4i;\n}\n\n\nvoid cftf1st(int n, double *a, double *w)\n{\n    int j, j0, j1, j2, j3, k, m, mh;\n    double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, \n        wd1r, wd1i, wd3r, wd3i;\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, \n        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;\n    \n    mh = n >> 3;\n    m = 2 * mh;\n    j1 = m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[0] + a[j2];\n    x0i = a[1] + a[j2 + 1];\n    x1r = a[0] - a[j2];\n    x1i = a[1] - a[j2 + 1];\n    x2r = a[j1] + a[j3];\n    x2i = a[j1 + 1] + a[j3 + 1];\n    x3r = a[j1] - a[j3];\n    x3i = a[j1 + 1] - a[j3 + 1];\n    a[0] = x0r + x2r;\n    a[1] = x0i + x2i;\n    a[j1] = x0r - x2r;\n    a[j1 + 1] = x0i - x2i;\n    a[j2] = x1r - x3i;\n    a[j2 + 1] = x1i + x3r;\n    a[j3] = x1r + x3i;\n    a[j3 + 1] = x1i - x3r;\n    wn4r = w[1];\n    csc1 = w[2];\n    csc3 = w[3];\n    wd1r = 1;\n    wd1i = 0;\n    wd3r = 1;\n    wd3i = 0;\n    k = 0;\n    for (j = 2; j < mh - 2; j += 4) {\n        k += 4;\n        wk1r = csc1 * (wd1r + w[k]);\n        wk1i = csc1 * (wd1i + w[k + 1]);\n        wk3r = csc3 * (wd3r + w[k + 2]);\n        wk3i = csc3 * (wd3i + w[k + 3]);\n        wd1r = w[k];\n        wd1i = w[k + 1];\n        wd3r = w[k + 2];\n        wd3i = w[k + 3];\n        j1 = j + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j] + a[j2];\n        x0i = a[j + 1] + a[j2 + 1];\n        x1r = a[j] - a[j2];\n        x1i = a[j + 1] - a[j2 + 1];\n        y0r = a[j + 2] + a[j2 + 2];\n        y0i = a[j + 3] + a[j2 + 3];\n        y1r = a[j + 2] - a[j2 + 2];\n        y1i = a[j + 3] - a[j2 + 3];\n        x2r = a[j1] + a[j3];\n        x2i = a[j1 + 1] + a[j3 + 1];\n        x3r = a[j1] - a[j3];\n        x3i = a[j1 + 1] - a[j3 + 1];\n        y2r = a[j1 + 2] + a[j3 + 2];\n        y2i = a[j1 + 3] + a[j3 + 3];\n        y3r = a[j1 + 2] - a[j3 + 2];\n        y3i = a[j1 + 3] - a[j3 + 3];\n        a[j] = x0r + x2r;\n        a[j + 1] = x0i + x2i;\n        a[j + 2] = y0r + y2r;\n        a[j + 3] = y0i + y2i;\n        a[j1] = x0r - x2r;\n        a[j1 + 1] = x0i - x2i;\n        a[j1 + 2] = y0r - y2r;\n        a[j1 + 3] = y0i - y2i;\n        x0r = x1r - x3i;\n        x0i = x1i + x3r;\n        a[j2] = wk1r * x0r - wk1i * x0i;\n        a[j2 + 1] = wk1r * x0i + wk1i * x0r;\n        x0r = y1r - y3i;\n        x0i = y1i + y3r;\n        a[j2 + 2] = wd1r * x0r - wd1i * x0i;\n        a[j2 + 3] = wd1r * x0i + wd1i * x0r;\n        x0r = x1r + x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3r * x0r + wk3i * x0i;\n        a[j3 + 1] = wk3r * x0i - wk3i * x0r;\n        x0r = y1r + y3i;\n        x0i = y1i - y3r;\n        a[j3 + 2] = wd3r * x0r + wd3i * x0i;\n        a[j3 + 3] = wd3r * x0i - wd3i * x0r;\n        j0 = m - j;\n        j1 = j0 + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j0] + a[j2];\n        x0i = a[j0 + 1] + a[j2 + 1];\n        x1r = a[j0] - a[j2];\n        x1i = a[j0 + 1] - a[j2 + 1];\n        y0r = a[j0 - 2] + a[j2 - 2];\n        y0i = a[j0 - 1] + a[j2 - 1];\n        y1r = a[j0 - 2] - a[j2 - 2];\n        y1i = a[j0 - 1] - a[j2 - 1];\n        x2r = a[j1] + a[j3];\n        x2i = a[j1 + 1] + a[j3 + 1];\n        x3r = a[j1] - a[j3];\n        x3i = a[j1 + 1] - a[j3 + 1];\n        y2r = a[j1 - 2] + a[j3 - 2];\n        y2i = a[j1 - 1] + a[j3 - 1];\n        y3r = a[j1 - 2] - a[j3 - 2];\n        y3i = a[j1 - 1] - a[j3 - 1];\n        a[j0] = x0r + x2r;\n        a[j0 + 1] = x0i + x2i;\n        a[j0 - 2] = y0r + y2r;\n        a[j0 - 1] = y0i + y2i;\n        a[j1] = x0r - x2r;\n        a[j1 + 1] = x0i - x2i;\n        a[j1 - 2] = y0r - y2r;\n        a[j1 - 1] = y0i - y2i;\n        x0r = x1r - x3i;\n        x0i = x1i + x3r;\n        a[j2] = wk1i * x0r - wk1r * x0i;\n        a[j2 + 1] = wk1i * x0i + wk1r * x0r;\n        x0r = y1r - y3i;\n        x0i = y1i + y3r;\n        a[j2 - 2] = wd1i * x0r - wd1r * x0i;\n        a[j2 - 1] = wd1i * x0i + wd1r * x0r;\n        x0r = x1r + x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3i * x0r + wk3r * x0i;\n        a[j3 + 1] = wk3i * x0i - wk3r * x0r;\n        x0r = y1r + y3i;\n        x0i = y1i - y3r;\n        a[j3 - 2] = wd3i * x0r + wd3r * x0i;\n        a[j3 - 1] = wd3i * x0i - wd3r * x0r;\n    }\n    wk1r = csc1 * (wd1r + wn4r);\n    wk1i = csc1 * (wd1i + wn4r);\n    wk3r = csc3 * (wd3r - wn4r);\n    wk3i = csc3 * (wd3i - wn4r);\n    j0 = mh;\n    j1 = j0 + m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[j0 - 2] + a[j2 - 2];\n    x0i = a[j0 - 1] + a[j2 - 1];\n    x1r = a[j0 - 2] - a[j2 - 2];\n    x1i = a[j0 - 1] - a[j2 - 1];\n    x2r = a[j1 - 2] + a[j3 - 2];\n    x2i = a[j1 - 1] + a[j3 - 1];\n    x3r = a[j1 - 2] - a[j3 - 2];\n    x3i = a[j1 - 1] - a[j3 - 1];\n    a[j0 - 2] = x0r + x2r;\n    a[j0 - 1] = x0i + x2i;\n    a[j1 - 2] = x0r - x2r;\n    a[j1 - 1] = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    a[j2 - 2] = wk1r * x0r - wk1i * x0i;\n    a[j2 - 1] = wk1r * x0i + wk1i * x0r;\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    a[j3 - 2] = wk3r * x0r + wk3i * x0i;\n    a[j3 - 1] = wk3r * x0i - wk3i * x0r;\n    x0r = a[j0] + a[j2];\n    x0i = a[j0 + 1] + a[j2 + 1];\n    x1r = a[j0] - a[j2];\n    x1i = a[j0 + 1] - a[j2 + 1];\n    x2r = a[j1] + a[j3];\n    x2i = a[j1 + 1] + a[j3 + 1];\n    x3r = a[j1] - a[j3];\n    x3i = a[j1 + 1] - a[j3 + 1];\n    a[j0] = x0r + x2r;\n    a[j0 + 1] = x0i + x2i;\n    a[j1] = x0r - x2r;\n    a[j1 + 1] = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    a[j2] = wn4r * (x0r - x0i);\n    a[j2 + 1] = wn4r * (x0i + x0r);\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    a[j3] = -wn4r * (x0r + x0i);\n    a[j3 + 1] = -wn4r * (x0i - x0r);\n    x0r = a[j0 + 2] + a[j2 + 2];\n    x0i = a[j0 + 3] + a[j2 + 3];\n    x1r = a[j0 + 2] - a[j2 + 2];\n    x1i = a[j0 + 3] - a[j2 + 3];\n    x2r = a[j1 + 2] + a[j3 + 2];\n    x2i = a[j1 + 3] + a[j3 + 3];\n    x3r = a[j1 + 2] - a[j3 + 2];\n    x3i = a[j1 + 3] - a[j3 + 3];\n    a[j0 + 2] = x0r + x2r;\n    a[j0 + 3] = x0i + x2i;\n    a[j1 + 2] = x0r - x2r;\n    a[j1 + 3] = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    a[j2 + 2] = wk1i * x0r - wk1r * x0i;\n    a[j2 + 3] = wk1i * x0i + wk1r * x0r;\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    a[j3 + 2] = wk3i * x0r + wk3r * x0i;\n    a[j3 + 3] = wk3i * x0i - wk3r * x0r;\n}\n\n\nvoid cftb1st(int n, double *a, double *w)\n{\n    int j, j0, j1, j2, j3, k, m, mh;\n    double wn4r, csc1, csc3, wk1r, wk1i, wk3r, wk3i, \n        wd1r, wd1i, wd3r, wd3i;\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, \n        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i;\n    \n    mh = n >> 3;\n    m = 2 * mh;\n    j1 = m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[0] + a[j2];\n    x0i = -a[1] - a[j2 + 1];\n    x1r = a[0] - a[j2];\n    x1i = -a[1] + a[j2 + 1];\n    x2r = a[j1] + a[j3];\n    x2i = a[j1 + 1] + a[j3 + 1];\n    x3r = a[j1] - a[j3];\n    x3i = a[j1 + 1] - a[j3 + 1];\n    a[0] = x0r + x2r;\n    a[1] = x0i - x2i;\n    a[j1] = x0r - x2r;\n    a[j1 + 1] = x0i + x2i;\n    a[j2] = x1r + x3i;\n    a[j2 + 1] = x1i + x3r;\n    a[j3] = x1r - x3i;\n    a[j3 + 1] = x1i - x3r;\n    wn4r = w[1];\n    csc1 = w[2];\n    csc3 = w[3];\n    wd1r = 1;\n    wd1i = 0;\n    wd3r = 1;\n    wd3i = 0;\n    k = 0;\n    for (j = 2; j < mh - 2; j += 4) {\n        k += 4;\n        wk1r = csc1 * (wd1r + w[k]);\n        wk1i = csc1 * (wd1i + w[k + 1]);\n        wk3r = csc3 * (wd3r + w[k + 2]);\n        wk3i = csc3 * (wd3i + w[k + 3]);\n        wd1r = w[k];\n        wd1i = w[k + 1];\n        wd3r = w[k + 2];\n        wd3i = w[k + 3];\n        j1 = j + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j] + a[j2];\n        x0i = -a[j + 1] - a[j2 + 1];\n        x1r = a[j] - a[j2];\n        x1i = -a[j + 1] + a[j2 + 1];\n        y0r = a[j + 2] + a[j2 + 2];\n        y0i = -a[j + 3] - a[j2 + 3];\n        y1r = a[j + 2] - a[j2 + 2];\n        y1i = -a[j + 3] + a[j2 + 3];\n        x2r = a[j1] + a[j3];\n        x2i = a[j1 + 1] + a[j3 + 1];\n        x3r = a[j1] - a[j3];\n        x3i = a[j1 + 1] - a[j3 + 1];\n        y2r = a[j1 + 2] + a[j3 + 2];\n        y2i = a[j1 + 3] + a[j3 + 3];\n        y3r = a[j1 + 2] - a[j3 + 2];\n        y3i = a[j1 + 3] - a[j3 + 3];\n        a[j] = x0r + x2r;\n        a[j + 1] = x0i - x2i;\n        a[j + 2] = y0r + y2r;\n        a[j + 3] = y0i - y2i;\n        a[j1] = x0r - x2r;\n        a[j1 + 1] = x0i + x2i;\n        a[j1 + 2] = y0r - y2r;\n        a[j1 + 3] = y0i + y2i;\n        x0r = x1r + x3i;\n        x0i = x1i + x3r;\n        a[j2] = wk1r * x0r - wk1i * x0i;\n        a[j2 + 1] = wk1r * x0i + wk1i * x0r;\n        x0r = y1r + y3i;\n        x0i = y1i + y3r;\n        a[j2 + 2] = wd1r * x0r - wd1i * x0i;\n        a[j2 + 3] = wd1r * x0i + wd1i * x0r;\n        x0r = x1r - x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3r * x0r + wk3i * x0i;\n        a[j3 + 1] = wk3r * x0i - wk3i * x0r;\n        x0r = y1r - y3i;\n        x0i = y1i - y3r;\n        a[j3 + 2] = wd3r * x0r + wd3i * x0i;\n        a[j3 + 3] = wd3r * x0i - wd3i * x0r;\n        j0 = m - j;\n        j1 = j0 + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j0] + a[j2];\n        x0i = -a[j0 + 1] - a[j2 + 1];\n        x1r = a[j0] - a[j2];\n        x1i = -a[j0 + 1] + a[j2 + 1];\n        y0r = a[j0 - 2] + a[j2 - 2];\n        y0i = -a[j0 - 1] - a[j2 - 1];\n        y1r = a[j0 - 2] - a[j2 - 2];\n        y1i = -a[j0 - 1] + a[j2 - 1];\n        x2r = a[j1] + a[j3];\n        x2i = a[j1 + 1] + a[j3 + 1];\n        x3r = a[j1] - a[j3];\n        x3i = a[j1 + 1] - a[j3 + 1];\n        y2r = a[j1 - 2] + a[j3 - 2];\n        y2i = a[j1 - 1] + a[j3 - 1];\n        y3r = a[j1 - 2] - a[j3 - 2];\n        y3i = a[j1 - 1] - a[j3 - 1];\n        a[j0] = x0r + x2r;\n        a[j0 + 1] = x0i - x2i;\n        a[j0 - 2] = y0r + y2r;\n        a[j0 - 1] = y0i - y2i;\n        a[j1] = x0r - x2r;\n        a[j1 + 1] = x0i + x2i;\n        a[j1 - 2] = y0r - y2r;\n        a[j1 - 1] = y0i + y2i;\n        x0r = x1r + x3i;\n        x0i = x1i + x3r;\n        a[j2] = wk1i * x0r - wk1r * x0i;\n        a[j2 + 1] = wk1i * x0i + wk1r * x0r;\n        x0r = y1r + y3i;\n        x0i = y1i + y3r;\n        a[j2 - 2] = wd1i * x0r - wd1r * x0i;\n        a[j2 - 1] = wd1i * x0i + wd1r * x0r;\n        x0r = x1r - x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3i * x0r + wk3r * x0i;\n        a[j3 + 1] = wk3i * x0i - wk3r * x0r;\n        x0r = y1r - y3i;\n        x0i = y1i - y3r;\n        a[j3 - 2] = wd3i * x0r + wd3r * x0i;\n        a[j3 - 1] = wd3i * x0i - wd3r * x0r;\n    }\n    wk1r = csc1 * (wd1r + wn4r);\n    wk1i = csc1 * (wd1i + wn4r);\n    wk3r = csc3 * (wd3r - wn4r);\n    wk3i = csc3 * (wd3i - wn4r);\n    j0 = mh;\n    j1 = j0 + m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[j0 - 2] + a[j2 - 2];\n    x0i = -a[j0 - 1] - a[j2 - 1];\n    x1r = a[j0 - 2] - a[j2 - 2];\n    x1i = -a[j0 - 1] + a[j2 - 1];\n    x2r = a[j1 - 2] + a[j3 - 2];\n    x2i = a[j1 - 1] + a[j3 - 1];\n    x3r = a[j1 - 2] - a[j3 - 2];\n    x3i = a[j1 - 1] - a[j3 - 1];\n    a[j0 - 2] = x0r + x2r;\n    a[j0 - 1] = x0i - x2i;\n    a[j1 - 2] = x0r - x2r;\n    a[j1 - 1] = x0i + x2i;\n    x0r = x1r + x3i;\n    x0i = x1i + x3r;\n    a[j2 - 2] = wk1r * x0r - wk1i * x0i;\n    a[j2 - 1] = wk1r * x0i + wk1i * x0r;\n    x0r = x1r - x3i;\n    x0i = x1i - x3r;\n    a[j3 - 2] = wk3r * x0r + wk3i * x0i;\n    a[j3 - 1] = wk3r * x0i - wk3i * x0r;\n    x0r = a[j0] + a[j2];\n    x0i = -a[j0 + 1] - a[j2 + 1];\n    x1r = a[j0] - a[j2];\n    x1i = -a[j0 + 1] + a[j2 + 1];\n    x2r = a[j1] + a[j3];\n    x2i = a[j1 + 1] + a[j3 + 1];\n    x3r = a[j1] - a[j3];\n    x3i = a[j1 + 1] - a[j3 + 1];\n    a[j0] = x0r + x2r;\n    a[j0 + 1] = x0i - x2i;\n    a[j1] = x0r - x2r;\n    a[j1 + 1] = x0i + x2i;\n    x0r = x1r + x3i;\n    x0i = x1i + x3r;\n    a[j2] = wn4r * (x0r - x0i);\n    a[j2 + 1] = wn4r * (x0i + x0r);\n    x0r = x1r - x3i;\n    x0i = x1i - x3r;\n    a[j3] = -wn4r * (x0r + x0i);\n    a[j3 + 1] = -wn4r * (x0i - x0r);\n    x0r = a[j0 + 2] + a[j2 + 2];\n    x0i = -a[j0 + 3] - a[j2 + 3];\n    x1r = a[j0 + 2] - a[j2 + 2];\n    x1i = -a[j0 + 3] + a[j2 + 3];\n    x2r = a[j1 + 2] + a[j3 + 2];\n    x2i = a[j1 + 3] + a[j3 + 3];\n    x3r = a[j1 + 2] - a[j3 + 2];\n    x3i = a[j1 + 3] - a[j3 + 3];\n    a[j0 + 2] = x0r + x2r;\n    a[j0 + 3] = x0i - x2i;\n    a[j1 + 2] = x0r - x2r;\n    a[j1 + 3] = x0i + x2i;\n    x0r = x1r + x3i;\n    x0i = x1i + x3r;\n    a[j2 + 2] = wk1i * x0r - wk1r * x0i;\n    a[j2 + 3] = wk1i * x0i + wk1r * x0r;\n    x0r = x1r - x3i;\n    x0i = x1i - x3r;\n    a[j3 + 2] = wk3i * x0r + wk3r * x0i;\n    a[j3 + 3] = wk3i * x0i - wk3r * x0r;\n}\n\n\n#ifdef USE_CDFT_THREADS\nstruct cdft_arg_st {\n    int n0;\n    int n;\n    double *a;\n    int nw;\n    double *w;\n};\ntypedef struct cdft_arg_st cdft_arg_t;\n\n\nvoid cftrec4_th(int n, double *a, int nw, double *w)\n{\n    void *cftrec1_th(void *p);\n    void *cftrec2_th(void *p);\n    int i, idiv4, m, nthread;\n    cdft_thread_t th[4];\n    cdft_arg_t ag[4];\n    \n    nthread = 2;\n    idiv4 = 0;\n    m = n >> 1;\n    if (n > CDFT_4THREADS_BEGIN_N) {\n        nthread = 4;\n        idiv4 = 1;\n        m >>= 1;\n    }\n    for (i = 0; i < nthread; i++) {\n        ag[i].n0 = n;\n        ag[i].n = m;\n        ag[i].a = &a[i * m];\n        ag[i].nw = nw;\n        ag[i].w = w;\n        if (i != idiv4) {\n            cdft_thread_create(&th[i], cftrec1_th, &ag[i]);\n        } else {\n            cdft_thread_create(&th[i], cftrec2_th, &ag[i]);\n        }\n    }\n    for (i = 0; i < nthread; i++) {\n        cdft_thread_wait(th[i]);\n    }\n}\n\n\nvoid *cftrec1_th(void *p)\n{\n    int cfttree(int n, int j, int k, double *a, int nw, double *w);\n    void cftleaf(int n, int isplt, double *a, int nw, double *w);\n    void cftmdl1(int n, double *a, double *w);\n    int isplt, j, k, m, n, n0, nw;\n    double *a, *w;\n    \n    n0 = ((cdft_arg_t *) p)->n0;\n    n = ((cdft_arg_t *) p)->n;\n    a = ((cdft_arg_t *) p)->a;\n    nw = ((cdft_arg_t *) p)->nw;\n    w = ((cdft_arg_t *) p)->w;\n    m = n0;\n    while (m > 512) {\n        m >>= 2;\n        cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);\n    }\n    cftleaf(m, 1, &a[n - m], nw, w);\n    k = 0;\n    for (j = n - m; j > 0; j -= m) {\n        k++;\n        isplt = cfttree(m, j, k, a, nw, w);\n        cftleaf(m, isplt, &a[j - m], nw, w);\n    }\n    return (void *) 0;\n}\n\n\nvoid *cftrec2_th(void *p)\n{\n    int cfttree(int n, int j, int k, double *a, int nw, double *w);\n    void cftleaf(int n, int isplt, double *a, int nw, double *w);\n    void cftmdl2(int n, double *a, double *w);\n    int isplt, j, k, m, n, n0, nw;\n    double *a, *w;\n    \n    n0 = ((cdft_arg_t *) p)->n0;\n    n = ((cdft_arg_t *) p)->n;\n    a = ((cdft_arg_t *) p)->a;\n    nw = ((cdft_arg_t *) p)->nw;\n    w = ((cdft_arg_t *) p)->w;\n    k = 1;\n    m = n0;\n    while (m > 512) {\n        m >>= 2;\n        k <<= 2;\n        cftmdl2(m, &a[n - m], &w[nw - m]);\n    }\n    cftleaf(m, 0, &a[n - m], nw, w);\n    k >>= 1;\n    for (j = n - m; j > 0; j -= m) {\n        k++;\n        isplt = cfttree(m, j, k, a, nw, w);\n        cftleaf(m, isplt, &a[j - m], nw, w);\n    }\n    return (void *) 0;\n}\n#endif /* USE_CDFT_THREADS */\n\n\nvoid cftrec4(int n, double *a, int nw, double *w)\n{\n    int cfttree(int n, int j, int k, double *a, int nw, double *w);\n    void cftleaf(int n, int isplt, double *a, int nw, double *w);\n    void cftmdl1(int n, double *a, double *w);\n    int isplt, j, k, m;\n    \n    m = n;\n    while (m > 512) {\n        m >>= 2;\n        cftmdl1(m, &a[n - m], &w[nw - (m >> 1)]);\n    }\n    cftleaf(m, 1, &a[n - m], nw, w);\n    k = 0;\n    for (j = n - m; j > 0; j -= m) {\n        k++;\n        isplt = cfttree(m, j, k, a, nw, w);\n        cftleaf(m, isplt, &a[j - m], nw, w);\n    }\n}\n\n\nint cfttree(int n, int j, int k, double *a, int nw, double *w)\n{\n    void cftmdl1(int n, double *a, double *w);\n    void cftmdl2(int n, double *a, double *w);\n    int i, isplt, m;\n    \n    if ((k & 3) != 0) {\n        isplt = k & 1;\n        if (isplt != 0) {\n            cftmdl1(n, &a[j - n], &w[nw - (n >> 1)]);\n        } else {\n            cftmdl2(n, &a[j - n], &w[nw - n]);\n        }\n    } else {\n        m = n;\n        for (i = k; (i & 3) == 0; i >>= 2) {\n            m <<= 2;\n        }\n        isplt = i & 1;\n        if (isplt != 0) {\n            while (m > 128) {\n                cftmdl1(m, &a[j - m], &w[nw - (m >> 1)]);\n                m >>= 2;\n            }\n        } else {\n            while (m > 128) {\n                cftmdl2(m, &a[j - m], &w[nw - m]);\n                m >>= 2;\n            }\n        }\n    }\n    return isplt;\n}\n\n\nvoid cftleaf(int n, int isplt, double *a, int nw, double *w)\n{\n    void cftmdl1(int n, double *a, double *w);\n    void cftmdl2(int n, double *a, double *w);\n    void cftf161(double *a, double *w);\n    void cftf162(double *a, double *w);\n    void cftf081(double *a, double *w);\n    void cftf082(double *a, double *w);\n    \n    if (n == 512) {\n        cftmdl1(128, a, &w[nw - 64]);\n        cftf161(a, &w[nw - 8]);\n        cftf162(&a[32], &w[nw - 32]);\n        cftf161(&a[64], &w[nw - 8]);\n        cftf161(&a[96], &w[nw - 8]);\n        cftmdl2(128, &a[128], &w[nw - 128]);\n        cftf161(&a[128], &w[nw - 8]);\n        cftf162(&a[160], &w[nw - 32]);\n        cftf161(&a[192], &w[nw - 8]);\n        cftf162(&a[224], &w[nw - 32]);\n        cftmdl1(128, &a[256], &w[nw - 64]);\n        cftf161(&a[256], &w[nw - 8]);\n        cftf162(&a[288], &w[nw - 32]);\n        cftf161(&a[320], &w[nw - 8]);\n        cftf161(&a[352], &w[nw - 8]);\n        if (isplt != 0) {\n            cftmdl1(128, &a[384], &w[nw - 64]);\n            cftf161(&a[480], &w[nw - 8]);\n        } else {\n            cftmdl2(128, &a[384], &w[nw - 128]);\n            cftf162(&a[480], &w[nw - 32]);\n        }\n        cftf161(&a[384], &w[nw - 8]);\n        cftf162(&a[416], &w[nw - 32]);\n        cftf161(&a[448], &w[nw - 8]);\n    } else {\n        cftmdl1(64, a, &w[nw - 32]);\n        cftf081(a, &w[nw - 8]);\n        cftf082(&a[16], &w[nw - 8]);\n        cftf081(&a[32], &w[nw - 8]);\n        cftf081(&a[48], &w[nw - 8]);\n        cftmdl2(64, &a[64], &w[nw - 64]);\n        cftf081(&a[64], &w[nw - 8]);\n        cftf082(&a[80], &w[nw - 8]);\n        cftf081(&a[96], &w[nw - 8]);\n        cftf082(&a[112], &w[nw - 8]);\n        cftmdl1(64, &a[128], &w[nw - 32]);\n        cftf081(&a[128], &w[nw - 8]);\n        cftf082(&a[144], &w[nw - 8]);\n        cftf081(&a[160], &w[nw - 8]);\n        cftf081(&a[176], &w[nw - 8]);\n        if (isplt != 0) {\n            cftmdl1(64, &a[192], &w[nw - 32]);\n            cftf081(&a[240], &w[nw - 8]);\n        } else {\n            cftmdl2(64, &a[192], &w[nw - 64]);\n            cftf082(&a[240], &w[nw - 8]);\n        }\n        cftf081(&a[192], &w[nw - 8]);\n        cftf082(&a[208], &w[nw - 8]);\n        cftf081(&a[224], &w[nw - 8]);\n    }\n}\n\n\nvoid cftmdl1(int n, double *a, double *w)\n{\n    int j, j0, j1, j2, j3, k, m, mh;\n    double wn4r, wk1r, wk1i, wk3r, wk3i;\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;\n    \n    mh = n >> 3;\n    m = 2 * mh;\n    j1 = m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[0] + a[j2];\n    x0i = a[1] + a[j2 + 1];\n    x1r = a[0] - a[j2];\n    x1i = a[1] - a[j2 + 1];\n    x2r = a[j1] + a[j3];\n    x2i = a[j1 + 1] + a[j3 + 1];\n    x3r = a[j1] - a[j3];\n    x3i = a[j1 + 1] - a[j3 + 1];\n    a[0] = x0r + x2r;\n    a[1] = x0i + x2i;\n    a[j1] = x0r - x2r;\n    a[j1 + 1] = x0i - x2i;\n    a[j2] = x1r - x3i;\n    a[j2 + 1] = x1i + x3r;\n    a[j3] = x1r + x3i;\n    a[j3 + 1] = x1i - x3r;\n    wn4r = w[1];\n    k = 0;\n    for (j = 2; j < mh; j += 2) {\n        k += 4;\n        wk1r = w[k];\n        wk1i = w[k + 1];\n        wk3r = w[k + 2];\n        wk3i = w[k + 3];\n        j1 = j + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j] + a[j2];\n        x0i = a[j + 1] + a[j2 + 1];\n        x1r = a[j] - a[j2];\n        x1i = a[j + 1] - a[j2 + 1];\n        x2r = a[j1] + a[j3];\n        x2i = a[j1 + 1] + a[j3 + 1];\n        x3r = a[j1] - a[j3];\n        x3i = a[j1 + 1] - a[j3 + 1];\n        a[j] = x0r + x2r;\n        a[j + 1] = x0i + x2i;\n        a[j1] = x0r - x2r;\n        a[j1 + 1] = x0i - x2i;\n        x0r = x1r - x3i;\n        x0i = x1i + x3r;\n        a[j2] = wk1r * x0r - wk1i * x0i;\n        a[j2 + 1] = wk1r * x0i + wk1i * x0r;\n        x0r = x1r + x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3r * x0r + wk3i * x0i;\n        a[j3 + 1] = wk3r * x0i - wk3i * x0r;\n        j0 = m - j;\n        j1 = j0 + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j0] + a[j2];\n        x0i = a[j0 + 1] + a[j2 + 1];\n        x1r = a[j0] - a[j2];\n        x1i = a[j0 + 1] - a[j2 + 1];\n        x2r = a[j1] + a[j3];\n        x2i = a[j1 + 1] + a[j3 + 1];\n        x3r = a[j1] - a[j3];\n        x3i = a[j1 + 1] - a[j3 + 1];\n        a[j0] = x0r + x2r;\n        a[j0 + 1] = x0i + x2i;\n        a[j1] = x0r - x2r;\n        a[j1 + 1] = x0i - x2i;\n        x0r = x1r - x3i;\n        x0i = x1i + x3r;\n        a[j2] = wk1i * x0r - wk1r * x0i;\n        a[j2 + 1] = wk1i * x0i + wk1r * x0r;\n        x0r = x1r + x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3i * x0r + wk3r * x0i;\n        a[j3 + 1] = wk3i * x0i - wk3r * x0r;\n    }\n    j0 = mh;\n    j1 = j0 + m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[j0] + a[j2];\n    x0i = a[j0 + 1] + a[j2 + 1];\n    x1r = a[j0] - a[j2];\n    x1i = a[j0 + 1] - a[j2 + 1];\n    x2r = a[j1] + a[j3];\n    x2i = a[j1 + 1] + a[j3 + 1];\n    x3r = a[j1] - a[j3];\n    x3i = a[j1 + 1] - a[j3 + 1];\n    a[j0] = x0r + x2r;\n    a[j0 + 1] = x0i + x2i;\n    a[j1] = x0r - x2r;\n    a[j1 + 1] = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    a[j2] = wn4r * (x0r - x0i);\n    a[j2 + 1] = wn4r * (x0i + x0r);\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    a[j3] = -wn4r * (x0r + x0i);\n    a[j3 + 1] = -wn4r * (x0i - x0r);\n}\n\n\nvoid cftmdl2(int n, double *a, double *w)\n{\n    int j, j0, j1, j2, j3, k, kr, m, mh;\n    double wn4r, wk1r, wk1i, wk3r, wk3i, wd1r, wd1i, wd3r, wd3i;\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, y0r, y0i, y2r, y2i;\n    \n    mh = n >> 3;\n    m = 2 * mh;\n    wn4r = w[1];\n    j1 = m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[0] - a[j2 + 1];\n    x0i = a[1] + a[j2];\n    x1r = a[0] + a[j2 + 1];\n    x1i = a[1] - a[j2];\n    x2r = a[j1] - a[j3 + 1];\n    x2i = a[j1 + 1] + a[j3];\n    x3r = a[j1] + a[j3 + 1];\n    x3i = a[j1 + 1] - a[j3];\n    y0r = wn4r * (x2r - x2i);\n    y0i = wn4r * (x2i + x2r);\n    a[0] = x0r + y0r;\n    a[1] = x0i + y0i;\n    a[j1] = x0r - y0r;\n    a[j1 + 1] = x0i - y0i;\n    y0r = wn4r * (x3r - x3i);\n    y0i = wn4r * (x3i + x3r);\n    a[j2] = x1r - y0i;\n    a[j2 + 1] = x1i + y0r;\n    a[j3] = x1r + y0i;\n    a[j3 + 1] = x1i - y0r;\n    k = 0;\n    kr = 2 * m;\n    for (j = 2; j < mh; j += 2) {\n        k += 4;\n        wk1r = w[k];\n        wk1i = w[k + 1];\n        wk3r = w[k + 2];\n        wk3i = w[k + 3];\n        kr -= 4;\n        wd1i = w[kr];\n        wd1r = w[kr + 1];\n        wd3i = w[kr + 2];\n        wd3r = w[kr + 3];\n        j1 = j + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j] - a[j2 + 1];\n        x0i = a[j + 1] + a[j2];\n        x1r = a[j] + a[j2 + 1];\n        x1i = a[j + 1] - a[j2];\n        x2r = a[j1] - a[j3 + 1];\n        x2i = a[j1 + 1] + a[j3];\n        x3r = a[j1] + a[j3 + 1];\n        x3i = a[j1 + 1] - a[j3];\n        y0r = wk1r * x0r - wk1i * x0i;\n        y0i = wk1r * x0i + wk1i * x0r;\n        y2r = wd1r * x2r - wd1i * x2i;\n        y2i = wd1r * x2i + wd1i * x2r;\n        a[j] = y0r + y2r;\n        a[j + 1] = y0i + y2i;\n        a[j1] = y0r - y2r;\n        a[j1 + 1] = y0i - y2i;\n        y0r = wk3r * x1r + wk3i * x1i;\n        y0i = wk3r * x1i - wk3i * x1r;\n        y2r = wd3r * x3r + wd3i * x3i;\n        y2i = wd3r * x3i - wd3i * x3r;\n        a[j2] = y0r + y2r;\n        a[j2 + 1] = y0i + y2i;\n        a[j3] = y0r - y2r;\n        a[j3 + 1] = y0i - y2i;\n        j0 = m - j;\n        j1 = j0 + m;\n        j2 = j1 + m;\n        j3 = j2 + m;\n        x0r = a[j0] - a[j2 + 1];\n        x0i = a[j0 + 1] + a[j2];\n        x1r = a[j0] + a[j2 + 1];\n        x1i = a[j0 + 1] - a[j2];\n        x2r = a[j1] - a[j3 + 1];\n        x2i = a[j1 + 1] + a[j3];\n        x3r = a[j1] + a[j3 + 1];\n        x3i = a[j1 + 1] - a[j3];\n        y0r = wd1i * x0r - wd1r * x0i;\n        y0i = wd1i * x0i + wd1r * x0r;\n        y2r = wk1i * x2r - wk1r * x2i;\n        y2i = wk1i * x2i + wk1r * x2r;\n        a[j0] = y0r + y2r;\n        a[j0 + 1] = y0i + y2i;\n        a[j1] = y0r - y2r;\n        a[j1 + 1] = y0i - y2i;\n        y0r = wd3i * x1r + wd3r * x1i;\n        y0i = wd3i * x1i - wd3r * x1r;\n        y2r = wk3i * x3r + wk3r * x3i;\n        y2i = wk3i * x3i - wk3r * x3r;\n        a[j2] = y0r + y2r;\n        a[j2 + 1] = y0i + y2i;\n        a[j3] = y0r - y2r;\n        a[j3 + 1] = y0i - y2i;\n    }\n    wk1r = w[m];\n    wk1i = w[m + 1];\n    j0 = mh;\n    j1 = j0 + m;\n    j2 = j1 + m;\n    j3 = j2 + m;\n    x0r = a[j0] - a[j2 + 1];\n    x0i = a[j0 + 1] + a[j2];\n    x1r = a[j0] + a[j2 + 1];\n    x1i = a[j0 + 1] - a[j2];\n    x2r = a[j1] - a[j3 + 1];\n    x2i = a[j1 + 1] + a[j3];\n    x3r = a[j1] + a[j3 + 1];\n    x3i = a[j1 + 1] - a[j3];\n    y0r = wk1r * x0r - wk1i * x0i;\n    y0i = wk1r * x0i + wk1i * x0r;\n    y2r = wk1i * x2r - wk1r * x2i;\n    y2i = wk1i * x2i + wk1r * x2r;\n    a[j0] = y0r + y2r;\n    a[j0 + 1] = y0i + y2i;\n    a[j1] = y0r - y2r;\n    a[j1 + 1] = y0i - y2i;\n    y0r = wk1i * x1r - wk1r * x1i;\n    y0i = wk1i * x1i + wk1r * x1r;\n    y2r = wk1r * x3r - wk1i * x3i;\n    y2i = wk1r * x3i + wk1i * x3r;\n    a[j2] = y0r - y2r;\n    a[j2 + 1] = y0i - y2i;\n    a[j3] = y0r + y2r;\n    a[j3 + 1] = y0i + y2i;\n}\n\n\nvoid cftfx41(int n, double *a, int nw, double *w)\n{\n    void cftf161(double *a, double *w);\n    void cftf162(double *a, double *w);\n    void cftf081(double *a, double *w);\n    void cftf082(double *a, double *w);\n    \n    if (n == 128) {\n        cftf161(a, &w[nw - 8]);\n        cftf162(&a[32], &w[nw - 32]);\n        cftf161(&a[64], &w[nw - 8]);\n        cftf161(&a[96], &w[nw - 8]);\n    } else {\n        cftf081(a, &w[nw - 8]);\n        cftf082(&a[16], &w[nw - 8]);\n        cftf081(&a[32], &w[nw - 8]);\n        cftf081(&a[48], &w[nw - 8]);\n    }\n}\n\n\nvoid cftf161(double *a, double *w)\n{\n    double wn4r, wk1r, wk1i, \n        x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, \n        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, \n        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, \n        y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, \n        y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;\n    \n    wn4r = w[1];\n    wk1r = w[2];\n    wk1i = w[3];\n    x0r = a[0] + a[16];\n    x0i = a[1] + a[17];\n    x1r = a[0] - a[16];\n    x1i = a[1] - a[17];\n    x2r = a[8] + a[24];\n    x2i = a[9] + a[25];\n    x3r = a[8] - a[24];\n    x3i = a[9] - a[25];\n    y0r = x0r + x2r;\n    y0i = x0i + x2i;\n    y4r = x0r - x2r;\n    y4i = x0i - x2i;\n    y8r = x1r - x3i;\n    y8i = x1i + x3r;\n    y12r = x1r + x3i;\n    y12i = x1i - x3r;\n    x0r = a[2] + a[18];\n    x0i = a[3] + a[19];\n    x1r = a[2] - a[18];\n    x1i = a[3] - a[19];\n    x2r = a[10] + a[26];\n    x2i = a[11] + a[27];\n    x3r = a[10] - a[26];\n    x3i = a[11] - a[27];\n    y1r = x0r + x2r;\n    y1i = x0i + x2i;\n    y5r = x0r - x2r;\n    y5i = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    y9r = wk1r * x0r - wk1i * x0i;\n    y9i = wk1r * x0i + wk1i * x0r;\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    y13r = wk1i * x0r - wk1r * x0i;\n    y13i = wk1i * x0i + wk1r * x0r;\n    x0r = a[4] + a[20];\n    x0i = a[5] + a[21];\n    x1r = a[4] - a[20];\n    x1i = a[5] - a[21];\n    x2r = a[12] + a[28];\n    x2i = a[13] + a[29];\n    x3r = a[12] - a[28];\n    x3i = a[13] - a[29];\n    y2r = x0r + x2r;\n    y2i = x0i + x2i;\n    y6r = x0r - x2r;\n    y6i = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    y10r = wn4r * (x0r - x0i);\n    y10i = wn4r * (x0i + x0r);\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    y14r = wn4r * (x0r + x0i);\n    y14i = wn4r * (x0i - x0r);\n    x0r = a[6] + a[22];\n    x0i = a[7] + a[23];\n    x1r = a[6] - a[22];\n    x1i = a[7] - a[23];\n    x2r = a[14] + a[30];\n    x2i = a[15] + a[31];\n    x3r = a[14] - a[30];\n    x3i = a[15] - a[31];\n    y3r = x0r + x2r;\n    y3i = x0i + x2i;\n    y7r = x0r - x2r;\n    y7i = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    y11r = wk1i * x0r - wk1r * x0i;\n    y11i = wk1i * x0i + wk1r * x0r;\n    x0r = x1r + x3i;\n    x0i = x1i - x3r;\n    y15r = wk1r * x0r - wk1i * x0i;\n    y15i = wk1r * x0i + wk1i * x0r;\n    x0r = y12r - y14r;\n    x0i = y12i - y14i;\n    x1r = y12r + y14r;\n    x1i = y12i + y14i;\n    x2r = y13r - y15r;\n    x2i = y13i - y15i;\n    x3r = y13r + y15r;\n    x3i = y13i + y15i;\n    a[24] = x0r + x2r;\n    a[25] = x0i + x2i;\n    a[26] = x0r - x2r;\n    a[27] = x0i - x2i;\n    a[28] = x1r - x3i;\n    a[29] = x1i + x3r;\n    a[30] = x1r + x3i;\n    a[31] = x1i - x3r;\n    x0r = y8r + y10r;\n    x0i = y8i + y10i;\n    x1r = y8r - y10r;\n    x1i = y8i - y10i;\n    x2r = y9r + y11r;\n    x2i = y9i + y11i;\n    x3r = y9r - y11r;\n    x3i = y9i - y11i;\n    a[16] = x0r + x2r;\n    a[17] = x0i + x2i;\n    a[18] = x0r - x2r;\n    a[19] = x0i - x2i;\n    a[20] = x1r - x3i;\n    a[21] = x1i + x3r;\n    a[22] = x1r + x3i;\n    a[23] = x1i - x3r;\n    x0r = y5r - y7i;\n    x0i = y5i + y7r;\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    x0r = y5r + y7i;\n    x0i = y5i - y7r;\n    x3r = wn4r * (x0r - x0i);\n    x3i = wn4r * (x0i + x0r);\n    x0r = y4r - y6i;\n    x0i = y4i + y6r;\n    x1r = y4r + y6i;\n    x1i = y4i - y6r;\n    a[8] = x0r + x2r;\n    a[9] = x0i + x2i;\n    a[10] = x0r - x2r;\n    a[11] = x0i - x2i;\n    a[12] = x1r - x3i;\n    a[13] = x1i + x3r;\n    a[14] = x1r + x3i;\n    a[15] = x1i - x3r;\n    x0r = y0r + y2r;\n    x0i = y0i + y2i;\n    x1r = y0r - y2r;\n    x1i = y0i - y2i;\n    x2r = y1r + y3r;\n    x2i = y1i + y3i;\n    x3r = y1r - y3r;\n    x3i = y1i - y3i;\n    a[0] = x0r + x2r;\n    a[1] = x0i + x2i;\n    a[2] = x0r - x2r;\n    a[3] = x0i - x2i;\n    a[4] = x1r - x3i;\n    a[5] = x1i + x3r;\n    a[6] = x1r + x3i;\n    a[7] = x1i - x3r;\n}\n\n\nvoid cftf162(double *a, double *w)\n{\n    double wn4r, wk1r, wk1i, wk2r, wk2i, wk3r, wk3i, \n        x0r, x0i, x1r, x1i, x2r, x2i, \n        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, \n        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i, \n        y8r, y8i, y9r, y9i, y10r, y10i, y11r, y11i, \n        y12r, y12i, y13r, y13i, y14r, y14i, y15r, y15i;\n    \n    wn4r = w[1];\n    wk1r = w[4];\n    wk1i = w[5];\n    wk3r = w[6];\n    wk3i = -w[7];\n    wk2r = w[8];\n    wk2i = w[9];\n    x1r = a[0] - a[17];\n    x1i = a[1] + a[16];\n    x0r = a[8] - a[25];\n    x0i = a[9] + a[24];\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    y0r = x1r + x2r;\n    y0i = x1i + x2i;\n    y4r = x1r - x2r;\n    y4i = x1i - x2i;\n    x1r = a[0] + a[17];\n    x1i = a[1] - a[16];\n    x0r = a[8] + a[25];\n    x0i = a[9] - a[24];\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    y8r = x1r - x2i;\n    y8i = x1i + x2r;\n    y12r = x1r + x2i;\n    y12i = x1i - x2r;\n    x0r = a[2] - a[19];\n    x0i = a[3] + a[18];\n    x1r = wk1r * x0r - wk1i * x0i;\n    x1i = wk1r * x0i + wk1i * x0r;\n    x0r = a[10] - a[27];\n    x0i = a[11] + a[26];\n    x2r = wk3i * x0r - wk3r * x0i;\n    x2i = wk3i * x0i + wk3r * x0r;\n    y1r = x1r + x2r;\n    y1i = x1i + x2i;\n    y5r = x1r - x2r;\n    y5i = x1i - x2i;\n    x0r = a[2] + a[19];\n    x0i = a[3] - a[18];\n    x1r = wk3r * x0r - wk3i * x0i;\n    x1i = wk3r * x0i + wk3i * x0r;\n    x0r = a[10] + a[27];\n    x0i = a[11] - a[26];\n    x2r = wk1r * x0r + wk1i * x0i;\n    x2i = wk1r * x0i - wk1i * x0r;\n    y9r = x1r - x2r;\n    y9i = x1i - x2i;\n    y13r = x1r + x2r;\n    y13i = x1i + x2i;\n    x0r = a[4] - a[21];\n    x0i = a[5] + a[20];\n    x1r = wk2r * x0r - wk2i * x0i;\n    x1i = wk2r * x0i + wk2i * x0r;\n    x0r = a[12] - a[29];\n    x0i = a[13] + a[28];\n    x2r = wk2i * x0r - wk2r * x0i;\n    x2i = wk2i * x0i + wk2r * x0r;\n    y2r = x1r + x2r;\n    y2i = x1i + x2i;\n    y6r = x1r - x2r;\n    y6i = x1i - x2i;\n    x0r = a[4] + a[21];\n    x0i = a[5] - a[20];\n    x1r = wk2i * x0r - wk2r * x0i;\n    x1i = wk2i * x0i + wk2r * x0r;\n    x0r = a[12] + a[29];\n    x0i = a[13] - a[28];\n    x2r = wk2r * x0r - wk2i * x0i;\n    x2i = wk2r * x0i + wk2i * x0r;\n    y10r = x1r - x2r;\n    y10i = x1i - x2i;\n    y14r = x1r + x2r;\n    y14i = x1i + x2i;\n    x0r = a[6] - a[23];\n    x0i = a[7] + a[22];\n    x1r = wk3r * x0r - wk3i * x0i;\n    x1i = wk3r * x0i + wk3i * x0r;\n    x0r = a[14] - a[31];\n    x0i = a[15] + a[30];\n    x2r = wk1i * x0r - wk1r * x0i;\n    x2i = wk1i * x0i + wk1r * x0r;\n    y3r = x1r + x2r;\n    y3i = x1i + x2i;\n    y7r = x1r - x2r;\n    y7i = x1i - x2i;\n    x0r = a[6] + a[23];\n    x0i = a[7] - a[22];\n    x1r = wk1i * x0r + wk1r * x0i;\n    x1i = wk1i * x0i - wk1r * x0r;\n    x0r = a[14] + a[31];\n    x0i = a[15] - a[30];\n    x2r = wk3i * x0r - wk3r * x0i;\n    x2i = wk3i * x0i + wk3r * x0r;\n    y11r = x1r + x2r;\n    y11i = x1i + x2i;\n    y15r = x1r - x2r;\n    y15i = x1i - x2i;\n    x1r = y0r + y2r;\n    x1i = y0i + y2i;\n    x2r = y1r + y3r;\n    x2i = y1i + y3i;\n    a[0] = x1r + x2r;\n    a[1] = x1i + x2i;\n    a[2] = x1r - x2r;\n    a[3] = x1i - x2i;\n    x1r = y0r - y2r;\n    x1i = y0i - y2i;\n    x2r = y1r - y3r;\n    x2i = y1i - y3i;\n    a[4] = x1r - x2i;\n    a[5] = x1i + x2r;\n    a[6] = x1r + x2i;\n    a[7] = x1i - x2r;\n    x1r = y4r - y6i;\n    x1i = y4i + y6r;\n    x0r = y5r - y7i;\n    x0i = y5i + y7r;\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    a[8] = x1r + x2r;\n    a[9] = x1i + x2i;\n    a[10] = x1r - x2r;\n    a[11] = x1i - x2i;\n    x1r = y4r + y6i;\n    x1i = y4i - y6r;\n    x0r = y5r + y7i;\n    x0i = y5i - y7r;\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    a[12] = x1r - x2i;\n    a[13] = x1i + x2r;\n    a[14] = x1r + x2i;\n    a[15] = x1i - x2r;\n    x1r = y8r + y10r;\n    x1i = y8i + y10i;\n    x2r = y9r - y11r;\n    x2i = y9i - y11i;\n    a[16] = x1r + x2r;\n    a[17] = x1i + x2i;\n    a[18] = x1r - x2r;\n    a[19] = x1i - x2i;\n    x1r = y8r - y10r;\n    x1i = y8i - y10i;\n    x2r = y9r + y11r;\n    x2i = y9i + y11i;\n    a[20] = x1r - x2i;\n    a[21] = x1i + x2r;\n    a[22] = x1r + x2i;\n    a[23] = x1i - x2r;\n    x1r = y12r - y14i;\n    x1i = y12i + y14r;\n    x0r = y13r + y15i;\n    x0i = y13i - y15r;\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    a[24] = x1r + x2r;\n    a[25] = x1i + x2i;\n    a[26] = x1r - x2r;\n    a[27] = x1i - x2i;\n    x1r = y12r + y14i;\n    x1i = y12i - y14r;\n    x0r = y13r - y15i;\n    x0i = y13i + y15r;\n    x2r = wn4r * (x0r - x0i);\n    x2i = wn4r * (x0i + x0r);\n    a[28] = x1r - x2i;\n    a[29] = x1i + x2r;\n    a[30] = x1r + x2i;\n    a[31] = x1i - x2r;\n}\n\n\nvoid cftf081(double *a, double *w)\n{\n    double wn4r, x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i, \n        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, \n        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;\n    \n    wn4r = w[1];\n    x0r = a[0] + a[8];\n    x0i = a[1] + a[9];\n    x1r = a[0] - a[8];\n    x1i = a[1] - a[9];\n    x2r = a[4] + a[12];\n    x2i = a[5] + a[13];\n    x3r = a[4] - a[12];\n    x3i = a[5] - a[13];\n    y0r = x0r + x2r;\n    y0i = x0i + x2i;\n    y2r = x0r - x2r;\n    y2i = x0i - x2i;\n    y1r = x1r - x3i;\n    y1i = x1i + x3r;\n    y3r = x1r + x3i;\n    y3i = x1i - x3r;\n    x0r = a[2] + a[10];\n    x0i = a[3] + a[11];\n    x1r = a[2] - a[10];\n    x1i = a[3] - a[11];\n    x2r = a[6] + a[14];\n    x2i = a[7] + a[15];\n    x3r = a[6] - a[14];\n    x3i = a[7] - a[15];\n    y4r = x0r + x2r;\n    y4i = x0i + x2i;\n    y6r = x0r - x2r;\n    y6i = x0i - x2i;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    x2r = x1r + x3i;\n    x2i = x1i - x3r;\n    y5r = wn4r * (x0r - x0i);\n    y5i = wn4r * (x0r + x0i);\n    y7r = wn4r * (x2r - x2i);\n    y7i = wn4r * (x2r + x2i);\n    a[8] = y1r + y5r;\n    a[9] = y1i + y5i;\n    a[10] = y1r - y5r;\n    a[11] = y1i - y5i;\n    a[12] = y3r - y7i;\n    a[13] = y3i + y7r;\n    a[14] = y3r + y7i;\n    a[15] = y3i - y7r;\n    a[0] = y0r + y4r;\n    a[1] = y0i + y4i;\n    a[2] = y0r - y4r;\n    a[3] = y0i - y4i;\n    a[4] = y2r - y6i;\n    a[5] = y2i + y6r;\n    a[6] = y2r + y6i;\n    a[7] = y2i - y6r;\n}\n\n\nvoid cftf082(double *a, double *w)\n{\n    double wn4r, wk1r, wk1i, x0r, x0i, x1r, x1i, \n        y0r, y0i, y1r, y1i, y2r, y2i, y3r, y3i, \n        y4r, y4i, y5r, y5i, y6r, y6i, y7r, y7i;\n    \n    wn4r = w[1];\n    wk1r = w[2];\n    wk1i = w[3];\n    y0r = a[0] - a[9];\n    y0i = a[1] + a[8];\n    y1r = a[0] + a[9];\n    y1i = a[1] - a[8];\n    x0r = a[4] - a[13];\n    x0i = a[5] + a[12];\n    y2r = wn4r * (x0r - x0i);\n    y2i = wn4r * (x0i + x0r);\n    x0r = a[4] + a[13];\n    x0i = a[5] - a[12];\n    y3r = wn4r * (x0r - x0i);\n    y3i = wn4r * (x0i + x0r);\n    x0r = a[2] - a[11];\n    x0i = a[3] + a[10];\n    y4r = wk1r * x0r - wk1i * x0i;\n    y4i = wk1r * x0i + wk1i * x0r;\n    x0r = a[2] + a[11];\n    x0i = a[3] - a[10];\n    y5r = wk1i * x0r - wk1r * x0i;\n    y5i = wk1i * x0i + wk1r * x0r;\n    x0r = a[6] - a[15];\n    x0i = a[7] + a[14];\n    y6r = wk1i * x0r - wk1r * x0i;\n    y6i = wk1i * x0i + wk1r * x0r;\n    x0r = a[6] + a[15];\n    x0i = a[7] - a[14];\n    y7r = wk1r * x0r - wk1i * x0i;\n    y7i = wk1r * x0i + wk1i * x0r;\n    x0r = y0r + y2r;\n    x0i = y0i + y2i;\n    x1r = y4r + y6r;\n    x1i = y4i + y6i;\n    a[0] = x0r + x1r;\n    a[1] = x0i + x1i;\n    a[2] = x0r - x1r;\n    a[3] = x0i - x1i;\n    x0r = y0r - y2r;\n    x0i = y0i - y2i;\n    x1r = y4r - y6r;\n    x1i = y4i - y6i;\n    a[4] = x0r - x1i;\n    a[5] = x0i + x1r;\n    a[6] = x0r + x1i;\n    a[7] = x0i - x1r;\n    x0r = y1r - y3i;\n    x0i = y1i + y3r;\n    x1r = y5r - y7r;\n    x1i = y5i - y7i;\n    a[8] = x0r + x1r;\n    a[9] = x0i + x1i;\n    a[10] = x0r - x1r;\n    a[11] = x0i - x1i;\n    x0r = y1r + y3i;\n    x0i = y1i - y3r;\n    x1r = y5r + y7r;\n    x1i = y5i + y7i;\n    a[12] = x0r - x1i;\n    a[13] = x0i + x1r;\n    a[14] = x0r + x1i;\n    a[15] = x0i - x1r;\n}\n\n\nvoid cftf040(double *a)\n{\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;\n    \n    x0r = a[0] + a[4];\n    x0i = a[1] + a[5];\n    x1r = a[0] - a[4];\n    x1i = a[1] - a[5];\n    x2r = a[2] + a[6];\n    x2i = a[3] + a[7];\n    x3r = a[2] - a[6];\n    x3i = a[3] - a[7];\n    a[0] = x0r + x2r;\n    a[1] = x0i + x2i;\n    a[2] = x1r - x3i;\n    a[3] = x1i + x3r;\n    a[4] = x0r - x2r;\n    a[5] = x0i - x2i;\n    a[6] = x1r + x3i;\n    a[7] = x1i - x3r;\n}\n\n\nvoid cftb040(double *a)\n{\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;\n    \n    x0r = a[0] + a[4];\n    x0i = a[1] + a[5];\n    x1r = a[0] - a[4];\n    x1i = a[1] - a[5];\n    x2r = a[2] + a[6];\n    x2i = a[3] + a[7];\n    x3r = a[2] - a[6];\n    x3i = a[3] - a[7];\n    a[0] = x0r + x2r;\n    a[1] = x0i + x2i;\n    a[2] = x1r + x3i;\n    a[3] = x1i - x3r;\n    a[4] = x0r - x2r;\n    a[5] = x0i - x2i;\n    a[6] = x1r - x3i;\n    a[7] = x1i + x3r;\n}\n\n\nvoid cftx020(double *a)\n{\n    double x0r, x0i;\n    \n    x0r = a[0] - a[2];\n    x0i = a[1] - a[3];\n    a[0] += a[2];\n    a[1] += a[3];\n    a[2] = x0r;\n    a[3] = x0i;\n}\n\n\nvoid rftfsub(int n, double *a, int nc, double *c)\n{\n    int j, k, kk, ks, m;\n    double wkr, wki, xr, xi, yr, yi;\n    \n    m = n >> 1;\n    ks = 2 * nc / m;\n    kk = 0;\n    for (j = 2; j < m; j += 2) {\n        k = n - j;\n        kk += ks;\n        wkr = 0.5 - c[nc - kk];\n        wki = c[kk];\n        xr = a[j] - a[k];\n        xi = a[j + 1] + a[k + 1];\n        yr = wkr * xr - wki * xi;\n        yi = wkr * xi + wki * xr;\n        a[j] -= yr;\n        a[j + 1] -= yi;\n        a[k] += yr;\n        a[k + 1] -= yi;\n    }\n}\n\n\nvoid rftbsub(int n, double *a, int nc, double *c)\n{\n    int j, k, kk, ks, m;\n    double wkr, wki, xr, xi, yr, yi;\n    \n    m = n >> 1;\n    ks = 2 * nc / m;\n    kk = 0;\n    for (j = 2; j < m; j += 2) {\n        k = n - j;\n        kk += ks;\n        wkr = 0.5 - c[nc - kk];\n        wki = c[kk];\n        xr = a[j] - a[k];\n        xi = a[j + 1] + a[k + 1];\n        yr = wkr * xr + wki * xi;\n        yi = wkr * xi - wki * xr;\n        a[j] -= yr;\n        a[j + 1] -= yi;\n        a[k] += yr;\n        a[k + 1] -= yi;\n    }\n}\n\n\nvoid dctsub(int n, double *a, int nc, double *c)\n{\n    int j, k, kk, ks, m;\n    double wkr, wki, xr;\n    \n    m = n >> 1;\n    ks = nc / n;\n    kk = 0;\n    for (j = 1; j < m; j++) {\n        k = n - j;\n        kk += ks;\n        wkr = c[kk] - c[nc - kk];\n        wki = c[kk] + c[nc - kk];\n        xr = wki * a[j] - wkr * a[k];\n        a[j] = wkr * a[j] + wki * a[k];\n        a[k] = xr;\n    }\n    a[m] *= c[0];\n}\n\n\nvoid dstsub(int n, double *a, int nc, double *c)\n{\n    int j, k, kk, ks, m;\n    double wkr, wki, xr;\n    \n    m = n >> 1;\n    ks = nc / n;\n    kk = 0;\n    for (j = 1; j < m; j++) {\n        k = n - j;\n        kk += ks;\n        wkr = c[kk] - c[nc - kk];\n        wki = c[kk] + c[nc - kk];\n        xr = wki * a[k] - wkr * a[j];\n        a[k] = wkr * a[k] + wki * a[j];\n        a[j] = xr;\n    }\n    a[m] *= c[0];\n}\n\n"
  },
  {
    "path": "Chapters/Old/spctrum/fft/readme.txt",
    "content": "FFT ̓lbg痎ƂĂCugĂ܂B\n҂͂火B\n\n    Copyright(C) 1996-2001 Takuya OOURA\n    email: ooura@mmm.t.u-tokyo.ac.jp\n    download: http://momonga.t.u-tokyo.ac.jp/~ooura/fft.html\n\nManaged C++ gĂŃRpCɂ cl.exe KvłB\n(.NET Framework SDK ƁA\n \"C:\\Program Files\\Microsoft Visual Studio .NET\\Vc7\\bin\\cl.exe\"\n ɃCXg[܂B)\n\nVisual C++ .net ͎ĂȂ̂ŁAR}hCŃRpC܂B\nMakefile tĂ܂B\nmake ̎sO vsvars32.bat sKv܂B\n"
  },
  {
    "path": "Chapters/Old/spctrum/fft/vsvars32.bat",
    "content": "@SET VSINSTALLDIR=C:\\Program Files\\Microsoft Visual Studio .NET\\Common7\\IDE\n@SET VCINSTALLDIR=C:\\Program Files\\Microsoft Visual Studio .NET\n@SET FrameworkDir=C:\\WINDOWS\\Microsoft.NET\\Framework\n@SET FrameworkVersion=v1.0.3705\n@SET FrameworkSDKDir=C:\\Program Files\\Microsoft Visual Studio .NET\\FrameworkSDK\n@rem Root of Visual Studio common files.\n\n@if \"%VSINSTALLDIR%\"==\"\" goto Usage\n@if \"%VCINSTALLDIR%\"==\"\" set VCINSTALLDIR=%VSINSTALLDIR%\n\n@rem\n@rem Root of Visual Studio ide installed files.\n@rem\n@set DevEnvDir=%VSINSTALLDIR%\n\n@rem\n@rem Root of Visual C++ installed files.\n@rem\n@set MSVCDir=%VCINSTALLDIR%\\VC7\n\n@rem\n@echo Setting environment for using Microsoft Visual Studio .NET tools.\n@echo (If you also have Visual C++ 6.0 installed and wish to use its tools\n@echo from the command line, run vcvars32.bat for Visual C++ 6.0.)\n@rem\n\n@REM %VCINSTALLDIR%\\Common7\\Tools dir is added only for real setup.\n\n@set PATH=%DevEnvDir%;%MSVCDir%\\BIN;%VCINSTALLDIR%\\Common7\\Tools;%VCINSTALLDIR%\\Common7\\Tools\\bin\\prerelease;%VCINSTALLDIR%\\Common7\\Tools\\bin;%FrameworkSDKDir%\\bin;%FrameworkDir%\\%FrameworkVersion%;%PATH%;\n@set INCLUDE=%MSVCDir%\\ATLMFC\\INCLUDE;%MSVCDir%\\INCLUDE;%MSVCDir%\\PlatformSDK\\include\\prerelease;%MSVCDir%\\PlatformSDK\\include;%FrameworkSDKDir%\\include;%INCLUDE%\n@set LIB=%MSVCDir%\\ATLMFC\\LIB;%MSVCDir%\\LIB;%MSVCDir%\\PlatformSDK\\lib\\prerelease;%MSVCDir%\\PlatformSDK\\lib;%FrameworkSDKDir%\\lib;%LIB%\n\n@goto end\n\n:Usage\n\n@echo. VSINSTALLDIR variable is not set. \n@echo.\n@echo SYNTAX: %0\n\n@goto end\n\n:end\n"
  },
  {
    "path": "Chapters/Old/spctrum/spectrum.sln",
    "content": "Microsoft Visual Studio Solution File, Format Version 7.00\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Spectrum\", \"Spectrum.csproj\", \"{71167ED2-CCDF-4740-A43B-E07AB721BA77}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfiguration) = preSolution\n\t\tConfigName.0 = Debug\n\t\tConfigName.1 = Release\n\tEndGlobalSection\n\tGlobalSection(ProjectDependencies) = postSolution\n\tEndGlobalSection\n\tGlobalSection(ProjectConfiguration) = postSolution\n\t\t{71167ED2-CCDF-4740-A43B-E07AB721BA77}.Debug.ActiveCfg = Debug|.NET\n\t\t{71167ED2-CCDF-4740-A43B-E07AB721BA77}.Debug.Build.0 = Debug|.NET\n\t\t{71167ED2-CCDF-4740-A43B-E07AB721BA77}.Release.ActiveCfg = Release|.NET\n\t\t{71167ED2-CCDF-4740-A43B-E07AB721BA77}.Release.Build.0 = Release|.NET\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityAddIns) = postSolution\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Oop/GenericsSample/GenericsSample.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>GenericsSample.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Oop/GenericsSample/Template.cs",
    "content": "﻿namespace GenericsSample.Template\n{\n    // 使った分だけそれぞれ別の型に展開\n    public class Wrapper_int { public int Value; }\n    public class Wrapper_byte { public byte Value; }\n    public class Wrapper_string { public string Value = null!; } // object initializer で初期化するつもり\n    public class Wrapper_Array_int { public int[] Value = null!; } // 同上\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var i = new Wrapper_int { Value = 1 };\n            var b = new Wrapper_byte { Value = 1 };\n            var s = new Wrapper_string { Value = \"abc\" };\n            var a = new Wrapper_Array_int { Value = new[] { 1, 2, 3 } };\n\n            // キャストは不要\n            int iv = i.Value;\n            byte bv = b.Value;\n            string sv = s.Value;\n            int[] av = a.Value;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/GenericsSample/TypeErasure.cs",
    "content": "﻿namespace GenericsSample.TypeErasure\n{\n    // object 型な1つのクラスに集約\n    // 元の型情報を残さない = 型消去\n    public class Wrapper { public object Value = null!; } // object initializer で初期化するつもり\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var i = new Wrapper { Value = new Integer(1) };\n            var b = new Wrapper { Value = new Byte(1) };\n            var s = new Wrapper { Value = \"abc\" };\n            var a = new Wrapper { Value = new[] { 1, 2, 3 } };\n\n            // キャストが必要\n            int iv = ((Integer)i.Value).Value;\n            byte bv = ((Byte)i.Value).Value;\n            string sv = (string)s.Value;\n            int[] av = (int[])a.Value;\n        }\n    }\n\n    //↓こんな感じのクラスが標準ライブラリ中にある\n\n    public class Integer\n    {\n        public int Value;\n        public Integer(int value) { Value = value; }\n    }\n\n    public class Byte\n    {\n        public byte Value;\n        public Byte(byte value) { Value = value; }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/GenericsSample/ValueType.cs",
    "content": "﻿namespace GenericsSample.ValueType\n{\n    // 値型の場合: 使った分だけそれぞれ別の型に展開\n    public class Wrapper_int { public int Value; }\n    public class Wrapper_byte { public byte Value; }\n\n    // 参照型の場合、object 型な1つのクラスに集約\n    public class Wrapper { public object Value = null!; } // object initializer で初期化するつもり\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var i = new Wrapper_int { Value = 1 };\n            var b = new Wrapper_byte { Value = 1 };\n            var s = new Wrapper { Value = \"abc\" };\n            var a = new Wrapper { Value = new[] { 1, 2, 3 } };\n\n            // 値型はキャスト不要\n            int iv = i.Value;\n            byte bv = b.Value;\n\n            // 参照型\n            // (C#(.NET) の場合はこのキャストを取り除くような最適化もしてる)\n            string sv = (string)s.Value;\n            int[] av = (int[])a.Value;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/GenericsSample/Wrapper.cs",
    "content": "﻿namespace GenericsSample\n{\n    public class Wrapper<T>\n    {\n        public T Value = default!; // object initializer で初期化するつもり\n    }\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var i = new Wrapper<int> { Value = 1 };\n            var b = new Wrapper<byte> { Value = 1 };\n            var s = new Wrapper<string> { Value = \"abc\" };\n            var a = new Wrapper<int[]> { Value = new[] { 1, 2, 3 } };\n\n            int iv = i.Value;\n            byte bv = b.Value;\n            string sv = s.Value;\n            int[] av = a.Value;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/InterfaceSample/Bcl/IComparableSample.cs",
    "content": "﻿namespace InterfaceSample.Bcl\n{\n    using System;\n    using System.Linq;\n\n    /// <summary>\n    /// 2次元上の点。\n    /// <see cref=\"IComparable{T}\"/> を実装している = 順序をつけられる。\n    /// </summary>\n    class Point2D : IComparable<Point2D>\n    {\n        public double X { get; }\n        public double Y { get; }\n\n        public Point2D(double x, double y)\n        {\n            X = x;\n            Y = y;\n        }\n\n        public double Radius => Math.Sqrt(X * X + Y * Y);\n        public double Angle => Math.Atan2(Y, X);\n\n        /// <summary>\n        /// 距離で順序を決める。\n        /// 距離が全く同じなら偏角で順序付け。\n        /// </summary>\n        /// <param name=\"other\"></param>\n        /// <returns></returns>\n        public int CompareTo(Point2D other)\n        {\n            var r = Radius.CompareTo(other.Radius);\n            if (r != 0) return r;\n            return Angle.CompareTo(other.Angle);\n        }\n    }\n\n\n    class IComparableSample\n    {\n        public static void Main()\n        {\n            const int N = 5;\n            var rand = new Random();\n            var data = Enumerable.Range(0, N).Select(_ => new Point2D(rand.NextDouble(), rand.NextDouble())).ToArray();\n\n            Console.WriteLine(\"元:\");\n            foreach (var p in data) WriteLine(p);\n\n            // 並べ替えの順序に使える\n            Console.WriteLine(\"整列済み:\");\n            foreach (var p in data.OrderBy(x => x)) WriteLine(p);\n        }\n\n        private static void WriteLine(Point2D p)\n        {\n            Console.WriteLine($\"({p.X:N3}, {p.Y:N3}), radius = {p.Radius:N3}, angle = {p.Angle:N3}\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/InterfaceSample/Bcl/IDisposableSample.cs",
    "content": "﻿namespace InterfaceSample.Bcl\n{\n    using System;\n\n    /// <summary>\n    /// <see cref=\"IDisposable\"/> を実装している = 使い終わったら明示的に Dispose を呼ぶ必要がある。\n    /// </summary>\n    class Stopwatch : IDisposable\n    {\n        System.Diagnostics.Stopwatch _s = new System.Diagnostics.Stopwatch();\n\n        public Stopwatch() { _s.Start(); }\n\n        public void Dispose()\n        {\n            _s.Stop();\n            Console.WriteLine(_s.Elapsed);\n        }\n    }\n\n    class IDisposableSample\n    {\n        public static void Main()\n        {\n            // using ブロックを抜けたら自動的に Dispose が呼ばれる\n            using (new Stopwatch())\n            {\n                var t = T(12, 6, 0);\n            }\n        }\n\n        private static int T(int x, int y, int z) => x <= y ? y : T(T(x - 1, y, z), T(y - 1, z, x), T(z - 1, x, y));\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/InterfaceSample/Bcl/IEnumerableSample.cs",
    "content": "﻿namespace InterfaceSample.Bcl\n{\n    using System;\n    using System.Collections;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    /// <summary>\n    /// 連結リスト。\n    /// <see cref=\"IEnumerable{T}\"/> を実装している = データの列挙ができる。複数のデータを束ねてる。\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    class LinkedList<T> : IEnumerable<T>\n    {\n        public T Value { get; }\n        public LinkedList<T>? Next { get; }\n\n        public LinkedList(T value) : this(value, null) { }\n        private LinkedList(T value, LinkedList<T>? next) { Value = value; Next = next; }\n\n        public LinkedList<T> Add(T value) => new LinkedList<T>(value, this);\n\n        public IEnumerator<T> GetEnumerator()\n        {\n            if(Next != null)\n                foreach (var x in Next)\n                    yield return x;\n            yield return Value;\n        }\n\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n\n    class IEnumerableSample\n    {\n        public static void Main()\n        {\n            var a = new LinkedList<int>(1);\n            var b = a.Add(2).Add(3).Add(4);\n\n            // foreach で使える(これは IEnumerable 必須ではない)\n            foreach (var x in b)\n                Console.WriteLine(x);\n\n            // string.Join で使える\n            Console.WriteLine(string.Join(\", \", b));\n\n            // LINQ で使える\n            Console.WriteLine(b.Sum());\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/InterfaceSample/Bcl/IReadOnlyListSample.cs",
    "content": "﻿namespace InterfaceSample.Bcl\n{\n    using System;\n    using System.Collections;\n    using System.Collections.Generic;\n\n    /// <summary>\n    /// 4次元上の点。\n    /// <see cref=\"IReadOnlyList{T}\"/> を実装している = <see cref=\"IEnumerable{T}\"/>に加えて、インデックス指定で値を読める。\n    /// </summary>\n    class Point4D : IReadOnlyList<double>\n    {\n        public double X { get; }\n        public double Y { get; }\n        public double Z { get; }\n        public double W { get; }\n\n        public Point4D(double x, double y, double z, double w) { X = x; Y = y; Z = z; W = w; }\n\n        public double this[int index]\n        {\n            get\n            {\n                switch (index)\n                {\n                    default:\n                    case 0: return X;\n                    case 1: return Y;\n                    case 2: return Z;\n                    case 3: return W;\n                }\n            }\n        }\n\n        public int Count => 4;\n\n        public IEnumerator<double> GetEnumerator()\n        {\n            yield return X;\n            yield return Y;\n            yield return Z;\n            yield return W;\n        }\n\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n\n    class IReadOnlyListSample\n    {\n        public static void Main()\n        {\n            var p1 = new Point4D(1, 2, 3, 4);\n            var p2 = new Point4D(3, 7, 5, 11);\n\n            // X, Y, Z, W の代わりに 0, 1, 2, 3 のインデックスで値を読み出し\n            var innerProduct = 0.0;\n            for (int i = 0; i < 4; i++)\n                innerProduct += p1[i] * p2[i];\n\n            Console.WriteLine(innerProduct);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/InterfaceSample/Explicit/ExpliciteImplementationSample.cs",
    "content": "﻿namespace InterfaceSample.Explicit\n{\n    using System;\n    using System.Collections.Generic;\n\n    interface IAccumulator\n    {\n        void Add(int value);\n        int Sum { get; }\n    }\n\n    interface IGroup<T>\n    {\n        void Add(T item);\n        IEnumerable<T> Items { get; }\n    }\n\n    /// <summary>\n    /// 1つの<see cref=\"Add(int)\"/>で、2つのインターフェイスの実装を担うんであれば特に問題は出ない。\n    /// </summary>\n    class ImplicitImplementation : IAccumulator, IGroup<int>\n    {\n        public void Add(int x)\n        {\n            Sum += x;\n            _items.Add(x);\n        }\n\n        public IEnumerable<int> Items => _items;\n        private List<int> _items = new List<int>();\n\n        public int Sum { get; private set; }\n    }\n\n    /// <summary>\n    /// <see cref=\"IAccumulator.Add(int)\"/>と、<see cref=\"IGroup{int}.Add(int)\"/>が完全に被るので、\n    /// 別の実装を与えたければ明示的実装が必要。\n    /// </summary>\n    class ExplicitImplementation : IAccumulator, IGroup<int>\n    {\n        void IAccumulator.Add(int value) => Sum += value;\n\n        void IGroup<int>.Add(int item) => _items.Add(item);\n\n        public IEnumerable<int> Items => _items;\n        private List<int> _items = new List<int>();\n\n        public int Sum { get; private set; }\n    }\n\n    class ExpliciteImplementationSample\n    {\n        public static void Main()\n        {\n            // 1つのAddで両方の債務を担ってるので2重集計される\n            var a = new ImplicitImplementation();\n            for (int i = 0; i < 5; i++)\n            {\n                Accumulate(a, i);\n                AddItem(a, i);\n\n                // 通常の実装なので、普通に Add(i) を呼ぶことも可能\n                //a.Add(i);\n            }\n            Console.WriteLine($\"sum = {a.Sum}, items = {string.Join(\", \", a.Items)}\");\n\n            // 明示的実装を使って2つのAddを別実装したので個別集計される。\n            var b = new ExplicitImplementation();\n            for (int i = 0; i < 5; i++)\n            {\n                Accumulate(b, i);\n                AddItem(b, i);\n\n                // 明示的実装の場合、一度インターフェイスにキャストしてからでないと Add(i) は呼べない。\n                // 例えば以下のコメントを外すとコンパイル エラー。\n                //b.Add(i);\n            }\n            Console.WriteLine($\"sum = {b.Sum}, items = {string.Join(\", \", b.Items)}\");\n        }\n\n        static void Accumulate(IAccumulator x, int value) => x.Add(value);\n\n        static void AddItem<T>(IGroup<T> g, T item) => g.Add(item);\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/InterfaceSample/Explicit/GenericInterfaceSample.cs",
    "content": "﻿namespace InterfaceSample.Explicit\n{\n    using System;\n    using System.Collections.Generic;\n\n    interface IDataSource<T>\n    {\n        IEnumerable<T> Items { get; }\n    }\n\n    /// <summary>\n    /// 同名・別戻り値型なメソッド/プロパティは、C#では普通には作れないので、\n    /// こういう場合は明示的実装が必須。\n    /// </summary>\n    class MultipleDataSource : IDataSource<int>, IDataSource<string>, IDataSource<double>\n    {\n        IEnumerable<int> IDataSource<int>.Items => new[] { 1, 2, 3, 4, 5 };\n\n        public IEnumerable<string> Items => new[] { \"one\", \"two\", \"three\" };\n\n        IEnumerable<double> IDataSource<double>.Items => new[] { 1.4, 2.7, 3.1 };\n    }\n\n    class GenericInterfaceSample\n    {\n        public static void Main()\n        {\n            var source = new MultipleDataSource();\n            WriteLine<int>(source);\n            WriteLine<string>(source);\n            WriteLine<double>(source);\n        }\n\n        static void WriteLine<T>(IDataSource<T> source)\n        {\n            Console.WriteLine(string.Join(\", \", source.Items));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/InterfaceSample/Explicit/MultipleImplementationSample.cs",
    "content": "﻿using System;\n\nnamespace InterfaceSample.Explicit\n{\n    struct Id : IComparable<Id>, IEquatable<Id>\n    {\n        public int Value { get; set; }\n\n        public int CompareTo(Id other) => Value.CompareTo(other.Value);\n\n        public bool Equals(Id other) => Value == other.Value;\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/InterfaceSample/Explicit/PolymorphicIEquatableSample.cs",
    "content": "﻿namespace InterfaceSample.Explicit\n{\n    using System;\n\n    abstract class Shape : IEquatable<Shape>\n    {\n        public abstract bool Equals(Shape other);\n    }\n\n    class Rectangle : Shape, IEquatable<Rectangle>\n    {\n        public double Width { get; set; }\n        public double Height { get; set; }\n\n        public override bool Equals(Shape other) => Equals(other as Rectangle);\n\n        public bool Equals(Rectangle? other)\n            => other != null && Width == other.Width && Height == other.Height;\n    }\n\n    class Circle : Shape, IEquatable<Circle>\n    {\n        public double Radius { get; set; }\n\n        public override bool Equals(Shape other) => Equals(other as Circle);\n\n        public bool Equals(Circle? other)\n            => other != null && Radius == other.Radius;\n    }\n\n    class PolymorphicIEquatableSample\n    {\n        public static void Main()\n        {\n            var r1 = new Rectangle { Width = 1, Height = 2 };\n            var r2 = new Rectangle { Width = 2, Height = 2 };\n            var r3 = new Rectangle { Width = 1, Height = 2 };\n            var c1 = new Circle { Radius = 1 };\n            var c2 = new Circle { Radius = 2 };\n            var c3 = new Circle { Radius = 1 };\n\n            CompareRectangle(r1, r2); // Rectangle False\n            CompareRectangle(r1, r3); // Rectangle True\n            CompareCircle(c1, c2);    // Circle    False\n            CompareCircle(c1, c3);    // Circle    True\n            CompareShape(r1, r2);     // Shape     False\n            CompareShape(r1, r3);     // Shape     True\n            CompareShape(c1, c2);     // Shape     False\n            CompareShape(c1, c3);     // Shape     True\n            CompareShape(r1, c1);     // Shape     False\n        }\n\n        private static void CompareRectangle(IEquatable<Rectangle> r1, Rectangle r2)\n        {\n            Console.WriteLine(\"Rectangle \" + r1.Equals(r2));\n        }\n\n        private static void CompareCircle(IEquatable<Circle> c1, Circle c2)\n        {\n            Console.WriteLine(\"Circle    \" + c1.Equals(c2));\n        }\n\n        private static void CompareShape(IEquatable<Shape> s1, Shape s2)\n        {\n            Console.WriteLine(\"Shape     \" + s1.Equals(s2));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/InterfaceSample/InterfaceSample.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>InterfaceSample.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Oop/InterfaceSample/Program.cs",
    "content": "﻿namespace InterfaceSample\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Bcl.IComparableSample.Main();\n            Bcl.IEnumerableSample.Main();\n            Bcl.IReadOnlyListSample.Main();\n            Bcl.IDisposableSample.Main();\n            Explicit.GenericInterfaceSample.Main();\n            Explicit.ExpliciteImplementationSample.Main();\n            Explicit.PolymorphicIEquatableSample.Main();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/Oop.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26206.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"TopLevelAccessibility\", \"TopLevelAccessibility\", \"{B1135A7C-9C78-4492-94C1-5590A04E4E16}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ReferredClassLibrary\", \"TopLevelAccessibility\\ReferredClassLibrary\\ReferredClassLibrary.csproj\", \"{56B750BA-36B5-453C-A288-4783C48F9FD4}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApplication\", \"TopLevelAccessibility\\ConsoleApplication\\ConsoleApplication.csproj\", \"{1E06949A-F394-4BE8-853A-94BBAB8AA836}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"InterfaceSample\", \"InterfaceSample\\InterfaceSample.csproj\", \"{BFFD4218-2CD6-488E-A01F-77B4DA544F20}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"GenericsSample\", \"GenericsSample\\GenericsSample.csproj\", \"{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Variance\", \"Variance\\Variance.csproj\", \"{491A0653-DCF1-43A9-8589-E5422E7C9279}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ValueTypeGenerics\", \"ValueTypeGenerics\\ValueTypeGenerics.csproj\", \"{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4}.Release|x64.Build.0 = Release|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836}.Release|x64.Build.0 = Release|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{BFFD4218-2CD6-488E-A01F-77B4DA544F20}.Release|x64.Build.0 = Release|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{4D36C405-ACFB-45E1-9F65-A8C1DA4F527C}.Release|x64.Build.0 = Release|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{491A0653-DCF1-43A9-8589-E5422E7C9279}.Release|x64.Build.0 = Release|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Debug|x64.Build.0 = Debug|x64\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|x64.ActiveCfg = Release|x64\n\t\t{AC426EA1-3118-4A20-BC62-0EAB2F82A17A}.Release|x64.Build.0 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{56B750BA-36B5-453C-A288-4783C48F9FD4} = {B1135A7C-9C78-4492-94C1-5590A04E4E16}\n\t\t{1E06949A-F394-4BE8-853A-94BBAB8AA836} = {B1135A7C-9C78-4492-94C1-5590A04E4E16}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Oop/TopLevelAccessibility/ConsoleApplication/Class1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ConsoleApplication\n{\n    class Class1\n    {\n        public int X { get; set; }\n\n        public int Y { get; set; }\n\n        public override string ToString() => $\"({X}, {Y})\";\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/TopLevelAccessibility/ConsoleApplication/ConsoleApplication.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ReferredClassLibrary\\ReferredClassLibrary.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Oop/TopLevelAccessibility/ConsoleApplication/Program.cs",
    "content": "﻿#pragma warning disable 219\n\nnamespace ConsoleApplication\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var c1 = new A.PublicClass();\n            var s1 = new A.PublicStruct();\n\n            //var c2 = new A.InternalClass();  // コンパイル エラー\n            //var s2 = new A.InternalStruct(); // コンパイル エラー\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/TopLevelAccessibility/ReferredClassLibrary/Inheritance.cs",
    "content": "﻿namespace B\n{\n    public struct PublicStruct { }\n    public interface PublicInterface { PublicStruct X { get; } }\n\n    internal struct InternalStruct { }\n    internal interface InternalInterface { InternalStruct X { get; } }\n\n    public class PublicClass : PublicInterface, InternalInterface\n    {\n        public PublicStruct X => default(PublicStruct);\n        InternalStruct InternalInterface.X => default(InternalStruct);\n    }\n}\n\nnamespace C\n{\n    internal class InternalClass { }\n\n#if false\n    // コンパイル エラー\n    public class PublicClass : InternalClass\n    {\n    }\n#endif\n}\n"
  },
  {
    "path": "Chapters/Oop/TopLevelAccessibility/ReferredClassLibrary/Internals.cs",
    "content": "﻿internal interface InternalInterface\n{\n    InternalDelegate X { get; }\n}\n\ninternal delegate void InternalDelegate();\n\nnamespace A\n{\n    internal class InternalClass : InternalInterface\n    {\n        private InternalStruct _value;\n\n        public InternalDelegate X => _value.X;\n    }\n\n    internal struct InternalStruct\n    {\n        public InternalDelegate X { get; set; }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/TopLevelAccessibility/ReferredClassLibrary/Nested.cs",
    "content": "﻿public class TopLevelClass\n{\n    public class PublicClass { }\n    protected class ProtectedClass { }\n    protected internal class ProtectedInternalClass { }\n    internal class InternalClass { }\n    private class PrivateClass { }\n}\n"
  },
  {
    "path": "Chapters/Oop/TopLevelAccessibility/ReferredClassLibrary/Publics.cs",
    "content": "﻿public interface PublicInterface\n{\n    PublicDelegate X { get; }\n}\n\npublic delegate void PublicDelegate();\n\nnamespace A\n{\n    public class PublicClass : PublicInterface, InternalInterface\n    {\n        private PublicStruct _value;\n\n        public PublicDelegate X => _value.X;\n\n        private InternalStruct _internal;\n\n        InternalDelegate InternalInterface.X => _internal.X;\n    }\n\n    public struct PublicStruct\n    {\n        public PublicDelegate X { get; set; }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/TopLevelAccessibility/ReferredClassLibrary/ReferredClassLibrary.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.1</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Oop/ValueTypeGenerics/AvoidBoxing.cs",
    "content": "﻿namespace ValueTypeGenerics.AvoidBoxing\n{\n    using System;\n\n    // 無駄なヒープ確保をしないように構造体に\n    struct Disposable : IDisposable\n    {\n        public void Dispose() { }\n    }\n\n    class Program\n    {\n        static void WithInterface(IDisposable x) => x.Dispose();\n\n        // やってることは WithInterface を同じに見えて…\n        static void WithGenerics<T>(T x)\n            where T : IDisposable\n            => x.Dispose();\n\n        static void Main()\n        {\n            // 構造体なので無駄なヒープ確保はしない\n            default(Disposable).Dispose();\n\n            for (int i = 0; i < 10000; i++)\n            {\n                // ところが、インターフェイスを介するとボックス化を起こす\n                // 無駄なヒープ確保に\n                // 1個や2個なら大したコストではないものの、何度も呼ばれるとさすがにつらい\n                WithInterface(default(Disposable));\n            }\n\n            for (int i = 0; i < 10000; i++)\n            {\n                // ジェネリックを介するとボックス化が不要\n                // 繰り返し呼んでも平気\n                WithGenerics(default(Disposable));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/ValueTypeGenerics/BinaryOperationBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\nusing ValueTypeGenerics.GenericArithmeticOperators;\n\nnamespace ValueTypeGenerics\n{\n    public class BinaryOperationBenchmark\n    {\n        static int[] items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n        static int Sum = 45;\n        static int Prod = 362880;\n\n        [Benchmark]\n        public static void EmmbeddedOperator()\n        {\n            if (GenericArithmeticOperators.Program.Sum(items) != Sum) throw new InvalidOperationException();\n            if (GenericArithmeticOperators.Program.Prod(items) != Prod) throw new InvalidOperationException();\n        }\n\n        [Benchmark]\n        public static void Interface()\n        {\n            if (GenericArithmeticOperators.Interface.Program.Sum(items, new Add()) != Sum) throw new InvalidOperationException();\n            if (GenericArithmeticOperators.Interface.Program.Sum(items, new Mul()) != Prod) throw new InvalidOperationException();\n        }\n\n        [Benchmark]\n        public static void Generics()\n        {\n            if (GenericArithmeticOperators.Generics.Program.Sum(items, new Add()) != Sum) throw new InvalidOperationException();\n            if (GenericArithmeticOperators.Generics.Program.Sum(items, new Mul()) != Prod) throw new InvalidOperationException();\n        }\n\n        [Benchmark]\n        public static void PseudoStatic()\n        {\n            if (GenericArithmeticOperators.PseudoStatic.Program.Sum<int, Add>(items) != Sum) throw new InvalidOperationException();\n            if (GenericArithmeticOperators.PseudoStatic.Program.Sum<int, Mul>(items) != Prod) throw new InvalidOperationException();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/ValueTypeGenerics/Foreach/Iterator/Program.cs",
    "content": "﻿namespace ValueTypeGenerics.Foreach.Iterator\n{\n    using System;\n    using System.Collections;\n    using System.Collections.Generic;\n\n    struct Quartet : IEnumerable<int>\n    {\n        public int A;\n        public int B;\n        public int C;\n        public int D;\n\n        public Quartet(int a, int b, int c, int d) { A = a; B = b; C = c; D = d; }\n\n        // これの戻り値がインターフェイスなのが良くない。\n        // yield return から作られる enumerable/enumeartor は構造体なのに、\n        // インターフェイスを介することでボックス化が発生、ヒープ確保が必要。\n        public IEnumerator<int> GetEnumerator()\n        {\n            yield return A;\n            yield return B;\n            yield return C;\n            yield return D;\n        }\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            const int N = 10000;\n\n            {\n                var q = new Quartet(1, 2, 3, 4);\n                var begin = GC.GetTotalMemory(false);\n\n                var sum = 0;\n                for (int i = 0; i < N; i++)\n                    foreach (var x in q) sum += x;\n\n                var end = GC.GetTotalMemory(false);\n                Console.WriteLine($\"iterator: {end - begin}\"); // 0 にはならない\n            }\n\n            {\n                var q = new Quartet(1, 2, 3, 4);\n                var begin = GC.GetTotalMemory(false);\n\n                var sum = 0;\n                for (int i = 0; i < N; i++)\n                    sum += Sum(q); // インターフェイスを介した時点でボックス化発生\n\n                var end = GC.GetTotalMemory(false);\n                Console.WriteLine($\"interface: {end - begin}\"); // q のボックス化 + GetEnumerator のボックス化\n            }\n        }\n\n        static int Sum(IEnumerable<int> items)\n        {\n            var sum = 0;\n            foreach (var item in items) sum += item;\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/ValueTypeGenerics/Foreach/Struct/Program.cs",
    "content": "﻿namespace ValueTypeGenerics.Foreach.Struct\n{\n    using System;\n    using System.Collections;\n    using System.Collections.Generic;\n\n    struct Quartet : IEnumerable<int>\n    {\n        public int A;\n        public int B;\n        public int C;\n        public int D;\n\n        public Quartet(int a, int b, int c, int d) { A = a; B = b; C = c; D = d; }\n\n        // がちがちにパフォーマンス最適化が必要な場合、面倒だけど enumerator の手書きが必要。\n        public struct Enumerator : IEnumerator<int>\n        {\n            Quartet _items;\n            int _i;\n\n            public Enumerator(Quartet quintet) { _items = quintet; _i = 0; }\n\n            public int Current =>\n                _i == 1 ? _items.A :\n                _i == 2 ? _items.B :\n                _i == 3 ? _items.C :\n                _items.D;\n\n            public bool MoveNext()\n            {\n                _i++;\n                return _i <= 4;\n            }\n\n            object IEnumerator.Current => Current;\n            public void Dispose() { }\n            public void Reset() { throw new NotImplementedException(); }\n        }\n\n        // 構造体な Enumerator を返す。\n        public Enumerator GetEnumerator() => new Enumerator(this);\n        IEnumerator<int> IEnumerable<int>.GetEnumerator() => GetEnumerator();\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            const int N = 10000;\n\n            {\n                var q = new Quartet(1, 2, 3, 4);\n                var begin = GC.GetTotalMemory(false);\n\n                var sum = 0;\n                for (int i = 0; i < N; i++)\n                    foreach (var x in q) sum += x;\n\n                var end = GC.GetTotalMemory(false);\n                Console.WriteLine($\"struct: {end - begin}\"); // 0 って出るはず\n            }\n\n            {\n                var q = new Quartet(1, 2, 3, 4);\n                var begin = GC.GetTotalMemory(false);\n\n                var sum = 0;\n                for (int i = 0; i < N; i++)\n                    sum += Sum(q); // ジェネリックを介せばボックス化は起きない\n\n                var end = GC.GetTotalMemory(false);\n                Console.WriteLine($\"generics: {end - begin}\"); // GetEnumerator のボックス化のみ\n            }\n        }\n\n        static int Sum<T>(T items)\n            where T : struct, IEnumerable<int>\n        {\n            var sum = 0;\n            foreach (var item in items) sum += item;\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/ValueTypeGenerics/GenericArithmeticOperators/Generics/Program.cs",
    "content": "﻿using System;\n\nnamespace ValueTypeGenerics.GenericArithmeticOperators.Generics\n{\n    class Program\n    {\n        static void Main()\n        {\n            const int N = 10000;\n            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n\n            {\n                var begin = GC.GetTotalMemory(false);\n\n                for (int i = 0; i < N; i++)\n                {\n                    // ジェネリックを介せばボックス化を避けれる\n                    var sum = Sum(items, default(Add));\n                    var prod = Sum(items, default(Mul));\n                }\n\n                var end = GC.GetTotalMemory(false);\n                Console.WriteLine($\"interface: {end - begin}\"); // 0 にはならない\n            }\n        }\n\n        public static T Sum<T, TOperator>(T[] items, TOperator op)\n            where TOperator : struct, IBinaryOperator<T>\n        {\n            var sum = op.Zero;\n            foreach (var item in items)\n                sum = op.Operate(sum, item);\n            return sum;\n        }\n\n        static void M()\n        {\n            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n            // ジェネリックを介せばボックス化を避けれる\n            var sum = Sum(items, default(Add));\n            var prod = Sum(items, default(Mul));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/ValueTypeGenerics/GenericArithmeticOperators/IBinaryOperator.cs",
    "content": "﻿namespace ValueTypeGenerics.GenericArithmeticOperators\n{\n    interface IBinaryOperator<T>\n    {\n        T Zero { get; }\n        T Operate(T x, T y);\n    }\n\n    struct Add : IBinaryOperator<int>\n    {\n        public int Zero => 0;\n        public int Operate(int x, int y) => x + y;\n    }\n\n    struct Mul : IBinaryOperator<int>\n    {\n        public int Zero => 1;\n        public int Operate(int x, int y) => x * y;\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/ValueTypeGenerics/GenericArithmeticOperators/Interface/Program.cs",
    "content": "﻿using System;\n\nnamespace ValueTypeGenerics.GenericArithmeticOperators.Interface\n{\n    class Program\n    {\n        static void Main()\n        {\n            const int N = 10000;\n            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n\n            {\n                var begin = GC.GetTotalMemory(false);\n\n                for (int i = 0; i < N; i++)\n                {\n                    // インターフェイスを介した時点でボックス化発生\n                    var sum = Sum(items, default(Add));\n                    var prod = Sum(items, default(Mul));\n                }\n\n                var end = GC.GetTotalMemory(false);\n                Console.WriteLine($\"interface: {end - begin}\"); // 0 にはならない\n            }\n        }\n\n        public static T Sum<T>(T[] items, IBinaryOperator<T> op)\n        {\n            var sum = op.Zero;\n            foreach (var item in items)\n                sum = op.Operate(sum, item);\n            return sum;\n        }\n\n        static void M()\n        {\n            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n            // インターフェイスを介した時点でボックス化発生\n            var sum = Sum(items, default(Add));\n            var prod = Sum(items, default(Mul));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/ValueTypeGenerics/GenericArithmeticOperators/Program.cs",
    "content": "﻿using System;\nusing System.Linq;\n\nnamespace ValueTypeGenerics.GenericArithmeticOperators\n{\n    class Program\n    {\n        static void Main()\n        {\n            const int N = 10000;\n            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n\n            {\n                var begin = GC.GetTotalMemory(false);\n\n                for (int i = 0; i < N; i++)\n                {\n                    // ジェネリックを介せばボックス化を避けれる\n                    var sum = Sum(items);\n                    var prod = Prod(items);\n                }\n\n                var end = GC.GetTotalMemory(false);\n                Console.WriteLine($\"interface: {end - begin}\"); // 0 にはならない\n            }\n        }\n\n        public static int Sum(int[] items)\n        {\n            var sum = 0;\n            foreach (var item in items)\n                sum = sum + item;\n            return sum;\n        }\n\n        public static int Prod(int[] items)\n        {\n            var sum = 1;\n            foreach (var item in items)\n                sum = sum * item;\n            return sum;\n        }\n\n        static void M()\n        {\n            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n            var sum = Sum(items);\n            var prod = Prod(items);\n        }\n\n        static void M2()\n        {\n            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n            var sum = items.Aggregate(0, (x, y) => x + y);\n            var prod = items.Aggregate(0, (x, y) => x * y);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/ValueTypeGenerics/GenericArithmeticOperators/PseudoStatic/Program.cs",
    "content": "﻿using System;\n\nnamespace ValueTypeGenerics.GenericArithmeticOperators.PseudoStatic\n{\n    class Program\n    {\n        static void Main()\n        {\n            const int N = 10000;\n            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n\n            {\n                var begin = GC.GetTotalMemory(false);\n\n                for (int i = 0; i < N; i++)\n                {\n                    // default(T) せず、型引数だけ書く\n                    var sum = Sum<int, Add>(items);\n                    var prod = Sum<int, Mul>(items);\n                }\n\n                var end = GC.GetTotalMemory(false);\n                Console.WriteLine($\"pseudo-static: {end - begin}\"); // 0 って出るはず\n            }\n        }\n\n        public static T Sum<T, TOperator>(T[] items)\n            where TOperator : struct, IBinaryOperator<T>\n        {\n            var sum = default(TOperator).Zero;\n            foreach (var item in items)\n                sum = default(TOperator).Operate(sum, item);\n            // ↑ メソッド内で default()\n            // 空の構造体なのでほぼノーコスト\n            return sum;\n        }\n\n        static void M()\n        {\n            var items = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n            // default(T) せず、型引数だけ書く\n            var sum = Sum<int, Add>(items);\n            var prod = Sum<int, Mul>(items);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/ValueTypeGenerics/Program.cs",
    "content": "﻿namespace ValueTypeGenerics\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            BenchmarkDotNet.Running.BenchmarkRunner.Run<BinaryOperationBenchmark>();\n        }\n\n#if false\n        // コンパイル エラー: T に Count プロパティがない\n        static int M<T>(T x) => x.Count;\n#endif\n\n        // これなら大丈夫。IList.Count を参照できる\n        static int M<T>(T x)\n            where T : System.Collections.IList\n            => x.Count;\n\n#if false\n        // interface 制約では静的メソッドを呼べない\n        // なので、ジェネリックを使うと静的メソッドを呼ぶ手段がない\n        // コンパイル エラーに\n        static T M<T>(T x) => T.StaticMethod(x);\n\n        // + (演算子)は実質的には静的メソッド\n        // 演算子もコンパイル エラーに\n        static T Add<T>(T x, T y) => x + y;\n#endif\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/ValueTypeGenerics/ValueTypeGenerics.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>ValueTypeGenerics.Program</StartupObject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.3\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Oop/Variance/ArrayCovariance.cs",
    "content": "﻿using System;\n\nnamespace Variance\n{\n    class ArrayCovariance\n    {\n        public static void F()\n        {\n            string[] derivedItems = { \"Aleph\", \"Beth\", \"Gimel\" };\n            object[] baseItems = derivedItems;\n\n            // 読み出し(戻り値側、out、共変)は常に安全\n            for (int i = 0; i < baseItems.Length; i++)\n            {\n                Console.WriteLine(baseItems[i]);\n            }\n        }\n\n#if false\n        static void G()\n        {\n            object[] baseItems = { 1, 2, 3 };\n            string[] derivedItems = baseItems; // コンパイル エラー\n        }\n#endif\n\n        public static void H()\n        {\n            string[] derivedItems = { \"Aleph\", \"Beth\", \"Gimel\" };\n            object[] baseItems = derivedItems;\n\n            // 書き込み(引数側、in、反変)は本当はやっちゃいけない\n            // でも、コンパイルが成功する。実行時エラーが出る\n            baseItems[1] = 100;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/Variance/Base.cs",
    "content": "﻿namespace Variance\n{\n    class Base { }\n    class Derived : Base { }\n}\n"
  },
  {
    "path": "Chapters/Oop/Variance/Contravariance.cs",
    "content": "﻿using System;\n\nnamespace Variance\n{\n    class Contravariance\n    {\n        delegate Base F();\n\n        Derived M() { return default(Derived); }\n\n        void DelegateVariance()\n        {\n            F f = M;\n        }\n\n        void GenericVariance()\n        {\n            Func<Derived> f = M;\n            Func<Base> g = f;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/Variance/Covariance.cs",
    "content": "﻿using System;\n\nnamespace Variance\n{\n    class Covariance\n    {\n        delegate void F(Derived x);\n\n        void M(Base x) { }\n\n        void DelegateVariance()\n        {\n            F x = M;\n        }\n\n        void GenericVariance()\n        {\n            Action<Base> f = M;\n            Action<Derived> g = f;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/Variance/NestedVariance.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Variance\n{\n    // 標準ライブラリの System.Func\n    public delegate TResult Func<in T, out TResult>(T arg);\n\n    delegate Func<TIn, TOut> F<in TIn, out TOut>(Func<TOut, TIn> x);\n\n    interface INestedVariance<in TIn, out TOut>\n    {\n        TOut F(TIn x, Func<TOut, TIn> f);\n    }\n\n    class NestedVariance<TIn, TOut> : INestedVariance<TIn, TOut>\n    {\n        public TOut F(TIn x, Func<TOut, TIn> f)\n        {\n            // f の戻り値は、値を受け取るためにある = in\n            TIn in1 = f(default(TOut));\n\n            // f の引数にはこちらから値を渡す = out\n            TOut out1 = default(TOut);\n            var r = f(out1);\n\n            // 引数から受け取る = in\n            TIn in2 = x;\n\n            // 戻り値を返す = out\n            TOut out2 = default(TOut);\n            return out2;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/Variance/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Variance\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            ArrayCovariance.F();\n        }\n    }\n\n    public interface IObserver<in T>\n    {\n        void OnCompleted();\n        void OnError(Exception error);\n        void OnNext(T value);\n    }\n\n    public interface IObservable<out T>\n    {\n        IDisposable Subscribe(IObserver<T> observer);\n    }\n}\n"
  },
  {
    "path": "Chapters/Oop/Variance/Variance.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/BasicSamples/ActualLibrary/ActualLibrary.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>e1a26066-353d-45ac-b1f9-e4dd87af4eaf</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ActualLibrary</RootNamespace>\n    <AssemblyName>ActualLibrary</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\"/>\n    \n    <Reference Include=\"System.Core\"/>\n    <Reference Include=\"System.Xml.Linq\"/>\n    <Reference Include=\"System.Data.DataSetExtensions\"/>\n    \n    \n    <Reference Include=\"Microsoft.CSharp\"/>\n    \n    <Reference Include=\"System.Data\"/>\n    \n    <Reference Include=\"System.Net.Http\"/>\n    \n    <Reference Include=\"System.Xml\"/>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n\n </Project>\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/BasicSamples/ActualLibrary/Class1.cs",
    "content": "﻿public class Class1\n{\n    public string Name => GetType().Assembly.GetName().Name + \" / \" + nameof(Class1);\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/BasicSamples/ActualLibrary/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ActualLibrary\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ActualLibrary\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"e1a26066-353d-45ac-b1f9-e4dd87af4eaf\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/BasicSamples/ConsoleApplication1/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/BasicSamples/ConsoleApplication1/Program.cs",
    "content": "﻿using System;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        var c = new Class1();\n        Console.WriteLine(c.Name);\n    }\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/BasicSamples/ConsoleApplication1/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ConsoleApplication1\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApplication1\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"a5fac446-1e41-4b1b-9c0b-6caf02b7db3d\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/BasicSamples/ConsoleApplication1/_ConsoleApplication1.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{A5FAC446-1E41-4B1B-9C0B-6CAF02B7DB3D}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ConsoleApplication1</RootNamespace>\n    <AssemblyName>ConsoleApplication1</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\TypeForwardingLibrary\\TypeForwardingLibrary.csproj\">\n      <Project>{e31cf7af-14c0-402d-99b0-ccb28c2dd459}</Project>\n      <Name>TypeForwardingLibrary</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ActualLibrary\\ActualLibrary.csproj\">\n      <Project>{e1a26066-353d-45ac-b1f9-e4dd87af4eaf}</Project>\n      <Name>ActualLibrary</Name>\n      <Aliases>global</Aliases>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/ClassLibrary35/ClassLibrary35.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{E73A0041-2FD0-46BA-9083-F365204DA4B8}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibrary</RootNamespace>\n    <AssemblyName>ClassLibrary35</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Formatter1.cs\" />\n    <Compile Include=\"IFormatter.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\FormattableString20\\FormattableString20.csproj\">\n      <Project>{940a4a77-706b-4f7c-814c-33ac8ef2702f}</Project>\n      <Name>FormattableString20</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/ClassLibrary35/Formatter1.cs",
    "content": "﻿using System;\n\nnamespace ClassLibrary\n{\n    public class Formatter1 : IFormatter\n    {\n        public IFormattable Format(int x, int y, int z) => $\"({x}, {y}, {z})\";\n    }\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/ClassLibrary35/IFormatter.cs",
    "content": "﻿using System;\n\nnamespace ClassLibrary\n{\n    public interface IFormatter\n    {\n        IFormattable Format(int x, int y, int z);\n    }\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/ClassLibrary35/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ClassLibrary35\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibrary35\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"e73a0041-2fd0-46ba-9083-f365204da4b8\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/ClassLibrary46/ClassLibrary46.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{B0ABB793-3B2A-4FB0-B0AF-3DF5EB85674E}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibrary</RootNamespace>\n    <AssemblyName>ClassLibrary46</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Formatter2.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ClassLibrary35\\ClassLibrary35.csproj\">\n      <Project>{e73a0041-2fd0-46ba-9083-f365204da4b8}</Project>\n      <Name>ClassLibrary35</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\FormattableString46\\FormattableString46.csproj\">\n      <Project>{ddfe8198-4986-422d-9da1-31976a85d6ef}</Project>\n      <Name>FormattableString46</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/ClassLibrary46/Formatter2.cs",
    "content": "﻿using System;\n\nnamespace ClassLibrary\n{\n    public class Formatter2 : IFormatter\n    {\n        public IFormattable Format(int x, int y, int z) => $\"{x} / {y} / {z}\";\n    }\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/ClassLibrary46/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ClassLibrary46\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibrary46\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"b0abb793-3b2a-4fb0-b0af-3df5eb85674e\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/FormattableString20/FormattableString.cs",
    "content": "﻿using System.Globalization;\n\nnamespace System\n{\n    public abstract class FormattableString : IFormattable\n    {\n        public abstract string Format { get; }\n        public abstract int ArgumentCount { get; }\n        public abstract object[] GetArguments();\n        public abstract object GetArgument(int index);\n        public abstract string ToString(IFormatProvider formatProvider);\n        string IFormattable.ToString(string ignored, IFormatProvider formatProvider) => ToString(formatProvider);\n        public static string Invariant(FormattableString formattable)\n        {\n            if (formattable == null)\n            {\n                throw new ArgumentNullException(nameof(formattable));\n            }\n            return formattable.ToString(CultureInfo.InvariantCulture);\n        }\n        public override string ToString() => ToString(CultureInfo.CurrentCulture);\n        protected FormattableString() { }\n    }\n}\n\nnamespace System.Runtime.CompilerServices\n{\n    public static class FormattableStringFactory\n    {\n        private sealed class ConcreteFormattableString : FormattableString\n        {\n            private readonly string _format;\n            private readonly object[] _arguments;\n            public override string Format => _format;\n            public override int ArgumentCount => _arguments.Length;\n            internal ConcreteFormattableString(string format, object[] arguments)\n            {\n                _format = format;\n                _arguments = arguments;\n            }\n            public override object[] GetArguments() => _arguments;\n            public override object GetArgument(int index) => _arguments[index];\n            public override string ToString(IFormatProvider formatProvider) => string.Format(formatProvider, _format, _arguments);\n        }\n        public static FormattableString Create(string format, params object[] arguments)\n        {\n            if (format == null) throw new ArgumentNullException(nameof(format));\n            if (arguments == null) throw new ArgumentNullException(nameof(arguments));\n            return new ConcreteFormattableString(format, arguments);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/FormattableString20/FormattableString20.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{940A4A77-706B-4F7C-814C-33AC8EF2702F}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>System</RootNamespace>\n    <AssemblyName>FormattableStringBridge</AssemblyName>\n    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"FormattableString.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/FormattableString20/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"FormattableString20\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"FormattableString20\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"940a4a77-706b-4f7c-814c-33ac8ef2702f\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/FormattableString46/FormattableString.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\n[assembly: TypeForwardedTo(typeof(FormattableString))]\n[assembly: TypeForwardedTo(typeof(FormattableStringFactory))]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/FormattableString46/FormattableString46.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{DDFE8198-4986-422D-9DA1-31976A85D6EF}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>System</RootNamespace>\n    <AssemblyName>FormattableStringBridge</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"FormattableString.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/FormattableString46/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"FormattableString46\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"FormattableString46\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"ddfe8198-4986-422d-9da1-31976a85d6ef\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/Sample35/Program.cs",
    "content": "﻿using System;\nusing ClassLibrary;\n\nnamespace Sample35\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Format(new Formatter1());\n        }\n\n        static void Format(IFormatter f) => Console.WriteLine(f.Format(1, 2, 3));\n    }\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/Sample35/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"Sample35\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Sample35\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"99fc5d16-f251-4327-ab15-1cefb1e5280d\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/Sample35/Sample35.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{99FC5D16-F251-4327-AB15-1CEFB1E5280D}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Sample35</RootNamespace>\n    <AssemblyName>Sample35</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ClassLibrary35\\ClassLibrary35.csproj\">\n      <Project>{e73a0041-2fd0-46ba-9083-f365204da4b8}</Project>\n      <Name>ClassLibrary35</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\FormattableString20\\FormattableString20.csproj\">\n      <Project>{940a4a77-706b-4f7c-814c-33ac8ef2702f}</Project>\n      <Name>FormattableString20</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/Sample46/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/Sample46/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing ClassLibrary;\n\nnamespace Sample46\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Format(new Formatter1());\n            Format(new Formatter2());\n        }\n\n        static void Format(IFormatter f) => Console.WriteLine(f.Format(1, 2, 3));\n    }\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/Sample46/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"Sample46\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Sample46\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"c54e698f-4427-402f-8fd4-c2ea64ce9612\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/FormattableString/Sample46/Sample46.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{C54E698F-4427-402F-8FD4-C2EA64CE9612}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Sample46</RootNamespace>\n    <AssemblyName>Sample46</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ClassLibrary35\\ClassLibrary35.csproj\">\n      <Project>{e73a0041-2fd0-46ba-9083-f365204da4b8}</Project>\n      <Name>ClassLibrary35</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\ClassLibrary46\\ClassLibrary46.csproj\">\n      <Project>{b0abb793-3b2a-4fb0-b0af-3df5eb85674e}</Project>\n      <Name>ClassLibrary46</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\FormattableString46\\FormattableString46.csproj\">\n      <Project>{ddfe8198-4986-422d-9da1-31976a85d6ef}</Project>\n      <Name>FormattableString46</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/TypeForwarding.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22823.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Sample35\", \"FormattableString\\Sample35\\Sample35.csproj\", \"{99FC5D16-F251-4327-AB15-1CEFB1E5280D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibrary35\", \"FormattableString\\ClassLibrary35\\ClassLibrary35.csproj\", \"{E73A0041-2FD0-46BA-9083-F365204DA4B8}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibrary46\", \"FormattableString\\ClassLibrary46\\ClassLibrary46.csproj\", \"{B0ABB793-3B2A-4FB0-B0AF-3DF5EB85674E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"FormattableString20\", \"FormattableString\\FormattableString20\\FormattableString20.csproj\", \"{940A4A77-706B-4F7C-814C-33AC8EF2702F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"FormattableString46\", \"FormattableString\\FormattableString46\\FormattableString46.csproj\", \"{DDFE8198-4986-422D-9DA1-31976A85D6EF}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Sample46\", \"FormattableString\\Sample46\\Sample46.csproj\", \"{C54E698F-4427-402F-8FD4-C2EA64CE9612}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"FormatableString\", \"FormatableString\", \"{F034F814-150D-425F-9938-96E7A9F0120B}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"VersioningSamples\", \"VersioningSamples\", \"{92B72288-F4EA-484E-8514-32AB14A6F43D}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Version1\", \"Version1\", \"{9F66C0EF-5A3B-4EA9-9A89-FB605CA835EA}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MonolithicClassLibrary\", \"VersioningSamples\\Version1\\MonolithicClassLibrary\\MonolithicClassLibrary.csproj\", \"{98BC56B6-0D09-4A0E-BAB0-052E716A6B27}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Version2\", \"Version2\", \"{9AA017DD-EEFA-438D-8EED-2B5C8ED6E73A}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MonolithicClassLibrary.V2\", \"VersioningSamples\\Version2\\MonolithicClassLibrary\\MonolithicClassLibrary.V2.csproj\", \"{9E8A4F9D-DD24-42D0-A08A-0234EEF984F9}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"StringClassLibrary\", \"VersioningSamples\\Version2\\StringClassLibrary\\StringClassLibrary.csproj\", \"{CA367692-578F-458E-B762-20192B50F1B0}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"HttpClassLibrary\", \"VersioningSamples\\Version2\\HttpClassLibrary\\HttpClassLibrary.csproj\", \"{4509F3A6-8388-4572-9E55-BF54306474B4}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NumericClassLibrary\", \"VersioningSamples\\Version2\\NumericClassLibrary\\NumericClassLibrary.csproj\", \"{EBA2A4E4-E2B1-4B9F-A381-7D19FE65E81C}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"BasicSample\", \"BasicSample\", \"{616987A5-5FB8-4AC2-B301-6D569646EA31}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"_ConsoleApplication1\", \"BasicSamples\\ConsoleApplication1\\_ConsoleApplication1.csproj\", \"{A5FAC446-1E41-4B1B-9C0B-6CAF02B7DB3D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ActualLibrary\", \"BasicSamples\\ActualLibrary\\ActualLibrary.csproj\", \"{E1A26066-353D-45AC-B1F9-E4DD87AF4EAF}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TypeForwardingLibrary\", \"TypeForwardingLibrary\\TypeForwardingLibrary.csproj\", \"{E31CF7AF-14C0-402D-99B0-CCB28C2DD459}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{99FC5D16-F251-4327-AB15-1CEFB1E5280D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{99FC5D16-F251-4327-AB15-1CEFB1E5280D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{99FC5D16-F251-4327-AB15-1CEFB1E5280D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{99FC5D16-F251-4327-AB15-1CEFB1E5280D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E73A0041-2FD0-46BA-9083-F365204DA4B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E73A0041-2FD0-46BA-9083-F365204DA4B8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E73A0041-2FD0-46BA-9083-F365204DA4B8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E73A0041-2FD0-46BA-9083-F365204DA4B8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B0ABB793-3B2A-4FB0-B0AF-3DF5EB85674E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B0ABB793-3B2A-4FB0-B0AF-3DF5EB85674E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B0ABB793-3B2A-4FB0-B0AF-3DF5EB85674E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B0ABB793-3B2A-4FB0-B0AF-3DF5EB85674E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{940A4A77-706B-4F7C-814C-33AC8EF2702F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{940A4A77-706B-4F7C-814C-33AC8EF2702F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{940A4A77-706B-4F7C-814C-33AC8EF2702F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{940A4A77-706B-4F7C-814C-33AC8EF2702F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{DDFE8198-4986-422D-9DA1-31976A85D6EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{DDFE8198-4986-422D-9DA1-31976A85D6EF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{DDFE8198-4986-422D-9DA1-31976A85D6EF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{DDFE8198-4986-422D-9DA1-31976A85D6EF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C54E698F-4427-402F-8FD4-C2EA64CE9612}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C54E698F-4427-402F-8FD4-C2EA64CE9612}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C54E698F-4427-402F-8FD4-C2EA64CE9612}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C54E698F-4427-402F-8FD4-C2EA64CE9612}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{98BC56B6-0D09-4A0E-BAB0-052E716A6B27}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{98BC56B6-0D09-4A0E-BAB0-052E716A6B27}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{98BC56B6-0D09-4A0E-BAB0-052E716A6B27}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{98BC56B6-0D09-4A0E-BAB0-052E716A6B27}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{9E8A4F9D-DD24-42D0-A08A-0234EEF984F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9E8A4F9D-DD24-42D0-A08A-0234EEF984F9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9E8A4F9D-DD24-42D0-A08A-0234EEF984F9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9E8A4F9D-DD24-42D0-A08A-0234EEF984F9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CA367692-578F-458E-B762-20192B50F1B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CA367692-578F-458E-B762-20192B50F1B0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CA367692-578F-458E-B762-20192B50F1B0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CA367692-578F-458E-B762-20192B50F1B0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4509F3A6-8388-4572-9E55-BF54306474B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4509F3A6-8388-4572-9E55-BF54306474B4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4509F3A6-8388-4572-9E55-BF54306474B4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4509F3A6-8388-4572-9E55-BF54306474B4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{EBA2A4E4-E2B1-4B9F-A381-7D19FE65E81C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EBA2A4E4-E2B1-4B9F-A381-7D19FE65E81C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EBA2A4E4-E2B1-4B9F-A381-7D19FE65E81C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EBA2A4E4-E2B1-4B9F-A381-7D19FE65E81C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A5FAC446-1E41-4B1B-9C0B-6CAF02B7DB3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A5FAC446-1E41-4B1B-9C0B-6CAF02B7DB3D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A5FAC446-1E41-4B1B-9C0B-6CAF02B7DB3D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A5FAC446-1E41-4B1B-9C0B-6CAF02B7DB3D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E1A26066-353D-45AC-B1F9-E4DD87AF4EAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E1A26066-353D-45AC-B1F9-E4DD87AF4EAF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E1A26066-353D-45AC-B1F9-E4DD87AF4EAF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E1A26066-353D-45AC-B1F9-E4DD87AF4EAF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E31CF7AF-14C0-402D-99B0-CCB28C2DD459}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E31CF7AF-14C0-402D-99B0-CCB28C2DD459}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E31CF7AF-14C0-402D-99B0-CCB28C2DD459}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E31CF7AF-14C0-402D-99B0-CCB28C2DD459}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{99FC5D16-F251-4327-AB15-1CEFB1E5280D} = {F034F814-150D-425F-9938-96E7A9F0120B}\n\t\t{E73A0041-2FD0-46BA-9083-F365204DA4B8} = {F034F814-150D-425F-9938-96E7A9F0120B}\n\t\t{B0ABB793-3B2A-4FB0-B0AF-3DF5EB85674E} = {F034F814-150D-425F-9938-96E7A9F0120B}\n\t\t{940A4A77-706B-4F7C-814C-33AC8EF2702F} = {F034F814-150D-425F-9938-96E7A9F0120B}\n\t\t{DDFE8198-4986-422D-9DA1-31976A85D6EF} = {F034F814-150D-425F-9938-96E7A9F0120B}\n\t\t{C54E698F-4427-402F-8FD4-C2EA64CE9612} = {F034F814-150D-425F-9938-96E7A9F0120B}\n\t\t{9F66C0EF-5A3B-4EA9-9A89-FB605CA835EA} = {92B72288-F4EA-484E-8514-32AB14A6F43D}\n\t\t{98BC56B6-0D09-4A0E-BAB0-052E716A6B27} = {9F66C0EF-5A3B-4EA9-9A89-FB605CA835EA}\n\t\t{9AA017DD-EEFA-438D-8EED-2B5C8ED6E73A} = {92B72288-F4EA-484E-8514-32AB14A6F43D}\n\t\t{9E8A4F9D-DD24-42D0-A08A-0234EEF984F9} = {9AA017DD-EEFA-438D-8EED-2B5C8ED6E73A}\n\t\t{CA367692-578F-458E-B762-20192B50F1B0} = {9AA017DD-EEFA-438D-8EED-2B5C8ED6E73A}\n\t\t{4509F3A6-8388-4572-9E55-BF54306474B4} = {9AA017DD-EEFA-438D-8EED-2B5C8ED6E73A}\n\t\t{EBA2A4E4-E2B1-4B9F-A381-7D19FE65E81C} = {9AA017DD-EEFA-438D-8EED-2B5C8ED6E73A}\n\t\t{A5FAC446-1E41-4B1B-9C0B-6CAF02B7DB3D} = {616987A5-5FB8-4AC2-B301-6D569646EA31}\n\t\t{E1A26066-353D-45AC-B1F9-E4DD87AF4EAF} = {616987A5-5FB8-4AC2-B301-6D569646EA31}\n\t\t{E31CF7AF-14C0-402D-99B0-CCB28C2DD459} = {616987A5-5FB8-4AC2-B301-6D569646EA31}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/TypeForwardingLibrary/AssemblyAttributes.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\n[assembly: TypeForwardedTo(typeof(Class1))]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/TypeForwardingLibrary/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"TypeForwardingLibrary\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"TypeForwardingLibrary\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"e31cf7af-14c0-402d-99b0-ccb28c2dd459\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/TypeForwardingLibrary/TypeForwardingLibrary.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{E31CF7AF-14C0-402D-99B0-CCB28C2DD459}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>TypeForwardingLibrary</RootNamespace>\n    <AssemblyName>TypeForwardingLibrary</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"AssemblyAttributes.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\BasicSamples\\ActualLibrary\\ActualLibrary.csproj\">\n      <Project>{e1a26066-353d-45ac-b1f9-e4dd87af4eaf}</Project>\n      <Name>ActualLibrary</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version1/MonolithicClassLibrary/HttpExtensions.cs",
    "content": "﻿using System.Net.Http;\nusing System.Threading.Tasks;\n\npublic static class HttpExtensions\n{\n    public static async Task<string> GetStringAsync(this string url)\n    {\n        var c = new HttpClient();\n        var res = await c.GetAsync(url);\n        var s = await res.Content.ReadAsStringAsync();\n        return s;\n    }\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version1/MonolithicClassLibrary/MonolithicClassLibrary.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{98BC56B6-0D09-4A0E-BAB0-052E716A6B27}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>MonolithicClassLibrary</RootNamespace>\n    <AssemblyName>MonolithicClassLibrary</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"HttpExtensions.cs\" />\n    <Compile Include=\"NumericExtensions.cs\" />\n    <Compile Include=\"StringExtensions.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version1/MonolithicClassLibrary/NumericExtensions.cs",
    "content": "﻿using static System.Math;\n\npublic static class NumericExtensions\n{\n    public static int Clip(this int x, int min, int max)\n        => Max(min, Min(x, max));\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version1/MonolithicClassLibrary/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"MonolithicClassLibrary\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"MonolithicClassLibrary\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"98bc56b6-0d09-4a0e-bab0-052e716a6b27\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version1/MonolithicClassLibrary/StringExtensions.cs",
    "content": "﻿public static class StringExtensions\n{\n    public static string ToLower(this string s) =>\n        s == null ? null :\n        char.ToLower(s[0]) + s.Substring(1, s.Length - 1);\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version2/HttpClassLibrary/HttpClassLibrary.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{4509F3A6-8388-4572-9E55-BF54306474B4}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>HttpClassLibrary</RootNamespace>\n    <AssemblyName>HttpClassLibrary</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"HttpExtensions.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version2/HttpClassLibrary/HttpExtensions.cs",
    "content": "﻿using System.Net.Http;\nusing System.Threading.Tasks;\n\npublic static class HttpExtensions\n{\n    public static async Task<string> GetStringAsync(this string url)\n    {\n        var c = new HttpClient();\n        var res = await c.GetAsync(url);\n        var s = await res.Content.ReadAsStringAsync();\n        return s;\n    }\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version2/HttpClassLibrary/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"HttpClassLibrary\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"HttpClassLibrary\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"4509f3a6-8388-4572-9e55-bf54306474b4\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version2/MonolithicClassLibrary/MonolithicClassLibrary.V2.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{9E8A4F9D-DD24-42D0-A08A-0234EEF984F9}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>MonolithicClassLibrary</RootNamespace>\n    <AssemblyName>MonolithicClassLibrary</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"TypeForward.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\HttpClassLibrary\\HttpClassLibrary.csproj\">\n      <Project>{4509f3a6-8388-4572-9e55-bf54306474b4}</Project>\n      <Name>HttpClassLibrary</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\NumericClassLibrary\\NumericClassLibrary.csproj\">\n      <Project>{eba2a4e4-e2b1-4b9f-a381-7d19fe65e81c}</Project>\n      <Name>NumericClassLibrary</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\StringClassLibrary\\StringClassLibrary.csproj\">\n      <Project>{ca367692-578f-458e-b762-20192b50f1b0}</Project>\n      <Name>StringClassLibrary</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version2/MonolithicClassLibrary/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"MonolithicClassLibrary\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"MonolithicClassLibrary\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"9e8a4f9d-dd24-42d0-a08a-0234eef984f9\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version2/MonolithicClassLibrary/TypeForward.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\n[assembly: TypeForwardedTo(typeof(HttpExtensions))]\n[assembly: TypeForwardedTo(typeof(NumericExtensions))]\n[assembly: TypeForwardedTo(typeof(StringExtensions))]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version2/NumericClassLibrary/NumericClassLibrary.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{EBA2A4E4-E2B1-4B9F-A381-7D19FE65E81C}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>NumericClassLibrary</RootNamespace>\n    <AssemblyName>NumericClassLibrary</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"NumericExtensions.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version2/NumericClassLibrary/NumericExtensions.cs",
    "content": "﻿using static System.Math;\n\npublic static class NumericExtensions\n{\n    public static int Clip(this int x, int min, int max)\n        => Max(min, Min(x, max));\n}\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version2/NumericClassLibrary/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"NumericClassLibrary\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"NumericClassLibrary\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"eba2a4e4-e2b1-4b9f-a381-7d19fe65e81c\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version2/StringClassLibrary/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"StringClassLibrary\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"StringClassLibrary\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"ca367692-578f-458e-b762-20192b50f1b0\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version2/StringClassLibrary/StringClassLibrary.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{CA367692-578F-458E-B762-20192B50F1B0}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>StringClassLibrary</RootNamespace>\n    <AssemblyName>StringClassLibrary</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"StringExtensions.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Package/TypeForwarding/VersioningSamples/Version2/StringClassLibrary/StringExtensions.cs",
    "content": "﻿public static class StringExtensions\n{\n    public static string ToLower(this string s) =>\n        s == null ? null :\n        char.ToLower(s[0]) + s.Substring(1, s.Length - 1);\n}\n"
  },
  {
    "path": "Chapters/Resource/Boxing/Boxing.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>Boxing.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Resource/Boxing/Generics/Program.cs",
    "content": "﻿namespace Boxing.Generics\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            Console.WriteLine(CompareTo((IComparable)5, 6));\n            Console.WriteLine(CompareTo((IComparable<int>)5, 6));\n        }\n\n        static int CompareTo(IComparable x, int value)\n        {\n            // IComparable.CompareTo(object) が呼ばれる。\n            // value がボックス化される\n            return x.CompareTo(value);\n        }\n\n        static int CompareTo(IComparable<int> x, int value)\n        {\n            // IComparable<int>.CompareTo(int) が呼ばれる。\n            // value は int のまま渡される\n            return x.CompareTo(value);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/Boxing/IntAsObject/Program.cs",
    "content": "﻿namespace Boxing.IntAsObject\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            Write(5);\n            Write(\"aaa\");\n        }\n\n        static void Write(object x)\n        {\n            Console.WriteLine(x.GetType().Name + \" \" + x.ToString());\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/Boxing/Program.cs",
    "content": "﻿using System;\nusing System.Reflection;\n\nnamespace Boxing\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            // サンプル掲載用に、Version* フォルダー以下の Program も単体で動くように作ってあって、\n            // そっちにも private な Main メソッドがある。\n            // ・ビルド設定で「スタートアップ オブジェクト」をこっちのクラスに設定してある。\n            // ・あっちの private Main はリフレクションで無理やり呼ぶ。\n\n            InvokeMain(typeof(IntAsObject.Program));\n            InvokeMain(typeof(ToString.Program));\n            InvokeMain(typeof(Generics.Program));\n        }\n\n        static void InvokeMain(Type t)\n        {\n            t.GetMethod(nameof(Main), BindingFlags.Static | BindingFlags.NonPublic)!.Invoke(null, null);\n        }\n\n        static void X1()\n        {\n            int x = 5;\n            Console.WriteLine(x.ToString());\n            Console.WriteLine(x.GetHashCode());\n            Console.WriteLine(x.Equals(5));\n            Console.WriteLine(x.GetType().Name);\n        }\n\n        static void X2()\n        {\n            int x = 5;\n            object y = x;   // int を object に。ボックス化が起きる。\n            int z = (int)y; // object から元の型に。ボックス化解除。\n\n            Console.WriteLine(x);\n            Console.WriteLine(y);\n            Console.WriteLine(z);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/Boxing/ToString/Program.cs",
    "content": "﻿namespace Boxing.ToString\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            ObjectWriteLine(5);\n            IntWriteLine(5);\n        }\n\n        static void ObjectWriteLine(object x)\n        {\n            // object.ToString が呼ばれる\n            // 値型に対してはボックス化が必要\n            Console.WriteLine(x.ToString());\n        }\n\n        static void IntWriteLine(int x)\n        {\n            // こういう場合は、int.ToString が直接呼ばれる\n            // virtual メソッドだからといって、必ず virtual に呼ばれるわけじゃない\n            // コンパイルの時点で型が確定してるなら、非 virtual にメソッドを呼ぶ\n            Console.WriteLine(x.ToString());\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/ByRef.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <StartupObject>ByRef.RefReassignment.RefForeach.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Resource/ByRef/InOutAreRef.cs",
    "content": "﻿namespace ByRef.InOutAreRef\n{\n    class Program\n    {\n#if InvalidCode\n        void F(ref int x) { }\n        void F(in int x) { }\n\n        void G(ref int x) { }\n        void G(out int x) => x = 0;\n\n        void H(in int x) { }\n        void H(out int x) => x = 0;\n#endif\n    }\n\n#if InvalidCode\n    interface Contravariance<in T>\n    {\n        // 普通の引数は共変\n        void M(T x);\n\n        // 本来できてもいいはずなものの、.NET 的には無理\n        void M(in T x);\n    }\n\n    interface Covariance<out T>\n    {\n        // 普通の戻り値は反変\n        T M();\n\n        // 本来できてもいいはずなものの、.NET 的には無理\n        void M(out T x);\n    }\n#endif\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/InParameter/InCopy.cs",
    "content": "﻿#pragma warning disable 649\n\nnamespace ByRef.InParameter.InCopy\n{\n    // 作りとしては readonly を意図しているので、何も書き換えしない\n    // でも、struct 自体には readonly が付いていない\n    struct NoReadOnly\n    {\n        public readonly int X;\n        public void M() { }\n    }\n\n    // NoReadOnly と作りは同じ\n    // ちゃんと readonly struct\n    readonly struct ReadOnly\n    {\n        public readonly int X;\n        public void M() { }\n    }\n\n    class Program\n    {\n        // in を付けたので readonly 扱い → M を呼ぶ際にコピー発生\n        static void F(in NoReadOnly x) => x.M();\n\n        // readonly struct であれば問題なし(コピー回避)\n        static void F(in ReadOnly x) => x.M();\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/InParameter/Quarternion.cs",
    "content": "﻿namespace ByRef.InParameter\n{\n    public struct Quarternion\n    {\n        public double W;\n        public double X;\n        public double Y;\n        public double Z;\n        public Quarternion(double w, double x, double y, double z) => (W, X, Y, Z) = (w, x, y, z);\n\n        // 足し算4つくらいならインライン展開されて、値渡しでもコピーのコストが掛からない\n        public static Quarternion operator +(Quarternion a, Quarternion b)\n            => new Quarternion(\n                a.W + b.W,\n                a.X + b.X,\n                a.Y + b.Y,\n                a.Z + b.Z);\n\n        // このくらい中身が大きい(掛け算16個、足し算9個)と、インライン展開されないので in 引数にする効果が結構出る\n        public static Quarternion operator *(in Quarternion a, in Quarternion b)\n            => new Quarternion(\n                a.W * b.W - a.X * b.X - a.Y * b.Y - a.Z * b.Z,\n                a.W * b.X + a.X * b.W + a.Y * b.Z - a.Z * b.Y,\n                a.W * b.Y + a.Y * b.W + a.Z * b.X - a.X * b.Z,\n                a.W * b.Z + a.Z * b.W + a.X * b.Y - a.Y * b.X);\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/OutParameter/Out.cs",
    "content": "﻿namespace ByRef.OutPerameter.Out\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            int a;\n            Test(out a); // out を使った場合、変数を初期化しなくてもいい\n            Console.Write(\"{0}\\n\", a);\n        }\n\n        static void Test(out int a)\n        {\n            a = 10; // out を使った場合、メソッド内で必ず値を代入しなければならない\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/OutParameter/Ref.cs",
    "content": "﻿namespace ByRef.OutPerameter.Ref\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            int a = 0; // この 0 という値には意味はないけど、必須\n            int b = 0; // 同上\n            MultipleReturns(ref a, ref b); // a, b を\n            Console.Write(\"{0}\\n\", a);\n        }\n\n        static void MultipleReturns(ref int a, ref int b)\n        {\n            a = 10; // a を初期化\n            // 本当は b も初期化してやらないといけないけど、忘れててバグってる\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ByRef\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            VariableToVariable();\n        }\n\n        private static void VariableToVariable()\n        {\n            var x = 1;\n            var y = x;\n        }\n\n        static void VariableToParameter()\n        {\n            var x = 1;\n            F(x); // 変数 x から、F の引数 x に値を渡す\n        }\n\n        static void F(int x)\n        {\n        }\n\n        static void ReturnToVariable()\n        {\n            var x = F(); // F の戻り値から変数 x に値を渡す\n        }\n\n        static int F() => 1;\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/RefExtensions/FieldRef.cs",
    "content": "﻿namespace ByRef.RefExtensions.FieldRef\n{\n    using System;\n\n    struct Point\n    {\n        public int X;\n        public int Y;\n        public int Z;\n\n#if InvalidCode\n        public ref int At(int index)\n        {\n            switch (index)\n            {\n                // インスタンス メソッド(プロパティ、インデクサー)では以下の ref が認められていない(コンパイル エラー)\n                case 0: return ref X;\n                case 1: return ref Y;\n                case 2: return ref Z;\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n#endif\n    }\n\n    static class PointExtensions\n    {\n        public static ref int At(ref this Point p, int index)\n        {\n            switch (index)\n            {\n                // インスタンス メソッド版とやっていることは同じでも、こちらは OK\n                case 0: return ref p.X;\n                case 1: return ref p.Y;\n                case 2: return ref p.Z;\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/RefExtensions/Generics.cs",
    "content": "﻿using System;\n\nnamespace ByRef.RefExtensions.Generics\n{\n    static class Extensions\n    {\n        // 構造体(値型)は OK\n        public static void M(ref this int x) { }\n        public static void MI(in this int x) { }\n\n#if InvalidCode\n        // クラス(参照型)はダメ。コンパイル エラー\n        public static void M(ref this string x) { }\n\n        // 制約が付いていないとダメ。コンパイル エラー\n        public static void M1<T>(ref this T x) { }\n#endif\n\n        // ref の場合、struct 制約が付いていれば OK\n        public static void M2<T>(ref this T x) where T : struct { }\n\n        // in の場合、struct 制約が付いてもダメ\n#if InvalidCode\n        public static void M3<T>(in this T x) where T : struct { }\n#endif\n    }\n\n#if InvalidCode\n    static class ReasonWhyClassNotAllowed\n    {\n        // (もしもこれをコンパイル エラーにしなかった場合)\n        public static void M(ref this string s)\n        {\n            // 拡張メソッドの中で参照を書き換える\n            s = null;\n        }\n\n        static void Main()\n        {\n            var s = \"abc\";\n            s.M(); // M の中で s = null される\n            Console.WriteLine(s); // null になってる\n        }\n    }\n\n    static class ReasonWhyGenericStructNotAllowed\n    {\n        // (もしもこれをコンパイル エラーにしなかった場合)\n        public static void M<T>(in this T s)\n            where T : IDisposable\n        {\n            // 結局、この Dispose 呼び出しのところでコピーが起こる\n            // コピーを避けるためには T が readonly struct でないとダメ\n            // インターフェイス越しなので readonly struct かどうかの判定が不可能\n            s.Dispose();\n        }\n    }\n#endif\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/RefExtensions/Quarternion.cs",
    "content": "﻿namespace ByRef.RefExtensions\n{\n    public static class QuarternionExtensions\n    {\n        // 構造体の書き換えを拡張メソッドでやりたい場合に ref 引数が使える\n        public static void Conjugate(ref this Quarternion q)\n        {\n            var norm = q.W * q.W + q.X * q.X + q.Y * q.Y + q.Z * q.Z;\n            q.W = q.W / norm;\n            q.X = -q.X / norm;\n            q.Y = -q.Y / norm;\n            q.Z = -q.Z / norm;\n        }\n\n        // コピーを避けたい場合に in 引数が使える\n        public static Quarternion Rotate(in this Quarternion p, in Quarternion q)\n        {\n            var qc = q;\n            qc.Conjugate();\n            return q * p * qc;\n        }\n    }\n\n    public struct Quarternion\n    {\n        public double W;\n        public double X;\n        public double Y;\n        public double Z;\n        public Quarternion(double w, double x, double y, double z) => (W, X, Y, Z) = (w, x, y, z);\n\n        public static Quarternion operator *(in Quarternion a, in Quarternion b)\n            => new Quarternion(\n                a.W * b.W - a.X * b.X - a.Y * b.Y - a.Z * b.Z,\n                a.W * b.X + a.X * b.W + a.Y * b.Z - a.Z * b.Y,\n                a.W * b.Y + a.Y * b.W + a.Z * b.X - a.X * b.Z,\n                a.W * b.Z + a.Z * b.W + a.X * b.Y - a.Y * b.X);\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/RefReassignment/RefFor.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ByRef.RefReassignment.RefFor\n{\n    class Program\n    {\n        static void Main()\n        {\n            var array = new[] { 1, 3, 5, 2, 4 };\n\n            var x = 0;\n\n            for (ref int i = ref x; i < array.Length; i++)\n            {\n                if (array[i] == 5) break;\n            }\n\n            Console.WriteLine(x); // break した時点の i の値 = 2\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/RefReassignment/RefForeach.cs",
    "content": "﻿namespace ByRef.RefReassignment.RefForeach\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            var array = new int[10];\n            foreach (ref var x in array.AsRef())\n            {\n                // ちゃんとこれで、配列の各要素を書き換えられる。\n                x = 1;\n            }\n\n            foreach (var x in array)\n            {\n                // 全要素 1 になってる。\n                Console.WriteLine(x);\n            }\n        }\n    }\n\n    // 標準で ref 戻り値になっている Enumerable はないので自作。\n    struct RefArrayEnumerable<T>\n    {\n        T[] _array;\n        public RefArrayEnumerable(T[] array) => _array = array;\n        public RefArrayEnumerator<T> GetEnumerator() => new RefArrayEnumerator<T>(_array);\n    }\n\n    struct RefArrayEnumerator<T>\n    {\n        int _index;\n        T[] _array;\n        public RefArrayEnumerator(T[] array) => (_index, _array) = (-1, array);\n        // Current が ref 戻り値になっているのがポイント。\n        public ref T Current => ref _array[_index];\n        public bool MoveNext() => ++_index < _array.Length;\n    }\n\n    static class RefExtensions\n    {\n        public static RefArrayEnumerable<T> AsRef<T>(this T[] array) => new RefArrayEnumerable<T>(array);\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/RefReassignment/RefReassingment.cs",
    "content": "﻿namespace ByRef.RefReassignment\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            int x = 1;\n            int y = 2;\n\n            // x を参照。\n            ref var r = ref x;\n\n            // このとき、r に対する代入は x に反映される。\n            r = 10; // x が 10 になる。\n\n            // これが ref 再代入。\n            // r が y を参照するようになる。\n            r = ref y;\n\n            // 今度は、r に対する代入が y に反映される。\n            r = 20; // y が 20 になる。\n\n            Console.WriteLine((x, y)); // (10, 20)\n        }\n\n        static void M1(ref int x, ref int y)\n        {\n            x = ref y;\n        }\n\n        static void M2(in int x, ref int y)\n        {\n            x = ref y;\n            // y = ref x; ←逆は当然ダメ\n        }\n\n        static void M3(ref int x, out int y)\n        {\n            y = 0; // 先に値を与えないとダメ\n            x = ref y;\n            y = ref x;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/RefReassignment/RefReassingmentMax.cs",
    "content": "﻿namespace ByRef.RefReassignment.RefReassingmentMax\n{\n    using System;\n\n    class Program\n    {\n        static ref int RefMaxOld(int[] array)\n        {\n            if (array.Length == 0) throw new InvalidOperationException();\n\n            // これまでこんな感じでインデックスで持って、\n            var maxIndex = 0;\n\n            for (int i = 1; i < array.Length; i++)\n            {\n                // 毎度毎度、配列のインデックス アクセスするようなコードを書くことがたまに。\n                if (array[maxIndex] < array[i])\n                {\n                    array[maxIndex] = array[i];\n                    maxIndex = i;\n                }\n            }\n\n            return ref array[maxIndex];\n        }\n\n        static ref int RefMax(int[] array)\n        {\n            if (array.Length == 0) throw new InvalidOperationException();\n\n            // それを、こんな風に参照ローカル変数に変えて、\n            ref var max = ref array[0];\n\n            for (int i = 1; i < array.Length; i++)\n            {\n                // ref 再代入で済ませるように。\n                ref var x = ref array[i];\n                if (max < x) max = ref x;\n            }\n\n            return ref max;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ByRef/StackOnly.cs",
    "content": "﻿namespace ByRef.StackOnly\n{\n    using System;\n    using System.Collections;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n#if InvalidCode\n        void M(ref int x)\n        {\n            // クロージャに使えない\n            Action<int> a = i => x = i;\n            void f(int i) => x = i;\n        }\n\n        // イテレーターの引数に使えない\n        IEnumerable Iterator(ref int x)\n        {\n            yield break;\n        }\n\n        // 非同期メソッドの引数に使えない\n        async Task Async(ref int x)\n        {\n            await Task.Delay(1);\n        }\n#endif\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ClassOrStruct/ClassOrStruct.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <Description>ClassOrStruct Console Application</Description>\n    <Authors>Nobuyuki</Authors>\n    <AssemblyName>ClassOrStruct</AssemblyName>\n    <PackageId>ClassOrStruct</PackageId>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Resource/ClassOrStruct/Csharp6.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace Csharp5_Error\n{\n#if false\n    struct Sample1\n    {\n        int _x;\n        int _y;\n        int _z;\n\n        public Sample1(int x, int y)\n        {\n            _x = x;\n            _y = y;\n        }\n    }\n\n    struct Sample2\n    {\n        int _x;\n        int _y;\n\n        public Sample2(int x, int y)\n        {\n            M(); // エラー: _x, _y の初期化より前に呼んじゃダメ。\n            _x = x;\n            _y = y;\n            M(); // この順ならOK。\n        }\n\n        void M() { }\n    }\n#endif\n\n    public struct Point\n    {\n        public int X { get; private set; }\n        public int Y { get; private set; }\n\n        public Point(int x, int y)\n        {\n            // C# 5.0 まではエラーになる\n            X = y;\n            Y = y;\n        }\n    }\n}\n\nnamespace Csharp5\n{\n    public struct Point\n    {\n        private int _x;\n        public int X { get { return _x; } }\n\n        private int _y;\n        public int Y { get { return _y; } }\n\n        public Point(int x, int y)\n        {\n            _x = y;\n            _y = y;\n        }\n    }\n}\n\nnamespace Csharp6\n{\n    public struct Point\n    {\n        public int X { get; }\n        public int Y { get; }\n\n        public Point(int x, int y)\n        {\n            X = y;\n            Y = y;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ClassOrStruct/DefaultValue.cs",
    "content": "﻿#pragma warning disable 649\n\nnamespace DefaultValue\n{\n    using System;\n\n    struct Sample\n    {\n        public int I;\n        public double D;\n        public bool B;\n        public string S;\n    }\n\n    public class Program\n    {\n        static Sample s;\n\n        public static void Main(string[] args)\n        {\n            Console.WriteLine(s.I);\n            Console.WriteLine(s.D);\n            Console.WriteLine(s.B);\n            Console.WriteLine(s.S);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ClassOrStruct/Memberwise.cs",
    "content": "﻿namespace Memberwise\n{\n    using System;\n\n    public class Program\n    {\n        public struct Point\n        {\n            public int X { get; }\n            public int Y { get; }\n\n            public Point(int x, int y) { X = y; Y = y; }\n            public override string ToString() => $\"({X}, {Y})\";\n        }\n\n        public static void Main(string[] args)\n        {\n            var x = new Point(1, 2);\n            var y = x;\n\n            Console.WriteLine(y); // x のメンバー毎コピー = (1, 2)\n\n            // メンバー毎比較(全メンバー一致なら一致)\n            Console.WriteLine(x.Equals(new Point(1, 2))); // true\n            Console.WriteLine(x.Equals(new Point(1, 3))); // false\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ClassOrStruct/ParameterlessConstructor.cs",
    "content": "﻿namespace ParameterlessConstructor\n{\n    using System;\n\n    struct Point\n    {\n        public int X { get; }\n        public int Y { get; }\n        public Point(int x, int y) { X = x; Y = y; }\n        public override string ToString() => $\"({X}, {Y})\";\n    }\n\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            var p1 = new Point();\n            var p2 = new Point(10, 20);\n            var p3 = default(Point); // C# 2.0 以降。p1と同じ意味\n\n            Console.WriteLine(p1);\n            Console.WriteLine(p2);\n            Console.WriteLine(p3);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ClassOrStruct/Program.cs",
    "content": "﻿namespace ClassOrStruct\n{\n    public class Program\n    {\n        static void Main(string[] args)\n        {\n            Memberwise.Program.Main(args);\n            ParameterlessConstructor.Program.Main(args);\n            DefaultValue.Program.Main(args);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ClassOrStruct/SampleClass.cs",
    "content": "﻿public sealed class SampleClass : BaseClass, InterfaceA, InterfaceB\n{\n    public int A { get; set; }\n    public int B { get; set; }\n\n    public SampleClass() { }\n    public SampleClass(int a, int b) { A = a; B = b; }\n\n    public static SampleClass operator -(SampleClass x)\n        => new SampleClass(-x.A, -x.B);\n\n    public override void X() { }\n\n    ~SampleClass() { }\n}\n\npublic class BaseClass\n{\n    public virtual void X() { }\n}\n\npublic static class StaticClass\n{\n    public static string Hex(int x) => x.ToString(\"X\");\n}\n"
  },
  {
    "path": "Chapters/Resource/ClassOrStruct/SampleStruct.cs",
    "content": "﻿public struct SampleStruct : InterfaceA, InterfaceB\n{\n    public int A { get; }\n    public int B { get; }\n\n    public SampleStruct(int a, int b) { A = a; B = b; }\n\n    public static SampleStruct operator-(SampleStruct x)\n        => new SampleStruct(-x.A, -x.B);\n}\n\npublic interface InterfaceA { int A { get; } }\npublic interface InterfaceB { int B { get; } }\n"
  },
  {
    "path": "Chapters/Resource/RecursiveReadOnly/ClassReadonly.cs",
    "content": "﻿namespace RecursiveReadOnly.ClassReadonly\n{\n    // 書き換え可能なクラス\n    class MutableClass\n    {\n        // フィールドを直接公開\n        public int X;\n\n        // 書き換え可能なプロパティ\n        public int Y { get; set; }\n\n        // フィールドの値を書き換えるメソッド\n        public void M(int value) => X = value;\n    }\n\n    class Program\n    {\n        static readonly MutableClass c = new MutableClass();\n\n        static void Main()\n        {\n#if InvalidCode\n            // これは許されない。c は readonly なので、c 自体の書き換えはできない\n            c = new MutableClass();\n#endif\n\n            // けども、c の中身までは保証してない\n            // 書き換え放題\n            c.X = 1;\n            c.Y = 2;\n            c.M(3);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RecursiveReadOnly/Copy.cs",
    "content": "﻿#pragma warning disable 649\n\nnamespace RecursiveReadOnly.Copy\n{\n    using System;\n\n    // 作りとしては readonly を意図しているので、何も書き換えしない\n    // でも、struct 自体には readonly が付いていない\n    struct NoReadOnly\n    {\n        public readonly int X;\n        public void M() { }\n    }\n\n    // NoReadOnly と作りは同じ\n    // ちゃんと readonly struct\n    readonly struct ReadOnly\n    {\n        public readonly int X;\n        public void M() { }\n    }\n\n    class Program\n    {\n        static readonly NoReadOnly nro;\n        static readonly ReadOnly ro;\n\n        static void Main()\n        {\n            // readonly を付けなかった場合\n            // フィールド参照(読み取り)は問題ない\n            Console.WriteLine(nro.X);\n\n            // メソッド呼び出しが問題。ここでコピー発生\n            // (呼び出し側では、「M の中で特に何も書き換えていない」というのを知るすべがないので、防衛的にコピーが発生)\n            nro.M();\n\n            // readonly を付けた場合\n            // これなら、M をそのまま呼んでも何も書き換わらない保証があるので、コピーは起きない\n            ro.M();\n        }\n\n        // これも問題あり(コピー発生)\n        // in を付けたので readonly 扱い → M を呼ぶ際にコピー発生\n        static void F(in NoReadOnly x) => x.M();\n\n        // こちらも、readonly struct であれば問題なし(コピー回避)\n        static void F(in ReadOnly x) => x.M();\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RecursiveReadOnly/Program.cs",
    "content": "﻿using System;\n\nnamespace RecursiveReadOnly\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RecursiveReadOnly/ReadonlyStruct.cs",
    "content": "﻿namespace RecursiveReadOnly.ReadonlyStruct\n{\n    using System;\n\n    // 構造体自体に readonly を付ける\n    readonly struct Point\n    {\n        // フィールドには readonly が必須\n        public readonly int X;\n        public readonly int Y;\n\n        public Point(int x, int y) => (X, Y) = (x, y);\n\n        // readonly を付けない場合と違って、以下のような this 書き換えも不可\n        //public void Set(int x, int y) => this = new Point(x, y);\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var p = new Point(1, 2);\n\n            // p.X = 0; とは書けない。これはちゃんとコンパイル エラーになる\n            // p.Set(3, 4); みたいなのもダメ\n\n            Console.WriteLine(p.X); // 1 しかありえない\n            Console.WriteLine(p.Y); // 2 しかありえない\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RecursiveReadOnly/RecursiveReadOnly.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>RecursiveReadOnly.StructReadonly.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Resource/RecursiveReadOnly/StructReadonly.cs",
    "content": "﻿namespace RecursiveReadOnly.StructReadonly\n{\n    using System;\n\n    // 書き換え可能なクラス\n    struct MutableStruct\n    {\n        // フィールドを直接公開\n        public int X;\n\n        // フィールドの値を書き換えるメソッド\n        public void M(int value) => X = value;\n    }\n\n    class Program\n    {\n        static readonly MutableStruct c = new MutableStruct();\n\n        static void Main() => Allowed();\n\n#if InvalidCode\n        private static void NotAllowed()\n        {\n            // これはもちろん許されない。c は readonly なので、c 自体の書き換えはできない\n            c = new MutableStruct();\n\n            // 構造体の場合、フィールドに関しては readonly な性質を引き継ぐ\n            c.X = 1;\n        }\n#endif\n\n        private static void Allowed()\n        {\n            // でも、メソッドは呼べてしまう\n            c.M(3); // X を 3 で上書きしているはず？\n\n            Console.WriteLine(c.X); // でも、X は 0 のまま\n\n            //↑のコードは、実はコピーが発生している\n            // 以下のコードと同じ意味なる\n\n            var local = c;\n            local.M(3);\n\n            Console.WriteLine(c.X); // 書き換わってるのは local (コピー)の方なので、c は書き換わらない(0)\n\n            Console.WriteLine(local.X); // もちろんこっちは書き換わってる(3)\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RecursiveReadOnly/ThisRewrite.cs",
    "content": "﻿namespace RecursiveReadOnly.ThisRewrite\n{\n    using System;\n\n    struct Point\n    {\n        // フィールドに readonly を付けているものの…\n        public readonly int X;\n        public readonly int Y;\n\n        public Point(int x, int y) => (X, Y) = (x, y);\n\n        // this の書き換えができてしまうので、実は X, Y の書き換えが可能\n        public void Set(int x, int y)\n        {\n            // X = x; Y = y; とは書けない\n            // でも、this 自体は書き換えられる\n            this = new Point(x, y);\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var p = new Point(1, 2);\n\n            // p.X = 0; とは書けない。これはちゃんとコンパイル エラーになる\n\n            // でも、このメソッドは呼べるし、X, Y が書き換わる\n            p.Set(3, 4);\n\n            Console.WriteLine(p.X); // 3\n            Console.WriteLine(p.Y); // 4\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefAndPointer/NullRef.cs",
    "content": "﻿namespace RefAndPointer._NullRef\n{\n    using System;\n    using System.Runtime.CompilerServices;\n\n    unsafe static class NullReference\n    {\n        public static ref T Null<T>() => ref Unsafe.AsRef<T>((void*)0);\n        public static bool IsNull<T>(ref T x) => Unsafe.AsPointer(ref x) == (void*)0;\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            ref var x = ref NullReference.Null<int>();\n            Console.WriteLine(NullReference.IsNull(ref x)); // true\n            Console.WriteLine(x); // 実行時エラー。NullReferenceException 発生\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefAndPointer/RefAndPointer.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <StartupObject>RefAndPointer._NullRef.Program</StartupObject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.5.2\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Resource/RefAndPointer/UnsafeClass.cs",
    "content": "﻿namespace RefAndPointer.UnsafeClass\n{\n    using System;\n    using System.Runtime.CompilerServices;\n\n    class Program\n    {\n        static void Main()\n        {\n            unsafe\n            {\n                int x = 1;\n                void* pointer = Unsafe.AsPointer(ref x);\n                *(int*)pointer = 2;\n\n                Console.WriteLine(x); // 2 になってる\n\n                ref int r = ref Unsafe.AsRef<int>(pointer);\n                r = 3;\n\n                Console.WriteLine(*(int*)pointer); // 3 になってる\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefAndPointer/UnsafeRef.cs",
    "content": "﻿namespace RefAndPointer.UnsafeRef\n{\n    using System.Runtime.CompilerServices;\n    using System.Runtime.InteropServices;\n\n    struct ManagedBuffer\n    {\n        int[] _array;\n        public ManagedBuffer(int length) { _array = new int[length]; }\n\n        public ref int this[int index] => ref _array[index];\n    }\n\n    unsafe struct UnsafeBuffer\n    {\n        void* _pointer;\n        public UnsafeBuffer(int* pointer) { _pointer = pointer; }\n\n        public ref int this[int index] => ref Unsafe.AsRef<int>(_pointer);\n    }\n\n    class Program\n    {\n        unsafe static void Main()\n        {\n            // 配列と\n            var b1 = new ManagedBuffer(10);\n            b1[0] = 1;\n\n            // スタック領域と\n            var stack = stackalloc int[10];\n            var b2 = new UnsafeBuffer(stack);\n            b2[0] = 1;\n\n            // アンマネージなメモリとを同じように触れる\n            var p = Marshal.AllocHGlobal(10 * sizeof(int));\n            var b3 = new UnsafeBuffer((int*)p);\n            b3[0] = 1;\n\n            Marshal.Release(p);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Chapters/Resource/RefReturns/MultiStepRef/Program.cs",
    "content": "﻿namespace RefReturns.MultiStepRef\n{\n    using System;\n\n    class Program\n    {\n        public static void Main()\n        {\n            var x = 10;\n            ref var y = ref Ref(ref x);\n            y = 0; // y は巡り巡って x を参照。x も 0 に\n\n            Console.WriteLine($\"{x}, {y}\"); // 0, 0\n        }\n\n        static ref int Ref(ref int x) => ref x;\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/Pointers/Program.cs",
    "content": "﻿namespace RefReturns.Pointers\n{\n    class Program\n    {\n        public static ref int Max(ref int x, ref int y)\n        {\n            if (x >= y) return ref x;\n            else return ref y;\n        }\n\n        public static unsafe int* Max(int* x, int* y)\n        {\n            if (*x >= *y) return x;\n            else return y;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/Program.cs",
    "content": "﻿using RefReturns.ValueTypePassedByReference;\nusing System;\n\nnamespace RefReturns\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            CircularBufferSample.Main();\n            ValueTypePassedByReference.Program.Main();\n            RefReturns.Program.Main();\n            RefLocal.Program.Main();\n        }\n\n        static void Caller()\n        {\n            var x = 10;\n            ref var y = ref Ref(ref x);\n            y = 0; // y は巡り巡って x を参照。x も 0 に\n\n            Console.WriteLine($\"{x}, {y}\"); // 0, 0\n        }\n\n        static ref int Ref(ref int x) => ref x;\n\n#if false\n\n        // 参照引数は参照戻り値で返せる\n        private static ref int Success1(ref int x) => ref x;\n\n        // 値渡しの引数はダメ\n        private static ref int Error1(int x) => ref x;\n\n        // ローカル変数はダメ\n        private static ref int Error2()\n        {\n            var x = int.Parse(Console.ReadLine());\n            return ref x;\n        }\n\n        // 多段の場合も元をたどって出所を調べてくれる\n        private static ref int Success1(ref int x, ref int y)\n        {\n            ref int r1 = ref x;\n            ref int r2 = ref y;\n            ref int r3 = ref Max(ref r1, ref r2);\n\n            // r3 は出所をたどると引数の x か y の参照\n            // x も y も参照引数なので大丈夫\n            return ref r3;\n        }\n\n        private static ref int Error1(ref int x, int y)\n        {\n            ref int r1 = ref x;\n            ref int r2 = ref y;\n            ref int r3 = ref Max(ref r1, ref r2);\n\n            // y が値渡しなのでダメ\n            return ref r3;\n        }\n\n        private static ref int Error2(ref int x)\n        {\n            var y = int.Parse(Console.ReadLine());\n            ref int r1 = ref x;\n            ref int r2 = ref y;\n            ref int r3 = ref Max(ref r1, ref r2);\n\n            // y がローカル変数なのでダメ\n            return ref r3;\n        }\n\n#endif\n\n        private static ref int Max(ref int x, ref int y)\n        {\n            if (x >= y) return ref x;\n            else return ref y;\n        }\n\n        private static int MaxIndex(int[] array, int i, int j)\n        {\n            if (array[i] >= array[j]) return i;\n            else return j;\n        }\n\n        private static void Old()\n        {\n            var data = new[] { 3, 5, 2, 1, 4 };\n            var m = MaxIndex(data, 0, 1);\n            data[m] = 0;\n            Console.WriteLine($\"{data[0]}, {data[1]}\");\n        }\n\n        private static void New()\n        {\n            var data = new[] { 3, 5, 2, 1, 4 };\n            ref var m = ref Max(ref data[0], ref data[1]);\n            m = 0;\n            Console.WriteLine($\"{data[0]}, {data[1]}\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"RefReturns\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"RefReturns\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"a080169a-a2c3-498c-a64c-ceb1cbdb925a\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/RefLocals/Program.cs",
    "content": "﻿namespace RefReturns.RefLocal\n{\n    using System;\n\n    class Program\n    {\n        public static void Main()\n        {\n            var a = 10;\n\n            ref var b = ref a; // 参照ローカル変数。宣言側にも、値を渡す側にも ref\n\n            var c = b;         // これは普通に値渡し(コピー)。この時点の a の値 = 10 が入る\n            ref var d = ref b; // さらに参照渡しで、結局 a を参照\n\n            d = 1; // d = b = a を書き換え\n\n            ref var e = ref Ref(ref c); // 参照戻り値越しに、c を参照\n            var f = Ref(ref c);         // これは結局、値渡し(コピー)\n\n            ++e;   // e = c を +1。元が10なので、11に\n            f = 0; // f は普通に値渡しで作った新しい変数なので他に影響なし\n\n            // 結果は 1, 1, 11, 1, 11, 0\n            // a, b, d が同じ場所を参照してて 1\n            // 同上、c, e が 11\n            // f が 0\n            Console.WriteLine(string.Join(\", \", a, b, c, d, e, f));\n        }\n\n        // 引数を素通し\n        static ref int Ref(ref int x) => ref x;\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/RefReturns/Program.cs",
    "content": "﻿namespace RefReturns.RefReturns\n{\n    using System;\n\n    class Program\n    {\n        public static void Main()\n        {\n            var x = new[] { -1, -1, -1, -1, -1 };\n\n            for (int i = 0; i < x.Length; i++)\n            {\n                // 戻り値を書き換えてる\n                // 実際書き換わってるのは参照先の配列 x の i 番目\n                Ref(x, i) = i;\n            }\n\n            // ↑のループで書き換えたので、結果は 0, 1, 2, 3, 4\n            Console.WriteLine(string.Join(\", \", x));\n        }\n\n        // 配列の i 番目の要素を参照\n        static ref int Ref(int[] array, int i) => ref array[i];\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/RefReturns.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{A080169A-A2C3-498C-A64C-CEB1CBDB925A}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>RefReturns</RootNamespace>\n    <AssemblyName>RefReturns</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;DEBUG;__DEMO__</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;__DEMO__</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject>RefReturns.Summary.Program</StartupObject>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"MultiStepRef\\Program.cs\" />\n    <Compile Include=\"Pointers\\Program.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"RefLocals\\Program.cs\" />\n    <Compile Include=\"RefReturns\\Program.cs\" />\n    <Compile Include=\"Summary.cs\" />\n    <Compile Include=\"ValueTypePassedByReference\\ArraySample.cs\" />\n    <Compile Include=\"ValueTypePassedByReference\\Capsuled\\Program.cs\" />\n    <Compile Include=\"ValueTypePassedByReference\\CircularBuffer.cs\" />\n    <Compile Include=\"ValueTypePassedByReference\\ImmutablePoint.cs\" />\n    <Compile Include=\"ValueTypePassedByReference\\Ref\\Program.cs\" />\n    <Compile Include=\"ValueTypePassedByReference\\Raw\\Program.cs\" />\n    <Compile Include=\"ValueTypePassedByReference\\Program.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <ItemGroup />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Resource/RefReturns/Summary.cs",
    "content": "﻿namespace RefReturns.Summary\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            var x = 10;\n            var y = 20;\n\n            // x, y のうち、大きい方の参照を返す。この例の場合 y を参照。\n            ref var m = ref Max(ref x, ref y);\n\n            // 参照の書き換えなので、その先の y が書き換わる。\n            m = 0;\n\n            Console.WriteLine($\"{x}, {y}\"); // 10, 0\n        }\n\n        static ref int Max(ref int x, ref int y)\n        {\n            if (x < y) return ref y;\n            else return ref x;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/ValueTypePassedByReference/ArraySample.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace RefReturns.ValueTypePassedByReference\n{\n    class ArraySample\n    {\n        public static void Main()\n        {\n            var array = new[]\n            {\n                new Point(),\n                new Point(),\n            };\n            // 配列のインデクサーは要素への参照になってる\n            // 値型の要素の書き換え可能\n            array[0].X = 1; // OK\n\n            var list = new List<Point>\n            {\n                new Point(),\n                new Point(),\n            };\n            // これまで、ユーザー定義のインデクサーは参照返せなかった\n            // 当然、C# 6以前からあるクラスのインデクサーは値型の要素の書き換え不能\n#if false\n            list[0].X = 1; // コンパイル エラー\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/ValueTypePassedByReference/Capsuled/Program.cs",
    "content": "﻿namespace RefReturns.ValueTypePassedByReference.Capsuled\n{\n    class CapsuledData\n    {\n        // プロパティで公開\n        public Point P { get; set; }\n\n        // インデクサーで公開\n        public Point this[int i]\n        {\n            get { return _items[i]; }\n            set { _items[i] = value; }\n        }\n        private Point[] _items = new Point[3];\n    }\n\n    class Program\n    {\n        public static void Main()\n        {\n#if false\n            var cap = new CapsuledData();\n            cap.P.X = 1; // プロパティの戻り値(コピー品)の書き換えはエラーに\n            cap[0].X = 1; // インデクサーの戻り値も同様、エラーに\n#else\n            // こんな書き方が必須になる\n            var cap = new CapsuledData();\n            var p = cap.P;\n            p.X = 1;\n            cap.P = p;\n            var q = cap[0];\n            q.X = 1;\n            cap[0] = q;\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/ValueTypePassedByReference/CircularBuffer.cs",
    "content": "﻿using System;\n\nnamespace RefReturns.ValueTypePassedByReference\n{\n    /// <summary>\n    /// 循環バッファー。\n    /// </summary>\n    /// <typeparam name=\"T\">要素の型。</typeparam>\n    class CircularBuffer<T>\n    {\n        private int _startIndex;\n        private T[] _data;\n\n        /// <summary>\n        /// 容量を指定して初期化。\n        /// </summary>\n        /// <param name=\"capacity\">容量。</param>\n        public CircularBuffer(int capacity)\n        {\n            _startIndex = 0;\n            _data = new T[capacity];\n        }\n\n        /// <summary>\n        /// 値を追加。\n        /// 容量を超えた分は古いものから削除。\n        /// </summary>\n        /// <param name=\"item\">新しい値。</param>\n        public void Push(T item)\n        {\n            _data[_startIndex] = item;\n            _startIndex++;\n            if (_startIndex >= _data.Length) _startIndex = 0;\n        }\n\n        /// <summary>\n        /// 先頭要素。\n        /// </summary>\n        public ref T Head => ref _data[_startIndex];\n\n        /// <summary>\n        /// 先頭から <paramref name=\"index\"/> 先の要素。\n        /// </summary>\n        /// <param name=\"index\">先頭からの位置。</param>\n        /// <returns></returns>\n        public ref T this[int index] => ref _data[(_startIndex + index) % _data.Length];\n    }\n\n    class CircularBufferSample\n    {\n        public static void Main()\n        {\n            var x = new CircularBuffer<Point>(5);\n\n            for (int i = 0; i < 10; i++)\n            {\n                x.Push(new Point { X = i, Y = i * 2 });\n\n                for (int j = 0; j < 5; j++)\n                {\n                    x[j].X = 3 * j;\n                }\n\n                for (int j = 0; j < 5; j++)\n                {\n                    Console.Write(x[j] + \", \");\n                }\n                Console.WriteLine();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/ValueTypePassedByReference/ImmutablePoint.cs",
    "content": "﻿namespace RefReturns.ValueTypePassedByReference.Immutable\n{\n    struct Point\n    {\n        public readonly int X;\n        public readonly int Y;\n\n        public Point(int x, int y) { X = x;  Y = y; }\n        public override string ToString() => $\"({X}, {Y})\";\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/ValueTypePassedByReference/Program.cs",
    "content": "﻿namespace RefReturns.ValueTypePassedByReference\n{\n    using System;\n\n    struct Point\n    {\n        public int X;\n        public int Y;\n\n        public override string ToString() => $\"({X}, {Y})\";\n    }\n\n    class Program\n    {\n        public static void Main()\n        {\n            var p = new Point { X = 1, Y = 2 };\n\n            // p のコピーが作られる\n            var q = p;\n\n            // コピー側の書き換えなので、p には影響なし\n            q.X = 3;\n            Console.WriteLine(p); // 1, 2\n            Console.WriteLine(q); // 3, 2\n\n            // 同じく、p を書き換えても q に影響なし\n            p.Y = 4;\n            Console.WriteLine(p); // 1, 4\n            Console.WriteLine(q); // 3, 2\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/ValueTypePassedByReference/Raw/Program.cs",
    "content": "﻿namespace RefReturns.ValueTypePassedByReference.Raw\n{\n    class RawData\n    {\n        // フィールドを直接公開\n        public Point P;\n\n        // 配列を公開\n        public Point[] Items { get; } = new Point[3];\n    }\n\n    class Program\n    {\n        public static void Main()\n        {\n            var raw = new RawData();\n            raw.P.X = 1; // フィールドは直接書き換え可能\n            raw.Items[0].X = 1; // 配列の要素の直接書き換え可能\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/RefReturns/ValueTypePassedByReference/Ref/Program.cs",
    "content": "﻿namespace RefReturns.ValueTypePassedByReference.Ref\n{\n    class RefData\n    {\n        // 参照戻り値のプロパティで公開\n        public ref Point P => ref _p;\n        private Point _p;\n\n        // 参照戻り値のインデクサーで公開\n        public ref Point this[int i] => ref _items[i];\n        private Point[] _items = new Point[3];\n    }\n\n    class Program\n    {\n        public static void Main()\n        {\n            var raw = new RefData();\n            raw.P.X = 1; // プロパティ越しに、参照先のフィールドを書き換え可能\n            raw[0].X = 1; // インデクサー越しに、参照先の配列を書き換え可能\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/ResourceManagement.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27102.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Boxing\", \"Boxing\\Boxing.csproj\", \"{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WeakReference\", \"WeakReference\\WeakReference.csproj\", \"{83481B0E-62A6-4427-B645-FCE090A3F8C3}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ClassOrStruct\", \"ClassOrStruct\\ClassOrStruct.csproj\", \"{3A412CF5-C377-4EF9-BD73-8CF27950C990}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"StructPerformance\", \"StructPerformance\\StructPerformance.csproj\", \"{4E3E8CFD-6DB9-4D95-845D-1E955796C061}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RefReturns\", \"RefReturns\\RefReturns.csproj\", \"{A080169A-A2C3-498C-A64C-CEB1CBDB925A}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ByRef\", \"ByRef\\ByRef.csproj\", \"{BEEF5270-1266-4164-AE0A-C0E5E301B687}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"StructLayoutSample\", \"StructLayoutSample\\StructLayoutSample.csproj\", \"{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RefAndPointer\", \"RefAndPointer\\RefAndPointer.csproj\", \"{33541ADA-A350-4C7E-AA45-BA1565A885E1}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"RecursiveReadOnly\", \"RecursiveReadOnly\\RecursiveReadOnly.csproj\", \"{B02498B6-0452-4A05-8DF9-BF84FF097853}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Span\", \"Span\\Span.csproj\", \"{95AC6C54-F64F-485E-A825-95B4D74D6E6D}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EB51A057-60F6-44C8-AEDD-6591B5DC88A8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{83481B0E-62A6-4427-B645-FCE090A3F8C3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3A412CF5-C377-4EF9-BD73-8CF27950C990}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3A412CF5-C377-4EF9-BD73-8CF27950C990}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3A412CF5-C377-4EF9-BD73-8CF27950C990}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3A412CF5-C377-4EF9-BD73-8CF27950C990}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4E3E8CFD-6DB9-4D95-845D-1E955796C061}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A080169A-A2C3-498C-A64C-CEB1CBDB925A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A080169A-A2C3-498C-A64C-CEB1CBDB925A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A080169A-A2C3-498C-A64C-CEB1CBDB925A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A080169A-A2C3-498C-A64C-CEB1CBDB925A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{BEEF5270-1266-4164-AE0A-C0E5E301B687}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BEEF5270-1266-4164-AE0A-C0E5E301B687}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BEEF5270-1266-4164-AE0A-C0E5E301B687}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BEEF5270-1266-4164-AE0A-C0E5E301B687}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D5D09AA6-99FE-43B3-9EEE-44E5DDBB8EEC}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{33541ADA-A350-4C7E-AA45-BA1565A885E1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B02498B6-0452-4A05-8DF9-BF84FF097853}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B02498B6-0452-4A05-8DF9-BF84FF097853}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B02498B6-0452-4A05-8DF9-BF84FF097853}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B02498B6-0452-4A05-8DF9-BF84FF097853}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{95AC6C54-F64F-485E-A825-95B4D74D6E6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{95AC6C54-F64F-485E-A825-95B4D74D6E6D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{95AC6C54-F64F-485E-A825-95B4D74D6E6D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{95AC6C54-F64F-485E-A825-95B4D74D6E6D}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {89CFCA2F-0027-41D0-8EB0-A1AD571854E3}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Resource/Span/.gitignore",
    "content": "*.data"
  },
  {
    "path": "Chapters/Resource/Span/Pointer.cs",
    "content": "﻿namespace Span.Pointer\n{\n    using System;\n\n    // unsafe を使うと速い処理の典型例として、一定範囲を 0 クリアする処理\n    class Program\n    {\n        // 作る側\n        // ライブラリを作る側としては別に unsafe コードがあっても不都合はそこまでない\n        static unsafe void Clear(byte* p, int length)\n        {\n            var last = p + length;\n            while (p + 8 < last)\n            {\n                *(ulong*)p = 0;\n                p += 8;\n            }\n            if (p + 4 < last)\n            {\n                *(uint*)p = 0;\n                p += 4;\n            }\n            while (p < last)\n            {\n                *p = 0;\n                ++p;\n            }\n        }\n\n        // 使う側\n        static void Main()\n        {\n            var array = new byte[256];\n\n            // array をいろいろ書き換えた後、全要素 0 にクリアしたいとして\n            for (int i = 0; i < array.Length; i++) array[i] = (byte)(i + 1);\n\n            // ライブラリを使う側に unsafe が必要なのは怖いし面倒\n            unsafe\n            {\n                fixed (byte* p = array)\n                    Clear(p, array.Length);\n            }\n\n            Console.WriteLine(string.Join(\"\", array));\n        }\n\n        // 使う側に unsafe を求めないために要するオーバーロードいろいろ\n        static void Clear(ArraySegment<byte> segment)\n        {\n            if (segment.Array is null) throw new ArgumentNullException(nameof(segment));\n            Clear(segment.Array, segment.Offset, segment.Count);\n        }\n\n        static void Clear(byte[] array, int offset = 0) => Clear(array, offset, array.Length - offset);\n        static void Clear(byte[] array, int offset, int length)\n        {\n            unsafe\n            {\n                fixed (byte* p = array)\n                {\n                    Clear(p + offset, length);\n                }\n            }\n        }\n    }\n}\n\nnamespace Span.Pointer.Copy\n{\n    using System;\n\n    class Program\n    {\n        // Clear は1つしか引数がないのでまだマシ。\n        // コピー(コピー元とコピー先)とか、2つになるとだいぶ面倒に。\n\n        static void Copy(ArraySegment<byte> source, ArraySegment<byte> destination)\n        {\n            if (source.Array is null) throw new ArgumentNullException(nameof(source));\n            if (destination.Array is null) throw new ArgumentNullException(nameof(destination));\n            Copy(source.Array, source.Offset, destination.Array, destination.Offset, source.Count);\n        }\n\n        static void Copy(byte[] source, int sourceOffset, byte[] destination, int destinationOffset)\n            => Copy(source, sourceOffset, destination, destinationOffset, source.Length - sourceOffset);\n        static void Copy(byte[] source, int sourceOffset, byte[] destination, int destinationOffset, int length)\n        {\n            unsafe\n            {\n                fixed (byte* s = source)\n                fixed (byte* d = destination)\n                {\n                    Copy(s + sourceOffset, d + destinationOffset, length);\n                }\n            }\n        }\n        // 他にも、利便性を求めるなら、\n        // source, destination の片方だけが ArraySegment のパターンとか\n        // 片方だけがポインターのパターンとか(組み合わせなのでパターンが多くなる)\n\n        static unsafe void Copy(byte* source, byte* destination, int length)\n        {\n            var last = source + length;\n            while (source + 8 < last)\n            {\n                *(ulong*)source = *(ulong*)destination;\n                source += 8;\n            }\n            if (source + 4 < last)\n            {\n                *(uint*)source = *(uint*)destination;\n                source += 4;\n            }\n            while (source < last)\n            {\n                *source = *destination;\n                ++source;\n            }\n        }\n    }\n}\n\nnamespace Span.Pointer.Span\n{\n    using System;\n\n    class Program\n    {\n        // 作る側\n        // Span<T> なら配列でもポインターでも、その全体でも一部分でも受け取れる\n        static void Clear(Span<byte> span)\n        {\n            unsafe\n            {\n                // 結局内部的には unsafe にしてポインターを使った方が速い場合あり\n                fixed (byte* pin = span)\n                {\n                    var p = pin;\n                    var last = p + span.Length;\n                    while (p + 8 < last)\n                    {\n                        *(ulong*)p = 0;\n                        p += 8;\n                    }\n                    if (p + 4 < last)\n                    {\n                        *(uint*)p = 0;\n                        p += 4;\n                    }\n                    while (p < last)\n                    {\n                        *p = 0;\n                        ++p;\n                    }\n                }\n            }\n        }\n\n        // 使う側\n        static void Main()\n        {\n            var array = new byte[256];\n\n            // array をいろいろ書き換えた後、全要素 0 にクリアしたいとして\n            for (int i = 0; i < array.Length; i++) array[i] = (byte)(i + 1);\n\n            // 呼ぶのがだいぶ楽\n            Clear(array);\n\n            Console.WriteLine(string.Join(\"\", array));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/Span/Program.cs",
    "content": "﻿using System;\n\nnamespace Span\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            MinimalSample();\n        }\n\n        private static void MinimalSample()\n        {\n            // 長さ 8 で配列作成\n            // C# の仕様で、全要素 0 で作られる\n            var array = new int[8];\n\n            // 配列の、2番目(0 始まりなので3要素目)から、3要素分の範囲\n#if true\n            var span = new Span<int>(array, 2, 3);\n#else\n            var span = array.AsSpan().Slice(2, 3);\n#endif\n\n            // その範囲だけを 1 に上書き\n            for (int i = 0; i < span.Length; i++)\n            {\n                span[i] = 1;\n            }\n\n            // ちゃんと、2, 3, 4 番目だけが 1 になってる\n            foreach (var x in array)\n            {\n                Console.WriteLine(x); // 0, 0, 1, 1, 1, 0, 0, 0\n            }\n\n            // 読み取り専用版\n            ReadOnlySpan<int> r = span;\n            var a = r[0]; // 読み取りは OK\n#if InvalidCode\n            r[0] = 1;     // 書き込みは NG\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/Span/SafeStackalloc.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Span.SafeStackalloc\n{\n    class Program\n    {\n        static void Main()\n        {\n            Safe();\n            Unsafe();\n        }\n\n        // Span 版 = safe\n        static void Safe()\n        {\n            Span<byte> span = stackalloc byte[8];\n\n            try\n            {\n                // 8バイトしか確保していないのに、9要素目に書き込み\n                span[8] = 1;\n            }\n            catch(IndexOutOfRangeException)\n            {\n                // ちゃんと例外が発生してここに来る\n                Console.WriteLine(\"span[8] はダメ\");\n            }\n        }\n\n        // ポインター版 = unsafe\n        static unsafe void Unsafe()\n        {\n            byte* p = stackalloc byte[8];\n\n            try\n            {\n                // 8バイトしか確保していないのに、9要素目に書き込み\n                p[8] = 1;\n            }\n            catch (Exception)\n            {\n                // ここには来ない！\n                // 結果、不正な場所に 1 が書き込まれてるはず(かなり危険)\n                // それも、エラーを拾う手段がないので気づきにくい\n                throw;\n            }\n        }\n\n        static void ConditionalStackalloc(int bufferSize)\n        {\n            Span<byte> buffer = bufferSize <= 128 ? stackalloc byte[bufferSize] : new byte[bufferSize];\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/Span/Span.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>Span.SafeStackalloc.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Resource/Span/SpanSafetyRules.cs",
    "content": "﻿#pragma warning disable 169\n\nusing System;\n\nnamespace Span.SpanSafetyRules\n{\n    class SpanSafety\n    {\n        // 引数で受け取ったものは戻り値で返せる\n        private static Span<int> Success(Span<int> x) => x;\n\n#if InvalidCode\n        // ローカルで確保したもの変数はダメ\n        private static Span<int> Error()\n        {\n            Span<int> x = stackalloc int[1];\n            return x;\n        }\n#endif\n        // ちゃんと「メモリ確保」があったかどうかを見てる\n        // 同じようなコードでもこれは OK (default だと何も確保しない)\n        private static Span<int> Success1()\n        {\n            Span<int> x = default;\n            return x;\n        }\n\n        // 多段の場合も元をたどって出所を調べてくれる\n        private static Span<int> Success(Span<int> x, Span<int> y)\n        {\n            var r1 = x;\n            var r2 = y;\n            var r3 = r1.Length >= r2.Length ? r1 : r2;\n\n            // r3 は出所をたどると引数の x か y\n            // x も y も引数なので大丈夫\n            return r3;\n        }\n\n#if InvalidCode\n        private static Span<int> Error(Span<int> x, int n)\n        {\n            var r1 = x;\n            Span<int> r2 = stackalloc int[n];\n            var r3 = r1.Length >= r2.Length ? r1 : r2;\n\n            // r2 がローカルなのでダメ\n            return r3;\n        }\n#endif\n    }\n\n    class SpanAndRefSafty\n    {\n        // 引数で受け取った Span 由来の ref 戻り値は返せる\n        private static ref int Success(Span<int> x) => ref x[0];\n\n#if InvalidCode\n        // ローカルで確保した Span 由来の ref 戻り値はダメ\n        private static ref int Error()\n        {\n            Span<int> x = stackalloc int[1];\n            return ref x[0];\n        }\n#endif\n    }\n\n    namespace ReadOnlyRef\n    {\n        using System;\n\n        // ref だけ\n        ref struct RefToSpan\n        {\n            private readonly Span<int> _span;\n            public RefToSpan(Span<int> span) => _span = span;\n\n            // 例え _span に readonly が付いていても、this 書き換えが可能\n            public void Method(Span<int> span) { this = new RefToSpan(span); }\n        }\n\n        // readonly ref\n        readonly ref struct RORefToSpan\n        {\n            private readonly Span<int> _span;\n            public void Method(Span<int> span) { }\n        }\n\n        class Program\n        {\n#if InvalidCode\n            public static void LocalToRef(RefToSpan r)\n            {\n                Span<int> local = stackalloc int[1];\n                r.Method(local); // ここでエラーになる。r の中身が書き換えられることで、local が外に漏れる可能性を危惧\n\n                // 注: この例の場合は実際には漏れはしないものの、RefToSpan の作り次第なので保証はできない\n            }\n#endif\n\n            public static void LocalToRORef(RORefToSpan r)\n            {\n                Span<int> local = stackalloc int[1];\n                r.Method(local); // readonly ref に対してなら OK\n            }\n        }\n    }\n\n    class Unsafe\n    {\n        unsafe static Span<int> X()\n        {\n            // ローカル\n            int x = 10;\n\n            // unsafe な手段でローカルなものの参照を作って返す\n            // これをやってしまうとまずいものの、コンパイル時にはエラーにできない\n            return new Span<int>(&x, 1);\n        }\n    }\n\n#if InvalidCode\n    namespace StackOnly\n    {\n        using System;\n        using System.Collections.Generic;\n        using System.Threading.Tasks;\n\n        //❌ そもそもクラスに ref を付けれないのも stack-only を保証するため\n        ref class Class { }\n\n        //❌ インターフェイス実装\n        ref struct RefStruct : IDisposable { public void Dispose() { } }\n\n        class Program\n        {\n            //❌ 非同期メソッドの引数\n            static async Task Async(Span<int> x)\n            {\n                //❌ 非同期メソッドのローカル変数\n                Span<int> local = stackalloc int[10];\n            }\n\n            //❌ イテレーターの引数\n            static IEnumerable<int> Iterator(Span<int> x)\n            {\n                Span<int> local = stackalloc int[10];\n                local[0] = 1; //⭕ yield return をまたがないならOK\n                yield return 0;\n                //❌ yield をまたいだ読み書き\n                local[0] = 2; // ダメ\n            }\n\n            static void Main()\n            {\n                Span<int> local = stackalloc int[1];\n\n                //❌ box 化\n                object obj = local;\n\n                //❌ object のメソッド呼び出し\n                var str = local.ToString();\n\n                //❌ クロージャ\n                Func<int> a1 = () => local[0];\n                int F() => local[0];\n\n                //❌ 型引数にも渡せない\n                List<Span<int>> list;\n            }\n        }\n    }\n#endif\n\n#if Sample\n    // Span<T> は ref 構造体になっている\n    public readonly ref struct Span<T> { ... }\n\n    // ref 構造体を持てるのは ref 構造体だけ\n    ref struct RefStruct\n    {\n        private Span<int> _span; //OK\n    }\n\n    // NG。構造体以外を「ref 型」にはできない\n    ref class InvalidClass { }\n\n    // ref がついていない普通の構造体は ref 構造体を持てない\n    struct NonRefStruct\n    {\n        private Span<int> _span; //NG\n    }\n#endif\n}\n"
  },
  {
    "path": "Chapters/Resource/Span/StreamRead.cs",
    "content": "﻿namespace Span.StreamRead\n{\n    using System;\n    using System.IO;\n\n    class Program\n    {\n        static void Main()\n        {\n            //GenerateTestData();\n\n            ArrayRead();\n        }\n\n        private static void GenerateTestData()\n        {\n            using (var f = new BinaryWriter(File.OpenWrite(\"test.data\")))\n            {\n                for (int i = 0; i < 10000; i++)\n                {\n                    f.Write((byte)i);\n                }\n            }\n        }\n\n        private static void ArrayRead()\n        {\n            const int BufferSize = 128;\n\n            using (var f = File.OpenRead(\"test.data\"))\n            {\n                var rest = (int)f.Length;\n                var buffer = new byte[BufferSize];\n\n                while (true)\n                {\n                    var read = f.Read(buffer, 0, Math.Min(rest, BufferSize));\n                    rest -= read;\n                    if (rest == 0) break;\n\n                    // buffer に対して何か処理する\n                    for (int i = 0; i < read; i++)\n                    {\n                        Console.Write(buffer[i].ToString(\"X\"));\n                    }\n                    Console.WriteLine();\n                }\n            }\n        }\n\n        private static void SpanRead()\n        {\n            const int BufferSize = 128;\n\n            using (var f = File.OpenRead(\"test.data\"))\n            {\n                var rest = (int)f.Length;\n                // Span<byte> で受け取ることで、new (配列)を stackalloc (スタック確保)に変更できる\n                Span<byte> buffer = stackalloc byte[BufferSize];\n\n                while (true)\n                {\n                    // Read(Span<byte>) が追加された\n                    var read = f.Read(buffer);\n                    rest -= read;\n                    if (rest == 0) break;\n\n                    // buffer に対して何か処理する\n                    for (int i = 0; i < read; i++)\n                    {\n                        Console.Write(buffer[i].ToString(\"X\"));\n                    }\n                    Console.WriteLine();\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/Span/Substring.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Span.Substring\n{\n    class Program\n    {\n        static void Main()\n        {\n            var s = \"abcあいう亜以宇\";\n\n            var sub = s.Substring(3, 3);\n            var span = s.AsSpan().Slice(3, 3);\n\n            for (int i = 0; i < 3; i++)\n            {\n                Console.WriteLine((sub[i], span[i])); // あ、い、う が2つずつ表示される\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/Span/VariousTypeOfMemory.cs",
    "content": "﻿namespace Span.VariousTypeOfMemory\n{\n    using System;\n    using System.Runtime.InteropServices;\n\n    class Program\n    {\n        static void Main()\n        {\n            // 配列\n            Span<int> array = new int[8].AsSpan().Slice(2, 3);\n\n            // 文字列\n            ReadOnlySpan<char> str = \"abcdefgh\".AsSpan().Slice(2, 3);\n\n            // スタック領域\n            Span<int> stack = stackalloc int[8];\n\n            unsafe\n            {\n                // .NET 管理外メモリ\n                var p = Marshal.AllocHGlobal(sizeof(int) * 8);\n                Span<int> unmanaged = new Span<int>((int*)p, 8);\n\n                // 他の言語との相互運用\n                var q = malloc((IntPtr)(sizeof(int) * 8));\n                Span<int> interop = new Span<int>((int*)q, 8);\n\n                Marshal.FreeHGlobal(p);\n                free(q);\n            }\n        }\n\n        [DllImport(\"msvcrt.dll\", CallingConvention = CallingConvention.Cdecl)]\n        static extern IntPtr malloc(IntPtr size);\n\n        [DllImport(\"msvcrt.dll\", CallingConvention = CallingConvention.Cdecl)]\n        static extern void free(IntPtr ptr);\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructLayoutSample/AbuseUnion.cs",
    "content": "﻿namespace StructLayoutSample.AbuseUnion\n{\n    using System;\n    using System.Runtime.InteropServices;\n\n    [StructLayout(LayoutKind.Explicit)]\n    struct Union\n    {\n        [FieldOffset(0)]\n        public bool Bool;\n\n        [FieldOffset(0)] // Bool と同じ場所\n        public byte Byte;\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            Write(false);   // False\n            Write(true);    // True\n\n            Write(Bool(0)); // False … false と一緒\n            Write(Bool(1)); // True … true と一緒\n            Write(Bool(2)); // Other!\n        }\n\n        private static bool Bool(byte value)\n        {\n            var union = new Union();\n            union.Byte = value;\n            return union.Bool;\n        }\n\n#pragma warning disable 162 // C# 8.0 から警告が出るコードなんだけど、意図的にやってるので warrning disable\n\n        static void Write(bool x)\n        {\n            switch (x)\n            {\n                case true:\n                    Console.WriteLine(\"True\");\n                    break;\n                case false:\n                    Console.WriteLine(\"False\");\n                    break;\n                default:\n                    Console.WriteLine(\"Other!\");\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructLayoutSample/AutoLayout.cs",
    "content": "﻿namespace StructLayoutSample.AutoLayout\n{\n    using System;\n    using System.Runtime.InteropServices;\n\n    [StructLayout(LayoutKind.Auto, Pack = 8)]\n    struct Sample\n    {\n        public byte A;\n        public long B;\n        public byte C;\n    }\n\n    class Program\n    {\n        static unsafe void Main()\n        {\n            var a = default(Sample);\n            var p = &a;\n            var pa = &a.A;\n            var pb = &a.B;\n            var pc = &a.C;\n\n            Console.WriteLine($@\"サイズ: {sizeof(Sample)}\nA: {(long)pa - (long)p}\nB: {(long)pb - (long)p}\nC: {(long)pc - (long)p}\n\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructLayoutSample/ExplicitLayout.cs",
    "content": "﻿namespace StructLayoutSample.ExplicitLayout\n{\n    using System;\n    using System.Runtime.InteropServices;\n\n    [StructLayout(LayoutKind.Explicit)]\n    struct Sample\n    {\n        [FieldOffset(1)]\n        public byte A;\n        [FieldOffset(4)]\n        public long B;\n        [FieldOffset(15)]\n        public byte C;\n    }\n\n    class Program\n    {\n        static unsafe void Main()\n        {\n            var a = default(Sample);\n            var p = &a;\n            var pa = &a.A;\n            var pb = &a.B;\n            var pc = &a.C;\n\n            Console.WriteLine($@\"サイズ: {sizeof(Sample)}\nA: {(long)pa - (long)p}\nB: {(long)pb - (long)p}\nC: {(long)pc - (long)p}\n\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructLayoutSample/IllegalAddress.cs",
    "content": "﻿#pragma warning disable 649\n\nnamespace StructLayoutSample.IllegalAddress\n{\n    using System;\n\n    struct Sample\n    {\n        public int I;\n        public string S;\n    }\n\n    class Program\n    {\n        static unsafe void Main()\n        {\n#if false\n            var a = default(Sample);\n            var p = &a;    // コンパイル エラー: 参照型を含んだ構造体はアドレス取れない\n            var pi = &a.I;\n            var ps = &a.S; // コンパイル エラー: 参照型メンバーのアドレスは取れない\n\n            Console.WriteLine((long)pi - (long)p);\n            Console.WriteLine((long)ps - (long)p);\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructLayoutSample/IllegalLayout.cs",
    "content": "﻿#pragma warning disable 219\n\nnamespace StructLayoutSample.IllegalLayout\n{\n    using System.Runtime.InteropServices;\n\n    [StructLayout(LayoutKind.Explicit)]\n    struct Sample\n    {\n        [FieldOffset(0)]\n        public int A;\n\n        // 値と参照を同じ場所にレイアウト\n        // コンパイル エラーにはならない\n        [FieldOffset(0)]\n        public object B;\n    }\n\n    class Program\n    {\n        static unsafe void Main()\n        {\n            // Sample 型に触れた瞬間、実行時エラーになる\n            var s = new Sample();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructLayoutSample/SequentialLayout.Pack.cs",
    "content": "﻿namespace StructLayoutSample.SequentialLayout.Pack\n{\n    using System;\n    using System.Runtime.InteropServices;\n\n    [StructLayout(LayoutKind.Sequential, Pack = 8)]\n    struct Pack8\n    {\n        public byte A;\n        public long B;\n        public byte C;\n    }\n\n    [StructLayout(LayoutKind.Sequential, Pack = 4)]\n    struct Pack4\n    {\n        public byte A;\n        public long B;\n        public byte C;\n    }\n\n    [StructLayout(LayoutKind.Sequential, Pack = 2)]\n    struct Pack2\n    {\n        public byte A;\n        public long B;\n        public byte C;\n    }\n\n    [StructLayout(LayoutKind.Sequential, Pack = 1)]\n    struct Pack1\n    {\n        public byte A;\n        public long B;\n        public byte C;\n    }\n\n    class Program\n    {\n        static unsafe void Main()\n        {\n            Main8();\n            Main4();\n            Main2();\n            Main1();\n        }\n        static unsafe void Main8()\n        {\n            var a = default(Pack8);\n            var p = &a;\n            var pa = &a.A;\n            var pb = &a.B;\n            var pc = &a.C;\n\n            Console.WriteLine($@\"サイズ: {sizeof(Pack8)}\nA: {(long)pa - (long)p}\nB: {(long)pb - (long)p}\nC: {(long)pc - (long)p}\n\");\n        }\n        static unsafe void Main4()\n        {\n            var a = default(Pack4);\n            var p = &a;\n            var pa = &a.A;\n            var pb = &a.B;\n            var pc = &a.C;\n\n            Console.WriteLine($@\"サイズ: {sizeof(Pack4)}\nA: {(long)pa - (long)p}\nB: {(long)pb - (long)p}\nC: {(long)pc - (long)p}\n\");\n        }\n        static unsafe void Main2()\n        {\n            var a = default(Pack2);\n            var p = &a;\n            var pa = &a.A;\n            var pb = &a.B;\n            var pc = &a.C;\n\n            Console.WriteLine($@\"サイズ: {sizeof(Pack2)}\nA: {(long)pa - (long)p}\nB: {(long)pb - (long)p}\nC: {(long)pc - (long)p}\n\");\n        }\n        static unsafe void Main1()\n        {\n            var a = default(Pack1);\n            var p = &a;\n            var pa = &a.A;\n            var pb = &a.B;\n            var pc = &a.C;\n\n            Console.WriteLine($@\"サイズ: {sizeof(Pack1)}\nA: {(long)pa - (long)p}\nB: {(long)pb - (long)p}\nC: {(long)pc - (long)p}\n\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructLayoutSample/SequentialLayout.cs",
    "content": "﻿namespace StructLayoutSample.SequentialLayout\n{\n    using System;\n\n    struct Sample\n    {\n        public byte A;\n        public long B;\n        public byte C;\n    }\n\n    class Program\n    {\n        static unsafe void Main()\n        {\n            var a = default(Sample);\n            var p = &a;\n            var pa = &a.A;\n            var pb = &a.B;\n            var pc = &a.C;\n\n            Console.WriteLine($@\"サイズ: {sizeof(Sample)}\nA: {(long)pa - (long)p}\nB: {(long)pb - (long)p}\nC: {(long)pc - (long)p}\n\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructLayoutSample/StructLayoutSample.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <StartupObject>StructLayoutSample.AbuseUnion.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Resource/StructLayoutSample/Union.cs",
    "content": "﻿namespace StructLayoutSample.Union\n{\n    using System;\n    using System.Runtime.InteropServices;\n\n    [StructLayout(LayoutKind.Explicit)]\n    struct Union\n    {\n        [FieldOffset(0)]\n        public byte A;\n\n        [FieldOffset(1)]\n        public byte B;\n\n        [FieldOffset(2)]\n        public byte C;\n\n        [FieldOffset(3)]\n        public byte D;\n\n        [FieldOffset(0)] // A と一緒\n        public int N;\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var x = new Union { N = 0x12345678 };\n            Console.WriteLine(x.A.ToString(\"x\")); // 78\n            Console.WriteLine(x.B.ToString(\"x\")); // 56\n            Console.WriteLine(x.C.ToString(\"x\")); // 34\n            Console.WriteLine(x.D.ToString(\"x\")); // 12\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructPerformance/Class/Immutable/Calculator.cs",
    "content": "﻿using System;\nusing System.Linq;\n\nnamespace Class.Immutable\n{\n    class Calculator : ICalculator<Vector>\n    {\n        public string Name => \"Immutable Class \";\n\n        public Vector[] GetSeries(Random r, int count) => Enumerable.Range(0, count).Select(_ => GetRandom(r)).ToArray();\n        private static Vector GetRandom(Random r) => Get(() => r.NextDouble(-1, 1));\n        private static Vector Get(Func<double> f) => new Vector(f(), f(), f(), f(), f(), f(), f(), f());\n\n        public Vector SeriesSum(Vector[] seq)\n        {\n            var sum = new Vector();\n            for (int i = 0; i < seq.Length; i++)\n                sum = sum.Add(seq[i]);\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructPerformance/Class/Immutable/Vector.cs",
    "content": "﻿namespace Class.Immutable\n{\n    /// <summary>\n    /// クラス(参照型) かつ 書き換え不能\n    /// </summary>\n    public class Vector\n    {\n        public readonly double A, B, C, D, E, F, G, H;\n\n        public Vector() { }\n\n        public Vector(double a, double b, double c, double d, double e, double f, double g, double h)\n        {\n            A = a;\n            B = b;\n            C = c;\n            D = d;\n            E = e;\n            F = f;\n            G = g;\n            H = h;\n        }\n\n        public Vector Add(Vector v) => new Vector(A + v.A, B + v.B, C + v.C, D + v.D, E + v.E, F + v.F, G + v.G, H + v.H);\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructPerformance/Class/Mutable/Calculator.cs",
    "content": "﻿using System;\nusing System.Linq;\n\nnamespace Class.Mutable\n{\n    class Calculator : ICalculator<Vector>\n    {\n        public string Name => \"Mutable   Class \";\n\n        public Vector[] GetSeries(Random r, int count) => Enumerable.Range(0, count).Select(_ => GetRandom(r)).ToArray();\n        private static Vector GetRandom(Random r) => Get(() => r.NextDouble(-1, 1));\n        private static Vector Get(Func<double> f) => new Vector(f(), f(), f(), f(), f(), f(), f(), f());\n\n        public Vector SeriesSum(Vector[] seq)\n        {\n            var sum = new Vector();\n            for (int i = 0; i < seq.Length; i++)\n                sum.Add(seq[i]);\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructPerformance/Class/Mutable/Vector.cs",
    "content": "﻿namespace Class.Mutable\n{\n    /// <summary>\n    /// クラス(参照型) かつ 自己書き換え\n    /// </summary>\n    public class Vector\n    {\n        public double A, B, C, D, E, F, G, H;\n\n        public Vector() { }\n\n        public Vector(double a, double b, double c, double d, double e, double f, double g, double h)\n        {\n            A = a;\n            B = b;\n            C = c;\n            D = d;\n            E = e;\n            F = f;\n            G = g;\n            H = h;\n        }\n\n        public void Add(Vector v)\n        {\n            A += v.A;\n            B += v.B;\n            C += v.C;\n            D += v.D;\n            E += v.E;\n            F += v.F;\n            G += v.G;\n            H += v.H;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructPerformance/ICalculator.cs",
    "content": "﻿using System;\n\ninterface ICalculator<T>\n{\n    string Name { get; }\n    T[] GetSeries(Random r, int count);\n    T SeriesSum(T[] series);\n}\n"
  },
  {
    "path": "Chapters/Resource/StructPerformance/Program.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\n\nnamespace StructPerformance\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            const int count = 5 * 1000 * 1000;\n\n            var sm = new Struct.Mutable.Calculator();\n            var si = new Struct.Immutable.Calculator();\n            var cm = new Class.Mutable.Calculator();\n            var ci = new Class.Immutable.Calculator();\n\n            for (int i = 0; i < 10; i++)\n            {\n                var a = Run(sm, count, i);\n                var b = Run(si, count, i);\n                var c = Run(cm, count, i);\n                var d = Run(ci, count, i);\n                Console.WriteLine();\n\n                if (!MemberwiseEquals(a, b) || !MemberwiseEquals(b, c) || !MemberwiseEquals(c, d))\n                    throw new InvalidOperationException();\n            }\n        }\n        public static T Run<T>(ICalculator<T> c, int count, int randomSeed)\n        {\n            var sw = new Stopwatch();\n            var r = new Random(randomSeed);\n\n            sw.Start();\n\n            var series = c.GetSeries(r, count);\n\n            sw.Stop();\n            var init = sw.Elapsed;\n\n            sw.Restart();\n\n            var sum = c.SeriesSum(series);\n\n            sw.Stop();\n            var calc = sw.Elapsed;\n\n            Console.WriteLine($\"{c.Name} / {init.TotalSeconds: 0.0000} / {calc.TotalSeconds: 0.0000}\");\n\n            return sum;\n        }\n\n        static bool MemberwiseEquals(dynamic a, dynamic b)\n            => (double)a.A == (double)b.A\n            && (double)a.B == (double)b.B\n            && (double)a.C == (double)b.C\n            && (double)a.D == (double)b.D\n            && (double)a.E == (double)b.E\n            && (double)a.F == (double)b.F\n            && (double)a.G == (double)b.G\n            && (double)a.H == (double)b.H;\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructPerformance/RandomExtensions.cs",
    "content": "﻿using System;\n\npublic static class RandomExtensions\n{\n    /// <summary>\n    /// min ～ max の範囲の乱数。\n    /// </summary>\n    /// <param name=\"r\"></param>\n    /// <param name=\"min\"></param>\n    /// <param name=\"max\"></param>\n    /// <returns></returns>\n    public static double NextDouble(this Random r, double min, double max) => r.NextDouble() * (max - min) + min;\n}\n"
  },
  {
    "path": "Chapters/Resource/StructPerformance/Struct/Immutable/Calculator.cs",
    "content": "﻿using System;\nusing System.Linq;\n\nnamespace Struct.Immutable\n{\n    class Calculator : ICalculator<Vector>\n    {\n        public string Name => \"Immutable Struct\";\n\n        public Vector[] GetSeries(Random r, int count) => Enumerable.Range(0, count).Select(_ => GetRandom(r)).ToArray();\n        private static Vector GetRandom(Random r) => Get(() => r.NextDouble(-1, 1));\n        private static Vector Get(Func<double> f) => new Vector(f(), f(), f(), f(), f(), f(), f(), f());\n\n        public Vector SeriesSum(Vector[] seq)\n        {\n            var sum = new Vector();\n            for (int i = 0; i < seq.Length; i++)\n                sum = sum.Add(seq[i]);\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructPerformance/Struct/Immutable/Vector.cs",
    "content": "﻿namespace Struct.Immutable\n{\n    /// <summary>\n    /// 構造体(値型) かつ 書き換え不能\n    /// </summary>\n    public struct Vector\n    {\n        public readonly double A, B, C, D, E, F, G, H;\n\n        public Vector(double a, double b, double c, double d, double e, double f, double g, double h)\n        {\n            A = a;\n            B = b;\n            C = c;\n            D = d;\n            E = e;\n            F = f;\n            G = g;\n            H = h;\n        }\n\n        public Vector Add(Vector v) => new Vector(A + v.A, B + v.B, C + v.C, D + v.D, E + v.E, F + v.F, G + v.G, H + v.H);\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructPerformance/Struct/Mutable/Calculator.cs",
    "content": "﻿using System;\nusing System.Linq;\n\nnamespace Struct.Mutable\n{\n    class Calculator : ICalculator<Vector>\n    {\n        public string Name => \"Mutable   Struct\";\n\n        public Vector[] GetSeries(Random r, int count) => Enumerable.Range(0, count).Select(_ => GetRandom(r)).ToArray();\n        private static Vector GetRandom(Random r) => Get(() => r.NextDouble(-1, 1));\n        private static Vector Get(Func<double> f) => new Vector(f(), f(), f(), f(), f(), f(), f(), f());\n\n        public Vector SeriesSum(Vector[] seq)\n        {\n            var sum = new Vector();\n            for (int i = 0; i < seq.Length; i++)\n                sum.Add(ref seq[i]);\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructPerformance/Struct/Mutable/Vector.cs",
    "content": "﻿namespace Struct.Mutable\n{\n    /// <summary>\n    /// 構造体(値型) かつ 自己書き換え\n    /// </summary>\n    public struct Vector\n    {\n        public double A, B, C, D, E, F, G, H;\n\n        public Vector(double a, double b, double c, double d, double e, double f, double g, double h)\n        {\n            A = a;\n            B = b;\n            C = c;\n            D = d;\n            E = e;\n            F = f;\n            G = g;\n            H = h;\n        }\n\n        public void Add(ref Vector v)\n        {\n            A += v.A;\n            B += v.B;\n            C += v.C;\n            D += v.D;\n            E += v.E;\n            F += v.F;\n            G += v.G;\n            H += v.H;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/StructPerformance/StructPerformance.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Resource/WeakReference/HowToUse/Program.cs",
    "content": "﻿namespace WeakReferenceSample.HowToUse\n{\n    using System;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        static void Main()\n        {\n            RunAsync().Wait();\n        }\n\n        private static async Task RunAsync()\n        {\n            var obj = (object)123;\n            var t = StartLoop(new WeakReference<object>(obj));\n\n            // 2.5秒後にオブジェクトを消す\n            await Task.Delay(2500);\n            obj = null!;\n            GC.Collect();\n\n            await t;\n        }\n\n        // 1秒に1回、「参照中」メッセージを表示\n        static async Task StartLoop(WeakReference<object> r)\n        {\n            while (true)\n            {\n                if (r.TryGetTarget(out var obj))\n                {\n                    Console.WriteLine(obj + \" を参照中\");\n                }\n                else\n                {\n                    Console.WriteLine(\"参照がなくなりました\");\n                    break;\n                }\n\n                await Task.Delay(1000);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/WeakReference/Program.cs",
    "content": "﻿using System;\nusing System.Reflection;\n\nnamespace WeakReferenceSample\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            // サンプル掲載用に、Version* フォルダー以下の Program も単体で動くように作ってあって、\n            // そっちにも private な Main メソッドがある。\n            // ・ビルド設定で「スタートアップ オブジェクト」をこっちのクラスに設定してある。\n            // ・あっちの private Main はリフレクションで無理やり呼ぶ。\n\n            //InvokeMain(typeof(HowToUse.Program));\n            //InvokeMain(typeof(WeakTable.Program));\n            InvokeMain(typeof(WeakEvent.Program));\n        }\n\n        static void InvokeMain(Type t)\n        {\n            t.GetMethod(nameof(Main), BindingFlags.Static | BindingFlags.NonPublic)!.Invoke(null, null);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/WeakReference/WeakEvent/Program.cs",
    "content": "﻿namespace WeakReferenceSample.WeakEvent\n{\n    using System;\n    using System.Reactive.Subjects;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        static void Main()\n        {\n            RunAsync(true).Wait();\n            RunAsync(false).Wait();\n        }\n\n        private const int Interval = 100;\n\n        private static async Task RunAsync(bool manualDispose)\n        {\n            if (manualDispose) Console.WriteLine(\"ちゃんと Dispose\");\n            else Console.WriteLine(\"GC 任せ\");\n\n            // イベントを、\n            // d1: 通常のイベント購読\n            // d2: 弱イベント購読\n            var x = new Subject<int>();\n            var d1 = x.Subscribe(i => Console.WriteLine(\"subscribe \" + i));\n            var d2 = x.WeakSubscribe(i => Console.WriteLine(\"weak subscribe \" + i));\n            var cts = new CancellationTokenSource();\n            var t = EventSourceLoop(x, cts.Token);\n\n            // イベントが飛んでくる間隔の3倍待つ → 3回イベントが来る\n            await Task.Delay(3 * Interval);\n\n            if (manualDispose)\n            {\n                // ちゃんと Dispose。\n                // 当たり前だけども、以後、イベントは受け取らなくなる。\n                d1.Dispose();\n                d2.Dispose();\n            }\n            else\n            {\n                // Dispose 忘れたままオブジェクトを捨てる。\n                // d1 は、Subscribe 内で参照を握っているので GC 対象にならない。メモリ リーク。\n                // d2 は、WeakSubscribe 内は弱参照なので、こっちの参照なくせば GC 対象。\n                // 以後、イベントは subscribe 側にだけ届く。\n                d1 = null!;\n                d2 = null!;\n                GC.Collect();\n            }\n\n            // 同じく3回分待つ\n            await Task.Delay(300);\n\n            cts.Cancel();\n            await t;\n        }\n\n        // イベントを飛ばし続けるループ\n        static async Task EventSourceLoop(IObserver<int> observer, CancellationToken ct)\n        {\n            for (var i = 0; !ct.IsCancellationRequested; ++i)\n            {\n                observer.OnNext(i);\n                await Task.Delay(Interval);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/WeakReference/WeakEvent/WeakEventExtensions.AsWeakObservable.cs",
    "content": "﻿using System;\nusing System.Reactive.Disposables;\nusing System.Reactive.Linq;\n\nnamespace WeakReferenceSample.WeakEvent\n{\n    public static partial class WeakEventExtensions\n    {\n        /// <summary>\n        /// 【参考実装】Subscribe 時じゃなくて、IObservable に対して細工する版。\n        ///\n        /// <paramref name=\"observable\"/> をラップして、Subscribe が全部弱イベント購読になる <see cref=\"IObservable{T}\"/> を作る。\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"observable\"></param>\n        /// <returns></returns>\n        public static IObservable<T> AsWeakObservable<T>(this IObservable<T> observable)\n        {\n            return Observable.Create((IObserver<T> observer) =>\n            {\n                WeakReference<IDisposable> weakSubscription = null!;\n                IDisposable subscription = null!;\n\n                subscription = observable.Subscribe(x =>\n                {\n                    if (!weakSubscription.TryGetTarget(out var d))\n                    {\n                        subscription.Dispose();\n                        return;\n                    }\n                    observer.OnNext(x);\n                });\n\n                var s = new SingleAssignmentDisposable();\n                s.Disposable = subscription;\n\n                weakSubscription = new WeakReference<IDisposable>(s);\n                return s;\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/WeakReference/WeakEvent/WeakEventExtensions.FinalizeDiposable.cs",
    "content": "﻿using System;\n\nnamespace WeakReferenceSample.WeakEvent\n{\n    public static partial class WeakEventExtensions\n    {\n        /// <summary>\n        /// 【参考実装】デストラクターを使う版\n        ///\n        /// 弱イベント購読。\n        /// 戻り値の <see cref=\"IDisposable\"/> が誰からも参照されなくなったら自動的にイベント購読解除する。\n        /// </summary>\n        /// <remarks>\n        /// コードはものすごくシンプルになってうれしいんだけども…\n        /// デストラクターは結構高コストな存在なので、実行性能的には弱参照使う方がいいはず。\n        /// </remarks>\n        public static IDisposable FinalizeSubscribe<T>(this IObservable<T> observable, Action<T> onNext)\n        {\n            var subscription = observable.Subscribe(onNext);\n            return new FinalizeDisposable(subscription);\n        }\n    }\n\n    /// <summary>\n    /// デストラクター(Finalize)でも <see cref=\"IDisposable.Dispose\"/> が呼ばれるようにする。\n    /// </summary>\n    class FinalizeDisposable : IDisposable\n    {\n        IDisposable _inner;\n\n        public FinalizeDisposable(IDisposable inner) { _inner = inner; }\n\n        ~FinalizeDisposable()\n        {\n            _inner.Dispose();\n        }\n\n        public void Dispose()\n        {\n            _inner.Dispose();\n            GC.SuppressFinalize(this);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/WeakReference/WeakEvent/WeakEventExtensions.cs",
    "content": "﻿namespace WeakReferenceSample.WeakEvent\n{\n    using System;\n    using System.Reactive.Disposables;\n\n    public static partial class WeakEventExtensions\n    {\n        /// <summary>\n        /// 弱イベント購読。\n        /// 戻り値の <see cref=\"IDisposable\"/> が誰からも参照されなくなったら自動的にイベント購読解除する。\n        /// </summary>\n        /// <typeparam name=\"T\">イベント引数の型。</typeparam>\n        /// <param name=\"observable\">イベント発生側。</param>\n        /// <param name=\"onNext\">イベント受取側。</param>\n        /// <returns>イベント購読解除用の disposable。</returns>\n        /// <remarks>\n        /// 弱参照の性質上、<see cref=\"GC\"/> がかかって初めて「誰も使ってない」判定を受ける。\n        /// それまではイベント購読解除されず、イベントが届き続ける。\n        /// GC タイミングに左右されるコードは推奨できないんで、可能な限り、\n        /// 戻り値の <see cref=\"IDisposable.Dispose\"/> を明示的に呼ぶべき。\n        /// </remarks>\n        public static IDisposable WeakSubscribe<T>(this IObservable<T> observable, Action<T> onNext)\n        {\n            WeakReference<IDisposable> weakSubscription = null!;\n            IDisposable subscription = null!;\n\n            subscription = observable.Subscribe(x =>\n            {\n                if (!weakSubscription.TryGetTarget(out var d))\n                {\n                    // 弱参照のターゲットが消えてたらイベント購読解除。\n                    subscription.Dispose();\n                    return;\n                }\n                onNext(x);\n            });\n\n            // subscription は↑のラムダ式が参照を持っちゃうことになるので、\n            // 別の IDisposable を作ってラップ。\n            var s = new SingleAssignmentDisposable();\n            s.Disposable = subscription;\n\n            // 作った、外から呼ぶ用 IDisposable の弱参照を作る。\n            weakSubscription = new WeakReference<IDisposable>(s);\n            return s;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/WeakReference/WeakReference.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>WeakReferenceSample.Program</StartupObject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Reactive\" Version=\"4.1.6\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Resource/WeakReference/WeakTable/Person.cs",
    "content": "﻿namespace WeakReferenceSample.WeakTable\n{\n    /// <summary>\n    /// 名簿の1項目の情報。\n    ///\n    /// 仮に、このクラスが自作じゃなくて、どこか別のライブラリで定義されているものとする。\n    /// 自分のプログラムでは、ID と名前だけじゃなくて、住所も足したくなったとして…\n    /// </summary>\n    public class Person\n    {\n        public int Id { get; set; }\n        public string? Name { get; set; }\n    }\n}\n"
  },
  {
    "path": "Chapters/Resource/WeakReference/WeakTable/Program.cs",
    "content": "﻿namespace WeakReferenceSample.WeakTable\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.CompilerServices;\n\n    class Program\n    {\n        static void Main()\n        {\n            WeakKey();\n            StrongKey();\n        }\n\n        private static void WeakKey()\n        {\n            var people = new[]\n            {\n                new Person {Id = 1, Name = \"Jurian Naul\" },\n                new Person {Id = 2, Name = \"Thomas Bent\" },\n                new Person {Id = 3, Name = \"Ellen Carson\" },\n                new Person {Id = 4, Name = \"Katrina Lauran\" },\n                new Person {Id = 5, Name = \"Monica Ausbach\" },\n            };\n\n            var locations = new ConditionalWeakTable<Person, string>();\n\n            locations.Add(people[0], \"Shinon\");\n            locations.Add(people[1], \"Lance\");\n            locations.Add(people[2], \"Pidona\");\n            locations.Add(people[3], \"Loanne\");\n            locations.Add(people[4], \"Loanne\");\n\n            foreach (var p in people)\n            {\n                if (locations.TryGetValue(p, out var location))\n                    Console.WriteLine(p.Name + \" at \" + location);\n            }\n        }\n\n        private static void StrongKey()\n        {\n            var people = new[]\n            {\n                new Person {Id = 1, Name = \"Jurian Naul\" },\n                new Person {Id = 2, Name = \"Thomas Bent\" },\n                new Person {Id = 3, Name = \"Ellen Carson\" },\n                new Person {Id = 4, Name = \"Katrina Lauran\" },\n                new Person {Id = 5, Name = \"Monica Ausbach\" },\n            };\n\n            var locations = new Dictionary<Person, string>();\n\n            locations.Add(people[0], \"Shinon\");\n            locations.Add(people[1], \"Lance\");\n            locations.Add(people[2], \"Pidona\");\n            locations.Add(people[3], \"Loanne\");\n            locations.Add(people[4], \"Loanne\");\n\n            foreach (var p in people)\n            {\n                if (locations.TryGetValue(p, out var location))\n                    Console.WriteLine(p.Name + \" at \" + location);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/Scripting.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.24720.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"src\", \"src\", \"{3E86BD41-B975-4276-A0C4-E0C55AD9457B}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{5EF2D63F-BE0F-4558-BBDC-D3A44AA37F7D}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tglobal.json = global.json\n\tEndProjectSection\nEndProject\nProject(\"{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}\") = \"Scripting\", \"src\\Scripting\\Scripting.xproj\", \"{2A49898C-78CD-4355-8C39-E20529B5DE71}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TurtleGraphics\", \"TurtleGraphics\\TurtleGraphics.csproj\", \"{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Release|x64.Build.0 = Release|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71}.Release|x86.Build.0 = Release|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Release|x64.Build.0 = Release|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{2A49898C-78CD-4355-8C39-E20529B5DE71} = {3E86BD41-B975-4276-A0C4-E0C55AD9457B}\n\t\t{A5237B54-1FF2-4541-8A72-8ED37BFA6E73} = {3E86BD41-B975-4276-A0C4-E0C55AD9457B}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/App.xaml",
    "content": "﻿<Application x:Class=\"TurtleGraphics.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:TurtleGraphics\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace TurtleGraphics\n{\n    /// <summary>\n    /// App.xaml の相互作用ロジック\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"TurtleGraphics.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:TurtleGraphics\"\n        xmlns:vm=\"clr-namespace:TurtleGraphics.ViewModels\"\n        mc:Ignorable=\"d\"\n        Title=\"Turtle Graphics\" SizeToContent=\"WidthAndHeight\">\n    <Grid Width=\"200\">\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"auto\" />\n            <RowDefinition Height=\"200\" />\n        </Grid.RowDefinitions>\n\n        <TextBox AcceptsReturn=\"True\" TextChanged=\"TextBox_TextChanged\" />\n\n        <ItemsControl ItemsSource=\"{Binding Lines}\" Grid.Row=\"1\">\n            <ItemsControl.ItemsPanel>\n                <ItemsPanelTemplate>\n                    <Canvas></Canvas>\n                </ItemsPanelTemplate>\n            </ItemsControl.ItemsPanel>\n            <ItemsControl.ItemTemplate>\n                <DataTemplate DataType=\"vm:Line\">\n                    <Line\n                        X1=\"{Binding X1, Mode=OneWay}\" Y1=\"{Binding Y1, Mode=OneWay}\" X2=\"{Binding X2, Mode=OneWay}\" Y2=\"{Binding Y2, Mode=OneWay}\"\n                        Stroke=\"Green\"\n                        StrokeThickness=\"1\"\n                        />\n                </DataTemplate>\n            </ItemsControl.ItemTemplate>\n        </ItemsControl>\n        <Canvas Grid.Row=\"1\">\n            <Canvas Width=\"18\" Height=\"20\" Canvas.Left=\"{Binding Cursor.X, Mode=OneWay}\" Canvas.Top=\"{Binding Cursor.Y, Mode=OneWay}\">\n                <Canvas.RenderTransform>\n                    <TransformGroup>\n                        <TranslateTransform X=\"-9\" Y=\"-10\" />\n                        <RotateTransform Angle=\"{Binding Cursor.Direction, Mode=OneWay}\" />\n                    </TransformGroup>\n                </Canvas.RenderTransform>\n                <Ellipse Fill=\"LightBlue\" Width=\"14\" Height=\"16\" Canvas.Left=\"2\" Canvas.Top=\"4\" />\n                <Ellipse Fill=\"LightBlue\" Width=\"6\" Height=\"10\" Canvas.Left=\"6\" Canvas.Top=\"0\" />\n                <Ellipse Fill=\"LightBlue\" Width=\"6\" Height=\"6\" Canvas.Left=\"12\" Canvas.Top=\"14\" />\n                <Ellipse Fill=\"LightBlue\" Width=\"6\" Height=\"6\" Canvas.Left=\"0\" Canvas.Top=\"14\" />\n                <Ellipse Fill=\"LightBlue\" Width=\"6\" Height=\"6\" Canvas.Left=\"0\" Canvas.Top=\"4\" />\n                <Ellipse Fill=\"LightBlue\" Width=\"6\" Height=\"6\" Canvas.Left=\"12\" Canvas.Top=\"4\" />\n            </Canvas>\n        </Canvas>\n    </Grid>\n</Window>\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/MainWindow.xaml.cs",
    "content": "﻿using Microsoft.CodeAnalysis.CSharp.Scripting;\nusing Microsoft.CodeAnalysis.Scripting;\nusing System.Threading;\nusing System.Windows.Controls;\n\nnamespace TurtleGraphics\n{\n    public partial class MainWindow\n    {\n        public ViewModels.TurtleGraphicsViewModel ViewModel { get; } = new ViewModels.TurtleGraphicsViewModel();\n\n        public MainWindow()\n        {\n            InitializeComponent();\n\n            DataContext = ViewModel;\n\n            var ct = new CancellationTokenSource();\n            var t = ViewModel.Start(ct.Token);\n\n            //Loaded += (_1, _2) => MainPage_Loaded(ViewModel.Commander);\n\n            Unloaded += async (_1, _2) =>\n            {\n                ct.Cancel();\n                await t;\n            };\n        }\n\n        private void MainPage_Loaded(ViewModels.Commander c)\n        {\n            c.speed(50);\n            c.walk(50);\n            c.clear();\n\n            for (int i = 0; i < 5; i++)\n            {\n                c.turn(144);\n                c.walk(100);\n            }\n        }\n\n        private ScriptState<object> _state;\n\n        private async void TextBox_TextChanged(object sender, TextChangedEventArgs e)\n        {\n            var tb = (TextBox)sender;\n            var s = tb.Text;\n\n            if (string.IsNullOrWhiteSpace(s))\n                return;\n\n            if (s[s.Length - 1] == '\\n')\n            {\n                try\n                {\n                    if (_state == null)\n                        _state = await CSharpScript.RunAsync(s, globals: ViewModel.Commander);\n                    else\n                        _state = await _state.ContinueWithAsync(s);\n                }\n                catch { }\n\n                tb.Text = \"\";\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"TurtleGraphics\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"TurtleGraphics\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから\n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n//ローカライズ可能なアプリケーションのビルドを開始するには、\n//.csproj ファイルの <UICulture>CultureYouAreCodingWith</UICulture> を\n//<PropertyGroup> 内部で設定します。たとえば、\n//ソース ファイルで英語を使用している場合、<UICulture> を en-US に設定します。次に、\n//下の NeutralResourceLanguage 属性のコメントを解除します。下の行の \"en-US\" を\n//プロジェクト ファイルの UICulture 設定と一致するよう更新します。\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //テーマ固有のリソース ディクショナリが置かれている場所\n                                     //(リソースがページ、\n                                     //またはアプリケーション リソース ディクショナリに見つからない場合に使用されます)\n    ResourceDictionaryLocation.SourceAssembly //汎用リソース ディクショナリが置かれている場所\n                                              //(リソースがページ、\n                                              //アプリケーション、またはいずれのテーマ固有のリソース ディクショナリにも見つからない場合に使用されます)\n)]\n\n\n// アセンブリのバージョン情報は次の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン\n//      ビルド番号\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     このコードはツールによって生成されました。\n//     ランタイム バージョン:4.0.30319.42000\n//\n//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、\n//     コードが再生成されるときに損失したりします\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace TurtleGraphics.Properties\n{\n\n\n    /// <summary>\n    ///   ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。\n    /// </summary>\n    // このクラスは StronglyTypedResourceBuilder クラスによって ResGen\n    // または Visual Studio のようなツールを使用して自動生成されました。\n    // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に\n    // ResGen を実行し直すか、または VS プロジェクトをリビルドします。\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources\n    {\n\n        private static global::System.Resources.ResourceManager resourceMan;\n\n        private static global::System.Globalization.CultureInfo resourceCulture;\n\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources()\n        {\n        }\n\n        /// <summary>\n        ///   このクラスで使用されるキャッシュされた ResourceManager インスタンスを返します。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager\n        {\n            get\n            {\n                if ((resourceMan == null))\n                {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"TurtleGraphics.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n\n        /// <summary>\n        ///   厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、\n        ///   現在のスレッドの CurrentUICulture プロパティをオーバーライドします。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture\n        {\n            get\n            {\n                return resourceCulture;\n            }\n            set\n            {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace TurtleGraphics.Properties\n{\n\n\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"11.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase\n    {\n\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n\n        public static Settings Default\n        {\n            get\n            {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/TurtleGraphics.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{A5237B54-1FF2-4541-8A72-8ED37BFA6E73}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>TurtleGraphics</RootNamespace>\n    <AssemblyName>TurtleGraphics</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <WarningLevel>4</WarningLevel>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xaml\">\n      <RequiredTargetFramework>4.0</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Compile Include=\"ViewModels\\BindableBase.cs\" />\n    <Compile Include=\"ViewModels\\Command.cs\" />\n    <Compile Include=\"ViewModels\\Commander.cs\" />\n    <Compile Include=\"ViewModels\\Cursor.cs\" />\n    <Compile Include=\"ViewModels\\Cursor.ValueChanged.cs\" />\n    <Compile Include=\"ViewModels\\Line.cs\" />\n    <Compile Include=\"ViewModels\\Line.ValueChanged.cs\" />\n    <Compile Include=\"ViewModels\\TurtleGraphicsViewModel.cs\" />\n    <Page Include=\"MainWindow.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"MainWindow.xaml.cs\">\n      <DependentUpon>MainWindow.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <None Include=\"project.json\" />\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <AppDesigner Include=\"Properties\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/ViewModels/BindableBase.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.ComponentModel;\n\nnamespace TurtleGraphics.ViewModels\n{\n    public class BindableBase : INotifyPropertyChanged\n    {\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        protected void SetProperty<T>(ref T storage, T value, PropertyChangedEventArgs args)\n        {\n            if (!EqualityComparer<T>.Default.Equals(storage, value))\n            {\n                storage = value;\n                PropertyChanged?.Invoke(this, args);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/ViewModels/Command.cs",
    "content": "﻿namespace TurtleGraphics.ViewModels\n{\n    /// <summary>\n    /// 亀に対する命令。\n    /// </summary>\n    public struct Command\n    {\n        public enum CommandType\n        {\n            /// <summary>\n            /// 前進。\n            /// </summary>\n            Walk,\n\n            /// <summary>\n            /// 回転。\n            /// </summary>\n            Turn,\n\n            /// <summary>\n            /// 今ひかれている線の削除。\n            /// </summary>\n            Clear,\n\n            /// <summary>\n            /// 速さの変更。\n            /// </summary>\n            Speed,\n        }\n\n        /// <summary>\n        /// 命令の種類。\n        /// </summary>\n        public CommandType Type { get; }\n\n        /// <summary>\n        /// 命令の引数。\n        /// </summary>\n        public double Value { get; }\n\n        /// <summary></summary>\n        /// <param name=\"type\"><see cref=\"Type\"/></param>\n        /// <param name=\"value\"><see cref=\"Value\"/></param>\n        private Command(CommandType type, double value)\n        {\n            Type = type;\n            Value = value;\n        }\n\n        /// <summary>\n        /// 前進。\n        /// </summary>\n        /// <param name=\"distance\">前進する距離[ドット]。</param>\n        /// <returns></returns>\n        public static Command Walk(double distance) => new Command(CommandType.Walk, distance);\n\n        /// <summary>\n        /// 方向転換。\n        /// </summary>\n        /// <param name=\"angle\">方向転換する角度[度]。</param>\n        /// <returns></returns>\n        public static Command Turn(double angle) => new Command(CommandType.Turn, angle);\n\n        /// <summary>\n        /// 速さの変更。\n        /// </summary>\n        /// <param name=\"speedDotPerSecond\">変更後の速さ[ドット/秒]。</param>\n        /// <returns></returns>\n        public static Command Speed(double speedDotPerSecond) => new Command(CommandType.Speed, speedDotPerSecond);\n\n        /// <summary>\n        /// 今ひかれている線の削除。\n        /// </summary>\n        /// <returns></returns>\n        public static Command Clear() => new Command(CommandType.Clear, 0);\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/ViewModels/Commander.cs",
    "content": "﻿using System.Collections.Concurrent;\n\nnamespace TurtleGraphics.ViewModels\n{\n    /// <summary>\n    /// コマンド発行クラス。\n    /// C# スクリプトのglobalsとして渡して、スクリプトからコマンドを発行するのに使う。\n    /// </summary>\n    public class Commander\n    {\n        private ConcurrentQueue<Command> _queue;\n\n        public Commander(ConcurrentQueue<Command> queue)\n        {\n            _queue = queue;\n        }\n\n        public void walk(double distance) => _queue.Enqueue(Command.Walk(distance));\n        public void turn(double angle) => _queue.Enqueue(Command.Turn(angle));\n        public void speed(double speedDotPerSecond) => _queue.Enqueue(Command.Speed(speedDotPerSecond));\n        public void clear() => _queue.Enqueue(Command.Clear());\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/ViewModels/Cursor.ValueChanged.cs",
    "content": "﻿using System.ComponentModel;\n\nnamespace TurtleGraphics.ViewModels\n{\n    partial class Cursor\n    {\n        private NotifyRecord _value;\n\n        /// <summary>\n        /// X 座標。\n        /// </summary>\n        public double X { get { return _value.X; } set { SetProperty(ref _value.X, value, XProperty); } }\n        private static readonly PropertyChangedEventArgs XProperty = new PropertyChangedEventArgs(nameof(X));\n\n        /// <summary>\n        /// Y 座標。\n        /// </summary>\n        public double Y { get { return _value.Y; } set { SetProperty(ref _value.Y, value, YProperty); } }\n        private static readonly PropertyChangedEventArgs YProperty = new PropertyChangedEventArgs(nameof(Y));\n\n        /// <summary>\n        /// 向き。\n        /// 単位は度(degree)。\n        /// 真上を0度として、時計回りが正。\n        /// </summary>\n        public double Direction { get { return _value.Direction; } set { SetProperty(ref _value.Direction, value, DirectionProperty); } }\n        private static readonly PropertyChangedEventArgs DirectionProperty = new PropertyChangedEventArgs(nameof(Direction));\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/ViewModels/Cursor.cs",
    "content": "﻿namespace TurtleGraphics.ViewModels\n{\n    /// <summary>\n    /// 亀の現在位置を示すカーソル。\n    /// </summary>\n    public partial class Cursor : BindableBase\n    {\n        struct NotifyRecord\n        {\n            /// <summary>\n            /// X 座標。\n            /// </summary>\n            public double X;\n\n            /// <summary>\n            /// Y 座標。\n            /// </summary>\n            public double Y;\n\n            /// <summary>\n            /// 向き。\n            /// 単位は度(degree)。\n            /// 真上を0度として、時計回りが正。\n            /// </summary>\n            public double Direction;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/ViewModels/Line.ValueChanged.cs",
    "content": "﻿using System.ComponentModel;\n\nnamespace TurtleGraphics.ViewModels\n{\n    partial class Line\n    {\n        private NotifyRecord _value;\n\n        /// <summary>\n        /// 始点のX座標。\n        /// </summary>\n        public double X1 { get { return _value.X1; } set { SetProperty(ref _value.X1, value, X1Property); } }\n        private static readonly PropertyChangedEventArgs X1Property = new PropertyChangedEventArgs(nameof(X1));\n\n        /// <summary>\n        /// 始点のY座標。\n        /// </summary>\n        public double Y1 { get { return _value.Y1; } set { SetProperty(ref _value.Y1, value, Y1Property); } }\n        private static readonly PropertyChangedEventArgs Y1Property = new PropertyChangedEventArgs(nameof(Y1));\n\n        /// <summary>\n        /// 終点のX座標。\n        /// </summary>\n        public double X2 { get { return _value.X2; } set { SetProperty(ref _value.X2, value, X2Property); } }\n        private static readonly PropertyChangedEventArgs X2Property = new PropertyChangedEventArgs(nameof(X2));\n\n        /// <summary>\n        /// 終点のY座標。\n        /// </summary>\n        public double Y2 { get { return _value.Y2; } set { SetProperty(ref _value.Y2, value, Y2Property); } }\n        private static readonly PropertyChangedEventArgs Y2Property = new PropertyChangedEventArgs(nameof(Y2));\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/ViewModels/Line.cs",
    "content": "﻿namespace TurtleGraphics.ViewModels\n{\n    /// <summary>\n    /// 亀が通った道に引く線。\n    /// </summary>\n    public partial class Line : BindableBase\n    {\n        struct NotifyRecord\n        {\n            /// <summary>\n            /// 始点のX座標。\n            /// </summary>\n            public double X1;\n\n            /// <summary>\n            /// 始点のY座標。\n            /// </summary>\n            public double Y1;\n\n            /// <summary>\n            /// 終点のX座標。\n            /// </summary>\n            public double X2;\n\n            /// <summary>\n            /// 終点のY座標。\n            /// </summary>\n            public double Y2;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/ViewModels/TurtleGraphicsViewModel.cs",
    "content": "﻿using System;\nusing System.Collections.Concurrent;\nusing System.Collections.ObjectModel;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace TurtleGraphics.ViewModels\n{\n    /// <summary>\n    /// 亀の動き制御本体。\n    /// </summary>\n    public class TurtleGraphicsViewModel\n    {\n        /// <summary>\n        /// 描画の間隔。\n        /// </summary>\n        private static readonly TimeSpan Interval = TimeSpan.FromMilliseconds(50);\n\n        /// <summary>\n        /// 亀の現在位置。\n        /// </summary>\n        public Cursor Cursor { get; } = new Cursor { X = 100, Y = 100 };\n\n        /// <summary>\n        /// 亀が歩いた奇跡。\n        /// </summary>\n        public ObservableCollection<Line> Lines { get; } = new ObservableCollection<Line>();\n\n        /// <summary>\n        /// 亀の速さ。\n        /// </summary>\n        public double Speed { get; set; } = 10;\n\n        private ConcurrentQueue<Command> _queue = new ConcurrentQueue<Command>();\n\n        public Commander Commander => _commander ?? (_commander = new Commander(_queue));\n        private Commander _commander;\n\n        /// <summary>\n        /// 描画処理を開始する。\n        /// 必ずUIスレッドから呼び出す必要あり。\n        /// </summary>\n        /// <param name=\"cancel\">描画処理を止めるためのトークン。</param>\n        /// <returns></returns>\n        public async Task Start(CancellationToken cancel)\n        {\n            while (!cancel.IsCancellationRequested)\n            {\n                await Task.Delay(Interval);\n\n                if (_queue.IsEmpty)\n                    continue;\n\n                Command c;\n                if (!_queue.TryDequeue(out c))\n                    continue;\n\n                switch (c.Type)\n                {\n                    case Command.CommandType.Walk:\n                        await WalkAsync(c.Value);\n                        break;\n                    case Command.CommandType.Turn:\n                        Cursor.Direction += c.Value;\n                        break;\n                    case Command.CommandType.Clear:\n                        Lines.Clear();\n                        break;\n                    case Command.CommandType.Speed:\n                        Speed = c.Value;\n                        break;\n                    default:\n                        break;\n                }\n            }\n        }\n\n        private async Task WalkAsync(double value)\n        {\n            var initX = Cursor.X;\n            var initY = Cursor.Y;\n\n            var line = new Line { X1 = initX, Y1 = initY, X2 = initX, Y2 = initY };\n            Lines.Add(line);\n\n            var dx = Math.Sin(Cursor.Direction / 180 * Math.PI);\n            var dy = -Math.Cos(Cursor.Direction / 180 * Math.PI);\n\n            var destX = initX + value * dx;\n            var destY = initY + value * dy;\n\n            var d = Speed * Interval.TotalSeconds;\n            dx *= d;\n            dy *= d;\n\n            for (var rest = value; rest > 0; rest -= d)\n            {\n                await Task.Delay(Interval);\n                Cursor.X += dx;\n                Cursor.Y += dy;\n                line.X2 = Cursor.X;\n                line.Y2 = Cursor.Y;\n            }\n\n            Cursor.X = destX;\n            Cursor.Y = destY;\n            line.X2 = Cursor.X;\n            line.Y2 = Cursor.Y;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/TurtleGraphics/project.json",
    "content": "﻿{\n  \"frameworks\": {\n    \"net461\": {}\n  },\n  \"runtimes\": {\n    \"win\": {},\n    \"win-anycpu\": {}\n  },\n  \"dependencies\": {\n    \"Microsoft.CodeAnalysis.CSharp.Scripting\": \"1.1.1\",\n    \"ValueChangedGanerator\": \"2.0.0\"\n  }\n}"
  },
  {
    "path": "Chapters/Scripting/global.json",
    "content": "﻿{\n  \"projects\": [ \"src\", \"test\" ],\n  \"sdk\": {\n    \"version\": \"1.0.0-rc1-update1\"\n  }\n}\n"
  },
  {
    "path": "Chapters/Scripting/src/Scripting/Program.cs",
    "content": "﻿using Microsoft.CodeAnalysis.CSharp.Scripting;\nusing System;\nusing System.Threading.Tasks;\n\npublic class Program\n{\n    public static void Main(string[] args)\n    {\n        MainAsync().Wait();\n    }\n\n    private static async Task MainAsync()\n    {\n        var result = await CSharpScript.EvaluateAsync<int>(@\"\nvar x = 1;\nvar y = 2;\nx + y\n\");\n        Console.WriteLine(result);\n    }\n}\n"
  },
  {
    "path": "Chapters/Scripting/src/Scripting/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Scripting\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Scripting\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"2a49898c-78cd-4355-8c39-e20529b5de71\")]\n"
  },
  {
    "path": "Chapters/Scripting/src/Scripting/Scripting.xproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">14.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n\n  <Import Project=\"$(VSToolsPath)\\DNX\\Microsoft.DNX.Props\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>2a49898c-78cd-4355-8c39-e20529b5de71</ProjectGuid>\n    <RootNamespace>Scripting</RootNamespace>\n    <BaseIntermediateOutputPath Condition=\"'$(BaseIntermediateOutputPath)'=='' \">..\\..\\artifacts\\obj\\$(MSBuildProjectName)</BaseIntermediateOutputPath>\n    <OutputPath Condition=\"'$(OutputPath)'=='' \">..\\..\\artifacts\\bin\\$(MSBuildProjectName)\\</OutputPath>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <SchemaVersion>2.0</SchemaVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VSToolsPath)\\DNX\\Microsoft.DNX.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n</Project>\n"
  },
  {
    "path": "Chapters/Scripting/src/Scripting/a.csx",
    "content": "var x = 10;"
  },
  {
    "path": "Chapters/Scripting/src/Scripting/project.json",
    "content": "﻿{\n  \"version\": \"1.0.0-*\",\n  \"description\": \"Scripting Console Application\",\n  \"authors\": [ \"xii-h\" ],\n  \"tags\": [ \"\" ],\n  \"projectUrl\": \"\",\n  \"licenseUrl\": \"\",\n\n  \"compilationOptions\": {\n    \"emitEntryPoint\": true\n  },\n\n  \"dependencies\": {\n    \"Microsoft.CodeAnalysis.CSharp.Scripting\": \"1.1.1\"\n  },\n\n  \"commands\": {\n    \"Scripting\": \"Scripting\"\n  },\n\n  \"frameworks\": {\n    \"dnxcore50\": {\n      \"dependencies\": {\n        \"Microsoft.CSharp\": \"4.0.1-beta-23516\",\n        \"System.Collections\": \"4.0.11-beta-23516\",\n        \"System.Console\": \"4.0.0-beta-23516\",\n        \"System.Linq\": \"4.0.1-beta-23516\",\n        \"System.Runtime\": \"4.0.20\",\n        \"System.Threading\": \"4.0.11-beta-23516\",\n        \"System.Threading.Tasks\": \"4.0.10\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/AfterDeclaration.cs",
    "content": "﻿namespace IdentifierScope.AfterDeclaration\n{\n    using System;\n\n    class Program\n    {\n#if false\n        static void ReadBeforeDeclaration()\n        {\n            // 宣言より後なのでコンパイル エラー\n            x = 10;\n\n            int x; // 変数宣言\n\n            // 宣言より後なので OK\n            x = 20;\n        }\n#endif\n\n        static void DefiniteAssignment1()\n        {\n#if false\n            {\n                int x; // 未初期化変数\n\n                // 初期化前には読めない。コンパイル エラー\n                Console.WriteLine(x);\n            }\n#endif\n\n            {\n                int y; // 未初期化変数\n\n                y = 10; // ここで初期化\n\n                // これならOK\n                Console.WriteLine(y);\n            }\n        }\n\n        static void DefiniteAssignment2()\n        {\n#if false\n            {\n                int x; // 未初期化変数\n\n                if (Console.ReadKey().Key == ConsoleKey.A)\n                {\n                    x = 10;\n                }\n\n                // 条件を満たさない時に x が初期化されない。コンパイル エラー\n                Console.WriteLine(x);\n            }\n#endif\n\n            {\n                int y; // 未初期化変数\n\n                if (Console.ReadKey().Key == ConsoleKey.A)\n                {\n                    y = 10;\n                }\n                else\n                {\n                    y = 20;\n                }\n\n                // これならOK\n                Console.WriteLine(y);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/AnonymousFunction.cs",
    "content": "﻿\nnamespace IdentifierScope.AnonymousFunction\n{\n    using System;\n\n    class Sample\n    {\n        public int Value { get; }\n\n        public Sample(int value)\n        {\n            Value = value;\n        }\n        ~Sample()\n        {\n            Console.WriteLine(\"SampleがGCされました\");\n        }\n    }\n\n    public class Program\n    {\n        public static Func<int> M()\n        {\n            Func<int> f;\n            {\n                var s = new Sample(1);\n                f = () => s.Value;\n                // 変数 s のスコープはここまで\n            }\n\n            // でも、f が内部で s を参照しているので、インスタンスの寿命が延びる\n            // 変数 s のスコープを超えて、f のスコープ内でずっと生き残る\n            // GC 起動しても回収されず\n            GC.Collect();\n\n            return f;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/EmbeddedStatement.cs",
    "content": "﻿#pragma warning disable 219\n#pragma warning disable 642\n#pragma warning disable 649\n\nnamespace IdentifierScope.EmbeddedStatement\n{\n    using System;\n\n    class Program\n    {\n        static void DeclarationInEmbeddedStatement()\n        {\n#if InvalidCode\n            if (true)\n                int x = 10; // コンパイル エラー\n#endif\n\n            if (true)\n            {\n                int x = 10; // これなら OK\n            }\n\n#if InvalidCode\n            foreach (var n in new[] { 1 })\n                int x = 10; // コンパイル エラー\n#endif\n\n            foreach (var n in new[] { 1 })\n            {\n                int x = 10; // これなら OK\n            }\n        }\n\n        static void M(object obj)\n        {\n            if (obj is int x1) // 条件式内\n                ;\n\n            foreach (var n in obj is int x2 ? \"a\" : \"b\") // foreach の () 内\n                ;\n\n            for (var n = 0; obj is int x3 ? n < x3 : false; n++) // for の () 内\n                ;\n\n            if (true)\n                Console.WriteLine(obj is int x4 ? 1 : 2); // 埋め込みステートメント内\n\n            foreach (var n in \"a\")\n                Console.WriteLine(obj is int x5 ? 1 : 2); // 埋め込みステートメント内\n        }\n\n        static int SwitchCaseSample(object obj)\n        {\n            switch (obj)\n            {\n                case int x: return x;\n                case string x: return x.Length; // int x の方とは別になる\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n\n        static void ErroneousSample(object obj)\n        {\n            if (true)\n            {\n                Console.WriteLine(obj is int x ? 1 : 2); // もちろん、ブロック内がスコープ\n                x = 1; // これは OK\n            }\n\n            if (true)\n                Console.WriteLine(obj is int x ? 1 : 2); // 埋め込みステートメント内がスコープ\n\n            foreach (var n in obj is int x ? \"a\" : \"b\") // foreach 内がスコープ\n                ;\n\n            for (var n = 0; obj is int x ? n < x : false; n++) // for 内がスコープ\n                ;\n\n            using (obj is IDisposable x ? x : null) // using 内がスコープ\n                ;\n\n            while (obj is int x) // while 内がスコープ\n            {\n                obj = \"\";\n            }\n\n#if InvalidCode\n            // どの x ももうスコープ外。コンパイル エラー\n            x = 10;\n#endif\n        }\n\n        static void ForIncrementSample(object obj)\n        {\n            for (int i = 0; i < 100; i += obj is int x ? x : 1) // この x はこの式内でだけ使える\n            {\n                var x = \"別の値\"; // OK。更新式内の x とは別物\n            }\n        }\n\n        static void SuccessfulSample(object obj)\n        {\n            if (obj is int x1) // 条件式内\n            {\n            }\n            else\n            {\n                x1 = 10; // ここも x1 のスコープ\n            }\n\n            Console.WriteLine(x1); // ここも x1 のスコープ\n        }\n\n#if InvalidCode\n        static int _field = int.TryParse(\"123\", out var x) ? x : 0;\n#endif\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/For.cs",
    "content": "﻿namespace IdentifierScope.For\n{\n    using System;\n\n    public class Program\n    {\n        public static void M(int n)\n        {\n            for (int i = 0; i < n; i++)\n            {\n                Console.WriteLine(i);\n            }\n\n            {\n                int i = 0;\n                while(i < n)\n                {\n                    Console.WriteLine(i);\n                    i++;\n                }\n            }\n        }\n\n        public static void M1()\n        {\n            Action a = null!;\n\n            for (int i = 0; i < 10; i++)\n            {\n                a += () => Console.WriteLine(i); // この i はずっと共有\n            }\n            // ループを抜けたときには、i の値は 10 に置き換わってる\n\n            // 結果、10が10回表示される\n            a();\n        }\n\n        public static void M2()\n        {\n            Action a = null!;\n\n            for (int i = 0; i < 10; i++)\n            {\n                var j = i;\n                a += () => Console.WriteLine(j); // この j は1回1回別\n            }\n\n            // 結果、0～9が1回ずつ表示される\n            a();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/Foreach.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace IdentifierScope.Foreach\n{\n    public class Program\n    {\n        public static void M(IEnumerable<int> list)\n        {\n            foreach (var i in list)\n            {\n                Console.WriteLine(i);\n            }\n\n            {\n                // C# 3.0 以前\n                var e = list.GetEnumerator();\n                using (e as IDisposable)\n                {\n                    int i; // ループの外\n                    while (e.MoveNext())\n                    {\n                        i = e.Current;\n                        Console.WriteLine(i);\n                    }\n                }\n            }\n\n            {\n                // C# 4.0 以降\n                var e = list.GetEnumerator();\n                using (e as IDisposable)\n                {\n                    while (e.MoveNext())\n                    {\n                        var i = e.Current; // ループの中\n                        Console.WriteLine(i);\n                    }\n                }\n            }\n        }\n\n        public static void M1()\n        {\n            Action a = null!;\n\n            foreach (var i in Enumerable.Range(0, 10))\n            {\n                // C# 3.0 以前: この i はずっと共有\n                // C# 4.0 以降: この i は1回1回別\n                a += () => Console.WriteLine(i);\n            }\n\n            // C# 3.0 以前: 9が10回表示される\n            // C# 4.0 以降: 0～9が1回ずつ表示される\n            a();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/IdentifierScope.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>IdentifierScope.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/IsOperator.cs",
    "content": "﻿namespace IdentifierScope.IsOperator\n{\n    using System;\n\n    class Base { }\n    class Derived1 : Base { public int Id => 1; }\n    class Derived2 : Base { public string Name => \"2\"; }\n\n    class Sample\n    {\n        public static void M(Base x)\n        {\n            //if (x is Derived1 d)\n            //{\n            //    // x の型が Derived1 だった場合だけ、キャスト結果が d に入る\n            //    Console.WriteLine(d.Id);\n            //}\n            //else if (x is Derived2 d)\n            //{\n            //    // x の型が Derived2 だった場合だけ、キャスト結果が d に入る\n            //    // d のスコープは if 直後の(条件が真の時の)ブロック内だけ\n            //    // x is Derived1 d の方とこっちの d は別物\n            //    Console.WriteLine(d.Name);\n            //}\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/Iterator.cs",
    "content": "﻿namespace IdentifierScope.Iterator\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Threading.Tasks;\n\n    class Sample\n    {\n        ~Sample()\n        {\n            Console.WriteLine(\"SampleがGCされました\");\n        }\n    }\n\n    public class Program\n    {\n        public static void M()\n        {\n            foreach (var i in Iterator()) ;\n            AsyncMethod().Wait();\n        }\n\n        static IEnumerable<int> Iterator()\n        {\n            var s = new Sample();\n            yield return 1;\n            Console.WriteLine(\"1\");\n\n            // s はずっと生き残ってる。回収されない\n            GC.Collect();\n\n            yield return 2;\n            Console.WriteLine(\"2\");\n\n            // 同上。回収されない\n            GC.Collect();\n\n            yield return 3;\n            Console.WriteLine(\"3\");\n        }\n\n        static async Task AsyncMethod()\n        {\n            var s = new Sample();\n            await Task.Delay(1);\n            Console.WriteLine(\"1\");\n\n            // s はずっと生き残ってる。回収されない\n            GC.Collect();\n\n            await Task.Delay(1);\n            Console.WriteLine(\"2\");\n\n            // 同上。回収されない\n            GC.Collect();\n\n            await Task.Delay(1);\n            Console.WriteLine(\"3\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/Lifetime.cs",
    "content": "﻿\nnamespace IdentifierScope.Lifetime\n{\n    using System;\n\n    class Sample\n    {\n        public Sample()\n        {\n            Console.WriteLine(\"Sampleが作られました\");\n        }\n        ~Sample()\n        {\n            Console.WriteLine(\"SampleがGCされました\");\n        }\n    }\n\n    public class Program\n    {\n        public static void M()\n        {\n            {\n                Console.WriteLine(\"Scope開始\");\n                var s = new Sample();\n\n                // この時点ではまだ生きているので、GC しても無駄\n                GC.Collect();\n\n                Console.WriteLine(\"Scope終了\");\n            }\n\n            // この時点で s に入っていた Sample インスタンスは寿命迎えてる\n            // GC を強制起動すると回収されるはず\n            GC.Collect();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/LocalFunctions.cs",
    "content": "﻿namespace IdentifierScope.LocalFunctions\n{\n    class Program\n    {\n        static void Main()\n        {\n            // ローカル関数は宣言より前で使える\n            var y = f(2);\n\n            int f(int x) => x * x;\n        }\n    }\n\n    namespace DefiniteAssignment\n    {\n        class Program\n        {\n            static void SuccessfulSample()\n            {\n                int a; // 未初期化\n                int f(int x) => a * x; // (この時点で)未初期化変数 a 参照\n                a = 10; // ここで初期化\n                var y = f(2); // OK\n            }\n\n#if false\n            static void ErroneousSample()\n            {\n                int a; // 未初期化\n                int f(int x) => a * x; // 未初期化変数 a 参照\n                // 初期化しない！\n                var y = f(2); // コンパイル エラー\n            }\n#endif\n        }\n    }\n\n    namespace LocalVariableOrMethod\n    {\n        using System;\n\n        class Program\n        {\n            static void Main()\n            {\n                // ローカル関数は、こういうローカル変数的な扱いすべき？\n                Func<int, int> f = x => x * x;\n\n                // もしローカル変数的に扱うなら、f はこの後ろでしか使えない\n                var y = f(2);\n\n                // それとも、メソッドと同じような扱いにすべき？\n                // メソッドなら、宣言よりも前でも使える\n                var z = M(2);\n            }\n\n            // メソッドであれば、宣言が後ろにあってもいい\n            static int M(int x) => x * x;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/Loop.cs",
    "content": "﻿namespace IdentifierScope.Loop\n{\n    using System;\n    using System.Linq;\n\n    public class Sample\n    {\n        public static void M()\n        {\n            for (int i = 0; i < 5; i++)\n            {\n                // for の i のスコープはこのブロック内\n                Console.WriteLine(i);\n            }\n\n            foreach (var i in Enumerable.Range(0, 5))\n            {\n                // foreach の i のスコープはこのブロック内\n                // for の方の i とは別物\n                Console.WriteLine(i);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/Member.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace IdentifierScope.Member\n{\n    public class Sample\n    {\n        int x = 20;\n\n        public void M()\n        {\n            int x = 10;\n\n            Console.WriteLine(x);      // ローカル変数の方の x = 10\n            Console.WriteLine(this.x); // フィールドの方の x = 20\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/Method.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace IdentifierScope\n{\n    public class Sample\n    {\n        public static int X(int X)\n        {\n            if (X <= 1) return 1;\n            else return Sample.X(X - 1);\n        }\n\n        public static void M(int x)\n        {\n            //int x = 10; // コンパイル エラー\n            Console.WriteLine(x);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/Nest.cs",
    "content": "﻿namespace IdentifierScope.Nest\n{\n    using System;\n\n    public class Program\n    {\n        public static void M1()\n        {\n            int x = 10;\n\n            {\n                //int x = 20;\n                Console.WriteLine(x);\n            }\n\n            Console.WriteLine(x);\n        }\n\n        public static void M2()\n        {\n            {\n                int x = 10;\n                Console.WriteLine(x);\n            }\n\n            {\n                // 別ブロック = 別スコープ。↑のxとは完全に別物\n                string x = \"a\";\n                Console.WriteLine(x);\n            }\n        }\n\n        public static void M3()\n        {\n            {\n                // 下で定義されている string の方の x と名前被り\n                //int x = 20; // コンパイル エラー\n                //Console.WriteLine(x);\n            }\n\n            // string の方の x はここから下でしか使えない\n            // にも関わらず、x のスコープはメソッド内全体\n            string x = \"a\";\n            Console.WriteLine(x);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace IdentifierScope\n{\n    public class Program\n    {\n        static void Main(string[] args)\n        {\n            Iterator.Program.M();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/Scope.cs",
    "content": "﻿namespace IdentifierScope.Scope\n{\n    using System;\n\n    public class Program\n    {\n        static int _count;\n\n        public static void M()\n        {\n            int x = 10;\n            _count = x;\n            Console.WriteLine(x);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/TypeName.cs",
    "content": "﻿using System;\n\nnamespace Color\n{\n    public enum Color\n    {\n        Green,\n        Yellow,\n        Red,\n    }\n\n    public class Sample\n    {\n        public global::Color.Color Color { get; set; }\n\n        public void M()\n        {\n            global::Color.Color Color = global::Color.Color.Red;\n\n            Console.WriteLine(Color);\n            Console.WriteLine(this.Color);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/TypeName1.cs",
    "content": "﻿#pragma warning disable 219\n\nnamespace TypeName1\n{\n    using System;\n\n    namespace Color\n    {\n        public enum Color\n        {\n            Green,\n            Yellow,\n            Red,\n        }\n\n        public class Sample\n        {\n            public Color Color { get; set; }\n\n            public void M()\n            {\n                Color Color = Color.Red;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/IdentifierScope/TypeName2.cs",
    "content": "﻿namespace TypeName2\n{\n    public class Sample\n    {\n        public enum Color\n        {\n            Green,\n            Yellow,\n            Red,\n        }\n\n        // enum の Color と同じスコープ内でプロパティの Color を作ろうとしていて\n        // この場合はコンパイル エラーになる\n        //public Color Color { get; set; }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/Start.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28531.58\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"IdentifierScope\", \"IdentifierScope\\IdentifierScope.csproj\", \"{183C51EE-B17B-4607-991B-16A01FE5A66E}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Variables\", \"Variables\\Variables.csproj\", \"{C1933686-B6BC-49A4-87FA-69AAB0C1500B}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"StringInterplation\", \"StringInterplation\\StringInterplation.csproj\", \"{E9928C31-834A-49D6-96D9-A24FBD3F8218}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{183C51EE-B17B-4607-991B-16A01FE5A66E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C1933686-B6BC-49A4-87FA-69AAB0C1500B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E9928C31-834A-49D6-96D9-A24FBD3F8218}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E9928C31-834A-49D6-96D9-A24FBD3F8218}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E9928C31-834A-49D6-96D9-A24FBD3F8218}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E9928C31-834A-49D6-96D9-A24FBD3F8218}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {5F912B5A-F9E4-4063-B0F7-A72F30750032}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/Start/StringInterplation/Overload.cs",
    "content": "﻿namespace StringInterplation.Overload\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            var (x, y) = (1, 2);\n\n            // string と FormattableString のオーバーロードがあると、string が優先されてしまう。\n            M1($\"({x}, {y})\");\n            // 一応、明示的にキャストを書けば呼び分け可能\n            M1((FormattableString)$\"({x}, {y})\");\n\n            // FormattableString 側が呼ばれる\n            M2($\"({x}, {y})\");\n            // RawString 側が呼ばれる\n            M2(\"abc\");\n        }\n\n        // string が優先されるので、M1($\"\") という書き方では呼び分けできない。\n        static void M1(string s) => Console.WriteLine(\"string: \" + s);\n        static void M1(FormattableString s) => Console.WriteLine($\"format: {s.Format}, args: {string.Join(\", \", s.GetArguments())}\");\n\n        // M2(\"\") と M2($\"\") で呼び分けできる。\n        static void M2(RawString s) => M1(s.Value);\n        static void M2(FormattableString s) => M1(s);\n\n        // オーバーロード解決の優先度をごまかすために、string からの暗黙的型変換を持つ構造体を用意。\n        public readonly struct RawString\n        {\n            public readonly string Value;\n            public RawString(string value) => Value = value;\n            public static implicit operator RawString(string s) => new RawString(s);\n\n            // これがないとダメみたい\n            public static implicit operator RawString(FormattableString s) => throw new InvalidCastException();\n        }\n\n        static void M1()\n        {\n            // string の方が呼ばれる\n            M1(\"\");\n\n            // これでも、結局 string の方が呼ばれる\n            M1($\"\");\n\n            // FormattableString の方を呼びたければ明示的なキャストが必要\n            M1((FormattableString)$\"\");\n        }\n\n        static void M2()\n        {\n            // RawString (string) の方が呼ばれる\n            M2(\"\");\n\n            // これなら FormattableString の方が呼ばれる\n            M2($\"\");\n\n            // ただ、 + とかを加えてしまうと string 扱いになってしまうので注意\n            M2($\"\" + $\"\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/StringInterplation/Program.cs",
    "content": "﻿using System;\n\nnamespace StringInterplation\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Console.WriteLine(\"Hello World!\");\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/StringInterplation/StringInterplation.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>StringInterplation.Overload.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/Start/Variables/Literals.cs",
    "content": "﻿namespace Variables.Literals\n{\n    using System;\n\n    class Program\n    {\n        static void M()\n        {\n            byte bitMask = 0b1100_0000;\n            Console.WriteLine(bitMask); // 192\n\n            uint magicNumber = 0xDEAD_BEEF;\n            Console.WriteLine(magicNumber); // 3735928559\n            Console.WriteLine(magicNumber.ToString(\"X\")); // DEADBEEF \n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/Variables/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Variables\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/Start/Variables/Variables.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/StructuredProgramming/BackportEnumerable/Action.cs",
    "content": "﻿namespace System\n{\n    public delegate void Action<in T1>(T1 x1);\n    public delegate void Action<in T1, in T2>(T1 x1, T2 x2);\n    public delegate void Action<in T1, in T2, in T3>(T1 x1, T2 x2, T3 x3);\n    public delegate void Action<in T1, in T2, in T3, in T4>(T1 x1, T2 x2, T3 x3, T4 x4);\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/BackportEnumerable/BackportEnumerable.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net2</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/StructuredProgramming/BackportEnumerable/Func.cs",
    "content": "﻿namespace System\n{\n    public delegate TResult Func<in T1, out TResult>(T1 x1);\n    public delegate TResult Func<in T1, in T2, out TResult>(T1 x1, T2 x2);\n    public delegate TResult Func<in T1, in T2, in T3, out TResult>(T1 x1, T2 x2, T3 x3);\n    public delegate TResult Func<in T1, in T2, in T3, in T4, out TResult>(T1 x1, T2 x2, T3 x3, T4 x4);\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/BackportEnumerable/Linq/Enumerable.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace System.Linq\n{\n    public static class Enumerable\n    {\n        public static IEnumerable<TResult> Select<TSource, TResult>( this IEnumerable<TSource> source, Func<TSource, TResult> selector)\n        {\n            foreach (var item in source)\n            {\n                yield return selector(item);\n            }\n        }\n\n        public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)\n        {\n            foreach (var item in source)\n            {\n                if (predicate(item))\n                    yield return item;\n            }\n        }\n\n        public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)\n        {\n            return new List<TSource>(source);\n        }\n\n        public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)\n        {\n            var list = source.ToList();\n            var array = new TSource[list.Count];\n            for (int i = 0; i < list.Count; i++)\n                array[i] = list[i];\n            return array;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/BackportEnumerable/Runtime/CompilerServices/ExtensionAttribute.cs",
    "content": "﻿namespace System.Runtime.CompilerServices\n{\n    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]\n    public sealed class ExtensionAttribute : Attribute\n    {\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/BackportEnumerable/readme.txt",
    "content": "﻿.NET 2.0 向けに LINQ 関連の一部をバックポート。\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Exceptions/ExceptionFilterSample.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace Exceptions\n{\n    class ExceptionFilterSample\n    {\n        public static void Main()\n        {\n            ParallelCatch();\n\n            try\n            {\n                F();\n            }\n            catch (DirectoryNotFoundException e)\n            {\n                // DirectoryNotFoundException のときと FileNotFoundException の時で\n                // 全く同じ例外処理の仕方をしたい場合がある。\n                Console.WriteLine(e);\n            }\n            catch (FileNotFoundException e)\n            {\n                // DirectoryNotFoundException のときと FileNotFoundException の時で\n                // 全く同じ例外処理の仕方をしたい場合がある。\n                Console.WriteLine(e);\n\n                // コピペ コードになっちゃうので嫌！\n            }\n\n            try\n            {\n                F();\n            }\n            catch (Exception e) when (e is DirectoryNotFoundException || e is FileNotFoundException)\n            {\n                // DirectoryNotFoundException のときと FileNotFoundException の時で\n                // 全く同じ例外処理の仕方をしたい場合がある。\n                Console.WriteLine(e);\n            }\n        }\n\n        private static void ParallelCatch()\n        {\n            try\n            {\n                Parallel.For(0, 10000, F);\n            }\n            catch (AggregateException e) when (e.InnerExceptions.Any(i => i is ArgumentException))\n            {\n                // F が ArgumentException を throw する場合でも、\n                // Parellel.For を通した結果、ここに来る例外は AggregateException で、\n                // AggregateException.InnerExceptions の中に ArgumentException が入っている。\n            }\n        }\n\n        static void F(int n)\n        {\n            if (n < 0) throw new ArgumentException($\"'{nameof(n)}' must be positive or zero\");\n        }\n\n        static void F()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Exceptions/ExceptionImplementation.cs",
    "content": "﻿using System;\n\nnamespace Exceptions\n{\n    /// <summary>\n    /// 不正な入力に対して例外を出す実装。\n    /// </summary>\n    /// <remarks>\n    /// 「不正な入力をはじくのはメソッドの手前で、メソッドを呼ぶ側が責任を持ってやれ」という場合はこういう実装にする。\n    /// 実のところ、この手の例外はあんまりcatchしない。「例外が出る状況 = バグってる」というタイプの例外。デバッグで取りきる。\n    /// </remarks>\n    class ExceptionImplementation\n    {\n        public static void Main()\n        {\n            try\n            {\n                Console.Write(\"{0}\\n\", StringToInt(\"12345\"));\n                Console.Write(\"{0}\\n\", StringToInt(\"12a45\"));\n                //↑ ここで FormatException 例外が投げられる。\n            }\n            catch (FormatException)\n            {\n                Console.Write(\"想定外の文字列が入力されました\");\n            }\n        }\n\n        /// <summary>\n        /// 文字→整数\n        /// </summary>\n        /// <param name=\"c\"></param>\n        /// <returns></returns>\n        static int CharToInt(char c)\n        {\n            if (c < '0' || '9' < c)\n                throw new FormatException(); // 不正な文字が入力された場合、例外を投げる\n\n            return c - '0';\n        }\n\n        /// <summary>\n        /// 文字列→整数\n        /// </summary>\n        /// <param name=\"str\"></param>\n        /// <returns></returns>\n        static int StringToInt(string str)\n        {\n            int val = 0;\n            foreach (char c in str)\n            {\n                int i = CharToInt(c);\n                val = val * 10 + i;\n            }\n            return val;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Exceptions/Exceptions.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>Exceptions.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Exceptions/IgnoreErrorImplementation.cs",
    "content": "﻿using System;\n\nnamespace Exceptions\n{\n    /// <summary>\n    /// 不正な文字列とか気にせず、変な値が返ってくるのを許容する実装。\n    /// 利用者側が気を付けて使ってられる範囲なら案外ありな実装。\n    /// 大規模化・汎用化してきたらはまる。\n    /// </summary>\n    class IgnoreErrorImplementation\n    {\n        public static void Main()\n        {\n            Console.Write(\"{0}\\n\", StringToInt(\"12345\"));\n            Console.Write(\"{0}\\n\", StringToInt(\"12a45\")); // 途中に数字以外の文字が\n        }\n\n        /// <summary>\n        /// 文字→整数\n        /// </summary>\n        /// <param name=\"c\"></param>\n        /// <returns></returns>\n        public static int CharToInt(char c)\n        {\n            return c - '0';\n        }\n\n        /// <summary>\n        /// 文字列→整数\n        /// </summary>\n        /// <param name=\"str\"></param>\n        /// <returns></returns>\n        public static int StringToInt(string str)\n        {\n            int val = 0;\n            foreach (char c in str)\n            {\n                int i = CharToInt(c);\n                val = val * 10 + i;\n            }\n            return val;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Exceptions/Program.cs",
    "content": "﻿namespace Exceptions\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            IgnoreErrorImplementation.Main();\n            ReturnCodeImplementation.Main();\n            ExceptionImplementation.Main();\n            ExceptionFilterSample.Main();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Exceptions/ReturnCodeImplementation.cs",
    "content": "﻿using System;\n\nnamespace Exceptions\n{\n    /// <summary>\n    /// エラーがあるときには特定の値を返すような実装。\n    /// この場合、「戻り値は必ず正」という縛りの中だから、-1 とかを使える。\n    /// この他、「int? 型にしておいて、不正な入力の場合には null を返す」とかもよくやる。\n    /// </summary>\n    /// <remarks>\n    /// この手の、文字列を整数化するような場合、<see cref=\"int.TryParse(string, out int)\"/> みたいな、bool戻り値を使う場合もよくある。\n    /// </remarks>\n    class ReturnCodeImplementation\n    {\n        public static void Main()\n        {\n            int i;\n\n            i = StringToInt(\"12345\");\n            if (i == -1)\n                Console.Write(\"想定外の文字列が入力されました\");\n            else\n                Console.Write(\"{0}\\n\", i);\n\n            i = StringToInt(\"12a45\");\n            if (i == -1)\n                Console.Write(\"想定外の文字列が入力されました\");\n            else\n                Console.Write(\"{0}\\n\", i);\n        }\n\n        /// <summary>\n        /// 文字→整数\n        /// </summary>\n        /// <param name=\"c\"></param>\n        /// <returns></returns>\n        public static int CharToInt(char c)\n        {\n            if ('0' <= c && c <= '9')\n                return c - '0';\n            else\n                return -1; // 想定外の文字が入力された場合、-1 を返す。\n        }\n\n        /// <summary>\n        /// 文字列→整数\n        /// </summary>\n        /// <param name=\"str\"></param>\n        /// <returns></returns>\n        public static int StringToInt(string str)\n        {\n            int val = 0;\n            foreach (char c in str)\n            {\n                int i = CharToInt(c);\n                if (i == -1) return -1; // 想定外の文字列が入力された場合、-1 を返す。\n                val = val * 10 + i;\n            }\n            return val;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Exceptions/ThrowExpressions.cs",
    "content": "﻿namespace Exceptions.ThrowExpressions\n{\n    using System;\n\n    class Program\n    {\n        // 式形式のメソッドの中( => の直後)\n        static void A() => throw new NotImplementedException();\n\n        static string B(object obj)\n        {\n            // null 合体演算子(??)の後ろ\n            var s = obj as string ?? throw new ArgumentException(nameof(obj));\n\n            // 条件演算子(?:)の条件以外の部分\n            return s.Length == 0 ? \"empty\" :\n                s.Length < 5 ? \"short\" :\n                throw new InvalidOperationException(\"too long\");\n        }\n\n#if InvalidCode\n        static void C()\n        {\n            // コンパイル エラー。この文脈に throw 式は書けない\n            B(throw new InvalidOperationException());\n        }\n\n        static void D()\n        {\n            // コンパイル エラー。null(型を持っていない)と並べると型が決まらない。\n            var x = true ? null : throw new Exception();\n\n            // コンパイル エラー。throw 式同士を並べると型が決まらない。\n            var y = true ? throw new InvalidOperationException() : throw new NotSupportedException();\n        }\n#endif\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Expressions/Expressions.cs",
    "content": "﻿#pragma warning disable 219\n#pragma warning disable 414\n\nusing System;\n\nnamespace Expressions\n{\n    class Expressions\n    {\n        int _x = 10 * 1000 * 1000;\n\n        Expressions() : this(2 * 3) { }\n        Expressions(int n) { }\n\n        static void M()\n        {\n            var x = 1 + 2 * 3 > 4 || 5 * 6 + 8 < 9;\n            var y = Math.Max(1 + (2 + 3) + 4, 5 + 6);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Expressions/Expressions.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Expressions/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Expressions\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Expressions/Statements.cs",
    "content": "﻿namespace Expressions\n{\n    class Statements\n    {\n        static void M()\n        {\n            var x = 10;\n\n            if (x > 5)\n            {\n            }\n            else\n            {\n            }\n\n            int[] items = { 1, 2, 3 };\n\n            foreach (var item in items)\n            {\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/ExternAliasConsoleApplication/ExternAliasConsoleApplication.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net45</TargetFramework>\n    <StartupObject>Program</StartupObject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\BackportEnumerable\\BackportEnumerable.csproj\">\n      <Aliases>Backport</Aliases>\n    </ProjectReference>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/StructuredProgramming/ExternAliasConsoleApplication/Program.cs",
    "content": "﻿using System;\n\nclass Program\n{\n    static void Main()\n    {\n    }\n}\n\nnamespace UsingStandard\n{\n    using System.Linq;\n\n    class Sample\n    {\n        public static void Run()\n        {\n            var x = new[] { 1, 2, 3, 4, 5 };\n            var y = x.Where(i => (i & 1) != 0).Select(i => i * i); // 標準の LINQ\n            Console.WriteLine(string.Join(\", \", y));\n        }\n    }\n}\n\nnamespace UsingBackport\n{\n    extern alias Backport; // コンパイル オプションで BackportEnumerable.dll を指定\n    using Backport::System.Linq;\n\n    class Sample\n    {\n        public static void Run()\n        {\n            var x = new[] { 1, 2, 3, 4, 5 };\n            var y = x.Where(i => (i & 1) != 0).Select(i => i * i); // 自作のパックポート LINQ\n            Console.WriteLine(string.Join(\", \", y));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Function/ExpressionBodied.cs",
    "content": "﻿namespace Function.ExpressionBodied\n{\n    using System;\n\n    // C# 6 時点で => を使って書ける関数メンバー\n    class Csharp6\n    {\n        // メソッド\n        int Method(int x) => x * x;\n\n        // 演算子\n        public static Csharp6 operator +(Csharp6 x) => x;\n\n        // プロパティ(get-only)\n        int X => 0;\n\n        // インデクサー(get-only)\n        int this[int index] => index;\n    }\n\n    // C# 7 で追加された => を使って書ける関数メンバー\n    class Csharp7\n    {\n        static int x;\n\n        // コンストラクター\n        Csharp7() => x++;\n\n        // デストラクター\n        ~Csharp7() => x--;\n\n        // プロパティ(get/set)\n        int X\n        {\n            get => x++;\n            set => x--;\n        }\n\n        // インデクサー(get/set)\n        int this[int index]\n        {\n            get => x += index;\n            set => x -= index;\n        }\n\n        // イベント(add/remove)\n        event Action E\n        {\n            add => x++;\n            remove => x--;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Function/FuncAction.cs",
    "content": "﻿namespace Function.FuncAction\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            Action a1 = A1; // Func<void> とは書けない\n            Action<int> a2 = A2;\n            Func<int> f1 = F1; // Action と Func が別\n            Func<int, int> f2 = F2;\n        }\n\n        static void A1() { } // 戻り値がないと、=> 記法も使えない\n        static void A2(int x) { }\n        static int F1() => 0;\n        static int F2(int x) => x;\n    }\n}\n\nnamespace Function.UnitFunc\n{\n    using System;\n\n    // 空っぽの型を1個用意\n    struct Unit { }\n\n    class Program\n    {\n        static void Main()\n        {\n            // void の代わりに Unit を使うことで、全部 Func に統一\n            Func<Unit> a1 = A1;\n            Func<int, Unit> a2 = A2;\n            Func<int> f1 = F1;\n            Func<int, int> f2 = F2;\n        }\n\n        static Unit A1() => default(Unit); // 空っぽの値を返しておく\n        static Unit A2(int x) => default(Unit);\n        static int F1() => 0;\n        static int F2(int x) => x;\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Function/Function.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Function/InputNumberSample.cs",
    "content": "﻿using System;\n\n/// <summary>\n/// 数値入力の例。\n/// </summary>\nclass InputNumberSample\n{\n    public static void Run()\n    {\n        double x, y, z; // 変数を宣言。\n\n        // x, y にユーザーの入力した値を代入。\n        x = GetDouble(\"input x : \");\n        y = GetDouble(\"input y : \");\n\n        // 入力された値を元に計算\n        z = x * x + y * y; // z に x と y の二乗和を代入\n        x /= z;            // x =  x / z; と同じ。\n        y /= -z;           // y = -y / z; と同じ。\n\n        // 計算結果を出力\n        Console.Write(\"({0}, {1})\", x, y);\n    }\n\n    /// <summary>\n    /// 入力を促すメッセージを表示して、実数を入力してもらう。\n    /// 正しく実数として解釈できる文字が入力されるまで繰り返す。\n    /// <param name=\"message\"> 入力を促すメッセージ </param>\n    /// <return> 入力された値 </return>\n    /// </summary>\n    static double GetDouble(string message)\n    {\n        while (true)\n        {\n            // 入力を促すメッセージを表示して、値を入力してもらう\n            Console.Write(message);\n            double x;\n            if (double.TryParse(Console.ReadLine(), out x))\n                return x;\n\n            // 不正な入力が行われた場合の処理\n            Console.Write(\"error : 正しい値が入力されませんでした\\n入力しなおしてください\\n\");\n        }\n    }\n\n    /*\n    // 旧バージョン(エラー処理がない)\n    // 数値化できない文字列を入力すると、その時点でプログラムが止まる。\n\n    static double GetDouble(string message)\n    {\n        Console.Write(message);\n        double x = double.Parse(Console.ReadLine());\n        return x;\n    }\n    */\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Function/MultipleReturns.cs",
    "content": "﻿namespace Function.MultipleReturns\n{\n    class Program\n    {\n        struct SumCount\n        {\n            public int sum;\n            public int count;\n        }\n\n        static SumCount Tally(int[] items)\n        {\n            var sum = 0;\n            var count = 0;\n            foreach (var x in items)\n            {\n                sum += x;\n                count++;\n            }\n            return new SumCount { sum = sum, count = count };\n        }\n    }\n}\n\nnamespace Function.MultipleReturnsByTuple\n{\n    class Program\n    {\n        static (int sum, int count) Tally(int[] items)\n        {\n            var sum = 0;\n            var count = 0;\n            foreach (var x in items)\n            {\n                sum += x;\n                count++;\n            }\n            return (sum, count);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Function/MyMath.cs",
    "content": "﻿using System;\n\n/// <summary>\n/// 数学関数を作ってみる例。\n/// </summary>\nclass MyMath\n{\n    public static void Test()\n    {\n        var r = new Random();\n\n        // 10桁程度の制度で一致してたらよしとする\n        const double epsilon = 1e-10;\n\n        for (int i = 0; i < 20; i++)\n        {\n            var x = 0.1 * r.NextDouble();\n\n            // C# 標準の Sin 関数と値を比べてみる。\n            var y1 = Sin(x);\n            var y2 = Math.Sin(x);\n\n            if(y1 - y2 > epsilon)\n                Console.WriteLine(\"値が一致しませんでした\");\n        }\n    }\n\n    /// <summary>\n    /// sin x を求める関数。\n    /// テイラー展開を利用。\n    /// かなり適当に作ってるので、この方法ではそんなに精度はよくない。\n    /// とはいえ、10桁程度なら C# 標準の Sin 関数と値が一致するはず。\n    /// </summary>\n    static double Sin(double x)\n    {\n        double xx = -x * x;\n        double fact = 1;\n        double sin = x;\n        for (int i = 1; i < 100;)\n        {\n            fact *= i; ++i; fact *= i; ++i;\n            x *= xx;\n            sin += x / fact;\n        }\n        return sin;\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Function/NoParameterNoReturn.cs",
    "content": "﻿using System;\n\n/// <summary>\n/// 引数がたくさんある関数、引数のない関数や、戻り値のない関数。\n/// </summary>\nclass NoParameterNoReturn\n{\n    public static void Run()\n    {\n        int[] array = new int[3];\n\n        // 乱数を使って値を生成\n        for (int i = 0; i < array.Length; ++i)\n        {\n            array[i] = (int)(Random() >> 58); // [0,63] の整数乱数生成\n        }\n\n        // ノルムを計算\n        double norm = Norm(array[0], array[1], array[2]);\n\n        // 値の出力\n        WriteArray(array);\n        Console.Write(\"norm = {0}\\n\", norm);\n    }\n\n    static ulong seed = 4275646293455673547UL;\n\n    /// <summary>\n    /// 線形合同法による乱数の生成\n    /// </summary>\n    static ulong Random()\n    {\n        unchecked { seed = seed * 1566083941UL + 1; }\n        return seed;\n    }\n\n    /// <summary>\n    /// 入力した3つの値のノルムを計算\n    /// <summary>\n    static double Norm(double x, double y, double z)\n    {\n        return x * x + y * y + z * z;\n    }\n\n    /// <summary>\n    /// 配列を , で各要素を区切って、{}で括った形式で出力\n    /// <summary>\n    static void WriteArray(int[] array)\n    {\n        Console.Write(\"{\");\n        for (int i = 0; i < array.Length - 1; ++i)\n        {\n            Console.Write(\"{0}, \", array[i]);\n        }\n        Console.Write(array[array.Length - 1] + \"}\\n\");\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Function/OverloadSample.cs",
    "content": "﻿using System;\n\nclass OverloadSample\n{\n    public static void Run()\n    {\n        WriteTypeAndValue(\"サンプル\"); // WriteTypeAndValue(string) が呼ばれる\n        WriteTypeAndValue(13);         // WriteTypeAndValue(int)    が呼ばれる\n        WriteTypeAndValue(3.14159265); // WriteTypeAndValue(double) が呼ばれる\n    }\n\n    /// <summary>\n    /// 型名と値を出力する(string 版)。\n    /// </summary>\n    static void WriteTypeAndValue(string s)\n    {\n        Console.Write(\"文字列 : {0}\\n\", s);\n    }\n\n    /// <summary>\n    /// 型名と値を出力する(int 版)。\n    /// </summary>\n    static void WriteTypeAndValue(int n)\n    {\n        Console.Write(\"整数   : {0}\\n\", n);\n    }\n\n    /// <summary>\n    /// 型名と値を出力する(double 版)。\n    /// </summary>\n    static void WriteTypeAndValue(double x)\n    {\n        Console.Write(\"実数   : {0}\\n\", x);\n    }\n\n    // F は、引数の型が違うので大丈夫\n    static void F(int x) { }\n    static void F(string x) { }\n\n#if InvalidCode\n    // G は、引数の型まで一緒で、名前だけ違う。これはコンパイル エラー\n    static void G(int x) { }\n    static void G(int y) { }\n\n    // H は、引数が一致していて、戻り値だけ違う。これもコンパイル エラー\n    static int H() => 1;\n    static string H() => \"\";\n#endif\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Function/Program.cs",
    "content": "﻿using System;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        NoParameterNoReturn.Run();\n        MyMath.Test();\n        InputNumberSample.Run();\n        OverloadSample.Run();\n    }\n\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Inlining/CommonExecutionPath.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\n\nnamespace Inlining\n{\n    /// <summary>\n    /// 結果の一例\n    ///     Method |     Mean |    Error |   StdDev |\n    /// ---------- |---------:|---------:|---------:|\n    ///     Normal | 341.6 ns | 3.659 ns | 3.244 ns |\n    ///  Optimized | 321.7 ns | 2.163 ns | 2.024 ns |\n    ///\n    /// あくまで「ほとんどの場合、Length == 1 または 2」という前提が当たっている場合に限ってなものの、何% か高速化されてる。\n    /// </summary>\n    public class CommonExecutionPath\n    {\n        static int[] _one = new[] { 1 };\n        static int[] _two = new[] { 1, 2 };\n        static int[] _long = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };\n\n        [Benchmark]\n        public void Normal()\n        {\n            // 長いの : 短いの = 1 : 25 の割合で、大半が短い配列に対する呼び出し\n            for (int i = 0; i < 5; i++) Sum(_long);\n            for (int i = 0; i < 25; i++) Sum(_two);\n            for (int i = 0; i < 100; i++) Sum(_one);\n        }\n\n        [Benchmark]\n        public void Optimized()\n        {\n            for (int i = 0; i < 5; i++) OptimizedSum(_long);\n            for (int i = 0; i < 25; i++) OptimizedSum(_two);\n            for (int i = 0; i < 100; i++) OptimizedSum(_one);\n        }\n\n        static int Sum(int[] a)\n        {\n            // ほとんどの場合、Length == 1 または 2 のところを通るという想定\n            if (a.Length == 1) return a[0];\n            else if (a.Length == 2) return a[0] + a[1];\n            else if (a.Length >= 3)\n            {\n                // 反復がインライン化を阻害\n                var sum = 0;\n                foreach (var x in a)\n                {\n                    sum += x;\n                }\n                return sum;\n            }\n\n            // 例外がインライン化を阻害\n            throw new IndexOutOfRangeException();\n        }\n\n        static int OptimizedSum(int[] a)\n        {\n            // ほとんどの場合、Length == 1 または 2 のところを通るという想定\n            if (a.Length == 1) return a[0];\n            else if (a.Length == 2) return a[0] + a[1];\n            else if (a.Length >= 3) return LongSum(a);\n            ThrowIndexOutOfRange();\n            return 0;\n        }\n\n        // インライン化を阻害しているものを外に追い出す\n        private static int LongSum(int[] a)\n        {\n            var sum = 0;\n            foreach (var x in a)\n            {\n                sum += x;\n            }\n            return sum;\n        }\n        private static void ThrowIndexOutOfRange() => throw new IndexOutOfRangeException();\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Inlining/Inlining.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.11\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Inlining/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace Inlining\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            //BenchmarkRunner.Run<WithLoop>();\n            //BenchmarkRunner.Run<SimpleAdd>();\n            BenchmarkRunner.Run<CommonExecutionPath>();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Inlining/SimpleAdd.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System.Runtime.CompilerServices;\n\nnamespace Inlining\n{\n    /// <summary>\n    /// 結果の一例\n    ///  Method |     Mean |     Error |    StdDev |\n    /// ------- |---------:|----------:|----------:|\n    ///      B0 | 3.261 ns | 0.0170 ns | 0.0150 ns | 手動展開\n    ///      B1 | 3.072 ns | 0.0168 ns | 0.0149 ns |\n    ///      B2 | 6.579 ns | 0.0550 ns | 0.0459 ns | NoInlining\n    /// </summary>\n    public class SimpleAdd\n    {\n        static int[] _a = new[] { 1, 2, 3, 4 };\n\n        [Benchmark] public int B0() => F0(_a[0], _a[1], _a[2], _a[3]);\n        [Benchmark] public int B1() => F1(_a[0], _a[1], _a[2], _a[3]);\n        [Benchmark] public int B2() => F2(_a[0], _a[1], _a[2], _a[3]);\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        int F0(int a, int b, int c, int d)\n        {\n            var e = a + b;\n            var f = c + e;\n            var g = d + f;\n            return g;\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static int F1(int a, int b, int c, int d)\n        {\n            var e = Add1(a, b);\n            var f = Add1(c, e);\n            var g = Add1(d, f);\n            return g;\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static int F2(int a, int b, int c, int d)\n        {\n            var e = Add2(a, b);\n            var f = Add2(c, e);\n            var g = Add2(d, f);\n            return g;\n        }\n\n        // Aggressive を付けるまでもなくどう見てもインライン化掛かるレベル\n        static int Add1(int a, int b) => a + b;\n\n        // それをわざわざ阻害\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static int Add2(int a, int b) => a + b;\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Inlining/WithLoop.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\nusing System.Runtime.CompilerServices;\n\nnamespace Inlining\n{\n    /// <summary>\n    /// 結果の一例\n    ///  Method |      Mean |     Error |    StdDev |\n    /// ------- |----------:|----------:|----------:|\n    ///      B0 |  6.955 ns | 0.0476 ns | 0.0344 ns | 手動展開\n    ///      B1 | 10.258 ns | 0.1549 ns | 0.1373 ns |\n    ///      B2 |  6.844 ns | 0.0431 ns | 0.0360 ns | AggressiveInlining\n    ///      B3 | 10.219 ns | 0.1083 ns | 0.0846 ns |\n    ///\n    /// - インライン化の有無で倍近く速度差あり\n    ///   - 配列が短いせい。配列が長くなると、関数呼び出しのコストは相対的に小さくなる\n    /// - AggressiveInlining の時だけインライン化されてそう\n    ///   - おそらく、「ループを含んでると通常はインライン化しない」仕様\n    ///   - 関数の中身のサイズ(Sum の場合は28バイト)的には AggressiveInlining なしでもインライン化されうる範疇のはず\n    /// </summary>\n    public class WithLoop\n    {\n        static int[] _a = new[] { 1, 2, 3 };\n        static int[] _b = new[] { -1, 4, -2 };\n\n        [Benchmark] public int B0() => F0(_a, _b);\n        [Benchmark] public int B1() => F1(_a, _b);\n        [Benchmark] public int B2() => F2(_a, _b);\n        [Benchmark] public int B3() => F3(_a, _b);\n\n        static int F0(int[] a, int[] b)\n        {\n            var sumA = 0;\n            foreach (var x in a)\n            {\n                sumA += x;\n            }\n            var sumB = 0;\n            foreach (var x in b)\n            {\n                sumB += x;\n            }\n\n            return Math.Max(sumA, sumB);\n        }\n\n        static int F1(int[] a, int[] b)\n        {\n            var sumA = Sum(a);\n            var sumB = Sum(b);\n\n            return Math.Max(sumA, sumB);\n        }\n\n        static int F2(int[] a, int[] b)\n        {\n            var sumA = SumAgressive(a);\n            var sumB = SumAgressive(b);\n\n            return Math.Max(sumA, sumB);\n        }\n\n        static int F3(int[] a, int[] b)\n        {\n            var sumA = SumNo(a);\n            var sumB = SumNo(b);\n\n            return Math.Max(sumA, sumB);\n        }\n\n        static int Sum(int[] a)\n        {\n            var sum = 0;\n            foreach (var x in a)\n            {\n                sum += x;\n            }\n            return sum;\n        }\n\n        // 積極的にインライン化してもらいたい\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        static int SumAgressive(int[] a)\n        {\n            var sum = 0;\n            foreach (var x in a)\n            {\n                sum += x;\n            }\n            return sum;\n        }\n\n        // 全くインライン化させたくない\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static int SumNo(int[] a)\n        {\n            var sum = 0;\n            foreach (var x in a)\n            {\n                sum += x;\n            }\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Namespaces/MyApp.cs",
    "content": "﻿using static System.Console;\nusing A;\n\n// using よりは、直接定義されているものの方が優先 A < C, global\n// エイリアスと型定義は同列 C = global\nusing Lib = C.Lib;\nclass Lib { public static void F() => WriteLine(\"global\"); }\n\nnamespace MyApp\n{\n    using B; // 内側に using を書くと、外より優先 A, C, global < B\n\n    // 同一名前空間内にあるものは1番高い優先度 B < MyApp\n    class Lib { public static void F() => WriteLine(\"MyApp\"); }\n\n    class Program\n    {\n        static void Main()\n        {\n            // Lib は5つある\n            // この場合 MyApp.Lib が使われる\n            // 優先度 高 MyApp > B > global = C > A 低\n            Lib.F();\n\n            // ちゃんと呼び分けたければフルネームで書く\n            A.Lib.F();\n            B.Lib.F();\n            C.Lib.F();\n            MyApp.Lib.F();\n            global::Lib.F();\n        }\n    }\n}\n\nnamespace A\n{\n    class Lib { public static void F() => WriteLine(\"A\"); }\n}\nnamespace B\n{\n    class Lib { public static void F() => WriteLine(\"B\"); }\n}\nnamespace C\n{\n    class Lib { public static void F() => WriteLine(\"C\"); }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Namespaces/Namespaces.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>MyApp.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Namespaces/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Namespaces\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Namespaces/global.cs",
    "content": "﻿using static System.Console;\n\nnamespace X.Y\n{\n    class Program\n    {\n        static void Main()\n        {\n            // 単に Y って書くと、名前空間 X.Y の方の意味になる\n            global::Y.F();\n        }\n    }\n}\n\nclass Y { public static void F() => WriteLine(\"class B\"); }\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Ambiguous.cs",
    "content": "﻿namespace OverloadResolution.Ambiguous\n{\n    using System;\n\n    // インターフェイス実装とユーザー定義の型変換を持つ\n    class A : IDisposable\n    {\n        public void Dispose() { }\n        public static implicit operator int(A x) => 0;\n    }\n\n    class Program\n    {\n        static void M(IDisposable x) => Console.WriteLine(\"IDisposable\");\n        static void M(int x) => Console.WriteLine(\"int\");\n\n        static void Main()\n        {\n            // インターフェイスへの変換と、ユーザー定義の型変換は同列\n            // どちらを呼ぶべきか、このコードでは解決できない\n#if Uncompilable\n            M(new A());\n#endif\n\n            // 明示的にキャストを書けば大丈夫\n            M((IDisposable)new A());\n            M((int)new A());\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Csharp6Lambda.cs",
    "content": "﻿namespace OverloadResolution.Csharp6Lambda\n{\n    using System;\n    using System.Linq.Expressions;\n\n    class Program\n    {\n        static void Main()\n        {\n            // M(() => { }) だと Action か Expression<Action> か区別つかないものの\n            // 匿名メソッド式の場合は式ツリー化できない仕様なので、M(Action) で確定\n            // なのに以前はこれもエラーになってた(C# 6.0 からは M(Action) が呼ばれる)\n            M(delegate () { });\n\n            // 以下のような、多段のラムダ式でちゃんとオーバーロード解決できるのは C# 6.0 から\n            // Func<int, Func<int>> の方\n            M(() => () => 1);\n            // Func<int, Func<double>> の方\n            M(() => () => 1.0);\n        }\n\n        // ラムダ式だと区別できないものの、匿名メソッド式なら Action で確定\n        static void M(Action x) => Console.WriteLine(\"Action\");\n        static void M(Expression<Action> x) => Console.WriteLine(\"Expression\");\n\n        // () => () => 1 みたいな、多段のラムダ式\n        static void M(Func<Func<int>> x) => Console.WriteLine(\"() → () → int\");\n        static void M(Func<Func<double>> x) => Console.WriteLine(\"() → () → int\");\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Csharp73/ColorColor.cs",
    "content": "﻿using System;\n\nstruct Color\n{\n    public byte R;\n    public byte G;\n    public byte B;\n\n    // どちらも M() で呼べるメソッド。\n    public void M(int x = 0) => Console.WriteLine(\"Instance\");\n    public static void M(Color c = default) => Console.WriteLine(\"static\");\n\n    // 参考までに、オーバーロードがない場合。\n    public void Instance() { }\n    public static void Static() { }\n}\n\nclass Program\n{\n    // C# では、型名とプロパティ名が同じプロパティを作れる。\n    static Color Color { get; set; }\n\n    static void Main()\n    {\n        // これは「プロパティのColor」(C# 7.2以前でも行ける)。\n        Color.Instance();\n\n        // これが「型のColor」(C# 7.2以前でも行ける)。\n        Color.Static();\n\n        // これだと、この Color が型名かプロパティかが区別できない。\n        // C# 7.3 でも不明瞭エラー。\n#if Uncompilable\n        Color.M();\n#endif\n\n        // C# 7.3 なら、以下の書き方で呼び分け可能(これまでは不明瞭エラー)。\n        // 「プロパティのColor」。\n        Program.Color.M();\n        // 「型のColor」。\n        global::Color.M();\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Csharp73/DummyOptionalParamter.cs",
    "content": "﻿namespace OverloadResolution.Csharp73.DummyOptionalParamter\n{\n    class Program\n    {\n        // 呼び分け用のダミー型\n        struct Struct { }\n        struct Class { }\n\n        // ダミー引数を足すことでオーバーロードする。\n        static void M<T>(T x, Struct _ = default) where T : struct { }\n        static void M<T>(T x, Class _ = default) where T : class { }\n\n        static void Main()\n        {\n            M(1);     // M(T, Struct) が呼ばれる\n            M(\"abc\"); // M(T, Class) が呼ばれる\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Csharp73/GenericConstraints.cs",
    "content": "﻿namespace OverloadResolution.Csharp73.GenericConstraints\n{\n    using System;\n\n    // オーバーロード用のダミー型\n    struct A { }\n    struct B { }\n\n    // IDisposable, IComparable な型を用意\n    struct Disposable : IDisposable { public void Dispose() { } }\n    struct Comparable : IComparable { public int CompareTo(object? x) => 0; }\n\n    class Program\n    {\n        // M(x) で呼べるメソッドが2つ。\n        // 差は、T の型制約のみ。\n        static void M<T>(T x, A _ = default) where T : IDisposable { }\n        static void M<T>(T x, B _ = default) where T : IComparable { }\n\n        static void Main()\n        {\n            // C# 7.3 からこの呼び出し方ができるように。\n            M(new Disposable());\n            M(new Comparable());\n\n            // この書き方も C# 7.3 から。\n            M(new Disposable(), default); // default は default(A) に推論される\n            M(new Comparable(), default); // default は default(B) に推論される\n\n            // C# 7.2 以前の場合、こう書くのが必須。\n            M(new Disposable(), default(A));\n            M(new Comparable(), default(B));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Csharp73/MethodReturn.cs",
    "content": "﻿namespace OverloadResolution.Csharp73.MethodReturn\n{\n    using System;\n\n    class Program\n    {\n        static void M(Func<int> f) => Console.WriteLine(\"int\");\n        static void M(Func<string> f) => Console.WriteLine(\"string\");\n\n        static int IntReturn() => 0;\n        static string StringReturn() => \"\";\n\n        static void Main()\n        {\n            // ラムダ式賢い。\n            M(() => 0); // int の方\n            M(() => \"abc\"); // string の方\n\n            // こういう書き方なら C# 7.2 まででもできた。\n            M(() => IntReturn());\n            M(() => StringReturn());\n\n            // なのに、以下のような書き方はこれまでできなかった。\n            // C# 7.3 からできるように。\n            M(IntReturn);\n            M(StringReturn);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Csharp73/Refness.cs",
    "content": "﻿namespace OverloadResolution.Csharp73.Refness\n{\n    static class Extensions\n    {\n        // ref の有無の差 + 型制約\n        public static void M<T>(this ref T x) where T : struct { }\n        public static void M<T>(this T x) where T : class { }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            \"abc\".M();\n\n            var x = 123;\n            x.M();\n            // ただ、ref 拡張メソッドの性質上、123.M() とは呼べない(リテラルがダメ)\n            // また、DateTime.Now.M() とかもダメ(プロパティ越しがダメ)\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Csharp73/Static.cs",
    "content": "﻿namespace OverloadResolution.Csharp73.Static\n{\n    using System;\n\n    struct Static { }\n    struct Instance { }\n\n    class Program\n    {\n        // 既定値が入っているのでどちらも M() で呼べる。\n        // 片方は静的メソッドで、もう片方はインスタンス メソッド。\n        static void M(Static x = default) => Console.WriteLine(\"Static\");\n        void M(Instance x = default) => Console.WriteLine(\"Instance\");\n\n        static void Main()\n        {\n            // 型名.M() で呼べるのは静的メソッドだけのはず。\n            // でも、これまでは、M(Static) か M(Instance) かの区別がつかなかった。\n            // C# 7.3 では M(Static) が選ばれるように。\n            Program.M();\n\n            // インスタンス.M() で呼べるのはインスタンス メソッドだけのはず。\n            // 同上。\n            // C# 7.3 では M(Instance) が選ばれるように。\n            new Program().M();\n\n            // Main が静的メソッドなので、何もつけない場合、この M() も静的な方が呼ばれる。\n            M();\n        }\n\n        void InstanceMethod()\n        {\n            // でも、これはダメ。\n            // 静的な方もインスタンスの方も M() で呼べるので不明瞭。\n#if Uncompilable\n            M();\n#endif\n\n            // これなら OK。\n            // this. が付いているのでインスタンス メソッドに絞られる。\n            this.M();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Csharp73/StructClass.cs",
    "content": "﻿namespace OverloadResolution.Csharp73.StructClass\n{\n    using System.Collections.Generic;\n    using System.Linq;\n\n   static class ClassExtensions\n    {\n        // クラスの場合は LINQ の FirstOrDefault そのまま。\n        public static T FirstOrNull<T>(this IEnumerable<T> source)\n            where T : class\n            => source.FirstOrDefault();\n    }\n\n    static class StructExtensions\n    {\n        // 構造体の場合は null 許容型に変える必要がある。\n        public static T? FirstOrNull<T>(this IEnumerable<T> source)\n            where T : struct\n            => source.Select(x => (T?)x).FirstOrDefault();\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // ClassExtensions の方のが呼ばれる。\n            new[] { \"a\", \"b\", \"c\" }.FirstOrNull();\n\n            // StructExtensions の方のが呼ばれる。\n            new[] { 1, 2, 3 }.FirstOrNull();\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Csharp73/UncompilableStatic.cs",
    "content": "﻿namespace OverloadResolution.Csharp73.UncompilableStatic\n{\n    using System;\n\n    struct Static { }\n    struct Instance { }\n\n    class Program\n    {\n        // 同名で、片方は静的メソッドで、もう片方はインスタンス メソッド。\n        static void M(Static x) => Console.WriteLine(\"Static\");\n        void M(Instance x) => Console.WriteLine(\"Instance\");\n\n        static void Main()\n        {\n#if Uncompilable\n            // 型名.M() で呼べるのは静的メソッドだけのはず。\n            // でも、エラー メッセージとしては「M(Instance) を呼ぶにはインスタンスが必要」の類。\n            Program.M(new Instance());\n\n            // インスタンス.M() で呼べるのはインスタンス メソッドだけのはず。\n            // でも、エラー メッセージとしては「M(Static) を呼ぶにはインスタンス越しじゃダメ」の類。\n            new Program().M(new Static());\n\n            // つまり、引数の型でのオーバーロード解決を先にやって、その後、静的/インスタンスの区別を調べてる。\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/ExpressionTree.cs",
    "content": "﻿namespace OverloadResolution.ExpressionTree\n{\n    using System;\n    using System.Linq.Expressions;\n\n    class Program\n    {\n        static void Main()\n        {\n#if Uncompilable\n            M(x => x);\n#endif\n        }\n\n        static void M(Func<int, int> f) => Console.WriteLine(\"Func\");\n        static void M(Expression<Func<int, int>> f) => Console.WriteLine(\"Expression\");\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Extensions.cs",
    "content": "﻿namespace OverloadResolution.Extensions\n{\n    using System;\n\n    class A\n    {\n        public void M() => Console.WriteLine(\"instance\");\n    }\n\n    static class Extensions\n    {\n        public static void M(this A a) => Console.WriteLine(\"extension\");\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // instance の方が呼ばれる\n            new A().M();\n\n            // A 自身が M を持っている以上、↑の書き方で拡張メソッドの方は呼べない\n            // 以下のように、普通に静的メソッドとして呼ぶ必要がある\n            Extensions.M(new A());\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Generic.cs",
    "content": "﻿namespace OverloadResolution.Generic\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            // M(string) の方が呼ばれる\n            M(\"abc\");\n\n            // M<T>(string) の方が呼ばれる\n            M<int>(\"abc\");\n        }\n\n        static void M(string x) => Console.WriteLine(\"M\");\n        static void M<T>(string x) => Console.WriteLine(\"M<T>\");\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Inference.cs",
    "content": "﻿namespace OverloadResolution.Inference\n{\n    using System;\n\n    // 引数が完全に一致しているデリゲート型を2個用意\n    delegate int A(int x);\n    delegate int B(int x);\n\n    class Program\n    {\n        static void Main()\n        {\n            // 2個以上候補があるときに default は使えない\n#if Uncompilable\n            M(default);\n#endif\n\n            // 型推論とはちょっと違うものの、null (型がない。どの型にでも代入可)でも同様\n#if Uncompilable\n            M(null);\n#endif\n\n            // 型指定ありの default なら大丈夫\n            M(default(A));\n\n            // A なのか B なのか区別がつかない\n#if Uncompilable\n            M(x => x);\n#endif\n\n            // キャストがあれば大丈夫\n            // new でも可\n            M((A)(x => x));\n            M(new A(x => x));\n        }\n\n        static void M(A? x) => Console.WriteLine(\"A\");\n        static void M(B? x) => Console.WriteLine(\"B\");\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Lambda.cs",
    "content": "﻿namespace OverloadResolution.Lambda\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            // x の素通し = 引数と戻り値が一致 = Fucn<int, int> の方だけなのでそっちが選ばれる\n            // x の型は int に\n            M(x => x);\n\n            // 明示的に double を返すと Func<int, double> の方が選ばれる\n            // x の型は int に\n            M(x => (double)x);\n\n            // この場合、引数と戻り値が一致してるという条件では int なのか string なのか区別できなくてエラー\n#if false\n            N(x => x);\n#endif\n        }\n\n        static void M(Func<int, int> x) => Console.WriteLine(\"int → int\");\n        static void M(Func<int, double> x) => Console.WriteLine(\"int → double\");\n\n        static void N(Func<int, int> x) => Console.WriteLine(\"int → int\");\n        static void N(Func<string, string> x) => Console.WriteLine(\"int → int\");\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/OptionalParameter.cs",
    "content": "﻿namespace OverloadResolution.OptionalParameter\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            M();\n        }\n\n        // これが最優先\n        static void M() => Console.WriteLine(\"void\");\n\n        // 次がこれ。既定値を与えたもの\n        static void M(int x = 0) => Console.WriteLine(\"int x = 0\");\n\n        // 最後がこれ。params\n        static void M(params int[] x) => Console.WriteLine(\"params int[]\");\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/OverloadResolution.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>OverloadResolution.Paremeter.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/Paremeter.cs",
    "content": "﻿namespace OverloadResolution.Paremeter\n{\n    using System;\n\n    // A → B → C の型階層\n    // IDisposable インターフェイスを実装\n    // C には int への暗黙的型変換あり\n    class A : IDisposable { public void Dispose() { } }\n    class B : A, IDisposable { }\n    class C : B, IDisposable\n    {\n        public static implicit operator int(C x) => 0;\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // M のオーバーロードがいくつかある中、C を引数にして呼び出す\n            M(new C());\n        }\n\n        // 上から順に候補になる。\n        // 上の方を消さないと、下の方が呼ばれることはない。\n\n        // 「そのもの」が当然1番一致度高い\n        static void M(C x) => Console.WriteLine(\"C\");\n\n        // 次がジェネリックなやつ。型変換が要らないので一致度が高いという扱い。\n        static void M<T>(T x) => Console.WriteLine(\"generic\");\n\n        // 基底クラスは、階層が近い方が優先。この場合 B が先で、A が後\n        static void M(B x) => Console.WriteLine(\"B\");\n\n        static void M(A x) => Console.WriteLine(\"A\");\n\n        // 次に、インターフェイス、暗黙的型変換が同率。\n        // (構造体の時の ValueType と違って、クラスは明確に基底クラスが上。)\n        // この2つが同時に候補になってると ambiguous エラー\n        static void M(IDisposable x) => Console.WriteLine(\"IDisposable\");\n        static void M(int x) => Console.WriteLine(\"int\");\n\n        // 最後が object。\n        static void M(object x) => Console.WriteLine(\"object\");\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/StringInterpolation.cs",
    "content": "﻿namespace OverloadResolution.StringInterpolation\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            var (a, b) = (1, 2);\n\n            // M(string) の方が呼ばれる\n            M($\"{a}, {b}\");\n\n            // こう書けば M(FormattableString) の方\n            M((FormattableString)$\"{a}, {b}\");\n        }\n\n        static void M(string x) => Console.WriteLine(\"string\");\n        static void M(FormattableString x) => Console.WriteLine(\"FormattableString\");\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution/ValueType.cs",
    "content": "﻿namespace OverloadResolution.ValueTypeConversion\n{\n    using System;\n\n    struct S : IDisposable\n    {\n        public void Dispose() { }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // S は ValueType から派生しているかのように振る舞うものの、これはあくまで ValueType への型変換になる\n            // インターフェイスへの変換と同列なので、以下の呼び出しは不明瞭\n#if Uncompilable\n            M(new S());\n#endif\n        }\n\n        static void M(IDisposable x) => Console.WriteLine(\"IDisposable\");\n        static void M(ValueType x) => Console.WriteLine(\"ValueType\");\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/OverloadResolution/OverloadResolution.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27604.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"OverloadResolution\", \"OverloadResolution\\OverloadResolution.csproj\", \"{4FBD7149-E296-4746-9341-5F75189B1AB4}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{4FBD7149-E296-4746-9341-5F75189B1AB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4FBD7149-E296-4746-9341-5F75189B1AB4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4FBD7149-E296-4746-9341-5F75189B1AB4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4FBD7149-E296-4746-9341-5F75189B1AB4}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {EC796C01-D852-496A-9F3F-546D70CB8988}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Params/NoParam.cs",
    "content": "﻿namespace Params.NoParam\n{\n    using System;\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var x = Sum();\n\n#if false\n            // .NET Framework 4.5 以前はこういう扱い\n            var x = Sum(new int[0]);\n#elif false\n            // .NET Framework 4.6 移行はこういう扱い\n            var x = Sum(Array.Empty<int>());\n#endif\n\n            Console.WriteLine(x); // 0\n        }\n\n        static int Sum(params int[] source)\n        {\n            // 引数なしで呼ばれた場合、source には空配列が入る\n            // source が null にはならない\n            var sum = 0;\n            foreach (var x in source) sum += x;\n            return sum;\n        }\n    }\n}\n\nnamespace Params.NoParam.BrakingChange\n{\n    using System;\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var x = IsCached();\n            Console.WriteLine(x);\n            var y = IsCached();\n            Console.WriteLine(y); // ターゲットによって結果が変わる\n        }\n\n        static int[] prev = null!;\n\n        static bool IsCached(params int[] source)\n        {\n            // .NET 4.5 以前だと、毎回違う配列がnewされて渡ってくる\n            // .NET 4.6 移行だと、毎回同じインスタンスが使いまわされる\n            if (prev == source) return true;\n\n            prev = source;\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Params/Params.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <StartupObject>Params.NoParam.BrakingChange.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/StructuredProgramming/StructuredProgramming.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27110.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Function\", \"Function\\Function.csproj\", \"{6F24F522-37B0-422E-93F2-F9617C253987}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"ExternAlias\", \"ExternAlias\", \"{03A242C1-5AFC-4912-9557-DE0FBBA5E4E2}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ExternAliasConsoleApplication\", \"ExternAliasConsoleApplication\\ExternAliasConsoleApplication.csproj\", \"{134218F9-5B38-4E19-A74D-F05A3F179B53}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"BackportEnumerable\", \"BackportEnumerable\\BackportEnumerable.csproj\", \"{B63BA635-EA21-4D00-B7C1-2104FCDD169D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Exceptions\", \"Exceptions\\Exceptions.csproj\", \"{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Tuples\", \"Tuples\\Tuples.csproj\", \"{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Namespaces\", \"Namespaces\\Namespaces.csproj\", \"{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Params\", \"Params\\Params.csproj\", \"{9ED86973-D986-40DD-9068-627FE33D9F5A}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Expressions\", \"Expressions\\Expressions.csproj\", \"{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Inlining\", \"Inlining\\Inlining.csproj\", \"{7A251010-C168-4BD5-B286-63187BBECA6D}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6F24F522-37B0-422E-93F2-F9617C253987}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AB9184CF-DAE4-4F7A-BF14-7E7140C2DD57}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{33BE0F4E-B7DC-45F1-8386-CC79EAD1E185}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{44CB7746-43BB-47FD-B2B9-D0CD2E15E2AA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9ED86973-D986-40DD-9068-627FE33D9F5A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{99FD4D50-6E34-4C43-9730-DAB97F81ED8B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7A251010-C168-4BD5-B286-63187BBECA6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7A251010-C168-4BD5-B286-63187BBECA6D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7A251010-C168-4BD5-B286-63187BBECA6D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7A251010-C168-4BD5-B286-63187BBECA6D}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{134218F9-5B38-4E19-A74D-F05A3F179B53} = {03A242C1-5AFC-4912-9557-DE0FBBA5E4E2}\n\t\t{B63BA635-EA21-4D00-B7C1-2104FCDD169D} = {03A242C1-5AFC-4912-9557-DE0FBBA5E4E2}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {74AFDCC9-A127-4C8B-AEBD-7487F400B3C9}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Tuples/AnonymousTypes.cs",
    "content": "﻿namespace Tuples.AnonymousTypes\n{\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n\n    /// <summary>\n    /// 性別\n    /// </summary>\n    enum Sex\n    {\n        Male,\n        Female,\n    }\n\n    /// <summary>\n    /// 個人情報\n    /// </summary>\n    class Person\n    {\n        public int Id { get; }\n        public string Name { get; }\n        public string Kana { get; }\n        public Sex Sex { get; }\n        public string PhoneNumber { get; }\n        public DateTime BirthDay { get; }\n\n        public Person(int id, string name, string kana, Sex sex, string phoneNumber, DateTime birthDay)\n        {\n            Id = id;\n            Name = name;\n            Kana = kana;\n            Sex = sex;\n            PhoneNumber = phoneNumber;\n            BirthDay = birthDay;\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var persons = ReadAll(\"personal_infomation.csv\").ToArray();\n\n            // 性別・年代(10年区切り)ごとに何人いるかを集計\n            var histgram = persons\n                .GroupBy(p => new { p.Sex, BirthDecade = p.BirthDay.Year / 10 })\n                .Select(g => new { g.Key.Sex, g.Key.BirthDecade, Count = g.Count() })\n                .OrderBy(x => x.BirthDecade)\n                .ThenBy(x => x.Sex);\n\n            foreach (var item in histgram)\n            {\n                Console.WriteLine(item);\n            }\n        }\n\n        /// <summary>\n        /// CSV から <see cref=\"Person\"/> を読み込み。\n        /// </summary>\n        /// <param name=\"csvFilename\"></param>\n        /// <returns></returns>\n        static IEnumerable<Person> ReadAll(string csvFilename)\n        {\n            foreach (var line in File.ReadLines(csvFilename))\n            {\n                var items = line.Split(',');\n                yield return new Person(\n                    id: int.Parse(items[0]),\n                    name: items[1],\n                    kana: items[2],\n                    sex: items[3] == \"男\" ? Sex.Male : Sex.Female,\n                    phoneNumber: items[4],\n                    birthDay: DateTime.Parse(items[5])\n                    );\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Tuples/Tuples.cs",
    "content": "﻿namespace Tuples\n{\n    using System;\n    using System.Collections.Generic;\n\n    class Program\n    {\n        static (int min, int max, double average) Measure(IEnumerable<int> items)\n        {\n            var count = 0;\n            var sum = 0;\n            var min = int.MaxValue;\n            var max = int.MinValue;\n            foreach (var x in items)\n            {\n                sum += x;\n                count++;\n                min = Math.Min(x, min);\n                max = Math.Max(x, max);\n            }\n\n            return (min, max, (double)sum / count);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Tuples/Tuples.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Tuples/TypeX.cs",
    "content": "﻿namespace Tuples.TypeX\n{\n    using System;\n    using System.Collections.Generic;\n\n    class Program\n    {\n        static X Measure(IEnumerable<int> items)\n        {\n            var count = 0;\n            var sum = 0;\n            var min = int.MaxValue;\n            var max = int.MinValue;\n            foreach (var x in items)\n            {\n                sum += x;\n                count++;\n                min = Math.Min(x, min);\n                max = Math.Max(x, max);\n            }\n\n            return new X(min, max, (double)sum / count);\n        }\n    }\n\n    internal struct X\n    {\n        public int max;\n        public int min;\n        public double v;\n\n        public X(int min, int max, double v)\n        {\n            this.min = min;\n            this.max = max;\n            this.v = v;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/StructuredProgramming/Tuples/personal_infomation.csv",
    "content": "1,奥野茉奈,オクノマナ,女,0288250107,1972/05/18\n2,久保敏行,クボトシユキ,男,086288618,1984/10/13\n3,長瀬由美,ナガセユミ,女,0548252320,1965/09/25\n4,植田良子,ウエダヨシコ,女,0954083389,1977/03/18\n5,安井二郎,ヤスイジロウ,男,0863204485,1976/10/16\n6,太田菜摘,オオタナツミ,女,0294347376,1974/06/15\n7,石橋俊樹,イシバシトシキ,男,0762018962,1965/12/28\n8,池上隆史,イケガミタカシ,男,0982782051,1957/06/23\n9,新垣講一,アラガキコウイチ,男,0742155460,1971/07/30\n10,溝口孝太郎,ミゾグチコウタロウ,男,0774097467,1970/05/07\n11,白川和枝,シラカワカズエ,女,0450325016,1958/01/21\n12,富樫幸雄,トガシサチオ,男,0779296495,1975/06/23\n13,池内誠,イケウチマコト,男,0746015923,1962/12/02\n14,平岡幸彦,ヒラオカユキヒコ,男,0304716414,1989/03/02\n15,吉岡華乃,ヨシオカカノ,女,0146907562,1958/10/19\n16,前島真人,マエジママサト,男,0985588651,1970/10/15\n17,荻原京子,オギワラキョウコ,女,0179945786,1969/08/02\n18,沖茂夫,オキシゲオ,男,0735518951,1985/08/02\n19,中嶋兼吉,ナカジマカネキチ,男,0193384351,1970/07/26\n20,難波葵依,ナンバアオイ,女,0766101983,1976/02/01\n21,栗原広幸,クリハラヒロユキ,男,0179141412,1959/12/31\n22,小寺盛夫,オデラモリオ,男,0193929623,1995/09/11\n23,古屋麻里子,フルヤマリコ,女,0956032458,1962/05/13\n24,植松葉奈,ウエマツハナ,女,0749005166,1994/11/12\n25,田口心音,タグチココネ,女,0824238129,1964/06/30\n26,野口彩華,ノグチアヤカ,女,0655872217,1975/12/03\n27,朝倉隆明,アサクラタカアキ,男,0223394587,1984/01/02\n28,岡里紗,オカリサ,女,0984356375,1984/01/30\n29,高倉咲,タカクラサキ,女,0824207863,1980/03/18\n30,福沢美鈴,フクザワミスズ,女,0595051568,1965/05/19\n31,近藤勝次,コンドウカツジ,男,0774504159,1988/06/19\n32,甲斐由依,カイユイ,女,0297456877,1971/07/13\n33,竹内亜紀子,タケウチアキコ,女,0977637944,1996/07/04\n34,深井琉奈,フカイルナ,女,0853625248,1967/10/04\n35,宮本珠希,ミヤモトタマキ,女,0762092622,1977/12/29\n36,三島靖彦,ミシマヤスヒコ,男,0283777521,1964/09/01\n37,谷口慶太,タニグチケイタ,男,0879517120,1994/06/18\n38,小島文彦,オジマフミヒコ,男,0459454658,1985/04/13\n39,中田響,ナカダヒビキ,女,0985150381,1993/10/12\n40,中島裕信,ナカシマヒロノブ,男,0154901580,1974/04/21\n41,野上英夫,ノガミヒデオ,男,0983931011,1970/05/26\n42,松下優希,マツシタユウキ,女,0857125970,1995/01/09\n43,南部彩奈,ナンブアヤナ,女,0867320210,1987/01/10\n44,工藤愛子,クドウアイコ,女,0585194554,1972/04/22\n45,野中早苗,ノナカサナエ,女,0747871469,1978/10/14\n46,塚原彩加,ツカハラアヤカ,女,098455875,1985/01/19\n47,河村邦仁,カワムラクニヒト,男,0276785030,1972/10/29\n48,五味利恵,ゴミリエ,女,0244664190,1957/11/07\n49,増田薫,マスダカオル,男,0263635175,1994/06/12\n50,中塚三男,ナカツカミツオ,男,0555052163,1987/11/11\n51,影山莉子,カゲヤマリコ,女,0790493168,1956/10/04\n52,堀川忠三,ホリカワチュウゾウ,男,0598326158,1957/11/11\n53,大倉新平,オオクラシンペイ,男,0982398532,1993/10/10\n54,細野珠美,ホソノタマミ,女,0228473611,1993/06/11\n55,進藤芽依,シンドウメイ,女,0853806470,1983/08/10\n56,池谷清茂,イケタニキヨシ,男,0984702928,1965/04/30\n57,勝又小春,カツマタコハル,女,0239318939,1995/10/18\n58,稲田妃菜,イナダヒナ,女,0858540253,1989/02/26\n59,手塚亜衣,テヅカアイ,女,0853775745,1961/05/27\n60,中尾徳男,ナカオトクオ,男,0460651358,1995/05/24\n61,猪俣紳悟,イノマタシンゴ,男,0936066922,1987/08/27\n62,生田隆史,イクタタカシ,男,0287355051,1979/01/08\n63,長沢久男,ナガサワヒサオ,男,0976171379,1957/11/18\n64,金井武裕,カネイタケヒロ,男,0259799314,1988/01/22\n65,片桐広幸,カタギリヒロユキ,男,0765263054,1960/07/15\n66,川合一義,カワイカズヨシ,男,0887289501,1962/09/20\n67,本多三郎,ホンダサブロウ,男,0195585099,1958/10/10\n68,重松花音,シゲマツカノン,女,074034873,1970/01/16\n69,高津桃華,タカツモモカ,女,0600377646,1984/10/15\n70,江口栄伸,エグチヨシノブ,男,0767272528,1968/12/14\n71,村瀬泰佑,ムラセタイスケ,男,0795735548,1958/09/13\n72,西原麻世,ニシハラマヨ,女,0988959211,1979/10/12\n73,永山誓三,ナガヤマセイゾウ,男,0282707696,1994/04/16\n74,内山泰三,ウチヤマタイゾウ,男,0231611422,1977/12/21\n75,小泉正元,コイズミマサヨシ,男,085916258,1959/01/06\n76,河井桃子,カワイモモコ,女,0599627455,1963/05/11\n77,横山邦夫,ヨコヤマクニオ,男,0880109395,1981/08/11\n78,大内美穂,オウウチミホ,女,0527492736,1969/02/05\n79,三村莉那,ミムラリナ,女,0555963675,1975/02/26\n80,寺内貞夫,テラウチサダオ,男,026559779,1982/08/27\n81,北栄一,キタエイイチ,男,0241718632,1983/09/24\n82,浜本浩俊,ハマモトヒロトシ,男,0963657211,1959/04/11\n83,東海林真依,ショウジマイ,女,0749586561,1957/06/10\n84,栗山陽香,クリヤマハルカ,女,0883028152,1968/03/15\n85,平賀泰介,ヒラガタイスケ,男,0882590771,1984/03/12\n86,山村忍,ヤマムラシノブ,男,098384215,1983/07/05\n87,稲田岩生,イナダイワオ,男,024965238,1983/09/14\n88,福田欽也,フクダキンヤ,男,0950552341,1972/10/08\n89,鬼頭優,キトウマサル,男,0238516168,1959/06/12\n90,藤村紗耶,フジムラサヤ,女,0965236524,1994/02/03\n91,高瀬信明,タカセノブアキ,男,024861968,1971/05/03\n92,渡辺功一,ワタナベコウイチ,男,0943562002,1983/02/21\n93,外山正信,ソトヤママサノブ,男,0873251927,1974/11/03\n94,赤坂毅,アカサカタケシ,男,0778323818,1995/05/03\n95,赤塚悦代,アカツカエツヨ,女,0858818595,1976/07/25\n96,船橋長次郎,フナバシチョウジロウ,男,0438297095,1957/08/20\n97,児玉成光,コダマナルミツ,男,0596444006,1960/11/17\n98,海老原公男,エビハラキミオ,男,0462217595,1989/12/12\n99,迫田利男,サコタトシオ,男,0889841914,1985/07/28\n100,織田真緒,オダマオ,女,0767318607,1962/10/27\n101,高岡佳祐,タカオカケイスケ,男,0870346328,1995/09/09\n102,野沢義美,ノザワヨシミ,女,0445887482,1966/10/26\n103,大庭安奈,オオニワアンナ,女,0284160388,1962/06/23\n104,榎本典大,エノモトノリヒロ,男,094228061,1966/01/22\n105,大林幸三郎,オオバヤシコウザブロウ,男,025749918,1991/08/08\n106,増井由希子,マスイユキコ,女,0749584338,1989/07/17\n107,高柳繁夫,タカヤナギシゲオ,男,0183370834,1991/04/26\n108,茂木祐司,モギユウジ,男,0254785018,1959/03/30\n109,長瀬香穂,ナガセカホ,女,054580941,1967/07/30\n110,妹尾敏之,セノオトシユキ,男,0399586819,1991/06/18\n111,藤原敏嗣,フジワラトシツグ,男,0746238194,1968/05/13\n112,露木翼,ツユキツバサ,男,0272358854,1961/10/22\n113,岩沢龍宏,イワサワリュウコウ,男,0740166919,1989/02/12\n114,大熊瑞希,オオクマミズキ,女,0762289892,1960/11/24\n115,吾妻守友,アズマモリトモ,男,0296887374,1969/06/09\n116,吉崎友洋,ヨシザキトモヒロ,男,0858947857,1976/02/18\n117,田沢俊明,タザワトシアキ,男,0531587351,1994/04/17\n118,芦田裕子,アシダヒロコ,女,0234508618,1960/05/23\n119,中塚優華,ナカツカユウカ,女,0824986603,1994/07/06\n120,井手佳那子,イデカナコ,女,0693681851,1975/11/06\n121,狩野璃子,カノウリコ,女,0765825652,1967/05/26\n122,塩沢美怜,シオザワミレイ,女,0986623323,1981/02/04\n123,松原靖彦,マツバラヤスヒコ,男,0934966594,1985/03/15\n124,相良昭二,サガラショウジ,男,0520948915,1965/04/04\n125,北野愛理,キタノアイリ,女,0737660273,1968/10/15\n126,稲田清三,イナダセイゾウ,男,0585665539,1966/06/25\n127,本村駿,モトムラシュン,男,0996124442,1956/11/08\n128,牧洋晶,マキヒロアキ,男,0866527458,1966/10/19\n129,石垣朋香,イシガキトモカ,女,0227469047,1981/03/09\n130,野本穂花,ノモトホノカ,女,0492295079,1975/07/31\n131,秦信太郎,ハタシンタロウ,男,0992903808,1976/11/24\n132,中川淑子,ナカガワトシコ,女,0296263695,1974/10/09\n133,堀井稔,ホリイミノル,男,0883469680,1956/12/08\n134,北川貴美,キタガワキミ,女,0897462887,1994/09/17\n135,楠本美空,クスモトミク,女,0871000290,1975/11/02\n136,岡村勇三,オカムラユウゾウ,男,0152191547,1989/11/25\n137,黒木国彦,クロキクニヒコ,男,0996685018,1977/11/11\n138,柳遥香,ヤナギハルカ,女,0290607564,1957/09/03\n139,吉原亜弥,ヨシワラアヤ,女,0998132444,1956/10/02\n140,玉田美紗,タマダミサ,女,0769340664,1958/07/18\n141,江田孝宏,エダタカヒロ,男,017476317,1995/03/23\n142,末吉暢興,スエヨシノブオキ,男,0880377045,1991/01/24\n143,斎藤高志,サイトウタカシ,男,0867462319,1975/09/16\n144,吉原宏美,ヨシワラヒロミ,女,0983899784,1976/07/12\n145,長谷部立哉,ハセベタツヤ,男,0466945316,1964/04/13\n146,木村節子,キムラセツコ,女,0770897093,1976/03/05\n147,太田千明,オオタチアキ,女,0852813855,1995/11/18\n148,水島由依,ミズシマユイ,女,0774063642,1975/12/29\n149,日下部心音,クサカベココネ,女,083536840,1971/05/08\n150,宮城栄三郎,ミヤギエイザブロウ,男,0277702450,1972/05/12\n151,結城佳那子,ユウキカナコ,女,0725910285,1975/03/30\n152,藤井栄次郎,フジイエイジロウ,男,088659071,1963/01/10\n153,野中清人,ノナカキヨト,男,0964566083,1961/11/07\n154,長野麻友,ナガノマユ,女,0734851978,1963/11/30\n155,平沢忠一,ヒラサワチュウイチ,男,0165150403,1992/07/12\n156,杉野真悠,スギノマユ,女,0558142242,1973/01/26\n157,津村滋,ツムラシゲル,男,0955231099,1992/02/28\n158,中千代,ナカチヨ,女,0555123508,1968/10/28\n159,吉澤茉央,ヨシザワマオ,女,0557463645,1981/06/11\n160,名取治男,ナトリハルオ,男,0748527732,1984/01/03\n161,藤沢栄蔵,フジサワエイゾウ,男,0178665400,1992/08/15\n162,中谷義信,ナカタニヨシノブ,男,0742855474,1988/05/19\n163,冨永道雄,トミナガミチオ,男,0556383271,1979/05/15\n164,大河原俊子,オオガワラトシコ,女,0835390296,1980/06/14\n165,菊池正司,キクチマサシ,男,0301732161,1994/03/07\n166,赤松源治,アカマツゲンジ,男,0955170798,1960/06/12\n167,江川昭彦,エガワアキヒコ,男,0188417460,1967/03/28\n168,飛田欧子,トビタヒロコ,女,0299530184,1956/10/19\n169,奥山利昭,オクヤマトシアキ,男,018659750,1962/05/09\n170,浦野浩重,ウラノヒロシゲ,男,0973420255,1970/08/26\n171,大澤信明,オオサワノブアキ,男,0594178863,1971/11/12\n172,荻原厚,オギワラアツシ,男,096794288,1972/11/08\n173,吉原穂乃佳,ヨシワラホノカ,女,0469983151,1981/12/18\n174,寺島陽花,テラシマハルカ,女,0892360942,1957/04/16\n175,朝倉結,アサクラユイ,女,0957929236,1993/08/20\n176,石川花帆,イシカワカホ,女,074006058,1981/11/14\n177,大久保一憲,オオクボカズノリ,男,087084055,1973/03/26\n178,外山清司,ソトヤマキヨシ,男,0568788272,1967/11/11\n179,藤野太郎,フジノタロウ,男,0769078796,1988/09/02\n180,横溝美晴,ヨコミゾミハル,女,0836297270,1962/08/02\n181,郡司優,グンジマサル,男,0982638136,1961/06/13\n182,金田理桜,カナダリオ,女,0954467328,1981/07/11\n183,植村勝一,ウエムラカツイチ,男,0952639688,1960/08/19\n184,井上愛奈,イノウエアイナ,女,0866291977,1989/09/29\n185,小椋尚志,オグラヒサシ,男,0988600835,1970/06/03\n186,西脇忠雄,ニシワキタダオ,男,0769913048,1960/01/23\n187,曽根美貴子,ソネミキコ,女,0225053022,1981/08/12\n188,橋口貴美,ハシグチキミ,女,0984376476,1960/11/19\n189,長野里咲,ナガノリサ,女,0550956816,1996/01/16\n190,江成紗良,エナリサラ,女,0761339051,1960/11/23\n191,永野治郎,ナガノジロウ,男,0870757167,1987/06/20\n192,李奏,リカナデ,女,0881689076,1995/11/03\n193,向井栄吉,ムカイエイキチ,男,05938304,1996/03/21\n194,桜井利郎,サクライトシロウ,男,077987114,1982/10/27\n195,吉永俊樹,ヨシナガトシキ,男,0963159736,1993/07/14\n196,根本定雄,ネモトサダオ,男,0265249357,1974/07/19\n197,宮脇章二,ミヤワキショウジ,男,0884189276,1957/11/15\n198,栗山宏明,クリヤマヒロアキ,男,0174560604,1990/01/28\n199,岩下圭子,イワシタケイコ,女,0244251572,1980/03/31\n200,大井忠,オオイタダシ,男,0269558689,1972/11/13\n201,田村紗那,タムラサナ,女,0584665528,1965/12/26\n202,今望美,コンノゾミ,女,0443582271,1971/11/28\n203,高見基之,タカミモトユキ,男,0852856486,1966/01/18\n204,新保洋一郎,シンポヨウイチロウ,男,0983239301,1981/05/30\n205,室井博史,ムロイヒロシ,男,0224286731,1988/07/02\n206,藤川正昭,フジカワマサアキ,男,0258893949,1964/12/07\n207,長野優衣,ナガノユイ,女,0962699212,1960/05/04\n208,吉永彩華,ヨシナガアヤカ,女,0578276061,1981/10/15\n209,三井佐知子,ミツイサチコ,女,0974652335,1980/09/09\n210,稲田綾華,イナダアヤカ,女,026782350,1979/04/12\n211,前川俊史,マエカワトシフミ,男,0982845333,1983/04/26\n212,角田進一,カクタシンイチ,男,028776292,1964/09/25\n213,川合杏樹,カワイアンジュ,女,0856409646,1994/07/18\n214,中谷章平,ナカタニショウヘイ,男,0300270910,1964/08/03\n215,宮坂和裕,ミヤサカカズヒロ,男,0748296337,1982/08/02\n216,羽鳥百華,ハトリモモカ,女,0465733206,1964/06/25\n217,阿部美奈代,アベミナヨ,女,0261234805,1981/10/21\n218,北野久美子,キタノクミコ,女,0877335407,1985/11/30\n219,栗本芽衣,クリモトメイ,女,0274029184,1974/03/21\n220,大野仁継,オオノマサツグ,男,0176841284,1964/04/26\n221,芦田千里,アシダチサト,女,0778134034,1958/03/25\n222,黒木夏音,クロキカノン,女,0246938758,1992/07/02\n223,河内直子,カワウチナオコ,女,017814557,1962/03/13\n224,浜野響子,ハマノキョウコ,女,0791359012,1957/09/24\n225,内野花音,ウチノカノン,女,058597911,1980/04/04\n226,森永栄一郎,モリナガエイイチロウ,男,0176878345,1990/06/15\n227,大矢勝利,オオヤカツトシ,男,0959829216,1972/09/11\n228,児玉克美,コダマカツミ,男,0985951243,1981/09/28\n229,横尾義和,ヨコオヨシカズ,男,0779717715,1962/05/18\n230,長嶋知里,ナガシマチサト,女,0192048585,1984/02/25\n231,小池修一,コイケシュウイチ,男,0558033822,1988/07/12\n232,畑中薫,ハタナカカオル,女,0482148460,1986/12/08\n233,白川音々,シラカワネネ,女,0416720712,1968/02/03\n234,佐藤雅人,サトウマサト,男,048739065,1967/08/18\n235,寺本豊樹,テラモトトヨキ,男,0938329564,1995/02/24\n236,大平篤彦,オオヒラアツヒコ,男,0857715258,1995/01/18\n237,平尾雪子,ヒラオユキコ,女,0766427139,1958/05/31\n238,滝田莉緒,タキタリオ,女,0769663269,1972/08/16\n239,丸田真紀,マルタマキ,女,0942925731,1978/04/17\n240,森本愛実,モリモトマナミ,女,0774824120,1981/02/05\n241,米山美姫,コメヤマミキ,女,0988652960,1989/03/15\n242,米山美菜,コメヤマミナ,女,0554542626,1966/05/21\n243,羽鳥義則,ハトリヨシノリ,男,0950924755,1963/09/17\n244,斎藤裕子,サイトウヒロコ,女,0592986509,1965/12/21\n245,滝沢瑞稀,タキザワミズキ,女,0983298402,1977/08/18\n246,浜由香里,ハマユカリ,女,097273380,1987/03/17\n247,柳原敏哉,ヤナギハラトシヤ,男,0529016559,1971/12/22\n248,梅原隆二,ウメハラリュウジ,男,0277606482,1980/04/17\n249,水野善吉,ミズノゼンキチ,男,0272469841,1974/01/08\n250,若山宏寿,ワカヤマヒロトシ,男,0861060023,1970/08/04\n251,浜田果凛,ハマダカリン,女,0761297037,1987/06/13\n252,高橋優月,タカハシユヅキ,女,0798194089,1976/01/13\n253,山崎禎,ヤマザキタダシ,男,0959437764,1965/03/06\n254,河野恒男,カワノツネオ,男,0791932443,1982/12/25\n255,池本実,イケモトミノル,男,0954897275,1981/12/27\n256,福山勉,フクヤマツトム,男,0957869548,1987/01/03\n257,中井厚吉,ナカイコウキチ,男,0267535343,1979/05/31\n258,塚原広司,ツカハラヒロシ,男,0237562424,1972/10/22\n259,斉藤紗季,サイトウサキ,女,0291927971,1972/12/20\n260,小島杏奈,オジマアンナ,女,08681117,1989/03/04\n261,米山知代,コメヤマトモヨ,女,0184907303,1989/08/23\n262,坂井小夏,サカイコナツ,女,0859828909,1991/04/22\n263,千田道夫,センダミチオ,男,0294370869,1971/02/08\n264,堀日出夫,ホリヒデオ,男,0974570720,1969/05/22\n265,武井真優,タケイマユ,女,0247046825,1981/10/21\n266,岡野美桜,オカノミオ,女,0259013652,1970/01/07\n267,花井葵依,ハナイアオイ,女,0778234302,1971/11/08\n268,永山千鶴子,ナガヤマチヅコ,女,054695203,1986/08/03\n269,山形涼香,ヤマガタスズカ,女,0974472833,1976/07/10\n270,長田琴子,ナガタコトコ,女,083677305,1972/09/18\n271,成瀬貞,ナルセサダ,女,0872998657,1979/07/04\n272,安永奈菜,ヤスナガナナ,女,0969742380,1983/01/21\n273,加賀和歌子,カガワカコ,女,0236480942,1962/05/17\n274,影山哲,カゲヤマサトシ,男,0749085306,1979/01/27\n275,広田博久,ヒロタヒロヒサ,男,0858641612,1964/03/05\n276,多田信吉,オオタシンキチ,男,0593768783,1990/11/16\n277,喜多奈美,キタナミ,女,019178277,1988/05/25\n278,江口里香,エグチリカ,女,0987615563,1983/09/04\n279,野崎広司,ノザキヒロシ,男,0781082274,1971/11/05\n280,松浦茜,マツウラアカネ,女,0795521032,1991/04/05\n281,今川若菜,イマガワワカナ,女,0238801845,1974/06/30\n282,塩沢美晴,シオザワミハル,女,0277003282,1988/08/31\n283,阿久津和徳,アクツカズノリ,男,028039793,1972/12/29\n284,亀田恭之,カメダヤスユキ,男,0181877884,1962/09/11\n285,吉沢一,ヨシザワハジメ,男,088087649,1958/07/04\n286,志賀吉彦,シガヨシヒコ,男,0887014518,1986/12/02\n287,秋葉美恵子,アキバミエコ,女,0176810541,1966/10/10\n288,中山由姫,ナカヤマユキ,女,074486021,1961/08/06\n289,保田美恵子,ヤスダミエコ,女,0576212240,1990/04/18\n290,堀越春代,ホリコシハルヨ,女,0880597873,1979/09/23\n291,羽田莉奈,ハタリナ,女,0182694415,1960/11/20\n292,平岡芳雄,ヒラオカヨシオ,男,0977036767,1981/11/12\n293,保田英晴,ヤスダヒデハル,男,0286543539,1963/02/08\n294,市村実,イチムラミノル,男,0244336891,1995/09/20\n295,菅恭子,カンキョウコ,女,0776161601,1970/12/07\n296,片野莉歩,カタノリホ,女,0146647948,1958/04/20\n297,諸星信雄,モロボシノブオ,男,0230646097,1963/03/20\n298,中川早苗,ナカガワサナエ,女,0967507587,1989/03/10\n299,高野香奈子,タカノカナコ,女,0836295636,1979/02/19\n300,浦野真紗子,ウラノマサコ,女,0768690052,1958/11/20\n301,守屋将文,モリヤマサフミ,男,0978267317,1979/05/22\n302,南田辰二,ミナミダタツジ,男,0863757273,1976/07/30\n303,高松幸四郎,タカマツコウシロウ,男,0859308029,1968/01/25\n304,長野一彦,ナガノカズヒコ,男,0533780001,1965/04/18\n305,桑田桃佳,クワタモモカ,女,0886075798,1965/06/24\n306,早川美枝子,ハヤカワミエコ,女,0859295886,1986/01/27\n307,岩下博満,イワシタヒロミツ,男,0797451626,1988/03/06\n308,富沢正吾,トミザワショウゴ,男,0739010172,1977/04/09\n309,岩渕心春,イワブチコハル,女,0894086949,1964/10/23\n310,児玉登美子,コダマトミコ,女,0949705623,1987/01/22\n311,松崎喜代治,マツザキキヨジ,男,024065417,1973/09/09\n312,近藤勇次,コンドウユウジ,男,0186884076,1971/03/08\n313,竹本弘之,タケモトヒロユキ,男,0339572586,1987/06/16\n314,石塚蓮,イシヅカレン,男,0768714905,1975/07/09\n315,大沼順子,オオヌマジュンコ,女,0881789979,1985/09/23\n316,今泉真由子,イマイズミマユコ,女,0174142627,1994/12/16\n317,有賀美涼,アリガミスズ,女,0749480347,1961/09/17\n318,相沢篤,アイザワアツシ,男,07361639,1968/09/24\n319,大平昭,オオヒラアキラ,男,0767481834,1992/03/17\n320,池田佐和,イケダサワ,女,0289186435,1975/06/01\n321,小幡悠菜,オバタユウナ,女,0689485194,1982/07/30\n322,岩谷善一,イワタニゼンイチ,男,0870613167,1995/06/04\n323,小山田志穂,オヤマダシホ,女,0862500009,1976/08/04\n324,森脇長蔵,モリワキチョウゾウ,男,0734970739,1989/07/18\n325,志賀沙也香,シガサヤカ,女,0253584804,1971/08/16\n326,池谷深雪,イケタニミユキ,女,0791408752,1975/07/17\n327,永田文隆,ナガタフミタカ,男,0154995420,1964/11/18\n328,加瀬戸敷,カセトシキ,男,098496620,1960/04/24\n329,大木史織,オオキシオリ,女,0493458375,1990/05/15\n330,松村緑,マツムラミドリ,女,0835212104,1976/06/14\n331,市村重吉,イチムラジュウキチ,男,0894399693,1988/09/06\n332,峰金之助,ミネキンノスケ,男,0639175114,1980/12/01\n333,木原久美,キハラクミ,女,088970190,1985/02/14\n334,井沢裕之,イザワヒロユキ,男,0883778977,1958/12/14\n335,大前亜紀,オオマエアキ,女,0184714060,1966/05/24\n336,丹野宏次,タンノコウジ,男,0984461638,1962/08/07\n337,染谷義行,ソメヤヨシユキ,男,0533973255,1960/11/04\n338,高木勝次,タカギカツジ,男,015206335,1971/12/18\n339,岩瀬守男,イワセモリオ,男,0194818895,1956/11/10\n340,平岡紗希,ヒラオカサキ,女,0887916990,1963/06/18\n341,熊田政利,クマダマサトシ,男,0494004702,1970/05/08\n342,小出琴音,オデコトネ,女,0784317973,1982/10/13\n343,黒崎雛乃,クロザキヒナノ,女,0586743258,1975/12/17\n344,日野亜弥,ヒノアヤ,女,0275687975,1985/01/06\n345,鬼頭棟上,キトウトウジョウ,女,0749402241,1984/03/18\n346,阪本遥奈,サカモトハルナ,女,0865976288,1984/07/09\n347,栗林政子,クリバヤシマサコ,女,0617645207,1985/07/01\n348,武田遼,タケダハルカ,女,0849936029,1965/07/23\n349,浅野美穂子,アサノミホコ,女,0795878259,1996/04/06\n350,石渡野乃花,イシワタリノノカ,女,0921666657,1995/07/16\n351,宮本貞夫,ミヤモトサダオ,男,0465172005,1965/04/24\n352,宇都宮茂行,ウツノミヤシゲユキ,男,0829278065,1990/01/21\n353,高沢弘子,タカザワヒロコ,女,0992606287,1972/04/23\n354,越智正司,オチマサシ,男,0834046216,1956/09/11\n355,久米寧々,クメネネ,女,0175381307,1971/03/26\n356,菊田正一,キクタショウイチ,男,0225570741,1994/02/09\n357,野中毅雄,ノナカタケオ,男,0237502505,1989/01/08\n358,小峰頼子,コミネヨリコ,女,0555568969,1974/01/08\n359,長浜梅吉,ナガハマウメキチ,男,0248661609,1968/11/23\n360,松元憲二,マツモトケンジ,男,058969251,1981/10/21\n361,矢沢春菜,ヤザワハルナ,女,0288610801,1960/03/29\n362,泉静,イズミシズ,女,0784002752,1985/08/29\n363,宮崎葵依,ミヤザキアオイ,女,0673707815,1980/11/26\n364,米倉楓花,ヨネクラフウカ,女,0770159591,1967/08/01\n365,楠沙也香,クスノキサヤカ,女,0970094825,1959/07/22\n366,白川佳代,シラカワカヨ,女,0880101623,1982/05/10\n367,福本千里,フクモトチサト,女,0292257789,1976/12/29\n368,岩井夏子,イワイナツコ,女,0967852994,1963/12/20\n369,安原晴久,ヤスハラハルヒサ,男,0269815072,1962/08/12\n370,板橋綾音,イタバシアヤネ,女,0244539729,1965/12/23\n371,北山麻衣,キタヤママイ,女,0373315517,1975/10/27\n372,齋藤喜八郎,サイトウキハチロウ,男,019542849,1964/10/22\n373,篠原喜一郎,シノハラキイチロウ,男,0849331034,1971/03/16\n374,土田義光,ツチダヨシミツ,男,0183250383,1975/08/05\n375,川崎花鈴,カワサキカリン,女,095579090,1987/09/08\n376,笹原貢,ササハラミツグ,男,0893049539,1982/11/25\n377,永井正孝,ナガイマサタカ,男,0468181222,1977/03/11\n378,市川俊史,イチカワトシフミ,男,0769338382,1987/09/22\n379,村山友吉,ムラヤマトモヨシ,男,0189536023,1980/03/25\n380,岩谷芽依,イワタニメイ,女,0566871141,1993/08/07\n381,杉山理緒,スギヤマリオ,女,0455058317,1983/09/11\n382,堀口颯,ホリグチソウ,男,0233439906,1961/11/27\n383,川嶋雅美,カワシママサミ,女,0776496027,1989/04/15\n384,小沢靖,オザワヤスシ,男,0827709255,1990/10/12\n385,北川修子,キタガワシュウコ,女,0256481621,1986/03/12\n386,佐伯光夫,サエキミツオ,男,0335443264,1984/02/06\n387,野村孝雄,ノムラタカオ,男,087697019,1974/12/20\n388,吉永幸一,ヨシナガコウイチ,男,0263751513,1977/02/20\n389,赤木倫子,アカギミチコ,女,0843348172,1986/10/13\n390,李昭吉,リショウキチ,男,0290466531,1990/05/07\n391,金沢咲月,カナザワサツキ,女,0186647011,1966/09/14\n392,梅原昭治,ウメハラショウジ,男,0698590053,1993/02/21\n393,小畑朝子,オバタトモコ,女,0928021028,1960/03/19\n394,露木輝夫,ツユキテルオ,男,0580826143,1967/05/05\n395,大山昌男,オオヤママサオ,男,0550955772,1995/02/19\n396,水島沙耶香,ミズシマサヤカ,女,0985362440,1990/01/08\n397,北野佳典,キタノヨシノリ,男,0261971939,1989/08/17\n398,吉崎幹夫,ヨシザキミキオ,男,0736093181,1971/04/19\n399,山村恵子,ヤマムラケイコ,女,0591931697,1996/04/29\n400,中沢雅春,ナカザワマサハル,男,0974355462,1979/09/07\n401,竹下勝一,タケシタカツイチ,男,0834023110,1960/10/06\n402,小野麻美,オノアサミ,女,0747002414,1979/01/31\n403,平沢泰佑,ヒラサワタイスケ,男,0858190630,1986/02/07\n404,真野伊吹,マノイブキ,女,0447195609,1976/10/02\n405,塚原大地,ツカハラダイチ,男,0744481697,1974/12/26\n406,滝本正次郎,タキモトショウジロウ,男,0761632426,1995/08/24\n407,石塚優起,イシヅカユウキ,男,0735720615,1967/10/04\n408,岡部義行,オカベヨシユキ,男,0783700924,1972/01/20\n409,佐伯雅之,サエキマサユキ,男,0749244503,1958/01/18\n410,田川志歩,タガワシホ,女,0429290897,1958/09/28\n411,森川文音,モリカワアヤネ,女,0929157625,1985/04/17\n412,黒崎正平,クロザキショウヘイ,男,0328262307,1958/06/25\n413,荒川美南,アラカワミナミ,女,0722310209,1958/02/09\n414,長井俊昭,ナガイトシアキ,男,0758804968,1976/09/25\n415,川村宏行,カワムラヒロユキ,男,0557144483,1963/10/30\n416,井上剛,イノウエタケシ,男,075286193,1964/10/28\n417,大山達行,オオヤマタツユキ,男,0247084465,1985/09/09\n418,渡邊由太郎,ワタナベヨシタロウ,男,0145950978,1974/11/22\n419,大貫栄三,オオヌキエイゾウ,男,0765160639,1994/03/10\n420,奥夏音,オクカノン,女,0153468828,1987/07/14\n421,本多厚吉,ホンダコウキチ,男,0748734942,1983/04/22\n422,末永俊昭,スエナガトシアキ,男,0872485141,1995/06/19\n423,北島竜雄,キタジマタツオ,男,0886353258,1986/04/07\n424,相川愛奈,アイカワアイナ,女,0954657328,1964/11/28\n425,菅井正春,スガイマサハル,男,0223052048,1963/10/15\n426,新倉泰,ニイクラヤスシ,男,0766244208,1967/06/15\n427,坂彩芽,バンアヤメ,女,0442775541,1991/10/17\n428,北尾徳美,キタオトクミ,女,0241637912,1971/06/18\n429,梅津桃歌,ウメヅモモカ,女,0266783374,1972/03/17\n430,小村英実,コムラヒデミ,男,0599536833,1985/06/07\n431,福田宙子,フクダヒロコ,女,0781231660,1964/09/23\n432,大原雛子,オオハラヒナコ,女,0891183602,1972/05/22\n433,雨宮勝美,アメミヤカツミ,男,0859990066,1967/10/26\n434,志村小枝子,シムラサエコ,女,0858731983,1968/06/28\n435,青柳美鈴,アオヤギミスズ,女,0984828752,1991/12/04\n436,松井啓三,マツイケイゾウ,男,054508852,1959/03/31\n437,日下舞香,クサカマイカ,女,0967908792,1971/05/10\n438,並木重治,ナミキシゲハル,男,0763304304,1968/05/27\n439,嶋田昭子,シマダアキコ,女,0640157349,1982/01/22\n440,松原広昭,マツバラヒロアキ,男,0590624163,1992/10/05\n441,杉山佳歩,スギヤマカホ,女,0999264524,1963/07/24\n442,塚越紀夫,ツカゴシノリオ,男,0561618635,1966/12/20\n443,岩瀬淳三,イワセジュンゾウ,男,0594946808,1973/12/23\n444,西口碧衣,ニシグチアオイ,女,0888254238,1978/04/13\n445,片山敬,カタヤマタカシ,男,0957635819,1963/02/11\n446,滝川泉,タキガワイズミ,女,0796142371,1965/07/19\n447,小野寺理恵子,オノデラリエコ,女,0893780693,1990/04/14\n448,雨宮雅彦,アメミヤマサヒコ,男,0378556538,1989/07/26\n449,木下嘉男,キノシタヨシオ,男,0765060575,1971/08/25\n450,村岡省三,ムラオカショウゾウ,男,0998639807,1979/10/31\n451,海野愛海,ウミノマナミ,女,0922176838,1981/05/16\n452,福地愛結,フクチアユ,女,088735158,1982/09/27\n453,末吉麗華,スエヨシレイカ,女,0770422765,1972/10/13\n454,寺沢忠吉,テラサワチュウキチ,男,077612096,1983/02/04\n455,並木沙紀,ナミキサキ,女,014474873,1960/08/27\n456,田川昌之,タガワマサユキ,男,0859627785,1957/01/20\n457,横井一夫,ヨコイカズオ,男,0225718251,1993/07/25\n458,山口慶一,ヤマグチケイイチ,男,0173912874,1958/11/06\n459,野原信夫,ノハラノブオ,男,0457947165,1983/09/04\n460,近藤柚希,コンドウユズキ,女,0112333481,1977/11/29\n461,渥美正俊,アツミマサトシ,男,0198244975,1982/05/16\n462,大倉貴美,オオクラキミ,女,0760025839,1971/04/14\n463,増山文音,マスヤマアヤネ,女,0987002631,1978/03/28\n464,野田咲来,ノダサクラ,女,0153189714,1969/12/10\n465,青山梨子,アオヤマリコ,女,0957134274,1978/10/31\n466,沢田文隆,サワダフミタカ,男,0832175611,1959/12/02\n467,宇佐美一二三,ウサミヒフミ,女,0884280041,1977/12/28\n468,横溝祐一郎,ヨコミゾユウイチロウ,男,0889682961,1974/12/06\n469,安井真悠,ヤスイマユ,女,0929797663,1992/05/12\n470,石岡彩,イシオカアヤ,女,0747472902,1966/07/24\n471,栗原利郎,クリハラトシロウ,男,0247255965,1977/08/16\n472,笠井瑞姫,カサイミズキ,女,0223793500,1983/02/02\n473,岩崎博信,イワサキヒロノブ,男,0971154901,1986/07/09\n474,神戸金一,コウベキンイチ,男,0730507397,1977/07/08\n475,平耕筰,タイラコウサク,男,086502713,1993/02/21\n476,小田政吉,オダマサキチ,男,0248345537,1983/11/29\n477,秋葉雅子,アキバマサコ,女,027204809,1962/02/21\n478,安斎心咲,アンザイミサキ,女,0182945079,1996/01/19\n479,宮崎彩那,ミヤザキアヤナ,女,0983484720,1994/10/16\n480,恩田杏,オンダアン,女,0277870587,1965/03/02\n481,菊池一花,キクチイチカ,女,0469418293,1973/04/24\n482,斉藤悦夫,サイトウエツオ,男,0892715872,1965/08/27\n483,細谷邦子,ホソヤクニコ,女,0586551359,1967/09/11\n484,布施美羽,フセミウ,女,0876115813,1984/03/02\n485,藤田希,フジタノゾミ,女,0749506073,1963/05/29\n486,保坂愛奈,ホサカアイナ,女,0276744975,1976/10/15\n487,北原重義,キタハラシゲヨシ,男,077455286,1969/12/22\n488,大淵創,オオブチハジメ,男,0349417436,1977/09/28\n489,富永昌之,トミナガマサユキ,男,0152001875,1987/06/29\n490,新井俊男,アライトシオ,男,0235092517,1986/02/16\n491,西沢菊男,ニシザワキクオ,男,0187450768,1985/08/24\n492,杉村松男,スギムラマツオ,男,0763753974,1971/06/10\n493,江原美優,エバラミユウ,女,0297215236,1978/06/13\n494,大木健,オオキケン,男,0652565413,1976/01/30\n495,松島完治,マツシマカンジ,男,0768674177,1984/06/22\n496,曽根健吉,ソネケンキチ,男,0986313572,1958/09/08\n497,田畑恒敏,タバタツネトシ,男,0268177077,1965/07/01\n498,石本洋次,イシモトヨウジ,男,0156213758,1987/03/12\n499,武井丈人,タケイタケト,男,0464118463,1989/06/20\n500,広田郁夫,ヒロタイクオ,男,0428127022,1983/02/06\n501,長谷川勝利,ハセガワカツトシ,男,0954540958,1976/05/15\n502,西凛子,ニシリンコ,女,0573731010,1978/01/06\n503,高見高志,タカミタカシ,男,0820721372,1983/02/25\n504,大石莉菜,オオイシリナ,女,0366078591,1987/04/24\n505,野島真樹,ノジママキ,女,0992917932,1991/05/15\n506,益子義孝,マスコヨシタカ,男,0233008862,1985/02/09\n507,後藤小梅,ゴトウコウメ,女,08749349,1973/01/27\n508,大高豊治,オオダカトヨジ,男,0898186719,1986/01/19\n509,須賀梨央,スガリオ,女,0857361102,1970/09/14\n510,仲野慎一郎,ナカノシンイチロウ,男,0859781075,1992/03/20\n511,安川綾菜,ヤスカワアヤナ,女,0763480388,1970/09/17\n512,富樫信玄,トガシシンゲン,男,0871557347,1972/01/03\n513,片山徳子,カタヤマノリコ,女,0440498041,1995/01/13\n514,大矢信之,オオヤノブユキ,男,0744086042,1968/11/16\n515,米沢咲子,ヨネザワサキコ,女,0299472875,1985/03/11\n516,有田華乃,アリタカノ,女,0920699409,1962/08/07\n517,久保豊子,クボトヨコ,女,0254861233,1971/10/01\n518,宇都宮茉奈,ウツノミヤマナ,女,0972296583,1968/09/23\n519,平野健司,ヒラノケンジ,男,0225542749,1977/05/30\n520,泉佳那子,イズミカナコ,女,097999361,1989/05/21\n521,河原穂乃香,カワハラホノカ,女,0740058967,1957/08/17\n522,堀江圭二,ホリエケイジ,男,0876140878,1986/08/17\n523,川口昭吾,カワグチショウゴ,男,0385353963,1967/10/06\n524,徳永梨子,トクナガリコ,女,0554497009,1986/12/24\n525,浅井善次,アサイヨシツグ,男,0243420487,1973/02/20\n526,水野勝義,ミズノカツヨシ,男,0485082001,1983/07/17\n527,西脇祐一郎,ニシワキユウイチロウ,男,0293702056,1980/05/28\n528,須賀政吉,スガマサキチ,男,0183761400,1988/01/22\n529,横田雅樹,ヨコタマサキ,男,0929579977,1984/09/06\n530,梅沢優羽,ウメザワユウ,女,0856795442,1994/11/22\n531,水田日菜乃,ミズタヒナノ,女,0170049357,1979/04/17\n532,稲垣賢,イナガキケン,男,095636243,1987/09/22\n533,中原冨士子,ナカハラフジコ,女,0855604112,1964/12/03\n534,岡和歌子,オカワカコ,女,0889933743,1960/02/20\n535,小原淳子,オハラジュンコ,女,0555002159,1970/03/31\n536,新井由紀江,アライユキエ,女,0585820691,1971/08/19\n537,野崎弥生,ノザキヤヨイ,女,0964359625,1974/10/08\n538,水上真理子,ミズカミマリコ,女,0438807051,1962/12/28\n539,藤原広明,フジワラヒロアキ,男,0289696902,1981/08/05\n540,脇田賢明,ワキタタテアキ,男,0582604907,1981/08/31\n541,細井十郎,ホソイジュウロウ,男,0746906559,1974/03/21\n542,村田颯,ムラタソウ,男,0996752638,1971/03/22\n543,磯崎理沙,イソザキリサ,女,0894429567,1963/10/03\n544,入江藤雄,イリエフジオ,男,0880850182,1995/03/18\n545,金丸理香,カナマルリカ,女,046667457,1986/05/05\n546,平野美空,ヒラノミク,女,0260916558,1988/01/17\n547,福田璃奈,フクダリナ,女,073682037,1996/03/02\n548,梅村正利,ウメムラマサトシ,男,0740755480,1959/08/30\n549,寺岡胡春,テラオカコハル,女,0872629020,1968/03/01\n550,河内智博,カワウチトモヒロ,男,0289548806,1976/02/05\n551,嶋田麻由,シマダマユ,女,0959735623,1986/12/25\n552,神崎凪,カンザキナギ,女,0872788841,1982/04/25\n553,寺沢祥治,テラサワショウジ,男,0599098890,1993/10/24\n554,長友隆吾,ナガトモリュウゴ,男,095239701,1976/01/18\n555,飯塚信次,イイヅカシンジ,男,026196691,1994/10/05\n556,井上綾奈,イノウエアヤナ,女,0732479062,1993/06/10\n557,津田真美,ツダマミ,女,0772121498,1963/09/01\n558,細井優那,ホソイユウナ,女,0191398599,1965/02/12\n559,井本完治,イモトカンジ,男,0582450353,1993/01/14\n560,吉田絵里,ヨシダエリ,女,011395847,1985/10/01\n561,春日美奈代,カスガミナヨ,女,0242247621,1995/01/26\n562,大森志保,オオモリシホ,女,0931065078,1995/03/10\n563,高嶋講一,タカシマコウイチ,男,0875022377,1956/11/29\n564,須藤有正,スドウアリマサ,男,042881885,1964/03/30\n565,吉村美恵子,ヨシムラミエコ,女,0281855801,1968/07/06\n566,中里史郎,ナカザトシロウ,男,0176877259,1992/03/08\n567,山崎文隆,ヤマザキフミタカ,男,052765801,1985/02/19\n568,武内玲子,タケウチレイコ,女,0878024006,1974/05/02\n569,木本拓海,キモトタクミ,男,0983129104,1978/07/08\n570,畑中英世,ハタナカヒデヨ,男,0932307746,1993/12/24\n571,徳永雄大,トクナガユダイ,男,0834378395,1985/07/23\n572,野上俊史,ノガミトシフミ,男,0554786241,1969/06/22\n573,池谷亜矢,イケタニアヤ,女,0856371508,1963/05/24\n574,榊原颯太,サカキバラソウタ,男,0797642198,1970/07/05\n575,服部和義,ハットリカズヨシ,男,0867826388,1972/11/03\n576,松崎鉄太郎,マツザキテツタロウ,男,0771126122,1969/05/28\n577,細田正則,ホソダマサノリ,男,0820204523,1988/10/29\n578,富樫道子,トガシミチコ,女,0595211017,1959/09/09\n579,大島和幸,オオシマカズユキ,男,0858905322,1978/01/19\n580,秋田節夫,アキタセツオ,男,0980412784,1981/06/27\n581,寺田光昭,テラダミツアキ,男,0556031008,1989/06/26\n582,滝川薫,タキガワカオル,女,0893090517,1993/10/26\n583,塩谷千裕,シオタニチヒロ,女,0896650510,1957/11/15\n584,根岸静,ネギシシズ,女,0669600349,1959/12/03\n585,唐沢保,カラサワタモツ,男,0961236194,1980/08/23\n586,北藤子,キタフジコ,女,0257413006,1975/09/23\n587,神田優子,カンダユウコ,女,086691025,1981/02/16\n588,竹本一博,タケモトカズヒロ,男,0575797621,1965/02/13\n589,横溝胡桃,ヨコミゾクルミ,女,0176644763,1987/03/07\n590,大倉柚香,オオクラユズカ,女,0145465972,1989/04/16\n591,高見広志,タカミヒロシ,男,0463994284,1983/08/29\n592,深田希実,フカダノゾミ,女,0776062409,1991/07/22\n593,村山満雄,ムラヤマミツオ,男,078698860,1984/01/10\n594,大矢文彦,オオヤフミヒコ,男,076564338,1979/11/12\n595,石丸徳雄,イシマルトクオ,男,0595635515,1968/02/25\n596,土井浩重,ドイヒロシゲ,男,0177876171,1968/07/12\n597,日下部亨治,クサカベミチハル,男,086512651,1989/05/20\n598,岩本芽衣,イワモトメイ,女,0269519346,1983/02/22\n599,野島昌信,ノジママサノブ,男,0888297469,1961/05/07\n600,赤松早苗,アカマツサナエ,女,0270658158,1965/07/21\n601,浜崎敬,ハマザキタカシ,男,0867497376,1995/01/07\n602,青木政志,アオキマサシ,男,0547473921,1980/08/10\n603,大関舞,オオゼキマイ,女,074836890,1994/09/29\n604,川島沙也佳,カワシマサヤカ,女,0761553110,1962/09/04\n605,宮本幹雄,ミヤモトミキオ,男,0823593997,1982/08/02\n606,影山康治,カゲヤマコウジ,男,0585277604,1972/11/19\n607,大沼彩那,オオヌマアヤナ,女,0767019878,1992/09/11\n608,鶴岡美結,ツルオカミユ,女,043895262,1985/02/04\n609,花井和歌子,ハナイワカコ,女,0986999417,1976/06/04\n610,瀬川孝司,セガワタカシ,男,0885542299,1984/12/30\n611,松本楓香,マツモトフウカ,女,0736613207,1971/03/17\n612,吉田年子,ヨシダトシコ,女,074288661,1963/06/06\n613,影山伸夫,カゲヤマノブオ,男,0192122806,1982/09/16\n614,青柳喜一郎,アオヤギキイチロウ,男,0576595999,1992/11/24\n615,三原安子,ミハラヤスコ,女,0736067972,1960/04/11\n616,新保眞子,シンポマコ,女,0966426940,1990/06/26\n617,西沢佳織,ニシザワカオリ,女,0236629792,1958/08/09\n618,高橋幸市,タカハシコウイチ,男,0991876922,1975/06/29\n619,豊田里菜,トヨダリナ,女,0303900410,1983/07/15\n620,望月穂香,モチヅキホノカ,女,0178015818,1983/03/24\n621,篠崎紗矢,シノザキサヤ,女,0897756280,1984/10/09\n622,江口三雄,エグチミツオ,男,0767303373,1958/06/03\n623,鹿野里菜,カノリナ,女,0469989040,1992/09/11\n624,吉田祐希,ヨシダユウキ,女,0790792341,1976/07/10\n625,平尾若奈,ヒラオワカナ,女,0856101386,1989/07/18\n626,長友珠美,ナガトモタマミ,女,0444312764,1956/10/27\n627,日野美波,ヒノミナミ,女,0854910126,1981/06/14\n628,神谷真歩,カミヤマホ,女,0778169291,1995/08/11\n629,加藤円香,カトウマドカ,女,0533142970,1993/05/15\n630,菅野照男,スガノテルオ,男,0871130217,1969/05/27\n631,鳥居陽保,トリイハルヤス,男,0986083034,1957/03/25\n632,丹野和仁,タンノカズヒト,男,0358671377,1967/03/28\n633,小杉一美,コスギカズミ,女,0242532878,1963/01/18\n634,仲田峰雄,ナカダミネオ,男,0832997266,1981/08/09\n635,岡島邦雄,オカジマクニオ,男,0889462018,1984/10/17\n636,岸圭子,キシケイコ,女,0955041679,1996/01/14\n637,川村雅俊,カワムラマサトシ,男,0272871552,1971/05/12\n638,波多野華凛,ハタノカリン,女,0987913821,1975/11/16\n639,藤田果凛,フジタカリン,女,076941951,1974/01/05\n640,江成国雄,エナリクニオ,男,0179703295,1980/03/14\n641,大原咲良,オオハラサラ,女,0226203011,1960/10/11\n642,花岡正次郎,ハナオカショウジロウ,男,0853989862,1990/01/03\n643,島崎澄江,シマザキスミエ,女,0630084326,1982/01/31\n644,浦野愛良,ウラノアイラ,女,0591059987,1989/01/12\n645,織田隆明,オダタカアキ,男,0736330388,1956/12/22\n646,長谷詩織,ナガヤシオリ,女,0738031988,1957/07/01\n647,金井政雄,カネイマサオ,男,0278327260,1985/12/03\n648,鮫島沙奈,サメジマサナ,女,0551103993,1959/11/22\n649,小柳和人,コヤナギカズト,男,0765239006,1993/04/02\n650,香坂幹雄,コウサカミキオ,男,0973967780,1983/02/01\n651,伊藤常明,イトウツネアキ,男,0455702015,1972/12/12\n652,原広治,ハラヒロジ,男,0599795095,1964/02/14\n653,大淵孝行,オオブチタカユキ,男,0454591319,1967/12/12\n654,大井好,オオイヨシ,女,0180622629,1991/08/29\n655,土肥公一,ドイコウイチ,男,094248223,1985/02/17\n656,滋賀幸司,シガコウジ,男,0854156629,1973/09/19\n657,宍戸金作,シシドキンサク,男,0954714108,1990/04/12\n658,武田奈津美,タケダナツミ,女,0188754441,1983/12/18\n659,古山富夫,フルヤマトミオ,男,0531169144,1967/05/17\n660,西田清蔵,ニシダセイゾウ,男,0858570371,1969/06/11\n661,目黒誠之,メグロマサユキ,男,0620434399,1966/10/17\n662,高岡琴音,タカオカコトネ,女,099268098,1989/03/11\n663,吉沢重行,ヨシザワシゲユキ,男,0288673670,1973/03/23\n664,谷川正明,タニガワマサアキ,男,0352582795,1992/03/09\n665,上村和義,ウエムラカズヨシ,男,0967697276,1970/07/20\n666,長崎葉奈,ナガサキハナ,女,0276540707,1984/05/11\n667,上原政治,ウエハラマサジ,男,0223673851,1988/07/03\n668,堀瑞穂,ホリミズホ,女,0224573608,1963/03/06\n669,牧沙良,マキサラ,女,0736223461,1982/06/18\n670,小柳真帆,コヤナギマホ,女,0288903997,1991/11/13\n671,若山浩志,ワカヤマコウジ,男,0863862898,1987/10/14\n672,有馬穂乃花,アリマホノカ,女,0761851093,1975/10/15\n673,宍戸利平,シシドリヘイ,男,0862216251,1980/11/28\n674,南田美穂子,ミナミダミホコ,女,0350401324,1957/07/30\n675,西山陽菜,ニシヤマハルナ,女,024452962,1959/12/18\n676,橘俊博,タチバナトシヒロ,男,0226692413,1975/06/22\n677,坪田宏之,ツボタヒロユキ,男,019757070,1973/03/31\n678,二宮顕子,ニノミヤアキコ,女,0280890299,1977/02/25\n679,田沢一路,タザワカズミチ,男,0271816034,1968/05/28\n680,風間光信,カザマミツノブ,男,0413534408,1969/01/04\n681,依田良昭,イダヨシアキ,男,0957518422,1979/08/04\n682,黒沢紗希,クロサワサキ,女,0770460675,1979/12/09\n683,川井若奈,カワイワカナ,女,0400254556,1977/01/20\n684,伊沢賢次,イザワケンジ,男,0971665688,1989/11/02\n685,玉田加奈子,タマダカナコ,女,0597629454,1975/01/25\n686,佐久間和代,サクマカズヨ,女,0266606610,1995/11/26\n687,飯野丈夫,イイノタケオ,男,0974842495,1962/12/29\n688,橋爪明憲,ハシヅメアキノリ,男,0439867022,1984/07/28\n689,津田豊明,ツダトヨアキ,男,0862621029,1976/06/25\n690,小谷辰二,コタニタツジ,男,0298272837,1978/03/17\n691,城戸直道,キドタダミチ,男,0926572755,1973/12/03\n692,寺島清三郎,テラシマセイザブロウ,男,0461839007,1959/02/11\n693,斉藤七郎,サイトウシチロウ,男,0249216760,1971/04/26\n694,吉澤真幸,ヨシザワマサキ,男,0223530076,1987/08/11\n695,相沢彩希,アイザワサキ,女,0870087019,1966/10/11\n696,樋口義光,ヒグチヨシミツ,男,0198602763,1992/05/03\n697,滝本政弘,タキモトマサヒロ,男,0190545948,1969/07/31\n698,舟木伊織,フナキイオリ,女,0855639710,1961/02/18\n699,森川好夫,モリカワヨシオ,男,0789673893,1990/08/24\n700,坂虎雄,バントラオ,男,0831958238,1996/03/03\n701,矢沢優里,ヤザワユリ,女,053607437,1976/01/09\n702,坂井棟上,サカイトウジョウ,女,0188905583,1965/06/14\n703,池田清吉,イケダセイキチ,男,0943146334,1957/07/23\n704,今川由佳,イマガワユカ,女,0468432345,1979/07/05\n705,若松雄也,ワカマツユウヤ,男,0183303780,1995/01/16\n706,山岡初音,ヤマオカハツネ,女,0865528707,1970/05/18\n707,武井早紀,タケイサキ,女,015407953,1977/03/30\n708,平野勝利,ヒラノカツトシ,男,029400541,1992/10/09\n709,荒木和秀,アラキカズヒデ,男,0766510829,1994/08/27\n710,佐川絢香,サガワアヤカ,女,0274039859,1979/10/02\n711,岡田春美,オカダハルミ,女,026125823,1992/05/01\n712,柳原俊博,ヤナギハラトシヒロ,男,0367559223,1983/01/15\n713,榊原宏,サカキバラヒロシ,男,0765667044,1962/12/26\n714,草野真紀子,クサノマキコ,女,0766162048,1956/12/23\n715,八木巌,ヤギイワオ,男,0494326567,1961/12/25\n716,細井清香,ホソイサヤカ,女,0972031026,1985/06/01\n717,宮下雅敏,ミヤシタマサトシ,男,0254619281,1960/04/11\n718,沢井幸真,サワイユキマサ,男,0985114834,1963/12/13\n719,玉田洋一,タマダヨウイチ,男,0779271504,1984/01/06\n720,安部雅保,アベマサヤス,男,092700912,1961/03/10\n721,寺岡美怜,テラオカミレイ,女,0952611408,1970/02/10\n722,杉原美樹,スギハラミキ,女,0790708968,1996/04/14\n723,稲垣麻耶,イナガキマヤ,女,0742932225,1968/11/15\n724,萩原三郎,ハギワラサブロウ,男,0318317507,1983/12/10\n725,香坂理恵子,コウサカリエコ,女,0987666795,1956/11/06\n726,脇田天音,ワキタアマネ,女,0544540039,1989/08/05\n727,小嶋長次郎,オジマチョウジロウ,男,0824541053,1981/05/21\n728,坂元実希子,サカモトミキコ,女,023364187,1965/02/09\n729,長尾幸次郎,ナガオコウジロウ,男,0984668295,1959/06/26\n730,池上茉奈,イケガミマナ,女,0171376145,1974/01/21\n731,小西幸真,コニシユキマサ,男,085907822,1981/03/30\n732,野沢尚生,ノザワヒサオ,男,0163548407,1995/09/29\n733,笠原百花,カサハラモモカ,女,0584975098,1972/05/14\n734,百瀬綾奈,モモセアヤナ,女,0844666757,1980/05/25\n735,日比野弘之,ヒビノヒロユキ,男,0173531047,1983/04/20\n736,森脇美由紀,モリワキミユキ,女,0763234805,1995/02/27\n737,江原完治,エバラカンジ,男,0445642872,1975/02/13\n738,山崎直行,ヤマザキナオユキ,男,0974563126,1964/09/03\n739,神田博,カンダヒロシ,男,0789362618,1994/03/06\n740,市原裕仁,イチハラヒロヒト,男,0857119165,1979/01/12\n741,三好英紀,ミヨシヒデノリ,男,0773705381,1971/06/15\n742,森川大輔,モリカワダイスケ,男,0455922968,1989/07/13\n743,小畑泰,オバタヤスシ,男,0266114865,1991/12/16\n744,藤村莉央,フジムラリオ,女,0868885776,1958/07/20\n745,田渕元夫,タブチモトオ,男,0770287669,1993/03/07\n746,梅本清次,ウメモトセイジ,男,0983516223,1969/05/02\n747,坂東正義,バンドウマサヨシ,男,0889143436,1996/04/29\n748,松本莉子,マツモトリコ,女,0597843790,1980/03/01\n749,沖田結月,オキタユヅキ,女,0275339977,1980/03/15\n750,西美千子,ニシミチコ,女,0768736828,1986/11/29\n751,浅野千佐子,アサノチサコ,女,0957027327,1971/11/11\n752,本橋優里,モトハシユリ,女,0558881532,1975/02/20\n753,吉田与三郎,ヨシダヨサブロウ,男,074061357,1960/11/26\n754,泉義郎,イズミヨシロウ,男,073640769,1979/06/16\n755,安部文夫,アベフミオ,男,077223544,1981/01/01\n756,新倉克己,ニイクラカツミ,男,0952533338,1967/08/27\n757,滋賀幸,シガサチ,女,0964364307,1959/04/05\n758,江口拓也,エグチタクヤ,男,0888914132,1980/03/12\n759,安藤涼音,アンドウスズネ,女,0952127702,1957/03/29\n760,田所雅也,タドコロマサヤ,男,045070002,1980/07/16\n761,濱田藍,ハマダアイ,女,0895621279,1960/02/03\n762,金丸守,カナマルマモル,男,0298661112,1995/09/03\n763,山田香,ヤマダカオル,女,0763971196,1981/01/27\n764,前島研治,マエジマケンジ,男,0930292104,1983/11/17\n765,堤惟史,ツツミタダシ,男,0825163187,1957/09/12\n766,河野洋文,カワノヒロフミ,男,0198404594,1960/11/04\n767,難波正司,ナンバマサシ,男,0866534405,1968/04/02\n768,三浦達雄,ミウラタツオ,男,0283848236,1975/02/15\n769,白木竜一,シラキリュウイチ,男,0176692193,1958/05/01\n770,田原絢香,タワラアヤカ,女,0550443789,1968/12/27\n771,吉原勇次,ヨシワラユウジ,男,0822590568,1965/08/26\n772,滝雅史,タキマサシ,男,0761176464,1990/05/17\n773,清水信孝,キヨミズノブタカ,男,0241657616,1981/12/01\n774,小西美愛,コニシミア,女,0223364244,1985/07/29\n775,高尾久雄,タカオヒサオ,男,0574214881,1976/06/20\n776,大内唯衣,オウウチユイ,女,0223652664,1975/03/15\n777,岸本俊幸,キシモトトシユキ,男,0986810198,1986/09/03\n778,片岡朱里,カタオカアカリ,女,0824855159,1965/02/19\n779,東慶子,アズマケイコ,女,0959430918,1962/03/05\n780,小栗梢,オグリコズエ,女,0766347332,1968/10/14\n781,根本恵理,ネモトエリ,女,0440082013,1990/08/07\n782,麻生友里,アソウユリ,女,0185941868,1988/11/04\n783,古山花音,フルヤマカノン,女,0299262650,1966/11/11\n784,浦野秀男,ウラノヒデオ,男,0228581616,1992/04/09\n785,木戸綾音,キドアヤネ,女,0289612408,1995/03/17\n786,福山武,フクヤマタケシ,男,0235230065,1995/04/06\n787,安東美優,アンドウミユウ,女,0858294940,1957/04/17\n788,柳茂雄,ヤナギシゲオ,男,0402241949,1961/01/26\n789,豊田美子,トヨダヨシコ,女,0846456690,1981/10/29\n790,野田沙織,ノダサオリ,女,0947909330,1982/12/03\n791,吉本好克,ヨシモトヨシカツ,男,0767514192,1975/01/17\n792,高嶋正紀,タカシママサキ,男,0776899230,1973/08/04\n793,小嶋栞奈,オジマカンナ,女,0289750479,1969/11/12\n794,栗山丈夫,クリヤマタケオ,男,0823705815,1981/08/09\n795,黒木紗弥,クロキサヤ,女,0887316089,1975/08/26\n796,梶原梓,カジワラアズサ,女,0878829845,1971/04/07\n797,横川正広,ヨコカワマサヒロ,男,0868031961,1967/07/31\n798,松島茂行,マツシマシゲユキ,男,0988490616,1971/11/23\n799,村田雅康,ムラタマサヤス,男,0554174123,1980/06/21\n800,芦田静枝,アシダシズエ,女,0469591662,1993/07/12\n801,北野梨乃,キタノリノ,女,0575861684,1989/01/05\n802,守屋雅江,モリヤマサエ,女,0296636553,1988/02/27\n803,森川鈴,モリカワリン,女,0299467178,1975/03/27\n804,坂口亨,サカグチトオル,男,0594892069,1993/03/01\n805,平井柚,ヒライユズ,女,0584827744,1981/09/13\n806,青柳時夫,アオヤギトキオ,男,0578525954,1958/05/15\n807,関谷胡春,セキヤコハル,女,0572257703,1975/10/19\n808,志田幸治,シダコウジ,男,0587550171,1983/01/04\n809,山中学,ヤマナカマナブ,男,0736129017,1962/12/29\n810,大平都,オオヒラミヤコ,女,0734854848,1979/09/02\n811,平松真悠,ヒラマツマユ,女,0868799470,1983/04/30\n812,田渕一子,タブチイチコ,女,073042011,1963/12/03\n813,丸山稟,マルヤマリン,女,0227107129,1966/07/26\n814,守屋沙良,モリヤサラ,女,052871907,1982/12/22\n815,米沢珠希,ヨネザワタマキ,女,0981802056,1991/11/07\n816,大川嘉子,オオカワヨシコ,女,0231792221,1966/02/05\n817,中井重雄,ナカイシゲオ,男,0295657367,1991/01/31\n818,安藤覚,アンドウサトシ,男,023255609,1963/07/29\n819,皆川吉明,ミナガワヨシアキ,男,0272684704,1996/01/13\n820,池内肇,イケウチハジメ,男,0176025522,1976/12/10\n821,柴崎克彦,シバザキカツヒコ,男,0940934769,1963/10/22\n822,長友明彦,ナガトモアキヒコ,男,0466873549,1959/12/03\n823,金森隆三,カナモリリュウゾウ,男,0175145860,1974/04/15\n824,西本理桜,ニシモトリオ,女,0745886521,1956/12/06\n825,川村幸一郎,カワムラコウイチロウ,男,0798430511,1974/12/26\n826,土井沙希,ドイサキ,女,0567564300,1991/10/18\n827,土肥寛之,ドイヒロユキ,男,0866725907,1977/07/30\n828,山上泉,ヤマガミイズミ,女,0730677335,1990/04/04\n829,島田英治,シマダエイジ,男,0735623918,1968/07/27\n830,並木来未,ナミキクルミ,女,0778537525,1984/09/03\n831,小松忠良,コマツタダヨシ,男,0246935354,1976/08/05\n832,田畑浩,タバタヒロシ,男,0983606977,1985/04/19\n833,茂木幸恵,モギユキエ,女,0584717068,1969/01/08\n834,長瀬俊文,ナガセトシフミ,男,0192889179,1990/11/15\n835,下川勇吉,シモカワユウキチ,男,0771120366,1995/12/26\n836,鹿野早紀,カノサキ,女,0554851072,1965/04/29\n837,伴百合,バンユリ,女,0172785643,1965/01/26\n838,柳田日向,ヤナギダヒナタ,女,0791831091,1962/12/21\n839,麻生比呂美,アソウヒロミ,女,0524808014,1957/12/22\n840,長沢陽菜,ナガサワハルナ,女,0971262415,1978/02/21\n841,大林一太郎,オオバヤシイチタロウ,男,0792029801,1978/08/10\n842,川島正美,カワシママサミ,女,018441323,1986/02/22\n843,奥山佐一,オクヤマサイチ,男,0552388925,1970/01/27\n844,栗山莉那,クリヤマリナ,女,0962092218,1990/04/10\n845,野呂一也,ノロカズヤ,男,0763007310,1972/01/29\n846,目黒麻紀,メグロマキ,女,0878140457,1979/01/29\n847,野間千春,ノマチハル,女,0951376953,1958/11/21\n848,永山好美,ナガヤマヨシミ,女,0731921821,1996/03/31\n849,中里美紀子,ナカザトミキコ,女,0858601123,1956/12/13\n850,内海麻紀,ウツミマキ,女,052325937,1979/12/14\n851,安斉愛音,アンザイアイネ,女,0748868982,1972/05/18\n852,深沢雅雄,フカザワマサオ,男,0769599654,1979/10/04\n853,曽根数子,ソネカズコ,女,0878391459,1995/05/28\n854,小出心,オデココロ,女,024717327,1966/12/21\n855,砂川広吉,サガワヒロキチ,男,0117563964,1981/12/25\n856,川本久美子,カワモトクミコ,女,0778305458,1972/01/17\n857,堀井愛,ホリイアイ,女,0553057481,1976/04/21\n858,小森理紗,コモリリサ,女,0984841722,1973/08/27\n859,大田拓哉,オオタタクヤ,男,055527692,1958/10/27\n860,中原彩音,ナカハラアヤネ,女,098215907,1978/01/09\n861,猪俣伊織,イノマタイオリ,女,0770013182,1962/11/15\n862,上岡裕次郎,カミオカユウジロウ,男,0978014504,1964/04/22\n863,南治,ミナミオサム,男,0865108154,1964/12/20\n864,中尾綾香,ナカオアヤカ,女,0276196728,1988/05/09\n865,木原佳代,キハラカヨ,女,0871095267,1969/06/28\n866,小山田里咲,オヤマダリサ,女,0629935706,1972/05/04\n867,三井仁一,ミツイジンイチ,男,0460534786,1987/06/26\n868,諏訪律子,スワリツコ,女,0829414929,1979/11/03\n869,江頭克彦,エガシラカツヒコ,男,0493393997,1957/10/22\n870,二瓶裕司,ニヘイユウジ,男,0543824574,1978/01/15\n871,大田邦男,オオタクニオ,男,089698160,1976/05/12\n872,恩田紗彩,オンダサアヤ,女,0867017855,1990/02/17\n873,横山和葉,ヨコヤマカズハ,女,0734561013,1988/03/12\n874,西田日向子,ニシダヒナコ,女,0927696073,1996/07/28\n875,唐沢竹雄,カラサワタケオ,男,0895943429,1975/07/12\n876,須賀孝之,スガタカユキ,男,0450909095,1975/07/13\n877,石渡裕信,イシワタリヒロノブ,男,0868494158,1961/05/09\n878,西本憲司,ニシモトケンジ,男,0222249170,1987/07/15\n879,鳴海良之,ナルミヨシユキ,男,0581481893,1982/12/12\n880,出口雛子,デクチヒナコ,女,022714683,1985/11/02\n881,南和義,ミナミカズヨシ,男,0191047611,1961/08/28\n882,白木晃,シラキアキラ,男,0178417096,1973/05/15\n883,大友三朗,オオトモサブロウ,男,023864137,1986/04/03\n884,丹野結香,タンノユイカ,女,0459415192,1965/04/07\n885,柳田詩織,ヤナギダシオリ,女,068633984,1995/04/09\n886,山崎金弥,ヤマザキキンヤ,男,0767553213,1970/07/25\n887,山城俊史,ヤマシロトシフミ,男,0782651396,1994/11/30\n888,波多野政一,ハタノマサイチ,男,0735511423,1986/09/03\n889,浅野孝,アサノタカシ,男,0189653253,1995/03/06\n890,橘仁美,タチバナヒトミ,女,086862366,1965/02/07\n891,佐川辰二,サガワタツジ,男,0966225957,1978/01/23\n892,石坂日向,イシザカヒナタ,女,0136136964,1989/02/03\n893,古山清司,フルヤマキヨシ,男,0984650464,1963/03/16\n894,冨田里歩,トミタリホ,女,0964606954,1988/05/28\n895,嶋田美央,シマダミオ,女,0565455490,1985/03/04\n896,小笠原凛香,オガサワラリンカ,女,0451912510,1980/02/22\n897,泉尚夫,イズミヒサオ,男,0591255575,1967/04/10\n898,長沢梨花,ナガサワリカ,女,0857275273,1979/08/25\n899,白井奈々美,シライナナミ,女,0944254319,1981/09/23\n900,秋本優香,アキモトユウカ,女,0284126590,1977/04/08\n901,浅見千鶴子,アサミチヅコ,女,0930753854,1960/03/03\n902,佐藤敏子,サトウトシコ,女,0766427514,1957/01/24\n903,陳徳雄,チントクオ,男,0578226603,1968/05/17\n904,高見政男,タカミマサオ,男,0276701546,1958/11/10\n905,楠正治,クスノキショウジ,男,0746638940,1983/05/10\n906,出口藍,デクチアイ,女,0153709405,1995/11/08\n907,船越吉彦,フナコシヨシヒコ,男,0942486109,1983/10/16\n908,二宮真澄,ニノミヤマスミ,女,0693640460,1979/04/25\n909,岩沢完治,イワサワカンジ,男,0889011477,1979/12/04\n910,大畑忠一,オオハタチュウイチ,男,0795363519,1988/03/27\n911,江崎文彦,エザキフミヒコ,男,0463244485,1984/06/03\n912,深沢由実,フカザワユミ,女,0275770991,1968/08/15\n913,大和陽一郎,ダイワヨウイチロウ,男,0233367951,1961/10/20\n914,古谷志帆,フルヤシホ,女,0837685514,1990/05/04\n915,八田香奈,ヤツタカナ,女,0798368731,1975/08/22\n916,徳田香,トクダカオル,女,0434266063,1966/05/01\n917,平賀恭子,ヒラガキョウコ,女,0957293856,1976/04/16\n918,中沢彩乃,ナカザワアヤノ,女,0986790956,1979/10/02\n919,塩田晃年,シオダアキトシ,男,0881303357,1975/11/09\n920,渋谷雅美,シブヤマサミ,女,0272961332,1974/06/17\n921,東山駿,ヒガシヤマシュン,男,0263767275,1975/02/22\n922,高村小百合,タカムラサユリ,女,0989511812,1988/11/29\n923,川井美奈代,カワイミナヨ,女,0547677008,1962/12/17\n924,新垣葉菜,アラガキハナ,女,0833425590,1984/10/07\n925,北山正道,キタヤママサミチ,男,0239514827,1958/08/26\n926,岩城芳男,イワキヨシオ,男,0975900692,1959/10/28\n927,辻優,ツジマサル,男,0769441148,1985/10/20\n928,中澤理恵,ナカザワリエ,女,0735703871,1975/08/19\n929,中塚和正,ナカツカカズマサ,男,0737718922,1990/09/30\n930,粕谷章一,カスヤショウイチ,男,0942017650,1965/01/06\n931,関口芳雄,セキグチヨシオ,男,0555780713,1983/08/13\n932,皆川厚,ミナガワアツシ,男,053714825,1996/07/23\n933,東山初音,ヒガシヤマハツネ,女,0734852609,1987/10/17\n934,氏家一葉,ウジイエカズハ,女,0412323700,1964/11/17\n935,西野優菜,ニシノユウナ,女,0469453676,1956/12/05\n936,岸田頼子,キシダヨリコ,女,0173842061,1992/08/12\n937,櫻井歌音,サクライカノン,女,0972356151,1980/01/16\n938,永山章夫,ナガヤマアキオ,男,0749258597,1987/10/20\n939,坂上美名子,サカガミミナコ,女,0893457867,1981/08/12\n940,竹内柚季,タケウチユズキ,女,0768282065,1965/06/13\n941,小寺孝通,オデラタカミチ,男,0839658288,1972/08/14\n942,中尾喜代志,ナカオキヨシ,男,0175925149,1983/10/02\n943,荻原紗彩,オギワラサアヤ,女,0994137772,1971/12/04\n944,八木美由紀,ヤギミユキ,女,0958615077,1966/03/06\n945,長井志乃,ナガイシノ,女,0857162717,1974/02/05\n946,天野渚,アマノナギサ,女,0564776534,1982/02/26\n947,榎本知子,エノモトトモコ,女,0982622480,1983/02/18\n948,畑中信也,ハタナカシンヤ,男,0768877468,1970/07/25\n949,北田来実,キタダクルミ,女,076075210,1991/02/09\n950,林義和,ハヤシヨシカズ,男,0887842425,1986/09/06\n951,大山修司,オオヤマシュウジ,男,0949378296,1976/04/19\n952,富永沙和,トミナガサワ,女,0558431436,1982/09/01\n953,小俣沙紀,オマタサキ,女,07808621,1989/04/05\n954,川田良子,カワダヨシコ,女,0797419091,1960/08/20\n955,岩瀬裕美子,イワセユミコ,女,0566364530,1968/01/03\n956,大倉紀之,オオクラノリユキ,男,0955315527,1964/05/26\n957,重松栄一,シゲマツエイイチ,男,0983479798,1969/07/30\n958,堀口華,ホリグチハナ,女,0947023118,1982/05/01\n959,柿崎美香,カキザキミカ,女,0607656449,1970/06/08\n960,江田千鶴子,エダチヅコ,女,0551610576,1960/04/26\n961,北村理子,キタムラリコ,女,0474658717,1959/06/21\n962,河井奈緒子,カワイナオコ,女,0418915838,1982/10/16\n963,上杉仁美,ウエスギヒトミ,女,0974131680,1964/08/26\n964,笠井佳奈,カサイヨシナ,女,097329436,1968/04/25\n965,高畑真琴,タカハタマコト,女,0986663148,1982/11/03\n966,影山勇二,カゲヤマユウジ,男,0731403006,1960/12/05\n967,松下千紘,マツシタチヒロ,女,0858755194,1978/10/14\n968,森島桃華,モリシマモモカ,女,0982178468,1963/10/15\n969,栗原裕一,クリハラユウイチ,男,0856831425,1957/09/05\n970,古橋孝吉,フルハシコウキチ,男,0529278370,1979/09/02\n971,滝川清蔵,タキガワセイゾウ,男,0838372801,1978/09/09\n972,長嶋晴久,ナガシマハルヒサ,男,0459909246,1958/05/25\n973,竹中弘子,タケナカヒロコ,女,0858930715,1979/12/22\n974,井口明美,イグチアキメ,女,0888045374,1967/02/08\n975,石塚悦代,イシヅカエツヨ,女,0942613419,1988/06/12\n976,石黒美海,イシグロミウ,女,0982905515,1985/03/25\n977,秋本真凛,アキモトマリン,女,0282539063,1984/12/18\n978,岩田文二,イワタブンジ,男,0888989714,1974/12/19\n979,野中若奈,ノナカワカナ,女,0192534052,1976/01/19\n980,高畑毅雄,タカハタタケオ,男,0944760572,1962/07/09\n981,古橋涼花,フルハシスズカ,女,0778531618,1987/02/28\n982,長島一路,ナガシマカズミチ,男,0244134806,1990/03/05\n983,大野肇,オオノハジメ,男,0270613990,1996/06/20\n984,松沢譲,マツザワユズル,男,0958557389,1987/02/21\n985,古沢力雄,フルサワリキオ,男,0475028880,1988/11/30\n986,長谷川淳一,ハセガワジュンイチ,男,0580891015,1988/04/06\n987,橋口堂下,ハシグチドウシタ,女,0170971716,1971/04/20\n988,福永今日子,フクナガキョウコ,女,0841531020,1978/11/10\n989,那須美也子,ナスミヤコ,女,0880834027,1958/11/16\n990,阿部実桜,アベミオ,女,073049656,1958/01/28\n991,菅原幹彦,スガハラミキヒコ,男,0770085961,1987/03/07\n992,水上由姫,ミズカミユキ,女,0997606693,1980/04/23\n993,大矢和,オオヤノドカ,女,0942981026,1988/02/08\n994,大貫奈保美,オオヌキナホミ,女,0526500603,1992/10/23\n995,寺西真依,テラニシマイ,女,0954132731,1979/04/07\n996,田口歌音,タグチカノン,女,0287313121,1966/09/17\n997,東岩雄,アズマイワオ,男,0765755074,1966/12/15\n998,菊池冨美子,キクチフミコ,女,0879849028,1984/05/19\n999,赤松和弘,アカマツカズヒロ,男,0883097005,1957/04/09\n1000,金山香乃,カナヤマカノ,女,0983821400,1994/05/14\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/ArrayList.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 配列リスト。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  public class ArrayList<T> : IEnumerable<T>\n  {\n    #region フィールド\n\n    T[] data;\n    int count;\n\n    #endregion\n    #region 初期化\n\n    public ArrayList() : this(256) {}\n\n    /// <summary>\n    /// 初期最大容量を指定して初期化。\n    /// </summary>\n    /// <param name=\"capacity\">初期載大容量</param>\n    public ArrayList(int capacity)\n    {\n      this.data = new T[capacity];\n      this.count = 0;\n    }\n\n    #endregion\n    #region プロパティ\n\n    /// <summary>\n    /// 格納されている要素数。\n    /// </summary>\n    public int Count\n    {\n      get { return this.count; }\n    }\n\n    /// <summary>\n    /// i 番目の要素を読み書き。\n    /// </summary>\n    /// <param name=\"i\">読み書き位置</param>\n    /// <returns>読み出した要素</returns>\n    public T this[int i]\n    {\n      get { return this.data[i]; }\n      set { this.data[i] = value; }\n    }\n\n    #endregion\n    #region 挿入・削除\n\n    /// <summary>\n    /// 配列を確保しなおす。\n    /// </summary>\n    /// <remarks>\n    /// 配列長は2倍ずつ拡張していきます。\n    /// </remarks>\n    void Extend()\n    {\n      T[] data = new T[this.data.Length * 2];\n      for (int i = 0; i < this.data.Length; ++i) data[i] = this.data[i];\n      this.data = data;\n    }\n\n    /// <summary>\n    /// i 番目の位置に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"i\">追加位置</param>\n    /// <param name=\"elem\">追加する要素</param>\n    public void Insert(int i, T elem)\n    {\n      if (this.count >= this.data.Length)\n        this.Extend();\n\n      for (int n = this.count; n > i; --n)\n      {\n        this.data[n] = this.data[n - 1];\n      }\n      this.data[i] = elem;\n      ++this.count;\n    }\n\n    /// <summary>\n    /// 末尾に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"elem\">追加する要素</param>\n    public void InsertLast(T elem)\n    {\n      if (this.count >= this.data.Length)\n        this.Extend();\n\n      this.data[this.count] = elem;\n      ++this.count;\n    }\n\n    /// <summary>\n    /// i 番目の要素を削除。\n    /// </summary>\n    /// <param name=\"i\">削除位置</param>\n    public void Erase(int i)\n    {\n      for (int n = i; n < this.count - 1; ++n)\n      {\n        this.data[n] = this.data[n + 1];\n      }\n      --this.count;\n    }\n\n    /// <summary>\n    /// 末尾の要素を削除。\n    /// </summary>\n    public void EraseLast()\n    {\n      --this.count;\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      for (int i = 0; i < this.count; ++i)\n        yield return this.data[i];\n    }\n\n    System.Collections.IEnumerator\n      System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/BinaryTree.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 2分探索木。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  class BinaryTree<T> : ISet<T>\n    where T: IComparable<T>\n  {\n    #region 内部クラス\n\n    /// <summary>\n    /// 2文探索木のノード。\n    /// </summary>\n    public class Node\n    {\n      #region フィールド\n\n      internal T val;\n      internal Node left, right, parent;\n\n      #endregion\n      #region 初期化\n\n      internal Node() : this(default(T), null) { }\n\n      internal Node(T val, Node parent)\n      {\n        this.val = val;\n        this.parent = parent;\n        this.left = this.right = null;\n      }\n\n      #endregion\n      #region プロパティ\n\n      /// <summary>\n      /// 格納している要素を取得。\n      /// </summary>\n      public T Value\n      {\n        get { return this.val; }\n        set { this.val = value; }\n      }\n\n      /// <summary>\n      /// このノードの次のノードを返す。\n      /// （要素の値の小さい順にノードをたどる。）\n      /// </summary>\n      public Node Next\n      {\n        get\n        {\n          Node n = this;\n\n          if (n.right != null)\n            return n.right.Min;\n\n          for (; n.parent != null && n.parent.left != n; n = n.parent) ;\n          return n.parent;\n        }\n      }\n\n      /// <summary>\n      /// このノードの前のノードを返す。\n      /// （要素の値の小さい順にノードをたどる。）\n      /// </summary>\n      public Node Previous\n      {\n        get\n        {\n          Node n = this;\n\n          if (n.left != null)\n            return n.left.Max;\n\n          for (; n.parent != null && n.parent.right != n; n = n.parent) ;\n          return n.parent;\n        }\n      }\n\n      /// <summary>\n      /// このノード以下の部分木中で、最小の要素を持つノード（＝左端ノード）を返す。\n      /// </summary>\n      internal Node Min\n      {\n        get\n        {\n          Node n = this;\n          for (; n.left != null; n = n.left) ;\n          return n;\n        }\n      }\n\n      /// <summary>\n      /// このノード以下の部分木中で、最大の要素を持つノード（＝右端ノード）を返す。\n      /// </summary>\n      internal Node Max\n      {\n        get\n        {\n          Node n = this;\n          for (; n.right != null; n = n.right) ;\n          return n;\n        }\n      }\n\n      #endregion\n      #region デバッグ用\n\n      [System.Diagnostics.Conditional(\"DEBUG\")]\n      virtual public void Output(System.IO.TextWriter writer, int level)\n      {\n        for (int i = 0; i < level; ++i)\n          writer.Write(\"\\t\");\n        writer.Write(\"{0}\\n\", this.val);\n\n        ++level;\n        if (this.left != null) this.left.Output(writer, level);\n        else\n        {\n          for (int i = 0; i < level; ++i)\n            writer.Write(\"\\t\");\n          writer.Write(\"null\\n\");\n        }\n        if (this.right != null) this.right.Output(writer, level);\n        else\n        {\n          for (int i = 0; i < level; ++i)\n            writer.Write(\"\\t\");\n          writer.Write(\"null\\n\");\n        }\n      }\n\n      #endregion\n    }\n\n    #endregion\n    #region フィールド\n\n    /// <summary>\n    /// 根ノード。\n    /// </summary>\n    Node root;\n\n    #endregion\n    #region 初期化\n\n    public BinaryTree()\n    {\n      this.root = null;\n    }\n\n    #endregion\n    #region プロパティ\n\n    /// <summary>\n    /// 木構造を逐次探索する際の始点。\n    /// </summary>\n    public Node Begin\n    {\n      get\n      {\n        if (this.root == null)\n          return this.End;\n        return this.root.Min;\n      }\n    }\n\n    /// <summary>\n    /// 木構造を逐次探索する際の終端（末尾よりも後ろの番兵に当たるノード）。\n    /// </summary>\n    public Node End\n    {\n      get { return null; }\n    }\n\n    #endregion\n    #region 要素の挿入・削除・検索\n\n    /// <summary>\n    /// 新しい要素を挿入する。\n    /// </summary>\n    /// <param name=\"elem\">新しい要素</param>\n    /// <returns>新しい要素を格納するノード</returns>\n    public void Insert(T elem)\n    {\n      if (this.root == null)\n      {\n        this.root = new Node(elem, null);\n        return;\n      }\n\n      Node n = this.root;\n      Node p = null;\n      while (n != null)\n      {\n        p = n;\n        if (n.val.CompareTo(elem) > 0) n = n.left;\n        else n = n.right;\n      }\n\n      n = new Node(elem, p);\n      if (p.val.CompareTo(elem) > 0) p.left = n;\n      else p.right = n;\n    }\n\n    /// <summary>\n    /// n の片方の子は null、もう片方の子は m という前提の元で、\n    /// ノード n の位置を子ノード m で置き換える。\n    /// </summary>\n    /// <param name=\"n\">削除するノード</param>\n    /// <param name=\"m\">置き換える子ノード</param>\n    void Replace(Node n, Node m)\n    {\n      Node p = n.parent;\n      if (m != null) m.parent = p;\n      if (n == this.root) this.root = m;\n      else if (p.left == n) p.left = m;\n      else p.right = m;\n    }\n\n    /// <summary>\n    /// ノード n を削除する。\n    /// </summary>\n    /// <param name=\"n\">削除したいノード</param>\n    public void Erase(Node n)\n    {\n      if (n == null) return;\n\n      if (n.left == null) this.Replace(n, n.right);\n      else if(n.right == null) this.Replace(n, n.left);\n      else\n      {\n        Node m = n.right.Min;\n        n.Value = m.Value;\n        this.Replace(m, m.right);\n      }\n    }\n\n    /// <summary>\n    /// 要素を削除する。\n    /// </summary>\n    /// <param name=\"elem\">削除したい要素</param>\n    public void Erase(T elem)\n    {\n      this.Erase(this.Find(elem));\n    }\n\n    /// <summary>\n    /// ある値を持つノードを検索。\n    /// (同じ値が複数ある場合、最初のノード。)\n    /// 見つからなかった場合は null を返す。\n    /// </summary>\n    /// <param name=\"elem\">探したい要素</param>\n    /// <returns>見つけたノード</returns>\n    public Node Find(T elem)\n    {\n      Node n = this.root;\n      while (n != null)\n      {\n        if (n.val.CompareTo(elem) > 0) n = n.left;\n        else if (n.val.CompareTo(elem) < 0) n = n.right;\n        else break;\n      }\n      return n;\n    }\n\n    public bool Contains(T elem)\n    {\n      return this.Find(elem) != this.End;\n    }\n\n    /// <summary>\n    /// ある値のノードを検索。\n    /// （同じ値を持つノード全部を IEnumerable で一覧として返す。）\n    /// </summary>\n    /// <param name=\"elem\">探したい要素</param>\n    /// <returns>見つけたノード一覧</returns>\n    public IEnumerable<T> FindRange(T elem)\n    {\n      for (Node n = this.Find(elem); n != this.End && n.Value.CompareTo(elem) == 0; n = n.Next)\n        yield return n.Value;\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      for (Node n = this.Begin; n != this.End; n = n.Next)\n        yield return n.Value;\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n    #region デバッグ用\n\n    [System.Diagnostics.Conditional(\"DEBUG\")]\n    public void Output(System.IO.TextWriter writer)\n    {\n      if (this.root != null)\n        this.root.Output(writer, 0);\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/CircularBuffer.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 循環バッファ。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  public class CircularBuffer<T> : IEnumerable<T>\n  {\n    #region フィールド\n\n    T[] data;\n    int top, bottom;\n    int mask;\n\n    #endregion\n    #region 初期化\n\n    public CircularBuffer() : this(256) {}\n\n    /// <summary>\n    /// 初期最大容量を指定して初期化。\n    /// </summary>\n    /// <param name=\"capacity\">初期載大容量</param>\n    public CircularBuffer(int capacity)\n    {\n      capacity = Pow2((uint)capacity);\n      this.data = new T[capacity];\n      this.top = this.bottom = 0;\n      this.mask = capacity - 1;\n    }\n\n    static int Pow2(uint n)\n    {\n      --n;\n      int p = 0;\n      for (; n != 0; n >>= 1) p = (p << 1) + 1;\n      return p + 1;\n    }\n\n    #endregion\n    #region プロパティ\n\n    /// <summary>\n    /// 格納されている要素数。\n    /// </summary>\n    public int Count\n    {\n      get\n      {\n        int count = this.bottom - this.top;\n        if (count < 0) count += this.data.Length;\n        return count;\n      }\n    }\n\n    /// <summary>\n    /// i 番目の要素を読み書き。\n    /// </summary>\n    /// <param name=\"i\">読み書き位置</param>\n    /// <returns>読み出した要素</returns>\n    public T this[int i]\n    {\n      get { return this.data[(i + this.top) & this.mask]; }\n      set { this.data[(i + this.top) & this.mask] = value; }\n    }\n\n    #endregion\n    #region 挿入・削除\n\n    /// <summary>\n    /// 配列を確保しなおす。\n    /// </summary>\n    /// <remarks>\n    /// 配列長は2倍ずつ拡張していきます。\n    /// </remarks>\n    void Extend()\n    {\n      T[] data = new T[this.data.Length * 2];\n      int i = 0;\n      foreach (T elem in this)\n      {\n        data[i] = elem;\n        ++i;\n      }\n      this.top = 0;\n      this.bottom = this.Count;\n      this.data = data;\n      this.mask = data.Length - 1;\n    }\n\n    /// <summary>\n    /// i 番目の位置に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"i\">追加位置</param>\n    /// <param name=\"elem\">追加する要素</param>\n    public void Insert(int i, T elem)\n    {\n      if (this.Count >= this.data.Length - 1)\n        this.Extend();\n\n      if (i < this.Count / 2)\n      {\n        for (int n = 0; n <= i; ++n)\n        {\n          this[n - 1] = this[n];\n        }\n        this.top = (this.top - 1) & this.mask;\n        this[i] = elem;\n      }\n      else\n      {\n        for (int n = this.Count; n > i; --n)\n        {\n          this[n] = this[n - 1];\n        }\n        this[i] = elem;\n        this.bottom = (this.bottom + 1) & this.mask;\n      }\n    }\n\n    /// <summary>\n    /// 先頭に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"elem\">追加する要素</param>\n    public void InsertFirst(T elem)\n    {\n      if (this.Count >= this.data.Length - 1)\n        this.Extend();\n\n      this.top = (this.top - 1) & this.mask;\n      this.data[this.top] = elem;\n    }\n\n    /// <summary>\n    /// 末尾に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"elem\">追加する要素</param>\n    public void InsertLast(T elem)\n    {\n      if (this.Count >= this.data.Length - 1)\n        this.Extend();\n\n      this.data[this.bottom] = elem;\n      this.bottom = (this.bottom + 1) & this.mask;\n    }\n\n    /// <summary>\n    /// i 番目の要素を削除。\n    /// </summary>\n    /// <param name=\"i\">削除位置</param>\n    public void Erase(int i)\n    {\n      for (int n = i; n < this.Count - 1; ++n)\n      {\n        this[n] = this[n + 1];\n      }\n      this.bottom = (this.bottom - 1) & this.mask;\n    }\n\n    /// <summary>\n    /// 先頭の要素を削除。\n    /// </summary>\n    public void EraseFirst()\n    {\n      this.top = (this.top + 1) & this.mask;\n    }\n\n    /// <summary>\n    /// 末尾の要素を削除。\n    /// </summary>\n    public void EraseLast()\n    {\n      this.bottom = (this.bottom - 1) & this.mask;\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      if (this.top <= this.bottom)\n      {\n        for (int i = this.top; i < this.bottom; ++i)\n          yield return this.data[i];\n      }\n      else\n      {\n        for (int i = this.top; i < this.data.Length; ++i)\n          yield return this.data[i];\n        for (int i = 0; i < this.bottom; ++i)\n          yield return this.data[i];\n      }\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/Dictionary.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 辞書。\n  /// </summary>\n  /// <typeparam name=\"TKey\">鍵の型</typeparam>\n  /// <typeparam name=\"TValue\">値の型</typeparam>\n  public interface IDictionary<TKey, TValue>\n    : IEnumerable<KeyValuePair<TKey, TValue>>\n  {\n    /// <summary>\n    /// 新しい要素の挿入。\n    /// </summary>\n    /// <param name=\"key\">新しい要素の鍵</param>\n    /// <param name=\"elem\">新しい要素の値</param>\n    void Insert(TKey key, TValue val);\n\n    /// <summary>\n    /// 要素の削除。\n    /// </summary>\n    /// <param name=\"elem\">削除したい要素</param>\n    void Erase(TKey key);\n\n    /// <summary>\n    /// 要素を含むかどうか。\n    /// </summary>\n    /// <param name=\"elem\">検索したい要素</param>\n    /// <returns>見つかった場合 true</returns>\n    bool Contains(TKey key);\n\n    /// <summary>\n    /// [] を使って値を取り出す。\n    /// </summary>\n    /// <param name=\"key\">鍵</param>\n    /// <returns>値</returns>\n    TValue this[TKey key]\n    {\n      set;\n      get;\n    }\n\n    /// <summary>\n    /// 鍵一覧取得\n    /// </summary>\n    IEnumerable<TKey> Keys { get; }\n\n    /// <summary>\n    /// 値一覧取得\n    /// </summary>\n    IEnumerable<TValue> Values { get; }\n  }\n\n  /// <summary>\n  /// 辞書のエントリー。\n  /// </summary>\n  /// <typeparam name=\"TKey\">鍵の型</typeparam>\n  /// <typeparam name=\"TValue\">値の型</typeparam>\n  internal class Entry<TKey, TValue>\n  {\n    internal TKey key;\n    internal TValue val;\n\n    internal Entry(TKey key) : this(key, default(TValue)) { }\n\n    internal Entry(TKey key, TValue val)\n    {\n      this.key = key;\n      this.val = val;\n    }\n\n    #region object メンバ\n\n    public override int GetHashCode()\n    {\n      return this.key.GetHashCode();\n    }\n\n    public override bool Equals(object obj)\n    {\n      Entry<TKey, TValue> ent = obj as Entry<TKey, TValue>;\n      if (ent == null) return false;\n      return this.key.Equals(ent.key);\n    }\n\n    #endregion\n  }\n\n  /// <summary>\n  /// 辞書のエントリー。\n  /// （SortedArray, Tree 用）\n  /// 鍵が IComparable を実装している必要あり。\n  /// </summary>\n  /// <typeparam name=\"TKey\">鍵の型</typeparam>\n  /// <typeparam name=\"TValue\">値の型</typeparam>\n  internal class ComparableEntry<TKey, TValue>\n    : Entry<TKey, TValue>,\n    IComparable<ComparableEntry<TKey, TValue>>\n    where TKey : IComparable<TKey>\n  {\n    internal ComparableEntry(TKey key) : base(key) { }\n    internal ComparableEntry(TKey key, TValue val) : base(key, val) { }\n\n    #region IComparable<ComparableEntry<TKey,TValue>> メンバ\n\n    public int CompareTo(ComparableEntry<TKey, TValue> other)\n    {\n      return this.key.CompareTo(other.key);\n    }\n\n    #endregion\n  }\n\n  public class HashDictionary<TKey, TValue> : IDictionary<TKey, TValue>\n  {\n    #region フィールド\n\n    HashTable<Entry<TKey, TValue>> table;\n\n    #endregion\n    #region 初期化\n\n    public HashDictionary() : this(256) { }\n\n    public HashDictionary(int capacity)\n    {\n      this.table = new HashTable<Entry<TKey, TValue>>(capacity);\n    }\n\n    #endregion\n    #region IDictionary<TKey,TValue> メンバ\n\n    public void Insert(TKey key, TValue val)\n    {\n      this.table.Insert(new Entry<TKey, TValue>(key, val));\n    }\n\n    public void Erase(TKey key)\n    {\n      this.table.Erase(new Entry<TKey, TValue>(key));\n    }\n\n    public bool Contains(TKey key)\n    {\n      return this.table.Contains(new Entry<TKey, TValue>(key));\n    }\n\n    public TValue this[TKey key]\n    {\n      get\n      {\n        Entry<TKey, TValue> entry = this.table.Find(new Entry<TKey, TValue>(key));\n        if (entry == null) return default(TValue);\n        return entry.val;\n      }\n      set\n      {\n        Entry<TKey, TValue> entry = this.table.Find(new Entry<TKey, TValue>(key));\n        if (entry == null) this.Insert(key, value);\n        else entry.val = value;\n      }\n    }\n\n    public IEnumerable<TKey> Keys\n    {\n      get\n      {\n        foreach (Entry<TKey, TValue> ent in this.table)\n        {\n          yield return ent.key;\n        }\n      }\n    }\n\n    public IEnumerable<TValue> Values\n    {\n      get\n      {\n        foreach (Entry<TKey, TValue> ent in this.table)\n        {\n          yield return ent.val;\n        }\n      }\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()\n    {\n      foreach (Entry<TKey, TValue> ent in this.table)\n      {\n        yield return new KeyValuePair<TKey, TValue>(ent.key, ent.val);\n      }\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n\n  public class SortedDictionary<TKey, TValue> : IDictionary<TKey, TValue>\n    where TKey : IComparable<TKey>\n  {\n    #region フィールド\n\n    SortedArray<ComparableEntry<TKey, TValue>> table;\n\n    #endregion\n    #region 初期化\n\n    public SortedDictionary() : this(256) { }\n\n    public SortedDictionary(int capacity)\n    {\n      this.table = new SortedArray<ComparableEntry<TKey, TValue>>(capacity);\n    }\n\n    #endregion\n    #region IDictionary<TKey,TValue> メンバ\n\n    public void Insert(TKey key, TValue val)\n    {\n      this.table.Insert(new ComparableEntry<TKey, TValue>(key, val));\n    }\n\n    public void Erase(TKey key)\n    {\n      this.table.Erase(new ComparableEntry<TKey, TValue>(key));\n    }\n\n    public bool Contains(TKey key)\n    {\n      return this.table.Contains(new ComparableEntry<TKey, TValue>(key));\n    }\n\n    public TValue this[TKey key]\n    {\n      get\n      {\n        ComparableEntry<TKey, TValue> entry = this.table.Find(new ComparableEntry<TKey, TValue>(key));\n        if (entry == null) return default(TValue);\n        return entry.val;\n      }\n      set\n      {\n        ComparableEntry<TKey, TValue> entry = this.table.Find(new ComparableEntry<TKey, TValue>(key));\n        if (entry == null) this.Insert(key, value);\n        else entry.val = value;\n      }\n    }\n\n    public IEnumerable<TKey> Keys\n    {\n      get\n      {\n        foreach (Entry<TKey, TValue> ent in this.table)\n        {\n          yield return ent.key;\n        }\n      }\n    }\n\n    public IEnumerable<TValue> Values\n    {\n      get\n      {\n        foreach (Entry<TKey, TValue> ent in this.table)\n        {\n          yield return ent.val;\n        }\n      }\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()\n    {\n      foreach (Entry<TKey, TValue> ent in this.table)\n      {\n        yield return new KeyValuePair<TKey, TValue>(ent.key, ent.val);\n      }\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n\n  public class TreeDictionary<TKey, TValue> : IDictionary<TKey, TValue>\n    where TKey : IComparable<TKey>\n  {\n    #region フィールド\n\n    BinaryTree<ComparableEntry<TKey, TValue>> table;\n\n    #endregion\n    #region 初期化\n\n    public TreeDictionary()\n    {\n      this.table = new BinaryTree<ComparableEntry<TKey, TValue>>();\n    }\n\n    #endregion\n    #region IDictionary<TKey,TValue> メンバ\n\n    public void Insert(TKey key, TValue val)\n    {\n      this.table.Insert(new ComparableEntry<TKey, TValue>(key, val));\n    }\n\n    public void Erase(TKey key)\n    {\n      this.table.Erase(new ComparableEntry<TKey, TValue>(key));\n    }\n\n    public bool Contains(TKey key)\n    {\n      return this.table.Contains(new ComparableEntry<TKey, TValue>(key));\n    }\n\n    public TValue this[TKey key]\n    {\n      get\n      {\n        BinaryTree<ComparableEntry<TKey, TValue>>.Node node\n          = this.table.Find(new ComparableEntry<TKey, TValue>(key));\n        if (node == null) return default(TValue);\n        return node.Value.val;\n      }\n      set\n      {\n        BinaryTree<ComparableEntry<TKey, TValue>>.Node node\n          = this.table.Find(new ComparableEntry<TKey, TValue>(key));\n        if (node == null) this.Insert(key, value);\n        else node.Value.val = value;\n      }\n    }\n\n    public IEnumerable<TKey> Keys\n    {\n      get\n      {\n        foreach (Entry<TKey, TValue> ent in this.table)\n        {\n          yield return ent.key;\n        }\n      }\n    }\n\n    public IEnumerable<TValue> Values\n    {\n      get\n      {\n        foreach (Entry<TKey, TValue> ent in this.table)\n        {\n          yield return ent.val;\n        }\n      }\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()\n    {\n      foreach (Entry<TKey, TValue> ent in this.table)\n      {\n        yield return new KeyValuePair<TKey, TValue>(ent.key, ent.val);\n      }\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/ForwardLinkedList.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 片方向連結リスト。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  public class ForwardLinkedList<T> : IEnumerable<T>\n  {\n    #region 内部クラス\n\n    /// <summary>\n    /// 片方向連結リストのノード。\n    /// </summary>\n    public class Node\n    {\n      #region フィールド\n\n      T val;\n      Node next;\n\n      #endregion\n      #region 初期化\n\n      internal Node(T val, Node next)\n      {\n        this.val = val;\n        this.next = next;\n      }\n\n      #endregion\n      #region プロパティ\n\n      /// <summary>\n      /// 格納している要素を取得。\n      /// </summary>\n      public T Value\n      {\n        get { return this.val; }\n        set { this.val = value; }\n      }\n\n      /// <summary>\n      /// 次のノード。\n      /// </summary>\n      public Node Next\n      {\n        get { return this.next; }\n        internal set { this.next = value; }\n      }\n\n      #endregion\n    }\n\n    #endregion\n    #region フィールド\n\n    Node first;\n\n    #endregion\n    #region 初期化\n\n    public ForwardLinkedList()\n    {\n      this.first = null;\n    }\n\n    #endregion\n    #region プロパティ\n\n    /// <summary>\n    /// リストの先頭ノード。\n    /// </summary>\n    public Node First\n    {\n      get { return this.first; }\n    }\n\n    /// <summary>\n    /// 要素の個数。\n    /// </summary>\n    public int Count\n    {\n      get\n      {\n        int i = 0;\n        for(Node n = this.first; n!=null; n=n.Next)\n          ++i;\n        return i;\n      }\n    }\n\n    #endregion\n      #region 挿入・削除\n\n      /// <summary>\n      /// ノード n の後ろに新しい要素を追加。\n      /// </summary>\n      /// <param name=\"n\">要素の挿入位置</param>\n      /// <param name=\"elem\">新しい要素</param>\n      /// <returns>新しく挿入されたノード</returns>\n      public Node InsertAfter(Node n, T elem)\n    {\n      Node m = new Node(elem, n.Next);\n      n.Next = m;\n      return m;\n    }\n\n    /// <summary>\n    /// 先頭に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"elem\">新しい要素</param>\n    /// <returns>新しく挿入されたノード</returns>\n    public Node InsertFirst(T elem)\n    {\n      Node m = new Node(elem, this.first);\n      this.first = m;\n      return m;\n    }\n\n    /// <summary>\n    /// ノード n の後ろの要素を削除。\n    /// </summary>\n    /// <param name=\"n\">要素の削除位置</param>\n    public void EraseAfter(Node n)\n    {\n      if (n != null && n.Next != null)\n        n.Next = n.Next.Next;\n    }\n\n    /// <summary>\n    /// ノード n の自身を削除。\n    /// </summary>\n    /// <param name=\"n\">要素の削除位置</param>\n    /// <returns>削除した要素の次のノード</returns>\n    public Node Erase(Node n)\n    {\n      Node prev = this.first;\n      for (; prev != null && prev.Next != n; prev = prev.Next) ;\n      if (prev == this.first)\n      {\n        this.first = null;\n        return null;\n      }\n      if (prev != null)\n      {\n        this.EraseAfter(prev);\n        return prev.Next;\n      }\n      return null;\n    }\n\n    /// <summary>\n    /// 先頭の要素を削除。\n    /// </summary>\n    public void EraseFirst()\n    {\n      if (this.first != null)\n        this.first = this.first.Next;\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      for (Node n = this.first; n != null; n = n.Next)\n        yield return n.Value;\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/HashTable.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Collections\n{\n  /// <summary>\n  /// ハッシュテーブル。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  class HashTable<T> : ISet<T>\n  {\n    #region 内部クラス\n\n    class Node\n    {\n      internal T val;\n      internal Node next;\n\n      internal Node(T val, Node next)\n      {\n        this.val = val;\n        this.next = next;\n      }\n    }\n\n    #endregion\n    #region フィールド\n\n    Node[] table;\n    int mask;\n\n    #endregion\n    #region 初期化\n\n    public HashTable() : this(256) { }\n\n    public HashTable(int capacity)\n    {\n      capacity = Pow2((uint)capacity);\n      this.mask = capacity - 1;\n      this.table = new Node[capacity];\n    }\n\n    static int Pow2(uint n)\n    {\n      --n;\n      int p = 0;\n      for (; n != 0; n >>= 1) p = (p << 1) + 1;\n      return p + 1;\n    }\n\n    #endregion\n    #region 挿入・削除・検索\n\n    /// <summary>\n    /// 要素の挿入。\n    /// </summary>\n    /// <param name=\"elem\">挿入する要素</param>\n    public void Insert(T elem)\n    {\n      int code = elem.GetHashCode() & this.mask;\n      Node n = this.table[code];\n      Node m = new Node(elem, n);\n      m.next = n;\n      this.table[code] = m;\n    }\n\n    /// <summary>\n    /// 要素の削除。\n    /// </summary>\n    /// <param name=\"elem\">削除する要素</param>\n    public void Erase(T elem)\n    {\n      int code = elem.GetHashCode() & this.mask;\n      Node n = this.table[code];\n\n      if (n == null) return;\n      if (n.next == null)\n        this.table[code] = null;\n\n      while (n.next != null && n.next.val.Equals(elem)) n = n.next;\n      if(n.next != null)\n        n.next = n.next.next;\n    }\n\n    /// <summary>\n    /// テーブル中に要素が含まれているかどうか判別。\n    /// </summary>\n    /// <param name=\"elem\">探したい要素</param>\n    /// <returns>含まれていれば true</returns>\n    public bool Contains(T elem)\n    {\n      int code = elem.GetHashCode() & this.mask;\n      Node n = this.table[code];\n      while (n != null && !n.val.Equals(elem)) n = n.next;\n      return n != null;\n    }\n\n    /// <summary>\n    /// テーブル中の要素を検索。\n    /// </summary>\n    /// <param name=\"elem\">探したい要素</param>\n    /// <returns>含まれていればその要素を、なければ default(T)</returns>\n    public T Find(T elem)\n    {\n      int code = elem.GetHashCode();\n      Node n = this.table[code & this.mask];\n      while (n != null && !n.val.Equals(elem)) n = n.next;\n      if (n == null) return default(T);\n      return n.val;\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      for (int i = 0; i < this.table.Length; ++i)\n        for (Node n = this.table[i]; n != null; n = n.next)\n          yield return n.val;\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/LinkedList.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 双方向連結リスト。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  public class LinkedList<T> : IEnumerable<T>\n  {\n    #region 内部クラス\n\n    /// <summary>\n    /// 連結リストのノード。\n    /// </summary>\n    public class Node\n    {\n      #region フィールド\n\n      T val;\n      Node prev;\n      Node next;\n\n      #endregion\n      #region 初期化\n\n      internal Node(T val, Node prev, Node next)\n      {\n        this.val = val;\n        this.prev = prev;\n        this.next = next;\n      }\n\n      #endregion\n      #region プロパティ\n\n      /// <summary>\n      /// 格納している要素を取得。\n      /// </summary>\n      public T Value\n      {\n        get { return this.val; }\n        set { this.val = value; }\n      }\n\n      /// <summary>\n      /// 次のノード。\n      /// </summary>\n      public Node Next\n      {\n        get { return this.next; }\n        internal set { this.next = value; }\n      }\n\n      /// <summary>\n      /// 次のノード。\n      /// </summary>\n      public Node Previous\n      {\n        get { return this.prev; }\n        internal set { this.prev = value; }\n      }\n\n      #endregion\n    }\n\n    #endregion\n    #region フィールド\n\n    Node dummy;\n\n    #endregion\n    #region 初期化\n\n    public LinkedList()\n    {\n      this.dummy = new Node(default(T), null, null);\n      this.dummy.Next = this.dummy;\n      this.dummy.Previous = this.dummy;\n    }\n\n    #endregion\n    #region プロパティ\n\n    /// <summary>\n    /// リストの先頭ノード。\n    /// </summary>\n    public Node First\n    {\n      get { return this.dummy.Next; }\n    }\n\n    /// <summary>\n    /// リストの末尾ノード。\n    /// </summary>\n    public Node Last\n    {\n      get { return this.dummy.Previous; }\n    }\n\n    /// <summary>\n    /// リストの終端（末尾よりも後ろの番兵に当たるノード）。\n    /// </summary>\n    public Node End\n    {\n      get { return this.dummy; }\n    }\n\n    /// <summary>\n    /// 要素の個数。\n    /// </summary>\n    public int Count\n    {\n      get\n      {\n        int i = 0;\n        for (Node n = this.First; n != this.End; n = n.Next)\n          ++i;\n        return i;\n      }\n    }\n\n    #endregion\n    #region 挿入・削除\n\n    /// <summary>\n    /// ノード n の後ろに新しい要素を追加。\n    /// </summary>\n    /// <param name=\"n\">要素の挿入位置</param>\n    /// <param name=\"elem\">新しい要素</param>\n    /// <returns>新しく挿入されたノード</returns>\n    public Node InsertAfter(Node n, T elem)\n    {\n      Node m = new Node(elem, n, n.Next);\n      n.Next.Previous = m;\n      n.Next = m;\n      return m;\n    }\n\n    /// <summary>\n    /// ノード n の前に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"n\">要素の挿入位置</param>\n    /// <param name=\"elem\">新しい要素</param>\n    /// <returns>新しく挿入されたノード</returns>\n    public Node InsertBefore(Node n, T elem)\n    {\n      Node m = new Node(elem, n.Previous, n);\n      n.Previous.Next = m;\n      n.Previous = m;\n      return m;\n    }\n\n    /// <summary>\n    /// 先頭に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"elem\">新しい要素</param>\n    /// <returns>新しく挿入されたノード</returns>\n    public Node InsertFirst(T elem)\n    {\n      return this.InsertAfter(this.dummy, elem);\n    }\n\n    /// <summary>\n    /// 末尾に新しい要素を追加。\n    /// </summary>\n    /// <param name=\"elem\">新しい要素</param>\n    /// <returns>新しく挿入されたノード</returns>\n    public Node InsertLast(T elem)\n    {\n      return this.InsertBefore(this.dummy, elem);\n    }\n\n    /// <summary>\n    /// ノード n の自身を削除。\n    /// </summary>\n    /// <param name=\"n\">要素の削除位置</param>\n    /// <returns>削除した要素の次のノード</returns>\n    public Node Erase(Node n)\n    {\n      if (n == this.dummy)\n      {\n        return this.dummy;\n      }\n      n.Previous.Next = n.Next;\n      n.Next.Previous = n.Previous;\n      return n.Next;\n    }\n\n    /// <summary>\n    /// 先頭の要素を削除。\n    /// </summary>\n    public void EraseFirst()\n    {\n      this.Erase(this.First);\n    }\n\n    /// <summary>\n    /// 末尾の要素を削除。\n    /// </summary>\n    public void EraseLast()\n    {\n      this.Erase(this.Last);\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      for (Node n = this.First; n != this.End; n = n.Next)\n        yield return n.Value;\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/PriorityQueue.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Collections\n{\n  /// <summary>\n  /// 優先度付き待ち行列\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  class PriorityQueue<T>\n    where T : IComparable<T>\n  {\n    #region フィールド\n\n    ArrayList<T> buffer;\n\n    #endregion\n    #region 初期化\n\n    public PriorityQueue() { this.buffer = new ArrayList<T>(); }\n    public PriorityQueue(int capacity) { this.buffer = new ArrayList<T>(capacity); }\n\n    #endregion\n    #region ヒープ操作\n\n    /// <summary>\n    /// ヒープ化されている配列リストに新しい要素を追加する。\n    /// </summary>\n    /// <param name=\"array\">対象の配列リスト</param>\n    static void PushHeap(ArrayList<T> array, T elem)\n    {\n      int n = array.Count;\n      array.InsertLast(elem);\n\n      while (n != 0)\n      {\n        int i = (n - 1) / 2;\n        if (array[n].CompareTo(array[i]) > 0)\n        {\n          T tmp = array[n]; array[n] = array[i]; array[i] = tmp;\n        }\n        n = i;\n      }\n    }\n\n    /// <summary>\n    /// ヒープから最大値を削除する。\n    /// </summary>\n    /// <param name=\"array\">対象の配列リスト</param>\n    static void PopHeap(ArrayList<T> array)\n    {\n      int n = array.Count - 1;\n      array[0] = array[n];\n      array.EraseLast();\n\n      for (int i = 0, j; (j = 2 * i + 1) < n; )\n      {\n        if ((j != n - 1) && (array[j].CompareTo(array[j + 1]) < 0))\n          j++;\n        if (array[i].CompareTo(array[j]) < 0)\n        {\n          T tmp = array[j]; array[j] = array[i]; array[i] = tmp;\n        }\n        i = j;\n      }\n    }\n\n    #endregion\n    #region 要素の挿入・削除\n\n    /// <summary>\n    /// 要素のプッシュ。\n    /// </summary>\n    /// <param name=\"elem\">挿入したい要素</param>\n    public void Push(T elem)\n    {\n      PushHeap(this.buffer, elem);\n    }\n\n    /// <summary>\n    /// 要素を1つポップ。\n    /// </summary>\n    /// <remarks>\n    /// 今回の実装では、先頭要素の読み出しと削除は別に行う。\n    /// この Pop では削除のみ。\n    /// 読み出しには Top プロパティを使う。\n    /// </remarks>\n    public void Pop()\n    {\n      PopHeap(this.buffer);\n    }\n\n    /// <summary>\n    /// 先頭要素の読み出し。\n    /// </summary>\n    public T Top\n    {\n      get { return this.buffer[0]; }\n    }\n\n    public int Count\n    {\n      get { return this.buffer.Count; }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/Queue.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Collections\n{\n  /// <summary>\n  /// スタック（FILOバッファ）。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  class Queue<T>\n  {\n    #region フィールド\n\n    CircularBuffer<T> buffer;\n\n    #endregion\n    #region 初期化\n\n    public Queue() { this.buffer = new CircularBuffer<T>(); }\n    public Queue(int capacity) { this.buffer = new CircularBuffer<T>(capacity); }\n\n    #endregion\n    #region 要素の挿入・削除\n\n    /// <summary>\n    /// 要素のエンキュー。\n    /// </summary>\n    /// <param name=\"elem\">挿入したい要素</param>\n    /// <remarks>\n    /// 名前は Stack に合わせて Push にしてある。\n    /// </remarks>\n    public void Push(T elem)\n    {\n      this.buffer.InsertLast(elem);\n    }\n\n    /// <summary>\n    /// 要素を1つデキュー。\n    /// </summary>\n    /// <remarks>\n    /// 名前は Stack に合わせて Pop にしてある。\n    /// 今回の実装では、先頭要素の読み出しと削除は別に行う。\n    /// この Pop では削除のみ。\n    /// 読み出しには Top プロパティを使う。\n    /// </remarks>\n    public void Pop()\n    {\n      this.buffer.EraseFirst();\n    }\n\n    /// <summary>\n    /// 先頭要素の読み出し。\n    /// </summary>\n    public T Top\n    {\n      get { return this.buffer[0]; }\n    }\n\n    public int Count\n    {\n      get { return this.buffer.Count; }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/Set.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Collections\n{\n  /// <summary>\n  /// セット。\n  /// 数学で「集合」と呼ぶ奴。\n  /// 要素の順序には意味がなくて、要素が含まれているかどうかだけが問題。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  interface ISet<T> : IEnumerable<T>\n  {\n    void Insert(T elem);\n    void Erase(T elem);\n    bool Contains(T elem);\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/Sort.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nstatic class Sort\n{\n  #region common\n\n  /// <summary>\n  /// a と b の中身を入れ替える。\n  /// </summary>\n  /// <param name=\"a\">オペランドa</param>\n  /// <param name=\"b\">オペランドb</param>\n  public static void Swap<T>(ref T a, ref T b)\n  {\n    T c = a; a = b; b = c;\n  }\n\n  #endregion\n  #region O(n^2) ソート\n\n  /// <summary>\n  /// バブルソート。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  public static void BubbleSort<T>(T[] a)\n    where T : IComparable<T>\n  {\n    int n = a.Length;\n    for (int i = 0; i < n - 1; i++)\n      for (int j = n - 1; j > i; j--)\n        if (a[j].CompareTo(a[j - 1]) < 0)\n          Swap(ref a[j], ref a[j - 1]);\n  }\n\n  /// <summary>\n  /// 選択ソート。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  public static void SelectSort<T>(T[] a)\n    where T : IComparable<T>\n  {\n    int n = a.Length;\n    for (int i = 0; i < n; i++)\n      for (int j = 1; j < n - i; j++)\n        if (a[j - 1].CompareTo(a[j]) > 0)\n          Swap(ref a[j - 1], ref a[j]);\n  }\n\n  /// <summary>\n  /// 挿入ソート。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  public static void InsertSort<T>(T[] a)\n    where T : IComparable<T>\n  {\n    int n = a.Length;\n    for (int i = 1; i < n; i++)\n      for (int j = i; j >= 1 && a[j - 1].CompareTo(a[j]) > 0; --j )\n        Swap(ref a[j], ref a[j - 1]);\n  }\n\n  /// <summary>\n  /// シェルソート。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  public static void ShellSort<T>(T[] a)\n    where T : IComparable<T>\n  {\n    int n = a.Length;\n    int h;\n    for (h = 1; h < n / 9; h = h * 3 + 1) ;\n    for (; h > 0; h /= 3)\n      for (int i = h; i < n; i++)\n        for (int j = i; j >= h && a[j - h].CompareTo(a[j]) > 0; j -= h)\n          Swap(ref a[j], ref a[j - h]);\n  }\n\n  #endregion\n  #region クイックソート・マージソート準備\n\n  /// <summary>\n  /// クイックソートやマージソート → 挿入ソートに切り替える配列長の閾値。\n  /// </summary>\n  const int THREASHOLD = 64;\n\n  /// <summary>\n  /// 挿入ソート。\n  /// 配列のどこからどこまでをソートするかを指定するバージョン。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  /// <param name=\"first\">ソート対象の先頭インデックス</param>\n  /// <param name=\"last\">ソート対象の末尾インデックス</param>\n  static void InsertSort<T>(T[] a, int first, int last)\n    where T : IComparable<T>\n  {\n    for (int i = first + 1; i <= last; i++)\n      for (int j = i; j > first && a[j - 1].CompareTo(a[j]) > 0; --j)\n        Swap(ref a[j], ref a[j - 1]);\n  }\n\n  #endregion\n  #region クイックソート\n\n  /// <summary>\n  /// クイックソート。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  public static void QuickSort<T>(T[] a)\n    where T : IComparable<T>\n  {\n    QuickSort(a, 0, a.Length - 1);\n  }\n\n  /// <summary>\n  /// クイックソート本体。\n  /// 配列のどこからどこまでをソートするかを指定するバージョン。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  /// <param name=\"first\">ソート対象の先頭インデックス</param>\n  /// <param name=\"last\">ソート対象の末尾インデックス</param>\n  static void QuickSort<T>(T[] a, int first, int last)\n    where T : IComparable<T>\n  {\n    // 要素数が少なくなってきたら挿入ソートに切り替え\n    if (last - first < THREASHOLD)\n    {\n      InsertSort(a, first, last);\n      return;\n    }\n\n    // 枢軸決定（配列の先頭、ど真ん中、末尾の3つの値の中央値を使用。）\n    T pivot = Median(a[first], a[(first + last) / 2], a[last]);\n\n    // 左右分割\n    int l = first;\n    int r = last;\n\n\t  while(l <= r)\n\t  {\n      while (l < last && a[l].CompareTo(pivot) < 0) l++;\n      while (r > first && a[r].CompareTo(pivot) >= 0) r--;\n      if (l > r) break;\n      Swap(ref a[l], ref a[r]);\n      l++; r--;\n    }\n\n    // 再帰呼び出し\n    QuickSort(a, first, l-1);\n    QuickSort(a, l, last);\n  }\n\n  /// <summary>\n  /// 3つの値の中央値を求める。\n  /// </summary>\n  /// <param name=\"a\">オペランドa</param>\n  /// <param name=\"b\">オペランドb</param>\n  /// <param name=\"c\">オペランドc</param>\n  /// <returns>中央値</returns>\n  static T Median<T>(T a, T b, T c)\n    where T : IComparable<T>\n  {\n    if (a.CompareTo(b) > 0) Swap(ref a, ref b);\n    if (a.CompareTo(c) > 0) Swap(ref a, ref c);\n    if (b.CompareTo(c) > 0) Swap(ref b, ref c);\n    return b;\n  }\n\n  #endregion\n  #region ヒープソート\n\n  /// <summary>\n  /// ヒープソート。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  public static void HeapSort<T>(T[] a)\n    where T : IComparable<T>\n  {\n    for (int i = 1; i < a.Length; ++i)\n      MakeHeap(a, i);\n    for (int i = a.Length - 1; i >= 0; --i)\n      a[i] = PopHeap(a, i);\n  }\n\n  /// <summary>\n  /// 配列をヒープ化する。\n  /// n - 1 番目までの要素は既にヒープ化されていることを仮定して、\n  /// n 番目の要素をヒープに追加。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  /// <param name=\"n\">要素数</param>\n  static void MakeHeap<T>(T[] a, int n)\n    where T : IComparable<T>\n  {\n    while (n != 0)\n    {\n      int i = (n - 1) / 2;\n      if (a[n].CompareTo(a[i]) > 0) Swap(ref a[n], ref a[i]);\n      n = i;\n    }\n  }\n\n  /// <summary>\n  /// ヒープから最大値を取り出す。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  /// <param name=\"n\">要素数 - 1</param>\n  /// <returns>取り出した最大値</returns>\n  static T PopHeap<T>(T[] a, int n)\n    where T : IComparable<T>\n  {\n    T max = a[0];\n\n    a[0] = a[n];\n\n    for (int i=0, j; (j = 2 * i + 1) < n; )\n    {\n      if ((j != n - 1) && (a[j].CompareTo(a[j + 1]) < 0)) j++;\n      if (a[i].CompareTo(a[j]) < 0) Swap(ref a[i], ref a[j]);\n      i = j;\n    }\n\n    return max;\n  }\n\n  #endregion\n  #region マージソート\n\n  /// <summary>\n  /// マージソート。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  public static void MergeSort<T>(T[] a)\n    where T : IComparable<T>\n  {\n    T[] work = new T[a.Length / 2];\n    MergeSort(a, 0, a.Length, work);\n  }\n\n  /// <summary>\n  /// マージソート。\n  /// 配列のどこからどこまでをソートするかを指定するバージョン。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  /// <param name=\"begin\">ソート対象部分の先頭</param>\n  /// <param name=\"end\">ソート対象部分の末尾＋1</param>\n  /// <param name=\"work\">作業領域。a の 1/2 のサイズが必要。</param>\n  static void MergeSort<T>(T[] a, int begin, int end, T[] work)\n    where T : IComparable<T>\n  {\n    if (end - begin < THREASHOLD)\n    {\n      InsertSort(a, begin, end - 1);\n      return;\n    }\n\n    int mid = (begin + end) / 2;\n    MergeSort(a, begin, mid, work);\n    MergeSort(a, mid, end, work);\n    Merge(a, begin, mid, end, work);\n  }\n\n  /// <summary>\n  /// 配列 a の、[begin, mid) の部分と [mid, end) の部分をマージ。\n  /// </summary>\n  /// <typeparam name=\"T\"></typeparam>\n  /// <param name=\"a\">マージ対象の配列</param>\n  /// <param name=\"begin1\">aの先頭</param>\n  /// <param name=\"mid\">aの分割点</param>\n  /// <param name=\"end\">aの末尾＋1</param>\n  /// <param name=\"work\">作業領域</param>\n  static void Merge<T>(T[] a, int begin, int mid, int end, T[] work)\n    where T : IComparable<T>\n  {\n    int i, j, k;\n\n    for (i = begin, j = 0; i != mid; ++i, ++j) work[j] = a[i];\n\n    mid -= begin;\n    for (j = 0, k = begin; i != end && j != mid; ++k)\n    {\n      if (a[i].CompareTo(work[j]) < 0)\n      {\n        a[k] = a[i];\n        ++i;\n      }\n      else\n      {\n        a[k] = work[j];\n        ++j;\n      }\n    }\n\n    for (; i < end; ++i, ++k) a[k] = a[i];\n    for (; j < mid; ++j, ++k) a[k] = work[j];\n  }\n\n  #endregion\n  #region バケットソート\n\n  /// <summary>\n  /// [0, max] の範囲の整数をバケットソート。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  /// <param name=\"max\">配列 a 中の最大値</param>\n  public static void BucketSort(int[] a, int max)\n  {\n    // バケツを用意\n    int[] bucket = new int[max + 1];\n\n    // バケツに値を入れる\n    for (int i = 0; i < a.Length; ++i) ++bucket[a[i]];\n\n    // バケツ中の値の結合\n    for (int j = 0, i = 0; j < bucket.Length; ++j)\n      for (int k = bucket[j]; k != 0; --k, ++i)\n        a[i] = j;\n  }\n\n  /// <summary>\n  /// [0, max] の範囲の整数をキーに持つデータ構造をバケットソート。\n  /// </summary>\n  /// <typeparam name=\"T\">値の型</typeparam>\n  /// <param name=\"a\">対象の配列</param>\n  /// <param name=\"max\">キーの最大値</param>\n  public static void BucketSort<T>(KeyValuePair<int, T>[] a, int max)\n  {\n    // バケツを用意\n    List<T>[] bucket = new List<T>[max + 1];\n\n    // バケツに値を入れる\n    for (int i = 0; i < a.Length; ++i)\n    {\n      if (bucket[a[i].Key] == null) bucket[a[i].Key] = new List<T>();\n      bucket[a[i].Key].Add(a[i].Value);\n    }\n\n    // バケツ中の値の結合\n    for (int j = 0, i = 0; j < bucket.Length; ++j)\n     if(bucket[j] != null)\n       foreach (T val in bucket[j])\n         a[i++] = new KeyValuePair<int, T>(j, val);\n  }\n\n  #endregion\n  #region 基数ソート\n\n  /// <summary>\n  /// 基数ソート。\n  /// 概念説明用の簡易版。\n  /// 10進数で3桁(0～999)までしかソートできない。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  /// <param name=\"max\">配列 a 中の最大値</param>\n  public static void RadixSort10(int[] a)\n  {\n    // バケツを用意\n    List<int>[] bucket = new List<int>[10];\n\n    for (int d = 0, r = 1; d < 3; ++d, r *= 10)\n    {\n      // バケツに値を入れる\n      for (int i = 0; i < a.Length; ++i)\n      {\n        int key = (a[i] / r) % 10; // a[i] の d 桁目だけを取り出す。\n        if (bucket[key] == null) bucket[key] = new List<int>();\n        bucket[key].Add(a[i]);\n      }\n\n      // バケツ中の値の結合\n      for (int j = 0, i = 0; j < bucket.Length; ++j)\n        if (bucket[j] != null)\n          foreach (int val in bucket[j])\n            a[i++] = val;\n\n      // バケツを一度空にする\n      for (int j = 0; j < bucket.Length; ++j)\n        bucket[j] = null;\n    }\n  }\n\n  /// <summary>\n  /// 基数ソート。\n  /// </summary>\n  /// <param name=\"a\">対象の配列</param>\n  /// <param name=\"max\">配列 a 中の最大値</param>\n  public static void RadixSort(int[] a)\n  {\n    // バケツを用意\n    List<int>[] bucket = new List<int>[256];\n\n    for (int d = 0, logR = 0; d < 4; ++d, logR += 8)\n    {\n      // バケツに値を入れる\n      for (int i = 0; i < a.Length; ++i)\n      {\n        int key = (a[i] >> logR) & 255; // a[i] を256進 d 桁目だけを取り出す。\n        if (bucket[key] == null) bucket[key] = new List<int>();\n        bucket[key].Add(a[i]);\n      }\n\n      // バケツ中の値の結合\n      for (int j = 0, i = 0; j < bucket.Length; ++j)\n        if (bucket[j] != null)\n          foreach (int val in bucket[j])\n            a[i++] = val;\n\n      // バケツを一度空にする\n      for (int j = 0; j < bucket.Length; ++j)\n        bucket[j] = null;\n    }\n  }\n\n  #endregion\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/SortedArray.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace Collections\n{\n  /// <summary>\n  /// ソート済み配列。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  /// <remarks>\n  /// 2分探索できるので、検索は O(log n)。\n  /// ソート済みの状態を保つため、要素の挿入・削除には O(n) 必要。\n  /// </remarks>\n  class SortedArray<T> : ISet<T>\n    where T: IComparable<T>\n  {\n    #region フィールド\n\n    ArrayList<T> buffer;\n\n    #endregion\n    #region 初期化\n\n    public SortedArray() : this(256) { }\n\n    public SortedArray(int capacity)\n    {\n      this.buffer = new ArrayList<T>(capacity);\n    }\n\n    #endregion\n    #region 要素の挿入・削除・検索\n\n    /// <summary>\n    /// 要素の挿入。\n    /// </summary>\n    /// <param name=\"elem\">挿入する要素</param>\n    public void Insert(T elem)\n    {\n      if (this.buffer.Count == 0)\n      {\n        this.buffer.InsertLast(elem);\n        return;\n      }\n\n      int r = this.buffer.Count - 1;\n      int l = 0;\n      int comp;\n      while (l < r)\n      {\n        int m = (r + l) >> 1;\n        comp = this.buffer[m].CompareTo(elem);\n        if (comp > 0) r = m - 1;\n        else if (comp < 0) l = m + 1;\n        else return; // 重複不可\n      }\n\n      comp = this.buffer[l].CompareTo(elem);\n      if(comp < 0)\n        this.buffer.Insert(l + 1, elem);\n      else if(comp > 0)\n        this.buffer.Insert(l, elem);\n    }\n\n    /// <summary>\n    /// 要素の検索。\n    /// </summary>\n    /// <param name=\"elem\">検索する要素</param>\n    /// <returns>要素の位置（見つからなかった場合、配列長）</returns>\n    public int IndexOf(T elem)\n    {\n      if (this.buffer.Count == 0)\n        return 0;\n\n      int r = this.buffer.Count - 1;\n      int l = 0;\n      while (l < r)\n      {\n        int m = (r + l) >> 1;\n        int comp = this.buffer[m].CompareTo(elem);\n        if (comp > 0) r = m - 1;\n        else if (comp < 0) l = m + 1;\n        else return m;\n      }\n\n      if(this.buffer[l].CompareTo(elem) == 0)\n        return l;\n      return this.buffer.Count;\n    }\n\n    /// <summary>\n    /// テーブル中に要素が含まれているかどうか判別。\n    /// </summary>\n    /// <param name=\"elem\">探したい要素</param>\n    /// <returns>含まれていれば true</returns>\n    public bool Contains(T elem)\n    {\n      return this.IndexOf(elem) != this.buffer.Count;\n    }\n\n    /// <summary>\n    /// テーブル中の要素を検索。\n    /// </summary>\n    /// <param name=\"elem\">探したい要素</param>\n    /// <returns>含まれていればその要素を、なければ default(T)</returns>\n    public T Find(T elem)\n    {\n      int i = this.IndexOf(elem);\n      if (i == this.buffer.Count)\n        return default(T);\n      return this.buffer[i];\n    }\n\n    /// <summary>\n    /// 要素の削除。\n    /// </summary>\n    /// <param name=\"elem\">削除する要素</param>\n    public void Erase(T elem)\n    {\n      int i = this.IndexOf(elem);\n      if (i < this.buffer.Count)\n        this.buffer.Erase(i);\n    }\n\n    #endregion\n    #region IEnumerable<T> メンバ\n\n    public IEnumerator<T> GetEnumerator()\n    {\n      for (int i = 0; i < this.buffer.Count; ++i)\n        yield return this.buffer[i];\n    }\n\n    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()\n    {\n      return this.GetEnumerator();\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/algorithm/src/Stack.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Collections\n{\n  /// <summary>\n  /// スタック（FILOバッファ）。\n  /// </summary>\n  /// <typeparam name=\"T\">要素の型</typeparam>\n  class Stack<T>\n  {\n    #region フィールド\n\n    ArrayList<T> buffer;\n\n    #endregion\n    #region 初期化\n\n    public Stack() { this.buffer = new ArrayList<T>(); }\n    public Stack(int capacity) { this.buffer = new ArrayList<T>(capacity); }\n\n    #endregion\n    #region 要素の挿入・削除\n\n    /// <summary>\n    /// 要素のプッシュ。\n    /// </summary>\n    /// <param name=\"elem\">挿入したい要素</param>\n    public void Push(T elem)\n    {\n      this.buffer.InsertLast(elem);\n    }\n\n    /// <summary>\n    /// 要素を1つポップ。\n    /// </summary>\n    /// <remarks>\n    /// 今回の実装では、先頭要素の読み出しと削除は別に行う。\n    /// この Pop では削除のみ。\n    /// 読み出しには Top プロパティを使う。\n    /// </remarks>\n    public void Pop()\n    {\n      this.buffer.EraseLast();\n    }\n\n    /// <summary>\n    /// 先頭要素の読み出し。\n    /// </summary>\n    public T Top\n    {\n      get { return this.buffer[this.buffer.Count - 1]; }\n    }\n\n    public int Count\n    {\n      get { return this.buffer.Count; }\n    }\n\n    #endregion\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/common/ads",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<content>\n<!-- 広告コラム -->\n\n<div style=\"text-align:center;\">\n\n\n<!-- Amazon お任せ \n<div style=\"margin-top:10pt;\">\n<script type=\"text/javascript\"><![CDATA[\n\namazon_ad_tag = \"cunflc-22\";\namazon_ad_width = \"160\"; amazon_ad_height = \"600\";\namazon_ad_logo = \"hide\"; amazon_ad_link_target = \"new\";\namazon_color_border = \"CCCCFF\"; amazon_color_link = \"2B91AF\"; amazon_color_price = \"A31515\";\n]]></script>\n\n<script type=\"text/javascript\" src=\"http://www.assoc-amazon.jp/s/ads.js\"></script>\n</div>\n-->\n\n<!-- Ads by Google -->\n<div style=\"margin-top:10pt;\">\n<script type=\"text/javascript\"\n  src=\"../common/googlecolor.js\">\n</script>\n<script type=\"text/javascript\"><![CDATA[\ngoogle_ad_client = \"pub-0946654941616827\";\ngoogle_ad_slot = \"5079031097\";\ngoogle_ad_width = 160;\ngoogle_ad_height = 600;\n]]>\n</script>\n<script type=\"text/javascript\"\nsrc=\"http://pagead2.googlesyndication.com/pagead/show_ads.js\">\n</script>\n</div>\n\n<!-- Amazon お気に入りウィジェット - 自著 -->\n<div style=\"margin-top:10pt;\">\n<SCRIPT charset=\"utf-8\" type=\"text/javascript\" src=\"http://ws.amazon.co.jp/widgets/q?rt=tf_mfw&amp;ServiceVersion=20070822&amp;MarketPlace=JP&amp;ID=V20070822/JP/cunflc-22/8001/d4869e13-8d5a-43b3-bdd0-f8372da0ca84\"> </SCRIPT> <NOSCRIPT><A HREF=\"http://ws.amazon.co.jp/widgets/q?rt=tf_mfw&amp;ServiceVersion=20070822&amp;MarketPlace=JP&amp;ID=V20070822%2FJP%2Fcunflc-22%2F8001%2Fd4869e13-8d5a-43b3-bdd0-f8372da0ca84&amp;Operation=NoScript\">Amazon.co.jp ウィジェット</A></NOSCRIPT>\n</div>\n\n<!-- Google AdSense リンクユニット -->\n<div style=\"margin-top:10pt;\">\n<script type=\"text/javascript\"\n  src=\"../common/googlecolor.js\">\n</script>\n<script type=\"text/javascript\"><![CDATA[\ngoogle_ad_client = \"pub-0946654941616827\";\ngoogle_ad_slot = \"8981007993\";\ngoogle_ad_width = 160;\ngoogle_ad_height = 90;\n]]></script>\n<script type=\"text/javascript\"\n  src=\"http://pagead2.googlesyndication.com/pagead/show_ads.js\">\n</script>\n</div>\n\n</div>\n\n</content>\n"
  },
  {
    "path": "Chapters/ufcpp2000/common/footer",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<content>\n<!-- 本文フッタ -->\n\n<!-- Windows Live Translation -->\n<div id=\"MicrosoftTranslatorWidget\" style=\"width: 360px; min-height: 57px; border-color: #404040; background-color: #A0A0A0;\"><noscript><a href=\"http://www.microsofttranslator.com/bv.aspx?a=http%3a%2f%2fufcpp.net%2f\">このページを翻訳します</a><br />提供: <a href=\"http://www.microsofttranslator.com\">Microsoft® Translator</a></noscript></div> <script type=\"text/javascript\"> /* <![CDATA[ */ setTimeout(function() { var s = document.createElement(\"script\"); s.type = \"text/javascript\"; s.charset = \"UTF-8\"; s.src = \"http://www.microsofttranslator.com/Ajax/V2/Widget.aspx?mode=notify&from=ja&layout=ts\"; var p = document.getElementsByTagName('head')[0] || document.documentElement; p.insertBefore(s, p.firstChild); }, 0); /* ]]> */ </script>\n\n<p class=\"foot\">\n<a href=\"http://ufcpp.net/index.html#contact\" accesskey=\"q\">[お問い合わせ](<span class=\"accesskey\">q</span>)</a>\n</p>\n\n</content>\n"
  },
  {
    "path": "Chapters/ufcpp2000/common/googlecolor.js",
    "content": "google_color_border = \"ccccff\";\ngoogle_color_bg = \"eeeeff\";\ngoogle_color_link = [\"3333cc\", \"883366\", \"338833\"];\ngoogle_color_text = \"000000\";\ngoogle_color_url = \"006666\";\n"
  },
  {
    "path": "Chapters/ufcpp2000/common/header",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<content>\n<!-- 本文ヘッダ -->\n\n<p class=\"head\">\n\n<a href=\"../../index.html\"><img src=\"../common/sitelogo.jpg\" width=\"450\" height=\"65\" alt=\"++C++; // 未確認飛行 C\" /></a>\n\n<a href=\"http://www.atmarkit.co.jp/fdotnet/chushin/introsl_04/introsl_04_01.html\"><img src=\"../common/sl.jpg\" width=\"64\" height=\"64\" alt=\"避けて通れない「非同期処理」を克服しよう\" /></a>\n\n<!--\n<a href=\"http://www.atmarkit.co.jp/fdotnet/chushin/xamlfamily_02/xamlfamily_02_01.html\"><img src=\"../common/wpf.jpg\" width=\"64\" height=\"64\" alt=\"MVVMパターンを使ったクロス・ターゲット開発\" /></a>\n<a href=\"http://www.atmarkit.co.jp/fdotnet/chushin/comparedataproc_01/comparedataproc_01_01.html\"><img src=\"../common/linq.jpg\" width=\"64\" height=\"64\" alt=\"データ処理の比較\" /></a>\n<a href=\"http://www.atmarkit.co.jp/fdotnet/chushin/introsl_03/introsl_03_01.html\"><img src=\"../common/sl.jpg\" width=\"64\" height=\"64\" alt=\"連載：次世代技術につながるSilverlight入門\" /></a>\n\n<a href=\"http://codezine.jp/article/detail/6019\"><img src=\"../common/cstan.jpg\" width=\"64\" height=\"64\" alt=\"C#たんと学ぶ／わりと硬派なソフトウェア開発講座 第2-2回「デスクトップアプリケーション」 \" /></a>\n<a href=\"http://codezine.jp/article/detail/6179\"><img src=\"../common/cstan.jpg\" width=\"64\" height=\"64\" alt=\"C#たんと学ぶ わりと硬派なソフトウェア開発講座 番外編「Windows Phone 7」 \" /></a>\n<a href=\"http://codezine.jp/article/detail/6411\"><img src=\"../common/cstan.jpg\" width=\"64\" height=\"64\" alt=\"C#たんと学ぶ／わりと硬派なソフトウェア開発講座 第3回「Webアプリケーション」（前編）\" /></a>\n\n<a href=\"http://www.atmarkit.co.jp/fdotnet/chushin/introwpf_11/introwpf_11_01.html\"><img src=\"../common/wpf.jpg\" width=\"64\" height=\"64\" alt=\"連載 WPF 入門\" /></a>\n-->\n\n</p>\n\n<!-- Ads Google -->\n<script type=\"text/javascript\"><![CDATA[\ngoogle_ad_client = \"ca-pub-0946654941616827\";\ngoogle_ad_slot = \"4805833742\";\ngoogle_ad_width = 728;\ngoogle_ad_height = 90;\n]]>\n</script>\n<script type=\"text/javascript\"\nsrc=\"http://pagead2.googlesyndication.com/pagead/show_ads.js\">\n</script>\n\n</content>\n"
  },
  {
    "path": "Chapters/ufcpp2000/common/ifooter",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<content>\n<!-- インデックスページフッタ -->\n\n<!-- Ads Google -->\n<script type=\"text/javascript\">\n<![CDATA[\n\ngoogle_ad_client = \"ca-pub-0946654941616827\";\n\n/* フッター用 */\n\ngoogle_ad_slot = \"1488236681\";\n\ngoogle_ad_width = 468;\ngoogle_ad_height = 60;\n\n]]>\n</script>\n\n<script type=\"text/javascript\"\nsrc=\"http://pagead2.googlesyndication.com/pagead/show_ads.js\">\n</script>\n\n\n<!-- Windows Live Translation -->\n<div id=\"MicrosoftTranslatorWidget\" style=\"width: 360px; min-height: 57px; border-color: #404040; background-color: #A0A0A0;\"><noscript><a href=\"http://www.microsofttranslator.com/bv.aspx?a=http%3a%2f%2fufcpp.net%2f\">このページを翻訳します</a><br />提供: <a href=\"http://www.microsofttranslator.com\">Microsoft® Translator</a></noscript></div> <script type=\"text/javascript\"> /* <![CDATA[ */ setTimeout(function() { var s = document.createElement(\"script\"); s.type = \"text/javascript\"; s.charset = \"UTF-8\"; s.src = \"http://www.microsofttranslator.com/Ajax/V2/Widget.aspx?mode=notify&from=ja&layout=ts\"; var p = document.getElementsByTagName('head')[0] || document.documentElement; p.insertBefore(s, p.firstChild); }, 0); /* ]]> */ </script> \n\n<!-- カウンタ -->\n<div style=\"font-size:80%;text-align:right;vertical-align:middle;\">\n<script type=\"text/javascript\">\n<![CDATA[\nvar format = \"総数: $1　今日: $2　昨日: $3\";\n]]>\n</script>\n<script type=\"text/javascript\" src=\"http://ufcpp.net/aspx/CounterJs.aspx\"> </script>\n<noscript>\n<p>\n総数: <img src=\"http://ufcpp.net/aspx/Counter.aspx\" width=\"60\" height=\"15\" alt=\"総アクセス数\" />\n</p>\n</noscript>\n</div>\n\n<p class=\"foot\">\n<a href=\"http://ufcpp.net/index.html#contact\" accesskey=\"q\">[お問い合わせ](<span class=\"accesskey\">q</span>)</a>\n</p>\n\n</content>\n"
  },
  {
    "path": "Chapters/ufcpp2000/common/iheader",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<content>\n\n<!-- インデックスページヘッダ -->\n<p class=\"head\">\n<a href=\"../../index.html\"><img src=\"../common/sitelogo.jpg\" width=\"450\" height=\"65\" alt=\"++C++; // 未確認飛行 C\" /></a>\n</p>\n\n<div style=\"padding:0pt; margin:0pt; position:relative; width:100%; text-align:center;\">\n\n\n<!-- Ads Google -->\n<script type=\"text/javascript\"><![CDATA[\ngoogle_ad_client = \"ca-pub-0946654941616827\";\ngoogle_ad_slot = \"4805833742\";\ngoogle_ad_width = 728;\ngoogle_ad_height = 90;\n]]>\n</script>\n<script type=\"text/javascript\"\nsrc=\"http://pagead2.googlesyndication.com/pagead/show_ads.js\">\n</script>\n\n</div>\n\n</content>\n"
  },
  {
    "path": "Chapters/ufcpp2000/common/mfooter",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<content>\n<!-- メニューフッタ -->\n\n<!-- カウンタ -->\n<div style=\"font-size:80%;text-align:right;vertical-align:middle;\">\n<script type=\"text/javascript\">\n<![CDATA[\nvar format = \"総数: $1\\n今日: $2\\n昨日: $3\";\n]]>\n</script>\n<script type=\"text/javascript\" src=\"http://ufcpp.net/aspx/CounterJs.aspx\">\n<![CDATA[ ]]>\n</script>\n<noscript>\n<p>\n総数: <img src=\"http://ufcpp.net/aspx/Counter.aspx\" width=\"60\" height=\"15\" alt=\"総アクセス数\" />\n</p>\n</noscript>\n</div>\n\n<!--\n<script type=\"text/javascript\"><![CDATA[\ngoogle_ad_client = \"pub-0946654941616827\";\n//120x600、作成日 07/12/28\ngoogle_ad_slot = \"8275478124\";\ngoogle_ad_width = 120;\ngoogle_ad_height = 600;\ngoogle_cpa_choice = \"\"; // on file\n]]></script>\n<script type=\"text/javascript\"\n  src=\"http://pagead2.googlesyndication.com/pagead/show_ads.js\">\n</script>\n-->\n\n<!-- Amazon おまかせリンク -->\n<!--\n<script type=\"text/javascript\">\n<![CDATA[\n  amazon_ad_tag = \"cunflc-22\";  amazon_ad_width = \"120\";  amazon_ad_height = \"600\";  amazon_ad_link_target = \"new\";\n]]>\n</script>\n<script type=\"text/javascript\" src=\"http://www.assoc-amazon.jp/s/ads.js\">\n<xsl:text> </xsl:text>\n</script>\n-->\n\n</content>\n"
  },
  {
    "path": "Chapters/ufcpp2000/common/mheader",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<content>\n<!-- メニューヘッダ -->\n\n<!-- Ads Google -->\n\n\n</content>\n"
  },
  {
    "path": "Chapters/ufcpp2000/common/underbody",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<content>\n<!-- 本分下、＜＜前 次＞＞ の直前-->\n\n<!-- Amazon 広告 -->\n<div>\n<script type=\"text/javascript\"><![CDATA[\n\n\namazon_ad_tag = \"cunflc-22\";\namazon_ad_width = \"728\"; amazon_ad_height = \"90\";\namazon_ad_link_target = \"new\"; amazon_color_link = \"2B91AF\"; amazon_color_price = \"A31515\";\n]]></script>\n\n<script type=\"text/javascript\" src=\"http://www.assoc-amazon.jp/s/ads.js\"></script>\n</div>\n\n</content>\n"
  },
  {
    "path": "Chapters/ufcpp2000/common/undermenu",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<content>\n<!-- メニュー下、本文前の欄 -->\n\n<!-- Ads by Google -->\n<script type=\"text/javascript\"><![CDATA[\ngoogle_ad_client = \"ca-pub-0946654941616827\";\ngoogle_ad_slot = \"3329100549\";\ngoogle_ad_width = 728;\ngoogle_ad_height = 90;\n]]>\n</script>\n<script type=\"text/javascript\"\nsrc=\"http://pagead2.googlesyndication.com/pagead/show_ads.js\">\n</script>\n<!-- Ads by Google -->\n\n</content>\n"
  },
  {
    "path": "Chapters/ufcpp2000/common/没/Live Search.txt",
    "content": "\nĂȂ̂ō폜Ac[o[B\n\n\n<!-- y[W -->\n<div style=\"padding:0pt; margin:0pt; position:relative; width:100%; text-align:right;\">\n\n<!-- Live Search -->\n<meta name=\"Search.WLSearchBox\" content=\"1.1, ja-JP\" />\n<div id=\"WLSearchBoxDiv\">\n<table cellpadding=\"0\" cellspacing=\"0\" style=\"width: 322px; display:inline;\"><tr id=\"WLSearchBoxPlaceholder\"><td style=\"width: 100%; border:solid 2px #4B7B9F;border-right-style: none;\"><input id=\"WLSearchBoxInput\" type=\"text\" value=\"&#x8aad;&#x307f;&#x8fbc;&#x307f;&#x4e2d;&#x2e;&#x2e;&#x2e;\" disabled=\"disabled\" style=\"padding:0;background-image: url(http://search.live.com//siteowner/s/siteowner/searchbox_background.png);background-position: right;background-repeat: no-repeat;height: 16px; width: 100%; border:none 0 Transparent\" /></td><td style=\"border:solid 2px #4B7B9F;\"><input id=\"WLSearchBoxButton\" type=\"image\" src=\"http://search.live.com//siteowner/s/siteowner/searchbutton_normal.png\" align=\"absBottom\" style=\"padding:0;border-style: none\" /></td></tr></table>\n\t<script type=\"text/javascript\" charset=\"utf-8\"><![CDATA[\n\tvar WLSearchBoxConfiguration=\n\t{\n\t\t\"global\":{\n\t\t\t\"serverDNS\":\"search.live.com\",\n\t\t\t\"market\":\"ja-JP\"\n\t\t},\n\t\t\"appearance\":{\n\t\t\t\"autoHideTopControl\":false,\n\t\t\t\"width\":600,\n\t\t\t\"height\":400,\n\t\t\t\"theme\":\"Blue\"\n\t\t},\n\t\t\"scopes\":[\n\t\t\t{\n\t\t\t\t\"type\":\"web\",\n\t\t\t\t\"caption\":\"&#x2b;&#x2b;&#x43;&#x2b;&#x2b;&#x3b;\",\n\t\t\t\t\"searchParam\":\"site:ufcpp.net\"\n\t\t\t}\n\t\t\t,\n\t\t\t{\n\t\t\t\t\"type\":\"web\",\n\t\t\t\t\"caption\":\"&#x30a6;&#x30a7;&#x30d6;\",\n\t\t\t\t\"searchParam\":\"\"\n\t\t\t}\n\t\t]\n\t}\n\t]]></script>\n\t<script type=\"text/javascript\" charset=\"utf-8\" src=\"http://search.live.com/bootstrap.js?market=ja-JP&amp;ServId=SearchBox&amp;ServId=SearchBoxWeb&amp;Callback=WLSearchBoxScriptReady\"></script>\n</div>\n\n<!-- Live Search -->\n\n</div>"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/demo/readme.md",
    "content": "# 旧demo置き場だったところ\n\n旧サイトのDemo、ごそっと消した。\nどうせ使われてない。xapとかClickOnceとかもう誰も…\n必要ならprivateな別リポジトリにデータあり。"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/dic/.htaccess",
    "content": "Redirect permanent /study/csharp/dic/reversedic.html http://ufcpp.net/study/csharp/ap_reverse.html\nRedirect permanent /study/csharp/dic/reversedic.xml http://ufcpp.net/study/csharp/ap_reverse.xml\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/dic/reversedic.css",
    "content": "body\n{\n\tcolor:#000000;\n\tbackground-color:#FFFFFF;\n}\n\nh1{font-size:140%; background-color:#ccccff; border:1pt solid #000000;padding-left:0.2em;}\nh2{font-size:120%; font-weight:normal; background-color:#ccccff; border:1pt solid #000000;padding-left:0.2em;}\nh3{font-size:110%; color:6a5acd;}\n\npre.dos{font-family:monospace; color:black; border:thin solid #ff9999; padding:0.2em 0em 0.2em 0.5em;}\n\nspan.keyword{color:#0000ff;}\nspan.string{color:#008080;}\nspan.comment{color:#008000;}\nspan.input{background-color:#ccffcc;}\n\nem{font-style:normal; font-weight:normal;background-color:#fff0f0;}\n\ntable{background:#333366;vertical-align:middle;}\ntable.noborder{background-color:transparent;}\ntr{vertical-align:middle;text-align:left;}\nth{padding:0.3em;margin:0pt;border:0pt;color:#000000;background-color:#99ccff;font-weight:normal;vertical-align:middle;text-align:left;}\ntd{padding:0.3em;margin:0pt;border:0pt;color:#000000;background-color:#ffffff;vertical-align:middle;text-align:left;}\n\na:link   {color:#3333cc;}\na:visited{color:#3333cc;}\na:active {color:#3333cc;}\na:hover  {color:#aa3333;}\n\np\n{\n\tpadding:0em;\n\tborder:none;\n\tmargin:0.2em;\n}\n\np.list\n{\n\tmargin:0.1em;\n\tpadding:0em;\n}\np.itemlist\n{\n\tmargin:0.1em 0.1em 0.1em 0.5em;\n\tpadding:0em;\n}\nspan.symbol\n{\n\tfont-size:60%;\n\tvertical-align:middle;\n}\ndiv.item\n{\n\tborder:ridge thin #ccccff;\n\tmargin:0.5em 0.5em 0em 0.5em;\n\tpadding:0em;\n}\nh2.q\n{\n\tbackground:#cceeff;\n\tborder:none 0pt;\n\tfont:normal normal 100%;\n\tmargin:0em;\n\tpadding:0.2em 0.2em 0.2em 0.2em;\n}\ndiv.a\n{\n\tbackground:#ffffff;\n\tmargin:0.1em;\n\tpadding:0.2em 0.2em 0.2em 0.5em;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/dic/reversedic.html",
    "content": "<html>\n  <head>\n    <META http-equiv=\"Content-Type\" content=\"text/html; charset=shift_jis\">\n    <link rel=\"stylesheet\" href=\"reversedic.css\">\n    <title>t</title>\n  </head>\n  <body>\n    <h1>C# t</h1>\n    <p class=\"list\"><a href=\"#c-01\"><span class=\"symbol\"></span></a> tH_</p>\n    <p class=\"list\"><a href=\"#c-02\"><span class=\"symbol\"></span></a> t@C</p>\n    <p class=\"list\"><a href=\"#c-03\"><span class=\"symbol\"></span></a> 񑀍</p>\n    <p class=\"list\"><a href=\"#c-04\"><span class=\"symbol\"></span></a> </p>\n    <p class=\"list\"><a href=\"#c-05\"><span class=\"symbol\"></span></a> o</p>\n    <p class=\"list\"><a href=\"#c-06\"><span class=\"symbol\"></span></a> </p>\n    <p class=\"list\"><a href=\"#c-07\"><span class=\"symbol\"></span></a> \\[X</p>\n    <p class=\"list\"><a href=\"#c-08\"><span class=\"symbol\"></span></a> lCeBuR[hƂ̑݉^p</p>\n    <p class=\"list\"><a href=\"#c-09\"><span class=\"symbol\"></span></a> VACY</p>\n    <p class=\"list\"><a href=\"#c-10\"><span class=\"symbol\"></span></a> Win32</p>\n    <p class=\"list\"><a href=\"#c-11\"><span class=\"symbol\"></span></a> GUI</p>\n    <p class=\"list\"><a href=\"#c-12\"><span class=\"symbol\"></span></a> c[</p>\n    <h2><a id=\"c-01\">tH_</a></h2>\n    <p class=\"itemlist\"><a href=\"#i-01-01\"><span class=\"symbol\"></span></a> vONtH_擾</p>\n    <p class=\"itemlist\"><a href=\"#i-01-02\"><span class=\"symbol\"></span></a> vOuĂtH_擾</p>\n    <p class=\"itemlist\"><a href=\"#i-01-03\"><span class=\"symbol\"></span></a> ȃtH_̃pX擾</p>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-01-01\">vONtH_擾</a></h2>\n      <div class=\"a\"><item name=\"vONtH_擾\">\n<p>\npX͋NtH_Ƃ΃pXɂȂ܂B\nāA<code>new DirectoryInfo(\".\");</code>\nŃvONtH_擾ł܂B\n</p>\n</item></div>\n    </div>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-01-02\">vOuĂtH_擾</a></h2>\n      <div class=\"a\"><item name=\"vOuĂtH_擾\">\n<p>\nvO̎st@CuĂtH_\n<code>Application.StartupPath</code> Ŏ擾ł܂B\n</p>\n</item></div>\n    </div>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-01-03\">ȃtH_̃pX擾</a></h2>\n      <div class=\"a\"><item name=\"ȃtH_̃pX擾\">\n<p>\n<code>System.Environment.GetFolderPath</code> 𗘗p邱Ƃ\nfXNgbv}ChLgȂǂ̓ȃtH_̃pX擾ł܂B\n</p>\n</item></div>\n    </div>\n    <h2><a id=\"c-02\">t@C</a></h2>\n    <p class=\"itemlist\"><a href=\"#i-02-01\"><span class=\"symbol\"></span></a> VtgJIS̃eLXgǂݏB</p>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-02-01\">VtgJIS̃eLXgǂݏB</a></h2>\n      <div class=\"a\"><item name=\"VtgJIS̃eLXgǂݏB\">\n<p>\nR[hw肵ăt@Cǂݏɂ́A\n<code>StreamReader/StreamWriter</code> NX̃RXgN^ <code>Encoding</code> NXnĂ܂B\n</p>\n<pre>\nStreamReader fin  = <span class=\"keyword\">new</span> StreamReader(<span class=\"string\">\"in file\"</span>, Encoding.GetEncoding(932));\nStreamWriter fout = <span class=\"keyword\">new</span> StreamWriter(<span class=\"string\">\"out file\"</span>, <span class=\"keyword\">false</span>, Encoding.GetEncoding(932));\n</pre>\n</item></div>\n    </div>\n    <h2><a id=\"c-03\">񑀍</a></h2>\n    <p class=\"itemlist\"><a href=\"#i-03-01\"><span class=\"symbol\"></span></a> stringVtgJISR[hbytezɕϊ</p>\n    <p class=\"itemlist\"><a href=\"#i-03-02\"><span class=\"symbol\"></span></a> K\\g</p>\n    <p class=\"itemlist\"><a href=\"#i-03-03\"><span class=\"symbol\"></span></a> EЉEǂׂ</p>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-03-01\">stringVtgJISR[hbytezɕϊ</a></h2>\n      <div class=\"a\"><item name=\"stringVtgJISR[hbytezɕϊ\">\n<p>\nR[h̎w <code>Encoding</code> NXpčs܂B\nVtgJIS̃R[hy[W 932 łB\n܂A{ Windows ł <code>Encoding.Default</code> ɂăVtgJIS̃GR[fBONX擾ł܂B\n</p>\n<pre>\nEncoding.GetEncoding(932).GetBytes(str);\nEncoding.Default.GetBytes(str);\n</pre>\n</item></div>\n    </div>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-03-02\">K\\g</a></h2>\n      <div class=\"a\"><item name=\"K\\g\">\n<p>\n<code>System.Text.RegularExpressions</code> NXp邱Ƃŕ̐K\\o܂B\n.NET Framework ̐K\\ Perl5 ̐K\\Ɛea̍fUCɂȂĂ܂B\n</p>\n<p>\nڂ̓wv́u<a href=\"ms-help://MS.NETFrameworkSDK.JA/cpguidenf/html/cpconcomregularexpressions.htm\">.NET Framework ̐K\\</a>vu<a href=\"ms-help://MS.NETFrameworkSDK.JA/cpgenref/html/cpconregularexpressionslanguageelements.htm\">K\\vf</a>vB\n</p>\n</item></div>\n    </div>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-03-03\">EЉEǂׂ</a></h2>\n      <div class=\"a\"><item name=\"EЉEǂׂ\">\n<p>\nK\\gĕ̃NX𒲂ׂB\n͕NX IsHiraganaɁA\nЉ IsKatakanaA IsCJKUnifiedIdeographs Ƀ}b`B\n</p>\n<pre>\nRegex hira  = new Regex(<span class=\"string\">@\"\\b\\p{IsHiragana}+\\b\"</span>);        <span class=\"comment\">// ȂPɃ}b`</span>\nRegex kata  = new Regex(<span class=\"string\">@\"\\p{IsKatakana}\"</span>);             <span class=\"comment\">// ЉɃ}b`</span>\nRegex kanji = new Regex(<span class=\"string\">@\"\\p{IsCJKUnifiedIdeographs}\"</span>); <span class=\"comment\">// Ƀ}b`</span>\n</pre>\n<p>\n̑ɂNXw肷邱Ƃł܂܂ȕNX\\B\nNX<a href=\"http://www.unicode.org/\">unicode.org</a>ɂ<a href=\"http://www.unicode.org/Public/UNIDATA/Blocks.txt\">ubNꗗ</a>̃ubNIs́B\n</p>\n</item></div>\n    </div>\n    <h2><a id=\"c-04\"></a></h2>\n    <p class=\"itemlist\"><a href=\"#i-04-01\"><span class=\"symbol\"></span></a> Cӌ`ŕ񂩂Ă鎞ǂ݂</p>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-04-01\">Cӌ`ŕ񂩂Ă鎞ǂ݂</a></h2>\n      <div class=\"a\"><item name=\"Cӌ`ŕ񂩂Ă鎞ǂ݂\">\n<p>\n<code>DateTime.ParseExact</code> \\bhŁA\nȉ̂悤ɂătH[}bgwB\n</p>\n<pre>\nstring str = \"08/Jul/2006:03:28:50 +0900\";\n\nDate d = DateTime.ParseExact(str,\n  \"d'/'MMM'/'yyyy':'HH':'mm':'ss zzz\",\n  System.Globalization.DateTimeFormatInfo.InvariantInfo,\n  System.Globalization.DateTimeStyles.None);\n</pre>\n</item></div>\n    </div>\n    <h2><a id=\"c-05\">o</a></h2>\n    <p class=\"itemlist\"><a href=\"#i-05-01\"><span class=\"symbol\"></span></a> C  printf ݂ɃtH[}bgo͂</p>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-05-01\">C  printf ݂ɃtH[}bgo͂</a></h2>\n      <div class=\"a\"><item name=\"C  printf ݂ɃtH[}bgo͂\">\n<p>\n<code>System.Console.Write(string, params object[])</code> g΃tH[}bgo͂\\łB\np[^͈̏ȉ̒ʂ\n</p>\n<pre>\n{N,M:format}\n</pre>\n<ul>\n<li><code>N</code>: p[^̃CfbNX</li>\n<li><code>M</code>: \\镝Bs̓Xy[XŖ߂B̐̏ꍇElA̐̏ꍇlB</li>\n<li><code>format</code>: wBp[^ <code>IFormattable</code> C^[tF[XĂꍇȀɏ]Đ`B</li>\n</ul>\n<p>\nڍׂ<a href=\"ms-help://MS.NETFrameworkSDK.JA/cpguidenf/html/cpconformattingoverview.htm\">wv</a>Ō邱Ƃo܂B\n</p>\n</item></div>\n    </div>\n    <h2><a id=\"c-06\"></a></h2>\n    <p class=\"itemlist\"><a href=\"#i-06-01\"><span class=\"symbol\"></span></a> C  scanf ݂ȂƂ</p>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-06-01\">C  scanf ݂ȂƂ</a></h2>\n      <div class=\"a\"><item name=\"C  scanf ݂ȂƂ\">\n<p>)</p>\n<pre>\nint width, height;\nscanf(\"width %d height %d\", &amp;width, &amp;height);\n</pre>\n<p>1)K\\g</p>\n<pre>\n<span class=\"keyword\">const string</span> pattern = @<span class=\"string\">\"height (?&lt;height&gt;\\w+) width (?&lt;width&gt;\\w+)\"</span>; \n\nRegex x = new Regex(pattern);\n<span class=\"keyword\">string</span> str = Console.ReadLine();\nMatch m = x.Match(str); \n\n<span class=\"keyword\">int</span> width = m.Group(<span class=\"string\">\"width\"</span>);\n<span class=\"keyword\">int</span> height = m.Group(<span class=\"string\">\"height\"</span>);\n</pre>\n<p>2) Split g</p>\n<pre>\n<span class=\"keyword\">string</span> str = Console.ReadLine();\n<span class=\"keyword\">sring</span> strs = str.Split(<span class=\"string\">' '</span>);\n<span class=\"keyword\">int</span> width = <span class=\"keyword\">int</span>.Parse(strs[1]);\n<span class=\"keyword\">int</span> height = <span class=\"keyword\">int</span>.Parse(strs[3]);\n</pre>\n</item></div>\n    </div>\n    <h2><a id=\"c-07\">\\[X</a></h2>\n    <p class=\"itemlist\"><a href=\"#i-07-01\"><span class=\"symbol\"></span></a> \\[Xt@C̍쐬</p>\n    <p class=\"itemlist\"><a href=\"#i-07-02\"><span class=\"symbol\"></span></a> \\[X̗p</p>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-07-01\">\\[Xt@C̍쐬</a></h2>\n      <div class=\"a\"><item name=\"\\[Xt@C̍쐬\">\n<pre>\n<span class=\"keyword\">using</span> System.Drawing;\n<span class=\"keyword\">using</span> System.Resources; \n\n<span class=\"keyword\">class</span> CreateResource\n{\n  <span class=\"keyword\">public static void</span> Main()\n  {\n    <span class=\"keyword\">using</span>(ResourceWriter writer = <span class=\"keyword\">new</span> ResourceWriter(<span class=\"input\">\"\\[Xt@C.resources\"</span>))\n    {\n      writer.AddResource(<span class=\"input\">\"\\[X\"</span>, <span class=\"keyword\">new</span> Icon(<span class=\"input\">\"t@C.ico\"</span>));\n      writer.Generate();\n    }\n  }\n}\n</pre>\n<p>\n̓RpC <code>/res</code> w肷邾B\n</p>\n</item></div>\n    </div>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-07-02\">\\[X̗p</a></h2>\n      <div class=\"a\"><item name=\"\\[X̗p\">\n<pre>\n  ResourceManager rm = <span class=\"keyword\">new</span> ResourceManager(<span class=\"input\">\"AZu\"</span>, <span class=\"keyword\">this</span>.GetType().Assembly);\n  <span class=\"keyword\">this</span>.Icon = (System.Drawing.Icon)rm.GetObject(<span class=\"input\">\"\\[X\"</span>);\n</pre>\n</item></div>\n    </div>\n    <h2><a id=\"c-08\">lCeBuR[hƂ̑݉^p</a></h2>\n    <p class=\"itemlist\"><a href=\"#i-08-01\"><span class=\"symbol\"></span></a> \\̂̃CAEg</p>\n    <p class=\"itemlist\"><a href=\"#i-08-02\"><span class=\"symbol\"></span></a> \\̂ C ̋p̂̂悤Ɏg</p>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-08-01\">\\̂̃CAEg</a></h2>\n      <div class=\"a\"><item name=\"\\̂̃CAEg\">\n<p>\n<code>System.Runtime.InteropServices.StructLayout</code> Agr[ggč\\̂̃CAEgwł܂B\n</p>\n<ul>\n<li><code>LayoutKind.Auto</code> c CAEg</li>\n<li><code>LayoutKind.Explicit</code> c <code>FieldOffset</code> Agr[ggĖIɃCAEg</li>\n<li><code>LayoutKind.Sequential</code> c 錾ɃCAEg</li>\n</ul>\n<p>\n<code>LayoutKind.Sequential</code> RXgN^ɓnꍇA\n<code>Pack</code> vpeBŃpbLOTCY𒲐ł܂B\nftHg <code>Pack</code> ̒l 8 łB\n</p>\n</item></div>\n    </div>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-08-02\">\\̂ C ̋p̂̂悤Ɏg</a></h2>\n      <div class=\"a\"><item name=\"\\̂ C ̋p̂̂悤Ɏg\">\n<p>\n\\̂̃CAEg <code>LayoutKind.Explicit</code> ɂ邱Ƃ\nC ̋p̂̂悤Ȏgo܂B\n</p>\n<pre>\n<span class=\"keyword\">using</span> System;\n<span class=\"keyword\">using</span> System.Runtime.InteropServices;\n\n[StructLayout(LayoutKind.Explicit)]\n<span class=\"keyword\">struct</span> Hoge\n{\n  [FieldOffset(0)] <span class=\"keyword\">public byt</span>e B;\n  [FieldOffset(0)] <span class=\"keyword\">public in</span>t N;\n} \n\n<span class=\"keyword\">class</span> Test \n{ \n  <span class=\"keyword\">public static void</span> Main() { \n    Hoge h = <span class=\"keyword\">new</span> Hoge(); \n    h.N = 257; \n\n    Console.WriteLine(h.B); <span class=\"comment\">// 1 \\</span>\n  } \n} \n</pre>\n</item></div>\n    </div>\n    <h2><a id=\"c-09\">VACY</a></h2>\n    <p class=\"itemlist\"><a href=\"#i-09-01\"><span class=\"symbol\"></span></a> IuWFNgVACY</p>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-09-01\">IuWFNgVACY</a></h2>\n      <div class=\"a\"><item name=\"IuWFNgVACY\">\n<ul>\n<li>oCi c System.Runtime.Serialization.Formatters.Binary.BinaryFormatter</li>\n<li>SOAPbZ[W c System.Runtime.Serialization.Formatters.Soap.SoapFormatter</li>\n<li>XM c System.Xml.Serialization.XmlSerializer</li>\n</ul>\n</item></div>\n    </div>\n    <h2><a id=\"c-10\">Win32</a></h2>\n    <p class=\"itemlist\"><a href=\"#i-10-01\"><span class=\"symbol\"></span></a> VXeCxgE</p>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-10-01\">VXeCxgE</a></h2>\n      <div class=\"a\"><item name=\"VXeCxgE\">\n<p>\n<code>Microsoft.Win32.SystemEvents</code> NX̃pubNCxgŕ\\ݒύXA̕ύXAsȂǂ̃CxgEB\n</p>\n</item></div>\n    </div>\n    <h2><a id=\"c-11\">GUI</a></h2>\n    <p class=\"itemlist\"><a href=\"#i-11-01\"><span class=\"symbol\"></span></a> Windows XP ̃rWAX^Cgp</p>\n    <p class=\"itemlist\"><a href=\"#i-11-02\"><span class=\"symbol\"></span></a> tH[̍ĕ`ʂ</p>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-11-01\">Windows XP ̃rWAX^Cgp</a></h2>\n      <div class=\"a\"><item name=\"Windows XP ̃rWAX^Cgp\">\n<p>\n}jtFXggp Comctl32.dll version 6 oCfBO悤ɐݒ肷B\n̓Iȕ@͈ȉ̒ʂB\n</p>\n<p>\nȉXMLu[st@C].manifestvƂOŕۑA\nst@CƓfBNgɒuB\n</p>\n<pre>\n\n&lt;?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?&gt;\n&lt;assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\"&gt;\n&lt;dependency&gt;\n   &lt;dependentAssembly&gt;\n     &lt;assemblyIdentity\n       type=\"win32\"\n       name=\"Microsoft.Windows.Common-Controls\"\n       version=\"6.0.0.0\"\n       processorArchitecture=\"X86\"\n       publicKeyToken=\"6595b64144ccf1df\"\n       language=\"*\"\n     /&gt;\n   &lt;/dependentAssembly&gt;\n&lt;/dependency&gt;\n&lt;/assembly&gt;\n</pre>\n<p>\n}jtFXgst@Cɖߍނ߂ɂ́A\n\\[X^CvuRT_MANIFESTvAIDu1ṽ\\[XƂĖߍށB\nVisual Studio .NET g΁Aȉ̎菇ŊȒPɃ}jtFXg̖ߍ݂oB\n</p>\n<ul>\n<li>j[[t@C][t@CJ]IсA}jtFXg𖄂ߍ݂st@CJB</li>\n<li>Jst@CENbN[\\[X̒ǉ]IсA[C|[g]NbNB</li>\n<li>ߍ݂}jtFXgt@CIԁB</li>\n<li>}jtFXg^Cv[RT_MANIFEST]Ɠ͂B</li>\n<li>ǉꂽ}jtFXg\\[X̃vpeBJAIDu1vɕύXB</li>\n</ul>\n</item></div>\n    </div>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-11-02\">tH[̍ĕ`ʂ</a></h2>\n      <div class=\"a\"><item name=\"tH[̍ĕ`ʂ\">\n<p>\nPaint CxggătH[̍ە`ʂsƕ`ʂĂ܂B\n(OnPait \\bhł́Awi̓hԂsĂ Paint CxgnhĂяo߁B)\nOnPaintBackground \\bhI[o[Chĕ`ʂs΂͂ȂȂB\n</p>\n</item></div>\n    </div>\n    <h2><a id=\"c-12\">c[</a></h2>\n    <p class=\"itemlist\"><a href=\"#i-12-01\"><span class=\"symbol\"></span></a> PreJIT ďoȂ́H</p>\n    <p class=\"itemlist\"><a href=\"#i-12-02\"><span class=\"symbol\"></span></a> t[̊J͂Ȃ́H</p>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-12-01\">PreJIT ďoȂ́H</a></h2>\n      <div class=\"a\"><item name=\"PreJIT ďoȂ́H\">\n<p>\nNgen.exe (native image generater)ŏo܂B\nڂ\n<a href=\"ms-help://MS.NETFrameworkSDK.JA/cptools/html/cpgrfnativeimagegeneratorngenexe.htm\">ms-help://MS.NETFrameworkSDK.JA/cptools/html/cpgrfnativeimagegeneratorngenexe.htm</a>QƂĂB\n</p>\n</item></div>\n    </div>\n    <div class=\"item\">\n      <h2 class=\"q\"><a id=\"i-12-02\">t[̊J͂Ȃ́H</a></h2>\n      <div class=\"a\"><item name=\"t[̊J͂Ȃ́H\">\n<p>\nhttps://sourceforge.jp/projects/sharpdevelop-jp\n</p>\n<p>\nVisual C# 2005 Express Edision ŗp\\ɂȂB\n</p>\n</item></div>\n    </div>\n  </body>\n</html>"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/dic/reversedic.xml",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_Jis\" ?>\n<?xml-stylesheet type=\"text/xsl\" href=\"reversedic.xsl\" ?>\n\n<ReverseDictionary>\n\n<category name=\"tH_\">\n<item name=\"vONtH_擾\">\n<p>\npX͋NtH_Ƃ΃pXɂȂ܂B\nāA<code>new DirectoryInfo(\".\");</code>\nŃvONtH_擾ł܂B\n</p>\n</item>\n<item name=\"vOuĂtH_擾\">\n<p>\nvO̎st@CuĂtH_\n<code>Application.StartupPath</code> Ŏ擾ł܂B\n</p>\n</item>\n<item name=\"ȃtH_̃pX擾\">\n<p>\n<code>System.Environment.GetFolderPath</code> 𗘗p邱Ƃ\nfXNgbv}ChLgȂǂ̓ȃtH_̃pX擾ł܂B\n</p>\n</item>\n</category>\n\n<category name=\"t@C\">\n<item name=\"VtgJIS̃eLXgǂݏB\">\n<p>\nR[hw肵ăt@Cǂݏɂ́A\n<code>StreamReader/StreamWriter</code> NX̃RXgN^ <code>Encoding</code> NXnĂ܂B\n</p>\n<pre>\nStreamReader fin  = <span class=\"keyword\">new</span> StreamReader(<span class=\"string\">\"in file\"</span>, Encoding.GetEncoding(932));\nStreamWriter fout = <span class=\"keyword\">new</span> StreamWriter(<span class=\"string\">\"out file\"</span>, <span class=\"keyword\">false</span>, Encoding.GetEncoding(932));\n</pre>\n</item>\n</category>\n\n<category name=\"񑀍\">\n<item name=\"stringVtgJISR[hbytezɕϊ\">\n<p>\nR[h̎w <code>Encoding</code> NXpčs܂B\nVtgJIS̃R[hy[W 932 łB\n܂A{ Windows ł <code>Encoding.Default</code> ɂăVtgJIS̃GR[fBONX擾ł܂B\n</p>\n<pre>\nEncoding.GetEncoding(932).GetBytes(str);\nEncoding.Default.GetBytes(str);\n</pre>\n</item>\n<item name=\"K\\g\">\n<p>\n<code>System.Text.RegularExpressions</code> NXp邱Ƃŕ̐K\\o܂B\n.NET Framework ̐K\\ Perl5 ̐K\\Ɛea̍fUCɂȂĂ܂B\n</p>\n<p>\nڂ̓wv́u<a href=\"ms-help://MS.NETFrameworkSDK.JA/cpguidenf/html/cpconcomregularexpressions.htm\">.NET Framework ̐K\\</a>vu<a href=\"ms-help://MS.NETFrameworkSDK.JA/cpgenref/html/cpconregularexpressionslanguageelements.htm\">K\\vf</a>vB\n</p>\n</item>\n<item name=\"EЉEǂׂ\">\n<p>\nK\\gĕ̃NX𒲂ׂB\n͕NX IsHiraganaɁA\nЉ IsKatakanaA IsCJKUnifiedIdeographs Ƀ}b`B\n</p>\n<pre>\nRegex hira  = new Regex(<span class=\"string\">@\"\\b\\p{IsHiragana}+\\b\"</span>);        <span class=\"comment\">// ȂPɃ}b`</span>\nRegex kata  = new Regex(<span class=\"string\">@\"\\p{IsKatakana}\"</span>);             <span class=\"comment\">// ЉɃ}b`</span>\nRegex kanji = new Regex(<span class=\"string\">@\"\\p{IsCJKUnifiedIdeographs}\"</span>); <span class=\"comment\">// Ƀ}b`</span>\n</pre>\n<p>\n̑ɂNXw肷邱Ƃł܂܂ȕNX\\B\nNX<a href=\"http://www.unicode.org/\">unicode.org</a>ɂ<a href=\"http://www.unicode.org/Public/UNIDATA/Blocks.txt\">ubNꗗ</a>̃ubNIs́B\n</p>\n</item>\n</category>\n\n<category name=\"\">\n<item name=\"Cӌ`ŕ񂩂Ă鎞ǂ݂\">\n<p>\n<code>DateTime.ParseExact</code> \\bhŁA\nȉ̂悤ɂătH[}bgwB\n</p>\n<pre>\nstring str = \"08/Jul/2006:03:28:50 +0900\";\n\nDate d = DateTime.ParseExact(str,\n  \"d'/'MMM'/'yyyy':'HH':'mm':'ss zzz\",\n  System.Globalization.DateTimeFormatInfo.InvariantInfo,\n  System.Globalization.DateTimeStyles.None);\n</pre>\n</item>\n</category>\n\n<category name=\"o\">\n<item name=\"C  printf ݂ɃtH[}bgo͂\">\n<p>\n<code>System.Console.Write(string, params object[])</code> g΃tH[}bgo͂\\łB\np[^͈̏ȉ̒ʂ\n</p>\n<pre>\n{N,M:format}\n</pre>\n<ul>\n<li><code>N</code>: p[^̃CfbNX</li>\n<li><code>M</code>: \\镝Bs̓Xy[XŖ߂B̐̏ꍇElA̐̏ꍇlB</li>\n<li><code>format</code>: wBp[^ <code>IFormattable</code> C^[tF[XĂꍇȀɏ]Đ`B</li>\n</ul>\n<p>\nڍׂ<a href=\"ms-help://MS.NETFrameworkSDK.JA/cpguidenf/html/cpconformattingoverview.htm\">wv</a>Ō邱Ƃo܂B\n</p>\n</item>\n</category>\n\n<category name=\"\">\n<item name=\"C  scanf ݂ȂƂ\">\n<p>)</p>\n<pre>\nint width, height;\nscanf(\"width %d height %d\", &amp;width, &amp;height);\n</pre>\n<p>1)K\\g</p>\n<pre>\n<span class=\"keyword\">const string</span> pattern = @<span class=\"string\">\"height (?&lt;height&gt;\\w+) width (?&lt;width&gt;\\w+)\"</span>; \n\nRegex x = new Regex(pattern);\n<span class=\"keyword\">string</span> str = Console.ReadLine();\nMatch m = x.Match(str); \n\n<span class=\"keyword\">int</span> width = m.Group(<span class=\"string\">\"width\"</span>);\n<span class=\"keyword\">int</span> height = m.Group(<span class=\"string\">\"height\"</span>);\n</pre>\n<p>2) Split g</p>\n<pre>\n<span class=\"keyword\">string</span> str = Console.ReadLine();\n<span class=\"keyword\">sring</span> strs = str.Split(<span class=\"string\">' '</span>);\n<span class=\"keyword\">int</span> width = <span class=\"keyword\">int</span>.Parse(strs[1]);\n<span class=\"keyword\">int</span> height = <span class=\"keyword\">int</span>.Parse(strs[3]);\n</pre>\n</item>\n</category>\n\n<category name=\"\\[X\">\n<item name=\"\\[Xt@C̍쐬\">\n<pre>\n<span class=\"keyword\">using</span> System.Drawing;\n<span class=\"keyword\">using</span> System.Resources; \n\n<span class=\"keyword\">class</span> CreateResource\n{\n  <span class=\"keyword\">public static void</span> Main()\n  {\n    <span class=\"keyword\">using</span>(ResourceWriter writer = <span class=\"keyword\">new</span> ResourceWriter(<span class=\"input\">\"\\[Xt@C.resources\"</span>))\n    {\n      writer.AddResource(<span class=\"input\">\"\\[X\"</span>, <span class=\"keyword\">new</span> Icon(<span class=\"input\">\"t@C.ico\"</span>));\n      writer.Generate();\n    }\n  }\n}\n</pre>\n<p>\n̓RpC <code>/res</code> w肷邾B\n</p>\n</item>\n<item name=\"\\[X̗p\">\n<pre>\n  ResourceManager rm = <span class=\"keyword\">new</span> ResourceManager(<span class=\"input\">\"AZu\"</span>, <span class=\"keyword\">this</span>.GetType().Assembly);\n  <span class=\"keyword\">this</span>.Icon = (System.Drawing.Icon)rm.GetObject(<span class=\"input\">\"\\[X\"</span>);\n</pre>\n</item>\n</category>\n\n<category name=\"lCeBuR[hƂ̑݉^p\">\n<item name=\"\\̂̃CAEg\">\n<p>\n<code>System.Runtime.InteropServices.StructLayout</code> Agr[ggč\\̂̃CAEgwł܂B\n</p>\n<ul>\n<li><code>LayoutKind.Auto</code> c CAEg</li>\n<li><code>LayoutKind.Explicit</code> c <code>FieldOffset</code> Agr[ggĖIɃCAEg</li>\n<li><code>LayoutKind.Sequential</code> c 錾ɃCAEg</li>\n</ul>\n<p>\n<code>LayoutKind.Sequential</code> RXgN^ɓnꍇA\n<code>Pack</code> vpeBŃpbLOTCY𒲐ł܂B\nftHg <code>Pack</code> ̒l 8 łB\n</p>\n</item>\n<item name=\"\\̂ C ̋p̂̂悤Ɏg\">\n<p>\n\\̂̃CAEg <code>LayoutKind.Explicit</code> ɂ邱Ƃ\nC ̋p̂̂悤Ȏgo܂B\n</p>\n<pre>\n<span class=\"keyword\">using</span> System;\n<span class=\"keyword\">using</span> System.Runtime.InteropServices;\n\n[StructLayout(LayoutKind.Explicit)]\n<span class=\"keyword\">struct</span> Hoge\n{\n  [FieldOffset(0)] <span class=\"keyword\">public byt</span>e B;\n  [FieldOffset(0)] <span class=\"keyword\">public in</span>t N;\n} \n\n<span class=\"keyword\">class</span> Test \n{ \n  <span class=\"keyword\">public static void</span> Main() { \n    Hoge h = <span class=\"keyword\">new</span> Hoge(); \n    h.N = 257; \n\n    Console.WriteLine(h.B); <span class=\"comment\">// 1 \\</span>\n  } \n} \n</pre>\n</item>\n</category>\n\n<category name=\"VACY\">\n<item name=\"IuWFNgVACY\">\n<ul>\n<li>oCi c System.Runtime.Serialization.Formatters.Binary.BinaryFormatter</li>\n<li>SOAPbZ[W c System.Runtime.Serialization.Formatters.Soap.SoapFormatter</li>\n<li>XM c System.Xml.Serialization.XmlSerializer</li>\n</ul>\n</item>\n</category>\n\n<category name=\"Win32\">\n<item name=\"VXeCxgE\">\n<p>\n<code>Microsoft.Win32.SystemEvents</code> NX̃pubNCxgŕ\\ݒύXA̕ύXAsȂǂ̃CxgEB\n</p>\n</item>\n</category>\n\n<category name=\"GUI\">\n<item name=\"Windows XP ̃rWAX^Cgp\">\n<p>\n}jtFXggp Comctl32.dll version 6 oCfBO悤ɐݒ肷B\n̓Iȕ@͈ȉ̒ʂB\n</p>\n<p>\nȉXMLu[st@C].manifestvƂOŕۑA\nst@CƓfBNgɒuB\n</p>\n<pre>\n\n&lt;?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?&gt;\n&lt;assembly xmlns=\"urn:schemas-microsoft-com:asm.v1\" manifestVersion=\"1.0\"&gt;\n&lt;dependency&gt;\n   &lt;dependentAssembly&gt;\n     &lt;assemblyIdentity\n       type=\"win32\"\n       name=\"Microsoft.Windows.Common-Controls\"\n       version=\"6.0.0.0\"\n       processorArchitecture=\"X86\"\n       publicKeyToken=\"6595b64144ccf1df\"\n       language=\"*\"\n     /&gt;\n   &lt;/dependentAssembly&gt;\n&lt;/dependency&gt;\n&lt;/assembly&gt;\n</pre>\n<p>\n}jtFXgst@Cɖߍނ߂ɂ́A\n\\[X^CvuRT_MANIFESTvAIDu1ṽ\\[XƂĖߍށB\nVisual Studio .NET g΁Aȉ̎菇ŊȒPɃ}jtFXg̖ߍ݂oB\n</p>\n<ul>\n<li>j[[t@C][t@CJ]IсA}jtFXg𖄂ߍ݂st@CJB</li>\n<li>Jst@CENbN[\\[X̒ǉ]IсA[C|[g]NbNB</li>\n<li>ߍ݂}jtFXgt@CIԁB</li>\n<li>}jtFXg^Cv[RT_MANIFEST]Ɠ͂B</li>\n<li>ǉꂽ}jtFXg\\[X̃vpeBJAIDu1vɕύXB</li>\n</ul>\n</item>\n<item name=\"tH[̍ĕ`ʂ\">\n<p>\nPaint CxggătH[̍ە`ʂsƕ`ʂĂ܂B\n(OnPait \\bhł́Awi̓hԂsĂ Paint CxgnhĂяo߁B)\nOnPaintBackground \\bhI[o[Chĕ`ʂs΂͂ȂȂB\n</p>\n</item>\n</category>\n\n<category name=\"c[\">\n<item name=\"PreJIT ďoȂ́H\">\n<p>\nNgen.exe (native image generater)ŏo܂B\nڂ\n<a href=\"ms-help://MS.NETFrameworkSDK.JA/cptools/html/cpgrfnativeimagegeneratorngenexe.htm\">ms-help://MS.NETFrameworkSDK.JA/cptools/html/cpgrfnativeimagegeneratorngenexe.htm</a>QƂĂB\n</p>\n</item>\n<item name=\"t[̊J͂Ȃ́H\">\n<p>\nhttps://sourceforge.jp/projects/sharpdevelop-jp\n</p>\n<p>\nVisual C# 2005 Express Edision ŗp\\ɂȂB\n</p>\n</item>\n</category>\n\n</ReverseDictionary>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/dic/reversedic.xsl",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n<xsl:output method=\"html\" encoding=\"Shift_JIS\"/> \n\n<xsl:template match=\"/ReverseDictionary\">\n<html>\n<head>\n<link rel=\"stylesheet\" href=\"reversedic.css\" />\n<title>t</title>\n</head>\n<body>\n\n<h1>C# t</h1>\n\n<!-- JeS[ꗗ -->\n<xsl:for-each select=\"category\">\n<p class=\"list\">\n\t<a>\n\t<xsl:attribute name=\"href\">\n\t<xsl:text>#c-</xsl:text><xsl:number count=\"category\" format=\"01\" />\n\t</xsl:attribute>\n\t<span class=\"symbol\"></span>\n\t</a>\n\t\t<xsl:text> </xsl:text>\n\t<xsl:value-of select=\"@name\" />\n</p>\n</xsl:for-each>\n\n<!-- JeS[\\ -->\n<xsl:for-each select=\"category\">\n<h2><a>\n\t<xsl:attribute name=\"id\">\n\t<xsl:text>c-</xsl:text><xsl:number count=\"category\" format=\"01\" />\n\t</xsl:attribute>\n\t<xsl:value-of select=\"@name\" />\n</a></h2>\n\n\t<!-- ڈꗗ -->\n\t<xsl:for-each select=\"item\">\n\t<p class=\"itemlist\">\n\t\t<a>\n\t\t<xsl:attribute name=\"href\">\n\t\t<xsl:text>#i-</xsl:text>\n\t\t<xsl:number count=\"category\" format=\"01\" />\n\t\t<xsl:text>-</xsl:text>\n\t\t<xsl:number count=\"item\" format=\"01\" />\n\t\t</xsl:attribute>\n\t\t<span class=\"symbol\"></span>\n\t\t</a>\n\t\t<xsl:text> </xsl:text>\n\t\t<xsl:value-of select=\"@name\" />\n\t</p>\n\t</xsl:for-each>\n\n\t<xsl:for-each select=\"item\">\n\t<div class=\"item\">\n\t\t<h2 class=\"q\">\n\t\t<a>\n\t\t\t<xsl:attribute name=\"id\">\n\t\t\t<xsl:text>i-</xsl:text>\n\t\t\t<xsl:number count=\"category\" format=\"01\" />\n\t\t\t<xsl:text>-</xsl:text>\n\t\t\t<xsl:number count=\"item\" format=\"01\" />\n\t\t\t</xsl:attribute>\n\t\t\t<xsl:value-of select=\"@name\" />\n\t\t</a>\n\t\t</h2>\n\t\t<div class=\"a\"><xsl:apply-templates select=\".\" /></div>\n\t</div>\n\t</xsl:for-each>\n</xsl:for-each>\n\n</body>\n</html>\n</xsl:template>\n\n<!-- HTML^Ô܂ܕ\\ł悤 -->\n<xsl:template match=\"*|text()\">\n<xsl:copy>\n<xsl:for-each select=\"@*\">\n<xsl:copy/>\n</xsl:for-each>\n<xsl:apply-templates/>\n</xsl:copy>\n</xsl:template>\n\n</xsl:stylesheet>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/draft/Characteristics.cs",
    "content": "﻿using System.Diagnostics.Contracts;\n\nnamespace TypeDefinition.Models\n{\n    /// <summary>\n    /// 特性データ\n    /// </summary>\n    public partial class Characteristics\n    {\n        public Characteristics(double X, double Y, double Z)\n        {\n            Contract.Ensures(this.Validate());\n\n            this._X = X;\n            this._Y = Y;\n            this._Z = Z;\n        }\n\n        /// <summary>\n        /// 特性 X\n        /// </summary>\n        public double X { get { return _X; } }\n        private readonly double _X;\n\n        /// <summary>\n        /// 特性 Y\n        /// </summary>\n        public double Y { get { return _Y; } }\n        private readonly double _Y;\n\n        /// <summary>\n        /// 特性 Z\n        /// </summary>\n        public double Z { get { return _Z; } }\n        private readonly double _Z;\n\n        /// <summary>\n        /// 一次ノルム\n        /// </summary>\n        public double Norm { get { return X + Y + Z; } }\n\n        public bool Validate()\n        {\n            return\n                0 <= X && X <= 1\n                && 0 <= Y && Y <= 1\n                && 0 <= Z && Z <= 1\n                && Norm >= 1;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/draft/Characteristics.txt",
    "content": "module TypeDefinition.Models\n{\n    // f[^\n    type Characteristics\n        requres Norm >= 1\n    {\n        //  X\n        X : double\n        requires 0 <= X && X <= 1;\n\n        //  Y\n        Y : double\n        requires 0 <= Y && Y <= 1;\n\n        //  Z\n        Z : double\n        requires 0 <= Z && Z <= 1;\n\n        // ꎟm\n        Norm = X + Y + Z;\n\n        // ύX̓Kp\n        command Submit excuted on this.Valid;\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/draft/CharacteristicsViewModel.cs",
    "content": "﻿using System;\nusing System.Windows.Input;\nusing System.ComponentModel;\nusing System.ComponentModel.DataAnnotations;\n\nnamespace TypeDefinition.Models\n{\n    /// <summary>\n    /// 特性データ の ViewModel\n    /// </summary>\n    public partial class CharacteristicsViewModel : INotifyPropertyChanged, INotifyDataErrorInfo\n    {\n        private double _X;\n\n        /// <summary>\n        /// 指標 X\n        /// </summary>\n        [Range(0.0, 1.0)]\n        public double X\n        {\n            get { return _X; }\n            set\n            {\n                _X = value;\n                RaisePropertyChanged(\"X\");\n                RaiseErrorsChanged(\"X\");\n                RaisePropertyChanged(\"Norm\");\n                RaiseErrorsChanged(\"Norm\");\n                _Submit.RaiseCanExecuteChanged();\n            }\n        }\n\n        private double _Y;\n\n        /// <summary>\n        /// 指標 Y\n        /// </summary>\n        [Range(0.0, 1.0)]\n        public double Y\n        {\n            get { return _Y; }\n            set\n            {\n                _Y = value;\n                RaisePropertyChanged(\"Y\");\n                RaiseErrorsChanged(\"Y\");\n                RaisePropertyChanged(\"Norm\");\n                RaiseErrorsChanged(\"Norm\");\n                _Submit.RaiseCanExecuteChanged();\n            }\n        }\n\n        private double _Z;\n\n        /// <summary>\n        /// 指標 Z\n        /// </summary>\n        [Range(0.0, 1.0)]\n        public double Z\n        {\n            get { return _Z; }\n            set\n            {\n                _Z = value;\n                RaisePropertyChanged(\"Z\");\n                RaiseErrorsChanged(\"Z\");\n                RaisePropertyChanged(\"Norm\");\n                RaiseErrorsChanged(\"Norm\");\n                _Submit.RaiseCanExecuteChanged();\n            }\n        }\n\n        /// <summary>\n        /// 一次ノルム\n        /// </summary>\n        public double Norm\n        {\n            get { return X + Y + Z; }\n        }\n\n        DelegateCommand _Submit;\n\n        /// <summary>\n        /// コマンドバインディング用 Submit コマンド\n        /// </summary>\n        public ICommand SubmitCommand\n        {\n            get\n            {\n                if (_Submit == null)\n                    _Submit = new DelegateCommand { ExecuteHandler = OnSubmit, CanExecuteHandler = OnSubmitCanExcute };\n                return _Submit;\n            }\n        }\n\n        /// <summary>\n        /// 変更の適用操作\n        /// </summary>\n        public Action<object> Submit { get; set; }\n\n        void OnSubmit(object paramter)\n        {\n            var d = Submit;\n            if (d != null)\n                d(paramter);\n        }\n\n        bool OnSubmitCanExcute(object paramter)\n        {\n            return HasErrors;\n        }\n\n        #region INotifyPropertyChanged Members\n\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        void RaisePropertyChanged(string propertyName)\n        {\n            var d = this.PropertyChanged;\n            if (d != null)\n                d(this, new PropertyChangedEventArgs(propertyName));\n        }\n\n        #endregion\n\n        #region INotifyDataErrorInfo Members\n\n        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;\n\n        void RaiseErrorsChanged(string propertyName)\n        {\n            var d = this.ErrorsChanged;\n            if (d != null)\n                d(this, new DataErrorsChangedEventArgs(propertyName));\n        }\n\n        public System.Collections.IEnumerable GetErrors(string propertyName)\n        {\n            switch(propertyName)\n            {\n                case \"X\": if (!(0 <= X && X <= 1)) yield return \"requires: 0 <= X && X <= 1\"; break;\n                case \"Y\": if (!(0 <= Y && Y <= 1)) yield return \"requires: 0 <= Y && Y <= 1\"; break;\n                case \"Z\": if (!(0 <= Z && Z <= 1)) yield return \"requires: 0 <= Z && Z <= 1\"; break;\n                case \"Norm\": if (!(Norm >= 1)) yield return \"requires: Norm >= 1\"; break;\n            }\n        }\n\n        public bool HasErrors\n        {\n            get\n            {\n                return !(\n                    0 <= X && X <= 1\n                    && 0 <= Y && Y <= 1\n                    && 0 <= Z && Z <= 1\n                    && Norm >= 1\n                    );\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/draft/DelegateCommand.cs",
    "content": "﻿using System;\nusing System.Net;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Documents;\nusing System.Windows.Ink;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Animation;\nusing System.Windows.Shapes;\n\nnamespace TypeDefinition.Models\n{\n    public class DelegateCommand : ICommand\n    {\n        public Action<object> ExecuteHandler { get; set; }\n        public Func<object, bool> CanExecuteHandler { get; set; }\n\n        public bool CanExecute(object parameter)\n        {\n            var d = CanExecuteHandler;\n            return d == null ? true : d(parameter);\n        }\n\n        public event EventHandler CanExecuteChanged;\n\n        public void Execute(object parameter)\n        {\n            var d = ExecuteHandler;\n            if (d != null)\n                d(parameter);\n        }\n\n        public void RaiseCanExecuteChanged()\n        {\n            var d = this.CanExecuteChanged;\n            if (d != null)\n                d(this, null);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/draft/SampleClass.cs",
    "content": "﻿﻿using System;\nusing System.Windows.Input;\nusing System.ComponentModel;\n\nnamespace ConsoleApplication1\n{\n    /// <summary>\n    /// 特性値データ の ViewModel\n    /// </summary>\n    public partial class SampleClass : INotifyPropertyChanged\n    {\n        private double _X;\n\n        /// <summary>\n        /// 特性 X\n        /// </summary>\n        public double X\n        {\n            get { return _X; }\n            set\n            {\n                if (_X != value)\n                {\n                    _X = value;\n                    RaisePropertyChanged(\"X\");\n                }\n            }\n        }\n\n        private int _Y;\n\n        /// <summary>\n        /// 特性 Y\n        /// </summary>\n        public int Y\n        {\n            get { return _Y; }\n            set\n            {\n                if (_Y != value)\n                {\n                    _Y = value;\n                    RaisePropertyChanged(\"Y\");\n                }\n            }\n        }\n\n        #region INotifyPropertyChanged Members\n\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        void RaisePropertyChanged(string propertyName)\n        {\n            var f = this.PropertyChanged;\n            if (f != null)\n                f(this, new PropertyChangedEventArgs(propertyName));\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/draft/SampleClass.xml",
    "content": "<Definition\n    Namespace=\"ConsoleApplication1\"\n    Class=\"SampleClass\"\n    Description=\"lf[^\"\n    >\n\n   <Properties Name=\"X\" Type=\"double\" Description=\" X\" />\n   <Properties Name=\"Y\" Type=\"int\" Description=\" Y\" />\n</Definition>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/Data/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.Data</title>\n</head>\n<body>\n\n<h1>Data</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>IDataGenerator</td>\n<td>\ng̃f[^𐶐NX̋ʃC^tF[XB\n</td>\n</tr>\n<tr>\n<td>InpulseGenerator</td>\n<td>\nCpX𐶐B\n</td>\n</tr>\n<tr>\n<td>SinusoidGenerator</td>\n<td>\ng𐶐B\n</td>\n</tr>\n<tr>\n<td>StepGenerator</td>\n<td>\nXebv֐𐶐B\n</td>\n</tr>\n<tr>\n<td>RandomGenerator</td>\n<td>\n𐶐B\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/Filter/BandPass/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../../style.css\" />\n<title>SoundLibrary.Filter.BandPass</title>\n</head>\n<body>\n\n<h1>BandPass</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>WindowFunction, IWindow</td>\n<td>\n֐p̃fQ[g/C^tF[XB\n</td>\n</tr>\n<tr>\n<td>LowPassFilter, HighPassFilter, BandPassFilter</td>\n<td>\n`ʑ FIR tB^p[pX/nCpX/ohpXtB^B\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/Filter/Delay/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../../style.css\" />\n<title>SoundLibrary.Filter.Delay</title>\n</head>\n<body>\n\n<h1>Delay</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>IDelay</td>\n<td>\nx̊C^tF[XB\n</td>\n</tr>\n<tr>\n<td>Delay</td>\n<td>\nxB\n</td>\n</tr>\n<tr>\n<td>FractionalDelay</td>\n<td>\nxB\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/Filter/Equalizer/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../../style.css\" />\n<title>SoundLibrary.Filter.Equalizer</title>\n</head>\n<body>\n\n<h1>Equalizer</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>ParametricEqualizer</td>\n<td>\npgbNCRCUB\n2 IIR tB^𒼗ɕׂ\\B\nIIR tB^p[pXEnCpXEohpXtB^A\ns[LOEVFrOtB^Ȃǂ̐݌v@\\tB\n</td>\n</tr>\n<tr>\n<td>FilterDesigner</td>\n<td>\nIIR tB^̌W݌vsNX̒ۊB\nButterworthFilterDesigner ͂̃NX̃TuNXƂĒ`B\ntB^̗_/ɁAAiOvg^CvWA\nfBW^tB^WAParametricEqualizer NX݊`̌WvZ\\B\n</td>\n</tr>\n<tr>\n<td>ButterworthFilterDesigner</td>\n<td>\no^[[XtB^̌W݌vsB\n</td>\n</tr>\n<tr>\n<td>ChebyshevFilterDesigner</td>\n<td>\n`FrVFt/t`FrVFttB^̌W݌vsB\n</td>\n</tr>\n<tr>\n<td>EllipticFilterDesigner</td>\n<td>\nȉ~tB^̌W݌vsB\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/Filter/Misc/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../../style.css\" />\n<title>SoundLibrary.Filter.Misc</title>\n</head>\n<body>\n\n<h1>Misc</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>CombFilter</td>\n<td>\nRtB^B\n</td>\n</tr>\n<tr>\n<td>Amplifier</td>\n<td>\n͂萔{邾̃NXB\n</td>\n</tr>\n<tr>\n<td>AllPassFilter</td>\n<td>\nI[pXtB^B\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/Filter/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.Filter</title>\n</head>\n<body>\n\n<h1>Filter</h1>\n\n<h2>TutH_</h2>\n<table>\n<tr>\n<td><a href=\"Delay/index.html\">Delay</a></td>\n<td>\nxBxxB\n</td>\n</tr>\n<tr>\n<td><a href=\"BandPass/index.html\">BandPass</a></td>\n<td>\n`ʑ FIR p[pXEohpXEnCpXtB^B\n̏A|@̂݁iv@ɂ͖ΉjB\n</td>\n</tr>\n<tr>\n<td><a href=\"Equalizer/index.html\">Equalizer</a></td>\n<td>\n2 IIR tB^̒ڑpCRCUB\nRBJ Audio EQ Cookbook ŏЉĂtB^A\no^[[XA`FrVFtAȉ~tB^gB\n</td>\n</tr>\n<tr>\n<td><a href=\"Misc/index.html\">Misc</a></td>\n<td>\n̑̃tB^B\nRtB^ȂǁB\n</td>\n</tr>\n</table>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>IFilter</td>\n<td>\nSẴtB^̊{C^tF[XB\n</td>\n</tr>\n<tr>\n<td>CircularBuffer</td>\n<td>\nzobt@B\n</td>\n</tr>\n<tr>\n<td>SerialConnector, PallarelConnector</td>\n<td>\ntB^𒼗/ɌqtB^B\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/Mathematics/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.Mathematics</title>\n</head>\n<body>\n\n<h1>Mathematics</h1>\n\n<h2>TutH_</h2>\n<table>\n<tr>\n<td>Function</td>\n<td>\nw֐m̉揜A֐̍A􍞂ݓsB\nf = Cos; g = Sin; h = f * g;\ndouble x = h[10];\nƏƂŁASin(10) * Cos(10) ̒lvZł悤ȃNX`B\n</td>\n</tr>\n<tr>\n<td>ThreeDimention</td>\n<td>\n3̃xNgEsAAtBϊA4NXȂǂ`B\n</td>\n</tr>\n</table>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>Constant</td>\n<td>\nw萔`B\n</td>\n</tr>\n<tr>\n<td>Complex</td>\n<td>\nf^NXB\n</td>\n</tr>\n<tr>\n<td>Elliptic</td>\n<td>\nȉ~֐B\n</td>\n</tr>\n<tr>\n<td>ComplexMath</td>\n<td>\nSystem.Math Œ`Ă֐𕡑fɊǵB\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/Music/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.Music</title>\n</head>\n<body>\n\n<h1>Music</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>Sound</td>\n<td>\n\\NX̒ۊB\n</td>\n</tr>\n<tr>\n<td>PureTone</td>\n<td>\nPig`j𐶐B\n</td>\n</tr>\n<tr>\n<td>HarmonicTone</td>\n<td>\n{iP̐{d˂́j𐶐B\n</td>\n</tr>\n<tr>\n<td>Envelope</td>\n<td>\nPureTone gĐɃGx[vijB\n</td>\n</tr>\n<tr>\n<td>Tremolo</td>\n<td>\nAgiʂIɕωjB\n</td>\n</tr>\n<tr>\n<td>Vibrato</td>\n<td>\nAru[giIɕωj\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/Pipe/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.Pipe</title>\n</head>\n<body>\n\n<h1>Pipe</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>Queue</td>\n<td>\nf[^i[p̃L[B\n</td>\n</tr>\n<tr>\n<td>Pipe</td>\n<td>\nFIFO Ńf[^L[ǂݍ    L[ɏoNX̒ۊB\n</td>\n</tr>\n<tr>\n<td>FilteredPipe</td>\n<td>\nǂݍ  tB^[  oB\nmpƃXeIpB\niMonaural/FilteredPipe  Stereo/FilteredPipej\n</td>\n</tr>\n<tr>\n<td>RateTransposer</td>\n<td>\nڒiύXAĐԂɕςjsB\nmpƃXeIpB\n</td>\n</tr>\n<tr>\n<td>TimeStretcher</td>\n<td>\nԐLkiςɍĐԂςjsB\nmpƃXeIpB\n</td>\n</tr>\n<tr>\n<td>PitchShifter</td>\n<td>\nsb`VtgiĐԂςɉςjsB\ni_ł̓XeIp̂݁Bj\n</td>\n</tr>\n<tr>\n<td>CascadePipe</td>\n<td>\n Pipe 𒼗ɌqNXB\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/SpectrumAnalysis/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.SpectrumAnalysis</title>\n</head>\n<body>\n\n<h1>SpectrumAnalysis</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>Fft</td>\n<td>\nM FFT sNXB\n</td>\n</tr>\n<tr>\n<td>CFft</td>\n<td>\nfM FFT sNXB\n</td>\n</tr>\n<tr>\n<td>Spectrum</td>\n<td>\ngig̈Mj\\NXB\nn FFTAgm̉揜A\nUEʑȂǂ̌vZ\\B\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/Wave/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.Wave</title>\n</head>\n<body>\n\n<h1>Wave</h1>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>WaveReader</td>\n<td>\n.wav `̃t@C特f[^ǂݍށB\n</td>\n</tr>\n<tr>\n<td>WaveWriter</td>\n<td>\n.wav `̃t@Cɉf[^oB\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/WaveAnalysis/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"../style.css\" />\n<title>SoundLibrary.</title>\n</head>\n<body>\n\n<h1></h1>\n\n<h2>TutH_</h2>\n<table>\n<tr>\n<td><a href=\"/index.html\"></a></td>\n<td>\n</td>\n</tr>\n<tr>\n<td><a href=\"/index.html\"></a></td>\n<td>\n</td>\n</tr>\n</table>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td></td>\n<td>\n</td>\n</tr>\n<tr>\n<td></td>\n<td>\n</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/index.html",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"xhtml11.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\" />\n<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n<link rel=\"stylesheet\" href=\"style.css\" />\n<title>SoundLibrary</title>\n</head>\n<body>\n\n<h1>SoundLibrary</h1>\n\n<h2>TutH_</h2>\n\n<table>\n<tr>\n<td><a href=\"Mathematics/index.html\">Mathematics</a></td>\n<td>\ñCuŎgw֐╡fNXȂǂ`B\n</td>\n</tr>\n<tr>\n<td><a href=\"Filter/index.html\">Filter</a></td>\n<td>\ntB^CuB\nxAFIR/IIRtB^ьW݌vp̃R[h܂܂Ă܂B\n</td>\n</tr>\n<tr>\n<td><a href=\"Wave/index.html\">Wave</a></td>\n<td>\n8bit/16bit PCM ` Wave t@Cǂݏ郉CuB\nADPCM Ƃɂ͖ΉB\n</td>\n</tr>\n<tr>\n<td><a href=\"SpectrumAnalysis/index.html\">SpectrumAnalysis</a></td>\n<td>\ng͗pCuB\nFFT gpB\n</td>\n</tr>\n<tr>\n<td><a href=\"Music/index.html\">Music</a></td>\n<td>\n郉CuB\ngd˂č{Ƀru[gGx[voB\n</td>\n</tr>\n<td><a href=\"Data/index.html\">Data</a></td>\n<td>\ngȂǂ̃f[^𐶐B\ntB^̃fobOpɍ́i낱ƎdlύX邩jB\nMusic Ɠ肷邩B\n</td>\n</tr>\n<tr>\n<td><a href=\"Pipe/index.html\">Pipe</a></td>\n<td>\nFIFO Ńf[^ǂݏoosNXQ`B\nf[^́AĐxύXEڒEsb`VtgȂǂsB\n</td>\n</tr>\n<tr>\n<td>Command</td>\n<td>\nR}hC^AvP[VpCuB\nR}hCȂǂ߂邽߂̃p[T[B\n</td>\n</tr>\n<tr>\n<td>WaveAnalysis</td>\n<td>\nWave ǂݏof[^̎g͂sȂB\nWave  SpectrumAnalysis gāA\nẼ`l̍ƂvZ肷邾B\n</td>\n</tr>\n<tr>\n<td>Stream</td>\n<td>\nObsoleteB\nPipe ɈڍsB\n</td>\n</tr>\n<tr>\n<td>Misc</td>\n<td>\n̑XB\nfobOp̃NXȂǁB\n</td>\n</tr>\n</table>\n\n<h2>vȃNX</h2>\n<table>\n<tr>\n<td>Util</td>\n<td>[eBeB֐QBfVxl  jAlA~b  Tv̕ϊȂǁB</td>\n</tr>\n<tr>\n<td>BitOperation</td>\n<td>rbgpNXBrbg}XNA2̙pȂǂvZB</td>\n</tr>\n</table>\n\n<hr />\n<p><a href=\"../../index.html\">߂</a></p>\n\n</body>\n</html>\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/sample/SoundLibrary/style.css",
    "content": "body\n{\n\tcolor:#000000;\n\tbackground-color:#FFFFFF;\n}\n\nh1{font-size:140%; background-color:#ccccff; border:1pt solid #000000;padding-left:0.2em;}\nh2{font-size:120%; font-weight:normal; background-color:#ccccff; border:1pt solid #000000;padding-left:0.2em;}\nh3{font-size:110%; color:6a5acd;}\n\nh3.sample{font-size:100%; font-weight:normal; background-color:#ccffff; border:1pt solid #000000;padding-left:0.5em;}\n\npre{font-family:monospace; color:black; border:thin solid #3333cc; padding:0.2em 0em 0.2em 0.5em;}\npre.dos{font-family:monospace; color:black; border:thin solid #ff9999; padding:0.2em 0em 0.2em 0.5em;}\n\nsup{font-size:80%;}\nsub{font-size:80%;}\n\nspan.keyword{color:#0000ff;}\nspan.string{color:#008080;}\nspan.comment{color:#008000;}\nspan.input{background-color:#ccffcc;}\n\nem{font-style:normal; font-weight:normal;background-color:#fff0f0;}\n\ntable{background:#333366;vertical-align:middle;}\ntable.noborder{background-color:transparent;}\ntr{vertical-align:middle;text-align:left;}\nth{padding:0.3em;margin:0pt;border:0pt;color:#000000;background-color:#99ccff;font-weight:normal;vertical-align:middle;text-align:left;}\ntd{padding:0.3em;margin:0pt;border:0pt;color:#000000;background-color:#ffffff;vertical-align:middle;text-align:left;}\n\nimg{border:0;}\np.fig{text-align:center;}\np.fig td{text-align:center;}\n\nspan.ver2{color:#ff0000; font:italic; background:#ffeeee; padding:0em 0.4em 0em 0.1em;}\n\na:link   {color:#3333cc;}\na:visited{color:#3333cc;}\na:active {color:#3333cc;}\na:hover  {color:#aa3333;}\n\nv\\:* { behavior: url(#default#VML); }\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/ComicMinimal.cs",
    "content": "﻿using System;\nusing System.Data.Linq;\nusing System.Data.Linq.Mapping;\n\nnamespace LinqToSqlTest\n{\n\tpublic class ComicDataContext : DataContext\n\t{\n\t\tpublic ComicDataContext(string connectionString) : base(connectionString) { }\n\t\tpublic Table<Author> Author;\n\t\tpublic Table<Publisher> Publisher;\n\t\tpublic Table<Series> Series;\n\t\tpublic Table<Book> Book;\n\t}\n\n\t[Table(Name = \"Authors\")]\n\tpublic class Author\n\t{\n\t\t[Column(AutoSync = AutoSync.OnInsert, IsPrimaryKey = true, IsDbGenerated = true)]\n\t\tpublic int Id;\n\t\t[Column]\n\t\tpublic string Name;\n\t\t[Column]\n\t\tpublic string Kana;\n\t\t[Column]\n\t\tpublic DateTime? Birthday;\n\t\t[Column]\n\t\tpublic string Url;\n\n\t\t[Association(OtherKey = \"AuthorId\")]\n\t\tpublic EntitySet<Series> Series;\n\t}\n\n\t[Table(Name = \"Publishers\")]\n\tpublic class Publisher\n\t{\n\t\t[Column(AutoSync = AutoSync.OnInsert, IsPrimaryKey = true, IsDbGenerated = true)]\n\t\tpublic int Id;\n\t\t[Column]\n\t\tpublic string Name;\n\t}\n\n\t[Table(Name = \"Series\")]\n\tpublic class Series\n\t{\n\t\t[Column(AutoSync = AutoSync.OnInsert, IsPrimaryKey = true, IsDbGenerated = true)]\n\t\tpublic int Id;\n\t\t[Column]\n\t\tpublic string Name;\n\t\t[Column]\n\t\tpublic int AuthorId;\n\t\t[Column]\n\t\tpublic int PublisherId;\n\n\t\t[Association(OtherKey = \"SeriesId\")]\n\t\tpublic EntitySet<Book> Book;\n\n\t\t[Association(Storage = \"_Author\", ThisKey = \"AuthorId\")]\n\t\tpublic Author Author\n\t\t{\n\t\t\tget { return this._Author.Entity; }\n\t\t\tset { this._Author.Entity = value; }\n\t\t}\n\t\tprivate EntityRef<Author> _Author;\n\n\t\t[Association(Storage = \"_Publisher\", ThisKey = \"PublisherId\")]\n\t\tpublic Publisher Publisher\n\t\t{\n\t\t\tget { return this._Publisher.Entity; }\n\t\t\tset { this._Publisher.Entity = value; }\n\t\t}\n\t\tprivate EntityRef<Publisher> _Publisher;\n\t}\n\n\t[Table(Name = \"Books\")]\n\tpublic class Book\n\t{\n\t\t[Column(AutoSync = AutoSync.OnInsert, IsPrimaryKey = true, IsDbGenerated = true)]\n\t\tpublic int Id;\n\t\t[Column]\n\t\tpublic int SeriesId;\n\t\t[Column]\n\t\tpublic int Volume;\n\t\t[Column]\n\t\tpublic DateTime? ReleaseDate;\n\t\t[Column]\n\t\tpublic int? Price;\n\n\t\t[Association(Storage = \"_Series\", ThisKey = \"SeriesId\")]\n\t\tpublic Series Series\n\t\t{\n\t\t\tget { return this._Series.Entity; }\n\t\t\tset { this._Series.Entity = value; }\n\t\t}\n\t\tprivate EntityRef<Series> _Series;\n\t}\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/Complex.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace GenericOperator\n{\n    /// <summary>\n    /// Operator を使った例ということで、ジェネリックな複素数型を実装。\n    /// </summary>\n    /// <typeparam name=\"T\">実部・虚部の型</typeparam>\n    public struct Complex<T>\n        where T: IComparable<T>\n    {\n        #region フィールド\n\n        private T re;\n        private T im;\n\n        #endregion\n        #region 初期化\n\n        /// <summary>\n        /// 実部・虚部を与えて初期化。\n        /// </summary>\n        /// <param name=\"re\">実部の値。</param>\n        /// <param name=\"im\">虚部の値。</param>\n        public Complex(T re, T im)\n        {\n            this.re = re;\n            this.im = im;\n        }\n\n        #endregion\n        #region プロパティ\n\n        /// <summary>\n        /// 実部。\n        /// </summary>\n        public T Re\n        {\n            get { return re; }\n            set { re = value; }\n        }\n\n        /// <summary>\n        /// 虚部。\n        /// </summary>\n        public T Im\n        {\n            get { return im; }\n            set { im = value; }\n        }\n\n        #endregion\n        #region タイピング量を減らすための簡単なラッパー\n\n        static T Add(T x, T y) { return Operator<T>.Add(x, y); }\n        static T Sub(T x, T y) { return Operator<T>.Subtract(x, y); }\n        static T Mul(T x, T y) { return Operator<T>.Multiply(x, y); }\n        static T Div(T x, T y) { return Operator<T>.Divide(x, y); }\n        static T Neg(T x) { return Operator<T>.Negate(x); }\n        static T Acc(T x, T y, T z, T w) { return Operator<T>.ProductSum(x, y, z, w); }\n        static T Det(T x, T y, T z, T w) { return Operator<T>.ProductDifference(x, y, z, w); }\n        static T Norm(T x, T y) { return Operator<T>.ProductSum(x, y, x, y); }\n\n        #endregion\n        #region 加減乗除\n\n        public static Complex<T> operator +(Complex<T> x, Complex<T> y)\n        {\n            return new Complex<T>(Add(x.re, y.re), Add(x.im, y.im));\n        }\n        public static Complex<T> operator +(T x, Complex<T> y)\n        {\n            return new Complex<T>(Add(x, y.re), y.im);\n        }\n        public static Complex<T> operator +(Complex<T> x, T y)\n        {\n            return new Complex<T>(Add(x.re, y), x.im);\n        }\n\n        public static Complex<T> operator -(Complex<T> x)\n        {\n            return new Complex<T>(Neg(x.re), Neg(x.im));\n        }\n\n        public static Complex<T> operator -(Complex<T> x, Complex<T> y)\n        {\n            return new Complex<T>(Sub(x.re, y.re), Sub(x.im, y.im));\n        }\n        public static Complex<T> operator -(T x, Complex<T> y)\n        {\n            return new Complex<T>(Sub(x, y.re), y.im);\n        }\n        public static Complex<T> operator -(Complex<T> x, T y)\n        {\n            return new Complex<T>(Sub(x.re, y), x.im);\n        }\n\n        public static Complex<T> operator *(Complex<T> x, Complex<T> y)\n        {\n            return new Complex<T>(\n                Det(x.re, y.re, x.im, y.im),\n                Acc(x.re, y.im, x.im, y.re));\n        }\n        public static Complex<T> operator *(T x, Complex<T> y)\n        {\n            return new Complex<T>(Mul(x, y.re), Mul(x, y.im));\n        }\n        public static Complex<T> operator *(Complex<T> x, T y)\n        {\n            return new Complex<T>(Mul(x.re, y), Mul(x.im, y));\n        }\n\n        /// <summary>\n        /// 逆数を求める。\n        /// </summary>\n        /// <returns>逆数。</returns>\n        public Complex<T> Inverse()\n        {\n            T norm = Norm(this.re, this.im);\n            T re = Div(this.re, norm);\n            T im = Neg(Div(this.im, norm));\n            return new Complex<T>(re, im);\n        }\n\n        public static Complex<T> operator /(Complex<T> x, Complex<T> y)\n        {\n            return x * y.Inverse();\n        }\n        public static Complex<T> operator /(T x, Complex<T> y)\n        {\n            return x * y.Inverse();\n        }\n        public static Complex<T> operator /(Complex<T> x, T y)\n        {\n            return new Complex<T>(Div(x.re, y), Div(x.im, y));\n        }\n\n        #endregion\n        #region 文字列化\n\n        public override string ToString()\n        {\n            if (this.im.CompareTo(default(T)) < 0)\n            {\n                return string.Format(\"{0} - i{1}\", this.re, Neg(this.im));\n            }\n            else\n            {\n                return string.Format(\"{0} + i{1}\", this.re, this.im);\n            }\n        }\n\n        #endregion\n    }\n\n    /// <summary>\n    /// Complex に付随する拡張メソッド。\n    /// </summary>\n    public static class ComplexExtensions\n    {\n        /// <summary>\n        /// 5.I() みたいな書き方で純虚数を作れるようするための拡張メソッド。\n        /// </summary>\n        /// <typeparam name=\"T\">虚部の型。</typeparam>\n        /// <param name=\"x\">虚部の値。</param>\n        /// <returns>純虚数 ix</returns>\n        public static Complex<T> I<T>(this T x)\n            where T : IComparable<T>\n        {\n            return new Complex<T>(default(T), x);\n        }\n\n        /// <summary>\n        /// 3 .I(4) みたいな書き方で複素数 3 + i4 を作れるようにするための拡張メソッド。\n        /// </summary>\n        /// <typeparam name=\"T\">実部・虚部の型。</typeparam>\n        /// <param name=\"x\">実部。</param>\n        /// <param name=\"y\">虚部。</param>\n        /// <returns>複素数 x + iy</returns>\n        public static Complex<T> I<T>(this T x, T y)\n            where T : IComparable<T>\n        {\n            return new Complex<T>(x, y);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/Comprehension.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Diagnostics;\n\nnamespace ConsoleApplication1\n{\n\tclass Program\n\t{\n\t\t/// <summary>\n\t\t/// 以下のような、総当りで解を求める類の問題を、\n\t\t/// LINQ とかを使って解いてみる。\n\t\t/// \n\t\t/// 設問：\n\t\t/// Baker, Cooper, Fletcher, MillerとSmithは五階建てアパートの異なる階に住んでいる。\n\t\t/// Bakerは最上階に住むのではない。\n\t\t/// Cooperは最下階に住むのではない。\n\t\t/// Fletcherは最上階にも最下階にも住むのではない。\n\t\t/// MillerはCooperより上の階に住んでいる。\n\t\t/// SmithはFletcherの隣の階に住むのではない。\n\t\t/// FletcherはCooperの隣の階に住むのではない。\n\t\t/// それぞれはどの階に住んでいるか。 \n\t\t/// </summary>\n\t\t/// <remarks>\n\t\t/// 実行結果のまとめ：\n\t\t/// ・この手の単純なクエリは、\n\t\t///   クエリの順序入れ替えで10倍以上パフォーマンスがあがることがざら。\n\t\t/// ・でも、from が前に固まってるものと比べて、順序を入れ替えたクエリは結構見づらい。\n\t\t/// ・多重 from を使ったクエリ式をメソッド形式で書こうとすると SelectMany の透過識別子がえらいことに。\n\t\t/// ・from, where, select を foreach, if, yield return で展開すると、パフォーマンス1.5～2倍くらいあがったりする。\n\t\t/// ・yield return（いわゆるイテレータ）と、一度 List.Add してからその List を返すののパフォーマンスは大差なし。\n\t\t/// \n\t\t/// 結論：\n\t\t/// IQueryable / ラムダ式を使って、\n\t\t/// from, where, select を foreach, if, yield return に展開\n\t\t/// ＆ クエリの順序最適化をかけるようなライブラリが欲しいなぁ。\n\t\t/// </remarks>\n\t\tstatic void Main()\n\t\t{\n\t\t\t// 設問どおりの順序でクエリ\n\t\t\tvar answers1 =\n\t\t\t\tfrom baker in five\n\t\t\t\tfrom cooper in five\n\t\t\t\tfrom fletcher in five\n\t\t\t\tfrom miller in five\n\t\t\t\tfrom smith in five\n\t\t\t\twhere Distinct(baker, cooper, fletcher, miller, smith)\n\t\t\t\twhere baker != 5\n\t\t\t\twhere cooper != 1\n\t\t\t\twhere fletcher != 1 && fletcher != 5\n\t\t\t\twhere miller > cooper\n\t\t\t\twhere Discrete(smith, fletcher)\n\t\t\t\twhere Discrete(fletcher, cooper)\n\t\t\t\tselect new { baker, cooper, fletcher, miller, smith };\n\n\t\t\t// answers1 のクエリ式と等価なクエリ演算\n\t\t\tvar answers0 = five\n\t\t\t\t.SelectMany(x => five, (baker, cooper) => new { baker, cooper })\n\t\t\t\t.SelectMany(x => five, (x, fletcher) => new { x, fletcher })\n\t\t\t\t.SelectMany(x => five, (x, miller) => new { x, miller })\n\t\t\t\t.SelectMany(x => five, (x, smith) => new { x, smith })\n\t\t\t\t.Where(x => Distinct(x.x.x.x.baker, x.x.x.x.cooper, x.x.x.fletcher, x.x.miller, x.smith))\n\t\t\t\t.Where(x => x.x.x.x.baker != 5)\n\t\t\t\t.Where(x => x.x.x.x.cooper != 1)\n\t\t\t\t.Where(x => x.x.x.fletcher != 1 && x.x.x.fletcher != 5)\n\t\t\t\t.Where(x => x.x.miller > x.x.x.x.cooper)\n\t\t\t\t.Where(x => Discrete(x.smith, x.x.x.fletcher))\n\t\t\t\t.Where(x => Discrete(x.x.x.fletcher, x.x.x.x.cooper))\n\t\t\t\t.Select(x => new { x.x.x.x.baker, x.x.x.x.cooper, x.x.x.fletcher, x.x.miller, x.smith });\n\n\t\t\t// answers0 の透過識別子をちょっと整理\n\t\t\tvar answers01 = five\n\t\t\t\t.SelectMany(x => five, (baker, cooper) => new { baker, cooper })\n\t\t\t\t.SelectMany(x => five, (x, fletcher) => new { x.baker, x.cooper, fletcher })\n\t\t\t\t.SelectMany(x => five, (x, miller) => new { x.baker, x.cooper, x.fletcher, miller })\n\t\t\t\t.SelectMany(x => five, (x, smith) => new { x.baker, x.cooper, x.fletcher, x.miller, smith })\n\t\t\t\t.Where(x => Distinct(x.baker, x.cooper, x.fletcher, x.miller, x.smith))\n\t\t\t\t.Where(x => x.baker != 5)\n\t\t\t\t.Where(x => x.cooper != 1)\n\t\t\t\t.Where(x => x.fletcher != 1 && x.fletcher != 5)\n\t\t\t\t.Where(x => x.miller > x.cooper)\n\t\t\t\t.Where(x => Discrete(x.smith, x.fletcher))\n\t\t\t\t.Where(x => Discrete(x.fletcher, x.cooper));\n\n\t\t\t// answers1 の from, where の順序を入れ替えて最適化\n\t\t\tvar answers2 =\n\t\t\t\tfrom baker in five\n\t\t\t\twhere baker != 5\n\t\t\t\tfrom cooper in five\n\t\t\t\twhere cooper != 1\n\t\t\t\tfrom fletcher in five\n\t\t\t\twhere fletcher != 1 && fletcher != 5\n\t\t\t\twhere Discrete(fletcher, cooper)\n\t\t\t\tfrom miller in five\n\t\t\t\twhere miller > cooper\n\t\t\t\tfrom smith in five\n\t\t\t\twhere Discrete(smith, fletcher)\n\t\t\t\twhere Distinct(baker, cooper, fletcher, miller, smith)\n\t\t\t\tselect new { baker, cooper, fletcher, miller, smith };\n\n\t\t\t// answers2 とほぼ等価（透過識別子だけ整理）なクエリ演算\n\t\t\tvar answers02 = five\n\t\t\t\t.Where(baker => baker != 5)\n\t\t\t\t.SelectMany(x => five, (baker, cooper) => new { baker, cooper })\n\t\t\t\t.Where(x => x.cooper != 1)\n\t\t\t\t.SelectMany(x => five, (x, fletcher) => new { x.baker, x.cooper, fletcher })\n\t\t\t\t.Where(x => x.fletcher != 1 && x.fletcher != 5)\n\t\t\t\t.Where(x => Discrete(x.fletcher, x.cooper))\n\t\t\t\t.SelectMany(x => five, (x, miller) => new { x.baker, x.cooper, x.fletcher, miller })\n\t\t\t\t.Where(x => x.miller > x.cooper)\n\t\t\t\t.SelectMany(x => five, (x, smith) => new { x.baker, x.cooper, x.fletcher, x.miller, smith })\n\t\t\t\t.Where(x => Discrete(x.smith, x.fletcher))\n\t\t\t\t.Where(x => Distinct(x.baker, x.cooper, x.fletcher, x.miller, x.smith));\n\n\t\t\tCheckPerformance(answers1, \"クエリ式 　　　\");\n\t\t\tCheckPerformance(answers0, \"メソッド (等価)\");\n\t\t\tCheckPerformance(answers01, \"メソッド 　　　\");\n\t\t\tCheckPerformance(YieldAnswers1(), \"yield    　　　\");\n\t\t\tCheckPerformance<Tuple>(ListAnswers1, \"list     　　　\");\n\n\t\t\tCheckPerformance(answers2, \"クエリ式 最適化\");\n\t\t\tCheckPerformance(answers02, \"メソッド 最適化\");\n\t\t\tCheckPerformance(YieldAnswers2(), \"yield    最適化\");\n\t\t\tCheckPerformance<Tuple>(ListAnswers2, \"list     最適化\");\n\t\t}\n\n\t\t#region 補助関数\n\n\t\t// 1～5\n\t\tstatic IEnumerable<int> five = Enumerable.Range(1, 5);\n\n\t\t// x の要素に重複がないとき true\n\t\tstatic bool Distinct(params int[] x)\n\t\t{\n\t\t\treturn x.Distinct().Count() == x.Length;\n\t\t}\n\n\t\t// x, y が隣り合う数字でないとき true\n\t\tstatic bool Discrete(int x, int y)\n\t\t{\n\t\t\treturn Math.Abs(checked(x - y)) != 1;\n\t\t}\n\n\t\t#endregion\n\t\t#region パフォーマンス計測\n\n\t\tconst int N = 500;\n\t\tstatic bool quiet = true;\n\n\t\t/// <summary>\n\t\t/// クエリのパフォーマンスの確認。\n\t\t/// シーケンスを N 回 ToList() するのにかかる時間を計測。\n\t\t/// </summary>\n\t\t/// <typeparam name=\"T\"></typeparam>\n\t\t/// <param name=\"seq\">パフォーマンスを計りたいシーケンス</param>\n\t\t/// <param name=\"label\">結果表示用のラベル</param>\n\t\tstatic void CheckPerformance<T>(IEnumerable<T> seq, string label)\n\t\t{\n\t\t\tvar sw = new Stopwatch();\n\t\t\tsw.Start();\n\t\t\tfor (int i = 0; i < N; ++i)\n\t\t\t{\n\t\t\t\tvar x = seq.ToList();\n\t\t\t}\n\t\t\tsw.Stop();\n\t\t\tif (!quiet)\n\t\t\t\tforeach (var x in seq)\n\t\t\t\t\tConsole.WriteLine(x);\n\t\t\tConsole.Write(label + \" {0}\\n\", sw.ElapsedMilliseconds);\n\t\t}\n\n\t\t// 比較用。リスト版。\n\t\tstatic void CheckPerformance<T>(Func<List<T>> getList, string label)\n\t\t{\n\t\t\tvar sw = new Stopwatch();\n\t\t\tsw.Start();\n\t\t\tfor (int i = 0; i < N; ++i)\n\t\t\t{\n\t\t\t\tvar x = getList();\n\t\t\t}\n\t\t\tsw.Stop();\n\t\t\tif (!quiet)\n\t\t\t\tforeach (var x in getList())\n\t\t\t\t\tConsole.WriteLine(x);\n\t\t\tConsole.Write(label + \" {0}\\n\", sw.ElapsedMilliseconds);\n\t\t}\n\n\t\t#endregion\n\t\t#region イテレータ版\n\n\t\t/// <summary>\n\t\t/// 比較のため、イテレータ版を作りたいけど、\n\t\t/// イテレータは匿名メソッドでは作れない（＝ 匿名型を返せない）ので\n\t\t/// 等価な型を作成。\n\t\t/// </summary>\n\t\tstruct Tuple\n\t\t{\n\t\t\tpublic int baker { get; set; }\n\t\t\tpublic int cooper { get; set; }\n\t\t\tpublic int fletcher { get; set; }\n\t\t\tpublic int miller { get; set; }\n\t\t\tpublic int smith { get; set; }\n\n\t\t\tpublic override string ToString()\n\t\t\t{\n\t\t\t\treturn\n\t\t\t\t\t\"{ \" +\n\t\t\t\t\tstring.Format(\"baker = {0}, cooper = {1}, fletcher = {2}, miller = {3}, smith = {4}\",\n\t\t\t\t\t\tbaker, cooper, fletcher, miller, smith) +\n\t\t\t\t\t\" }\";\n\t\t\t}\n\t\t}\n\n\t\t// answers1 相当のイテレータ\n\t\tstatic IEnumerable<Tuple> YieldAnswers1()\n\t\t{\n\t\t\tforeach (var baker in five)\n\t\t\tforeach (var cooper in five)\n\t\t\tforeach (var fletcher in five)\n\t\t\tforeach (var miller in five)\n\t\t\tforeach (var smith in five)\n\t\t\tif (Distinct(baker, cooper, fletcher, miller, smith))\n\t\t\tif (baker != 5)\n\t\t\tif (cooper != 1)\n\t\t\tif (fletcher != 1 && fletcher != 5)\n\t\t\tif (miller > cooper)\n\t\t\tif (Discrete(smith, fletcher))\n\t\t\tif (Discrete(fletcher, cooper))\n\t\t\tyield return new Tuple { baker = baker, cooper = cooper, fletcher = fletcher, miller = miller, smith = smith };\n\t\t}\n\n\t\t// answers2 相当のイテレータ\n\t\tstatic IEnumerable<Tuple> YieldAnswers2()\n\t\t{\n\t\t\tforeach (var baker in five)\n\t\t\tif (baker != 5)\n\t\t\tforeach (var cooper in five)\n\t\t\tif (cooper != 1)\n\t\t\tforeach (var fletcher in five)\n\t\t\tif (fletcher != 1 && fletcher != 5)\n\t\t\tif (Discrete(fletcher, cooper))\n\t\t\tforeach (var miller in five)\n\t\t\tif (miller > cooper)\n\t\t\tforeach (var smith in five)\n\t\t\tif (Discrete(smith, fletcher))\n\t\t\tif (Distinct(baker, cooper, fletcher, miller, smith))\n\t\t\tyield return new Tuple { baker = baker, cooper = cooper, fletcher = fletcher, miller = miller, smith = smith };\n\t\t}\n\n\t\t#endregion\n\t\t#region リスト版\n\n\t\t// 比較用。YieldAnswers1 のリスト版\n\t\tstatic List<Tuple> ListAnswers1()\n\t\t{\n\t\t\tvar list = new List<Tuple>();\n\t\t\tforeach (var baker in five)\n\t\t\tforeach (var cooper in five)\n\t\t\tforeach (var fletcher in five)\n\t\t\tforeach (var miller in five)\n\t\t\tforeach (var smith in five)\n\t\t\tif (Distinct(baker, cooper, fletcher, miller, smith))\n\t\t\tif (baker != 5)\n\t\t\tif (cooper != 1)\n\t\t\tif (fletcher != 1 && fletcher != 5)\n\t\t\tif (miller > cooper)\n\t\t\tif (Discrete(smith, fletcher))\n\t\t\tif (Discrete(fletcher, cooper))\n\t\t\tlist.Add(new Tuple { baker = baker, cooper = cooper, fletcher = fletcher, miller = miller, smith = smith });\n\t\t\treturn list;\n\t\t}\n\n\t\t// 比較用。YieldAnswers2 のリスト版\n\t\tstatic List<Tuple> ListAnswers2()\n\t\t{\n\t\t\tvar list = new List<Tuple>();\n\t\t\tforeach (var baker in five)\n\t\t\tif (baker != 5)\n\t\t\tforeach (var cooper in five)\n\t\t\tif (cooper != 1)\n\t\t\tforeach (var fletcher in five)\n\t\t\tif (fletcher != 1 && fletcher != 5)\n\t\t\tif (Discrete(fletcher, cooper))\n\t\t\tforeach (var miller in five)\n\t\t\tif (miller > cooper)\n\t\t\tforeach (var smith in five)\n\t\t\tif (Discrete(smith, fletcher))\n\t\t\tif (Distinct(baker, cooper, fletcher, miller, smith))\n\t\t\tlist.Add(new Tuple { baker = baker, cooper = cooper, fletcher = fletcher, miller = miller, smith = smith });\n\t\t\treturn list;\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/CreateTestData.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace LinqToSqlTest\n{\n\tclass CreateTestData\n\t{\n\t\tstatic string basedir = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + \"\\\\\";\n\t\tstatic string ConnectionString = \"Data Source=.\\\\SQLEXPRESS;AttachDbFilename=\\\"\" + basedir + \"My\\\\Comic0.mdf\\\";Integrated Security=True;User Instance=True\";\n\n\t\tpublic static void Create()\n\t\t{\n\t\t\tstring data = @\"\n魔法先生ネギま！,20,赤松健,講談社,420,2007-10-17\nネギま！パーティーＢｏｏｋ ネギパ！,15,赤松健,講談社,500,2007-10-17\nネギま！パーティーＢｏｏｋ ネギパ！,14,赤松健,講談社,500,2007-09-14\nネギま！パーティーＢｏｏｋ ネギパ！,13,赤松健,講談社,500,2007-08-17\nネギま！パーティーＢｏｏｋ ネギパ！,12,赤松健,講談社,500,2007-07-17\n魔法先生ネギま！,19,赤松健,講談社,420,2007-07-17\nネギま！パーティーＢｏｏｋ ネギパ！,11,赤松健,講談社,500,2007-06-15\nネギま！パーティーＢｏｏｋ ネギパ！,10,赤松健,講談社,500,2007-05-17\nネギま！パーティーＢｏｏｋ ネギパ！,9,赤松健,講談社,500,2007-04-17\n魔法先生ネギま！,18,赤松健,講談社,420,2007-04-17\nネギま！パーティーＢｏｏｋ ネギパ！,8,赤松健,講談社,500,2007-03-16\nネギま！パーティーＢｏｏｋ ネギパ！,7,赤松健,講談社,500,2007-02-16\nネギま！パーティーＢｏｏｋ ネギパ！,6,赤松健,講談社,500,2007-01-17\n魔法先生ネギま！,17,赤松健,講談社,420,2007-01-17\nネギま！パーティーＢｏｏｋ ネギパ！,5,赤松健,講談社,500,2006-12-15\nネギま！パーティーＢｏｏｋ ネギパ！,4,赤松健,講談社,500,2006-11-17\n魔法先生ネギま！,16,赤松健,講談社,420,2006-10-17\nネギま！パーティーＢｏｏｋ ネギパ！,3,赤松健,講談社,500,2006-10-17\nネギま！パーティーＢｏｏｋ ネギパ！,2,赤松健,講談社,500,2006-09-15\n魔法先生ネギま！,15,赤松健,講談社,420,2006-08-17\nネギま！パーティーＢｏｏｋ ネギパ！,1,赤松健,講談社,500,2006-08-17\n魔法先生ネギま！,14,赤松健,講談社,420,2006-04-17\n魔法先生ネギま！,13,赤松健,講談社,410,2006-01-17\n魔法先生ネギま！,12,赤松健,講談社,410,2005-10-17\n魔法先生ネギま！,11,赤松健,講談社,410,2005-08-17\n魔法先生ネギま！,10,赤松健,講談社,420,2005-05-17\n魔法先生ネギま！,9,赤松健,講談社,420,2005-02-17\n魔法先生ネギま！,8,赤松健,講談社,420,2004-11-17\n魔法先生ネギま！,7,赤松健,講談社,420,2004-09-17\n魔法先生ネギま！,6,赤松健,講談社,420,2004-06-17\n魔法先生ネギま！,5,赤松健,講談社,420,2004-04-16\n魔法先生ネギま！,4,赤松健,講談社,420,2004-01-16\n魔法先生ネギま！,3,赤松健,講談社,420,2003-11-17\n魔法先生ネギま！,2,赤松健,講談社,410,2003-08-12\n魔法先生ネギま！,1,赤松健,講談社,420,2003-07-17\nラブひな∞,,赤松健,講談社,900,2002-07\nラブひな,14,赤松健,講談社,410,2002-01\nラブひな,13,赤松健,講談社,410,2001-10\nラブひな,12,赤松健,講談社,410,2001-07\nラブひな,11,赤松健,講談社,410,2001-04\nラブひな,10,赤松健,講談社,410,2001-01\nラブひな,9,赤松健,講談社,410,2000-10\nラブひな0,,赤松健,講談社,900,2000-07\nラブひな,8,赤松健,講談社,410,2000-07\nラブひな,7,赤松健,講談社,410,2000-04\nラブひな,6,赤松健,講談社,410,2000-02\nラブひな,5,赤松健,講談社,410,1999-11\nラブひな,4,赤松健,講談社,410,1999-09\nラブひな,3,赤松健,講談社,410,1999-06\nラブひな,2,赤松健,講談社,410,1999-04\nラブひな,1,赤松健,講談社,410,1999-03\nA・Iが止まらない,9,赤松健,講談社,410,1997-10\nA・Iが止まらない,8,赤松健,講談社,410,1997-05\nA・Iが止まらない,7,赤松健,講談社,407,1997-02\nA・Iが止まらない,6,赤松健,講談社,407,1996-07\nA・Iが止まらない,5,赤松健,講談社,407,1996-03\nA・Iが止まらない,4,赤松健,講談社,407,1995-07\nA・Iが止まらない,3,赤松健,講談社,407,1995-03\nA・Iが止まらない,2,赤松健,講談社,407,1994-11\nA・Iが止まらない,1,赤松健,講談社,407,1994-09\nさよなら絶望先生,10,久米田康治,講談社,420,2007-09-14\nさよなら絶望先生,9,久米田康治,講談社,420,2007-07-17\nさよなら絶望先生,8,久米田康治,講談社,420,2007-04-17\nさよなら絶望先生,7,久米田康治,講談社,420,2007-02-16\nさよなら絶望先生,6,久米田康治,講談社,420,2006-12-15\nさよなら絶望先生,5,久米田康治,講談社,420,2006-09-15\nさよなら絶望先生,4,久米田康治,講談社,420,2006-06-16\nさよなら絶望先生,3,久米田康治,講談社,420,2006-03-17\nさよなら絶望先生,2,久米田康治,講談社,420,2005-12-16\nさよなら絶望先生,1,久米田康治,講談社,420,2005-09-16\nかってに改蔵,26,久米田康治,小学館,410,2004-09-17\nかってに改蔵,25,久米田康治,小学館,410,2004-06-18\nかってに改蔵,24,久米田康治,小学館,410,2004-03-18\nかってに改蔵,23,久米田康治,小学館,410,2003-12-18\nかってに改蔵,22,久米田康治,小学館,410,2003-09-18\nかってに改蔵,21,久米田康治,小学館,410,2003-06-18\nかってに改蔵,20,久米田康治,小学館,410,2003-03-18\nかってに改蔵,19,久米田康治,小学館,410,2003-01-18\nかってに改蔵,18,久米田康治,小学館,410,2002-11-18\nかってに改蔵,17,久米田康治,小学館,410,2002-08-09\n育ってダーリン！！,2,久米田康治,小学館,500,2002-06-18\nかってに改蔵,16,久米田康治,小学館,410,2002-05-18\n育ってダーリン！！,1,久米田康治,小学館,500,2002-04\nかってに改蔵,15,久米田康治,小学館,410,2002-03-18\nかってに改蔵,14,久米田康治,小学館,410,2001-12\nかってに改蔵,13,久米田康治,小学館,410,2001-09\nかってに改蔵,12,久米田康治,小学館,410,2001-06\nかってに改蔵,11,久米田康治,小学館,410,2001-03\nかってに改蔵,10,久米田康治,小学館,410,2000-12\nかってに改蔵,9,久米田康治,小学館,410,2000-10\nかってに改蔵,8,久米田康治,小学館,410,2000-08\nかってに改蔵,7,久米田康治,小学館,410,2000-05\nかってに改蔵,6,久米田康治,小学館,410,2000-02\nかってに改蔵,5,久米田康治,小学館,410,1999-11\nかってに改蔵,4,久米田康治,小学館,410,1999-08\nかってに改蔵,3,久米田康治,小学館,410,1999-06\nかってに改蔵,2,久米田康治,小学館,410,1999-04\nかってに改蔵,1,久米田康治,小学館,410,1999-02\n太陽の戦士ポカポカ,5,久米田康治,小学館,410,1997-11\n太陽の戦士ポカポカ,4,久米田康治,小学館,410,1997-10\n太陽の戦士ポカポカ,3,久米田康治,小学館,410,1997-08\n太陽の戦士ポカポカ,2,久米田康治,小学館,410,1997-04\n太陽の戦士ポカポカ,1,久米田康治,小学館,407,1997-02\n行け！！南国アイスホッケー部,23,久米田康治,小学館,407,1996-12\n行け！！南国アイスホッケー部,22,久米田康治,小学館,407,1996-11\n行け！！南国アイスホッケー部,21,久米田康治,小学館,407,1996-09\n行け！！南国アイスホッケー部,20,久米田康治,小学館,407,1996-07\n行け！！南国アイスホッケー部,19,久米田康治,小学館,407,1996-04\n行け！！南国アイスホッケー部,18,久米田康治,小学館,407,1995-12\n行け！！南国アイスホッケー部,17,久米田康治,小学館,407,1995-08\n行け！！南国アイスホッケー部,16,久米田康治,小学館,398,1995-04\n行け！！南国アイスホッケー部,15,久米田康治,小学館,398,1995-01\n行け！！南国アイスホッケー部,14,久米田康治,小学館,398,1994-10\nルートパラダイス,2,久米田康治,小学館,509,1994-08\n行け！！南国アイスホッケー部,13,久米田康治,小学館,398,1994-07\n行け！！南国アイスホッケー部,12,久米田康治,小学館,398,1994-04\nルートパラダイス,1,久米田康治,小学館,509,1994-01\n行け！！南国アイスホッケー部,11,久米田康治,小学館,398,1994-01\n行け！！南国アイスホッケー部,10,久米田康治,小学館,398,1993-11\n行け！！南国アイスホッケー部,9,久米田康治,小学館,398,1993-08\n行け！！南国アイスホッケー部,8,久米田康治,小学館,398,1993-06\n行け！！南国アイスホッケー部,7,久米田康治,小学館,398,1993-03\n行け！！南国アイスホッケー部,6,久米田康治,小学館,398,1993-01\n行け！！南国アイスホッケー部,5,久米田康治,小学館,398,1992-10\n行け！！南国アイスホッケー部,4,久米田康治,小学館,398,1992-08\n行け！！南国アイスホッケー部,3,久米田康治,小学館,398,1992-06\n行け！！南国アイスホッケー部,2,久米田康治,小学館,398,1992-05\n行け！！南国アイスホッケー部,1,久米田康治,小学館,398,1992-02\nアニメ店長,3,島本和彦,一迅社,580,2007-09-25\n新吼えろペン,8,島本和彦,小学館,560,2007-08-17\n新吼えろペン,7,島本和彦,小学館,560,2007-04-19\n新吼えろペン,6,島本和彦,小学館,560,2007-01-19\nガレキの翔,,島本和彦,フォックス出版,680,2006-10\nあしたのジョーの方程式,,島本和彦,太田出版,1365,2006-09-14\n新吼えろペン,5,島本和彦,小学館,560,2006-07-19\n新吼えろペン,4,島本和彦,小学館,560,2006-04\n新吼えろペン,3,島本和彦,小学館,560,2005-12-19\nアニメ店長,2,島本和彦,一迅社,580,2005-09-24\n新吼えろペン,2,島本和彦,小学館,560,2005-07-19\n逆境ナイン,5,島本和彦,小学館,560,2005-06-17\n逆境ナイン,6,島本和彦,小学館,560,2005-06-17\n逆境ナイン,4,島本和彦,小学館,560,2005-05-19\n逆境ナイン,3,島本和彦,小学館,560,2005-05-19\n逆境ナイン,1,島本和彦,小学館,560,2005-04\n逆境ナイン,2,島本和彦,小学館,560,2005-04\n卓球社長,,島本和彦,小学館,550,2005-04\n新吼えろペン,1,島本和彦,小学館,560,2005-03\n吼えろペン,13,島本和彦,小学館,560,2004-12-17\n吼えろペン,12,島本和彦,小学館,560,2004-07-16\n吼えろペン,11,島本和彦,小学館,560,2004-07-16\nゲキトウ,1,島本和彦,講談社,540,2004-06-23\n吼えろペン,10,島本和彦,小学館,560,2004-01-19\nアニメ店長,1,島本和彦,スタジオディーエヌエー,580,2003-12-24\n吼えろペン,9,島本和彦,小学館,560,2003-10-18\n炎の転校生,2,島本和彦,小学館,630,2003-10\n吼えろペン,8,島本和彦,小学館,560,2003-07-19\n吼えろペン,7,島本和彦,小学館,560,2003-04-19\n吼えろペン,6,島本和彦,小学館,560,2002-12-12\n燃えよペン,,島本和彦,小学館,600,2002-11-19\n吼えろペン,5,島本和彦,小学館,560,2002-07-18\n吼えろペン,4,島本和彦,小学館,560,2002-04-19\n吼えろペン,3,島本和彦,小学館,560,2001-12\n吼えろペン,2,島本和彦,小学館,560,2001-09\n吼えろペン,1,島本和彦,小学館,560,2001-08\n怪奇カメムシ男,,島本和彦,エンターブレイン,819,2001-03\nハルマゲドン失敗す,,島本和彦,エンターブレイン,819,2001-03\nコックローチマン,,島本和彦,エンターブレイン,819,2001-02\n霊界トトカルチョ,,島本和彦,エンターブレイン,819,2001-02\n炎の転校生,6,島本和彦,小学館,378,2000\n燃えるV,3,島本和彦,小学館,378,2000\n炎の転校生,4,島本和彦,小学館,378,2000\n炎の転校生,1,島本和彦,小学館,378,2000\n挑戦者,2,島本和彦,小学館,377,2000\n炎の転校生,7,島本和彦,小学館,378,2000\n炎の転校生,3,島本和彦,小学館,378,2000\n炎の転校生,5,島本和彦,小学館,378,2000\n炎の転校生,2,島本和彦,小学館,378,2000\n炎の転校生,6,島本和彦,小学館,710,1999-08\nレッド・カード―男の一枚,4,島本和彦,角川書店,630,1999-06\n炎の転校生,5,島本和彦,小学館,710,1999-06\n炎の転校生,4,島本和彦,小学館,710,1999-04\n炎の転校生,3,島本和彦,小学館,710,1999-02\nレッド・カード―男の一枚,3,島本和彦,角川書店,609,1999-01\n炎の転校生,2,島本和彦,小学館,710,1998-12\n炎の転校生,1,島本和彦,小学館,710,1998-10\n炎の筆魂―島本和彦傑作選,2,島本和彦,朝日ソノラマ,840,1998-09\nレッド・カード―男の一枚,2,島本和彦,角川書店,588,1998-04\nレッド・カード―男の一枚,1,島本和彦,角川書店,567,1997-11\n炎の筆魂―島本和彦傑作選,1,島本和彦,朝日ソノラマ,840,1997-10\n炎の言霊―島本和彦名言集,,島本和彦,朝日ソノラマ,1155,1997-08\n燃えるV,3,島本和彦,大都社,882,1997-07\n燃えるV,2,島本和彦,大都社,882,1997-06\n燃えるV,1,島本和彦,大都社,882,1997-06\nオンセンマン,3,島本和彦,角川書店,588,1997-04\nオンセンマン,2,島本和彦,角川書店,571,1996-08\n流れ星のジャッカル,,島本和彦,メディアワークス,999,1996-04\nオンセンマン,1,島本和彦,角川書店,567,1995-11\nサムライスピリッツ,2,島本和彦,講談社,398,1995-04\nサムライスピリッツ,1,島本和彦,講談社,398,1994-10\n燃える女子プロレス,3,島本和彦,小学館,398,1994-02\n燃える女子プロレス,2,島本和彦,小学館,398,1993-08\nここまでスポ魂,,島本和彦,宝島社,1009,1993-07\n燃える女子プロレス,1,島本和彦,小学館,398,1993-04\n炎のニンジャマン,4,島本和彦,小学館,398,1992-11\n炎のニンジャマン,3,島本和彦,小学館,398,1992-10\n炎の転校生,6,島本和彦,小学館,795,1992-09\n炎のニンジャマン,2,島本和彦,小学館,398,1992-08\n炎の転校生,5,島本和彦,小学館,795,1992-08\n炎の転校生,4,島本和彦,小学館,795,1992-07\n炎の転校生,3,島本和彦,小学館,795,1992-06\n炎のニンジャマン,1,島本和彦,小学館,398,1992-06\n炎の転校生,2,島本和彦,小学館,795,1992-05\n炎の転校生,1,島本和彦,小学館,795,1992-04\n燃えよペン,,島本和彦,竹書房,897,1991-08\n炎の転校生,,島本和彦,扶桑社,704,1991-07\nバトルサンダー,3,島本和彦,講談社,398,1991-07\nバトルサンダー,2,島本和彦,講談社,398,1991-07\nバトルサンダー,1,島本和彦,講談社,398,1991-07\n挑戦者,4,島本和彦,小学館,398,1990-07\nデスパイ―DEATH PIE,,島本和彦,竹書房,541,1990-07\nBATTLEフィールド,1,島本和彦,小学館,509,1990-04\n挑戦者,3,島本和彦,小学館,377,1990-03\n挑戦者,1,島本和彦,小学館,378,1989-02\nとつげきウルフ,3,島本和彦,小学館,378,1987-12\nとつげきウルフ,2,島本和彦,小学館,378,1987-10\nとつげきウルフ,1,島本和彦,小学館,378,1987-08\n燃えるV,5,島本和彦,小学館,378,1987-02\n燃えるV,4,島本和彦,小学館,378,1986-12\n燃えるV,2,島本和彦,小学館,378,1986-08\n燃えるV,1,島本和彦,小学館,378,1986-07\n風の戦士ダン,9,島本和彦,小学館,378,1986-05\n炎の転校生,12,島本和彦,小学館,399,1986-01\n炎の転校生,11,島本和彦,小学館,378,1985-11\n炎の転校生,10,島本和彦,小学館,378,1985-08\n炎の転校生,9,島本和彦,小学館,378,1985-06\n炎の転校生,8,島本和彦,小学館,378,1985-05\n黒博物館スプリンガルド,,藤田和日郎,講談社,620,2007-09-21\n邪眼は月輪に飛ぶ,,藤田和日郎,小学館,550,2007-04-27\nからくりサーカス,43,藤田和日郎,小学館,410,2006-08-11\nからくりサーカス,42,藤田和日郎,小学館,410,2006-05-18\n暁の歌,,藤田和日郎,小学館,560,2006-05\n夜の歌,,藤田和日郎,小学館,560,2006-04\nからくりサーカス,41,藤田和日郎,小学館,410,2006-02-17\nからくりサーカス,40,藤田和日郎,小学館,410,2005-12-15\nからくりサーカス,39,藤田和日郎,小学館,410,2005-10-18\nからくりサーカス,38,藤田和日郎,小学館,410,2005-07-15\nからくりサーカス,37,藤田和日郎,小学館,410,2005-05-18\nからくりサーカス,36,藤田和日郎,小学館,410,2005-02-18\nからくりサーカス,35,藤田和日郎,小学館,410,2004-12-17\nからくりサーカス,34,藤田和日郎,小学館,410,2004-10-18\nからくりサーカス,33,藤田和日郎,小学館,410,2004-07-16\nからくりサーカス,32,藤田和日郎,小学館,410,2004-05-18\nからくりサーカス,31,藤田和日郎,小学館,410,2004-02-18\nからくりサーカス,30,藤田和日郎,小学館,410,2003-11-18\nからくりサーカス,29,藤田和日郎,小学館,410,2003-09-18\nからくりサーカス,28,藤田和日郎,小学館,410,2003-06-18\nからくりサーカス,27,藤田和日郎,小学館,410,2003-03-18\nからくりサーカス,26,藤田和日郎,小学館,410,2003-01-18\nからくりサーカス,25,藤田和日郎,小学館,410,2002-10-18\nからくりサーカス,24,藤田和日郎,小学館,410,2002-08-09\nからくりサーカス,23,藤田和日郎,小学館,410,2002-06-18\nからくりサーカス,22,藤田和日郎,小学館,410,2002-04-18\nからくりサーカス,21,藤田和日郎,小学館,410,2002-01\nからくりサーカス,20,藤田和日郎,小学館,410,2001-11\nからくりサーカス,19,藤田和日郎,小学館,410,2001-09\nからくりサーカス,18,藤田和日郎,小学館,410,2001-06\nからくりサーカス,17,藤田和日郎,小学館,410,2001-04\nからくりサーカス,16,藤田和日郎,小学館,410,2001-01\nからくりサーカス,15,藤田和日郎,小学館,410,2000-11\nからくりサーカス,14,藤田和日郎,小学館,410,2000-09\nからくりサーカス,13,藤田和日郎,小学館,410,2000-07\nからくりサーカス,12,藤田和日郎,小学館,410,2000-05\nからくりサーカス,11,藤田和日郎,小学館,410,2000-02\nからくりサーカス,10,藤田和日郎,小学館,410,1999-12\nからくりサーカス,9,藤田和日郎,小学館,410,1999-09\nからくりサーカス,8,藤田和日郎,小学館,410,1999-06\nからくりサーカス,7,藤田和日郎,小学館,410,1999-04\nからくりサーカス,6,藤田和日郎,小学館,410,1999-02\nからくりサーカス,5,藤田和日郎,小学館,410,1998-11\nからくりサーカス,4,藤田和日郎,小学館,410,1998-09\nからくりサーカス,3,藤田和日郎,小学館,410,1998-05\nからくりサーカス,2,藤田和日郎,小学館,410,1998-02\nからくりサーカス,1,藤田和日郎,小学館,410,1997-12\nうしおととら (外伝),,藤田和日郎,小学館,410,1997-06\nうしおととら,33,藤田和日郎,小学館,407,1997-01\nうしおととら,32,藤田和日郎,小学館,407,1996-11\nうしおととら,31,藤田和日郎,小学館,407,1996-10\nうしおととら,30,藤田和日郎,小学館,407,1996-08\nうしおととら,28,藤田和日郎,小学館,407,1996-04\nうしおととら,29,藤田和日郎,小学館,407,1996-04\nうしおととら,27,藤田和日郎,小学館,407,1996-01\nうしおととら,26,藤田和日郎,小学館,407,1995-11\nうしおととら,25,藤田和日郎,小学館,407,1995-09\nうしおととら,24,藤田和日郎,小学館,398,1995-05\nうしおととら,23,藤田和日郎,小学館,398,1995-03\nうしおととら,22,藤田和日郎,小学館,398,1994-12\nうしおととら,21,藤田和日郎,小学館,398,1994-09\nうしおととら,20,藤田和日郎,小学館,398,1994-07\nうしおととら,19,藤田和日郎,小学館,398,1994-06\nうしおととら,18,藤田和日郎,小学館,398,1994-04\nうしおととら,17,藤田和日郎,小学館,398,1993-11\nうしおととら,16,藤田和日郎,小学館,398,1993-07\nうしおととら,15,藤田和日郎,小学館,398,1993-05\nうしおととら,14,藤田和日郎,小学館,398,1993-03\nうしおととら,13,藤田和日郎,小学館,398,1992-12\nうしおととら,12,藤田和日郎,小学館,398,1992-09\nうしおととら,11,藤田和日郎,小学館,398,1992-07\nうしおととら,10,藤田和日郎,小学館,398,1992-06\nうしおととら,9,藤田和日郎,小学館,398,1992-03\nうしおととら,8,藤田和日郎,小学館,398,1992-01\nうしおととら,7,藤田和日郎,小学館,398,1991-11\nうしおととら,6,藤田和日郎,小学館,398,1991-09\nうしおととら,5,藤田和日郎,小学館,398,1991-08\nうしおととら,4,藤田和日郎,小学館,398,1991-05\nうしおととら,3,藤田和日郎,小学館,398,1991-03\nうしおととら,2,藤田和日郎,小学館,398,1990-12\nうしおととら,1,藤田和日郎,小学館,398,1990-11\n\";\n\n\t\t\tvar db = new ComicDataContext(ConnectionString);\n\t\t\tdb.DeleteDatabase();\n\t\t\tdb.CreateDatabase();\n\n\t\t\tstring[] lines = data.Split('\\n');\n\t\t\tforeach (var line in lines)\n\t\t\t{\n\t\t\t\tstring[] tokens = line.Split(',');\n\t\t\t\tif (tokens.Length != 6) continue;\n\t\t\t\tstring title = tokens[0];\n\t\t\t\tint vol = 0;\n\t\t\t\tint.TryParse(tokens[1], out vol);\n\t\t\t\tstring authorName = tokens[2];\n\t\t\t\tstring publisherName = tokens[3];\n\t\t\t\tint price = 0;\n\t\t\t\tint.TryParse(tokens[4], out price);\n\t\t\t\tDateTime d;\n\t\t\t\tDateTime.TryParse(tokens[5], out d);\n\t\t\t\tDateTime? date = d.Ticks == 0 ? (DateTime?)null : d;\n\n\t\t\t\tvar author = GetAuthor(db, authorName);\n\t\t\t\tvar pub = GetPublisher(db, publisherName);\n\t\t\t\tvar series = GetSeries(db, title, author, pub);\n\t\t\t\tvar book = new Book()\n\t\t\t\t{\n\t\t\t\t\tSeries = series,\n\t\t\t\t\tVolume = vol,\n\t\t\t\t\tReleaseDate = date,\n\t\t\t\t\tPrice = price,\n\t\t\t\t};\n\t\t\t\tdb.Book.InsertOnSubmit(book);\n\t\t\t\tdb.SubmitChanges();\n\t\t\t}\n\n\t\t\tSetAuthorInfo();\n\t\t}\n\n\t\tstatic void SetAuthorInfo()\n\t\t{\n\t\t\tvar db = new ComicDataContext(ConnectionString);\n\t\t\tAuthor a;\n\n\t\t\ta = GetAuthor(db, \"赤松健\");\n\t\t\ta.Kana = \"あかまつけん\";\n\t\t\ta.Birthday = new DateTime(1968, 7, 5);\n\t\t\ta.Url = \"http://www.ailove.net/main.html\";\n\t\t\tdb.SubmitChanges();\n\n\t\t\ta = GetAuthor(db, \"久米田康治\");\n\t\t\ta.Kana = \"くめたこうじ\";\n\t\t\ta.Birthday = new DateTime(1967, 9, 5);\n\t\t\ta.Url = \"http://websunday.net/backstage/kumeta.html\";\n\t\t\tdb.SubmitChanges();\n\n\t\t\ta = GetAuthor(db, \"藤田和日郎\");\n\t\t\ta.Kana = \"ふじたかずひろ\";\n\t\t\ta.Birthday = new DateTime(1964, 5, 24);\n\t\t\tdb.SubmitChanges();\n\n\t\t\ta = GetAuthor(db, \"島本和彦\");\n\t\t\ta.Kana = \"しまもとかずひこ\";\n\t\t\ta.Birthday = new DateTime(1961, 4, 26);\n\t\t\ta.Url = \"http://simamoto.zenryokutei.com/\";\n\t\t\tdb.SubmitChanges();\n\t\t}\n\n\t\tpublic static Author GetAuthor(ComicDataContext db, string name)\n\t\t{\n\t\t\tvar a = from x in db.Author where x.Name == name select x;\n\t\t\tif (a.Count() == 0)\n\t\t\t{\n\t\t\t\tvar author = new Author()\n\t\t\t\t{\n\t\t\t\t\tName = name\n\t\t\t\t};\n\t\t\t\tdb.Author.InsertOnSubmit(author);\n\t\t\t\tdb.SubmitChanges();\n\t\t\t\treturn author;\n\t\t\t}\n\t\t\treturn a.First();\n\t\t}\n\n\t\tpublic static Publisher GetPublisher(ComicDataContext db, string name)\n\t\t{\n\t\t\tvar a = from x in db.Publisher where x.Name == name select x;\n\t\t\tif (a.Count() == 0)\n\t\t\t{\n\t\t\t\tvar pub = new Publisher()\n\t\t\t\t{\n\t\t\t\t\tName = name\n\t\t\t\t};\n\t\t\t\tdb.Publisher.InsertOnSubmit(pub);\n\t\t\t\tdb.SubmitChanges();\n\t\t\t\treturn pub;\n\t\t\t}\n\t\t\treturn a.First();\n\t\t}\n\n\t\tpublic static Series GetSeries(ComicDataContext db, string name, Author aut, Publisher pub)\n\t\t{\n\t\t\tvar a = from x in db.Series where x.Name == name select x;\n\t\t\tif (a.Count() == 0)\n\t\t\t{\n\t\t\t\tvar series = new Series()\n\t\t\t\t{\n\t\t\t\t\tName = name,\n\t\t\t\t\tAuthor = aut,\n\t\t\t\t\tPublisher = pub,\n\t\t\t\t};\n\t\t\t\tdb.Series.InsertOnSubmit(series);\n\t\t\t\tdb.SubmitChanges();\n\t\t\t\treturn series;\n\t\t\t}\n\t\t\treturn a.First();\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/DuckTypingInterface.cs",
    "content": "﻿#define DYNAMIC\n\nusing System;\nusing System.Reflection;\n\n#region type Shape interface { func Area() double; func Perimeter() double; }\n\n/// <summary>\n/// Shape。\n/// C# 用の interface。\n/// </summary>\ninterface IShape\n{\n    /// <summary>\n    /// 面積を求める。\n    /// </summary>\n    /// <returns>面積。</returns>\n    double Area();\n\n    /// <summary>\n    /// 周長を求める。\n    /// </summary>\n    /// <returns>周長。</returns>\n    double Perimeter();\n}\n\n/// <summary>\n/// 動的ディスパッチ用のアダプター。\n/// 仮想メソッドテーブル ＋ インスタンスを抱えてる感じ。\n/// </summary>\n/// <typeparam name=\"T\">IShape に Duck Typing したい型。</typeparam>\nclass ShapeDispatcher<T> : IShape\n{\n    public T Instance;\n    public Func<T, double> AreaImpl;\n    public Func<T, double> PerimeterImpl;\n\n    #region C# の仕様とつなぎこむためのの部分\n\n    public double Area()\n    {\n        return AreaImpl(Instance);\n    }\n\n    public double Perimeter()\n    {\n        return PerimeterImpl(Instance);\n    }\n\n    #endregion\n}\n\nstatic partial class Methods\n{\n#if DYNAMIC\n    static readonly Type methods = typeof(Methods);\n\n    /// <summary>\n    /// T 型を IShape に Duck Typing するためのキャスト関数。\n    /// リフレクションを使った動的生成版。\n    /// </summary>\n    /// <remarks>\n    /// 毎度リフレクションしてると重たいけど、キャッシュ機構も組み込めばそれなりにパフォーマンス出ると思う。\n    /// </remarks>\n    /// <typeparam name=\"T\">IShape にキャストしたい型。</typeparam>\n    /// <param name=\"x\">そのインスタンス。</param>\n    /// <returns>IShape 化したもの。</returns>\n    public static IShape AsShape<T>(this T x)\n    {\n        var t = typeof(T);\n        Type TypeOfArea = typeof(Func<T, double>);\n        Type TypeOfPerimeter = typeof(Func<T, double>);\n\n        var areaInfo = methods.GetMethod(\"Area\", BindingFlags.Public | BindingFlags.Static, Type.DefaultBinder, new[] { t }, null);\n        var area = Delegate.CreateDelegate(TypeOfArea, areaInfo);\n\n        var perimeterInfo = methods.GetMethod(\"Perimeter\", BindingFlags.Public | BindingFlags.Static, Type.DefaultBinder, new[] { t }, null);\n        var perimeter = Delegate.CreateDelegate(TypeOfPerimeter, perimeterInfo);\n\n        return new ShapeDispatcher<T>\n        {\n            Instance = x,\n            AreaImpl = (Func<T, double>)area,\n            PerimeterImpl = (Func<T, double>)perimeter,\n        };\n    }\n#endif\n}\n\n#endregion\n#region type Rectangle struct { var Width double; var Height double; }\n// func (x Rectangle) Area () double { return x.Width * x.Height; }\n// func (x Rectangle) Perimeter () double { return 2 * (x.Width + x.Height); }\n\n/// <summary>\n/// 長方形。\n/// </summary>\n/// <remarks>\n/// クラス/構造体本体にはフィールドしか定義しない。\n/// 当然、IShape も継承しない。\n/// </remarks>\nstruct Rectangle\n{\n    public double Width;\n    public double Height;\n}\n\n/// <summary>\n/// メソッドは全部、拡張メソッド（static メソッド）として定義する。\n/// </summary>\nstatic partial class Methods\n{\n    /// <summary>\n    /// Rectangle 向けの Area 実装。\n    /// </summary>\n    /// <param name=\"x\">インスタンス。</param>\n    /// <returns>面積。</returns>\n    public static double Area(this Rectangle x)\n    {\n        return x.Width * x.Height;\n    }\n\n    /// <summary>\n    /// Rectangle 向けの Perimeter 実装。\n    /// </summary>\n    /// <param name=\"x\">インスタンス。</param>\n    /// <returns>周長。</returns>\n    public static double Perimeter(this Rectangle x)\n    {\n        return 2 * (x.Width + x.Height);\n    }\n\n#if !DYNAMIC\n    /// <summary>\n    /// Rectangle 型を IShape に Duck Typing するためのキャスト関数。\n    /// リフレクション使わない（コンパイル時解決が可能）ならこうやる。\n    /// </summary>\n    /// <param name=\"x\">インスタンス。</param>\n    /// <returns>IShape 化したもの。</returns>\n    public static IShape AsShape(this Rectangle x)\n    {\n        return new ShapeDispatcher<Rectangle>\n        {\n            Instance = x,\n            AreaImpl = Area,\n            PerimeterImpl = Perimeter,\n        };\n    }\n#endif\n}\n\n#endregion\n#region type Circle struct { var Radius double; }\n// func (x Circle) Area () double { return PI * x.Radius * x.Radius; }\n// func (x Circle) Perimeter () double { return 2 * Math.PI * x.Radius); }\n\n/// <summary>\n/// 円。\n/// </summary>\n/// <remarks>\n/// Rectangle 同様、フィールドしか定義しない。\n/// </remarks>\nstruct Circle\n{\n    public double Radius;\n}\n\nstatic partial class Methods\n{\n    /// <summary>\n    /// Circle 向けの Area 実装。\n    /// </summary>\n    /// <param name=\"x\">インスタンス。</param>\n    /// <returns>面積。</returns>\n    public static double Area(this Circle x)\n    {\n        return Math.PI * x.Radius * x.Radius;\n    }\n\n    /// <summary>\n    /// Circle 向けの Perimeter 実装。\n    /// </summary>\n    /// <param name=\"x\">インスタンス。</param>\n    /// <returns>周長。</returns>\n    public static double Perimeter(this Circle x)\n    {\n        return 2 * Math.PI * x.Radius;\n    }\n\n#if !DYNAMIC\n    /// <summary>\n    /// Circle 型を IShape に Duck Typing するためのキャスト関数。\n    /// Shape 同様、コンパイル時解決用。\n    /// </summary>\n    /// <param name=\"x\">インスタンス。</param>\n    /// <returns>IShape 化したもの。</returns>\n    public static IShape AsShape(this Circle x)\n    {\n        return new ShapeDispatcher<Circle>\n        {\n            Instance = x,\n            AreaImpl = Area,\n            PerimeterImpl = Perimeter,\n        };\n    }\n#endif\n}\n\n#endregion\n\n/// <summary>\n/// 利用例。\n/// </summary>\nclass DuckTypingInterface\n{\n    /// <summary>\n    /// 上で書いたコードの利用例。\n    /// </summary>\n    public static void Test()\n    {\n        var rect = new Rectangle { Width = 2, Height = 3 };\n        var circle = new Circle { Radius = 1.41421356 };\n\n        Console.WriteLine(\"長方形\");\n        Output(rect.AsShape());\n        Console.WriteLine(\"円\");\n        Output(circle.AsShape());\n    }\n\n    /// <summary>\n    /// よくある interface のサンプルコード。\n    /// 図形の面積と周長を Console 出力。\n    /// </summary>\n    /// <param name=\"s\"></param>\n    static void Output(IShape s)\n    {\n        Console.WriteLine(\"面積: {0}\", s.Area());\n        Console.WriteLine(\"周長: {0}\", s.Perimeter());\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/DynamicXml.cs",
    "content": "using System.Linq;\nusing System.Dynamic;\nusing System.Xml.Linq;\n\nnamespace Ufcpp.Dynamic\n{\n    /// <summary>\n    /// XML を PowerShell の [xml] 並に動的簡単読み出しするための DynamicObject。\n    /// 今のところ読み取り専用。\n    /// </summary>\n    public class DynamicXml : DynamicObject\n    {\n        XElement element;\n\n        /// <summary>\n        /// XElement を与えて初期化。\n        /// </summary>\n        /// <param name=\"element\">読み取り対象の XElement。</param>\n        public DynamicXml(XElement element) { this.element = element; }\n\n        /// <summary>\n        /// XDocument を与えて初期化。\n        /// ルート要素を読み出し。\n        /// </summary>\n        /// <param name=\"doc\">読み取り対象の XDocument。</param>\n        public DynamicXml(XDocument doc) : this(doc.Root) { }\n\n        /// <summary>\n        /// ファイルのパスを与えて初期化。\n        /// </summary>\n        /// <param name=\"uri\">読み取り対象の XML ファイル名。</param>\n        public DynamicXml(string uri) : this(XDocument.Load(uri)) { }\n\n        public override bool TryGetMember(System.Dynamic.GetMemberBinder binder, out object result)\n        {\n            var name = binder.Name;\n\n            // 属性値は _属性名 で取得。文字列として返す。\n            if (name.StartsWith(\"_\"))\n            {\n                var attName = name.Substring(1);\n\n                result = element.Attribute(attName).Value;\n                return true;\n            }\n\n            var subElements = element.Elements(name).ToList();\n\n            // 要素がないときは null 返す。\n            if (subElements.Count == 0)\n            {\n                result = (string)null;\n                return true;\n            }\n\n            // 要素が1個だけの時は素直にその要素を返す。\n            if (subElements.Count == 1)\n            {\n                var e = subElements[0];\n\n                result = new DynamicXml(e);\n                return true;\n            }\n\n            // 要素が複数ある時はリストで要素一覧を返す。\n            var es = subElements.Select(x => new DynamicXml(x));\n            result = es.ToList();\n            return true;\n        }\n\n        public override bool TryConvert(ConvertBinder binder, out object result)\n        {\n            // string へのキャストで、要素の値を取得。\n            if (binder.Type == typeof(string))\n            {\n                result = element.Value;\n                return true;\n            }\n            // int へのキャストで int.Parse。\n            // Parse できないときは例外丸投げ。\n            if (binder.Type == typeof(int))\n            {\n                result = int.Parse(element.Value);\n                return true;\n            }\n\n            // 要素単体に対して foreach やっちゃったときでもエラーにならないように、IEnumerable へのキャストを定義。\n            // これやっとかないと、元々複数要素あったのに XML を修正して要素が1個だけになった時に挙動おかしくなる。\n            if (binder.Type == typeof(System.Collections.IEnumerable))\n            {\n                result = new[] { this };\n                return true;\n            }\n\n            result = null;\n            return false;\n        }\n\n        public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result)\n        {\n            switch (binder.Name)\n            {\n                case \"GetEnumerator\": // IEnumerable へのキャストと同様の理由。\n                    result = new[] { this }.GetEnumerator();\n                    return true;\n\n                case \"All\": // All() 呼び出しで、子要素を全部取得できるようにする。\n                    result = element.Elements().Select(x => new DynamicXml(x)).ToList();\n                    return true;\n\n                case \"Name\": // Name() で要素名を取得。\n                    result = element.Name.ToString();\n                    return true;\n            }\n\n            return base.TryInvokeMember(binder, args, out result);\n        }\n\n        public override string ToString()\n        {\n            return element.Value;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/ExpressionTemplates.xaml",
    "content": "﻿<ResourceDictionary\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:q=\"clr-namespace:System.Linq.Expressions;assembly=System.Core\"\n  xmlns:c=\"clr-namespace:System;assembly=mscorlib\"\n  xmlns:l=\"clr-namespace:LinqTreeView\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\n  \n  <l:LightenConverter x:Key=\"lighten1\" Factor=\"20\"/>\n\n  <l:LightenConverter x:Key=\"lighten2\" Factor=\"5\"/>\n  \n  <l:ToStringConverter x:Key=\"toString\"/>\n\n  <ControlTemplate\n    x:Key=\"contentWithRect\"\n    TargetType=\"{x:Type ContentControl}\"\n    >\n    <Grid\n      Margin=\"10, 5, 10, 5\"\n      ToolTip=\"{Binding RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}, Path=DataContext, Converter={StaticResource toString}}\"\n      >\n      <Rectangle\n        StrokeThickness=\"1\"\n        RadiusX=\"5\" RadiusY=\"5\">\n        <Rectangle.Stroke>\n          <SolidColorBrush Color=\"{Binding RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}, Path=Background.Color}\"/>\n        </Rectangle.Stroke>\n        <Rectangle.Fill>\n          <LinearGradientBrush StartPoint=\"0.5,0\" EndPoint=\"0.5,1\">\n            <GradientStop Offset=\"0\" Color=\"{Binding RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}, Path=Background.Color, Converter={StaticResource lighten1}}\"/>\n            <GradientStop Offset=\"1\" Color=\"{Binding RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}, Path=Background.Color, Converter={StaticResource lighten2}}\"/>\n          </LinearGradientBrush>\n        </Rectangle.Fill>\n      </Rectangle>\n      <ContentPresenter />\n    </Grid>\n  </ControlTemplate>\n  \n  <DataTemplate\n    DataType=\"{x:Type c:Type}\"\n    >\n    <Label\n      Content=\"{Binding Path=Name}\"\n      ToolTip=\"{Binding Path=FullName}\"\n      />\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:LambdaExpression}\"\n    >\n    <ContentControl\n      Background=\"Silver\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <Label>Lamba (</Label>\n        <ItemsControl ItemsSource=\"{Binding Path=Parameters}\"/>\n        <Label>) => </Label>\n        <ContentControl Content=\"{Binding Path=Body}\"/>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:ParameterExpression}\"\n    >\n    <ContentControl\n      Background=\"Black\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel Orientation=\"Horizontal\">\n        <Label Content=\"{Binding Path=Name}\"/>\n        <Label>:</Label>\n        <ContentControl Content=\"{Binding Path=Type}\"/>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:ConstantExpression}\"\n    >\n    <ContentControl\n      Background=\"Gold\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel Orientation=\"Horizontal\">\n        <Label Content=\"{Binding Path=Value}\"/>\n        <Label>:</Label>\n        <ContentControl Content=\"{Binding Path=Type}\"/>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:BinaryExpression}\"\n    >\n    <ContentControl\n      Background=\"Blue\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <Label Content=\"{Binding Path=NodeType}\"/>\n        <ContentControl Content=\"{Binding Path=Left}\"/>\n        <ContentControl Content=\"{Binding Path=Right}\"/>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:UnaryExpression}\"\n    >\n    <ContentControl\n      Background=\"DodgerBlue\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <Label Content=\"{Binding Path=NodeType}\"/>\n        <ContentControl Content=\"{Binding Path=Operand}\"/>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:ConditionalExpression}\"\n    >\n    <ContentControl\n      Background=\"Green\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <Label>if(</Label>\n        <ContentControl Content=\"{Binding Path=Test}\"/>\n        <Label>) {</Label>\n        <ContentControl Content=\"{Binding Path=IfTrue}\"/>\n        <Label>} else {</Label>\n        <ContentControl Content=\"{Binding Path=IfFalse}\"/>\n        <Label>}</Label>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:MemberExpression}\"\n    >\n    <ContentControl\n      Background=\"Violet\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <StackPanel Orientation=\"Horizontal\">\n          <Label>Member</Label>\n          <Label Content=\"{Binding Path=Member.Name}\"/>\n          <ContentControl Content=\"{Binding Path=Member.Type}\"/>\n          <Label>of</Label>\n        </StackPanel>\n        <ContentControl Content=\"{Binding Path=Expression}\"/>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:NewExpression}\"\n    >\n    <ContentControl\n      Background=\"Indigo\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <StackPanel Orientation=\"Horizontal\">\n          <Label>New </Label>\n          <ContentControl Content=\"{Binding Path=Type}\"/>\n          <Label>(</Label>\n        </StackPanel>\n        <ItemsControl ItemsSource=\"{Binding Path=Arguments}\"/>\n        <Label>)</Label>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:NewArrayExpression}\"\n    >\n    <ContentControl\n      Background=\"DarkViolet\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <StackPanel Orientation=\"Horizontal\">\n          <Label>New</Label>\n          <ContentControl Content=\"{Binding Path=Type}\"/>\n          <Label>[] {</Label>\n        </StackPanel>\n        <ItemsControl ItemsSource=\"{Binding Path=Expressions}\"/>\n        <Label>}</Label>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:MemberInitExpression}\"\n    >\n    <ContentControl\n      Background=\"Navy\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <ContentControl Content=\"{Binding Path=NewExpression}\"/>\n        <Label>{</Label>\n        <ItemsControl ItemsSource=\"{Binding Path=Bindings}\"/>\n        <Label>}</Label>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:ListInitExpression}\"\n    >\n    <ContentControl\n      Background=\"Purple\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <ContentControl Content=\"{Binding Path=NewExpression}\"/>\n        <Label>{</Label>\n        <ItemsControl ItemsSource=\"{Binding Path=Initializers}\"/>\n        <Label>}</Label>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:ElementInit}\"\n    >\n    <ItemsControl ItemsSource=\"{Binding Path=Arguments}\" />\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:MemberBinding}\"\n    >\n    <ContentControl\n      Background=\"GreenYellow\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <StackPanel Orientation=\"Horizontal\">\n          <Label Content=\"{Binding Path=Member.Name}\"/>\n          <Label> = </Label>\n        </StackPanel>\n        <ContentControl Content=\"{Binding Path=Expression}\"/>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:MemberMemberBinding}\"\n    >\n    <ContentControl\n      Background=\"YellowGreen\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <StackPanel Orientation=\"Horizontal\">\n          <Label Content=\"{Binding Path=Member.Name}\"/>\n          <Label>=</Label>\n        </StackPanel>\n        <ItemsControl ItemsSource=\"{Binding Path=Bindings}\"/>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:MemberListBinding}\"\n    >\n    <ContentControl\n      Background=\"Aquamarine\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <StackPanel Orientation=\"Horizontal\">\n          <Label Content=\"{Binding Path=Member.Name}\"/>\n          <Label>= {</Label>\n        </StackPanel>\n        <ItemsControl ItemsSource=\"{Binding Path=Initializers}\"/>\n        <Label>}</Label>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:MethodCallExpression}\"\n    >\n    <ContentControl\n      Background=\"Red\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <StackPanel Orientation=\"Horizontal\">\n          <Label>Method </Label>\n          <Label Content=\"{Binding Path=Method.Name}\"/>\n          <Label> : </Label>\n          <ContentControl Content=\"{Binding Path=Method.ReturnType}\"/>\n          <Label> (</Label>\n        </StackPanel>\n        <ItemsControl ItemsSource=\"{Binding Path=Arguments}\"/>\n        <Label>)</Label>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n  <DataTemplate\n    DataType=\"{x:Type q:InvocationExpression}\"\n    >\n    <ContentControl\n      Background=\"Crimson\"\n      Template=\"{StaticResource contentWithRect}\"\n      >\n      <StackPanel>\n        <Label>Invoke</Label>\n        <Label Content=\"{Binding Path=Expression}\"/>\n        <Label>(</Label>\n        <ItemsControl ItemsSource=\"{Binding Path=Arguments}\"/>\n        <Label>)</Label>\n      </StackPanel>\n    </ContentControl>\n  </DataTemplate>\n\n</ResourceDictionary>"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/ExpressionTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.IO;\nusing System.Text;\nusing System.Reflection;\n\nnamespace ExpressionTree\n{\n\tclass ExpressionTest\n\t{\n\t\tstatic public void Main()\n\t\t{\n\t\t\tLambda();\n\t\t\tArithmeticUnaryOperator();\n\t\t\tArithmeticBinaryOperator();\n\t\t\tComparisonOperator();\n\t\t\tLogicalOperator();\n\t\t\tOtherOperator();\n\t\t\tTypeOperator();\n\t\t\tMemberAccess();\n\t\t\tNew();\n\t\t\tCall();\n\t\t}\n\t\t#region 2つの Expression が一致するかどうか確認\n\n\t\tstatic void SimpleCheck(Expression e1, Expression e2)\n\t\t{\n\t\t\tSimpleCheck(e1, e2, false);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 式木の構造が一致してれば、少なくとも ToString の結果は一致するので、\n\t\t/// それで2つの式木の一致性を判定。\n\t\t/// </summary>\n\t\tstatic void SimpleCheck(Expression e1, Expression e2, bool verbose)\n\t\t{\n\t\t\tif (e1.ToString() != e2.ToString())\n\t\t\t{\n\t\t\t\tConsole.Write(\"not match: {0}, {1}\\n\", e1, e2);\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region Paramter\n\n\t\tstatic ParameterExpression intX = Expression.Parameter(typeof(int), \"x\");\n\t\tstatic ParameterExpression intY = Expression.Parameter(typeof(int), \"y\");\n\t\tstatic ParameterExpression boolX = Expression.Parameter(typeof(bool), \"x\");\n\t\tstatic ParameterExpression boolY = Expression.Parameter(typeof(bool), \"y\");\n\n\t\t#endregion\n\t\t#region テスト\n\n\t\tstatic void Lambda()\n\t\t{\n\t\t\t// Constant\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression(() => 5).Body,\n\t\t\t\tExpression.Constant(5)\n\t\t\t\t);\n\n\t\t\t// Paramter\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x) => x).Body,\n\t\t\t\tintX\n\t\t\t\t);\n\n\t\t\t// Lambda\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x) => 0),\n\t\t\t\tExpression.Lambda<Func<int, int>>(\n\t\t\t\t\tExpression.Constant(0), // Body\n\t\t\t\t\tintX) // Paremters[0]\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x) => x + 5),\n\t\t\t\tExpression.Lambda(Expression.Add(intX, Expression.Constant(5)), intX)\n\t\t\t\t);\n\n\t\t\t// Quote\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression(() => (Expression<Func<int>>)(() => 0)).Body,\n\t\t\t\tExpression.Convert(Expression.Quote(\n\t\t\t\t\t(Expression<Func<int>>)(() => 0)),\n\t\t\t\t\ttypeof(Expression<Func<int>>))\n\t\t\t\t);\n\t\t}\n\n\t\tstatic void ArithmeticUnaryOperator()\n\t\t{\n\t\t\t// ↓これは最適化がかかって +x が x になる。\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x) => +x).Body,\n\t\t\t\tintX\n\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((CustomUnaryPlus x) => +x).Body,\n\t\t\t\tExpression.UnaryPlus(Expression.Parameter(typeof(CustomUnaryPlus), \"x\"))\n\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x) => -x).Body,\n\t\t\t\tExpression.Negate(intX)\n\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x) => checked(-x)).Body,\n\t\t\t\tExpression.NegateChecked(intX)\n\t\t\t);\n\t\t}\n\n\t\tstatic void ArithmeticBinaryOperator()\n\t\t{\n\t\t\t// unchecked\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x + y).Body,\n\t\t\t\tExpression.Add(intX, intY)\n\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x - y).Body,\n\t\t\t\tExpression.Subtract(intX, intY)\n\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x * y).Body,\n\t\t\t\tExpression.Multiply(intX, intY)\n\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x / y).Body,\n\t\t\t\tExpression.Divide(intX, intY)\n\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x % y).Body,\n\t\t\t\tExpression.Modulo(intX, intY)\n\t\t\t);\n\n\t\t\t// checked\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => checked(x + y)).Body,\n\t\t\t\tExpression.AddChecked(intX, intY)\n\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => checked(x - y)).Body,\n\t\t\t\tExpression.SubtractChecked(intX, intY)\n\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => checked(x * y)).Body,\n\t\t\t\tExpression.MultiplyChecked(intX, intY)\n\t\t\t);\n\n\t\t\t// たとえ checked がついていても、\n\t\t\t// double 同士の演算はオーバーフローをチェックしない\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((double x, double y) => checked(x + y)).Body,\n\t\t\t\tExpression.Add(\n\t\t\t\t\tExpression.Parameter(typeof(double), \"x\"),\n\t\t\t\t\tExpression.Parameter(typeof(double), \"y\"))\n\t\t\t);\n\n\t\t\t// Power\n\t\t}\n\n\t\tstatic void ComparisonOperator()\n\t\t{\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x == y).Body,\n\t\t\t\tExpression.Equal(intX, intY)\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x != y).Body,\n\t\t\t\tExpression.NotEqual(intX, intY)\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x < y).Body,\n\t\t\t\tExpression.LessThan(intX, intY)\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x <= y).Body,\n\t\t\t\tExpression.LessThanOrEqual(intX, intY)\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x > y).Body,\n\t\t\t\tExpression.GreaterThan(intX, intY)\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x >= y).Body,\n\t\t\t\tExpression.GreaterThanOrEqual(intX, intY)\n\t\t\t\t);\n\t\t}\n\n\t\tstatic void LogicalOperator()\n\t\t{\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x & y).Body,\n\t\t\t\tExpression.And(intX, intY)\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x | y).Body,\n\t\t\t\tExpression.Or(intX, intY)\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x ^ y).Body,\n\t\t\t\tExpression.ExclusiveOr(intX, intY)\n\t\t\t\t);\n\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((bool x) => !x).Body,\n\t\t\t\tExpression.Not(boolX)\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x) => ~x).Body,\n\t\t\t\tExpression.Not(intX)\n\t\t\t\t);\n\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((bool x, bool y) => x && y).Body,\n\t\t\t\tExpression.AndAlso(boolX, boolY)\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((bool x, bool y) => x || y).Body,\n\t\t\t\tExpression.OrElse(boolX, boolY)\n\t\t\t\t);\n\t\t}\n\n\t\tstatic void OtherOperator()\n\t\t{\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x << y).Body,\n\t\t\t\tExpression.LeftShift(intX, intY)\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x >> y).Body,\n\t\t\t\tExpression.RightShift(intX, intY)\n\t\t\t\t);\n\n\t\t\tvar nIntX = Expression.Parameter(typeof(int?), \"x\");\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int? x, int y) => x ?? y).Body,\n\t\t\t\tExpression.Coalesce(nIntX, intY)\n\t\t\t\t);\n\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x, int y) => x > y ? x : y).Body,\n\t\t\t\tExpression.Condition(\n\t\t\t\t\tExpression.GreaterThan(intX, intY),\n\t\t\t\t\tintX, intY)\n\t\t\t\t);\n\t\t}\n\n\t\tstatic void TypeOperator()\n\t\t{\n\t\t\tvar objX = Expression.Parameter(typeof(object), \"x\");\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((object x) => x as int?).Body,\n\t\t\t\tExpression.TypeAs(objX, typeof(int?))\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((object x) => x is int).Body,\n\t\t\t\tExpression.TypeIs(objX, typeof(int))\n\t\t\t\t);\n\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x) => (byte)x).Body,\n\t\t\t\tExpression.Convert(intX, typeof(byte))\n\t\t\t\t);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int x) => checked((byte)x)).Body,\n\t\t\t\tExpression.ConvertChecked(intX, typeof(byte))\n\t\t\t\t);\n\t\t}\n\n\t\tstatic void MemberAccess()\n\t\t{\n\t\t\tvar point = Expression.Parameter(typeof(Point), \"p\");\n\t\t\tvar intArray = Expression.Parameter(typeof(int[]), \"x\");\n\n\t\t\tvar xx = Make.Expression((int[] x) => x[0]).Body;\n\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((Point p) => p.X).Body,\n\t\t\t\tExpression.MakeMemberAccess(point, typeof(Point).GetProperty(\"X\"))\n\t\t\t\t);\n\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int[] x) => x.Length).Body,\n\t\t\t\tExpression.ArrayLength(intArray)\n\t\t\t\t);\n\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression((int[] x) => x[0]).Body,\n\t\t\t\tExpression.ArrayIndex(intArray, Expression.Constant(0))\n\t\t\t\t);\n\t\t}\n\n\t\tstatic void New()\n\t\t{\n\t\t\tvar pointCtor0 = typeof(Point).GetConstructor(new Type[0]);\n\t\t\tvar pointCtor2 = typeof(Point).GetConstructor(new[] { typeof(int), typeof(int) });\n\t\t\tvar c1 = Expression.Constant(1);\n\t\t\tvar c2 = Expression.Constant(2);\n\n\t\t\t// new\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression(() => new Point(1, 2)).Body,\n\t\t\t\tExpression.New(pointCtor2, c1, c2)\n\t\t\t\t);\n\n\t\t\t// array new\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression(() => new int[] { 1, 2 }).Body,\n\t\t\t\tExpression.NewArrayInit(typeof(int), c1, c2)\n\t\t\t\t);\n\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression(() => new int[2]).Body,\n\t\t\t\tExpression.NewArrayBounds(typeof(int), c2)\n\t\t\t\t);\n\n\t\t\t// new with object initializer\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression(() => new Point { X = 1, Y = 2 }).Body,\n\t\t\t\tExpression.MemberInit(\n\t\t\t\t\tExpression.New(pointCtor0),\n\t\t\t\t\tExpression.Bind(typeof(Point).GetProperty(\"X\"), c1),\n\t\t\t\t\tExpression.Bind(typeof(Point).GetProperty(\"Y\"), c2))\n\t\t\t\t);\n\n\t\t\t// new with recursive object initializer\n\t\t\tvar lineCtor = typeof(LineSegment).GetConstructor(new Type[0]);\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression(() =>\n\t\t\t\tnew LineSegment\n\t\t\t\t{\n\t\t\t\t\tStart = { X = 1, Y = 1 },\n\t\t\t\t\tEnd = { X = 2, Y = 2 }\n\t\t\t\t}).Body,\n\t\t\t\tExpression.MemberInit(\n\t\t\t\t\tExpression.New(lineCtor),\n\t\t\t\t\tExpression.MemberBind(typeof(LineSegment).GetProperty(\"Start\"),\n\t\t\t\t\t\tExpression.Bind(typeof(Point).GetProperty(\"X\"), c1),\n\t\t\t\t\t\tExpression.Bind(typeof(Point).GetProperty(\"Y\"), c1)),\n\t\t\t\t\tExpression.MemberBind(typeof(LineSegment).GetProperty(\"End\"),\n\t\t\t\t\t\tExpression.Bind(typeof(Point).GetProperty(\"X\"), c2),\n\t\t\t\t\t\tExpression.Bind(typeof(Point).GetProperty(\"Y\"), c2))\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t// new with list initializer\n\t\t\tvar polylineCtor = typeof(Polyline).GetConstructor(new Type[0]);\n\t\t\tvar listAdd = typeof(List<Point>).GetMethod(\"Add\", new[] { typeof(Point) });\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression(() =>\n\t\t\t\t\tnew Polyline\n\t\t\t\t\t{\n\t\t\t\t\t\tVertices = {\n\t\t\t\t\t\t\tnew Point{ X = 1, Y = 1 },\n\t\t\t\t\t\t\tnew Point{ X = 2, Y = 2 },\n\t\t\t\t\t\t}\n\t\t\t\t\t}).Body,\n\t\t\t\tExpression.MemberInit(\n\t\t\t\t\tExpression.New(polylineCtor),\n\t\t\t\t\tExpression.ListBind(typeof(Polyline).GetProperty(\"Vertices\"),\n\t\t\t\t\t\tExpression.ElementInit(listAdd,\n\t\t\t\t\t\t\tExpression.MemberInit(\n\t\t\t\t\t\t\t\tExpression.New(pointCtor0),\n\t\t\t\t\t\t\t\tExpression.Bind(typeof(Point).GetProperty(\"X\"), c1),\n\t\t\t\t\t\t\t\tExpression.Bind(typeof(Point).GetProperty(\"Y\"), c1))),\n\t\t\t\t\t\tExpression.ElementInit(listAdd,\n\t\t\t\t\t\t\tExpression.MemberInit(\n\t\t\t\t\t\t\t\tExpression.New(pointCtor0),\n\t\t\t\t\t\t\t\tExpression.Bind(typeof(Point).GetProperty(\"X\"), c2),\n\t\t\t\t\t\t\t\tExpression.Bind(typeof(Point).GetProperty(\"Y\"), c2)))\n\t\t\t\t\t))\n\t\t\t\t);\n\t\t}\n\n\t\tstatic void Call()\n\t\t{\n\t\t\tvar mathAbs = typeof(Math).GetMethod(\"Abs\", new[] { typeof(int) });\n\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression(() => Math.Abs(1)).Body,\n\t\t\t\tExpression.Call(mathAbs, Expression.Constant(1))\n\t\t\t\t);\n\n\t\t\tnew ExpressionToMultiLineTest().Invoke();\n\t\t}\n\n\t\tvoid Invoke()\n\t\t{\n\t\t\tvar absInfo = this.GetType().GetField(\"abs\", BindingFlags.NonPublic | BindingFlags.Instance);\n\n\t\t\tSimpleCheck(\n\t\t\t\tMake.Expression(() => abs(1)).Body,\n\t\t\t\tExpression.Invoke(\n\t\t\t\t\tExpression.MakeMemberAccess(\n\t\t\t\t\t\tExpression.Constant(this), absInfo),\n\t\t\t\t\tExpression.Constant(1))\n\t\t\t\t);\n\t\t}\n\n\t\tFunc<int, int> abs = Math.Abs;\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/ExpressionTreeTemplates.xaml",
    "content": "﻿<ResourceDictionary\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:q=\"clr-namespace:System.Linq.Expressions;assembly=System.Core\"\n  xmlns:c=\"clr-namespace:System;assembly=mscorlib\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\n\n    <ControlTemplate\n        x:Key=\"contentWithRect\"\n        TargetType=\"{x:Type ContentControl}\">\n\n        <Grid Margin=\"10, 5, 10, 5\">\n            <Grid.ToolTip>\n                <TextBlock Text=\"{Binding RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}, Path=DataContext}\" />\n            </Grid.ToolTip>\n            <Rectangle\n                StrokeThickness=\"1\"\n                Stroke=\"Black\"\n                Fill=\"{Binding RelativeSource={RelativeSource AncestorType={x:Type ContentControl}}, Path=Background}\"\n                RadiusX=\"5\" RadiusY=\"5\">\n            </Rectangle>\n            <ContentPresenter Margin=\"3\" />\n        </Grid>\n    </ControlTemplate>\n\n    <DataTemplate DataType=\"{x:Type c:Type}\">\n        <TextBlock\n            Text=\"{Binding Name}\"\n            ToolTip=\"{Binding FullName}\" />\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:LambdaExpression}\">\n        <ContentControl\n            Background=\"AntiqueWhite\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <TextBlock>Lamba (</TextBlock>\n                <ItemsControl ItemsSource=\"{Binding Parameters}\" />\n                <TextBlock>) =></TextBlock>\n                <ContentControl Content=\"{Binding Body}\" />\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:ParameterExpression}\">\n        <ContentControl\n            Background=\"AliceBlue\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel Orientation=\"Horizontal\">\n                <TextBlock Text=\"{Binding Name}\" />\n                <TextBlock>:</TextBlock>\n                <ContentControl Content=\"{Binding Type}\" />\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:ConstantExpression}\">\n        <ContentControl\n            Background=\"LightGoldenrodYellow\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel Orientation=\"Horizontal\">\n                <TextBlock Text=\"{Binding Value}\" />\n                <TextBlock>:</TextBlock>\n                <ContentControl Content=\"{Binding Type}\" />\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:BinaryExpression}\">\n        <ContentControl\n            Background=\"LightBlue\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <TextBlock Text=\"{Binding NodeType}\" />\n                <ContentControl Content=\"{Binding Left}\" />\n                <ContentControl Content=\"{Binding Right}\" />\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:UnaryExpression}\">\n        <ContentControl\n            Background=\"LightCoral\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <TextBlock Text=\"{Binding NodeType}\" />\n                <ContentControl Content=\"{Binding Operand}\" />\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:ConditionalExpression}\">\n        <ContentControl\n            Background=\"LightGreen\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <TextBlock>if(</TextBlock>\n                <ContentControl Content=\"{Binding Test}\" />\n                <TextBlock>) {</TextBlock>\n                <ContentControl Content=\"{Binding IfTrue}\" />\n                <TextBlock>} else {</TextBlock>\n                <ContentControl Content=\"{Binding IfFalse}\" />\n                <TextBlock>}</TextBlock>\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:MemberExpression}\">\n        <ContentControl\n            Background=\"Violet\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <StackPanel Orientation=\"Horizontal\">\n                    <TextBlock>Member</TextBlock>\n                    <TextBlock Text=\"{Binding Member.Name}\" />\n                    <ContentControl Content=\"{Binding Member.Type}\" />\n                    <TextBlock>of</TextBlock>\n                </StackPanel>\n                <ContentControl Content=\"{Binding Expression}\" />\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:NewExpression}\">\n        <ContentControl\n            Background=\"LightCyan\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <StackPanel Orientation=\"Horizontal\">\n                    <TextBlock>New</TextBlock>\n                    <ContentControl Content=\"{Binding Type}\" />\n                    <TextBlock>(</TextBlock>\n                </StackPanel>\n                <ItemsControl ItemsSource=\"{Binding Arguments}\" />\n                <TextBlock>)</TextBlock>\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:NewArrayExpression}\">\n        <ContentControl\n            Background=\"LightPink\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <StackPanel Orientation=\"Horizontal\">\n                    <TextBlock>New</TextBlock>\n                    <ContentControl Content=\"{Binding Type}\" />\n                    <TextBlock>[] {</TextBlock>\n                </StackPanel>\n                <ItemsControl ItemsSource=\"{Binding Expressions}\" />\n                <TextBlock>}</TextBlock>\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:MemberInitExpression}\">\n        <ContentControl\n            Background=\"LemonChiffon\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <ContentControl Content=\"{Binding NewExpression}\" />\n                <TextBlock>{</TextBlock>\n                <ItemsControl ItemsSource=\"{Binding Bindings}\" />\n                <TextBlock>}</TextBlock>\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:ListInitExpression}\">\n        <ContentControl\n            Background=\"LightSteelBlue\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <ContentControl Content=\"{Binding NewExpression}\" />\n                <TextBlock>{</TextBlock>\n                <ItemsControl ItemsSource=\"{Binding Initializers}\" />\n                <TextBlock>}</TextBlock>\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:ElementInit}\">\n        <ItemsControl ItemsSource=\"{Binding Arguments}\" />\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:MemberBinding}\">\n        <ContentControl\n            Background=\"LightSeaGreen\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <StackPanel Orientation=\"Horizontal\">\n                    <TextBlock Text=\"{Binding Member.Name}\" />\n                    <TextBlock> =</TextBlock>\n                </StackPanel>\n                <ContentControl Content=\"{Binding Expression}\" />\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:MemberMemberBinding}\">\n        <ContentControl\n            Background=\"Lavender\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <StackPanel Orientation=\"Horizontal\">\n                    <TextBlock Text=\"{Binding Member.Name}\" />\n                    <TextBlock>=</TextBlock>\n                </StackPanel>\n                <ItemsControl ItemsSource=\"{Binding Bindings}\" />\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:MemberListBinding}\">\n        <ContentControl\n            Background=\"Aquamarine\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <StackPanel Orientation=\"Horizontal\">\n                    <TextBlock Text=\"{Binding Member.Name}\" />\n                    <TextBlock>= {</TextBlock>\n                </StackPanel>\n                <ItemsControl ItemsSource=\"{Binding Initializers}\" />\n                <TextBlock>}</TextBlock>\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:MethodCallExpression}\">\n        <ContentControl\n            Background=\"Salmon\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <StackPanel Orientation=\"Horizontal\">\n                    <TextBlock>Method</TextBlock>\n                    <TextBlock Text=\"{Binding Method.Name}\" />\n                    <TextBlock> :</TextBlock>\n                    <ContentControl Content=\"{Binding Method.ReturnType}\" />\n                    <TextBlock> (</TextBlock>\n                </StackPanel>\n                <ItemsControl ItemsSource=\"{Binding Arguments}\" />\n                <TextBlock>)</TextBlock>\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n    <DataTemplate DataType=\"{x:Type q:InvocationExpression}\">\n        <ContentControl\n            Background=\"Orange\"\n            Template=\"{StaticResource contentWithRect}\">\n            <StackPanel>\n                <TextBlock>Invoke</TextBlock>\n                <TextBlock Text=\"{Binding Expression}\" />\n                <TextBlock>(</TextBlock>\n                <ItemsControl ItemsSource=\"{Binding Arguments}\" />\n                <TextBlock>)</TextBlock>\n            </StackPanel>\n        </ContentControl>\n    </DataTemplate>\n\n</ResourceDictionary>"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/MemoryImage.mg",
    "content": "﻿module Memory\n{\n    language Memory\n    {\n        syntax Main = x:Statement+ => Scope{ valuesof(x) };\n\n        syntax Statement =\n            x:ValueStatement => x |\n            x:ReferenceStatement => x |\n            x:ScopeStatement => x;\n\n        syntax ValueStatement =\n            i:Identifier '=' v:Integer => ValueStatement { Name = i, Value = v };\n\n        syntax ReferenceStatement =\n            i:Identifier '=' New '[' s:Integer ']'\n                => ReferenceStatement { Name = i, Size = s } |\n            i:Identifier '=' New '[' s:Integer ']'\n            '{' c:Identifier+ '}'\n                => ReferenceStatement { Name = i, Size = s, Children = c };\n\n        syntax ScopeStatement =\n        '{' s:Statement* '}' => Scope { valuesof(s) };\n\n        token Integer = '0'..'9'+;\n        token Identifier = ('a'..'z' | 'A'..'Z')+;\n        \n        @{Classification[\"Keyword\"]} token Var = \"var\";\n        @{Classification[\"Keyword\"]} token New = \"new\";\n        \n        interleave WhiteSpace = ' ' | '\\t' | '\\n' | '\\r' | '\\r\\n';\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/MultipleDispatch.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApplication1\n{\n    interface Shape\n    {\n    }\n\n    class Rectangle : Shape\n    {\n        public double 幅 = 0;\n        public double 高さ = 0;\n    }\n\n    class Circle : Shape\n    {\n        public double 半径 = 0;\n    }\n\n    static class ShapeMethods\n    {\n        //public static double GetArea(this Shape s)\n        //{\n        //    if (s is Rectangle) return GetArea((Rectangle)s);\n        //    if (s is Circle) return GetArea((Circle)s);\n        //    throw new ArgumentException();\n        //}\n        // ↑before\n        // ↓after\n        public static double GetArea(this Shape s)\n        {\n            return GetArea((dynamic)s);\n        }\n        static double GetArea(dynamic s) { return GetArea(s); }\n\n        static double GetArea(Rectangle x) { return x.幅 * x.高さ; }\n        static double GetArea(Circle x) { return Math.PI * x.半径 * x.半径; }\n\n        //public static bool Contains(this Shape s, Shape t)\n        //{\n        //    if (s is Rectangle && t is Rectangle) return Contains((Rectangle)s, (Rectangle)t);\n        //    if (s is Rectangle && t is Circle) return Contains((Rectangle)s, (Circle)t);\n        //    if (s is Circle && t is Rectangle) return Contains((Circle)s, (Rectangle)t);\n        //    if (s is Circle && t is Circle) return Contains((Circle)s, (Circle)t);\n        //    throw new ArgumentException();\n        //}\n        // ↑before\n        // ↓after\n        public static bool Contains(this Shape s, Shape t)\n        {\n            return Contains((dynamic)s, (dynamic)t);\n        }\n        static bool Contains(dynamic s, dynamic t) { return Contains(s, t); }\n\n        static bool Contains(Rectangle s, Rectangle t)\n        {\n            return s.幅 > t.幅 && s.高さ > t.高さ;\n        }\n        static bool Contains(Rectangle s, Circle t)\n        {\n            return s.幅 * s.幅 + s.高さ * s.高さ > t.半径 * t.半径 * 4;\n        }\n        static bool Contains(Circle s, Rectangle t)\n        {\n            return s.半径 * s.半径 * 4 > t.幅 * t.幅 + t.高さ * t.高さ;\n        }\n        static bool Contains(Circle s, Circle t)\n        {\n            return s.半径 > t.半径;\n        }\n    }\n\n    public class MultipleDispatchSample\n    {\n        public static void Test()\n        {\n            Shape s = new Rectangle { 幅 = 2, 高さ = 3 };\n            Shape t = new Circle { 半径 = 2 };\n            Console.WriteLine(s.Contains(t));\n            Console.WriteLine(t.Contains(s));\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/Operator.cs",
    "content": "﻿using System;\nusing System.Linq.Expressions;\n\nnamespace GenericOperator\n{\n    using Binary = Func<ParameterExpression, ParameterExpression, BinaryExpression>;\n    using Unary = Func<ParameterExpression, UnaryExpression>;\n\n    /// <summary>\n    /// 動的にジェネリック型 T の加減乗除関数を作る。\n    /// </summary>\n    /// <typeparam name=\"T\">対象となる型。</typeparam>\n    public static class Operator<T>\n    {\n        static readonly ParameterExpression x = Expression.Parameter(typeof(T), \"x\");\n        static readonly ParameterExpression y = Expression.Parameter(typeof(T), \"y\");\n        static readonly ParameterExpression z = Expression.Parameter(typeof(T), \"z\");\n        static readonly ParameterExpression w = Expression.Parameter(typeof(T), \"w\");\n\n        public static readonly Func<T, T, T> Add = Lambda(Expression.Add);\n        public static readonly Func<T, T, T> Subtract = Lambda(Expression.Subtract);\n        public static readonly Func<T, T, T> Multiply = Lambda(Expression.Multiply);\n        public static readonly Func<T, T, T> Divide = Lambda(Expression.Divide);\n        public static readonly Func<T, T> Plus = Lambda(Expression.UnaryPlus);\n        public static readonly Func<T, T> Negate = Lambda(Expression.Negate);\n\n        public static Func<T, T, T> Lambda(Binary op)\n        {\n            return Expression.Lambda<Func<T, T, T>>(op(x, y), x, y).Compile();\n        }\n\n        public static Func<T, T> Lambda(Unary op)\n        {\n            return Expression.Lambda<Func<T, T>>(op(x), x).Compile();\n        }\n\n        public static readonly Func<T, T, T, T, T> ProductSum =\n            Expression.Lambda<Func<T, T, T, T, T>>(\n                Expression.Add(\n                    Expression.Multiply(x, y),\n                    Expression.Multiply(z, w)),\n                x, y, z, w).Compile();\n\n        public static readonly Func<T, T, T, T, T> ProductDifference =\n            Expression.Lambda<Func<T, T, T, T, T>>(\n                Expression.Subtract(\n                    Expression.Multiply(x, y),\n                    Expression.Multiply(z, w)),\n                x, y, z, w).Compile();\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/Query.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Reflection;\n\nnamespace TestProvider\n{\n    /// <summary>\n    /// http://blogs.msdn.com/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx\n    /// から取ってきたソース。\n    /// これくらい、標準で提供してくれてもいいのに。\n    /// </summary>\n    public class Query<T> : IQueryable<T>, IQueryable, IEnumerable<T>, IEnumerable, IOrderedQueryable<T>, IOrderedQueryable\n    {\n        QueryProvider provider;\n        Expression expression;\n\n        public Query(QueryProvider provider)\n        {\n            if (provider == null)\n            {\n                throw new ArgumentNullException(\"provider\");\n            }\n            this.provider = provider;\n            this.expression = Expression.Constant(this);\n        }\n\n        public Query(QueryProvider provider, Expression expression)\n        {\n            if (provider == null)\n            {\n                throw new ArgumentNullException(\"provider\");\n            }\n\n            if (expression == null)\n            {\n                throw new ArgumentNullException(\"expression\");\n            }\n\n            if (!typeof(IQueryable<T>).IsAssignableFrom(expression.Type))\n            {\n                throw new ArgumentOutOfRangeException(\"expression\");\n            }\n\n            this.provider = provider;\n            this.expression = expression;\n        }\n\n        Expression IQueryable.Expression\n        {\n            get { return this.expression; }\n        }\n\n        Type IQueryable.ElementType\n        {\n            get { return typeof(T); }\n        }\n\n        IQueryProvider IQueryable.Provider\n        {\n            get { return this.provider; }\n        }\n\n        public IEnumerator<T> GetEnumerator()\n        {\n            return ((IEnumerable<T>)this.provider.Execute(this.expression)).GetEnumerator();\n        }\n\n        IEnumerator IEnumerable.GetEnumerator()\n        {\n            return ((IEnumerable)this.provider.Execute(this.expression)).GetEnumerator();\n        }\n\n        public override string ToString()\n        {\n            return this.provider.GetQueryText(this.expression);\n        }\n    }\n\n    public abstract class QueryProvider : IQueryProvider\n    {\n        protected QueryProvider()\n        {\n        }\n\n        IQueryable<S> IQueryProvider.CreateQuery<S>(Expression expression)\n        {\n            return new Query<S>(this, expression);\n        }\n\n        IQueryable IQueryProvider.CreateQuery(Expression expression)\n        {\n            Type elementType = TypeSystem.GetElementType(expression.Type);\n\n            try\n            {\n                return (IQueryable)Activator.CreateInstance(typeof(Query<>).MakeGenericType(elementType), new object[] { this, expression });\n            }\n            catch (TargetInvocationException tie)\n            {\n                throw tie.InnerException;\n            }\n        }\n\n        S IQueryProvider.Execute<S>(Expression expression)\n        {\n            return (S)this.Execute(expression);\n        }\n\n        object IQueryProvider.Execute(Expression expression)\n        {\n            return this.Execute(expression);\n        }\n\n        public abstract string GetQueryText(Expression expression);\n        public abstract object Execute(Expression expression);\n    }\n\n    internal static class TypeSystem\n    {\n        internal static Type GetElementType(Type seqType)\n        {\n            Type ienum = FindIEnumerable(seqType);\n            if (ienum == null) return seqType;\n            return ienum.GetGenericArguments()[0];\n        }\n\n        private static Type FindIEnumerable(Type seqType)\n        {\n            if (seqType == null || seqType == typeof(string))\n                return null;\n\n            if (seqType.IsArray)\n                return typeof(IEnumerable<>).MakeGenericType(seqType.GetElementType());\n\n            if (seqType.IsGenericType)\n            {\n                foreach (Type arg in seqType.GetGenericArguments())\n                {\n                    Type ienum = typeof(IEnumerable<>).MakeGenericType(arg);\n\n                    if (ienum.IsAssignableFrom(seqType))\n                    {\n                        return ienum;\n                    }\n                }\n            }\n\n            Type[] ifaces = seqType.GetInterfaces();\n\n            if (ifaces != null && ifaces.Length > 0)\n            {\n                foreach (Type iface in ifaces)\n                {\n                    Type ienum = FindIEnumerable(iface);\n                    if (ienum != null) return ienum;\n                }\n            }\n\n            if (seqType.BaseType != null && seqType.BaseType != typeof(object))\n            {\n                return FindIEnumerable(seqType.BaseType);\n            }\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/Rational.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace Sample\n{\n    /// <summary>\n    /// 有理数。\n    /// </summary>\n    public struct Rational : IComparable<Rational>\n    {\n        #region フィールド\n\n        int num;\n        int denom;\n\n        #endregion\n        #region 補助関数\n\n        /// <summary>\n        /// 最大公約数を求める。\n        /// </summary>\n        /// <param name=\"a\">オペランド1。</param>\n        /// <param name=\"b\">オペランド2。</param>\n        /// <returns></returns>\n        public static int Gdc(int a, int b)\n        {\n            int x = a;\n            int y = b;\n\n            if (x < 0) x = -x;\n            if (y < 0) y = -y;\n\n            for (; ; )\n            {\n                int q = x / y;\n                int r = x - q * y;\n                if (r == 0) break;\n                x = y;\n                y = r;\n            }\n\n            return y;\n        }\n\n        /// <summary>\n        /// 通分する。\n        /// </summary>\n        /// <param name=\"num\">分子。</param>\n        /// <param name=\"denom\">分母。</param>\n        public static void Reduce(ref int num, ref int denom)\n        {\n            var gdc = Gdc(num, denom);\n            num /= gdc;\n            denom /= gdc;\n        }\n\n        #endregion\n\n        public Rational(int num, int denom)\n        {\n            Reduce(ref num, ref denom);\n            this.num = num;\n            this.denom = denom;\n        }\n\n        public int Numerator\n        {\n            get { return num; }\n            set { num = value; }\n        }\n\n        public int Denominator\n        {\n            get { return denom; }\n            set { denom = value; }\n        }\n\n        public static implicit operator Rational(int x)\n        {\n            return new Rational(x, 1);\n        }\n\n        public static explicit operator double(Rational x)\n        {\n            if (x.num == 0)\n                return 0;\n\n            return (double)x.num / (double)x.denom;\n        }\n\n        public static Rational operator +(Rational x)\n        {\n            return new Rational(x.num, x.denom);\n        }\n\n        public static Rational operator -(Rational x)\n        {\n            return new Rational(-x.num, x.denom);\n        }\n\n        public static Rational operator +(Rational x, Rational y)\n        {\n            var num = x.num * y.denom + x.denom * y.num;\n            var denom = x.denom * y.denom;\n\n            return new Rational(num, denom);\n        }\n\n        public static Rational operator -(Rational x, Rational y)\n        {\n            var num = x.num * y.denom - x.denom * y.num;\n            var denom = x.denom * y.denom;\n\n            return new Rational(num, denom);\n        }\n\n        public static Rational operator *(Rational x, Rational y)\n        {\n            var num = x.num * y.num;\n            var denom = x.denom * y.denom;\n\n            return new Rational(num, denom);\n        }\n\n        public static Rational operator /(Rational x, Rational y)\n        {\n            var num = x.num * y.denom;\n            var denom = x.denom * y.num;\n\n            return new Rational(num, denom);\n        }\n\n        public override string ToString()\n        {\n            return string.Format(\"({0}/{1})\", this.num, this.denom);\n        }\n\n        #region IComparable<Rational> メンバ\n\n        public int CompareTo(Rational other)\n        {\n            return ((double)this).CompareTo((double)other);\n        }\n\n        #endregion\n    }\n\n    public static class RationalExtensions\n    {\n        public static Rational Over(this int x, int y)\n        {\n            return new Rational(x, y);\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/SleepSort.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reactive.Subjects;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace SleepSort\n{\n    /// <summary>\n    /// 例のネタ（http://d.hatena.ne.jp/gfx/20110519/1305810786）を C# で実装してみたよ。というやつ。\n    /// \n    /// .NET でスレッドを直接立てたら負けかなと思っている。\n    /// 非同期シーケンスを、全要素の列挙完了するまで Wait しても負けかなと思っている。\n    /// \n    /// ・スレッドを直接立てない\n    /// 要素の数だけスレッドを立てるとか、何それ怖い。\n    /// Timer（マニュアル スレッドではなく、スレッド プール）を使います。\n    /// \n    /// ・全要素の列挙完了まで Wait しない\n    /// IObservable を使って push 型に受信。\n    /// 実行してみればわかる通り、全部ソートし終えてから一気に表示されるのではなく、\n    /// 1要素ずつ Console.WriteLine されます。\n    /// \n    /// Reactive Extensions を利用。\n    /// </summary>\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var data = GenerateTestData();\n            var result = Sort(data, x => x);\n\n            var e = new AutoResetEvent(false);\n\n            result.Subscribe(x => Console.WriteLine(x), () => e.Set());\n\n            e.WaitOne();\n        }\n\n        /// <summary>\n        /// うわさのスリープ ソート。\n        /// </summary>\n        /// <typeparam name=\"T\">ソート対象の要素の型。</typeparam>\n        /// <param name=\"data\">ソート対象。</param>\n        /// <param name=\"toOrder\">T 型から順序を表す整数に変換。</param>\n        /// <returns>結果受け取り用の Observable</returns>\n        static IObservable<T> Sort<T>(IEnumerable<T> data, Func<T, int> toOrder)\n        {\n            const int Weight = 50;\n\n            var results = new Subject<T>();\n            var maxTime = int.MinValue;\n\n            foreach (var x in data)\n            {\n                var local = x;\n                var time = toOrder(x) * Weight;\n                maxTime = Math.Max(maxTime, time);\n\n                TaskEx.Delay(time).ContinueWith(t => { results.OnNext(local); });\n            }\n\n            TaskEx.Delay(maxTime + Weight).ContinueWith(t => results.OnCompleted());\n\n            return results;\n        }\n\n        /// <summary>\n        /// テスト データの生成。\n        /// </summary>\n        /// <returns>テスト データ。</returns>\n        private static IEnumerable<int> GenerateTestData()\n        {\n            const int N = 10000;\n            var rand = new Random();\n            var data = Enumerable.Range(0, N)\n                //.OrderBy(x => rand.Next());\n                .Select(x => rand.Next(0, 100));\n            return data;\n        }\n    }\n\n    /// <summary>\n    /// Async CTP の車輪の再発名。\n    /// これだけのためにアセンブリ参照増やしたくないんで自作。\n    /// </summary>\n    class TaskEx\n    {\n        /// <summary>\n        /// 引数で指定した時間だけ待つ。\n        /// </summary>\n        /// <param name=\"milliseconds\">待つ時間[ミリ秒]。</param>\n        /// <returns>Wait するために Task を返す。</returns>\n        public static Task Delay(int milliseconds)\n        {\n            var tcs = new TaskCompletionSource<bool>();\n\n            Timer t = null;\n            t = new Timer(self =>\n            {\n                t.Dispose();\n                tcs.TrySetResult(true);\n            }, t, milliseconds, Timeout.Infinite);\n\n            return tcs.Task;\n        }\n\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/TypesForTest.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ExpressionTree\n{\n\tclass CustomUnaryPlus\n\t{\n\t\tpublic static CustomUnaryPlus operator +(CustomUnaryPlus x)\n\t\t{\n\t\t\treturn new CustomUnaryPlus();\n\t\t}\n\t}\n\n\tclass Point\n\t{\n\t\tpublic int X { set; get; }\n\t\tpublic int Y { set; get; }\n\t\tpublic Point() : this(0, 0) { }\n\t\tpublic Point(int x, int y)\n\t\t{\n\t\t\tthis.X = x;\n\t\t\tthis.Y = y;\n\t\t}\n\t}\n\n\tclass LineSegment\n\t{\n\t\tpublic Point Start { set; get; }\n\t\tpublic Point End { set; get; }\n\t}\n\n\tclass Polyline\n\t{\n\t\tpublic List<Point> Vertices { set; get; }\n\n\t\tpublic Polyline() { this.Vertices = new List<Point>(); }\n\t}\n\n\tstruct Int\n\t{\n\t\tint inner;\n\n\t\tpublic Int(int n) { this.inner = n; }\n\n\t\t/// <summary>\n\t\t/// ベキを求める。\n\t\t/// </summary>\n\t\tstatic public Int operator^ (Int a, Int b)\n\t\t{\n\t\t\tvar pow = 1;\n\t\t\tfor (int b_ = b.inner; b_ > 0; --b_)\n\t\t\t\tpow *= a.inner;\n\t\t\t\n\t\t\treturn new Int(pow);\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/ComicMinimal.cs",
    "content": "﻿vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|03 Nov 2007 03:45:04 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|sp3_linqtosql.html\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/Complex.cs",
    "content": "﻿vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|14 Feb 2009 15:30:58 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|sm_genericop.html\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/Comprehension.cs",
    "content": "﻿vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|04 Mar 2008 12:04:44 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|sp3_linqreconstruct.html\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/CreateTestData.cs",
    "content": "﻿vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|19 Feb 2008 12:49:56 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|sp3_linqtosql.html\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/DuckTypingInterface.cs",
    "content": "﻿vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|12 Nov 2009 15:19:37 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_cacheddtm:TX|12 Nov 2009 15:19:37 -0000\nvti_filesize:IR|6880\nvti_backlinkinfo:VX|\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/DynamicXml.cs",
    "content": "﻿vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|17 Jul 2010 04:29:06 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|sp4_dynamic.html\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/ExpressionTemplates.xaml",
    "content": "vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|10 Aug 2008 04:46:50 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|sm_treeview.html\nvti_author:SR|galois\\\\Iwanaga\nvti_modifiedby:SR|galois\\\\Iwanaga\nvti_timecreated:TR|10 Aug 2008 04:46:50 -0000\nvti_cacheddtm:TX|10 Aug 2008 04:46:50 -0000\nvti_filesize:IR|9807\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/ExpressionTest.cs",
    "content": "﻿vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|08 Mar 2008 09:08:54 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|sp3_expression.html\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/ExpressionTreeTemplates.xaml",
    "content": "vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|09 Sep 2010 05:42:14 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_author:SR|galois\\\\Iwanaga\nvti_modifiedby:SR|galois\\\\Iwanaga\nvti_timecreated:TR|09 Sep 2010 05:42:14 -0000\nvti_cacheddtm:TX|09 Sep 2010 05:42:14 -0000\nvti_filesize:IR|10228\nvti_backlinkinfo:VX|\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/MemoryImage.mg",
    "content": "vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|19 Apr 2009 16:13:52 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|misc_heap.html\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/MultipleDispatch.cs",
    "content": "﻿vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|08 Nov 2009 14:28:28 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|sp4_multipledispatch.html\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/Operator.cs",
    "content": "﻿vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|14 Feb 2009 15:15:41 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|sm_genericop.html\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/Query.cs",
    "content": "﻿vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|03 Aug 2008 09:40:36 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|sp3_iqueryable.html\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/Rational.cs",
    "content": "﻿vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|14 Feb 2009 10:42:10 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|sm_genericop.html\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/_vti_cnf/TypesForTest.cs",
    "content": "﻿vti_encoding:SR|utf8-nl\nvti_timelastmodified:TR|08 Mar 2008 07:31:34 -0000\nvti_extenderversion:SR|12.0.0.0\nvti_backlinkinfo:VX|sp3_expression.html\n"
  },
  {
    "path": "Chapters/ufcpp2000/csharp/source/コンマ区切り.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.IO;\nusing System.ComponentModel.DataAnnotations;\nusing System.Reflection;\n\nnamespace コンマ区切り\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var samples = new[]\n            {\n                new SampleData { Name = \"ALice\", Age = 15, Sex = Sex.Female },\n                new SampleData { Name = \"Bob\", Age = 20, Sex = Sex.Male },\n                new SampleData { Name = \"Carol\", Age = 12, Sex = Sex.Female },\n            };\n\n            File.WriteAllLines(\"sample.csv\", samples.ToCommaSeparatedLines());\n        }\n    }\n\n    /// <summary>\n    /// サンプル用。\n    /// 性別。\n    /// </summary>\n    public enum Sex\n    {\n        NotKnown,\n        Male,\n        Female,\n        NotApplicable = 9,\n    }\n\n    /// <summary>\n    /// サンプル用のデータ。\n    /// とりあえず、よくある名簿用の人クラス。\n    /// </summary>\n    class SampleData\n    {\n        [Display(Order = 0)]\n        public string Name { get; set; }\n\n        [Display(Order = 1)]\n        public int Age { get; set; }\n\n        [Display(Order = 2)]\n        public Sex Sex { get; set; }\n    }\n\n    public static partial class Extensions\n    {\n        /// <summary>\n        /// 任意の型を与えてコンマ区切りの行を作る。\n        /// 1列1プロパティ。\n        /// 列は、Display 属性の Order 順に並べる。\n        /// </summary>\n        /// <typeparam name=\"T\">コンマ区切り行化したい型。</typeparam>\n        /// <param name=\"obj\">変換対象。</param>\n        /// <returns>コンマ区切り列。</returns>\n        public static string ToCommaSeparatedLine<T>(this T obj)\n        {\n            var props =\n                from p in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance)\n                let orderAttribute = p.GetCustomAttributes(typeof(DisplayAttribute), false).OfType<DisplayAttribute>().FirstOrDefault()\n                let order = orderAttribute != null ? orderAttribute.Order : int.MaxValue\n                orderby order\n                select p;\n\n            return string.Join(\",\", props.Select(p => p.GetValue(obj, null)));\n        }\n\n        /// <summary>\n        /// 複数のオブジェクトをコンマ区切り化。\n        /// </summary>\n        /// <typeparam name=\"T\">コンマ区切り行化したい型。</typeparam>\n        /// <param name=\"array\">変換対象</param>\n        /// <returns>コンマ区切り列（複数行）。</returns>\n        public static IEnumerable<string> ToCommaSeparatedLines<T>(this IEnumerable<T> array)\n        {\n            foreach (var x in array)\n            {\n                yield return x.ToCommaSeparatedLine();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/resources/RssWriter.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Xml;\nusing System.Text.RegularExpressions;\nusing System.Collections.Generic;\n\nnamespace WebsiteSample\n{\n\tpublic class RssWriter\n\t{\n\t\t#region 内部クラス\n\n\t\tpublic class Item\n\t\t{\n\t\t\tpublic readonly string Url;\n\t\t\tpublic readonly string Title;\n\t\t\tpublic readonly DateTime UpdatedDateTime;\n\t\t\tpublic readonly string Digest;\n\n\t\t\tpublic Item(string url, string title, DateTime updatedDateTime, string digest)\n\t\t\t{\n\t\t\t\tUrl = url;\n\t\t\t\tTitle = title;\n\t\t\t\tUpdatedDateTime = updatedDateTime;\n\t\t\t\tDigest = digest;\n\t\t\t}\n\t\t}\n\n\t\t#endregion\n\t\t#region 定数\n\n\t\tconst string rss10ns = \"http://purl.org/rss/1.0/\";\n\t\tconst string rdfns = \"http://www.w3.org/1999/02/22-rdf-syntax-ns#\";\n\t\tconst string dcns = \"http://purl.org/dc/elements/1.1/\";\n\n\t\t#endregion\n\t\t#region フィールド\n\n\t\tstring siteName;\n\t\tstring adminName;\n\t\tstring url;\n\n\t\tList<Item> items = new List<Item>();\n\n\t\t#endregion\n\t\t#region プロパティ\n\n\t\t/// <summary>\n\t\t/// RSS 中に表示されるウェブサイト名。\n\t\t/// </summary>\n\t\tpublic string SiteName\n\t\t{\n\t\t\tget { return siteName; }\n\t\t\tset { siteName = value; }\n\t\t}\n\n\t\t/// <summary>\n\t\t/// RSS 中に表示されるサイト管理者名。\n\t\t/// </summary>\n\t\tpublic string AdministratorName\n\t\t{\n\t\t\tget { return adminName; }\n\t\t\tset { adminName = value; }\n\t\t}\n\n\t\t/// <summary>\n\t\t/// サイトの URL。\n\t\t/// </summary>\n\t\tpublic string Url\n\t\t{\n\t\t\tget { return url; }\n\t\t\tset { url = value; }\n\t\t}\n\n\t\t#endregion\n\t\t#region 項目の追加\n\n\t\t/// <summary>\n\t\t/// 項目の追加。\n\t\t/// </summary>\n\t\t/// <param name=\"item\">追加したい項目</param>\n\t\tpublic void Add(Item item)\n\t\t{\n\t\t\tthis.items.Add(item);\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 項目の追加。\n\t\t/// </summary>\n\t\t/// <param name=\"url\">項目の URL</param>\n\t\t/// <param name=\"title\">項目のページ/記事タイトル</param>\n\t\t/// <param name=\"updatedDateTime\">更新日時</param>\n\t\t/// <param name=\"digest\">記事の要約</param>\n\t\tpublic void Add(string url, string title, DateTime updatedDateTime, string digest)\n\t\t{\n\t\t\tthis.items.Add(new Item(url, title, updatedDateTime, digest));\n\t\t}\n\n\t\tpublic int Count\n\t\t{\n\t\t\tget { return this.items.Count; }\n\t\t}\n\n\t\t#endregion\n\t\t#region 出力\n\n\t\t/// <summary>\n\t\t/// RSS フィードを output ストリームに書き出す。\n\t\t/// </summary>\n\t\t/// <param name=\"absoluteUri\">RSS ファイル自体の URI</param>\n\t\t/// <param name=\"output\">RSS の出力先</param>\n\t\tpublic void Write(string absoluteUri, Stream output)\n\t\t{\n\t\t\tXmlTextWriter writer = new XmlTextWriter(output, System.Text.Encoding.UTF8);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\twriter.WriteStartDocument();\n\t\t\t\twriter.Formatting = Formatting.Indented;\n\n\t\t\t\twriter.WriteStartElement(\"rdf\", \"RDF\", rdfns);\n\t\t\t\twriter.WriteAttributeString(\"xmlns\", null, rss10ns);\n\t\t\t\twriter.WriteAttributeString(\"xmlns\", \"dc\", null, dcns);\n\t\t\t\twriter.WriteAttributeString(\"xml\", \"lang\", null, \"ja\");\n\n\t\t\t\twriter.WriteStartElement(\"channel\", rss10ns);\n\t\t\t\twriter.WriteAttributeString(\"about\", rdfns, absoluteUri);\n\t\t\t\twriter.WriteElementString(\"title\", rss10ns, this.siteName + \" Update Information\");\n\n\t\t\t\twriter.WriteElementString(\"link\", rss10ns, this.url);\n\n\t\t\t\twriter.WriteElementString(\"title\", dcns, this.siteName);\n\t\t\t\twriter.WriteElementString(\"creator\", dcns, this.adminName);\n\n\t\t\t\tif (items.Count > 0)\n\t\t\t\t{\n\t\t\t\t\twriter.WriteElementString(\"date\", dcns, getRSSDate(items[0].UpdatedDateTime));\n\t\t\t\t}\n\n\t\t\t\twriter.WriteElementString(\"language\", dcns, \"ja\");\n\t\t\t\twriter.WriteElementString(\"description\", rss10ns, \"このRSSデータは、最近の更新コンテンツです。\");\n\n\t\t\t\twriter.WriteStartElement(\"items\", rss10ns);\n\t\t\t\twriter.WriteStartElement(\"Seq\", rdfns);\n\n\t\t\t\tforeach (Item item in this.items)\n\t\t\t\t{\n\t\t\t\t\twriter.WriteStartElement(\"li\", rdfns);\n\t\t\t\t\twriter.WriteAttributeString(\"rdf\", \"resource\", item.Url);\n\t\t\t\t\twriter.WriteEndElement();\n\t\t\t\t}\n\n\t\t\t\twriter.WriteEndElement();\n\t\t\t\twriter.WriteEndElement();\n\t\t\t\twriter.WriteEndElement();\n\n\t\t\t\tforeach (Item item in this.items)\n\t\t\t\t{\n\t\t\t\t\twriter.WriteStartElement(\"item\", rss10ns);\n\t\t\t\t\twriter.WriteAttributeString(\"rdf\", \"about\", rdfns, item.Url);\n\n\t\t\t\t\twriter.WriteElementString(\"title\", rss10ns, item.Title);\n\t\t\t\t\twriter.WriteElementString(\"link\", rss10ns, item.Url);\n\t\t\t\t\twriter.WriteElementString(\"description\", rss10ns, item.Digest);\n\t\t\t\t\twriter.WriteElementString(\"date\", dcns, getRSSDate(item.UpdatedDateTime));\n\n\t\t\t\t\twriter.WriteEndElement();\n\t\t\t\t}\n\t\t\t\twriter.WriteEndElement();\n\t\t\t\twriter.WriteEndDocument();\n\t\t\t}\n\t\t\tfinally\n\t\t\t{\n\t\t\t\twriter.Flush();\n\t\t\t}\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 時刻を RSS で使う形式にフォーマット。\n\t\t/// </summary>\n\t\t/// <param name=\"datetime\">時刻</param>\n\t\t/// <returns>フォーマット結果の文字列</returns>\n\t\tprivate string getRSSDate(DateTime datetime)\n\t\t{\n\t\t\tDateTime utcTime = datetime.ToUniversalTime();\n\t\t\treturn utcTime.ToString(\"yyyy-MM-dd'T'HH:mm:ss'Z'\");\n\t\t}\n\n\t\t#endregion\n\t}\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/resources/main.css",
    "content": "body\n{\n\tbackground-color: #EEF0FF;\n\tmargin: 0px;\n\tpadding: 0px;\n\ttext-align: center;\n}\n\np\n{\n\tmargin: 0px;\n\tpadding: 3px;\n}\n\np.head\n{\n\tbackground-color: #AABBCC;\n\tmargin: 0px;\n\tpadding: 0px;\n}\n\ndiv.menu\n{\n\tbackground-color: #A0A080;\n\ttext-align: left;\n}\n\nspan.menuItem\n{\n\tdisplay: inline-block;\n\twidth: 90px;\n\theight: 25px;\n\tmargin: 0px;\n\tpadding: 5px;\n\tbackground-color: #808060;\n\tcolor: #FFFFFF;\n\tborder: solid 1px #000000;\n\tvertical-align: middle;\n\ttext-align: center;\n}\n\ndiv.content\n{\n\twidth: 60%;\n\tpadding: 10px;\n\ttext-align: left;\n\tborder: dotted 1px #8080a0;\n}\n\ndiv.foot\n{\n\tbackground-color: #AABBCC;\n\tmargin: 20px 0px 0px 0px;\n\tpadding: 0px;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/resources/main.xsl",
    "content": "<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n<xsl:output method=\"html\" encoding=\"Shift_JIS\"/> \n\n<xsl:template match=\"/\">\n<xsl:apply-templates select=\"*\"/>\n</xsl:template>\n\n<xsl:template match=\"blog\">\n<div class=\"blog\">\n<xsl:apply-templates select=\"*\"/>\n</div>\n</xsl:template>\n\n<!-- HTML^Ô܂ܕ\\ł悤 -->\n<xsl:template match=\"*|text()\">\n<xsl:copy>\n<xsl:for-each select=\"@*\">\n<xsl:copy/>\n</xsl:for-each>\n<xsl:apply-templates/>\n</xsl:copy>\n</xsl:template>\n\n</xsl:stylesheet>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/sample/BindingSlider.xaml",
    "content": "<StackPanel\n\txmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n\txmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\t>\n\n\t<Slider Name=\"slider1\" Width=\"200\"/>\n\t<TextBox Width=\"80\" Text=\"{Binding ElementName=slider1, Path=Value}\"/>\n</StackPanel>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/sample/ButtonClick.xaml",
    "content": "<Canvas\n\txmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n\txmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\tBackground=\"LightGray\"\n\t>\n\t<Canvas.Resources>\n\t\t<Storyboard x:Key=\"canvasRed\">\n\t\t\t<ColorAnimation\n\t\t\t\tStoryboard.TargetName=\"canvas\"\n\t\t\t\tStoryboard.TargetProperty=\"Background.Color\"\n\t\t\t\tTo=\"Red\" Duration=\"0:0:0\"/>\n\t\t</Storyboard>\n\t\t<Storyboard x:Key=\"canvasBlue\">\n\t\t\t<ColorAnimation\n\t\t\t\tStoryboard.TargetName=\"canvas\"\n\t\t\t\tStoryboard.TargetProperty=\"Background.Color\"\n\t\t\t\tTo=\"Blue\" Duration=\"0:0:0\"/>\n\t\t</Storyboard>\n\t\t<Storyboard x:Key=\"canvasGreen\">\n\t\t\t<ColorAnimation\n\t\t\t\tStoryboard.TargetName=\"canvas\"\n\t\t\t\tStoryboard.TargetProperty=\"Background.Color\"\n\t\t\tTo=\"Green\" Duration=\"0:0:0\"/>\n\t\t</Storyboard>\n\t\t<Storyboard x:Key=\"canvasWhite\">\n\t\t\t<ColorAnimation\n\t\t\t\tStoryboard.TargetName=\"canvas\"\n\t\t\t\tStoryboard.TargetProperty=\"Background.Color\"\n\t\t\t\tTo=\"White\" Duration=\"0:0:0\"/>\n\t\t</Storyboard>\n\t</Canvas.Resources>\n\n\t<Canvas Name=\"canvas\"\n\t\tCanvas.Top=\"8\" Canvas.Left=\"8\" Width=\"128\" Height=\"128\"\n\t\tBackground=\"White\"\n\t\t/>\n\n\t<StackPanel Canvas.Top=\"144\" Canvas.Left=\"8\" Width=\"128\">\n\n\t\t<Button Name=\"buttonRed\" Content=\"赤\">\n\t\t\t<Button.Triggers>\n\t\t\t\t<EventTrigger RoutedEvent=\"Button.Click\" >\n\t\t\t\t\t<BeginStoryboard Storyboard=\"{StaticResource canvasRed}\" />\n\t\t\t\t</EventTrigger>\n\t\t\t</Button.Triggers>\n\t\t</Button>\n\t\t<Button Name=\"buttonBlue\" Content=\"青\">\n\t\t\t<Button.Triggers>\n\t\t\t\t<EventTrigger RoutedEvent=\"Button.Click\" >\n\t\t\t\t\t<BeginStoryboard Storyboard=\"{StaticResource canvasBlue}\" />\n\t\t\t\t</EventTrigger>\n\t\t\t</Button.Triggers>\n\t\t</Button>\n\t\t<Button Name=\"buttonGrean\" Content=\"緑\">\n\t\t\t<Button.Triggers>\n\t\t\t\t<EventTrigger RoutedEvent=\"Button.Click\" >\n\t\t\t\t\t<BeginStoryboard Storyboard=\"{StaticResource canvasGreen}\" />\n\t\t\t\t</EventTrigger>\n\t\t\t</Button.Triggers>\n\t\t</Button>\n\t\t<Button Name=\"buttonWhite\" Content=\"白\">\n\t\t\t<Button.Triggers>\n\t\t\t\t<EventTrigger RoutedEvent=\"Button.Click\" >\n\t\t\t\t\t<BeginStoryboard Storyboard=\"{StaticResource canvasWhite}\" />\n\t\t\t\t</EventTrigger>\n\t\t\t</Button.Triggers>\n\t\t</Button>\n\t</StackPanel>\n</Canvas>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/sample/Gradation.xaml",
    "content": "<Canvas\n\txmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n\txmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\tWidth=\"200\" Height=\"200\" ClipToBounds=\"true\">\n\n\t<Canvas Width=\"300\" Height=\"300\">\n\t\t<Canvas.Triggers>\n\t\t\t<EventTrigger RoutedEvent=\"Canvas.Loaded\">\n\t\t\t\t<BeginStoryboard>\n\t\t\t\t\t<Storyboard>\n\t\t\t\t\t\t<ColorAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"Background.GradientStops[0].Color\"\n\t\t\t\t\t\t\tFrom=\"#0000ff\" To=\"#ffff00\" Duration=\"0:0:3.123\"\n\t\t\t\t\t\t\tAutoReverse=\"true\" RepeatBehavior=\"Forever\"/>\n\t\t\t\t\t\t<ColorAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"Background.GradientStops[1].Color\"\n\t\t\t\t\t\t\tFrom=\"#40b040\" To=\"#b040b0\" Duration=\"0:0:2.234\"\n\t\t\t\t\t\t\tAutoReverse=\"true\" RepeatBehavior=\"Forever\"/>\n\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"RenderTransform.Children[0].ScaleX\"\n\t\t\t\t\t\t\tFrom=\"1.05\" To=\"0.95\" Duration=\"0:0:2.465\"\n\t\t\t\t\t\t\tAutoReverse=\"true\" RepeatBehavior=\"Forever\"/>\n\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"RenderTransform.Children[0].ScaleY\"\n\t\t\t\t\t\t\tFrom=\"1.05\" To=\"0.95\" Duration=\"0:0:2.563\"\n\t\t\t\t\t\t\tAutoReverse=\"true\" RepeatBehavior=\"Forever\"/>\n\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"RenderTransform.Children[1].Angle\"\n\t\t\t\t\t\t\tFrom=\"0\" To=\"360\" Duration=\"0:0:4.231\"\n\t\t\t\t\t\t\tRepeatBehavior=\"Forever\"/>\n\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"RenderTransform.Children[2].X\"\n\t\t\t\t\t\t\tFrom=\"-45\" To=\"-55\" Duration=\"0:0:0.733\"\n\t\t\t\t\t\t\tAutoReverse=\"true\" RepeatBehavior=\"Forever\"/>\n\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"RenderTransform.Children[2].Y\"\n\t\t\t\t\t\t\tFrom=\"-45\" To=\"-55\" Duration=\"0:0:0.639\"\n\t\t\t\t\t\t\tAutoReverse=\"true\" RepeatBehavior=\"Forever\"/>\n\t\t\t\t\t</Storyboard>\n\t\t\t\t</BeginStoryboard>\n\t\t\t</EventTrigger>\n\t\t</Canvas.Triggers>\n\n\t\t<Canvas.RenderTransform>\n\t\t\t<TransformGroup>\n\t\t\t\t<ScaleTransform CenterX=\"150\" CenterY=\"150\" ScaleX=\"1\" ScaleY=\"1\"/>\n\t\t\t\t<RotateTransform CenterX=\"150\" CenterY=\"150\" Angle=\"0\"/>\n\t\t\t\t<TranslateTransform X=\"-50\" Y=\"-50\"/>\n\t\t\t</TransformGroup>\n\t\t</Canvas.RenderTransform>\n\n\t\t<Canvas.Background>\n\t\t\t<LinearGradientBrush StartPoint=\"0,0\" EndPoint=\"1,0\">\n\t\t\t\t<GradientStop Color=\"#ff8080\" Offset=\"0\" />\n\t\t\t\t<GradientStop Color=\"#8080ff\" Offset=\"1\" />\n\t\t\t</LinearGradientBrush>\n\t\t</Canvas.Background>\n\t</Canvas>\n\n\t<Canvas Width=\"300\" Height=\"300\" Opacity=\"0.5\">\n\t\t<Canvas.Triggers>\n\t\t\t<EventTrigger RoutedEvent=\"Canvas.Loaded\">\n\t\t\t\t<BeginStoryboard>\n\t\t\t\t\t<Storyboard>\n\t\t\t\t\t\t<ColorAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"Background.GradientStops[0].Color\"\n\t\t\t\t\t\t\tFrom=\"#ff0000\" To=\"#00ffff\" Duration=\"0:0:2.123\"\n\t\t\t\t\t\t\tAutoReverse=\"true\" RepeatBehavior=\"Forever\"/>\n\t\t\t\t\t\t<ColorAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"Background.GradientStops[1].Color\"\n\t\t\t\t\t\t\tFrom=\"#00ff00\" To=\"#ff00ff\" Duration=\"0:0:3.234\"\n\t\t\t\t\t\t\tAutoReverse=\"true\" RepeatBehavior=\"Forever\"/>\n\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"RenderTransform.Children[0].ScaleX\"\n\t\t\t\t\t\t\tFrom=\"1.05\" To=\"0.95\" Duration=\"0:0:2.365\"\n\t\t\t\t\t\t\tAutoReverse=\"true\" RepeatBehavior=\"Forever\"/>\n\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"RenderTransform.Children[0].ScaleY\"\n\t\t\t\t\t\t\tFrom=\"1.05\" To=\"0.95\" Duration=\"0:0:2.663\"\n\t\t\t\t\t\t\tAutoReverse=\"true\" RepeatBehavior=\"Forever\"/>\n\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"RenderTransform.Children[1].Angle\"\n\t\t\t\t\t\t\tFrom=\"360\" To=\"0\" Duration=\"0:0:3.231\"\n\t\t\t\t\t\t\tRepeatBehavior=\"Forever\"/>\n\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"RenderTransform.Children[2].X\"\n\t\t\t\t\t\t\tFrom=\"-45\" To=\"-55\" Duration=\"0:0:0.633\"\n\t\t\t\t\t\t\tAutoReverse=\"true\" RepeatBehavior=\"Forever\"/>\n\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"RenderTransform.Children[2].Y\"\n\t\t\t\t\t\t\tFrom=\"-45\" To=\"-55\" Duration=\"0:0:0.737\"\n\t\t\t\t\t\t\tAutoReverse=\"true\" RepeatBehavior=\"Forever\"/>\n\t\t\t\t\t</Storyboard>\n\t\t\t\t</BeginStoryboard>\n\t\t\t</EventTrigger>\n\t\t</Canvas.Triggers>\n\n\t\t<Canvas.RenderTransform>\n\t\t\t<TransformGroup>\n\t\t\t\t<ScaleTransform CenterX=\"150\" CenterY=\"150\" ScaleX=\"1\" ScaleY=\"1\"/>\n\t\t\t\t<RotateTransform CenterX=\"150\" CenterY=\"150\" Angle=\"0\"/>\n\t\t\t\t<TranslateTransform X=\"-50\" Y=\"-50\"/>\n\t\t\t</TransformGroup>\n\t\t</Canvas.RenderTransform>\n\n\t\t<Canvas.Background>\n\t\t\t<LinearGradientBrush StartPoint=\"0,1\" EndPoint=\"0,0\">\n\t\t\t\t<GradientStop Color=\"#ff8080\" Offset=\"0\" />\n\t\t\t\t<GradientStop Color=\"#8080ff\" Offset=\"1\" />\n\t\t\t</LinearGradientBrush>\n\t\t</Canvas.Background>\n\t</Canvas>\n\n</Canvas>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/sample/LineArt.xaml",
    "content": "<Canvas\n\txmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n\txmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\tWidth=\"640\" Height=\"480\" Background=\"#000000\">\n\n\t<Canvas.Resources>\n\t\t<!-- 色は Style で指定 -->\n\t\t<Style TargetType=\"{x:Type Line}\">\n\t\t\t<Setter Property=\"Stroke\" Value=\"#ff0000\"/>\n\t\t\t<Setter Property=\"StrokeThickness\" Value=\"1\"/>\n\n\t\t\t<Style.Triggers>\n\t\t\t\t<EventTrigger RoutedEvent=\"Polygon.Loaded\">\n\t\t\t\t\t<BeginStoryboard>\n\t\t\t\t\t\t<Storyboard>\n\t\t\t\t\t\t\t<ColorAnimationUsingKeyFrames\n\t\t\t\t\t\t\t\tStoryboard.TargetProperty=\"Stroke.Color\"\n\t\t\t\t\t\t\t\tDuration=\"0:0:12\" RepeatBehavior=\"Forever\">\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#ff0000\" KeyTime=\"0:0:0\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#ff8000\" KeyTime=\"0:0:1\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#ffff00\" KeyTime=\"0:0:2\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#80ff00\" KeyTime=\"0:0:3\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#00ff00\" KeyTime=\"0:0:4\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#00ff80\" KeyTime=\"0:0:5\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#00ffff\" KeyTime=\"0:0:6\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#0080ff\" KeyTime=\"0:0:7\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#0000ff\" KeyTime=\"0:0:8\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#8000ff\" KeyTime=\"0:0:9\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#ff00ff\" KeyTime=\"0:0:10\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#ff0080\" KeyTime=\"0:0:11\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#ff0000\" KeyTime=\"0:0:12\" />\n\t\t\t\t\t\t\t</ColorAnimationUsingKeyFrames>\n\t\t\t\t\t\t</Storyboard>\n\t\t\t\t\t</BeginStoryboard>\n\t\t\t\t</EventTrigger>\n\t\t\t</Style.Triggers>\n\t\t</Style>\n\n\t\t<!-- 四角形の4頂点のアニメーション -->\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniX1\"\n\t\t\tStoryboard.TargetProperty=\"X1\"\n\t\t\tDuration=\"0:0:3.41\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"640\" KeyTime=\"0:0:1.651719\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:3.356719\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:3.410000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniY1\"\n\t\t\tStoryboard.TargetProperty=\"Y1\"\n\t\t\tDuration=\"0:0:2.11\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"480\" KeyTime=\"0:0:1.011042\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:2.066042\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:2.110000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniX2\"\n\t\t\tStoryboard.TargetProperty=\"X2\"\n\t\t\tDuration=\"0:0:3.77\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"320\" KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:0.763544\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"640\" KeyTime=\"0:0:2.290633\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"320\" KeyTime=\"0:0:3.770000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniY2\"\n\t\t\tStoryboard.TargetProperty=\"Y2\"\n\t\t\tDuration=\"0:0:2.99\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"480\" KeyTime=\"0:0:1.432708\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:2.927708\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:2.990000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniX3\"\n\t\t\tStoryboard.TargetProperty=\"X1\"\n\t\t\tDuration=\"0:0:3.95\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"320\" KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:0.987500\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"640\" KeyTime=\"0:0:2.962500\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"320\" KeyTime=\"0:0:3.950000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniY3\"\n\t\t\tStoryboard.TargetProperty=\"Y1\"\n\t\t\tDuration=\"0:0:3.19\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"420\" KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"480\" KeyTime=\"0:0:0.199375\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:1.794375\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"420\" KeyTime=\"0:0:3.190000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniX4\"\n\t\t\tStoryboard.TargetProperty=\"X2\"\n\t\t\tDuration=\"0:0:4.01\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"640\" KeyTime=\"0:0:1.942344\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:3.947344\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:4.010000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniY4\"\n\t\t\tStoryboard.TargetProperty=\"Y2\"\n\t\t\tDuration=\"0:0:3.37\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"420\" KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"480\" KeyTime=\"0:0:0.210625\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:1.895625\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"420\" KeyTime=\"0:0:3.370000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<!-- BeginTime をちょっとづつずらした StoryBoard を何組か作ろう -->\n\n\t\t<!-- 1組目 -->\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L11\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L12\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L13\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L14\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<!-- 2組目 -->\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L21\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.05\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L22\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.05\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L23\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.05\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L24\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.05\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<!-- 3組目 -->\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L31\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.1\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L32\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.1\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L33\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.1\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L34\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.1\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<!-- 4組目 -->\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L41\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.15\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L42\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.15\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L43\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.15\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L44\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.15\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t</Canvas.Resources>\n\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L11\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L12\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L13\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L14\"/></Line.Triggers></Line>\n\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L21\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L22\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L23\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L24\"/></Line.Triggers></Line>\n\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L31\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L32\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L33\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L34\"/></Line.Triggers></Line>\n\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L41\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L42\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L43\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L44\"/></Line.Triggers></Line>\n\n</Canvas>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/sample/MouseEnter.xaml",
    "content": "<WrapPanel\n\txmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n\txmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\tWidth=\"200\" Height=\"200\">\n  \n\t<WrapPanel.Resources>\n\t\t<Style TargetType=\"{x:Type Rectangle}\">\n\t\t\t<Setter Property=\"Fill\" Value=\"#8080ff\"/>\n\t\t\t<Setter Property=\"Width\" Value=\"50\"/>\n\t\t\t<Setter Property=\"Height\" Value=\"50\"/>\n\t\t\t<Setter Property=\"RenderTransform\">\n\t\t\t\t<Setter.Value>\n\t\t\t\t\t<RotateTransform CenterX=\"25\" CenterY=\"25\" Angle=\"0\"/>\n\t\t\t\t</Setter.Value>\n\t\t\t</Setter>\n\n\t\t\t<Style.Triggers>\n\t\t\t\t<EventTrigger RoutedEvent=\"Mouse.MouseEnter\">\n\t\t\t\t\t<BeginStoryboard>\n\t\t\t\t\t\t<Storyboard>\n\t\t\t\t\t\t\t<ColorAnimation\n\t\t\t\t\t\t\t\tStoryboard.TargetProperty=\"(Shape.Fill).(SolidColorBrush.Color)\"\n\t\t\t\t\t\t\t\tTo=\"#ff8080\"\n\t\t\t\t\t\t\t\tDuration=\"0:0:0\"/>\n\t\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\t\tStoryboard.TargetProperty=\"RenderTransform.Angle\"\n\t\t\t\t\t\t\t\tTo=\"0\"\n\t\t\t\t\t\t\t\tDuration=\"0:0:0\"/>\n\t\t\t\t\t\t</Storyboard>\n\t\t\t\t\t</BeginStoryboard>\n\t\t\t\t</EventTrigger>\n\t\t\t\t<EventTrigger RoutedEvent=\"Mouse.MouseLeave\">\n\t\t\t\t\t<BeginStoryboard>\n\t\t\t\t\t\t<Storyboard>\n\t\t\t\t\t\t\t<ColorAnimation\n\t\t\t\t\t\t\t\tStoryboard.TargetProperty=\"(Shape.Fill).(SolidColorBrush.Color)\"\n\t\t\t\t\t\t\t\tTo=\"#8080ff\"\n\t\t\t\t\t\t\t\tDuration=\"0:0:1\"/>\n\t\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\t\tStoryboard.TargetProperty=\"RenderTransform.Angle\"\n\t\t\t\t\t\t\t\tTo=\"360\"\n\t\t\t\t\t\t\t\tDuration=\"0:0:3\"/>\n\t\t\t\t\t\t</Storyboard>\n\t\t\t\t\t</BeginStoryboard>\n\t\t\t\t</EventTrigger>\n\t\t\t</Style.Triggers>\n\t\t</Style>\n\t</WrapPanel.Resources>\n\n\t<Rectangle/><Rectangle/><Rectangle/><Rectangle/>\n\t<Rectangle/><Rectangle/><Rectangle/><Rectangle/>\n\t<Rectangle/><Rectangle/><Rectangle/><Rectangle/>\n\t<Rectangle/><Rectangle/><Rectangle/><Rectangle/>\n\n</WrapPanel>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/sample/ResourceDictionary.xaml",
    "content": "<WrapPanel\n\txmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n\txmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\t>\n\t<WrapPanel.Resources>\n\t\t<ResourceDictionary>\n\t\t\t<ResourceDictionary.MergedDictionaries>\n\t\t\t\t<ResourceDictionary Source=\"StyleForButton.xaml\"/>\n\t\t\t\t<ResourceDictionary Source=\"StyleForLabel.xaml\"/>\n\t\t\t</ResourceDictionary.MergedDictionaries>\n\t\t</ResourceDictionary>\n\t</WrapPanel.Resources>\n\n\t<Button Content=\"button 1\"/>\n\t<Label Content=\"label 1\"/>\n\t<Button Content=\"button 2\"/>\n\t<Label Content=\"label 2\"/>\n\t<Button Content=\"button 3\"/>\n\t<Label Content=\"label 3\"/>\n</WrapPanel>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/sample/StyleForButton.xaml",
    "content": "<ResourceDictionary\n\txmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n\txmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\t>\n\t<ControlTemplate x:Key=\"btnTemplate\" TargetType=\"{x:Type Button}\">\n\t\t<Border CornerRadius=\"5\"\n\t\t\tBackground=\"{TemplateBinding Background}\"\n\t\t\tBorderBrush=\"#000000\" BorderThickness=\"1\">\n\t\t\t<ContentPresenter Margin=\"5\"\n\t\t\t\tHorizontalAlignment=\"Center\"\n\t\t\t\tVerticalAlignment=\"Center\"/>\n\t\t</Border>\n\t</ControlTemplate>\n\t<Style TargetType=\"{x:Type Button}\">\n\t\t<Setter Property=\"Background\" Value=\"#eeeeff\"/>\n\t\t<Setter Property=\"Foreground\" Value=\"#ff0000\"/>\n\t\t<Setter Property=\"Template\" Value=\"{StaticResource btnTemplate}\"/>\n\t\t<Style.Triggers>\n\t\t\t<EventTrigger RoutedEvent=\"Mouse.MouseEnter\">\n\t\t\t\t<BeginStoryboard>\n\t\t\t\t\t<Storyboard>\n\t\t\t\t\t\t<ColorAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"Background.Color\"\n\t\t\t\t\t\t\tTo=\"#aaaaff\" Duration=\"0:0:0.3\"/>\n\t\t\t\t\t</Storyboard>\n\t\t\t\t</BeginStoryboard>\n\t\t\t</EventTrigger>\n\t\t\t<EventTrigger RoutedEvent=\"Mouse.MouseLeave\">\n\t\t\t\t<BeginStoryboard>\n\t\t\t\t\t<Storyboard>\n\t\t\t\t\t\t<ColorAnimation\n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"Background.Color\"\n\t\t\t\t\t\t\tTo=\"#eeeeff\" Duration=\"0:0:0.3\"/>\n\t\t\t\t\t</Storyboard>\n\t\t\t\t</BeginStoryboard>\n\t\t\t</EventTrigger>\n\t\t</Style.Triggers>\n\t</Style>\n</ResourceDictionary>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/sample/StyleForLabel.xaml",
    "content": "<ResourceDictionary\n\txmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n\txmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\t>\n\t<Style TargetType=\"{x:Type Label}\">\n\t\t<Setter Property=\"Background\">\n\t\t\t<Setter.Value>\n\t\t\t\t<LinearGradientBrush\n\t\t\t\t\tStartPoint=\"0,0\" EndPoint=\"0,1\">\n\t\t\t\t\t<GradientStop Color=\"#f0f0f0\" Offset=\"0\" />\n\t\t\t\t\t<GradientStop Color=\"#bbbbbb\" Offset=\"1\" />\n\t\t\t\t</LinearGradientBrush>\n\t\t\t</Setter.Value>\n\t\t</Setter>\n\t</Style>\n</ResourceDictionary>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/sample/VistaLikeButton.xaml",
    "content": "<WrapPanel\n\txmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n\txmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\t>\n\n\t<WrapPanel.Resources>\n\t\t<LinearGradientBrush x:Key=\"brush1\"\n\t\t\tStartPoint=\"0,0\" EndPoint=\"0,1\">\n\t\t\t<GradientStop Color=\"#F3F3F3\" Offset=\"0\" />\n\t\t\t<GradientStop Color=\"#EBEBEB\" Offset=\"0.5\" />\n\t\t\t<GradientStop Color=\"#DDDDDD\" Offset=\"0.5\" />\n\t\t\t<GradientStop Color=\"#CECECE\" Offset=\"1\" />\n\t\t</LinearGradientBrush>\n\t\t<LinearGradientBrush x:Key=\"brush2\"\n\t\t\tStartPoint=\"0,0\" EndPoint=\"0,1\">\n\t\t\t<GradientStop Color=\"#EAF6FD\" Offset=\"0\" />\n\t\t\t<GradientStop Color=\"#D9F0FC\" Offset=\"0.5\" />\n\t\t\t<GradientStop Color=\"#BEE6FD\" Offset=\"0.5\" />\n\t\t\t<GradientStop Color=\"#BEE6FD\" Offset=\"1\" />\n\t\t</LinearGradientBrush>\n\n\t\t<ControlTemplate x:Key=\"buttonTemplate\" TargetType=\"Button\">\n\t\t\t<ControlTemplate.Resources>\n\t\t\t\t<Style x:Key=\"buttonBorder\" TargetType=\"{x:Type Border}\">\n\t\t\t\t\t<Setter Property=\"CornerRadius\" Value=\"4\"/>\n\t\t\t\t\t<Setter Property=\"BorderThickness\" Value=\"1\"/>\n\t\t\t\t\t<Setter Property=\"BorderBrush\" Value=\"#707070\"/>\n\t\t\t\t\t<Setter Property=\"Background\"\n\t\t\t\t\t\tValue=\"{StaticResource brush1}\"/>\n\t\t\t\t\t<Style.Triggers>\n\t\t\t\t\t\t<Trigger Property=\"IsMouseOver\" Value=\"true\">\n\t\t\t\t\t\t\t<Setter Property=\"Background\"\n\t\t\t\t\t\t\t\tValue=\"{StaticResource brush2}\"/>\n\t\t\t\t\t\t</Trigger>\n\t\t\t\t\t</Style.Triggers>\n\t\t\t\t</Style>\n\t\t\t</ControlTemplate.Resources>\n\t\t\t<Border Style=\"{StaticResource buttonBorder}\">\n\t\t\t\t<ContentPresenter\n\t\t\t\t\tMargin=\"2\"\n\t\t\t\t\tHorizontalAlignment=\"Center\"\n\t\t\t\t\tVerticalAlignment=\"Center\"\n\t\t\t\t\tRecognizesAccessKey=\"True\"/>\n\t\t\t</Border>\n\t\t\t\n\t\t</ControlTemplate>\n\n\t\t<Style TargetType=\"Button\">\n\t\t\t<Setter Property=\"Template\" Value=\"{StaticResource buttonTemplate}\"/>\n\t\t</Style>\n\t</WrapPanel.Resources>\n\n\t<Button Margin=\"5\"\n\t\tWidth=\"100\" Height=\"100\" Content=\"test1\"\n\t\t/>\n\t<Button Margin=\"5\"\n\t\tWidth=\"50\" Height=\"100\" Content=\"test2\"\n\t\t/>\n\t<Button Margin=\"5\"\n\t\tWidth=\"100\" Height=\"50\" Content=\"test3\"\n\t\t/>\n\t<Button Margin=\"5\"\n\t\tWidth=\"100\" Height=\"100\"\n\t\t>\n\t\t<Ellipse Width=\"30\" Height=\"30\" Fill=\"Red\"/>\n\t</Button>\n\n</WrapPanel>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/sample/paragraph.xaml",
    "content": "<Page\n\txmlns=\n\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n\txmlns:x=\n\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\tBackground=\"White\"\n\t>\n\n\t<FlowDocument>\n\n\t<Paragraph\n\t\tFontSize=\"32\"\n\t\tForeground=\"Blue\">\n\tExample\n\t</Paragraph>\n\n\t<Paragraph\n\t\tFontSize=\"24\">\n\tThis is an example of a \n\t<Span FontStyle=\"Italic\" Foreground=\"Red\">\n\txaml\n\t</Span>\n\tapplication.\n\t</Paragraph>\n\n\t</FlowDocument>\n</Page>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dotnet/sample/viewport3d.xaml",
    "content": "﻿<Page\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    Background=\"Black\"\n    >\n\t<Page.Resources>\n\t\t<MeshGeometry3D x:Key=\"CubeMesh\"\n\t\t\tPositions=\"0.1 0 0  0 0.1 0  -0.1 0 0  0 -0.1 0  0 0 0.1  0 0 -0.1\"\n\t\t\tTriangleIndices=\"0 1 4  1 2 4  2 3 4  3 0 4  0 5 1  1 5 2  2 5 3  3 5 0\"\n\t\t\t/>\n\n\t\t<DiffuseMaterial x:Key=\"WhiteMaterial\">\n\t\t\t<DiffuseMaterial.Brush>\n\t\t\t\t<SolidColorBrush Color=\"White\"/>\n\t\t\t</DiffuseMaterial.Brush>\n\t\t</DiffuseMaterial>\n\t</Page.Resources>\n\n\t<Viewport3D Name=\"viewport\" ClipToBounds=\"True\" Width=\"450\" Height=\"450\" Canvas.Left=\"0\" Canvas.Top=\"10\">\n\t\t<Viewport3D.Triggers>\n\t\t\t<EventTrigger RoutedEvent=\"Viewport3D.Loaded\">\n\t\t\t\t<BeginStoryboard>\n\t\t\t\t\t<Storyboard>\n\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\tStoryboard.TargetName=\"cameraRot\" \n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"Angle\"\n\t\t\t\t\t\t\tFrom=\"0\" To=\"360\" Duration=\"0:0:10\" \n\t\t\t\t\t\t\tAutoReverse=\"False\" RepeatBehavior=\"Forever\" />\n\t\t\t\t\t</Storyboard>\n\t\t\t\t</BeginStoryboard>\n\t\t\t</EventTrigger>\n\t\t</Viewport3D.Triggers>\n\n\t\t<!-- Defines the camera used to view the 3D object. -->\n\t\t<Viewport3D.Camera>\n\t\t\t<PerspectiveCamera Position=\"0,0,3\" LookDirection=\"0,0,-1\" FieldOfView=\"35\">\n\t\t\t\t<PerspectiveCamera.Transform>\n\t\t\t\t\t<RotateTransform3D>\n\t\t\t\t\t\t<RotateTransform3D.Rotation>\n\t\t\t\t\t\t\t<AxisAngleRotation3D x:Name=\"cameraRot\" Axis=\"0,1,0\" Angle=\"0\" />\n\t\t\t\t\t\t</RotateTransform3D.Rotation>\n\t\t\t\t\t</RotateTransform3D>\n\t\t\t\t</PerspectiveCamera.Transform>\n\t\t\t</PerspectiveCamera>\n\t\t\t<!--\n\t\t\t<OrthographicCamera Position=\"0, 0, 15\" LookDirection=\"0,0,-1\">\n\t\t\t\t<OrthographicCamera.Transform>\n\t\t\t\t\t<RotateTransform3D>\n\t\t\t\t\t\t<RotateTransform3D.Rotation>\n\t\t\t\t\t\t\t<AxisAngleRotation3D x:Name=\"cameraRot\" Axis=\"0,1,0\" Angle=\"0\" />\n\t\t\t\t\t\t</RotateTransform3D.Rotation>\n\t\t\t\t\t</RotateTransform3D>\n\t\t\t\t</OrthographicCamera.Transform>\n\t\t\t</OrthographicCamera>\n\t\t\t-->\n\t\t</Viewport3D.Camera>\n\n\n\t\t<!-- The ModelVisual3D children contain the 3D models -->\n\t\t<Viewport3D.Children>\n\n\t\t\t<!-- 光源 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<PointLight Color=\"#ffffff\" Position=\"0 0 0\"\n\t\t\t\t\t\tQuadraticAttenuation=\"0\"\n\t\t\t\t\t\tLinearAttenuation=\"0\"\n\t\t\t\t\t\t/>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<AmbientLight Color=\"#333333\" />\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<DirectionalLight Color=\"#330000\" Direction=\"0,0,-1\" />\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<DirectionalLight Color=\"#000033\" Direction=\"0,0,1\" />\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t\t<!-- 物体1 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<GeometryModel3D\n\t\t\t\t\t\tGeometry=\"{StaticResource CubeMesh}\"\n\t\t\t\t\t\tMaterial=\"{StaticResource WhiteMaterial}\">\n\t\t\t\t\t\t<GeometryModel3D.Transform>\n\t\t\t\t\t\t\t<TranslateTransform3D OffsetX=\"0.8\" />\n\t\t\t\t\t\t</GeometryModel3D.Transform>\n\t\t\t\t\t</GeometryModel3D>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t\t<!-- 物体2 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<GeometryModel3D\n\t\t\t\t\t\tGeometry=\"{StaticResource CubeMesh}\"\n\t\t\t\t\t\tMaterial=\"{StaticResource WhiteMaterial}\">\n\t\t\t\t\t\t<GeometryModel3D.Transform>\n\t\t\t\t\t\t\t<TranslateTransform3D OffsetY=\"0.8\" />\n\t\t\t\t\t\t</GeometryModel3D.Transform>\n\t\t\t\t\t</GeometryModel3D>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t\t<!-- 物体3 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<GeometryModel3D\n\t\t\t\t\t\tGeometry=\"{StaticResource CubeMesh}\"\n\t\t\t\t\t\tMaterial=\"{StaticResource WhiteMaterial}\">\n\t\t\t\t\t\t<GeometryModel3D.Transform>\n\t\t\t\t\t\t\t<TranslateTransform3D OffsetZ=\"0.8\" />\n\t\t\t\t\t\t</GeometryModel3D.Transform>\n\t\t\t\t\t</GeometryModel3D>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t\t<!-- 物体4 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<GeometryModel3D\n\t\t\t\t\t\tGeometry=\"{StaticResource CubeMesh}\"\n\t\t\t\t\t\tMaterial=\"{StaticResource WhiteMaterial}\">\n\t\t\t\t\t\t<GeometryModel3D.Transform>\n\t\t\t\t\t\t\t<TranslateTransform3D OffsetX=\"-0.8\" />\n\t\t\t\t\t\t</GeometryModel3D.Transform>\n\t\t\t\t\t</GeometryModel3D>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t\t<!-- 物体5 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<GeometryModel3D\n\t\t\t\t\t\tGeometry=\"{StaticResource CubeMesh}\"\n\t\t\t\t\t\tMaterial=\"{StaticResource WhiteMaterial}\">\n\t\t\t\t\t\t<GeometryModel3D.Transform>\n\t\t\t\t\t\t\t<TranslateTransform3D OffsetY=\"-0.8\" />\n\t\t\t\t\t\t</GeometryModel3D.Transform>\n\t\t\t\t\t</GeometryModel3D>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t\t<!-- 物体6 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<GeometryModel3D\n\t\t\t\t\t\tGeometry=\"{StaticResource CubeMesh}\"\n\t\t\t\t\t\tMaterial=\"{StaticResource WhiteMaterial}\">\n\t\t\t\t\t\t<GeometryModel3D.Transform>\n\t\t\t\t\t\t\t<TranslateTransform3D OffsetZ=\"-0.8\" />\n\t\t\t\t\t\t</GeometryModel3D.Transform>\n\t\t\t\t\t</GeometryModel3D>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t</Viewport3D.Children>\n\t</Viewport3D>\n</Page>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dsl/source/sample.dsl",
    "content": "﻿let f(x, y) = x * y;\nlet g(x, y, z)\n{\n    let f(x, y) = x + y;\n    let t = f(x, y);\n    z * t;\n}\n\nlet x = 1 + 2 * 3;\nlet y = (-3 + 2 * 4) * f(1, 2);\nlet z = g(x, y, 10);\n\nx + y + z;\n"
  },
  {
    "path": "Chapters/ufcpp2000/dsl/source/stack.mg",
    "content": "﻿module StackMachineEmulator\n{\n    language MiniLanguage\n    {\n        syntax Main = x:Statement+ => Statements { valuesof(x) };\n        \n        // Statement\n\n        syntax Statement =\n            Nop => null|\n            x:LetVariableStatement => x |\n            x:LetFunctionStatement => x |\n            x:ReturnStatement => x;\n        \n        syntax Nop = Delimiter;\n        \n        syntax ReturnStatement =\n            x:Expression Delimiter => Return { x };\n\n        syntax LetVariableStatement =\n            Let i:Identifier '=' e:Expression Delimiter => Variable { Name = i, Expression = e };\n        \n        syntax LetFunctionStatement =\n            Let i:Identifier '(' args:IdentifierList ')' '{' body:Statement* '}' => Function { Name = i, Arguments = args, Statements = body } |\n            Let i:Identifier '(' args:IdentifierList ')'  '=' body:Expression Delimiter => Function { Name = i, Arguments = args, Statements = Return { body } } ;\n            \n        syntax IdentifierList =\n            i:Identifier => [i] |\n            i:Identifier ',' list:IdentifierList => [i, valuesof(list)] ;\n\n        @{Classification[\"Keyword\"]}\n        token Let = 'let';\n        \n        // Expression\n        \n        syntax Expression =\n            x:ConditionalExpression => x ;\n        \n        syntax ExpressionList =\n            e:Expression => [e] |\n            e:Expression ',' list:ExpressionList => [e, valuesof(list)] ;\n        \n        syntax ConditionalExpression =\n            x:LogicalOrExpression => x |\n            cond:LogicalOrExpression '?' t:Expression ':' f:Expression => Conditional { Condition{cond}, TrueExpression{t}, FalseExpression{f} };\n\n        syntax LogicalOrExpression =\n            x:LogicalAndExpression => x |\n            l:LogicalOrExpression '|' r:LogicalAndExpression => Binary { Operator{'|'}, Left {l}, Right{r} };\n        syntax LogicalAndExpression =\n            x:EqualityExpression => x |\n            l:LogicalAndExpression '&' r:EqualityExpression => Binary { Operator{'&'}, Left {l}, Right{r} };\n\n        syntax EqualityExpression =\n            x:RelationalExpression => x |\n            l:EqualityExpression '==' r:RelationalExpression => Binary { Operator{'=='}, Left {l}, Right{r} } |\n            l:EqualityExpression '!=' r:RelationalExpression => Binary { Operator{'!='}, Left {l}, Right{r} };\n        syntax RelationalExpression =\n            x:AdditiveExpression => x |\n            l:RelationalExpression '<' r:AdditiveExpression => Binary { Operator{'<'}, Left {l}, Right{r} } |\n            l:RelationalExpression '>' r:AdditiveExpression => Binary { Operator{'>'}, Left {l}, Right{r} } |\n            l:RelationalExpression '<=' r:AdditiveExpression => Binary { Operator{'<='}, Left {l}, Right{r} } |\n            l:RelationalExpression '>=' r:AdditiveExpression => Binary { Operator{'>='}, Left {l}, Right{r} };\n\n        syntax AdditiveExpression =\n            x:MultiplicativeExpression => x |\n            l:AdditiveExpression '+' r:MultiplicativeExpression => Binary { Operator{'+'}, Left {l}, Right{r} } |\n            l:AdditiveExpression '-' r:MultiplicativeExpression => Binary { Operator{'-'}, Left {l}, Right{r} };\n        syntax MultiplicativeExpression =\n            x:UnaryExpression => x |\n            l:MultiplicativeExpression '*' r:UnaryExpression => Binary { Operator{'*'}, Left {l}, Right{r} } |\n            l:MultiplicativeExpression '/' r:UnaryExpression => Binary { Operator{'/'}, Left {l}, Right{r} } ;\n        syntax UnaryExpression =\n            x:PrimaryExpression => x |\n            '+' x:PrimaryExpression => Unary { Operator{'+'}, Expression {x} } |\n            '-' x:PrimaryExpression => Unary { Operator{'-'}, Expression {x} } ;\n        syntax CallExpression =\n            f:Identifier '(' params:ExpressionList ')' => Call { Function = f, Parameters = params };\n        syntax PrimaryExpression =\n            x:Identifier => Parameter { x } |\n            x:Integer => Constant { x } |\n            '(' x:Expression ')' => x |\n            x:CallExpression => x;\n\n        token Integer = '0'..'9'+;\n        token Identifier = ('a'..'z' | 'A'..'Z')+;\n        token Delimiter = ';';\n\n        interleave WhiteSpace = ' ' | '\\t' | '\\n' | '\\r' | '\\r\\n';\n    }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/dsl/src/ClassToXaml.xsl",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n<xsl:output method=\"xml\" indent=\"yes\"/>\n\n<xsl:template match=\"/class\">\n<Window Class=\"{@name}\">\n\n<xsl:apply-templates select=\"var\"/>\n\n</Window>\n</xsl:template>\n\n<xsl:template match=\"var\">\n<xsl:element name=\"{@type}\">\n\t<xsl:attribute name=\"Name\"><xsl:value-of select=\"@name\"/></xsl:attribute>\n</xsl:element>\n</xsl:template>\n\n</xsl:stylesheet>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dsl/src/LibClass.ps1",
    "content": "function var([string] $name, $default = $null)\n{\n\t$fields = $classDef.fields\n\t$fields[$name] = $default\n}\n\nfunction method([string] $name, $body)\n{\n\t$methods = $classDef.methods\n\t$methods[$name] = $body\n}\n\nfunction new($body)\n{\n\t$classDef.new = $body\n}\n\nfunction global:Def-Class([string] $ClassName, $definition)\n{\n\t$classDef = @{fields = @{}; methods = @{}; new = {} }\n\n\t& $definition\n\n\tSet-Variable ('_ClassPrefix' + $ClassName) $classDef -scope global\n}\n\nfunction CallWithVarArgs\n{\n\tparam($method, $varargs)\n\n\t$1 = $varargs[0]\n\t$2 = $varargs[1]\n\t$3 = $varargs[2]\n\t$4 = $varargs[3]\n\t$5 = $varargs[4]\n\t$6 = $varargs[5]\n\t$7 = $varargs[6]\n\t$8 = $varargs[7]\n\t$9 = $varargs[8]\n\t$l = $varargs.Length\n\n\tif($l -eq 0)     { & $method }\n\telseif($l -eq 1) { & $method $1 }\n\telseif($l -eq 2) { & $method $1 $2 }\n\telseif($l -eq 3) { & $method $1 $2 $3 }\n\telseif($l -eq 4) { & $method $1 $2 $3 $4 }\n\telseif($l -eq 5) { & $method $1 $2 $3 $4 $5 }\n\telseif($l -eq 6) { & $method $1 $2 $3 $4 $5 $6 }\n\telseif($l -eq 7) { & $method $1 $2 $3 $4 $5 $6 $7 }\n\telseif($l -eq 8) { & $method $1 $2 $3 $4 $5 $6 $7 $8 }\n\telse             { & $method $1 $2 $3 $4 $5 $6 $7 $8 $9 }\n}\n\nfunction global:New-Instance\n{\n\tparam($ClassName)\n\n\t$obj = @{}\n\t$classDef = (Get-Variable ('_ClassPrefix' + $ClassName) -scope global).Value\n\t$obj._class = $classDef\n\n\tforeach($key in $classDef.fields.Keys)\n\t{\n\t\t$obj[$key] = $classDef.fields[$key]\n\t}\n\n\t$_ = $obj\n\tCallWithVarArgs $classDef.new $args\n\n\t$obj\n}\n\nfunction global:Call-Method\n{\n\tparam($instance, $MethodName)\n\n\t$method = $instance._class.methods[$MethodName]\n\t$_ = $instance\n\n\tCallWithVarArgs $method $args\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/dsl/src/SimpleClass.cs",
    "content": "﻿class Sample\n{\n\tdouble x;\n\tdouble y;\n}\n\n"
  },
  {
    "path": "Chapters/ufcpp2000/dsl/src/SimpleClass.xaml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Window Class=\"Sample\">\n  <double Name=\"x\" />\n  <double Name=\"y\" />\n</Window>"
  },
  {
    "path": "Chapters/ufcpp2000/dsl/src/SimpleClass.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<class name=\"Sample\">\n\t<var name=\"x\" type=\"double\"/>\n\t<var name=\"y\" type=\"double\"/>\n</class>\n"
  },
  {
    "path": "Chapters/ufcpp2000/dsl/src/TestLibClass.ps1",
    "content": "Def-Class Point {\n\tvar x\n\tvar y\n\n\tnew {\n\t\tparam($x = 0, $y = 0)\n\t\t$_.x = $x\n\t\t$_.y = $y\n\t}\n\n\tmethod abs {\n\t\t[Math]::Sqrt($_.x * $_.x + $_.y * $_.y)\n\t}\n\n\tmethod scale {\n\t\tparam($a)\n\t\t$_.x = $a * $_.x\n\t\t$_.y = $a * $_.y\n\t}\n}\n\n$x = New-Instance Point\n$y = New-Instance Point 3 4\n\nfunction show($x)\n{\n\t'({0}, {1}), abs = {2}' -f $x.x, $x.y, (Call-Method $x abs)\n}\n\nshow $x\nshow $y\n\nCall-Method $y scale 2\nshow $y\n"
  },
  {
    "path": "Chapters/ufcpp2000/dsl/src/Translate.ps1",
    "content": "param($inFile, $outFile)\n\n$xml = [xml](Get-Content $inFile)\n\n$result =\n@\"\nclass $($xml.class.name)\n{\n\n\"@\n\nforeach($var in $xml.class.var)\n{\n\t$result +=\n@\"\n\t$($var.type) $($var.name);\n\n\"@\n}\n\n$result +=\n@\"\n}\n\n\"@\n\n$result | Set-Content $outFile\n"
  },
  {
    "path": "Chapters/ufcpp2000/math/demo/matrix.xbap",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<asmv1:assembly xsi:schemaLocation=\"urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd\" manifestVersion=\"1.0\" xmlns:dsig=\"http://www.w3.org/2000/09/xmldsig#\" xmlns=\"urn:schemas-microsoft-com:asm.v2\" xmlns:asmv1=\"urn:schemas-microsoft-com:asm.v1\" xmlns:asmv2=\"urn:schemas-microsoft-com:asm.v2\" xmlns:xrml=\"urn:mpeg:mpeg21:2003:01-REL-R-NS\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <assemblyIdentity name=\"matrix.application\" version=\"1.0.0.0\" publicKeyToken=\"6d6225026df53465\" language=\"neutral\" processorArchitecture=\"msil\" xmlns=\"urn:schemas-microsoft-com:asm.v1\" />\n  <description asmv2:publisher=\"大阪大学\" asmv2:product=\"matrix\" xmlns=\"urn:schemas-microsoft-com:asm.v1\" />\n  <deployment install=\"false\" />\n  <dependency>\n    <dependentAssembly dependencyType=\"install\" codebase=\"matrix_1_0_0_0\\matrix.exe.manifest\" size=\"8203\">\n      <assemblyIdentity name=\"matrix.exe\" version=\"1.0.0.0\" publicKeyToken=\"6d6225026df53465\" language=\"neutral\" processorArchitecture=\"msil\" type=\"win32\" />\n      <hash>\n        <dsig:Transforms>\n          <dsig:Transform Algorithm=\"urn:schemas-microsoft-com:HashTransforms.Identity\" />\n        </dsig:Transforms>\n        <dsig:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" />\n        <dsig:DigestValue>TumVWbQ6HqPINpiPc4B/yb7Fd4k=</dsig:DigestValue>\n      </hash>\n    </dependentAssembly>\n  </dependency>\n  <publisherIdentity name=\"CN=GALOIS\\iwanaga\" issuerKeyHash=\"61faa0e6ed0d1fa3d31f527705c0a24ab01daa73\" />\n  \n<Signature Id=\"StrongNameSignature\" xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" /><SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" /><Reference URI=\"\"><Transforms><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" /><Transform Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>uLubfyD8lnx9K7tbOcv2vhM8lbA=</DigestValue></Reference></SignedInfo><SignatureValue>46j6pNk39liOnVet52+Ai7cOi98dYUwiOqfLaMHFEbYgu54iqotUpPFtTCe/E0K2Vp1fI6haB2rl35gVH/1PgIcCLwyYav6sJ6mdlgn3tjALbMAkXGZIeEvdaGRG5V4LzjDxlNzRTnC4sYnV0YJ1LW8aVI7exYCxAo36QrFJ8fw=</SignatureValue><KeyInfo Id=\"StrongNameKeyInfo\"><KeyValue><RSAKeyValue><Modulus>53kznLpmNEE5y6i4U4lyeH2QgDn1gQLpfTc93keUpWyAWXZxPW85YQJwlSb+vRD6h9ljSok8UfnvKMcZSm0bmTb4A9k4r/Pwg6C4DfcoQpZckWwKsJqDWuzXOzHz9noVbMCod8MAjtU4MwibFq9fup+7LEp2ak0AE520unQ8l4E=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><msrel:RelData xmlns:msrel=\"http://schemas.microsoft.com/windows/rel/2005/reldata\"><r:license xmlns:r=\"urn:mpeg:mpeg21:2003:01-REL-R-NS\" xmlns:as=\"http://schemas.microsoft.com/windows/pki/2005/Authenticode\"><r:grant><as:ManifestInformation Hash=\"b0953c13bef6cb395bbb2b7d7c96fc207f9bbbb8\" Description=\"\" Url=\"\"><as:assemblyIdentity name=\"matrix.application\" version=\"1.0.0.0\" publicKeyToken=\"6d6225026df53465\" language=\"neutral\" processorArchitecture=\"msil\" xmlns=\"urn:schemas-microsoft-com:asm.v1\" /></as:ManifestInformation><as:SignedBy /><as:AuthenticodePublisher><as:X509SubjectName>CN=GALOIS\\iwanaga</as:X509SubjectName></as:AuthenticodePublisher></r:grant><r:issuer><Signature Id=\"AuthenticodeSignature\" xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" /><SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" /><Reference URI=\"\"><Transforms><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" /><Transform Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>KdW+/07+ZmvEcwcGHMDDEgWP0u4=</DigestValue></Reference></SignedInfo><SignatureValue>m+hJ8o/OTPQdFspqBFMuLcyO1trc7Myw/apH9dgPSf0NmLysUDYLSEnGBhD9KuXIpL5LoQSPn6zhEkubXX+CbgvIVaJJnWwvv81o4xXM+Ll3ijWke9UHOAc5WCIOrLO+IxDS2KL2a+C7bb0dAPY4dSZCV4WqpKMB4aIKgcUTUA4=</SignatureValue><KeyInfo><KeyValue><RSAKeyValue><Modulus>53kznLpmNEE5y6i4U4lyeH2QgDn1gQLpfTc93keUpWyAWXZxPW85YQJwlSb+vRD6h9ljSok8UfnvKMcZSm0bmTb4A9k4r/Pwg6C4DfcoQpZckWwKsJqDWuzXOzHz9noVbMCod8MAjtU4MwibFq9fup+7LEp2ak0AE520unQ8l4E=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><X509Data><X509Certificate>MIIByTCCATagAwIBAgIQDP9gDVl0/INJ9F9Xuj0kXzAJBgUrDgMCHQUAMCcxJTAjBgNVBAMeHABHAEEATABPAEkAUwBcAGkAdwBhAG4AYQBnAGEwHhcNMDcwNjEzMDYxMTUzWhcNMDgwNjEyMTIxMTUzWjAnMSUwIwYDVQQDHhwARwBBAEwATwBJAFMAXABpAHcAYQBuAGEAZwBhMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDneTOcumY0QTnLqLhTiXJ4fZCAOfWBAul9Nz3eR5SlbIBZdnE9bzlhAnCVJv69EPqH2WNKiTxR+e8oxxlKbRuZNvgD2Tiv8/CDoLgN9yhCllyRbAqwmoNa7Nc7MfP2ehVswKh3wwCO1TgzCJsWr1+6n7ssSnZqTQATnbS6dDyXgQIDAQABMAkGBSsOAwIdBQADgYEArMfXye9dorzI0gaJHjG6v45sll8BJ1DzthJ83DaYJzA1yBQSf435tzn6xRfc2P/J3EMS8fpN+ynj+APVXcZTb6yyH/79iAiqERnsldFzwzmpejqhDPCthppOhgfnpzoSI1MYP48fCXYALIo0CDTCA+M4QaWscW5OX34aXx6CUK0=</X509Certificate></X509Data></KeyInfo></Signature></r:issuer></r:license></msrel:RelData></KeyInfo></Signature></asmv1:assembly>"
  },
  {
    "path": "Chapters/ufcpp2000/math/demo/matrix_1_0_0_0/matrix.exe.manifest",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<asmv1:assembly manifestVersion=\"1.0\" xsi:schemaLocation=\"urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd\" xmlns:dsig=\"http://www.w3.org/2000/09/xmldsig#\" xmlns=\"urn:schemas-microsoft-com:asm.v2\" xmlns:asmv1=\"urn:schemas-microsoft-com:asm.v1\" xmlns:asmv2=\"urn:schemas-microsoft-com:asm.v2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n    <asmv1:assemblyIdentity name=\"matrix.exe\" version=\"1.0.0.0\" publicKeyToken=\"6d6225026df53465\" language=\"neutral\" processorArchitecture=\"msil\" type=\"win32\" />\n    <application />\n    <entryPoint>\n        <assemblyIdentity name=\"matrix\" version=\"1.0.2721.3177\" language=\"neutral\" processorArchitecture=\"msil\" />\n        <commandLine file=\"matrix.exe\" parameters=\"\" />\n        <hostInBrowser xmlns=\"urn:schemas-microsoft-com:asm.v3\" />\n    </entryPoint>\n    <trustInfo>\n        <security>\n            <applicationRequestMinimum>\n                <PermissionSet class=\"System.Security.PermissionSet\" version=\"1\" ID=\"Custom\" SameSite=\"site\">\n                    <IPermission class=\"System.Security.Permissions.FileDialogPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" version=\"1\" Access=\"Open\" />\n                    <IPermission class=\"System.Security.Permissions.IsolatedStorageFilePermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" version=\"1\" Allowed=\"ApplicationIsolationByUser\" UserQuota=\"512000\" />\n                    <IPermission class=\"System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" version=\"1\" Flags=\"Execution\" />\n                    <IPermission class=\"System.Security.Permissions.UIPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" version=\"1\" Window=\"SafeTopLevelWindows\" Clipboard=\"OwnClipboard\" />\n                    <IPermission class=\"System.Drawing.Printing.PrintingPermission, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" version=\"1\" Level=\"SafePrinting\" />\n                    <IPermission class=\"System.Security.Permissions.MediaPermission, WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" version=\"1\" Audio=\"SafeAudio\" Video=\"SafeVideo\" Image=\"SafeImage\" />\n                    <IPermission class=\"System.Security.Permissions.WebBrowserPermission, WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" version=\"1\" Level=\"Safe\" />\n                </PermissionSet>\n                <defaultAssemblyRequest permissionSetReference=\"Custom\" />\n            </applicationRequestMinimum>\n        </security>\n    </trustInfo>\n    <dependency>\n        <dependentOS>\n            <osVersionInfo>\n                <os majorVersion=\"5\" minorVersion=\"1\" buildNumber=\"2600\" servicePackMajor=\"0\" />\n            </osVersionInfo>\n        </dependentOS>\n    </dependency>\n    <dependency>\n        <dependentAssembly dependencyType=\"preRequisite\" allowDelayedBinding=\"true\">\n            <assemblyIdentity name=\"Microsoft.Windows.CommonLanguageRuntime\" version=\"2.0.50727.0\" />\n        </dependentAssembly>\n    </dependency>\n    <dependency>\n        <dependentAssembly dependencyType=\"preRequisite\" allowDelayedBinding=\"true\">\n            <assemblyIdentity name=\"PresentationFramework\" version=\"3.0.0.0\" publicKeyToken=\"31BF3856AD364E35\" language=\"neutral\" processorArchitecture=\"msil\" />\n        </dependentAssembly>\n    </dependency>\n    <dependency>\n        <dependentAssembly dependencyType=\"preRequisite\" allowDelayedBinding=\"true\">\n            <assemblyIdentity name=\"WindowsBase\" version=\"3.0.0.0\" publicKeyToken=\"31BF3856AD364E35\" language=\"neutral\" processorArchitecture=\"msil\" />\n        </dependentAssembly>\n    </dependency>\n    <dependency>\n        <dependentAssembly dependencyType=\"install\" allowDelayedBinding=\"true\" codebase=\"matrix.exe\" size=\"28672\">\n            <assemblyIdentity name=\"matrix\" version=\"1.0.2721.3177\" language=\"neutral\" processorArchitecture=\"msil\" />\n            <hash>\n                <dsig:Transforms>\n                    <dsig:Transform Algorithm=\"urn:schemas-microsoft-com:HashTransforms.Identity\" />\n                </dsig:Transforms>\n                <dsig:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" />\n                <dsig:DigestValue>53cEOxmO/6JJfMnxQw2coLl50wQ=</dsig:DigestValue>\n            </hash>\n        </dependentAssembly>\n    </dependency>\n<publisherIdentity name=\"CN=GALOIS\\iwanaga\" issuerKeyHash=\"61faa0e6ed0d1fa3d31f527705c0a24ab01daa73\" /><Signature Id=\"StrongNameSignature\" xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" /><SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" /><Reference URI=\"\"><Transforms><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" /><Transform Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>1RpZNEgFBCTysiQZYyDr1Ley5mc=</DigestValue></Reference></SignedInfo><SignatureValue>Gzzog1hqfdDPfhun0Hvi8HN57LF9cR0kU3HofMN4Sx5xLGk7vWncDKTc3LGrk3aAVCCOOrylPK5edqR+GiF6T1vHMAD7CeTzW4rlLD16ugNuEXnmE+eI2v2fIFUBBWgftMJH5qOBa8KCKhGWMIaayOJwc1fhrI8aYAtFJoV0xr0=</SignatureValue><KeyInfo Id=\"StrongNameKeyInfo\"><KeyValue><RSAKeyValue><Modulus>53kznLpmNEE5y6i4U4lyeH2QgDn1gQLpfTc93keUpWyAWXZxPW85YQJwlSb+vRD6h9ljSok8UfnvKMcZSm0bmTb4A9k4r/Pwg6C4DfcoQpZckWwKsJqDWuzXOzHz9noVbMCod8MAjtU4MwibFq9fup+7LEp2ak0AE520unQ8l4E=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><msrel:RelData xmlns:msrel=\"http://schemas.microsoft.com/windows/rel/2005/reldata\"><r:license xmlns:r=\"urn:mpeg:mpeg21:2003:01-REL-R-NS\" xmlns:as=\"http://schemas.microsoft.com/windows/pki/2005/Authenticode\"><r:grant><as:ManifestInformation Hash=\"67e6b2b7d4eb20631924b2f22404054834591ad5\" Description=\"\" Url=\"\"><as:assemblyIdentity name=\"matrix.exe\" version=\"1.0.0.0\" publicKeyToken=\"6d6225026df53465\" language=\"neutral\" processorArchitecture=\"msil\" type=\"win32\" /></as:ManifestInformation><as:SignedBy /><as:AuthenticodePublisher><as:X509SubjectName>CN=GALOIS\\iwanaga</as:X509SubjectName></as:AuthenticodePublisher></r:grant><r:issuer><Signature Id=\"AuthenticodeSignature\" xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" /><SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" /><Reference URI=\"\"><Transforms><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" /><Transform Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>TniVUNWsuG56XkP+nzsy1dERCbs=</DigestValue></Reference></SignedInfo><SignatureValue>hHu08Up1xoIshFaMk85HAkz+veAT0PX/39OQEw7M/Aif4UqRfRpqLqe9YQKSZYEnoW3VB9kZr0mCuXhVu7sIkYaCKvFBFh5PsKd+sPzDS9aEl0OVkLBHlupnQNSqJWhhyb15rR2stuGfk/F2jEuOnm9m4MSnIHCFHIu34uJpMRA=</SignatureValue><KeyInfo><KeyValue><RSAKeyValue><Modulus>53kznLpmNEE5y6i4U4lyeH2QgDn1gQLpfTc93keUpWyAWXZxPW85YQJwlSb+vRD6h9ljSok8UfnvKMcZSm0bmTb4A9k4r/Pwg6C4DfcoQpZckWwKsJqDWuzXOzHz9noVbMCod8MAjtU4MwibFq9fup+7LEp2ak0AE520unQ8l4E=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><X509Data><X509Certificate>MIIByTCCATagAwIBAgIQDP9gDVl0/INJ9F9Xuj0kXzAJBgUrDgMCHQUAMCcxJTAjBgNVBAMeHABHAEEATABPAEkAUwBcAGkAdwBhAG4AYQBnAGEwHhcNMDcwNjEzMDYxMTUzWhcNMDgwNjEyMTIxMTUzWjAnMSUwIwYDVQQDHhwARwBBAEwATwBJAFMAXABpAHcAYQBuAGEAZwBhMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDneTOcumY0QTnLqLhTiXJ4fZCAOfWBAul9Nz3eR5SlbIBZdnE9bzlhAnCVJv69EPqH2WNKiTxR+e8oxxlKbRuZNvgD2Tiv8/CDoLgN9yhCllyRbAqwmoNa7Nc7MfP2ehVswKh3wwCO1TgzCJsWr1+6n7ssSnZqTQATnbS6dDyXgQIDAQABMAkGBSsOAwIdBQADgYEArMfXye9dorzI0gaJHjG6v45sll8BJ1DzthJ83DaYJzA1yBQSf435tzn6xRfc2P/J3EMS8fpN+ynj+APVXcZTb6yyH/79iAiqERnsldFzwzmpejqhDPCthppOhgfnpzoSI1MYP48fCXYALIo0CDTCA+M4QaWscW5OX34aXx6CUK0=</X509Certificate></X509Data></KeyInfo></Signature></r:issuer></r:license></msrel:RelData></KeyInfo></Signature></asmv1:assembly>"
  },
  {
    "path": "Chapters/ufcpp2000/math/demo/matrix_1_0_0_0.xbap",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<asmv1:assembly xsi:schemaLocation=\"urn:schemas-microsoft-com:asm.v1 assembly.adaptive.xsd\" manifestVersion=\"1.0\" xmlns:dsig=\"http://www.w3.org/2000/09/xmldsig#\" xmlns=\"urn:schemas-microsoft-com:asm.v2\" xmlns:asmv1=\"urn:schemas-microsoft-com:asm.v1\" xmlns:asmv2=\"urn:schemas-microsoft-com:asm.v2\" xmlns:xrml=\"urn:mpeg:mpeg21:2003:01-REL-R-NS\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n  <assemblyIdentity name=\"matrix.application\" version=\"1.0.0.0\" publicKeyToken=\"6d6225026df53465\" language=\"neutral\" processorArchitecture=\"msil\" xmlns=\"urn:schemas-microsoft-com:asm.v1\" />\n  <description asmv2:publisher=\"大阪大学\" asmv2:product=\"matrix\" xmlns=\"urn:schemas-microsoft-com:asm.v1\" />\n  <deployment install=\"false\" />\n  <dependency>\n    <dependentAssembly dependencyType=\"install\" codebase=\"matrix_1_0_0_0\\matrix.exe.manifest\" size=\"8203\">\n      <assemblyIdentity name=\"matrix.exe\" version=\"1.0.0.0\" publicKeyToken=\"6d6225026df53465\" language=\"neutral\" processorArchitecture=\"msil\" type=\"win32\" />\n      <hash>\n        <dsig:Transforms>\n          <dsig:Transform Algorithm=\"urn:schemas-microsoft-com:HashTransforms.Identity\" />\n        </dsig:Transforms>\n        <dsig:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" />\n        <dsig:DigestValue>TumVWbQ6HqPINpiPc4B/yb7Fd4k=</dsig:DigestValue>\n      </hash>\n    </dependentAssembly>\n  </dependency>\n  <publisherIdentity name=\"CN=GALOIS\\iwanaga\" issuerKeyHash=\"61faa0e6ed0d1fa3d31f527705c0a24ab01daa73\" />\n  \n<Signature Id=\"StrongNameSignature\" xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" /><SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" /><Reference URI=\"\"><Transforms><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" /><Transform Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>uLubfyD8lnx9K7tbOcv2vhM8lbA=</DigestValue></Reference></SignedInfo><SignatureValue>46j6pNk39liOnVet52+Ai7cOi98dYUwiOqfLaMHFEbYgu54iqotUpPFtTCe/E0K2Vp1fI6haB2rl35gVH/1PgIcCLwyYav6sJ6mdlgn3tjALbMAkXGZIeEvdaGRG5V4LzjDxlNzRTnC4sYnV0YJ1LW8aVI7exYCxAo36QrFJ8fw=</SignatureValue><KeyInfo Id=\"StrongNameKeyInfo\"><KeyValue><RSAKeyValue><Modulus>53kznLpmNEE5y6i4U4lyeH2QgDn1gQLpfTc93keUpWyAWXZxPW85YQJwlSb+vRD6h9ljSok8UfnvKMcZSm0bmTb4A9k4r/Pwg6C4DfcoQpZckWwKsJqDWuzXOzHz9noVbMCod8MAjtU4MwibFq9fup+7LEp2ak0AE520unQ8l4E=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><msrel:RelData xmlns:msrel=\"http://schemas.microsoft.com/windows/rel/2005/reldata\"><r:license xmlns:r=\"urn:mpeg:mpeg21:2003:01-REL-R-NS\" xmlns:as=\"http://schemas.microsoft.com/windows/pki/2005/Authenticode\"><r:grant><as:ManifestInformation Hash=\"b0953c13bef6cb395bbb2b7d7c96fc207f9bbbb8\" Description=\"\" Url=\"\"><as:assemblyIdentity name=\"matrix.application\" version=\"1.0.0.0\" publicKeyToken=\"6d6225026df53465\" language=\"neutral\" processorArchitecture=\"msil\" xmlns=\"urn:schemas-microsoft-com:asm.v1\" /></as:ManifestInformation><as:SignedBy /><as:AuthenticodePublisher><as:X509SubjectName>CN=GALOIS\\iwanaga</as:X509SubjectName></as:AuthenticodePublisher></r:grant><r:issuer><Signature Id=\"AuthenticodeSignature\" xmlns=\"http://www.w3.org/2000/09/xmldsig#\"><SignedInfo><CanonicalizationMethod Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" /><SignatureMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#rsa-sha1\" /><Reference URI=\"\"><Transforms><Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\" /><Transform Algorithm=\"http://www.w3.org/2001/10/xml-exc-c14n#\" /></Transforms><DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\" /><DigestValue>KdW+/07+ZmvEcwcGHMDDEgWP0u4=</DigestValue></Reference></SignedInfo><SignatureValue>m+hJ8o/OTPQdFspqBFMuLcyO1trc7Myw/apH9dgPSf0NmLysUDYLSEnGBhD9KuXIpL5LoQSPn6zhEkubXX+CbgvIVaJJnWwvv81o4xXM+Ll3ijWke9UHOAc5WCIOrLO+IxDS2KL2a+C7bb0dAPY4dSZCV4WqpKMB4aIKgcUTUA4=</SignatureValue><KeyInfo><KeyValue><RSAKeyValue><Modulus>53kznLpmNEE5y6i4U4lyeH2QgDn1gQLpfTc93keUpWyAWXZxPW85YQJwlSb+vRD6h9ljSok8UfnvKMcZSm0bmTb4A9k4r/Pwg6C4DfcoQpZckWwKsJqDWuzXOzHz9noVbMCod8MAjtU4MwibFq9fup+7LEp2ak0AE520unQ8l4E=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><X509Data><X509Certificate>MIIByTCCATagAwIBAgIQDP9gDVl0/INJ9F9Xuj0kXzAJBgUrDgMCHQUAMCcxJTAjBgNVBAMeHABHAEEATABPAEkAUwBcAGkAdwBhAG4AYQBnAGEwHhcNMDcwNjEzMDYxMTUzWhcNMDgwNjEyMTIxMTUzWjAnMSUwIwYDVQQDHhwARwBBAEwATwBJAFMAXABpAHcAYQBuAGEAZwBhMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDneTOcumY0QTnLqLhTiXJ4fZCAOfWBAul9Nz3eR5SlbIBZdnE9bzlhAnCVJv69EPqH2WNKiTxR+e8oxxlKbRuZNvgD2Tiv8/CDoLgN9yhCllyRbAqwmoNa7Nc7MfP2ehVswKh3wwCO1TgzCJsWr1+6n7ssSnZqTQATnbS6dDyXgQIDAQABMAkGBSsOAwIdBQADgYEArMfXye9dorzI0gaJHjG6v45sll8BJ1DzthJ83DaYJzA1yBQSf435tzn6xRfc2P/J3EMS8fpN+ynj+APVXcZTb6yyH/79iAiqERnsldFzwzmpejqhDPCthppOhgfnpzoSI1MYP48fCXYALIo0CDTCA+M4QaWscW5OX34aXx6CUK0=</X509Certificate></X509Data></KeyInfo></Signature></r:issuer></r:license></msrel:RelData></KeyInfo></Signature></asmv1:assembly>"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/bug/01equal.c",
    "content": "/*\n=  ==\n */\n\n#include<stdio.h>\n\n#define ACTIVE 0\n#define DONE 1\n\nint SomeAction()\n{\n\tprintf(\"some action\\n\");\n\treturn DONE;\n}\n\nint main()\n{\n\tint flag = ACTIVE;\n\n\twhile(flag == ACTIVE)\n\t{\n\t\tflag = SomeAction();\n\t}\n\n\treturn 0;\n}\n\n/*\nEK1\n16sځA ==  = ƊԈႤƁEEE\nĂ݂悤B\n\nȂ݂ɁA-Wall IvVƂtČxxグƓ{͂B\nwhile Ƃ if  () ̒ɑ𒼐ڏȂāB\n\nEK2\nɁAACTIVE  DONE ̒l 0, 1 tɂǂȂ邩Ă݂悤B\n\nvŐI ctrl + CB\n */\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/bug/02offbyone.c",
    "content": "/*\noff-by-one\n\nz̒1ԈႦB\nPȂoOȂ܂ǂA\nZLeBz[ɂȂB\n */\n\n#include<stdio.h>\n\n#define N 16\n\nint main()\n{\n\tint a = -2;\n\tint x[N]; /*  N ̔z錾āEEE */\n\tint b = -1;\n\tint i;\n\n\tx[N] = 0;\n\t/* \n\t * Ⴞ߁B N ̔z\n\t * x[0] ` x[N-1] ܂ŁB\n\t */\n\n\t printf(\"%d, %d\\n\", a, b);\n\t /* \n\t  * ŋ߂̃RpC͔z̑OɁg]ĥŁA\n\t  * x[N] = 0 ɂ a  b ȂƂ邯ǁB\n\t  * RpCɂĂ a  b ̒lƂB\n\t  */\n\n\tfor (i = 0; i <= N; ++i)\n\t{\n\t\tx[i] = 0;\n\t}\n\t /* \n\t  * for ̒̏ i <= N ɂȂĂƁA\n\t  * x[N] ̒lĂ܂B\n\t  *  i < N B\n\t  * 1Ⴂ̃~XȂ̂ŁAĂĂ܂ɂႤB\n\t  */\n\n\treturn 0;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/bug/03priority.c",
    "content": "/*\nZq̗D揇\n\n*, /  +, - ̗D揇ʂԈႦl͂ȂƎvǁEEE\n炢Ȃ () ł悤ɁB\n */\n\n#include<stdio.h>\n\nint main()\n{\n\tprintf(\"%d\\n\", 1 << 3 + 1);\n\t/* \n\t * (1 << 3) + 1  9 H\n\t * 1 << (3 + 1)  16H\n\t * \n\t * 8{i* 8ĵ << 3 Ƃ鎞ɂ͒ӁB\n\t */\n\n#define MASK 0xff\n\n\tprintf(\"%d\\n\", 0x9999 & MASK == 0x99);\n\t/* \n\t *  & ́urbgƂ ANDvB\n\t * }XN|āA1oCgoB\n\t * \n\t * (0x9999 & MASK) == 0x99  0x99 == 0x99  1 (true) H\n\t * 0x9999 & (MASK == 0x99)  0x9999 & 0  0 H\n\t */\n\n\tprintf(\"%d\\n\", 2 & 3 | 5);\n\t/* \n\t * 2 & (3 | 5)  2 & 7  2 H\n\t * (2 & 3) | 5  2 | 5  7 H\n\t * \n\t * ܂ÁA\n\t * & _gρhA| _gahƂ邱ƂA\n\t * ǂD悳邩邩ȂǂB\n\t * +  * ͕₷ȂŁA() t邱ƐB\n\t */\n\n\treturn 0;\n}\n\n/*\nȂ݂ɁAD揇ʂ̕sĂȎA\n-Wall IvVƂtČxxグƓ{͂B\n\nEK\n() ̈ʒutւāAʂǂς邩m߂悤B\n */\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/bug/04and.c",
    "content": "/*\n&&  ||\n\n&&  || ͂ƓȉZqB\n */\n\n#include<stdio.h>\n\nint foo(int flag)\n{\n\tputs(\"foo\");\n\treturn flag;\n}\n\nint bar(int flag)\n{\n\tputs(\"bar\");\n\treturn flag;\n}\n\nint main()\n{\n\tprintf(\"%d\\n\", foo(0) || bar(0));\n\tprintf(\"%d\\n\", foo(1) || bar(0));\n\tprintf(\"%d\\n\", foo(0) && bar(0));\n\tprintf(\"%d\\n\", foo(1) && bar(0));\n\t/* \n\t * \"bar\" \\ƂƂȂƂ͂B\n\t * \n\t * && c  0 ƁA̎_ AND ̌ʂ 0 Ɋm肷̂ŁA\n\t *       E͎sȂB\n\t * || c B\n\t *        0 ƁAE͎sȂB\n\t */\n\n\treturn 0;\n}\n\n/*\n|| ̐gāA\n\nSomeOperation() || exit();\n\nASomeOperation  0 ԂꍇAvOIB\n\nƂ悤ȃgbL[ȃR[hlB\n(C ł͂܂萄ȂBPerl Ƃ悭B)\n\nEK\n||,  &&  |, & ɕςĂĂ݂悤B\n\nȂ݂ɁA||, && ȊỎZq̏ꍇA\nZq̍ƉEAǂ炪Ɏs邩\nC ̋Ki㌈܂ĂȂiǂłKiᔽł͂ȂjB\n */\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/bug/05elseif.c",
    "content": "/*\nif  else ̑Ή֌W\n\n{} łȂꍇA\nelse ͈ԋ߂ if ɑΉB\n\nif(a)\nif(b) y();\nelse z();\n\nȂA\n\nif(a)\n{\n\tif(b)\n\t\ty();\n\telse\n\t\tz();\n}\n */\n\n#include<stdio.h>\n\nint main()\n{\n\tif (0)\n\tif (0)\n\t\tputs(\"1\");\n\telse if (0)\n\tif (1)\n\t\tputs(\"2\");\n\telse\n\t\tputs(\"3\");\n\telse\n\t\tputs(\"4\");\n\telse \n\t\tputs(\"5\");\n\t/* \n\t * 1`5Aǂꂪ\\ł傤H\n\t */\n\n\tif (0)\n\t{\n\t\tif (0)\n\t\t{\n\t\t\tputs(\"1\");\n\t\t}\n\t\telse if (0)\n\t\t{\n\t\t\tif (1)\n\t\t\t\tputs(\"2\");\n\t\t\telse\n\t\t\t\tputs(\"3\");\n\t\t}\n\t\telse\n\t\t\tputs(\"4\");\n\t}\n\telse\n\t\tputs(\"5\");\n\t/* \n\t * Cfg΁Aǂꂪs邩͂ԖāB\n\t * Cfg͂ƁB\n\t */\n\n\treturn 0;\n}\n\n/*\nEK\nif()  0, 1 낢ςĎsĂ݂B\n */\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/bug/06int.c",
    "content": "/*\nint, doubleAÖق̌^ϊ\n\nint  double ̈Öق̌^ϊɋC܂傤B\n\nZ̎ɂ int ̊Z double ̊Z̈ႢɋC܂傤B\n */\n\n#include<stdio.h>\n#include<math.h>\n\nint main()\n{\n\tint x;\n\tdouble y;\n\n\tx = atan(1) * 4;\n\tprintf(\"%f\\n\", sin(x));\n\t/* \n\t * x ̒l  ɂȂłƁEEE\n\t * \n\t * double  int ͏ɕϊĂ܂B\n\t * RpCɂẮAdouble  int ̕ϊÖقɂ悤Ƃƌx̂B\n\t * gcc ̏ꍇA-Wall IvVΌxoĂ炦B\n\t */\n\n\ty = 11 / 10;\n\tprintf(\"%f\\n\", y);\n\t/* \n\t * Öق̌^ϊ̂͑̂݁B\n\t * 11  10  int Ȃ̂ŁEEE\n\t * \n\t * y == 1.1 ɂ΁Aȉ̂悤ɂB\n\t * y = (double)11 / 10;\n\t * ܂\n\t * y = 11.0 / 10.0;\n\t * \n\t * RAȉ̂悤Ȃ̂ł͑ʖځB\n\t * y = (double)(11 / 10);\n\t */\n\n\treturn 0;\n}\n\n/*\nEK\nx  double ɂĂ݂܂傤B\n܂Ay ̒l 1.1 ɂȂ悤ɏC܂傤B\n */\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/bug/07range.c",
    "content": "/*\nl͈̔\n */\n\n#include<stdio.h>\n#include<math.h>\n\nint main()\n{\n\tchar i;\n\tunsigned int j;\n\n\tfor (i = 0; i < 300; ++i)\n\t{\n\t\tprintf(\"%d\", i);\n\t}\n\t/* \n\t * i  char ^ȎYĂƁEEE\n\t * \n\t * char  0`255  -128`127 Ȃ̂ŁA300 ͐ΒȂB\n\t * \n\t * 0`255 ̏ꍇA255 + 1  0 A\n\t * -128`127 ̏ꍇA127 + 1  -128B\n\t * Ȃ݂ɁAchar tɂȂ邩ȂɂȂ邩͏nˑB\n\t * \n\t * vŐI ctrl + C ŁB\n\t */\n\n\tfor (j = 30; j >= 0; --j)\n\t{\n\t\tprintf(\"%d\", j);\n\t}\n\t/* \n\t * j  ȂȎYĂƁEEE\n\t * \n\t * unsigned ̏ꍇA0 - 1  UINT_MAXiunsigend int ̍őljɂȂB\n\t * j >= 0 ͏ɐ^B\n\t * \n\t * vŐI ctrl + C ŁB\n\t */\n\n\treturn 0;\n}\n\n/*\nEK\ni, j  int ɕςĂ݂܂傤B\n */\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/bug/08define.c",
    "content": "/*\n}N̕p\n */\n\n#include<stdio.h>\n\n#define MUL(x, y) (x * y)\n#define SQUARE(x) ((x) * (x))\n\nint main()\n{\n\tint a = 2;\n\tint b = 3;\n\tint c = 4;\n\tint d = 5;\n\tint x;\n\n\tx = MUL(a + b, c + d);\n\tprintf(\"%d\\n\", x);\n\t/* \n\t * #define }ŃAPɕ̒u邾B\n\t * \n\t * ̏ꍇA\n\t * (a + b * c + d)\n\t * ɓWJB\n\t * (a + b) * (c + d)  5 * 9  45 ł͂ȂA\n\t * (a + b * c + d)  2 * 7 * 5  70 ɂȂB\n\t * \n\t * MUL ̒`\n\t * #define MUL(x, y) ((x) * (y))\n\t * ɂ΂̖͋NȂB\n\t */\n\n\tx = SQUARE(++a);\n\tprintf(\"%d\\n\", x);\n\t/* \n\t * A\n\t * ((++a) * (++a))\n\t * ɓWJB\n\t * (++a  3) 2  9 ł͂ȂA\n\t * (++a, ++a  4) 2  16 ɂȂB\n\t * \n\t * }NƃCNg͑̂ŁAꏏɎgȂ悤ɁB\n\t * ʓ|łA\n\t * ++a;\n\t * x = SQUARE(a);\n\t * Ƃ悤2ɕďB\n\t */\n\n\treturn 0;\n}\n\n/*\nŋ߂ł́A}NgƎ́A񐄏B\nC++  C99 ɂ̓CC֐Ƃ̂ŁAg悤ɁB\nC89 łAWł͂Ȃ̂́AẴRpCɂ _inline L[[hB\n */\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/bug/09jpspace.c",
    "content": "/*\nSp̍\n\n=   ԈႦ͂܂ȂƎvǁA\nSpXy[X̍͌\\AS҂点B\n */\n@\n#include<stdio.h>\n\nint main()\n{\n@printf(\"Hello World!\\n\");\n\t/* \n\t * ꌩAȂɌ邯ǁEEE\n\t */\n\n@return 0;\n}\n\n/*\nEK\n̉ӏ肵āAC悤B\n\n\n\nSpXy[XFÂĕ\\ĂGfB^gƐB\n\nłŋ߂́AЂƂƁAUNICODE (UTF8)ŕۑĂ\nSpgĂȂRpC邩B\n\nC# Ƃ VB Ƃ Microsoft nȂ񂩂͂B\n */\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/bug/10array.c",
    "content": "/*\nz֌W\n */\n\n#include<stdio.h>\n\n/* 1z */\nvoid Array1()\n{\n\tint a[] = {1, 2, 3, 4};\n\tint *p = a;\n\n\tprintf(\"%d, %d\\n\", a, p);\n\t/* \n\t * z a  [] ȂŎgƁA|C^ƂقړӖɂȂB\n\t * \n\t * ƂƂ́EEE\n\t * ݂Ȃ܂˂łB\n\t */\n\n\tprintf(\"%d, %d, %d, %d\\n\",\n\t\ta[2],\n\t\t*(a + 2),\n\t\t*(2 + a),\n\t\t2[a]);\n\t/* \n\t * 4ƂӖB\n\t * 4ڂ͋CȂǂA\n\t * C ł͂\\B\n\t * \n\t * ASɃ|C^ƓƂ킯łȂEEE\n\t */\n\n\t/*\n\t++a;\n\ta = p;\n\t*/\n\t/* \n\t * |C^ƈāAAhX̃CNg͕sB\n\t * 2s̓G[ɂȂ̂ŁARpC邽߂ɂ̓RgAEgKvB\n\t * \n\t */\n\n\tprintf(\"%d, %d\\n\", sizeof(a), sizeof(p));\n\t/* \n\t * sizeof ̌ʂAzƃ|C^ł͈Ⴄ̂ŒӁB\n\t * sizeof(z)  sizeof(int) * z̗vf\n\t * sizeof(|C^)  sizeof(int *)\n\t * ƓӖB\n\t * \n\t * Ȃ݂ɁÂƂ𗘗pƁA\n\t * sizeof(a) / sizeof(int) ŁAz a ̗vf𓾂邱Ƃ\\B\n\t */\n}\n\n/* 2z */\nvoid Array2()\n{\n\tint a[2][2] = { {1, 2}, {3, 4} };\n\tint **p;\n\tint *q[2] = {a[0], a[1]};\n\tint *r;\n\n\tprintf(\"%d, %d, %d, %d\\n\",\n\t\ta[0][0], **a,\n\t\ta[0][1], *(*a + 1)\n\t\t);\n\tprintf(\"%d, %d, %d, %d\\n\",\n\t\ta[1][0], **(a + 1),\n\t\ta[1][1], *(*(a + 1) + 1)\n\t\t);\n\t/* \n\t * 2z2d|C^\n\t * ۂg񂾂ǁEEE\n\t */\n\n\t/*\n\tp = a;\n\tprintf(\"%d, %d\\n\", p[0][0], p[1][1]);\n\t*/\n\t/* \n\t * 2z2d|C^ɑ͂łȂB\n\t * ̍sARpCł邱Ƃ͂ł邯ǁAsƃG[ɁB\n\t * G[Ȃs邽߂ɂ̓RgAEgB\n\t */\n\n\tprintf(\"%d, %d\\n\", q[0][0], q[1][1]);\n\t/* \n\t * q ݂Ƀ|C^̔zɑȂ OKB\n\t * ͂ a[0][0], a[1][1] ̒lB\n\t */\n\n\tprintf(\"%d, %d, %d\\n\", a, a[0], &a[0][0]);\n\tprintf(\"%d, %d, %d\\n\", q, q[0], &q[0][0]);\n\t/* \n\t * ̍ssĂ݂Ε邯ǂA\n\t * a  a[0]  &a[0][0] ǂAhXwB\n\t * q ́̕Aq[0]  &q[0][0] ͓ǁAq ͕ʁB\n\t * \n\t * ̕ӂAz͓ȏĂ̂ŁA\n\t * d|C^ƊSɓԊuŎgƂ܂B\n\t */\n\n\tr = &a[0][0];\n\tprintf(\"%d, %d, %d, %d\\n\",\n\t \tr[0], r[1], r[2], r[3]);\n\tprintf(\"%d, %d, %d, %d\\n\",\n\t \tr[0], r[1], r[2 * 1 + 0], r[2 * 1 + 1]);\n\t/* \n\t * z̊eśAԂȂqĕłB\n\t * Ȃ̂ŁA1IɂANZX\\B\n\t * \n\t * 悤ɁAi s j ڂɃANZXȂA\n\t * r[i *  + j]\n\t */\n}\n\nvoid FunctionWithArrayParam(int a[])\n{\n\tprintf(\"%d\\n\", sizeof(a));\n\t/* \n\t * zƂĎgꍇA\n\t * |C^ƓɂȂĂ܂B\n\t * ̏ꍇAsizeof(a)  sizeof(z) ł͂ȂAsizeof(|C^) ƓʁB\n\t * Ȃ킿Asizeof(int *) ɂȂB\n\t * \n\t * sizeof(a) / sizeof(int) ł͔z񒷂擾łȂ̂ŁA\n\t * z񒷂ƂēnKvB\n\t */\n}\n\nvoid FunctionWithMultiDimArray(int a[][])\n{\n\t/*\n\tprintf(\"%d, %d\\n\", a[0][0], a[0][1]);\n\t*/\n\t/* \n\t * ͂ARpCG[NB\n\t * \n\t * Array2() ŁAint **p = a; G[ɂȂ̂ƓRB\n\t * ƂĔzgƁA|C^ɂȂĂ܂B\n\t * int a[][] ȂAint **a ƂقړӖB\n\t * \n\t * int a[2][] Ƃΐ삷悤ɂȂ邯ǁA\n\t * z̕ 2 2z񂵂󂯎ȂȂB\n\t */\n}\n\n/* ֐̈ɔzg */\nvoid Array3()\n{\n\tint a[] = {1, 2, 3, 4};\n\tint b[2][2] = {{1, 2}, {3, 4}};\n\tFunctionWithArrayParam(a);\n\tFunctionWithMultiDimArray(b);\n}\n\nint main()\n{\n\tArray1();\n\t/*\n\tArray2();\n\tArray3();\n\t*/\n\n\treturn 0;\n}\n\n/*\nEK\nRgOƃG[ɂȂ镔̃Rg͂Ă݂ăG[bZ[WmFĂ݂\n\nArray1 ` Array3 ́AꂼʌɎsĂ݂₷B\n1căRgAEgB\n\n\n\nmalloc œIɔzmۂƂɂ͓ɒӁB\n\nz͓ɓȂ̂ŁA\nC++ Ȃ vector  vector Ȃǂg₷ĂB\n */\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/bug/11other.c",
    "content": "/*\n̑XAႢȃ~X\n */\n\n#include<stdio.h>\n\nint * FunctionWithPointerValue(int n)\n{\n\tint a = n * n;\n\treturn &a;\n\t/* \n\t * [Jϐ̃AhXԂĂA\n\t * ֐𔲂_Ń[Jϐ̎sď̂ŁA\n\t * Ғʂ̌ʂ͓ȂB\n\t */\n}\n\ndouble BasicLikeArrayAccess(double *x, int i)\n{\n\treturn x[i - 1];\n\t/* \n\t * BASIC Ȃ񂩂ł́AzCfbNX 1 n܂ėvf N ŏIB\n\t * C ̔z 0 ` N-1B\n\t * \n\t * z̃CfbNXɊւẮAɂȂĂāA\n\t * 1 n߂~XȂĂȂȂƎvǁA\n\t * ̗݂ɁAXABASIC ̃CfbNX̎֐肷̂ŒӁB\n\t */\n}\n\nvoid GetInterval(int *points, int n, int *intervals)\n{\n\tint i;\n\tfor (i = 0; i < n - 1; ++i)\n\t{\n\t\tintervals[i] = points[i + 1] - points[i];\n\t}\n\t/* \n\t * for  i < n - 1 ɒӁB\n\t * n vf̔z̍ n - 1 vfB\n\t */\n}\n\nvoid IncreamentAll(int *array, int n)\n{\n\t//while (--n >= 0) ++*(array++);\n\t/* \n\t * z̑Svf {1 R[hB\n\t * \n\t * 1słȂƂĂāA悳Ɍ邯ǁA\n\t * lƂ̂ƂlāAƌ₷R[hB\n\t * ʓ|łAȉ̂悤ɏ̂𐄏B\n\t * \n\n\tfor (; n >= 0; --n, ++array)\n\t{\n\t\t++(*array);\n\t}\n\n\t * \n\t * ++  -- ̓rŎĝ̓~X̌ɂȂ₷B\n\t * ++a  a++ ̈ႢɂCȂႢȂȂ邵B\n\t */\n}\n\nvoid DoubleLoop()\n{\n\twhile (1) /* O[v */\n\t{\n\t\twhile (1) /* [v */\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\t/* \n\t * iv[vB\n\t * break ł͓[vȂB\n\t * \n\t * d[v break  goto g킴𓾂ȂB\n\t * ܂胋[v[Ƃ̎̃~XȂ̂ŁA\n\t * [v[Ȃ肷悤Ȃ烋[v̒g֐ׂB\n\t */\n}\n\n#include <stdlib.h>\n\nvoid FogetFree()\n{\n#define LARGE_SIZE 1000000\n\n\tint i;\n\tfor (i = 0; i<1000000; ++i)\n\t{\n\t\tint *x = malloc(LARGE_SIZE);\n\n\t\t/*\n\t\tfree(x);\n\t\t */\n\t}\n\t/* \n\t * ArŎsG[ɂȂ邩AOS 肩͂B\n\t * malloc Ŋmۂ́AgI free ŉ@ȂƑʖځB\n\t * \n\t * free(x) ̏̃RgO΂烋[v܂킵ĂȂȂB\n\t */\n}\n\nvoid FogetInitialize()\n{\n\tint x, y, z;\n\tprintf(\"%d, %d, %d\\n\", x, y, z);\n\t/* \n\t * ɒlǂƂƕςȒlĂB\n\t * C ́AŒlĂꂽ͂ȂB\n\t * \n\t * i炿ƏȂtĒu悤ɁB\n\t */\n}\n\nint main()\n{\n\treturn 0;\n}\n\n/*\nEK\nmain ֐e֐ĂяoēmFĂ݂悤B\n\n\n\n̑:\nE ;  :A.  , ȂǁA^Cv~X₷̂Œ\nEscanf(\"%d\", &x) ƏׂƂ scanf(\"%d\",x) ƏĂ܂Ƃ\n */\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/rad/01helloworld.txt",
    "content": "----------------------------------------\nTv\n\nEŋ߂ Windows vO~O͔ɊȒPB\nEGUI tH[肽 Form NXp邾B\nE20sقǂŃvO~OB\nE{^Ȃǂ̔zu Visual Studio Ȃǂ̓JiIDEjŁB\n\nEłP GUI Av̗Cuō쐬B\nE{^烁bZ[W{bNX\\B\n\n----------------------------------------\n菇\n\nEvWFNg쐬\n\tEVisual C#  Windows  Windows AvP[V\n\t\tEOAK\n\t\tEꏊA}CvWFNgi}ChLgj\n\nEtH[̃vpeBݒ\n\tEText: eXgvO\n\tETCYςĂ݂\n\nE{^\\t\n\tEc[{bNX D&D\n\t\tc[{bNX́AʁAɒtĂ͂\n\t\tʒũJX^}CY\\\n\nE{^̃vpeBݒ\n\tEText: \n\nECxgnh̐ݒ\n\tE{^_uNbN\n\nEg̍쐬\n\tMessagebox.Show(\"Hello World\");\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/rad/02viewer.txt",
    "content": "----------------------------------------\nTv\n\nEHello World ͂Av炵AvB\nEj[Ƃ摜gĂ݂B\n\nE摜r[A\n\n----------------------------------------\n菇\n\nEj[ǉ\n\tEc[{bNX  j[ƃc[o[  MenuStrip\n\nEj[ɍڂǉ\n\tt@C\n\t\tJ\n\t\tI\n\nEo̒ǉ\n\tImage img = null;\n\nE[J]̏\n\tE[fUC]̃j[[J]̕_uNbN\n\n\tOpenFileDialog dlg = new OpenFileDialog();\n\tdlg.Filter = \"摜t@C|*.png;*.jpg\";\n\n\tif (dlg.ShowDialog() == DialogResult.OK)\n\t{\n\t\tif (this.img != null)\n\t\t\tthis.img.Dispose();\n\n\t\tthis.img = Image.FromFile(dlg.FileName);\n\t}\n\nE`揈\n\tEtH[NbN\n\tEuvpeBEBhEvŃCxg  [Paint] _uNbN\n\nE[I]\n\tE[fUC]̃j[[I]̕_uNbN\n\n\n\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/rad/03lineart.txt",
    "content": "----------------------------------------\nTv\n\nE^C}[gAj[VƂĂ݂B\nETimer NX\n\tEƍXV\n\nECA[g\n\n----------------------------------------\n菇\n\nEvWFNg쐬\n\tEvWFNg LineArt\n\nEݒEBhE\n\tE[\\[V]ENbN  ǉ  Windows tH[\n\tEO: SettingForm\n\n\tEݒ\n\t\tEShowIcon: false\n\t\tEText: ݒ\n\tERg[zu\n\t\tEȉ̂悤Ȍڂ\n\n\t\t\t_̐   [      ]\n\t\t\t̖{   [      ]\n\t\t\t^C}Ԋu [      ]\n\t\t\t    [OK] [Cancel]\n\n\t\tERg[̖O͏ォ珇\n\t\t\ttextVertex\n\t\t\ttextLines\n\t\t\ttextWeight\n\t\t\tbuttonOk\n\t\t\tbuttonCancel\n\n\tEForm \n\t\tAcceptButton = buttonOk\n\t\tCancelButton = buttonCancel\n\tEOn [OK] Click\n\t\t\tthis.DialogResult = DialogResult.OK;\n\t\t\tthis.Close();\n\tEOn [Cancel] Click\n\t\t\tthis.Close();\n\n\tEݒl̓ǂݏ\n\t\tEȉ̃R[hRsy\n\n\t\tpublic void SetVertexNum(int num){this.textVertex.Text = num.ToString();}\n\t\tpublic void SetLineNum(int num){this.textLines.Text = num.ToString();}\n\t\tpublic void SetWaitTime(int num){this.textWait.Text = num.ToString();}\n\t\tpublic bool GetVertexNum(out int num){return int.TryParse(this.textVertex.Text, out num);}\n\t\tpublic bool GetLineNum(out int num){return int.TryParse(this.textLines.Text, out num);}\n\t\tpublic bool GetWaitTime(out int num){return int.TryParse(this.textWait.Text, out num);}\n\nEForm1 ݒ\n\tEText: Line Art\n\tESize: 640, 480\n\tEBackColor: White\n\tEACRƂݒ肵Ă݂悤\n\t\tEForm1 NbN\n\t\tEvpeBEBh [Icon] Q\n\t\tEresources\\App.ico IB\n\nEoϐƏ֐̒ǉ\n\tEȉ̃R[hRsy\n\n\t\tint vertex = 4;      // 1̑p`̒_\n\t\tint lines = 4;       // Zbg̑p`\\邩\n\t\tint wait_time = 100; // ^C}[Ԋu[ms]\n\n\t\tpublic Point[][] p; // _\n\t\tpublic Size[] v;    // e_̑x\n\n\t\tvoid InitializeObjects()\n\t\t{\n\t\t\tRandom rnd = new Random();\n\n\t\t\tthis.p = new Point[this.lines][];\n\t\t\tthis.p[0] = new Point[this.vertex];\n\t\t\tthis.v = new Size[this.vertex];\n\t\t\tfor (int j = 0; j < this.vertex; ++j)\n\t\t\t{\n\t\t\t\tthis.p[0][j].X = (rnd.Next() >> 3) % this.ClientSize.Width;\n\t\t\t\tthis.p[0][j].Y = (rnd.Next() >> 3) % this.ClientSize.Height;\n\t\t\t\tdouble theta = rnd.NextDouble() * 2 * Math.PI;\n\t\t\t\tdouble r = rnd.NextDouble() * 5 + 2;\n\t\t\t\tthis.v[j].Width = (int)(r * Math.Cos(theta));\n\t\t\t\tthis.v[j].Height = (int)(r * Math.Sin(theta));\n\t\t\t}\n\t\t\tfor (int i = 1; i < this.lines; ++i)\n\t\t\t{\n\t\t\t\tthis.p[i] = new Point[this.vertex];\n\t\t\t\tfor (int j = 0; j < this.vertex; ++j)\n\t\t\t\t{\n\t\t\t\t\tthis.p[i][j] = this.p[i - 1][j];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\nEXV\n\tERsy\n\n\t\tvoid Update(object o, EventArgs e)\n\t\t{\n\t\t\tfor (int j = 0; j < this.vertex; ++j)\n\t\t\t{\n\t\t\t\t//c\n\t\t\t\tfor (int i = this.lines - 1; i > 0; --i)\n\t\t\t\t{\n\t\t\t\t\tthis.p[i][j] = this.p[i - 1][j];\n\t\t\t\t}\n\t\t\t\t//_̈ʒu̍XV\n\t\t\t\tthis.p[0][j] += this.v[j];\n\t\t\t\t//ʂ͂ݏoƂ̏\n\t\t\t\tif (this.p[0][j].X >= this.ClientSize.Width)\n\t\t\t\t{\n\t\t\t\t\tthis.p[0][j].X = this.ClientSize.Width * 2 - this.p[0][j].X;\n\t\t\t\t\tthis.v[j].Width = -this.v[j].Width;\n\t\t\t\t}\n\t\t\t\telse if (this.p[0][j].X < 0)\n\t\t\t\t{\n\t\t\t\t\tthis.p[0][j].X = -this.p[0][j].X;\n\t\t\t\t\tthis.v[j].Width = -this.v[j].Width;\n\t\t\t\t}\n\t\t\t\tif (this.p[0][j].Y >= this.ClientSize.Height)\n\t\t\t\t{\n\t\t\t\t\tthis.p[0][j].Y = this.ClientSize.Height * 2 - this.p[0][j].Y;\n\t\t\t\t\tthis.v[j].Height = -this.v[j].Height;\n\t\t\t\t}\n\t\t\t\telse if (this.p[0][j].Y < 0)\n\t\t\t\t{\n\t\t\t\t\tthis.p[0][j].Y = -this.p[0][j].Y;\n\t\t\t\t\tthis.v[j].Height = -this.v[j].Height;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\nEENbNj[ǉ\n\tEc[{bNX  j[ƃc[o[  ContextMenuStrip\n\tE[ݒ] ǉ\n\tE_uNbNănhǉiȉ̃R[hRsyj\n\n\t\t\tSettingForm dlg = new SettingForm();\n\t\t\tdlg.SetVertexNum(this.vertex);\n\t\t\tdlg.SetLineNum(this.lines);\n\t\t\tdlg.SetWaitTime(this.wait_time);\n\n\t\t\tif (dlg.ShowDialog() == DialogResult.OK)\n\t\t\t{\n\t\t\t\tint x;\n\t\t\t\tif (dlg.GetVertexNum(out x)) this.vertex = x;\n\t\t\t\tif (dlg.GetLineNum(out x)  ) this.lines  = x;\n\t\t\t\tif (dlg.GetWaitTime(out x) ) this.wait_time = x;\n\n\t\t\t\tthis.InitializeObjects();\n\t\t\t}\n\n\tEForm NbNāAvpeB  ContextMenuStrip ݒ\n\nEAj[Vp̃^C}ݒ\n\tEoϐǉ\n\t\tTimer timer;\n\n\tEInitializeObjects ̖Ɂǉ\n\n\t\t\tif (this.timer != null && this.timer.Enabled)\n\t\t\t{\n\t\t\t\tthis.timer.Stop();\n\t\t\t\tthis.timer.Dispose();\n\t\t\t}\n\t\t\tthis.timer = new Timer();\n\t\t\tthis.timer.Interval = this.wait_time;\n\t\t\tthis.timer.Tick += this.Update;\n\t\t\tthis.timer.Start();\n\n\tEUpdate() Ɂǉ\n\t\t\tthis.Invalidate();\n\n\tERXgN^ɂ\n\t\t\tInitializeObjects();\n\nEĕ`揈\n\tEOnPaintBackground I[o[Ch\n\n\t\tprotected override void OnPaintBackground(PaintEventArgs e)\n\t\t{\n\t\t\tBitmap bmp = new Bitmap(this.Width, this.Height);\n\t\t\tGraphics g = Graphics.FromImage(bmp);\n\n\t\t\tg.FillRectangle(new SolidBrush(Color.White), 0, 0, this.Width, this.Height);\n\t\t\tfor (int i = 0; i < this.lines; ++i)\n\t\t\t{\n\t\t\t\tg.DrawPolygon(new Pen(Color.Black), this.p[i]);\n\t\t\t}\n\t\t\te.Graphics.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height);\n\t\t}\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/rad/04wpf.txt",
    "content": "----------------------------------------\nTv\n\nEŋߘb GUI JvbgtH[\n\tEWPF: Windows Presentation Foundation\n\nEWPF ̓\n\tErWAƃWbN̕\n\t\tEoIȕ XML x[X GUI LquXAMLv𗘗p\n\t\tEWbNR[h C# Ȃǂ̃vO~O𗘗p\n\tEʂ GUI\n\t\tE2D / 3D / 𓝍\n\tE_ȃJX^}CY\n\t\tECӂ̌`{^ꂽ\n\t\tEwiɓg\n\n----------------------------------------\nf\n\nEVisual Studio ɂJ\n\tEresources\\XamlApplication\\XamlApplication.sln\n\nELoose XAML\n\tEresources\\LineArt.xaml\n\tEresources\\viewport3d.xaml\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/rad/LineArt.xaml",
    "content": "<Canvas\n\txmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n\txmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n\tWidth=\"640\" Height=\"480\" Background=\"#000000\">\n\n\t<Canvas.Resources>\n\t\t<!-- 色は Style で指定 -->\n\t\t<Style TargetType=\"{x:Type Line}\">\n\t\t\t<Setter Property=\"Stroke\" Value=\"#ff0000\"/>\n\t\t\t<Setter Property=\"StrokeThickness\" Value=\"1\"/>\n\n\t\t\t<Style.Triggers>\n\t\t\t\t<EventTrigger RoutedEvent=\"Polygon.Loaded\">\n\t\t\t\t\t<BeginStoryboard>\n\t\t\t\t\t\t<Storyboard>\n\t\t\t\t\t\t\t<ColorAnimationUsingKeyFrames\n\t\t\t\t\t\t\t\tStoryboard.TargetProperty=\"Stroke.Color\"\n\t\t\t\t\t\t\t\tDuration=\"0:0:12\" RepeatBehavior=\"Forever\">\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#ff0000\" KeyTime=\"0:0:0\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#ff8000\" KeyTime=\"0:0:1\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#ffff00\" KeyTime=\"0:0:2\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#80ff00\" KeyTime=\"0:0:3\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#00ff00\" KeyTime=\"0:0:4\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#00ff80\" KeyTime=\"0:0:5\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#00ffff\" KeyTime=\"0:0:6\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#0080ff\" KeyTime=\"0:0:7\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#0000ff\" KeyTime=\"0:0:8\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#8000ff\" KeyTime=\"0:0:9\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#ff00ff\" KeyTime=\"0:0:10\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#ff0080\" KeyTime=\"0:0:11\" />\n\t\t\t\t\t\t\t\t<LinearColorKeyFrame Value=\"#ff0000\" KeyTime=\"0:0:12\" />\n\t\t\t\t\t\t\t</ColorAnimationUsingKeyFrames>\n\t\t\t\t\t\t</Storyboard>\n\t\t\t\t\t</BeginStoryboard>\n\t\t\t\t</EventTrigger>\n\t\t\t</Style.Triggers>\n\t\t</Style>\n\n\t\t<!-- 四角形の4頂点のアニメーション -->\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniX1\"\n\t\t\tStoryboard.TargetProperty=\"X1\"\n\t\t\tDuration=\"0:0:3.41\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"640\" KeyTime=\"0:0:1.651719\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:3.356719\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:3.410000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniY1\"\n\t\t\tStoryboard.TargetProperty=\"Y1\"\n\t\t\tDuration=\"0:0:2.11\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"480\" KeyTime=\"0:0:1.011042\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:2.066042\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:2.110000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniX2\"\n\t\t\tStoryboard.TargetProperty=\"X2\"\n\t\t\tDuration=\"0:0:3.77\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"320\" KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:0.763544\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"640\" KeyTime=\"0:0:2.290633\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"320\" KeyTime=\"0:0:3.770000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniY2\"\n\t\t\tStoryboard.TargetProperty=\"Y2\"\n\t\t\tDuration=\"0:0:2.99\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"480\" KeyTime=\"0:0:1.432708\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:2.927708\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:2.990000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniX3\"\n\t\t\tStoryboard.TargetProperty=\"X1\"\n\t\t\tDuration=\"0:0:3.95\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"320\" KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:0.987500\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"640\" KeyTime=\"0:0:2.962500\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"320\" KeyTime=\"0:0:3.950000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniY3\"\n\t\t\tStoryboard.TargetProperty=\"Y1\"\n\t\t\tDuration=\"0:0:3.19\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"420\" KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"480\" KeyTime=\"0:0:0.199375\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:1.794375\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"420\" KeyTime=\"0:0:3.190000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniX4\"\n\t\t\tStoryboard.TargetProperty=\"X2\"\n\t\t\tDuration=\"0:0:4.01\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"640\" KeyTime=\"0:0:1.942344\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:3.947344\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"20\"  KeyTime=\"0:0:4.010000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<DoubleAnimationUsingKeyFrames x:Key=\"AniY4\"\n\t\t\tStoryboard.TargetProperty=\"Y2\"\n\t\t\tDuration=\"0:0:3.37\" RepeatBehavior=\"Forever\">\n\t\t\t<LinearDoubleKeyFrame Value=\"420\" KeyTime=\"0:0:0\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"480\" KeyTime=\"0:0:0.210625\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"0\"   KeyTime=\"0:0:1.895625\" />\n\t\t\t<LinearDoubleKeyFrame Value=\"420\" KeyTime=\"0:0:3.370000\" />\n\t\t</DoubleAnimationUsingKeyFrames>\n\n\t\t<!-- BeginTime をちょっとづつずらした StoryBoard を何組か作ろう -->\n\n\t\t<!-- 1組目 -->\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L11\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L12\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L13\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L14\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<!-- 2組目 -->\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L21\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.05\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L22\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.05\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L23\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.05\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L24\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.05\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<!-- 3組目 -->\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L31\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.1\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L32\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.1\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L33\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.1\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L34\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.1\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<!-- 4組目 -->\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L41\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.15\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L42\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.15\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX2\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY2\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L43\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.15\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY3\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t\t<EventTrigger RoutedEvent=\"Line.Loaded\" x:Key=\"L44\">\n\t\t\t<BeginStoryboard>\n\t\t\t\t<Storyboard BeginTime=\"0:0:0.15\">\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY1\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniX4\"/>\n\t\t\t\t\t<StaticResource ResourceKey=\"AniY4\"/>\n\t\t\t\t</Storyboard>\n\t\t\t</BeginStoryboard>\n\t\t</EventTrigger>\n\n\t</Canvas.Resources>\n\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L11\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L12\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L13\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L14\"/></Line.Triggers></Line>\n\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L21\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L22\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L23\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L24\"/></Line.Triggers></Line>\n\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L31\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L32\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L33\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L34\"/></Line.Triggers></Line>\n\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L41\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L42\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L43\"/></Line.Triggers></Line>\n\t<Line><Line.Triggers><StaticResource ResourceKey=\"L44\"/></Line.Triggers></Line>\n\n</Canvas>\n"
  },
  {
    "path": "Chapters/ufcpp2000/miscprog/training/rad/viewport3d.xaml",
    "content": "﻿<Page\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    Background=\"Black\"\n    >\n\t<Page.Resources>\n\t\t<MeshGeometry3D x:Key=\"CubeMesh\"\n\t\t\tPositions=\"0.1 0 0  0 0.1 0  -0.1 0 0  0 -0.1 0  0 0 0.1  0 0 -0.1\"\n\t\t\tTriangleIndices=\"0 1 4  1 2 4  2 3 4  3 0 4  0 5 1  1 5 2  2 5 3  3 5 0\"\n\t\t\t/>\n\n\t\t<DiffuseMaterial x:Key=\"WhiteMaterial\">\n\t\t\t<DiffuseMaterial.Brush>\n\t\t\t\t<SolidColorBrush Color=\"White\"/>\n\t\t\t</DiffuseMaterial.Brush>\n\t\t</DiffuseMaterial>\n\t</Page.Resources>\n\n\t<Viewport3D Name=\"viewport\" ClipToBounds=\"True\" Width=\"450\" Height=\"450\" Canvas.Left=\"0\" Canvas.Top=\"10\">\n\t\t<Viewport3D.Triggers>\n\t\t\t<EventTrigger RoutedEvent=\"Viewport3D.Loaded\">\n\t\t\t\t<BeginStoryboard>\n\t\t\t\t\t<Storyboard>\n\t\t\t\t\t\t<DoubleAnimation\n\t\t\t\t\t\t\tStoryboard.TargetName=\"cameraRot\" \n\t\t\t\t\t\t\tStoryboard.TargetProperty=\"Angle\"\n\t\t\t\t\t\t\tFrom=\"0\" To=\"360\" Duration=\"0:0:10\" \n\t\t\t\t\t\t\tAutoReverse=\"False\" RepeatBehavior=\"Forever\" />\n\t\t\t\t\t</Storyboard>\n\t\t\t\t</BeginStoryboard>\n\t\t\t</EventTrigger>\n\t\t</Viewport3D.Triggers>\n\n\t\t<!-- Defines the camera used to view the 3D object. -->\n\t\t<Viewport3D.Camera>\n\t\t\t<PerspectiveCamera Position=\"0,0,3\" LookDirection=\"0,0,-1\" FieldOfView=\"35\">\n\t\t\t\t<PerspectiveCamera.Transform>\n\t\t\t\t\t<RotateTransform3D>\n\t\t\t\t\t\t<RotateTransform3D.Rotation>\n\t\t\t\t\t\t\t<AxisAngleRotation3D x:Name=\"cameraRot\" Axis=\"0,1,0\" Angle=\"0\" />\n\t\t\t\t\t\t</RotateTransform3D.Rotation>\n\t\t\t\t\t</RotateTransform3D>\n\t\t\t\t</PerspectiveCamera.Transform>\n\t\t\t</PerspectiveCamera>\n\t\t\t<!--\n\t\t\t<OrthographicCamera Position=\"0, 0, 15\" LookDirection=\"0,0,-1\">\n\t\t\t\t<OrthographicCamera.Transform>\n\t\t\t\t\t<RotateTransform3D>\n\t\t\t\t\t\t<RotateTransform3D.Rotation>\n\t\t\t\t\t\t\t<AxisAngleRotation3D x:Name=\"cameraRot\" Axis=\"0,1,0\" Angle=\"0\" />\n\t\t\t\t\t\t</RotateTransform3D.Rotation>\n\t\t\t\t\t</RotateTransform3D>\n\t\t\t\t</OrthographicCamera.Transform>\n\t\t\t</OrthographicCamera>\n\t\t\t-->\n\t\t</Viewport3D.Camera>\n\n\n\t\t<!-- The ModelVisual3D children contain the 3D models -->\n\t\t<Viewport3D.Children>\n\n\t\t\t<!-- 光源 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<PointLight Color=\"#ffffff\" Position=\"0 0 0\"\n\t\t\t\t\t\tQuadraticAttenuation=\"0\"\n\t\t\t\t\t\tLinearAttenuation=\"0\"\n\t\t\t\t\t\t/>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<AmbientLight Color=\"#333333\" />\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<DirectionalLight Color=\"#330000\" Direction=\"0,0,-1\" />\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<DirectionalLight Color=\"#000033\" Direction=\"0,0,1\" />\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t\t<!-- 物体1 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<GeometryModel3D\n\t\t\t\t\t\tGeometry=\"{StaticResource CubeMesh}\"\n\t\t\t\t\t\tMaterial=\"{StaticResource WhiteMaterial}\">\n\t\t\t\t\t\t<GeometryModel3D.Transform>\n\t\t\t\t\t\t\t<TranslateTransform3D OffsetX=\"0.8\" />\n\t\t\t\t\t\t</GeometryModel3D.Transform>\n\t\t\t\t\t</GeometryModel3D>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t\t<!-- 物体2 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<GeometryModel3D\n\t\t\t\t\t\tGeometry=\"{StaticResource CubeMesh}\"\n\t\t\t\t\t\tMaterial=\"{StaticResource WhiteMaterial}\">\n\t\t\t\t\t\t<GeometryModel3D.Transform>\n\t\t\t\t\t\t\t<TranslateTransform3D OffsetY=\"0.8\" />\n\t\t\t\t\t\t</GeometryModel3D.Transform>\n\t\t\t\t\t</GeometryModel3D>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t\t<!-- 物体3 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<GeometryModel3D\n\t\t\t\t\t\tGeometry=\"{StaticResource CubeMesh}\"\n\t\t\t\t\t\tMaterial=\"{StaticResource WhiteMaterial}\">\n\t\t\t\t\t\t<GeometryModel3D.Transform>\n\t\t\t\t\t\t\t<TranslateTransform3D OffsetZ=\"0.8\" />\n\t\t\t\t\t\t</GeometryModel3D.Transform>\n\t\t\t\t\t</GeometryModel3D>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t\t<!-- 物体4 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<GeometryModel3D\n\t\t\t\t\t\tGeometry=\"{StaticResource CubeMesh}\"\n\t\t\t\t\t\tMaterial=\"{StaticResource WhiteMaterial}\">\n\t\t\t\t\t\t<GeometryModel3D.Transform>\n\t\t\t\t\t\t\t<TranslateTransform3D OffsetX=\"-0.8\" />\n\t\t\t\t\t\t</GeometryModel3D.Transform>\n\t\t\t\t\t</GeometryModel3D>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t\t<!-- 物体5 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<GeometryModel3D\n\t\t\t\t\t\tGeometry=\"{StaticResource CubeMesh}\"\n\t\t\t\t\t\tMaterial=\"{StaticResource WhiteMaterial}\">\n\t\t\t\t\t\t<GeometryModel3D.Transform>\n\t\t\t\t\t\t\t<TranslateTransform3D OffsetY=\"-0.8\" />\n\t\t\t\t\t\t</GeometryModel3D.Transform>\n\t\t\t\t\t</GeometryModel3D>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t\t<!-- 物体6 -->\n\t\t\t<ModelVisual3D>\n\t\t\t\t<ModelVisual3D.Content>\n\t\t\t\t\t<GeometryModel3D\n\t\t\t\t\t\tGeometry=\"{StaticResource CubeMesh}\"\n\t\t\t\t\t\tMaterial=\"{StaticResource WhiteMaterial}\">\n\t\t\t\t\t\t<GeometryModel3D.Transform>\n\t\t\t\t\t\t\t<TranslateTransform3D OffsetZ=\"-0.8\" />\n\t\t\t\t\t\t</GeometryModel3D.Transform>\n\t\t\t\t\t</GeometryModel3D>\n\t\t\t\t</ModelVisual3D.Content>\n\t\t\t</ModelVisual3D>\n\n\t\t</Viewport3D.Children>\n\t</Viewport3D>\n</Page>\n"
  },
  {
    "path": "Chapters/ufcpp2000/physics/surface.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApplication1\n{\n  /// <summary>\n  /// 相空間（位置＋運動量）上のベクトル。\n  /// </summary>\n  /// <remarks>\n  /// 曲面上の運動のシミュレーション用なので、2次元。\n  /// 4次のルンゲクッタ法を使った数値計算関数付き。\n  /// </remarks>\n  public class PhaseVector\n  {\n    public double q1;\n    public double q2;\n    public double p1;\n    public double p2;\n\n    public PhaseVector(double q1, double q2, double p1, double p2)\n    {\n      this.q1 = q1;\n      this.q2 = q2;\n      this.p1 = p1;\n      this.p2 = p2;\n    }\n\n    public static PhaseVector operator +(PhaseVector x, PhaseVector y)\n    {\n      return new PhaseVector(\n               x.q1 + y.q1, x.q2 + y.q2,\n               x.p1 + y.p1, x.p2 + y.p2);\n    }\n\n    public static PhaseVector operator /(PhaseVector x, double a)\n    {\n      return new PhaseVector(\n               x.q1 / a, x.q2 / a,\n               x.p1 / a, x.p2 / a);\n    }\n\n    public static PhaseVector operator *(double a, PhaseVector x)\n    {\n      return new PhaseVector(\n               a * x.q1, a * x.q2,\n               a * x.p1, a * x.p2);\n    }\n\n    public delegate void Callback(double t, PhaseVector x);\n    public delegate PhaseVector PhaseFunc(PhaseVector x);\n\n    /// <summary>\n    /// 微分方程式\n    /// (d/dt)q = f(q)\n    /// の解を数値計算で求める。\n    /// </summary>\n    /// <param name=\"t0\">時刻の初期値</param>\n    /// <param name=\"t1\">時刻の最終値</param>\n    /// <param name=\"dt\">時刻の刻み幅</param>\n    /// <param name=\"display_interval\">結果出力の間隔</param>\n    /// <param name=\"initial\">q の初期値</param>\n    /// <param name=\"f\">f</param>\n    /// <param name=\"cb\">結果出力用のコールバック関数</param>\n    /// <remarks>\n    /// 4次のルンゲクッタ法で計算。\n    /// </remarks>\n    public static void Simulate(\n      double t0, double t1, double dt, int display_interval,\n      PhaseVector initial,\n      PhaseFunc f, Callback cb)\n    {\n      PhaseVector q = initial;\n\n      int n = 1;\n      for (double t = t0; t < t1; t += dt, ++n)\n      {\n        PhaseVector k1 = dt * f(q);\n        PhaseVector k2 = dt * f(q + k1 / 2);\n        PhaseVector k3 = dt * f(q + k2 / 2);\n        PhaseVector k4 = dt * f(q + k3);\n        q = q + (k1 + 2 * (k2 + k3) + k4) / 6;\n\n        if (n > display_interval)\n        {\n          cb(t, q);\n          n = 1;\n        }\n      }\n    }\n  }\n\n  /// <summary>\n  /// サンプルプログラム。\n  /// 球面上の運動をシミュレーション。\n  /// </summary>\n  class Program\n  {\n    static void Main(string[] args)\n    {\n      const double dt = 0.01;\n      const double t_end = 10;\n      const int DISPLAY_INTERVAL = 5;\n\n      const double q1 = 0;\n      const double q2 = Math.PI / 2;\n      const double p1 = 0.1;\n      const double p2 = 0;\n\n      PhaseVector.Simulate(\n        0, t_end, dt, DISPLAY_INTERVAL,\n        new PhaseVector(q1, q2, p1, p2),\n        F, Show\n        );\n    }\n\n    static PhaseVector F(PhaseVector q)\n    {\n      const double M = 0.1;\n      const double G = 10;\n\n      double s2 = Math.Sin(q.q2);\n      double c2 = Math.Cos(q.q2);\n\n      return new PhaseVector(\n        q.p1 / (M * s2),\n        q.p2 / M,\n        0,\n        (q.p1 * q.p1 * c2)\n          / (M * s2 * s2 * s2)\n         - M * G * s2\n       );\n    }\n\n    static void Show(double t, PhaseVector q)\n    {\n      double y = Math.Sin(q.q2);\n      double x = Math.Cos(q.q1) * y;\n      y = Math.Sin(q.q1) * y;\n      double z = -Math.Cos(q.q2);\n\n      Console.Write(\"{0},{1},{2},{3}\\n\",\n        t, x, y, z);\n    }\n  }\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/physics/todo.txt",
    "content": "Î̂ƂɃrITo[̖@ǉƂ\n\nCH\npermeance ZČӖB\nreluctance(CR) CȂƁACAssAs{\n\n\nN : magnetomotive force\n\n\n    oɎq\n        electric dipole\n        magnetic dipole\n        set of electric poles\n        set of magnetic poles\n\n\n    \n        polarization\n\n\n    \n        magnetization\n\ndg\n\ndGlM[(dɒ~GlM[Ƃʂɉ)\n\nf\n"
  },
  {
    "path": "Chapters/ufcpp2000/powershell/source/ZipLib.ps1",
    "content": "# usage:\n# New-Zip sample.zip\n\nfunction New-Zip\n{\n\tparam([string]$zipfilename)\n\tset-content $zipfilename (\"PK\" + [char]5 + [char]6 + (\"$([char]0)\" * 18))\n\t(dir $zipfilename).IsReadOnly = $false\n}\n\n# usage:\n# ls sample/* | Add-Zip sample.zip\n\nfunction Add-Zip\n{\n\tparam([string]$zipfilename)\n\n\t# convert to full path\n\t$zipfilename = ls $zipfilename | %{$_.FullName}\n\n\tif(-not (test-path($zipfilename)))\n\t{\n\t\tset-content $zipfilename (\"PK\" + [char]5 + [char]6 + (\"$([char]0)\" * 18))\n\t\t(dir $zipfilename).IsReadOnly = $false\t\n\t}\n\t\n\t$shellApplication = new-object -com shell.application\n\t$zipPackage = $shellApplication.NameSpace($zipfilename)\n\n\tforeach($file in $input) \n\t{ \n            $zipPackage.CopyHere($file.FullName)\n            Start-sleep -milliseconds 500\n\t}\n}\n\nfunction Get-Zip\n{\n\tparam([string]$zipfilename)\n\n\t# convert to full path\n\t$zipfilename = ls $zipfilename | %{$_.FullName}\n\n\tif(test-path($zipfilename))\n\t{\n\t\t$shellApplication = new-object -com shell.application\n\t\t$zipPackage = $shellApplication.NameSpace($zipfilename)\n\t\t$zipPackage.Items() | Select Path\n\t}\n}\n\nfunction Extract-Zip\n{\n\tparam([string]$zipfilename, [string] $destination)\n\n\t# convert to full path\n\t$zipfilename = ls $zipfilename | %{$_.FullName}\n\n\tif(test-path($zipfilename))\n\t{\t\n\t\t$shellApplication = new-object -com shell.application\n\t\t$zipPackage = $shellApplication.NameSpace($zipfilename)\n\t\t$destinationFolder = $shellApplication.NameSpace($destination)\n\t\t$destinationFolder.CopyHere($zipPackage.Items())\n\t}\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/powershell/source/ZipVsProjects.ps1",
    "content": "param([string]$path)\n\n. .\\ZipLib.ps1\n\n# e|t@C\n$name = [IO.Path]::GetFileName($path)\n$fullname = [IO.Path]::GetFileName($path)\n$tempPath = [IO.Path]::GetTempPath()\n\n# Rs[svt@C̍폜\ncp $fullname $tempPath -Recurse -Force\n\nPush-Location $tempPath\n\nrm ($name + '\\*.suo') -Force\nrm ($name + '\\*\\obj') -Recurse -Force\nrm ($name + '\\*\\bin') -Recurse -Force\n\n# ZIP 쐬\n$tempZip = [IO.Path]::GetTempFileName()\nmv $tempZip ($tempZip + '.zip')\n$tempZip = ($tempZip + '.zip')\n\nNew-Zip $tempZip\n\nls $name | Add-Zip $tempZip\n\n# ꎞt@C\nrm $name -Recurse -Force\n\n#  ZIP ̃Rs[\nPop-Location\nmv $tempZip ('.\\' + $name + '.zip') -Force\n"
  },
  {
    "path": "Chapters/ufcpp2000/sp/src/Amplifier.cs",
    "content": "﻿/// <summary>\n/// 増幅器。\n/// </summary>\npublic class Amplifier : IFilter\n{\n\t#region フィールド\n\n\tdouble amp; // 倍率\n\n\t#endregion\n\t#region コンストラクタ\n\n\tpublic Amplifier() : this(0) { }\n\n\t/// <summary>\n\t/// 倍率を指定して初期化\n\t/// </summary>\n\t/// <param name=\"amp\">倍率</param>\n\tpublic Amplifier(double amp)\n\t{\n\t\tthis.amp = amp;\n\t}\n\n\t#endregion\n\t#region プロパティ\n\n\t/// <summary>\n\t/// 倍率\n\t/// </summary>\n\tpublic double Amplitude\n\t{\n\t\tget { return this.amp; }\n\t\tset { this.amp = value; }\n\t}\n\n\t#endregion\n\t#region IFilter メンバ\n\n\tpublic double GetValue(double x)\n\t{\n\t\treturn this.amp * x;\n\t}\n\n\tpublic void Clear()\n\t{\n\t}\n\n\t#endregion\n\t#region ICloneable メンバ\n\n\tpublic object Clone()\n\t{\n\t\treturn new Amplifier(this.amp);\n\t}\n\n\t#endregion\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/sp/src/CircularBuffer1.cs",
    "content": "﻿public class CircularBuffer : ICloneable\n{\n\t#region フィールド\n\n\tdouble[] buf;\n\n\t#endregion\n\t#region コンストラクタ\n\n\tpublic CircularBuffer() : this(0) { }\n\n\t/// <summary>\n\t/// バッファ長を指定して初期化\n\t/// </summary>\n\t/// <param name=\"len\">バッファ長</param>\n\tpublic CircularBuffer(int len)\n\t{\n\t\tthis.buf = new double[len];\n\t}\n\n\t#endregion\n\t#region 値の挿入・取得\n\n\t/// <summary>\n\t/// n サンプル前の値の取得\n\t/// </summary>\n\t/// <param name=\"n\">何サンプル前の値を読み書きするか</param>\n\t/// <returns>n サンプル前の値</returns>\n\tpublic double this[int n]\n\t{\n\t\tget { return this.buf[n]; }\n\t\tset { this.buf[n] = value; }\n\t}\n\n\t/// <summary>\n\t/// 値の挿入\n\t/// </summary>\n\t/// <param name=\"x\">挿入したい値</param>\n\tpublic void Insert(double x)\n\t{\n\t\tfor (int n = this.buf.Length - 1; n > 0; --n)\n\t\t{\n\t\t\tthis.buf[n] = this.buf[n - 1];\n\t\t}\n\t\tthis.buf[0] = x;\n\t}\n\n\t/// <summary>\n\t/// 要素数\n\t/// </summary>\n\tpublic int Count\n\t{\n\t\tget { return this.buf.Length; }\n\t}\n\n\t#endregion\n\t#region ICloneable メンバ\n\n\tpublic object Clone()\n\t{\n\t\tCircularBuffer cb = new CircularBuffer(this.Count);\n\t\tcb.buf = (double[])this.buf.Clone();\n\t\treturn cb;\n\t}\n\n\t#endregion\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/sp/src/CircularBuffer2.cs",
    "content": "﻿public class CircularBuffer : ICloneable\n{\n\t#region フィールド\n\n\tdouble[] buf;\n\tint top;\n\n\t#endregion\n\t#region コンストラクタ\n\n\tpublic CircularBuffer() : this(0) { }\n\n\t/// <summary>\n\t/// バッファ長を指定して初期化\n\t/// </summary>\n\t/// <param name=\"len\">バッファ長</param>\n\tpublic CircularBuffer(int len)\n\t{\n\t\tthis.top = 0;\n\t\tthis.buf = new double[len];\n\t}\n\n\t#endregion\n\t#region 値の挿入・取得\n\n\t/// <summary>\n\t/// n サンプル前の値の取得\n\t/// </summary>\n\t/// <param name=\"n\">何サンプル前の値を読み書きするか</param>\n\t/// <returns>n サンプル前の値</returns>\n\tpublic double this[int n]\n\t{\n\t\tget { return this.buf[(n + this.top) % this.buf.Length]; }\n\t\tset { this.buf[(n + this.top) % this.buf.Length] = value; }\n\t}\n\n\t/// <summary>\n\t/// 値の挿入\n\t/// </summary>\n\t/// <param name=\"x\">挿入したい値</param>\n\tpublic void Insert(double x)\n\t{\n\t\t--this.top;\n\t\tif (this.top < 0) this.top += this.buf.Length;\n\t\tthis.buf[this.top] = x;\n\t}\n\n\t/// <summary>\n\t/// 要素数\n\t/// </summary>\n\tpublic int Count\n\t{\n\t\tget { return this.buf.Length; }\n\t}\n\n\t#endregion\n\t#region ICloneable メンバ\n\n\tpublic object Clone()\n\t{\n\t\tCircularBuffer cb = new CircularBuffer(this.Count);\n\t\tcb.buf = (double[])this.buf.Clone();\n\t\tcb.top = this.top;\n\t\treturn cb;\n\t}\n\n\t#endregion\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/sp/src/CircularBuffer3.cs",
    "content": "﻿public class CircularBuffer : ICloneable\n{\n\t#region フィールド\n\n\tdouble[] buf;\n\tint length;\n\tint top;\n\tint mask;\n\n\t#endregion\n\t#region コンストラクタ\n\n\tpublic CircularBuffer() : this(0) { }\n\n\t/// <summary>\n\t/// バッファ長を指定して初期化\n\t/// </summary>\n\t/// <param name=\"len\">バッファ長</param>\n\tpublic CircularBuffer(int len)\n\t{\n\t\tthis.top = 0;\n\t\tthis.length = len;\n\n\t\tlen = Util.CeilPower2(len);\n\t\tthis.buf = new double[len];\n\t\tthis.mask = len - 1;\n\t}\n\n\t#endregion\n\t#region 値の挿入・取得\n\n\t/// <summary>\n\t/// n サンプル前の値の取得\n\t/// </summary>\n\t/// <param name=\"n\">何サンプル前の値を読み書きするか</param>\n\t/// <returns>n サンプル前の値</returns>\n\tpublic double this[int n]\n\t{\n\t\tget { return this.buf[(this.top + n) & this.mask]; }\n\t\tset { this.buf[(this.top + n) & this.mask] = value; }\n\t}\n\n\t/// <summary>\n\t/// 値の挿入\n\t/// </summary>\n\t/// <param name=\"x\">挿入したい値</param>\n\tpublic void Insert(double x)\n\t{\n\t\t--this.top;\n\t\tthis.top &= this.mask;\n\t\tthis.buf[this.top] = x;\n\t}\n\n\t/// <summary>\n\t/// 要素数\n\t/// </summary>\n\tpublic int Count\n\t{\n\t\tget { return this.length; }\n\t}\n\n\t#endregion\n\t#region ICloneable メンバ\n\n\tpublic object Clone()\n\t{\n\t\tCircularBuffer cb = new CircularBuffer(this.length);\n\t\tcb.buf = (double[])this.buf.Clone();\n\t\tcb.top = this.top;\n\t\tcb.length = this.length;\n\t\tcb.mask = this.mask;\n\t\treturn cb;\n\t}\n\n\t#endregion\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/sp/src/Delay.cs",
    "content": "﻿/// <summary>\n/// 遅延器。\n/// </summary>\npublic class Delay : IFilter\n{\n\t#region フィールド\n\n\tCircularBuffer buf;\n\n\t#endregion\n\t#region コンストラクタ\n\n\tpublic Delay() : this(1) { }\n\n\t/// <summary>\n\t/// 倍率を指定して初期化\n\t/// </summary>\n\t/// <param name=\"delaytime\">遅延時間[sample数]</param>\n\tpublic Delay(int delaytime)\n\t{\n\t\tthis.buf = new CircularBuffer(delaytime);\n\t}\n\n\t#endregion\n\t#region IFilter メンバ\n\n\tpublic double GetValue(double x)\n\t{\n\t\tdouble y = this.buf[this.buf.Count - 1];\n\t\tthis.buf.Insert(x);\n\t\treturn y;\n\t}\n\n\tpublic void Clear()\n\t{\n\t\tfor (int n = this.buf.Count; n > 0; --n)\n\t\t\tthis.buf.Insert(0);\n\t}\n\n\t#endregion\n\t#region ICloneable メンバ\n\n\tpublic object Clone()\n\t{\n\t\tDelay d = new Delay(this.buf.Count);\n\t\tfor (int i = 0; i < this.buf.Count; ++i)\n\t\t{\n\t\t\td.GetValue(this.buf[i]);\n\t\t}\n\t\treturn d;\n\t}\n\n\t#endregion\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/sp/src/FirFilter.cs",
    "content": "﻿/// <summary>\n/// FIR フィルタ。\n/// </summary>\npublic class FirFilter : IFilter\n{\n\t#region フィールド\n\n\tCircularBuffer buf;\n\tdouble[] a;\n\n\t#endregion\n\t#region コンストラクタ\n\n\tpublic FirFilter() : this(0) { }\n\n\t/// <summary>\n\t/// 係数を指定して初期化\n\t/// </summary>\n\t/// <param name=\"a0\">係数 a0</param>\n\tpublic FirFilter(double a0)\n\t\t: this(new double[] { a0 })\n\t{\n\t}\n\n\t/// <summary>\n\t/// 係数を配列で指定して初期化\n\t/// </summary>\n\t/// <param name=\"a\">係数を格納した配列</param>\n\tpublic FirFilter(params double[] a)\n\t{\n\t\tthis.a = a;\n\t\tthis.buf = new CircularBuffer(a.Length - 1);\n\t}\n\n\t#endregion\n\t#region IFilter メンバ\n\n\t/// <summary>\n\t/// 各時刻 n で、\n\t/// y[n] = Σ a[i] * x[n - i]\n\t/// </summary>\n\t/// <param name=\"x\">入力</param>\n\t/// <returns>フィルタ出力</returns>\n\tpublic double GetValue(double x)\n\t{\n\t\tdouble y = x * this.a[0];\n\n\t\tfor (int i = 0; i < this.buf.Count; ++i)\n\t\t{\n\t\t\ty += this.buf[i] * this.a[i + 1];\n\t\t}\n\n\t\tthis.buf.Insert(x);\n\t\treturn y;\n\t}\n\n\tpublic void Clear()\n\t{\n\t\tfor (int n = this.buf.Count; n > 0; --n)\n\t\t\tthis.buf.Insert(0);\n\t}\n\n\t#endregion\n\t#region ICloneable メンバ\n\n\tpublic object Clone()\n\t{\n\t\tFirFilter f = new FirFilter(this.a);\n\t\tfor (int i = 0; i < this.buf.Count; ++i)\n\t\t{\n\t\t\tf.GetValue(this.buf[i]);\n\t\t}\n\t\treturn f;\n\t}\n\n\t#endregion\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/sp/src/IFilter.cs",
    "content": "﻿/// <summary>\n/// 音声処理用フィルタインターフェース。\n/// </summary>\npublic interface IFilter : ICloneable\n{\n\t/// <summary>\n\t/// フィルタリングを行い、その結果を返す。\n\t/// </summary>\n\t/// <param name=\"x\">フィルタ入力。</param>\n\t/// <returns>フィルタ出力。</returns>\n\tdouble GetValue(double x);\n\n\t/// <summary>\n\t/// フィルタの内部状態をクリアする。\n\t/// </summary>\n\tvoid Clear();\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/sp/src/IirFilter.cs",
    "content": "﻿/// <summary>\n/// FIR フィルタ。\n/// </summary>\npublic class IirFilter : IFilter\n{\n\t#region フィールド\n\n\tCircularBuffer buf;\n\tdouble c;\n\tdouble[] a; // 分母係数\n\tdouble[] b; // 分子係数\n\n\t#endregion\n\t#region コンストラクタ\n\n\tpublic IirFilter() : this(0, 0, 0) { }\n\n\t/// <summary>\n\t/// 係数を指定して初期化\n\t/// </summary>\n\t/// <param name=\"a0\">分母係数 a0</param>\n\t/// <param name=\"b0\">分母係数 b0</param>\n\t/// <param name=\"c\">ゲイン</param>\n\tpublic IirFilter(double a0, double b0, double c)\n\t\t: this(\n\t\tnew double[] { a0 },\n\t\tnew double[] { b0 },\n\t\tc)\n\t{\n\t}\n\n\t/// <summary>\n\t/// 係数を配列で指定して初期化\n\t/// </summary>\n\t/// <param name=\"a\">分母係数を格納した配列</param>\n\t/// <param name=\"b\">分子係数を格納した配列</param>\n\t/// <param name=\"c\">ゲイン</param>\n\tpublic IirFilter(double[] a, double[] b, double c)\n\t{\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\t\tthis.buf = new CircularBuffer(a.Length);\n\t}\n\n\t#endregion\n\t#region IFilter メンバ\n\n\t/// <summary>\n\t/// 各時刻 n で、\n\t/// t[n] = c * x[n] + Σ a[i - 1] * t[n - i]\n\t/// y[n] =     t[n] + Σ b[i - 1] * t[n - i]\n\t/// </summary>\n\t/// <param name=\"x\">入力</param>\n\t/// <returns>フィルタ出力</returns>\n\tpublic double GetValue(double x)\n\t{\n\t\tdouble t = this.c * x;\n\t\tdouble y = 0;\n\n\t\tfor (int i = 0; i < this.buf.Count; ++i)\n\t\t{\n\t\t\tt += this.buf[i] * this.a[i];\n\t\t\ty += this.buf[i] * this.b[i];\n\t\t}\n\n\t\ty += t;\n\t\tthis.buf.Insert(t);\n\t\treturn y;\n\t}\n\n\tpublic void Clear()\n\t{\n\t\tfor (int n = this.buf.Count; n > 0; --n)\n\t\t\tthis.buf.Insert(0);\n\t}\n\n\t#endregion\n\t#region ICloneable メンバ\n\n\tpublic object Clone()\n\t{\n\t\tIirFilter f = new IirFilter(this.a, this.b, this.c);\n\t\tfor (int i = 0; i < this.buf.Count; ++i)\n\t\t{\n\t\t\tf.GetValue(this.buf[i]);\n\t\t}\n\t\treturn f;\n\t}\n\n\t#endregion\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/sp/src/SerialIirFilter.cs",
    "content": "﻿public class BiquadCoefficient\n{\n\tpublic double a0;\n\tpublic double a1;\n\tpublic double a2;\n\tpublic double b0;\n\tpublic double b1;\n\tpublic double b2;\n\n\tpublic BiquadCoefficient(\n\t\tdouble a0, double a1, double a2,\n\t\tdouble b0, double b1, double b2)\n\t{\n\t\tthis.a0 = a0;\n\t\tthis.a1 = a1;\n\t\tthis.a2 = a2;\n\t\tthis.b0 = b0;\n\t\tthis.b1 = b1;\n\t\tthis.b2 = b2;\n\t}\n}\n\n/// <summary>\n/// 2次ずつに分解し、直列接続したタイプの IIR フィルタ。\n/// </summary>\npublic class SerialIirFilter : IFilter\n{\n\t#region 内部クラス\n\n\t/// <summary>\n\t/// 2次 IIR（ゲインなし）。\n\t/// </summary>\n\tclass Iir2 : System.ICloneable\n\t{\n\t\tdouble a1, a2, b1, b2;\n\t\tdouble t1, t2;\n\n\t\tpublic Iir2(\n\t\t\tdouble a1, double a2, double b1, double b2)\n\t\t{\n\t\t\tthis.a1 = a1;\n\t\t\tthis.a2 = a2;\n\t\t\tthis.b1 = b1;\n\t\t\tthis.b2 = b2;\n\t\t}\n\n\t\tpublic double GetValue(double x)\n\t\t{\n\t\t\tx += this.a1 * this.t1;\n\t\t\tdouble y = this.b1 * this.t1;\n\t\t\tx += this.a2 * this.t2;\n\t\t\ty += this.b2 * this.t2;\n\t\t\ty += x;\n\t\t\tthis.t2 = this.t1;\n\t\t\tthis.t1 = x;\n\t\t\treturn y;\n\t\t}\n\n\t\tpublic void Clear()\n\t\t{\n\t\t\tthis.t1 = this.t2 = 0;\n\t\t}\n\n\t\t#region ICloneable メンバ\n\n\t\tpublic object Clone()\n\t\t{\n\t\t\tIir2 f = new Iir2(this.a1, this.a2, this.b1, this.b2);\n\t\t\tf.t1 = this.t1;\n\t\t\tf.t2 = this.t2;\n\t\t\treturn f;\n\t\t}\n\n\t\t#endregion\n\t}\n\n\t#endregion\n\t#region フィールド\n\n\tdouble c;\n\tIir2[] filters;\n\n\t#endregion\n\t#region コンストラクタ\n\n\tpublic SerialIirFilter(params BiquadCoefficient[] coefs)\n\t{\n\t\tthis.filters = new Iir2[coefs.Length];\n\t\tthis.c = 1;\n\n\t\tfor (int i = 0; i < coefs.Length; ++i)\n\t\t{\n\t\t\tBiquadCoefficient coef = coefs[i];\n\t\t\tthis.c *= coef.b0 / coef.a0;\n\t\t\tthis.filters[i] = new Iir2(\n\t\t\t\t-coef.a1 / coef.a0, -coef.a2 / coef.a0,\n\t\t\t\tcoef.b1 / coef.b0, coef.b2 / coef.b0);\n\t\t}\n\t}\n\n\tSerialIirFilter(Iir2[] filters)\n\t{\n\t}\n\n\t#endregion\n\t#region IFilter メンバ\n\n\t/// <summary>\n\t/// 各時刻 n で、\n\t/// t[n] = c * x[n] + Σ a[i - 1] * t[n - i]\n\t/// y[n] =     t[n] + Σ b[i - 1] * t[n - i]\n\t/// </summary>\n\t/// <param name=\"x\">入力</param>\n\t/// <returns>フィルタ出力</returns>\n\tpublic double GetValue(double x)\n\t{\n\t\tdouble y = x;\n\n\t\tfor (int i = 0; i < this.filters.Length; ++i)\n\t\t{\n\t\t\ty = this.filters[i].GetValue(y);\n\t\t}\n\n\t\treturn y;\n\t}\n\n\tpublic void Clear()\n\t{\n\t\tfor (int i = 0; i < this.filters.Length; ++i)\n\t\t{\n\t\t\tthis.filters[i].Clear();\n\t\t}\n\t}\n\n\t#endregion\n\t#region ICloneable メンバ\n\n\tpublic object Clone()\n\t{\n\t\treturn new SerialIirFilter(\n\t\t\t(Iir2[])this.filters.Clone());\n\t}\n\n\t#endregion\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/sp/src/Util.cs",
    "content": "﻿public static class Util\n{\n\t/// <summary>\n\t/// x を超えない最大の2のべきを求める。\n\t/// </summary>\n\t/// <param name=\"x\"></param>\n\t/// <returns></returns>\n\tpublic static int FloorPower2(int x)\n\t{\n\t\tif (x == 0)\n\t\t\treturn 0;\n\n\t\tint n = 1;\n\t\tfor (; x != 1; x /= 2, n *= 2) ;\n\t\treturn n;\n\t}\n\n\t/// <summary>\n\t/// x 以上の最小の2のべきを求める。\n\t/// 2^CeilLog2(x)\n\t/// </summary>\n\t/// <param name=\"x\"></param>\n\t/// <returns></returns>\n\tpublic static int CeilPower2(int x)\n\t{\n\t\tif (x == 0) return 0;\n\t\tif (x == 1) return 1;\n\n\t\treturn 2 * FloorPower2(x - 1);\n\t}\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/Fourier",
    "content": "フーリエ変換など\n----\nフーリエ変換、ラプラス変換、Z変換の記号。\n----\nFourier\nLaplace\nZ\n----\nspan.script\nspan.paren\n----\n<Fourier>変換元</Fourier>\n<Laplace>変換元</Laplace>\n<Z>変換元</Z>\n----\n<Fourier>f<paren>t</paren></Fourier><paren>ω</paren>, \n<Laplace>f<paren>t</paren></Laplace><paren>s</paren>, \n<Z>f<paren>t</paren></Z><paren>z</paren>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/Pi",
    "content": "Π\n----\n積の記号Πを表示\n----\nPi\nSigma sub\n----\ntable.sigma\ntd.sigma\ntd.sigmasub\n----\n<Pi><sub>Πの下にくる式</sub><sup>Πの上にくる式</sup></Pi>\n----\nn<factorial/> = <Pi><sub>k=0</sub><sup>n</sup></Pi>k\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/Re",
    "content": "実部・虚部\n----\n実部を表す記号Reおよび、虚部を表す記号Imを表示\n----\nRe\nIm\n----\nspan.script\n----\n<Re/> <Im/>\n----\n<exp/>(z) = <exp/>(<Re/>(z))<paren size=\"1.2\"><cos/><Im/>(z) + i<sin/><Im/>(z)</paren>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/Res",
    "content": "留数\n----\n留数を表す記号Resを表示\n----\nRes\n----\nspan.paren\nspan.normal\n----\n<Res>留数を求めたい関数,極</Res>\n----\n<int><sub>C</sub></int>f(z)<d/>z = 2πi<Sigma><sub>i</sub></Sigma><Res>f,a<sub>i</sub></Res>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/Sigma",
    "content": "∑\n----\n和の記号∑を表示\n----\nSigma\nSigma sub\n----\ntable.sigma\ntd.sigma\ntd.sigmasub\n----\n<Sigma><sub>∑の下にくる式</sub><sup>∑の上にくる式</sup></Sigma>\n----\nf(a) = \n<Sigma><sub>n=0</sub><sup>∞</sup></Sigma>\n<frac><num>f<sup>(n)</sup>(a)</num><denom>n<factorial/></denom></frac>\n<paren>z-a</paren><sup>n</sup>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/abs",
    "content": "絶対値\n----\n絶対値記号||の表示\n（obsolete。bracket に移行。）\n----\nabs\n----\nspan.normal\n----\n<abs>絶対値記号内の式</abs>\n----\n<int/><inv>x</inv><d/>x = <log/><abs>x</abs> + C\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/aleph",
    "content": "アレフ\n----\n無限基数アレフを表示。\n----\naleph\n----\n----\n<aleph sub=\"subscript\"/>\n----\n<aleph/>, \n<aleph sub=\"1\"/> ＝ 2<sup><aleph sub=\"0\"/></sup>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/arg",
    "content": "偏角\n----\n偏角を表す記号を表示\n----\narg\n----\nspan.normal\n----\n<arg/>\n----\n<arg/>z = nπi\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/bar",
    "content": "バー\n----\n変数を上線付きにする\n----\nbar\n----\nspan.bar\n----\n<bar>上線つきにしたい式</bar>\n----\na XOR b = a<bar>b</bar>+<bar>a</bar>b\n----\n\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/brace",
    "content": "{}括弧\n----\n{}の表示。\n（obsolete。bracket に移行。）\n----\nbrace\n----\nspan.paren\n----\n<brace size=\"括弧の大きさ\">括弧内の式</brace>\n----\n<brace size=\"1.2\"><paren>x-ξ</paren><sup>2</sup>+<paren>y-η</paren><sup>2</sup></brace><sup>1/2</sup>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/bracket",
    "content": "括弧\n----\n括弧の表示。\n(a), {a}, &lt;a&gt;, [a], |a|, ||a|| など、全て bracket にまとめました。\n（短縮形 bra）\n（type: paren (round), brace (curl), angle, square(sq), abs, norm, ceil, floor）\n----\nbracket\n----\nspan.paren\n----\n<bracket size=\"括弧の大きさ\" type=\"type\">括弧内の式</bracket>\n----\n<bracket>x</bracket> = <inv>N</inv><Sigma><sub>i</sub><sup>N</sup></Sigma>x<sub>i</sub>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/branch",
    "content": "条件分岐\n----\n条件によって値の違う式を表示\n----\nbranch\nbranch case equ\nbranch case cond\n----\ntable.branch\nspan.paren\nspan.normal\n----\n<branch size=\"条件の数\">\n\t<case><equ>式1</equ><cond>条件1</cond></case>\n\t<case><equ>式2</equ><cond>条件2</cond></case>\n\t.\n\t.\n\t.\n\t<case><equ>式n</equ><cond>条件n</cond></case>\n</branch>\n----\n<abs>x</abs>=\n<branch size=\"2\">\n\t<case><equ>x</equ><cond><math>x≧0</math></cond></case>\n\t<case><equ>&#x2212;x</equ><cond><math>x&lt;0</math></cond></case>\n</branch>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/conjugate",
    "content": "複素共役\n----\n共役複素数(右上に*を付ける)\n----\nconjugate\n----\n----\n<conjugate>共役にしたい式</conjugate>\n----\nz=a+ib, <conjugate>z</conjugate>=a&#x2212;ib\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/d",
    "content": "微分のd\n----\n微分記号のdを表示する(微分のdはブロック体で表記すべき)\n----\nd\n----\nspan.normal\n----\n<d/>\n----\n<d/>x = <cos/>t<d/>t\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/ddt",
    "content": "時間微分\n----\n時間微分記号d/dtを表示する\n----\nddt\n----\ntable.frac\ntd.num\nspan.normal\n----\n<ddt/>\n----\n<ddt/>x = -kx\n----"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/differential",
    "content": "微分\n----\nd/dx や ∂/∂x 等を表示する\n----\ndifferential\n----\ntable.frac\ntd.num\nspan.normal\n----\n<dd var=\"x\" func=\"y\"/> <pdd var=\"x\" func=\"y/>\n----\n<dd var=\"s\"/>f\n＝\n<pdd var=\"x\" func=\"f\"/><d/>x\n＋\n<pdd var=\"y\" func=\"f\"/><d/>y\n＋\n<pdd var=\"y\" func=\"f\"/><d/>x\n----"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/doubleint",
    "content": "重積分記号\n----\n重積分記号を表示する\n----\ndoubleint\nint sup\nint sub\n----\nspan.integral\ntable.integral\ntd.intsup\ntd.intsub\n----\n<doubleint><sub>積分記号の下に来る文字</sub><sup>積分記号の上に来る文字</sup></doubleint>\n----\n<doubleint/> f(x,y) <d/>x<d/>y\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/e",
    "content": "指数関数の底\n----\n指数関数の底eを表示する(eはブロック体で表記すべき)\n----\ne\n----\nspan.normal\n----\n<e/>\n----\n<e/><sup>iθ</sup> = <cos/>θ ＋ i<sin/>θ\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/font",
    "content": "書体\n----\n通常の文字列（text）、\n太字（bold）、\n筆記体（cursive）\n----\ntext\nbold\nscript\n----\nspan.text\nspan.bold\nspan.cursive\n----\n<text>通常の文字列</text> <bold>太字</bold> <cursive>筆記体</cursive>\n----\nα ∈ <bold>C</bold>,\n<cursive>Re</cursive><paren>α</paren> ∈ <bold>R</bold>\n<text>（C や R は太字、Re は筆記体で書く。）</text>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/frac",
    "content": "分数\n----\n分数を表示\n----\nfrac\nfrac num\nfrac denom\n----\ntable.frac\ntd.num\n----\n<frac>\n\t<num>分子</num>\n\t<denom>分母</denom>\n</frac>\n----\n<frac><num>f(b)&#x2212;f(a)</num><denom>b&#x2212;a</denom></frac> = f'(c)\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/int",
    "content": "積分記号\n----\n積分記号を表示する\n----\nint\nint sup\nint sub\n----\nspan.integral\ntable.integral\ntd.intsup\ntd.intsub\n----\n<int><sub>積分記号の下に来る文字</sub><sup>積分記号の上に来る文字</sup></int>\n----\n<int><sub>a</sub><sup>b</sup></int> f(x) <d/>x\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/limit",
    "content": "lim\n----\n極限記号limを表示\n----\nlim\n----\ntable.sigma\ntd.sigmasub\n----\n<lim>lim記号の下に来る式</lim>\n----\n<frac><num><d/>f</num><denom><d/>x</denom></frac> = \n<lim>Δx→0</lim><frac><num>f(x+Δx) &#x2212; f(x)</num><denom>Δx</denom></frac>\n----"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/log",
    "content": "指数・対数\n----\nlog,expの表示\n----\nlog\nexp\n----\nspan.normal\n----\n<log/> <exp/>\n----\n<exp/>At = <Sigma><sub>n=0</sub><sup>∞</sup></Sigma><inv>n<factorial/></inv>A<sup>n</sup>t<sup>n</sup>,\n<log/>z = <log/><abs>z</abs> + i<arg/>z\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/matrix",
    "content": "行列\n----\nテーブル状の行列を表示\n----\nmatrix\nmatrix row\nmatrix row elem\n----\ntable.matrix\nspan.paren\n----\n<matrix size=\"行列の高さ\">\n\t<row><elem>1,1成分</elem>...<elem>1,n成分</elem>\n\t.\n\t.\n\t.\n\t<row><elem>m,1成分</elem>...<elem>m,n成分</elem>\n</matrix>\n----\n<vervec size=\"3\"><elem>x'</elem><elem>y'</elem><elem>z'</elem></vervec> = \n<matrix size=\"3\">\n<row><elem>a</elem><elem>b</elem><elem>c</elem></row>\n<row><elem>d</elem><elem>e</elem><elem>f</elem></row>\n<row><elem>g</elem><elem>h</elem><elem>i</elem></row>\n</matrix>\n<vervec size=\"3\"><elem>x</elem><elem>y</elem><elem>z</elem></vervec>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/oint",
    "content": "周回積分記号\n----\n周回積分記号を表示する\n----\noint\nint sup\nint sub\n----\nspan.integral\ntable.integral\ntd.intsup\ntd.intsub\n----\n<oint><sub>積分記号の下に来る文字</sub><sup>積分記号の上に来る文字</sup></oint>\n----\n<oint><sub>C</sub></oint> <vec>f(x)</vec>・<dl/>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/operator",
    "content": "演算子\n----\n演算子。\n（短縮形: o）\n----\noperator\n----\nspan.normal\n----\n<operator name=\"name\">operator</operator>\n----\nx <o>+</o> y,\nx <o name=\"pm\"/> y,\nx <o n=\"mp\"/> y\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/paren",
    "content": "()括弧\n----\n()の表示\nobsolete\n----\nparen\n----\nspan.paren\n----\n<paren size=\"括弧の大きさ\">括弧内の式</paren>\n----\nf<sup>(n)</sup> = <paren size=\"2\"><ddt/></paren><sup>n</sup>f\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/pddt",
    "content": "時間偏微分\n----\n時間微分記号∂/∂tを表示する\n----\npddt\n----\ntable.frac\ntd.num\n----\n<pddt/>\n----\n<pddt/>T = α<nabra/><sup>2</sup>T\n----"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/pddt_second",
    "content": "2階時間偏微分\n----\n2階時間微分記号(∂/∂t)<sup>2</sup>を表示する\n----\npddt_second\n----\ntable.frac\ntd.num\n----\n<pddt_second/>\n----\n<pddt_second/>φ = c<sup>2</sup><nabra/><sup>2</sup>φ\n----"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/sin",
    "content": "三角関数\n----\nsin,cos,tanの表示\n----\nsin\ncos\ntan\n----\nspan.normal\n----\n<sin/> <cos/> <tan/>\n----\n<sin/>x = <cos/>(x-<frac><num>π</num><denom>2</denom></frac>),\n<tan/>x = <frac><num><sin/>x</num><denom><cos/>x</denom></frac>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/sqbracket",
    "content": "[]括弧\n----\n[]の表示\n（obsolete。bracket に移行。）\n----\nsqbracket\n----\nspan.paren\n----\n<sqbracket size=\"括弧の大きさ\">括弧内の式</sqbracket>\n----\n<sqbracket>H,G</sqbracket> = HG &#x2212; GH\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/subsup",
    "content": "上付き・下付き文字\n----\n上付き・下付き文字を表示する。\n----\nsub\nsup\nsubsup\nsubsup sub\n----\ntable.subsup\ncommon\n----\n<sup>上付き</sup>\n<sub>下付き</sub>\n<subsup><sub>下</sub><sup>上</sup></subsup>\n----\nx<sup>2</sup>, \na<sub>0</sub> , \np<subsup><sub>1</sub><sup>2</sup></subsup>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/symbol",
    "content": "記号\n----\n記号類。\n（短縮形: sym）\n主に、MS IME の変換で出せない文字。\n----\nsymbol\n----\nspan.normal\n----\n<symbol name=\"name\"></symbol>\n----\n<symbol n=\"forall\"/>x s.t. <symbol n=\"vtheta\"/><paren>x</paren> <op>=</op> 0\n\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/tripleint",
    "content": "3重積分記号\n----\n3重積分記号を表示する\n----\ntripleint\nint sup\nint sub\n----\nspan.integral\ntable.integral\ntd.intsup\ntd.intsub\n----\n<tripleint><sub>積分記号の下に来る文字</sub><sup>積分記号の上に来る文字</sup></tripleint>\n----\n<tripleint/> f(x,y,z) <d/>x<d/>y<d/>z\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/va",
    "content": "ベクトル解析用記号\n----\n線素、面素、体積素。\n勾配、発散、回転。\nナブラ記号。\n----\ndV\ndS\ndl\ngradient\ndivergence\nrotation\ntextgrad\ntextdiv\ntextrot\nnabra\n----\nspan.normal\n----\n<dV/>\n<dS/>\n<dl/>\n<gradient/>\n<divergence/>\n<rotation/>\n<textgrad/>\n<textdiv/>\n<textrot/>\n<nabra/>\n----\n<int><sub>V</sub></int> <divergence/><vec>f</vec> <dV/>\n＝\n<oint><sub>∂V</sub></oint> <vec>f</vec>・<dS/>\n,\n<int><sub>S</sub></int> <rotation/><vec>f</vec>・<dS/>\n＝\n<oint><sub>∂S</sub></oint> <vec>f</vec>・<dl/>\n,\n<d/>f\n＝\n<gradient/>f\n・<dl/>,\n<gradient/> ＝ <textgrad/>, \n<divergence/> ＝ <textdiv/>, \n<rotation/> ＝ <textrot/>, \n<nabra/>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/vec",
    "content": "ベクトル\n----\n太字イタリック体のベクトル\n----\nvec\n----\nspan.vector\n----\n<vec>ベクトルにしたい文字</vec>\n----\n<vec>y</vec> = A<vec>x</vec>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/reference/vervec",
    "content": "縦ベクトル\n----\n縦ベクトルを表示する\n----\nvervec\nvervec elem\n----\ntable.matrix\nspan.paren\n----\n<vervec size=\"ベクトルの要素数\"><elem>要素1</elem>...<elem>要素n<elem></vervec>\n----\n<vec>r</vec> = <vervec size=\"2\"><elem>x</elem><elem>y</elem></vervec>\n----\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/common",
    "content": "sub{margin-left:-0.1em; margin-right:0em; font-size:75%;}\nsup{margin-left:0.1em; margin-right:0em; font-size:75%;}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/div.math",
    "content": "div.math\n{\n\tfont-style:italic;\n\tfont-family:\"Times New Roman\",serif;\n\tmargin:0.2em 1.5em 0.5em 1.5em;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/span.bar",
    "content": "span.bar\n{\n\tdisplay:inline-block;\n\tborder-top:1pt solid #000000;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/span.bold",
    "content": "span.bold\n{\n\tfont-weight:bold;\n\tfont-style:normal;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/span.integral",
    "content": "span.integral\n{\n\tfont-size:140%;\n\tfont-style:normal;\n\tvertical-align:middle;\n\tmargin-right:-0.1em;\n}\nspan.ointegral\n{\n\tfont-size:140%;\n\tfont-style:normal;\n\tvertical-align:middle;\n\tmargin-right:-0.4em;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/span.math",
    "content": "span.math\n{\n\tdisplay:inline-block;\n\tfont-style:italic;\n\tfont-family:\"Times New Roman\",serif;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/span.matrix",
    "content": "span.matrix\n{\n\tvertical-align:middle;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/span.normal",
    "content": "span.normal\n{\n\tfont-weight:normal;\n\tfont-style:normal;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/span.paren",
    "content": "span.paren\n{\n\tfont-style:normal;\n\tvertical-align:middle;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/span.script",
    "content": "span.cursive\n{\n\tfont-family:cursive;\n\tfont-style:italic;\n\tpadding-right:0.2em;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/span.vector",
    "content": "span.vector\n{\n\tfont-weight:bold;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/table.branch",
    "content": "table.branch\n{\n\tdisplay:inline;\n\tfont-style:italic;\n\tvertical-align:bottom;\n\tvertical-align:middle;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/table.frac",
    "content": "table.frac\n{\n\tdisplay:inline;\n\tvertical-align:middle;\n\tfont-style:italic;\n\tfont-size:90%;\n\ttext-align:center;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/table.integral",
    "content": "table.integral\n{\n\tdisplay:inline;\n\tvertical-align:middle;\n\tfont-size:80%;\n\tfont-style:italic;\n\tpadding-right:0.3em;\n\tpadding-left:0.1em;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/table.matrix",
    "content": "table.matrix\n{\n\tdisplay:inline;\n\tfont-style:italic;\n\ttext-align:center;\n\tvertical-align:bottom;\n\tvertical-align:middle;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/table.sigma",
    "content": "table.sigma\n{\n\tdisplay:inline;\n\ttext-align:center;\n\tvertical-align:middle;\n\tfont-style:italic;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/table.subsup",
    "content": "table.subsup\n{\n\tdisplay:inline;\n\tvertical-align:middle;\n\tfont-size:80%;\n\tfont-style:italic;\n\tpadding-left:1em;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/td.intsub",
    "content": "table.integral td.intsub\n{\n\ttext-align:left;\n\tmargin:0;\n\tpadding:0;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/td.intsup",
    "content": "td.intsup\n{\n\ttext-align:right;\n\tmargin:0;\n\tpadding:0;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/td.num",
    "content": "td.num\n{\n\tborder-bottom:#000000 1pt solid;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/td.sigma",
    "content": "td.sigma\n{\n\tfont-style:normal;\n\tfont-size:120%;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/style/td.sigmasub",
    "content": "td.sigmasub\n{\n\tfont-size:70%;\n}\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/Fourier",
    "content": "<xsl:template match=\"ufcpp:Fourier\">\n\t<span class=\"normal\">&#x2131;</span>\n\t<xsl:if test=\"@inv!=''\">\n\t<sup>|1</sup>\n\t</xsl:if>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t[\n\t</span>\n\t<xsl:apply-templates/>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t]\n\t</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/Im",
    "content": "<xsl:template match=\"ufcpp:Im\">\n\t<span class=\"script\">Im</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/Laplace",
    "content": "<xsl:template match=\"ufcpp:Laplace\">\n\t<span class=\"normal\">&#x2112;</span>\n\t<xsl:if test=\"@inv!=''\">\n\t<sup>|1</sup>\n\t</xsl:if>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t[\n\t</span>\n\t<xsl:apply-templates/>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t]\n\t</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/Pi",
    "content": "<xsl:template match=\"ufcpp:Pi\">\n\t<table class=\"sigma\" summary=\"product\">\n\t\t<tr><td class=\"sigmasub\"><xsl:apply-templates select=\"ufcpp:sup\"/></td></tr>\n\t\t<tr><td class=\"sigma\">&#8719;</td></tr>\n\t\t<tr><td class=\"sigmasub\"><xsl:apply-templates select=\"ufcpp:sub\"/></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/Re",
    "content": "<xsl:template match=\"ufcpp:Re\">\n\t<span class=\"script\">Re</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/Res",
    "content": "<xsl:template match=\"ufcpp:Res\">\n\t<span class=\"normal\">Res</span>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t[\n\t</span>\n\t<xsl:apply-templates/>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t]\n\t</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/Sigma",
    "content": "<xsl:template match=\"ufcpp:Sigma\">\n\t<table class=\"sigma\" summary=\"sum\">\n\t\t<tr><td class=\"sigmasub\"><xsl:apply-templates select=\"ufcpp:sup\"/></td></tr>\n\t\t<tr><td class=\"sigma\">&#8721;</td></tr>\n\t\t<tr><td class=\"sigmasub\"><xsl:apply-templates select=\"ufcpp:sub\"/></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/Sigma sub",
    "content": "<xsl:template match=\"ufcpp:Sigma/ufcpp:sup|ufcpp:Pi/ufcpp:sup|ufcpp:Sigma/ufcpp:sub|ufcpp:Pi/ufcpp:sub\">\n\t<xsl:apply-templates/>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/Z",
    "content": "<xsl:template match=\"ufcpp:Z\">\n\t<span class=\"script\">\n\t\tZ\n\t</span>\n\t<xsl:if test=\"@inv!=''\">\n\t<sup>|1</sup>\n\t</xsl:if>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t[\n\t</span>\n\t<xsl:apply-templates/>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t]\n\t</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/abs",
    "content": "<xsl:template match=\"ufcpp:abs\">\n\t<span class=\"normal\">|</span>\n\t<xsl:apply-templates/>\n\t<span class=\"normal\">|</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/aleph",
    "content": "<xsl:template match=\"ufcpp:aleph\">\n\t&#x202D;&#x05D0;\n\t<xsl:if test=\"@sub!=''\">\n\t\t<sub><xsl:value-of select=\"@sub\"/></sub>\n\t</xsl:if>\n</xsl:template>"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/arg",
    "content": "<xsl:template match=\"ufcpp:arg\">\n\t<span class=\"normal\">arg</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/bar",
    "content": "<xsl:template match=\"ufcpp:bar\">\n\t<span class=\"bar\">\n\t\t<xsl:apply-templates/>\n\t</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/bold",
    "content": "<xsl:template match=\"ufcpp:bold\">\n\t<span class=\"bold\"><xsl:apply-templates/></span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/brace",
    "content": "<xsl:template match=\"ufcpp:brace\">\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t{\n\t</span>\n\t<xsl:apply-templates/>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t}\n\t</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/bracket",
    "content": "<xsl:template match=\"ufcpp:math//ufcpp:bracket|ufcpp:math//ufcpp:bra|ufcpp:Math//ufcpp:bracket|ufcpp:Math//ufcpp:bra\">\n<xsl:variable name=\"t\"><xsl:choose><xsl:when test=\"@type != ''\"><xsl:value-of select=\"@type\"/></xsl:when><xsl:otherwise><xsl:value-of select=\"@t\"/></xsl:otherwise></xsl:choose></xsl:variable>\n\n<xsl:variable name=\"l\">\n <xsl:choose>\n  <xsl:when test=\"$t = 'p'\">(</xsl:when>\n  <xsl:when test=\"$t = 'paren'\">(</xsl:when>\n  <xsl:when test=\"$t = 'r'\">(</xsl:when>\n  <xsl:when test=\"$t = 'round'\">(</xsl:when>\n  <xsl:when test=\"$t = 'c'\">{</xsl:when>\n  <xsl:when test=\"$t = 'curl'\">{</xsl:when>\n  <xsl:when test=\"$t = 'b'\">{</xsl:when>\n  <xsl:when test=\"$t = 'brace'\">{</xsl:when>\n  <xsl:when test=\"$t = 'angle'\">&#9001;</xsl:when>\n  <xsl:when test=\"$t = 'square'\">[</xsl:when>\n  <xsl:when test=\"$t = 'sq'\">[</xsl:when>\n  <xsl:when test=\"$t = 'abs'\">|</xsl:when>\n  <xsl:when test=\"$t = 'norm'\">||</xsl:when>\n  <xsl:when test=\"$t = 'ceil'\">&#8968;</xsl:when>\n  <xsl:when test=\"$t = 'floor'\">&#8970;</xsl:when>\n  <xsl:otherwise>&#9001;</xsl:otherwise>\n </xsl:choose>\n</xsl:variable>\n\n<xsl:variable name=\"r\">\n <xsl:choose>\n  <xsl:when test=\"$t = 'p'\">)</xsl:when>\n  <xsl:when test=\"$t = 'paren'\">)</xsl:when>\n  <xsl:when test=\"$t = 'r'\">)</xsl:when>\n  <xsl:when test=\"$t = 'round'\">)</xsl:when>\n  <xsl:when test=\"$t = 'c'\">}</xsl:when>\n  <xsl:when test=\"$t = 'curl'\">}</xsl:when>\n  <xsl:when test=\"$t = 'b'\">}</xsl:when>\n  <xsl:when test=\"$t = 'brace'\">}</xsl:when>\n  <xsl:when test=\"$t = 'angle'\">&#9002;</xsl:when>\n  <xsl:when test=\"$t = 'square'\">]</xsl:when>\n  <xsl:when test=\"$t = 'sq'\">]</xsl:when>\n  <xsl:when test=\"$t = 'abs'\">|</xsl:when>\n  <xsl:when test=\"$t = 'norm'\">||</xsl:when>\n  <xsl:when test=\"$t = 'ceil'\">&#8969;</xsl:when>\n  <xsl:when test=\"$t = 'floor'\">&#8971;</xsl:when>\n  <xsl:otherwise>&#9002;</xsl:otherwise>\n </xsl:choose>\n</xsl:variable>\n\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t<xsl:value-of select=\"$l\"/>\n\t</span>\n\t<xsl:apply-templates/>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t<xsl:value-of select=\"$r\"/>\n\t</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/branch",
    "content": "<xsl:template match=\"ufcpp:branch\">\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t{\n\t</span>\n\t<table class=\"branch\" summary=\"conditional\">\n\t\t<xsl:for-each select=\"ufcpp:case\">\n\t\t\t<tr>\n\t\t\t\t<td><span class=\"math\"><xsl:apply-templates select=\"ufcpp:equ\"/></span>&#xA0;&#xA0;</td>\n\t\t\t\t<td>\n\t\t\t\t\t<span class=\"paren\">(</span>\n\t\t\t\t\t<span class=\"math\"><xsl:apply-templates select=\"ufcpp:cond\"/></span>\n\t\t\t\t\t<span class=\"paren\">)</span>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t</xsl:for-each>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/branch case cond",
    "content": "<xsl:template match=\"ufcpp:branch/ufcpp:case/ufcpp:cond\">\n\t<xsl:apply-templates/>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/branch case equ",
    "content": "<xsl:template match=\"ufcpp:branch/ufcpp:case/ufcpp:equ\">\n\t<xsl:apply-templates/>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/cite",
    "content": "<xsl:template match=\"ufcpp:cite\">\n\t　　　<span class=\"normal\">・・・(<xsl:number level=\"any\" count=\"cite\" format=\"1\"/>)</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/conjugate",
    "content": "<xsl:template match=\"ufcpp:conjugate\">\n\t<xsl:apply-templates/><sup>*</sup>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/cos",
    "content": "<xsl:template match=\"ufcpp:cos\">\n\t<span class=\"normal\">cos</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/d",
    "content": "<xsl:template match=\"ufcpp:d\">\n\t<span class=\"normal\">d</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/dS",
    "content": "<xsl:template match=\"ufcpp:dS\">\n\t<span class=\"normal\">d</span><span class=\"vector\">S</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/dV",
    "content": "<xsl:template match=\"ufcpp:dV\">\n\t<span class=\"normal\">d</span>V\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/ddt",
    "content": "<xsl:template match=\"ufcpp:ddt\">\n\t<table class=\"frac\" summary=\"differential\">\n\t\t<tr><td class=\"num\"><span class=\"normal\">d</span><xsl:choose><xsl:when test=\"@var != ''\"><xsl:value-of select=\"@var\"/></xsl:when><xsl:when test=\"@v != ''\"><xsl:value-of select=\"@v\"/></xsl:when><xsl:otherwise><xsl:apply-templates/></xsl:otherwise></xsl:choose></td></tr>\n\t\t<tr><td><span class=\"normal\">d</span>t</td></tr>\n\t</table>\n</xsl:template>\n\n<xsl:template match=\"ufcpp:math//ufcpp:dd|ufcpp:Math//ufcpp:dd\">\n\t<table class=\"frac\" summary=\"differential\">\n\t\t<tr><td class=\"num\"><span class=\"normal\">d</span><xsl:choose><xsl:when test=\"@num != ''\"><xsl:value-of select=\"@num\"/></xsl:when><xsl:when test=\"@n != ''\"><xsl:value-of select=\"@n\"/></xsl:when><xsl:otherwise><xsl:apply-templates select=\"ufcpp:num\"/></xsl:otherwise></xsl:choose></td></tr>\n\t\t<tr><td><span class=\"normal\">d</span><xsl:choose><xsl:when test=\"@denom != ''\"><xsl:value-of select=\"@denom\"/></xsl:when><xsl:when test=\"@d != ''\"><xsl:value-of select=\"@d\"/></xsl:when><xsl:otherwise><xsl:apply-templates select=\"ufcpp:denom\"/></xsl:otherwise></xsl:choose></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/differential",
    "content": "<xsl:template match=\"ufcpp:dd\">\n\t<table class=\"frac\" summary=\"differential\">\n\t\t<tr><td class=\"num\"><span class=\"normal\">d</span><xsl:value-of select=\"@func\"/></td></tr>\n\t\t<tr><td><span class=\"normal\">d</span>\n\t\t<xsl:choose>\n\t\t\t<xsl:when test=\"@var != ''\">\n\t\t\t\t<xsl:value-of select=\"@var\"/>\n\t\t\t</xsl:when>\n\t\t\t<xsl:otherwise>\n\t\t\t\t<xsl:apply-templates/>\n\t\t\t</xsl:otherwise>\n\t\t</xsl:choose>\n\t\t</td></tr>\n\t</table>\n</xsl:template>\n<xsl:template match=\"ufcpp:pdd\">\n\t<table class=\"frac\" summary=\"differential\">\n\t\t<tr><td class=\"num\"><xsl:value-of select=\"@func\"/></td></tr>\n\t\t<tr><td>\n\t\t<xsl:choose>\n\t\t\t<xsl:when test=\"@var != ''\">\n\t\t\t\t<xsl:value-of select=\"@var\"/>\n\t\t\t</xsl:when>\n\t\t\t<xsl:otherwise>\n\t\t\t\t<xsl:apply-templates/>\n\t\t\t</xsl:otherwise>\n\t\t</xsl:choose>\n\t\t</td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/divergence",
    "content": "<xsl:template match=\"ufcpp:divergence\">\n\t<span class=\"vector\">∇</span>・\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/dl",
    "content": "<xsl:template match=\"ufcpp:dl\">\n\t<span class=\"normal\">d</span><span class=\"vector\">l</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/doubleint",
    "content": "<xsl:template match=\"ufcpp:doubleint\">\n\t<span class=\"integral\">\n\t\t∫<span style=\"margin-left:-0.5em;\">∫</span>\n\t</span>\n\t<table class=\"integral\" summary=\"integral\">\n\t\t<tr><td class=\"intsup\">&#xA0;&#xA0;<xsl:apply-templates select=\"ufcpp:sup\"/></td></tr>\n\t\t<tr><td style=\"font-size:30%;\">&#xA0;</td></tr>\n\t\t<tr><td class=\"intsub\"><xsl:apply-templates select=\"ufcpp:sub\"/></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/e",
    "content": "<xsl:template match=\"ufcpp:e\">\n\t<span class=\"normal\">e</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/exp",
    "content": "<xsl:template match=\"ufcpp:exp\">\n\t<span class=\"normal\">exp</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/factrorial",
    "content": "<xsl:template match=\"ufcpp:factorial\">\n\t<span class=\"normal\">!</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/footer.txt",
    "content": "</xsl:stylesheet>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/frac",
    "content": "<xsl:template match=\"ufcpp:frac\">\n\n\t<table class=\"frac\" summary=\"fraction\">\n\t\t<tr><td class=\"num\"><xsl:choose><xsl:when test=\"@num != ''\"><xsl:value-of select=\"@num\"/></xsl:when><xsl:when test=\"@n != ''\"><xsl:value-of select=\"@n\"/></xsl:when><xsl:otherwise><xsl:apply-templates select=\"ufcpp:num\"/></xsl:otherwise></xsl:choose></td></tr>\n\t\t<tr><td><xsl:choose><xsl:when test=\"@denom != ''\"><xsl:value-of select=\"@denom\"/></xsl:when><xsl:when test=\"@d != ''\"><xsl:value-of select=\"@d\"/></xsl:when><xsl:otherwise><xsl:apply-templates select=\"ufcpp:denom\"/></xsl:otherwise></xsl:choose></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/frac denom",
    "content": "<xsl:template match=\"ufcpp:frac/ufcpp:denom\">\n\t<xsl:apply-templates/>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/frac num",
    "content": "<xsl:template match=\"ufcpp:frac/ufcpp:num\">\n\t<xsl:apply-templates/>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/func",
    "content": "<xsl:template match=\"ufcpp:math//ufcpp:f|ufcpp:math//ufcpp:func|ufcpp:Math//ufcpp:f|ufcpp:Math//ufcpp:func\">\n<xsl:variable name=\"n\"><xsl:choose><xsl:when test=\"@name != ''\"><xsl:value-of select=\"@name\"/></xsl:when><xsl:when test=\"@n != ''\"><xsl:value-of select=\"@n\"/></xsl:when><xsl:otherwise><xsl:value-of select=\"text()\"/></xsl:otherwise></xsl:choose></xsl:variable>\n\n<span class=\"normal\"><xsl:value-of select=\"$n\"/></span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/funcsub",
    "content": "<xsl:template match=\"ufcpp:funcsub\">\n\t<table class=\"sigma\" summary=\"statement under a function\">\n\t\t<tr><td><span class=\"normal\"><xsl:value-of select=\"@name\"/></span></td></tr>\n\t\t<tr><td class=\"sigmasub\"><xsl:apply-templates/></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/function",
    "content": "<xsl:template match=\"ufcpp:func\">\n\t<span class=\"normal\"><xsl:value-of select=\"@name\"/></span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/gradient",
    "content": "<xsl:template match=\"ufcpp:gradient\">\n\t<span class=\"vector\">∇</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/header.txt",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<xsl:stylesheet\n\tversion=\"2.0\"\n\txmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n\txmlns:ufcpp=\"http://ufcpp.net/study/document\">\n\n<!-- 数式環境 -->\n<xsl:template match=\"ufcpp:Math\">\n<xsl:variable name=\"css\" select=\"mathstyle\" />\n<div class=\"math\"><xsl:apply-templates/></div>\n</xsl:template>\n\n<xsl:template match=\"ufcpp:math\">\n<span class=\"math\"><xsl:apply-templates/></span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/int",
    "content": "<xsl:template match=\"ufcpp:int\">\n\t<span class=\"integral\">∫</span>\n\t<table class=\"integral\" summary=\"integral\">\n\t\t<tr><td class=\"intsup\">&#xA0;<xsl:apply-templates select=\"ufcpp:sup\"/></td></tr>\n\t\t<tr><td style=\"font-size:30%;\">&#xA0;</td></tr>\n\t\t<tr><td class=\"intsub\"><xsl:apply-templates select=\"ufcpp:sub\"/></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/int sub",
    "content": "<xsl:template match=\"ufcpp:oint/ufcpp:sub|ufcpp:int/ufcpp:sub|ufcpp:doubleint/ufcpp:sub|ufcpp:tripleint/ufcpp:sub\">\n\t<xsl:apply-templates/>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/int sup",
    "content": "<xsl:template match=\"ufcpp:oint/ufcpp:sup|ufcpp:int/ufcpp:sup|ufcpp:doubleint/ufcpp:sup|ufcpp:tripleint/ufcpp:sup\">\n\t<xsl:apply-templates/>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/inv",
    "content": "<xsl:template match=\"ufcpp:inv\">\n\t<table class=\"frac\" summary=\"fraction\">\n\t\t<tr><td class=\"num\"><span class=\"normal\">1</span></td></tr>\n\t\t<tr><td><xsl:choose><xsl:when test=\"@var != ''\"><xsl:value-of select=\"@var\"/></xsl:when><xsl:when test=\"@v != ''\"><xsl:value-of select=\"@v\"/></xsl:when><xsl:otherwise><xsl:apply-templates/></xsl:otherwise></xsl:choose></td></tr>\n\t</table>\n</xsl:template>\n\n<xsl:template match=\"ufcpp:inv2\">\n\t<table class=\"frac\" summary=\"fraction\">\n\t\t<tr><td class=\"num\"><span class=\"normal\">1</span></td></tr>\n\t\t<tr><td><span class=\"normal\">2</span></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/lim",
    "content": "<xsl:template match=\"ufcpp:lim\">\n\t<table class=\"sigma\" summary=\"limitation\">\n\t\t<tr><td><span class=\"normal\">lim</span></td></tr>\n\t\t<tr><td class=\"sigmasub\"><xsl:apply-templates/></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/log",
    "content": "<xsl:template match=\"ufcpp:log\">\n\t<span class=\"normal\">log</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/matrix",
    "content": "<xsl:template match=\"ufcpp:matrix\">\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t[\n\t</span>\n\t<table class=\"matrix\" summary=\"matrix\">\n\t\t<xsl:apply-templates select=\"ufcpp:row\"/>\n\t</table>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\" />em;</xsl:attribute>\n\t\t]\n\t</span>\n</xsl:template>\n\n<xsl:template match=\"ufcpp:array\">\n\t<table class=\"matrix\" summary=\"array\">\n\t\t<xsl:apply-templates select=\"ufcpp:row\"/>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/matrix row",
    "content": "<xsl:template match=\"ufcpp:matrix/ufcpp:row|ufcpp:array/ufcpp:row\">\n\t<tr><xsl:apply-templates select=\"ufcpp:elem\"/></tr>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/matrix row elem",
    "content": "<xsl:template match=\"ufcpp:matrix/ufcpp:row/ufcpp:elem|ufcpp:array/ufcpp:row/ufcpp:elem\">\n\t<td><xsl:apply-templates/></td>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/nabra",
    "content": "<xsl:template match=\"ufcpp:nabra\">\n\t<span class=\"vector\">∇</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/number",
    "content": "<xsl:template match=\"ufcpp:math//ufcpp:n|ufcpp:math//ufcpp:number|ufcpp:Math//ufcpp:n|ufcpp:Math//ufcpp:number\">\n<span class=\"normal\"><xsl:value-of select=\"text()\"/></span>\n</xsl:template>\n\n<xsl:template match=\"ufcpp:math//ufcpp:n0|ufcpp:Math//ufcpp:n0\">\n<span class=\"normal\">0</span>\n</xsl:template>\n<xsl:template match=\"ufcpp:math//ufcpp:n1|ufcpp:Math//ufcpp:n1\">\n<span class=\"normal\">1</span>\n</xsl:template>\n<xsl:template match=\"ufcpp:math//ufcpp:n2|ufcpp:Math//ufcpp:n2\">\n<span class=\"normal\">2</span>\n</xsl:template>\n<xsl:template match=\"ufcpp:math//ufcpp:n3|ufcpp:Math//ufcpp:n3\">\n<span class=\"normal\">3</span>\n</xsl:template>\n<xsl:template match=\"ufcpp:math//ufcpp:n4|ufcpp:Math//ufcpp:n4\">\n<span class=\"normal\">4</span>\n</xsl:template>\n<xsl:template match=\"ufcpp:math//ufcpp:n5|ufcpp:Math//ufcpp:n5\">\n<span class=\"normal\">5</span>\n</xsl:template>\n<xsl:template match=\"ufcpp:math//ufcpp:n6|ufcpp:Math//ufcpp:n6\">\n<span class=\"normal\">6</span>\n</xsl:template>\n<xsl:template match=\"ufcpp:math//ufcpp:n7|ufcpp:Math//ufcpp:n7\">\n<span class=\"normal\">7</span>\n</xsl:template>\n<xsl:template match=\"ufcpp:math//ufcpp:n8|ufcpp:Math//ufcpp:n8\">\n<span class=\"normal\">8</span>\n</xsl:template>\n<xsl:template match=\"ufcpp:math//ufcpp:n9|ufcpp:Math//ufcpp:n9\">\n<span class=\"normal\">9</span>\n</xsl:template>\n<xsl:template match=\"ufcpp:math//ufcpp:n10|ufcpp:Math//ufcpp:n10\">\n<span class=\"normal\">10</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/oint",
    "content": "<xsl:template match=\"ufcpp:oint\">\n\t<span class=\"ointegral\">∮</span>\n\t<table class=\"integral\" summary=\"integral\">\n\t\t<tr><td class=\"intsup\">&#xA0;<xsl:apply-templates select=\"ufcpp:sup\"/></td></tr>\n\t\t<tr><td style=\"font-size:30%;\">&#xA0;</td></tr>\n\t\t<tr><td class=\"intsub\"><xsl:apply-templates select=\"ufcpp:sub\"/></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/operator",
    "content": "<xsl:template match=\"ufcpp:math//ufcpp:o|ufcpp:math//ufcpp:operator|ufcpp:Math//ufcpp:o|ufcpp:Math//ufcpp:operator\">\n<xsl:variable name=\"n\"><xsl:choose><xsl:when test=\"@name != ''\"><xsl:value-of select=\"@name\"/></xsl:when><xsl:otherwise><xsl:value-of select=\"@n\"/></xsl:otherwise></xsl:choose></xsl:variable>\n\n<span class=\"normal\">\n<xsl:choose>\n <xsl:when test=\"$n = 'in'\">&#8712;</xsl:when><!--∈-->\n <xsl:when test=\"$n = 'nin'\">&#8713;</xsl:when><!--∉-->\n <xsl:when test=\"$n = 'ni'\">&#8715;</xsl:when><!--∋-->\n <xsl:when test=\"$n = 'nni'\">&#8716;</xsl:when><!--∌-->\n\n <xsl:when test=\"$n = 'wedge'\">&#8743;</xsl:when><!--∧-->\n <xsl:when test=\"$n = 'vee'\">&#8744;</xsl:when><!--∨-->\n <xsl:when test=\"$n = 'cap'\">&#8745;</xsl:when><!--∩-->\n <xsl:when test=\"$n = 'cup'\">&#8746;</xsl:when><!--∪-->\n\n <xsl:when test=\"$n = 'sub'\">&#8834;</xsl:when><!--⊂-->\n <xsl:when test=\"$n = 'sup'\">&#8835;</xsl:when><!--⊃-->\n <xsl:when test=\"$n = 'nsub'\">&#8836;</xsl:when><!--⊄-->\n <xsl:when test=\"$n = 'nsup'\">&#8837;</xsl:when><!--⊅-->\n <xsl:when test=\"$n = 'sube'\">&#8838;</xsl:when><!--⊆-->\n <xsl:when test=\"$n = 'supe'\">&#8839;</xsl:when><!--⊇-->\n\n <xsl:when test=\"$n = 'perp'\">&#8869;</xsl:when><!--⊥-->\n <xsl:when test=\"$n = 'para'\">&#8514;</xsl:when><!--∥-->\n\n <xsl:when test=\"$n = 'eq'\">=</xsl:when><!--=-->\n <xsl:when test=\"$n = 'sim'\">&#8764;</xsl:when><!--∼-->\n <xsl:when test=\"$n = 'approx'\">&#8773;</xsl:when><!--≅-->\n <xsl:when test=\"$n = 'asymp'\">&#8776;</xsl:when><!--≈-->\n <xsl:when test=\"$n = 'ne'\">&#8800;</xsl:when><!--≠-->\n <xsl:when test=\"$n = 'equiv'\">&#8801;</xsl:when><!--≡-->\n <xsl:when test=\"$n = 'prop'\">&#8733;</xsl:when><!--∝-->\n\n <xsl:when test=\"$n = 'lt'\">&lt;</xsl:when><!--<-->\n <xsl:when test=\"$n = 'gt'\">&gt;</xsl:when><!-->-->\n <xsl:when test=\"$n = 'le'\">&#8804;</xsl:when><!--≤-->\n <xsl:when test=\"$n = 'ge'\">&#8805;</xsl:when><!--≥-->\n <xsl:when test=\"$n = 'lE'\">&#8806;</xsl:when><!--≦-->\n <xsl:when test=\"$n = 'gE'\">&#8807;</xsl:when><!--≧-->\n <xsl:when test=\"$n = 'lnE'\">&#8808;</xsl:when><!--≨-->\n <xsl:when test=\"$n = 'gnE'\">&#8809;</xsl:when><!--≩-->\n <xsl:when test=\"$n = 'Lt'\">&#8810;</xsl:when><!--≪-->\n <xsl:when test=\"$n = 'Gt'\">&#8811;</xsl:when><!--≫-->\n\n <xsl:when test=\"$n = 'p'\">&#43;</xsl:when><!--+-->\n <xsl:when test=\"$n = 'plus'\">&#43;</xsl:when><!--+-->\n <xsl:when test=\"$n = 'm'\">&#8722;</xsl:when><!--−-->\n <xsl:when test=\"$n = 'minus'\">&#8722;</xsl:when><!--−-->\n <xsl:when test=\"$n = 'times'\">&#215;</xsl:when><!--×-->\n <xsl:when test=\"$n = 'div'\">&#247;</xsl:when><!--÷-->\n <xsl:when test=\"$n = 'slash'\">/</xsl:when><!--/-->\n <xsl:when test=\"$n = 'mp'\">&#8723;</xsl:when><!--∓-->\n <xsl:when test=\"$n = 'pm'\">&#177;</xsl:when><!--±-->\n\n <xsl:when test=\"$n = 'oplus'\">&#8853;</xsl:when><!--⊕-->\n <xsl:when test=\"$n = 'ominus'\">&#8854;</xsl:when><!--⊖-->\n <xsl:when test=\"$n = 'otimes'\">&#8855;</xsl:when><!--⊗-->\n <xsl:when test=\"$n = 'bs'\">&#8726;</xsl:when><!--∖-->\n\n <xsl:when test=\"$n = 'dot'\">&#8901;</xsl:when><!--⋅-->\n <xsl:when test=\"$n = 'cross'\">&#215;</xsl:when><!--×-->\n <xsl:when test=\"$n = 'wedge'\">&#8743;</xsl:when><!--∧-->\n <xsl:when test=\"$n = 'ring'\">&#8728;</xsl:when><!--∘-->\n <xsl:when test=\"$n = 'aster'\">&#8727;</xsl:when><!--∗-->\n <xsl:when test=\"$n = 'star'\">&#8902;</xsl:when><!--⋆-->\n <xsl:when test=\"$n = 'not'\">&#172;</xsl:when><!--¬-->\n\n <xsl:when test=\"$n = 'larr'\">&#8592;</xsl:when><!--←-->\n <xsl:when test=\"$n = 'uarr'\">&#8593;</xsl:when><!--↑-->\n <xsl:when test=\"$n = 'rarr'\">&#8594;</xsl:when><!--→-->\n <xsl:when test=\"$n = 'darr'\">&#8595;</xsl:when><!--↓-->\n <xsl:when test=\"$n = 'harr'\">&#8596;</xsl:when><!--↔-->\n\n <xsl:when test=\"$n = 'lArr'\">&#8656;</xsl:when><!--⇐-->\n <xsl:when test=\"$n = 'uArr'\">&#8657;</xsl:when><!--⇑-->\n <xsl:when test=\"$n = 'rArr'\">&#8658;</xsl:when><!--⇒-->\n <xsl:when test=\"$n = 'dArr'\">&#8659;</xsl:when><!--⇓-->\n <xsl:when test=\"$n = 'hArr'\">&#8660;</xsl:when><!--⇔-->\n\n <xsl:when test=\"$n = 'prec'\">&#x227A;</xsl:when><!--≺-->\n <xsl:when test=\"$n = 'succ'\">&#x227B;</xsl:when><!--≻-->\n\n <xsl:when test=\"$n = 'cr'\">&#8629;</xsl:when><!--↵-->\n\n <xsl:otherwise>\n  <xsl:value-of select=\"text()\"/>\n </xsl:otherwise>\n</xsl:choose>\n</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/paren",
    "content": "<xsl:template match=\"ufcpp:paren\">\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t(\n\t</span>\n\t<xsl:apply-templates/>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t)\n\t</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/pddt",
    "content": "<xsl:template match=\"ufcpp:pddt\">\n\t<table class=\"frac\" summary=\"differential\">\n\t\t<tr><td class=\"num\">∂<xsl:choose><xsl:when test=\"@var != ''\"><xsl:value-of select=\"@var\"/></xsl:when><xsl:when test=\"@v != ''\"><xsl:value-of select=\"@v\"/></xsl:when><xsl:otherwise><xsl:apply-templates/></xsl:otherwise></xsl:choose></td></tr>\n\t\t<tr><td>∂t</td></tr>\n\t</table>\n</xsl:template>\n\n<xsl:template match=\"ufcpp:math//ufcpp:pdd|ufcpp:Math//ufcpp:pdd\">\n\t<table class=\"frac\" summary=\"differential\">\n\t\t<tr><td class=\"num\">∂<xsl:choose><xsl:when test=\"@num != ''\"><xsl:value-of select=\"@num\"/></xsl:when><xsl:when test=\"@n != ''\"><xsl:value-of select=\"@n\"/></xsl:when><xsl:otherwise><xsl:apply-templates select=\"ufcpp:num\"/></xsl:otherwise></xsl:choose></td></tr>\n\t\t<tr><td>∂<xsl:choose><xsl:when test=\"@denom != ''\"><xsl:value-of select=\"@denom\"/></xsl:when><xsl:when test=\"@d != ''\"><xsl:value-of select=\"@d\"/></xsl:when><xsl:otherwise><xsl:apply-templates select=\"ufcpp:denom\"/></xsl:otherwise></xsl:choose></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/pddt_second",
    "content": "<xsl:template match=\"ufcpp:pddt_second\">\n\t<table class=\"frac\" summary=\"differential\">\n\t\t<tr><td class=\"num\">∂<sup>2</sup></td></tr>\n\t\t<tr><td>∂t<sup>2</sup></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/rotation",
    "content": "<xsl:template match=\"ufcpp:rotation\">\n\t<span class=\"vector\">∇</span>×\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/script",
    "content": "<xsl:template match=\"ufcpp:cursive\">\n\t<span class=\"cursive\"><xsl:apply-templates/></span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/sin",
    "content": "<xsl:template match=\"ufcpp:sin\">\n\t<span class=\"normal\">sin</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/sqbracket",
    "content": "<xsl:template match=\"ufcpp:sqbracket\">\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t[\n\t</span>\n\t<xsl:apply-templates/>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t]\n\t</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/sqrt",
    "content": "<xsl:template match=\"ufcpp:sqrt\">\n\t<span class=\"normal\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t√\n\t</span>\n\t<span class=\"bar\">\n\t\t<xsl:apply-templates/>\n\t</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/subsup",
    "content": "<xsl:template match=\"ufcpp:subsup\">\n\t<table class=\"subsup\" summary=\"sub / sup\">\n\t\t<tr><td><xsl:apply-templates select=\"ufcpp:sup\"/></td></tr>\n\t\t<tr><td style=\"font-size:30%;\">&#xA0;</td></tr>\n\t\t<tr><td><xsl:apply-templates select=\"ufcpp:sub\"/></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/subsup sub",
    "content": "<xsl:template match=\"ufcpp:subsup/ufcpp:sub|ufcpp:subsup/ufcpp:sup\">\n\t<xsl:apply-templates/>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/sup",
    "content": "<xsl:template match=\"ufcpp:sup0\"><sup><span class=\"normal\">0</span></sup></xsl:template>\n<xsl:template match=\"ufcpp:sup1\"><sup><span class=\"normal\">1</span></sup></xsl:template>\n<xsl:template match=\"ufcpp:sup2\"><sup><span class=\"normal\">2</span></sup></xsl:template>\n<xsl:template match=\"ufcpp:sup2\"><sup><span class=\"normal\">2</span></sup></xsl:template>\n<xsl:template match=\"ufcpp:sup3\"><sup><span class=\"normal\">3</span></sup></xsl:template>\n<xsl:template match=\"ufcpp:sup4\"><sup><span class=\"normal\">4</span></sup></xsl:template>\n<xsl:template match=\"ufcpp:sup5\"><sup><span class=\"normal\">5</span></sup></xsl:template>\n<xsl:template match=\"ufcpp:sup6\"><sup><span class=\"normal\">6</span></sup></xsl:template>\n<xsl:template match=\"ufcpp:sup7\"><sup><span class=\"normal\">7</span></sup></xsl:template>\n<xsl:template match=\"ufcpp:sup8\"><sup><span class=\"normal\">8</span></sup></xsl:template>\n<xsl:template match=\"ufcpp:sup9\"><sup><span class=\"normal\">9</span></sup></xsl:template>\n<xsl:template match=\"ufcpp:sup10\"><sup><span class=\"normal\">10</span></sup></xsl:template>\n\n<xsl:template match=\"ufcpp:sub0\"><sub><span class=\"normal\">0</span></sub></xsl:template>\n<xsl:template match=\"ufcpp:sub1\"><sub><span class=\"normal\">1</span></sub></xsl:template>\n<xsl:template match=\"ufcpp:sub2\"><sub><span class=\"normal\">2</span></sub></xsl:template>\n<xsl:template match=\"ufcpp:sub2\"><sub><span class=\"normal\">2</span></sub></xsl:template>\n<xsl:template match=\"ufcpp:sub3\"><sub><span class=\"normal\">3</span></sub></xsl:template>\n<xsl:template match=\"ufcpp:sub4\"><sub><span class=\"normal\">4</span></sub></xsl:template>\n<xsl:template match=\"ufcpp:sub5\"><sub><span class=\"normal\">5</span></sub></xsl:template>\n<xsl:template match=\"ufcpp:sub6\"><sub><span class=\"normal\">6</span></sub></xsl:template>\n<xsl:template match=\"ufcpp:sub7\"><sub><span class=\"normal\">7</span></sub></xsl:template>\n<xsl:template match=\"ufcpp:sub8\"><sub><span class=\"normal\">8</span></sub></xsl:template>\n<xsl:template match=\"ufcpp:sub9\"><sub><span class=\"normal\">9</span></sub></xsl:template>\n<xsl:template match=\"ufcpp:sub10\"><sub><span class=\"normal\">10</span></sub></xsl:template>\n\n<xsl:template match=\"ufcpp:supinv\">\n\t<sup><span class=\"normal\">&#8722;1</span></sup>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/symbol",
    "content": "<xsl:template match=\"ufcpp:math//ufcpp:symbol|ufcpp:math//ufcpp:sym|ufcpp:Math//ufcpp:symbol|ufcpp:Math//ufcpp:sym\">\n<xsl:variable name=\"n\"><xsl:choose><xsl:when test=\"@name != ''\"><xsl:value-of select=\"@name\"/></xsl:when><xsl:otherwise><xsl:value-of select=\"@n\"/></xsl:otherwise></xsl:choose></xsl:variable>\n\n<span class=\"normal\">\n<xsl:choose>\n <xsl:when test=\"$n = 'forall'\">&#8704;</xsl:when><!--∀-->\n <xsl:when test=\"$n = 'exist'\">&#8707;</xsl:when><!--∃-->\n <xsl:when test=\"$n = 'partial'\">&#8706;</xsl:when><!--∂-->\n <xsl:when test=\"$n = 'part'\">&#8706;</xsl:when><!--∂-->\n <xsl:when test=\"$n = 'nabla'\">&#8711;</xsl:when><!--∇-->\n <xsl:when test=\"$n = 'infinity'\">&#8734;</xsl:when><!--∞-->\n <xsl:when test=\"$n = 'infty'\">&#8734;</xsl:when><!--∞-->\n <xsl:when test=\"$n = 'infin'\">&#8734;</xsl:when><!--∞-->\n <xsl:when test=\"$n = 'ang'\">&#8736;</xsl:when><!--∠-->\n <xsl:when test=\"$n = 'therefore'\">&#8756;</xsl:when><!--∴-->\n <xsl:when test=\"$n = 'because'\">&#8757;</xsl:when><!--∵-->\n\n <xsl:when test=\"$n = 'empty'\">&#8709;</xsl:when><!--∅-->\n <xsl:when test=\"$n = 'weierp'\">&#8472;</xsl:when><!--℘-->\n <xsl:when test=\"$n = 'image'\">&#8465;</xsl:when><!--ℑ-->\n <xsl:when test=\"$n = 'real'\">&#8476;</xsl:when><!--ℜ-->\n <xsl:when test=\"$n = 'alef'\">&#8501;</xsl:when><!--ℵ-->\n <xsl:when test=\"$n = 'planck'\">&#x210F;</xsl:when><!--ℏ-->\n\n <!-- ellipsis -->\n <xsl:when test=\"$n = 'dots'\">&#x22EF;</xsl:when><!--⋯-->\n <xsl:when test=\"$n = 'vdots'\">&#x22EE;</xsl:when><!--⋮-->\n <xsl:when test=\"$n = 'updots'\">&#x22F0;</xsl:when><!--⋰-->\n <xsl:when test=\"$n = 'downdots'\">&#x22F1;</xsl:when><!--⋱-->\n\n <!--ギリシャ文字異字体-->\n <xsl:when test=\"$n = 'vbeta'\">&#976;</xsl:when>\n <xsl:when test=\"$n = 'vepsilon'\">&#8714;</xsl:when>\n <xsl:when test=\"$n = 'vtheta'\">&#977;</xsl:when>\n <xsl:when test=\"$n = 'vkappa'\">&#1008;</xsl:when>\n <xsl:when test=\"$n = 'vpi'\">&#982;</xsl:when>\n <xsl:when test=\"$n = 'vrho'\">&#1009;</xsl:when>\n <xsl:when test=\"$n = 'vsigma'\">&#962;</xsl:when>\n <xsl:when test=\"$n = 'vphi'\">&#981;</xsl:when>\n\n <xsl:otherwise>\n  <xsl:value-of select=\"text()\"/>\n </xsl:otherwise>\n</xsl:choose>\n</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/tan",
    "content": "<xsl:template match=\"ufcpp:tan\">\n\t<span class=\"normal\">tan</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/text",
    "content": "<xsl:template match=\"ufcpp:text\">\n\t<span class=\"normal\">\n\t<xsl:apply-templates/>\n\t</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/textdiv",
    "content": "<xsl:template match=\"ufcpp:textdiv\">\n\t<span class=\"normal\">div</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/textgrad",
    "content": "<xsl:template match=\"ufcpp:textgrad\">\n\t<span class=\"normal\">grad</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/textrot",
    "content": "<xsl:template match=\"ufcpp:textrot\">\n\t<span class=\"normal\">rot</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/tripleint",
    "content": "<xsl:template match=\"ufcpp:tripleint\">\n\t<span class=\"integral\">\n\t\t∫<span style=\"margin-left:-0.5em;\">∫</span><span style=\"margin-left:-0.5em;\">∫</span>\n\t</span>\n\t<table class=\"integral\" summary=\"integral\">\n\t\t<tr><td class=\"intsup\">&#xA0;&#xA0;<xsl:apply-templates select=\"ufcpp:sup\"/></td></tr>\n\t\t<tr><td style=\"font-size:30%;\">&#xA0;</td></tr>\n\t\t<tr><td class=\"intsub\"><xsl:apply-templates select=\"ufcpp:sub\"/></td></tr>\n\t</table>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/vec",
    "content": "<xsl:template match=\"ufcpp:vec\">\n\t<span class=\"vector\"><xsl:apply-templates/></span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/vervec",
    "content": "<xsl:template match=\"ufcpp:vervec\">\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\"/>em;</xsl:attribute>\n\t\t[\n\t</span>\n\t<table class=\"matrix\" summary=\"vector\">\n\t\t<xsl:apply-templates select=\"ufcpp:elem\"/>\n\t</table>\n\t<span class=\"paren\">\n\t\t<xsl:attribute name=\"style\">font-size:<xsl:value-of select=\"@size\" />em;</xsl:attribute>\n\t\t]\n\t</span>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xml/xsl/vervec elem",
    "content": "<xsl:template match=\"ufcpp:vervec/ufcpp:elem\">\n\t<tr><td><xsl:apply-templates/></td></tr>\n</xsl:template>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/css.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"css\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n\n  <xs:element name=\"css\">\n    <xs:complexType>\n      <xs:attribute name=\"name\" type=\"xs:string\"/>\n    </xs:complexType>\n  </xs:element>\n  \n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/division.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"division\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n  <xs:include id=\"ref\" schemaLocation=\"ref.xsd\"/>\n  <xs:include id=\"link\" schemaLocation=\"link.xsd\"/>\n  <xs:include id=\"source\" schemaLocation=\"source.xsd\"/>\n  <xs:include id=\"keyword\" schemaLocation=\"keyword.xsd\"/>\n  <xs:include id=\"figure\" schemaLocation=\"figure.xsd\"/>\n  <xs:include id=\"html\" schemaLocation=\"html.xsd\"/>\n  <xs:include id=\"exercise\" schemaLocation=\"exercise.xsd\"/>\n  <xs:include id=\"math\" schemaLocation=\"math.xsd\"/>\n  <xs:include id=\"other\" schemaLocation=\"other.xsd\"/>\n  <xs:include id=\"silverlight\" schemaLocation=\"silverlight.xsd\"/>\n\n  <xs:complexType name=\"division_type\" mixed=\"true\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:group ref=\"division_elements\"/>\n      <xs:group ref=\"block_elements\"/>\n      <xs:group ref=\"inline_elements\"/>\n    </xs:choice>\n    <xs:attribute name=\"id\" type=\"xs:ID\" />\n  </xs:complexType>\n\n  <xs:group name=\"division_elements\">\n    <xs:choice>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"div\" type=\"division_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"blockquote\" type=\"division_type\"/>\n    </xs:choice>\n  </xs:group>\n\n  <xs:complexType name=\"expand_type\" mixed=\"true\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:group ref=\"block_elements\"/>\n    </xs:choice>\n    <xs:attribute name=\"id\" type=\"xs:string\" use=\"required\" />\n    <xs:attribute name=\"description\" type=\"xs:string\" use=\"optional\" />\n  </xs:complexType>\n\n  <!-- ブロック要素 -->\n  <xs:complexType name=\"block_type\" mixed=\"true\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:group ref=\"inline_elements\"/>\n    </xs:choice>\n  </xs:complexType>\n\n  <xs:group name=\"block_elements\">\n    <xs:choice>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"head\" type=\"block_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"p\" type=\"block_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"expand\" type=\"expand_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"pre\" />\n\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"figure\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"table\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"layouttable\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"silverlight\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"wmv\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"youtube\" type=\"id_element\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"webppt\" type=\"id_element\" />\n\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"ul\" type=\"list_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"ol\" type=\"list_type\"/>\n\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"sources\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"source\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"xsource\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"console\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"exercise\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"reflinks\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"links\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"sample\" />\n\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"Math\" type=\"math_type\"/>\n    </xs:choice>\n  </xs:group>\n\n  <!-- インライン要素 -->\n  <xs:complexType name=\"inline_type\" mixed=\"true\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:group ref=\"inline_elements\"/>\n    </xs:choice>\n    <xs:attribute name=\"class\" type=\"xs:string\" />\n    <xs:attribute name=\"style\" type=\"xs:string\" />\n  </xs:complexType>\n\n  <xs:group name=\"inline_elements\">\n    <xs:choice>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"ver2\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"ver3\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"ver4\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"ver5\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"ver6\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"ver7\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"ver8\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"ver9\"/>\n\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"link\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"ref\" />\n\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"keyword\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"refkey\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"refex\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"refsource\"/>\n\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"math\" type=\"math_type\"/>\n\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"span\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"a\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"em\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"code\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"br\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"sup\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"sub\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"img\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"ruby\" />\n\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"sp\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"csp\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"pros\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"cons\"/>\n\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"amazon\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" ref=\"amazontext\" />\n    </xs:choice>\n  </xs:group>\n\n  <!-- list -->\n  <xs:complexType name=\"list_type\">\n    <xs:choice maxOccurs=\"unbounded\">\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"li\" type=\"list_item_type\"/>\n    </xs:choice>\n  </xs:complexType>\n\n  <xs:complexType name=\"list_item_type\" mixed=\"true\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:group ref=\"inline_elements\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"ul\" type=\"list_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"ol\" type=\"list_type\"/>\n    </xs:choice>\n  </xs:complexType>\n\n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/document.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"document\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n  <xs:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n\n  <xs:include id=\"css\" schemaLocation=\"css.xsd\"/>\n  <xs:include id=\"division\" schemaLocation=\"division.xsd\"/>\n  <xs:include id=\"variable\" schemaLocation=\"variable.xsd\"/>\n\n  <!-- document -->\n  <xs:element name=\"document\">\n    <xs:annotation>\n      <xs:documentation>ドキュメント ページのルート要素</xs:documentation>\n    </xs:annotation>\n    <xs:complexType>\n      <xs:choice maxOccurs=\"unbounded\">\n        <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"section\" type=\"section_type\"/>\n        <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"keyword-list\"/>\n        <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"exercise-list\"/>\n        <xs:element minOccurs=\"0\" maxOccurs=\"1\" ref=\"var-group\"/>\n        <xs:element minOccurs=\"0\" maxOccurs=\"1\" ref=\"css\"/>\n      </xs:choice>\n      <xs:attribute name=\"title\" type=\"xs:string\" use=\"required\" />\n      <xs:attribute name=\"since\" type=\"xs:string\" />\n      <xs:attribute name=\"update\" type=\"xs:string\" />\n    </xs:complexType>\n  </xs:element>\n\n  <!-- section -->\n\n  <xs:complexType name=\"section_type\">\n    <xs:annotation>\n      <xs:documentation>章</xs:documentation>\n    </xs:annotation>\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:group ref=\"division_elements\"/>\n      <xs:group ref=\"block_elements\"/>\n      <xs:element name=\"section\" type=\"section_type\"/>\n      \n    </xs:choice>\n    <xs:attribute name=\"title\" type=\"xs:string\" use=\"required\" />\n    <xs:attribute name=\"id\" type=\"xs:string\" use=\"required\" />\n  </xs:complexType>\n\n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/exercise.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"exercise\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n  <xs:include id=\"division\" schemaLocation=\"division.xsd\"/>\n\n  <xs:element name=\"exercise\">\n    <xs:complexType>\n      <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n        <xs:element minOccurs=\"1\" maxOccurs=\"1\" name=\"question\" type=\"division_type\"/>\n        <xs:element minOccurs=\"1\" maxOccurs=\"unbounded\" name=\"answer\" type=\"division_type\"/>\n      </xs:choice>\n      <xs:attribute name=\"id\" type=\"xs:string\"/>\n    </xs:complexType>\n  </xs:element>\n\n  <xs:element name=\"refex\">\n    <xs:complexType>\n      <xs:attribute name=\"doc\" type=\"xs:string\" use=\"required\"/>\n      <xs:attribute name=\"pos\" type=\"xs:int\" use=\"required\"/>\n    </xs:complexType>\n  </xs:element>\n\n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/figure.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"figure\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n  <xs:include id=\"division\" schemaLocation=\"division.xsd\"/>\n\n  <!-- table -->\n  <xs:element name=\"table\" type=\"table_type\"/>\n  <xs:element name=\"layouttable\" type=\"table_type\"/>\n\n  <xs:complexType name=\"table_type\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"caption\" type=\"inline_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"thead\" type=\"table_rows_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"tbody\" type=\"table_rows_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"tfoot\" type=\"table_rows_type\"/>\n      <xs:element minOccurs=\"1\" maxOccurs=\"unbounded\" name=\"tr\">\n        <xs:complexType>\n          <xs:choice maxOccurs=\"unbounded\">\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"th\" type=\"table_element_type\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"td\" type=\"table_element_type\"/>\n          </xs:choice>\n        </xs:complexType>\n      </xs:element>\n    </xs:choice>\n    <xs:attribute name=\"summary\" type=\"xs:string\" />\n    <xs:attribute name=\"class\" type=\"xs:string\" />\n  </xs:complexType>\n\n  <xs:complexType name=\"table_rows_type\">\n    <xs:sequence>\n      <xs:element minOccurs=\"1\" maxOccurs=\"unbounded\" name=\"tr\">\n        <xs:complexType>\n          <xs:choice maxOccurs=\"unbounded\">\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"th\" type=\"table_element_type\"/>\n            <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"td\" type=\"table_element_type\"/>\n          </xs:choice>\n        </xs:complexType>\n      </xs:element>\n    </xs:sequence>\n    <xs:attribute name=\"class\" type=\"xs:string\" />\n    <xs:attribute name=\"style\" type=\"xs:string\" />\n  </xs:complexType>\n\n  <xs:complexType name=\"table_element_type\">\n    <xs:complexContent>\n      <xs:extension base=\"division_type\">\n        <xs:attribute name=\"colspan\" type=\"xs:int\" />\n        <xs:attribute name=\"rowspan\" type=\"xs:int\" />\n        <xs:attribute name=\"class\" type=\"xs:string\" />\n        <xs:attribute name=\"style\" type=\"xs:string\" />\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n  \n  <!-- figure -->\n  <xs:element name=\"figure\">\n    <xs:complexType>\n      <xs:choice maxOccurs=\"unbounded\">\n        <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"image\">\n          <xs:complexType>\n            <xs:attribute name=\"src\" type=\"xs:string\" use=\"required\"/>\n            <xs:attribute name=\"width\" type=\"xs:int\" use=\"required\"/>\n            <xs:attribute name=\"height\" type=\"xs:int\" use=\"required\"/>\n          </xs:complexType>\n        </xs:element>\n        <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"legend\" type=\"block_type\"/>\n        <xs:group ref=\"block_elements\"/>\n      </xs:choice>\n    </xs:complexType>\n  </xs:element>\n\n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/html.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"html\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n  <xs:include id=\"division\" schemaLocation=\"division.xsd\"/>\n\n  <xs:element name=\"a\">\n    <xs:complexType>\n      <xs:complexContent>\n        <xs:extension base=\"inline_type\">\n          <xs:attribute name=\"href\" type=\"xs:string\"/>\n          <xs:attribute name=\"id\" type=\"xs:string\"/>\n        </xs:extension>\n      </xs:complexContent>\n    </xs:complexType>\n  </xs:element>\n\n  <xs:element name=\"img\">\n    <xs:complexType>\n      <xs:attribute name=\"src\" type=\"xs:string\" use=\"required\" />\n      <xs:attribute name=\"width\" type=\"xs:string\"/>\n      <xs:attribute name=\"height\" type=\"xs:string\"/>\n      <xs:attribute name=\"alt\" type=\"xs:string\"/>\n    </xs:complexType>\n  </xs:element>\n\n  <xs:element name=\"code\">\n    <xs:complexType mixed=\"true\">\n      <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n        <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"reserved\" type=\"inline_type\" />\n        <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"comment\" type=\"inline_type\" />\n        <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"string\" type=\"inline_type\" />\n        <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"input\" type=\"inline_type\" />\n        <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"em\" type=\"inline_type\" />\n        <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"span\" type=\"inline_type\" />\n        <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"br\"/>\n      </xs:choice>\n      <xs:attribute name=\"class\" type=\"xs:string\" />\n    </xs:complexType>\n  </xs:element>\n\n  <xs:element name=\"pre\" type=\"block_type\"/>\n  <xs:element name=\"em\" type=\"inline_type\"/>\n  <xs:element name=\"sup\" type=\"inline_type\"/>\n  <xs:element name=\"sub\" type=\"inline_type\"/>\n  <xs:element name=\"span\" type=\"inline_type\"/>\n\n  <xs:element name=\"ruby\">\n    <xs:complexType mixed=\"true\">\n      <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n        <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"rb\" type=\"inline_type\"/>\n        <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"rt\" type=\"inline_type\"/>\n        <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"rp\" type=\"inline_type\"/>\n      </xs:choice>\n    </xs:complexType>\n  </xs:element>\n\n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/index.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"index\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n  <xs:include id=\"css\" schemaLocation=\"css.xsd\"/>\n  <xs:include id=\"division\" schemaLocation=\"division.xsd\"/>\n\n  <xs:element name=\"index\">\n    <xs:annotation>\n      <xs:documentation>インデックス ページのルート要素</xs:documentation>\n    </xs:annotation>\n    <xs:complexType>\n      <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n        <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"summary\" type=\"division_type\" />\n        <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"section\" type=\"index_section_type\"/>\n        <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"document\" type=\"index_document_type\"/>\n        <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"extern\" type=\"index_document_type\"/>\n        <xs:element minOccurs=\"0\" maxOccurs=\"1\" ref=\"css\"/>\n        <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"Ads\" type=\"division_type\"/>\n        <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"IAds\" type=\"division_type\"/>\n      </xs:choice>\n      <xs:attribute name=\"title\" type=\"xs:string\" use=\"required\"/>\n      <xs:attribute name=\"keyword\" type=\"xs:string\"/>\n      <xs:attribute name=\"description\" type=\"xs:string\"/>\n      <xs:attribute name=\"since\" type=\"xs:string\"/>\n      <xs:attribute name=\"update\" type=\"xs:string\"/>\n    </xs:complexType>\n  </xs:element>\n\n  <xs:complexType name=\"index_section_type\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"document\" type=\"index_document_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"refindex\" type=\"index_document_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"extern\" type=\"index_extern_type\"/>\n    </xs:choice>\n    <xs:attribute name=\"title\" type=\"xs:string\"/>\n    <xs:attribute name=\"id\" type=\"xs:string\"/>\n  </xs:complexType>\n\n  <xs:complexType name=\"index_document_type\">\n    <xs:annotation>\n      <xs:documentation>ドキュメントへのリンク。</xs:documentation>\n    </xs:annotation>\n    <xs:attribute name=\"href\" type=\"xs:string\">\n      <xs:annotation>\n        <xs:documentation>ドキュメント名。\".xml\" は不要。</xs:documentation>\n      </xs:annotation>\n    </xs:attribute>\n    <xs:attribute name=\"indexid\" type=\"xs:string\" use=\"optional\" />\n  </xs:complexType>\n\n  <xs:complexType name=\"index_extern_type\">\n    <xs:annotation>\n      <xs:documentation>別サイトへのリンク。</xs:documentation>\n    </xs:annotation>\n    <xs:attribute name=\"href\" type=\"xs:string\"/>\n    <xs:attribute name=\"title\" type=\"xs:string\"/>\n  </xs:complexType>\n\n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/keyword.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"keyword\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n\n  <!-- keyword -->\n  <xs:element name=\"keyword\">\n    <xs:complexType>\n      <xs:simpleContent>\n        <xs:extension base=\"xs:string\">\n          <xs:attribute name=\"id\" type=\"xs:string\" use=\"required\" />\n        </xs:extension>\n      </xs:simpleContent>\n    </xs:complexType>\n  </xs:element>\n\n  <xs:element name=\"refkey\">\n    <xs:complexType>\n      <xs:attribute name=\"area\" type=\"xs:string\" />\n      <xs:attribute name=\"doc\" type=\"xs:string\" use=\"required\" />\n      <xs:attribute name=\"id\" type=\"xs:string\" use=\"required\" />\n    </xs:complexType>\n  </xs:element>\n\n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/link.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"link\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n  <xs:include id=\"division\" schemaLocation=\"division.xsd\"/>\n\n  <xs:element name=\"reflinks\">\n    <xs:complexType>\n      <xs:attribute name=\"area\" type=\"xs:string\" />\n      <xs:attribute name=\"doc\" type=\"xs:string\" use=\"required\" />\n      <xs:attribute name=\"id\" type=\"xs:string\" use=\"required\" />\n    </xs:complexType>\n  </xs:element>\n\n  <xs:element name=\"links\">\n    <xs:complexType>\n      <xs:sequence>\n        <xs:element minOccurs=\"1\" maxOccurs=\"unbounded\" name=\"site\">\n          <xs:complexType>\n            <xs:complexContent>\n              <xs:extension base=\"block_type\">\n                <xs:attribute name=\"url\" type=\"xs:string\" use=\"required\"/>\n                <xs:attribute name=\"name\" type=\"xs:string\" use=\"required\"/>\n              </xs:extension>\n            </xs:complexContent>\n          </xs:complexType>\n        </xs:element>\n      </xs:sequence>\n      <xs:attribute name=\"id\" type=\"xs:string\" use=\"required\"/>\n    </xs:complexType>\n  </xs:element>\n  \n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/math.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"math\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n  <xs:include id=\"variable\" schemaLocation=\"variable.xsd\"/>\n\n  <xs:complexType name=\"math_type\" mixed=\"true\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:group ref=\"math_elements\"/>\n    </xs:choice>\n  </xs:complexType>\n\n  <xs:group name=\"math_elements\">\n    <xs:choice>\n      <xs:element name=\"em\" type=\"math_type\"/>\n\n      <xs:element name=\"e\"/>\n      <xs:element name=\"pi\"/>\n      <xs:element name=\"exp\"/>\n      <xs:element name=\"log\"/>\n      <xs:element name=\"sin\"/>\n      <xs:element name=\"cos\"/>\n      <xs:element name=\"tan\"/>\n      <xs:element name=\"arg\"/>\n      <xs:element name=\"factorial\"/>\n      <xs:element name=\"sqrt\" type=\"math_type\"/>\n      <xs:element name=\"inv\" type=\"var_math_type\"/>\n      <xs:element name=\"lim\" type=\"math_type\"/>\n\n      <xs:element name=\"gradient\"/>\n      <xs:element name=\"textgrad\"/>\n      <xs:element name=\"divergence\"/>\n      <xs:element name=\"textdiv\"/>\n      <xs:element name=\"rotation\"/>\n      <xs:element name=\"textrot\"/>\n      <xs:element name=\"nabra\"/>\n\n      <xs:element name=\"func\" type=\"named_math_type\"/>\n      <xs:element name=\"f\" type=\"math_type\"/>\n      <xs:element name=\"funcsub\" type=\"named_math_type\"/>\n\n      <xs:element name=\"Res\" type=\"math_type\"/>\n\n      <xs:element ref=\"branch\" />\n      <xs:element name=\"text\" type=\"xs:string\"/>\n\n      <xs:element name=\"n0\"/>\n      <xs:element name=\"n1\"/>\n      <xs:element name=\"n2\"/>\n      <xs:element name=\"n3\"/>\n      <xs:element name=\"n4\"/>\n      <xs:element name=\"n5\"/>\n      <xs:element name=\"n6\"/>\n      <xs:element name=\"n7\"/>\n      <xs:element name=\"n8\"/>\n      <xs:element name=\"n9\"/>\n      <xs:element name=\"n10\"/>\n\n      <xs:element name=\"sub0\"/>\n      <xs:element name=\"sub1\"/>\n      <xs:element name=\"sub2\"/>\n      <xs:element name=\"sub3\"/>\n      <xs:element name=\"sub4\"/>\n      <xs:element name=\"sub5\"/>\n      <xs:element name=\"sub6\"/>\n      <xs:element name=\"sub7\"/>\n      <xs:element name=\"sub8\"/>\n      <xs:element name=\"sub9\"/>\n      <xs:element name=\"sub10\"/>\n\n      <xs:element name=\"sup0\"/>\n      <xs:element name=\"sup1\"/>\n      <xs:element name=\"sup2\"/>\n      <xs:element name=\"sup3\"/>\n      <xs:element name=\"sup4\"/>\n      <xs:element name=\"sup5\"/>\n      <xs:element name=\"sup6\"/>\n      <xs:element name=\"sup7\"/>\n      <xs:element name=\"sup8\"/>\n      <xs:element name=\"sup9\"/>\n      <xs:element name=\"sup10\"/>\n\n      <xs:element name=\"supinv\"/>\n      <xs:element name=\"inv2\"/>\n\n      <xs:element name=\"sup\" type=\"math_type\"/>\n      <xs:element name=\"sub\" type=\"math_type\"/>\n      <xs:element name=\"conjugate\" type=\"math_type\"/>\n      <xs:element name=\"bar\" type=\"math_type\"/>\n      <xs:element name=\"bold\" type=\"math_type\"/>\n      <xs:element name=\"cursive\" type=\"math_type\"/>\n      <xs:element name=\"span\" type=\"mathspan_type\"/>\n\n      <xs:element name=\"abs\" type=\"simplebracket_type\"/>\n      <xs:element name=\"paren\" type=\"simplebracket_type\"/>\n      <xs:element name=\"brace\" type=\"simplebracket_type\"/>\n      <xs:element name=\"sqbracket\" type=\"simplebracket_type\"/>\n      <xs:element name=\"bracket\" type=\"bracket_type\"/>\n      <xs:element name=\"bra\" type=\"bracket_type\"/>\n\n      <xs:element name=\"vec\" type=\"vec_type\"/>\n\n      <xs:element ref=\"frac\"/>\n      <xs:element ref=\"pdd\"/>\n      <xs:element ref=\"dd\"/>\n      <xs:element name=\"d\"/>\n      <xs:element name=\"dl\"/>\n      <xs:element name=\"ds\"/>\n      <xs:element name=\"dS\"/>\n      <xs:element name=\"dV\"/>\n      <xs:element name=\"ddt\" type=\"var_math_type\"/>\n      <xs:element name=\"pddt\" type=\"var_math_type\"/>\n      <xs:element name=\"pddt_second\"/>\n\n      <xs:element name=\"int\" type=\"subsup_type\"/>\n      <xs:element name=\"oint\" type=\"subsup_type\"/>\n      <xs:element name=\"doubleint\" type=\"subsup_type\"/>\n      <xs:element name=\"tripleint\" type=\"subsup_type\"/>\n\n      <xs:element name=\"subsup\" type=\"subsup_type\"/>\n      <xs:element name=\"Sigma\" type=\"subsup_type\"/>\n      <xs:element name=\"Pi\" type=\"subsup_type\"/>\n      \n      <xs:element name=\"Fourier\" type=\"fourier_type\"/>\n      <xs:element name=\"Laplace\" type=\"fourier_type\"/>\n      <xs:element name=\"Z\" type=\"fourier_type\"/>\n\n      <xs:element ref=\"aleph\" />\n\n      <xs:element name=\"sym\" type=\"symbol_type\"/>\n      <xs:element name=\"symbol\" type=\"symbol_type\"/>\n\n      <xs:element name=\"n\" type=\"xs:string\"/>\n      <xs:element name=\"number\" type=\"xs:string\"/>\n      <xs:element name=\"o\" type=\"operator_type\"/>\n      <xs:element name=\"operator\" type=\"operator_type\"/>\n\n      <xs:element ref=\"use\"/>\n      <xs:element name=\"sp\"/>\n      <xs:element name=\"matrix\" type=\"matrix_type\"/>\n    </xs:choice>\n  </xs:group>\n\n  <xs:complexType name=\"matrix_type\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:element name=\"row\">\n        <xs:complexType>\n          <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n            <xs:element name=\"elem\" type=\"math_type\" />\n          </xs:choice>\n        </xs:complexType>\n      </xs:element>\n    </xs:choice>\n    <xs:attribute name=\"size\" type=\"xs:double\"/>\n  </xs:complexType>\n\n  <xs:complexType name=\"simplebracket_type\" mixed=\"true\">\n    <xs:complexContent>\n      <xs:extension base=\"math_type\">\n        <xs:attribute name=\"size\" type=\"positiveFloat\"/>\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n\n  <xs:complexType name=\"bracket_type\" mixed=\"true\">\n    <xs:complexContent>\n      <xs:extension base=\"math_type\">\n        <!--\n        <xs:attribute name=\"l\" type=\"xs:string\"/>\n        <xs:attribute name=\"r\" type=\"xs:string\"/>\n        -->\n        <xs:attribute name=\"t\" type=\"bracket_string\"/>\n        <xs:attribute name=\"size\" type=\"positiveFloat\"/>\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n\n  <xs:simpleType name=\"bracket_string\">\n    <xs:restriction base=\"xs:string\">\n      <xs:enumeration value=\"p\" />\n      <xs:enumeration value=\"paren\" />\n      <xs:enumeration value=\"r\" />\n      <xs:enumeration value=\"round\" />\n      <xs:enumeration value=\"c\" />\n      <xs:enumeration value=\"curl\" />\n      <xs:enumeration value=\"b\" />\n      <xs:enumeration value=\"brace\" />\n      <xs:enumeration value=\"angle\" />\n      <xs:enumeration value=\"square\" />\n      <xs:enumeration value=\"sq\" />\n      <xs:enumeration value=\"abs\" />\n      <xs:enumeration value=\"norm\" />\n      <xs:enumeration value=\"ceil\" />\n      <xs:enumeration value=\"floor\" />\n    </xs:restriction>\n  </xs:simpleType>\n\n  <xs:simpleType name=\"positiveFloat\">\n    <xs:restriction base=\"xs:float\">\n      <xs:minExclusive value=\"0\" />\n    </xs:restriction>\n  </xs:simpleType>\n\n  <xs:complexType name=\"vec_type\" mixed=\"true\">\n    <xs:complexContent>\n      <xs:extension base=\"math_type\">\n        <xs:attribute name=\"size\" type=\"positiveFloat\"/>\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n\n  <xs:complexType name=\"named_math_type\" mixed=\"true\">\n    <xs:complexContent>\n      <xs:extension base=\"math_type\">\n        <xs:attribute name=\"name\" type=\"xs:string\"/>\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n\n  <xs:complexType name=\"var_math_type\" mixed=\"true\">\n    <xs:complexContent>\n      <xs:extension base=\"math_type\">\n        <xs:attribute name=\"var\" type=\"xs:string\"/>\n        <xs:attribute name=\"v\" type=\"xs:string\"/>\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n\n  <xs:element name=\"frac\" type=\"frac_type\"/>\n  <xs:element name=\"pdd\" type=\"frac_type\"/>\n  <xs:element name=\"dd\" type=\"frac_type\"/>\n\n  <xs:complexType name=\"frac_type\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"num\" type=\"math_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"denom\" type=\"math_type\"/>\n    </xs:choice>\n    <xs:attribute name=\"num\" type=\"xs:string\"/>\n    <xs:attribute name=\"denom\" type=\"xs:string\"/>\n    <xs:attribute name=\"n\" type=\"xs:string\"/>\n    <xs:attribute name=\"d\" type=\"xs:string\"/>\n  </xs:complexType>\n\n  <xs:complexType name=\"subsup_type\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"sup\" type=\"math_type\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"sub\" type=\"math_type\"/>\n    </xs:choice>\n    <xs:attribute name=\"sup\" type=\"xs:string\"/>\n    <xs:attribute name=\"sub\" type=\"xs:string\"/>\n  </xs:complexType>\n\n  <xs:complexType name=\"mathspan_type\">\n    <xs:complexContent>\n      <xs:extension base=\"math_type\">\n        <xs:attribute name=\"class\" type=\"xs:string\"/>\n        <xs:attribute name=\"style\" type=\"xs:string\"/>\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n\n  <xs:element name=\"branch\">\n    <xs:complexType>\n      <xs:sequence minOccurs=\"1\" maxOccurs=\"unbounded\">\n        <xs:element name=\"case\">\n          <xs:complexType>\n            <xs:all>\n              <xs:element name=\"equ\" type=\"math_type\"/>\n              <xs:element name=\"cond\" type=\"math_type\"/>\n            </xs:all>\n          </xs:complexType>\n        </xs:element>\n      </xs:sequence>\n      <xs:attribute name=\"size\" type=\"xs:float\"/>\n    </xs:complexType>\n  </xs:element>\n\n  <xs:complexType name=\"fourier_type\">\n    <xs:attribute name=\"inv\" type=\"xs:boolean\" />\n    <xs:attribute name=\"size\" type=\"positiveFloat\" />\n  </xs:complexType>\n\n  <xs:complexType name=\"operator_type\" mixed=\"true\">\n    <xs:complexContent>\n      <xs:extension base=\"math_type\">\n        <xs:attribute name=\"n\" type=\"operator_string\"/>\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n\n  <xs:simpleType name=\"operator_string\">\n    <xs:restriction base=\"xs:string\">\n      <xs:enumeration value=\"in\" />\n      <xs:enumeration value=\"nin\" />\n      <xs:enumeration value=\"ni\" />\n      <xs:enumeration value=\"nni\" />\n\n      <xs:enumeration value=\"wedge\" />\n      <xs:enumeration value=\"vee\" />\n      <xs:enumeration value=\"cap\" />\n      <xs:enumeration value=\"cup\" />\n\n      <xs:enumeration value=\"sub\" />\n      <xs:enumeration value=\"sup\" />\n      <xs:enumeration value=\"nsub\" />\n      <xs:enumeration value=\"nsup\" />\n      <xs:enumeration value=\"sube\" />\n      <xs:enumeration value=\"supe\" />\n\n      <xs:enumeration value=\"perp\" />\n      <xs:enumeration value=\"para\" />\n\n      <xs:enumeration value=\"eq\" />\n      <xs:enumeration value=\"sim\" />\n      <xs:enumeration value=\"approx\" />\n      <xs:enumeration value=\"asymp\" />\n      <xs:enumeration value=\"ne\" />\n      <xs:enumeration value=\"equiv\" />\n      <xs:enumeration value=\"prop\" />\n\n      <xs:enumeration value=\"lt\" />\n      <xs:enumeration value=\"gt\" />\n      <xs:enumeration value=\"le\" />\n      <xs:enumeration value=\"ge\" />\n      <xs:enumeration value=\"lE\" />\n      <xs:enumeration value=\"gE\" />\n      <xs:enumeration value=\"lnE\" />\n      <xs:enumeration value=\"gnE\" />\n      <xs:enumeration value=\"Lt\" />\n      <xs:enumeration value=\"Gt\" />\n\n      <xs:enumeration value=\"p\" />\n      <xs:enumeration value=\"plus\" />\n      <xs:enumeration value=\"m\" />\n      <xs:enumeration value=\"minus\" />\n      <xs:enumeration value=\"times\" />\n      <xs:enumeration value=\"div\" />\n      <xs:enumeration value=\"slash\" />\n      <xs:enumeration value=\"mp\" />\n      <xs:enumeration value=\"pm\" />\n\n      <xs:enumeration value=\"oplus\" />\n      <xs:enumeration value=\"ominus\" />\n      <xs:enumeration value=\"otimes\" />\n      <xs:enumeration value=\"bs\" />\n\n      <xs:enumeration value=\"dot\" />\n      <xs:enumeration value=\"cross\" />\n      <xs:enumeration value=\"wedge\" />\n      <xs:enumeration value=\"ring\" />\n      <xs:enumeration value=\"aster\" />\n      <xs:enumeration value=\"star\" />\n      <xs:enumeration value=\"not\" />\n\n      <xs:enumeration value=\"larr\" />\n      <xs:enumeration value=\"uarr\" />\n      <xs:enumeration value=\"rarr\" />\n      <xs:enumeration value=\"darr\" />\n      <xs:enumeration value=\"harr\" />\n\n      <xs:enumeration value=\"lArr\" />\n      <xs:enumeration value=\"uArr\" />\n      <xs:enumeration value=\"rArr\" />\n      <xs:enumeration value=\"dArr\" />\n      <xs:enumeration value=\"hArr\" />\n\n      <xs:enumeration value=\"prec\" />\n      <xs:enumeration value=\"succ\" />\n\n      <xs:enumeration value=\"cr\" />\n    </xs:restriction>\n  </xs:simpleType>\n\n  <xs:element name=\"aleph\">\n    <xs:complexType>\n      <xs:attribute name=\"sub\" type=\"xs:string\"/>\n    </xs:complexType>\n  </xs:element>\n\n  <xs:complexType name=\"symbol_type\">\n    <xs:attribute name=\"name\" type=\"symbol_string\"/>\n    <xs:attribute name=\"n\" type=\"symbol_string\"/>\n  </xs:complexType>\n\n  <xs:simpleType name=\"symbol_string\">\n    <xs:restriction base=\"xs:string\">\n      <xs:enumeration value=\"forall\" />\n      <xs:enumeration value=\"exist\" />\n      <xs:enumeration value=\"partial\" />\n      <xs:enumeration value=\"part\" />\n      <xs:enumeration value=\"nabla\" />\n      <xs:enumeration value=\"infinity\" />\n      <xs:enumeration value=\"infty\" />\n      <xs:enumeration value=\"infin\" />\n      <xs:enumeration value=\"ang\" />\n      <xs:enumeration value=\"therefore\" />\n      <xs:enumeration value=\"because\" />\n\n      <xs:enumeration value=\"empty\" />\n      <xs:enumeration value=\"weierp\" />\n      <xs:enumeration value=\"image\" />\n      <xs:enumeration value=\"real\" />\n      <xs:enumeration value=\"alef\" />\n      <xs:enumeration value=\"planck\" />\n\n      <xs:enumeration value=\"dots\" />\n      <xs:enumeration value=\"vdots\" />\n      <xs:enumeration value=\"updots\" />\n      <xs:enumeration value=\"downdots\" />\n\n      <xs:enumeration value=\"vbeta\" />\n      <xs:enumeration value=\"vepsilon\" />\n      <xs:enumeration value=\"vtheta\" />\n      <xs:enumeration value=\"vkappa\" />\n      <xs:enumeration value=\"vpi\" />\n      <xs:enumeration value=\"vrho\" />\n      <xs:enumeration value=\"vsigma\" />\n      <xs:enumeration value=\"vphi\" />\n    </xs:restriction>\n  </xs:simpleType>\n\n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/other.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"other\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n  <xs:include id=\"division\" schemaLocation=\"division.xsd\"/>\n\n  <xs:element name=\"amazon\">\n    <xs:complexType>\n      <xs:attribute name=\"asin\" type=\"xs:string\"/>\n    </xs:complexType>\n  </xs:element>\n\n  <xs:element name=\"amazontext\">\n    <xs:complexType>\n      <xs:complexContent>\n        <xs:extension base=\"inline_type\">\n          <xs:attribute name=\"asin\" type=\"xs:string\"/>\n        </xs:extension>\n      </xs:complexContent>\n    </xs:complexType>\n  </xs:element>\n  \n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/ref.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"ref\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n\n  <!-- link, ref -->\n  <xs:element name=\"link\">\n    <xs:complexType>\n      <xs:attribute name=\"area\" type=\"xs:string\" />\n      <xs:attribute name=\"doc\" type=\"xs:string\" use=\"required\" />\n    </xs:complexType>\n  </xs:element>\n\n  <xs:element name=\"ref\">\n    <xs:complexType>\n      <xs:attribute name=\"area\" type=\"xs:string\" />\n      <xs:attribute name=\"doc\" type=\"xs:string\" use=\"required\" />\n      <xs:attribute name=\"id\" type=\"xs:string\" use=\"required\" />\n    </xs:complexType>\n  </xs:element>\n\n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/silverlight.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"silverlight\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n\n  <xs:element name=\"silverlight\">\n    <xs:complexType>\n      <xs:attribute name=\"width\" type=\"xs:string\"/>\n      <xs:attribute name=\"height\" type=\"xs:string\"/>\n      <xs:attribute name=\"source\" type=\"xs:string\"/>\n    </xs:complexType>\n  </xs:element>\n\n  <xs:element name=\"wmv\">\n    <xs:complexType>\n      <xs:attribute name=\"width\" type=\"xs:string\"/>\n      <xs:attribute name=\"height\" type=\"xs:string\"/>\n      <xs:attribute name=\"source\" type=\"xs:string\"/>\n    </xs:complexType>\n  </xs:element>\n\n  <xs:complexType name=\"id_element\">\n      <xs:attribute name=\"id\" type=\"xs:string\"/>\n  </xs:complexType>\n\n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/source.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"source\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n  <xs:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n  \n  <!-- sources -->\n\n  <xs:element name=\"sources\" type=\"sources_type\" />\n\n  <xs:complexType name=\"sources_type\" mixed=\"true\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:element minOccurs=\"1\" maxOccurs=\"unbounded\" name=\"source\" type=\"headerd_source_type\" />\n    </xs:choice>\n    <xs:attribute name=\"id\" type=\"xs:string\" use=\"optional\" />\n  </xs:complexType>\n\n    <xs:simpleType name=\"languages\">\n    <xs:restriction base=\"xs:string\">\n      <xs:enumeration value=\"C#\" />\n      <xs:enumeration value=\"VB\" />\n      <xs:enumeration value=\"C++\" />\n      <xs:enumeration value=\"F#\" />\n    </xs:restriction>\n  </xs:simpleType>\n\n  <xs:complexType name=\"headerd_source_type\" mixed=\"true\">\n    <xs:complexContent>\n      <xs:extension base=\"source_type\">\n        <xs:attribute name=\"header\" type=\"languages\" />\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n\n    <!-- source, console, xsource-->\n  <xs:element name=\"source\" type=\"source_type\" />\n  \n  <xs:complexType name=\"source_type\" mixed=\"true\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"reserved\" type=\"source_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"comment\" type=\"source_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"string\" type=\"source_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"literal\" type=\"source_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"inactive\" type=\"source_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"type\" type=\"source_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"input\" type=\"source_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"em\" type=\"source_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"span\" type=\"sourcespan_type\" />\n    </xs:choice>\n    <xs:attribute name=\"title\" type=\"xs:string\" />\n  </xs:complexType>\n\n  <xs:complexType name=\"sourcespan_type\">\n    <xs:complexContent>\n      <xs:extension base=\"source_type\">\n        <xs:attribute name=\"class\" type=\"xs:string\"/>\n        <xs:attribute name=\"style\" type=\"xs:string\"/>\n      </xs:extension>\n    </xs:complexContent>\n  </xs:complexType>\n\n  <xs:element name=\"xsource\" type=\"xsource_type\" />\n\n  <xs:complexType name=\"xsource_type\" mixed=\"true\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"lt\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"gt\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"element\" type=\"xsource_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"attribute\" type=\"xsource_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"attvalue\" type=\"xsource_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"em\" type=\"xsource_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"symbol\" type=\"xs:string\"/>\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"comment\" type=\"xsource_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"inactive\" type=\"source_type\" />\n    </xs:choice>\n    <xs:attribute name=\"title\" type=\"xs:string\" />\n  </xs:complexType>\n\n  <xs:element name=\"console\" type=\"console_type\" />\n\n  <xs:complexType name=\"console_type\" mixed=\"true\">\n    <xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"comment\" type=\"console_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"string\" type=\"console_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"input\" type=\"console_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"em\" type=\"console_type\" />\n      <xs:element minOccurs=\"0\" maxOccurs=\"unbounded\" name=\"prompt\">\n        <xs:complexType>\n          <xs:attribute name=\"char\" type=\"xs:string\"/>\n        </xs:complexType>\n      </xs:element>\n    </xs:choice>\n    <xs:attribute name=\"title\" type=\"xs:string\" />\n  </xs:complexType>\n\n  <xs:element name=\"refsource\">\n    <xs:complexType>\n      <xs:attribute name=\"src\" type=\"xs:string\" use=\"required\"/>\n      <xs:attribute name=\"name\" type=\"xs:string\" use=\"required\"/>\n    </xs:complexType>\n  </xs:element>\n\n</xs:schema>\n"
  },
  {
    "path": "Chapters/ufcpp2000/xsd/variable.xsd",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<xs:schema id=\"variable\"\n    targetNamespace=\"http://ufcpp.net/study/document\"\n    elementFormDefault=\"qualified\"\n    xmlns=\"http://ufcpp.net/study/document\"\n    xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"\n>\n  <xs:include id=\"math\" schemaLocation=\"math.xsd\"/>\n  <xs:include id=\"division\" schemaLocation=\"division.xsd\"/>\n\n  <xs:element name=\"var-group\">\n    <xs:complexType>\n      <xs:sequence minOccurs=\"1\" maxOccurs=\"unbounded\">\n        <xs:element name=\"variable\">\n          <xs:complexType>\n            <xs:choice minOccurs=\"1\" maxOccurs=\"5\">\n              <xs:element minOccurs=\"1\" maxOccurs=\"1\" name=\"letter\" type=\"math_type\"/>\n              <xs:element minOccurs=\"1\" maxOccurs=\"1\" name=\"name\" type=\"inline_type\"/>\n              <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"ename\" type=\"inline_type\"/>\n              <xs:element minOccurs=\"0\" maxOccurs=\"1\" name=\"unit\" type=\"inline_type\"/>\n              <xs:element minOccurs=\"1\" maxOccurs=\"1\" name=\"summary\" type=\"division_type\"/>\n            </xs:choice>\n            <xs:attribute name=\"id\" type=\"xs:string\"/>\n          </xs:complexType>\n        </xs:element>\n      </xs:sequence>\n    </xs:complexType>\n  </xs:element>\n\n  <xs:element name=\"use\">\n    <xs:complexType>\n      <xs:attribute name=\"id\" type=\"xs:string\"/>\n    </xs:complexType>\n  </xs:element>\n\n</xs:schema>\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/CompilerPlatform.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22823.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NameofDemo\", \"NameofDemo\\NameofDemo.csproj\", \"{B51ECCF1-812E-4A54-9F7E-0BBF595264FD}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"FluentArithmeticDemo\", \"FluentArithmeticDemo\\FluentArithmeticDemo.csproj\", \"{78D444DE-43AA-4A02-B3D6-871C8D279F2E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"QuickActions\", \"QuickActions\\QuickActions.csproj\", \"{557C42F7-2403-45EB-8511-6D10C0FFEEA8}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"LazyMixinDemo\", \"LazyMixinDemo\\LazyMixinDemo.csproj\", \"{45A8F3E7-187A-4B11-8470-1BF61F6FA9E7}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RecordDemo\", \"RecordDemo\\RecordDemo.csproj\", \"{00459108-23F2-4A1C-ABF3-9746D87DF7EA}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CsharpEssentialsDemo\", \"CsharpEssentialsDemo\\CsharpEssentialsDemo.csproj\", \"{F80205EC-033C-4653-9D7A-79EA873D21DD}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NotifyPropertyChangedGeneratorDemo\", \"NotifyPropertyChangedGeneratorDemo\\NotifyPropertyChangedGeneratorDemo.csproj\", \"{0F979A2A-5DD9-42D3-B531-8AA9CCD9DF2D}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{B51ECCF1-812E-4A54-9F7E-0BBF595264FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B51ECCF1-812E-4A54-9F7E-0BBF595264FD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B51ECCF1-812E-4A54-9F7E-0BBF595264FD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B51ECCF1-812E-4A54-9F7E-0BBF595264FD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{78D444DE-43AA-4A02-B3D6-871C8D279F2E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{78D444DE-43AA-4A02-B3D6-871C8D279F2E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{78D444DE-43AA-4A02-B3D6-871C8D279F2E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{78D444DE-43AA-4A02-B3D6-871C8D279F2E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{557C42F7-2403-45EB-8511-6D10C0FFEEA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{557C42F7-2403-45EB-8511-6D10C0FFEEA8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{557C42F7-2403-45EB-8511-6D10C0FFEEA8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{557C42F7-2403-45EB-8511-6D10C0FFEEA8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{45A8F3E7-187A-4B11-8470-1BF61F6FA9E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{45A8F3E7-187A-4B11-8470-1BF61F6FA9E7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{45A8F3E7-187A-4B11-8470-1BF61F6FA9E7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{45A8F3E7-187A-4B11-8470-1BF61F6FA9E7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{00459108-23F2-4A1C-ABF3-9746D87DF7EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{00459108-23F2-4A1C-ABF3-9746D87DF7EA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{00459108-23F2-4A1C-ABF3-9746D87DF7EA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{00459108-23F2-4A1C-ABF3-9746D87DF7EA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F80205EC-033C-4653-9D7A-79EA873D21DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F80205EC-033C-4653-9D7A-79EA873D21DD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F80205EC-033C-4653-9D7A-79EA873D21DD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F80205EC-033C-4653-9D7A-79EA873D21DD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0F979A2A-5DD9-42D3-B531-8AA9CCD9DF2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0F979A2A-5DD9-42D3-B531-8AA9CCD9DF2D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0F979A2A-5DD9-42D3-B531-8AA9CCD9DF2D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0F979A2A-5DD9-42D3-B531-8AA9CCD9DF2D}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/CsharpEssentialsDemo/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/CsharpEssentialsDemo/CsharpEssentialsDemo.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{F80205EC-033C-4653-9D7A-79EA873D21DD}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>CsharpEssentialsDemo</RootNamespace>\n    <AssemblyName>CsharpEssentialsDemo</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/CsharpEssentialsDemo/Program.cs",
    "content": "﻿namespace CsharpEssentialsDemo\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n\n    public class Point\n    {\n        public int X { get; private set; }\n\n        public int Y { get { return _y; } }\n        private int _y;\n\n        public Point(int x, int y)\n        {\n            X = x;\n            _y = y;\n        }\n\n        public override string ToString()\n        {\n            return $\"({X}, {Y})\";\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/CsharpEssentialsDemo/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"CsharpEssentialsDemo\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"CsharpEssentialsDemo\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"f80205ec-033c-4653-9d7a-79ea873d21dd\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/FluentArithmeticDemo/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/FluentArithmeticDemo/FluentArithmeticDemo.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{78D444DE-43AA-4A02-B3D6-871C8D279F2E}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>FluentArithmeticDemo</RootNamespace>\n    <AssemblyName>FluentArithmeticDemo</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"FluentArithmetic, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\FluentArithmetic.0.0.0.2\\lib\\FluentArithmetic.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Analyzer Include=\"..\\packages\\FluentArithmetic.0.0.0.2\\tools\\analyzers\\FluentArithmeticAnalyzer.dll\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/FluentArithmeticDemo/Program.cs",
    "content": "﻿using System;\nusing FluentArithmetic;\n\nnamespace FluentArithmeticDemo\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var x = 1\n                .Add(2)\n                .Mul(3)\n                .Sub(1)\n                .Div(4);\n\n            Console.WriteLine(x);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/FluentArithmeticDemo/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"FluentArithmeticDemo\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"FluentArithmeticDemo\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"78d444de-43aa-4a02-b3d6-871c8d279f2e\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/FluentArithmeticDemo/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"FluentArithmetic\" version=\"0.0.0.2\" targetFramework=\"net46\" userInstalled=\"true\" />\n</packages>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/LazyMixinDemo/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/LazyMixinDemo/Counter.cs",
    "content": "﻿namespace LazyMixinDemo\n{\n    class Counter\n    {\n        public int Count { get; private set; }\n\n        public void Add() => Count++;\n    }\n}\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/LazyMixinDemo/LazyMixinDemo.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{45A8F3E7-187A-4B11-8470-1BF61F6FA9E7}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>LazyMixinDemo</RootNamespace>\n    <AssemblyName>LazyMixinDemo</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>LazyMixinDemo.ruleset</CodeAnalysisRuleSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>LazyMixinDemo.ruleset</CodeAnalysisRuleSet>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"LazyMixin, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\LazyMixin.1.0.0.0\\lib\\LazyMixin.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Counter.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Sample.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"LazyMixinDemo.ruleset\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Analyzer Include=\"..\\packages\\LazyMixin.1.0.0.0\\tools\\analyzers\\LazyMixinAnalyzer.dll\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/LazyMixinDemo/LazyMixinDemo.ruleset",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RuleSet Name=\"Microsoft Managed Recommended Rules\" Description=\"These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. It is recommended to include this rule set in any custom rule set you create for your projects.\" ToolsVersion=\"10.0\">\n  <Localization ResourceAssembly=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.dll\" ResourceBaseName=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.Localized\">\n    <Name Resource=\"MinimumRecommendedRules_Name\" />\n    <Description Resource=\"MinimumRecommendedRules_Description\" />\n  </Localization>\n  <Rules AnalyzerId=\"Microsoft.Analyzers.ManagedCodeAnalysis\" RuleNamespace=\"Microsoft.Rules.Managed\">\n    <Rule Id=\"CA1001\" Action=\"Warning\" />\n    <Rule Id=\"CA1009\" Action=\"Warning\" />\n    <Rule Id=\"CA1016\" Action=\"Warning\" />\n    <Rule Id=\"CA1033\" Action=\"Warning\" />\n    <Rule Id=\"CA1049\" Action=\"Warning\" />\n    <Rule Id=\"CA1060\" Action=\"Warning\" />\n    <Rule Id=\"CA1061\" Action=\"Warning\" />\n    <Rule Id=\"CA1063\" Action=\"Warning\" />\n    <Rule Id=\"CA1065\" Action=\"Warning\" />\n    <Rule Id=\"CA1301\" Action=\"Warning\" />\n    <Rule Id=\"CA1400\" Action=\"Warning\" />\n    <Rule Id=\"CA1401\" Action=\"Warning\" />\n    <Rule Id=\"CA1403\" Action=\"Warning\" />\n    <Rule Id=\"CA1404\" Action=\"Warning\" />\n    <Rule Id=\"CA1405\" Action=\"Warning\" />\n    <Rule Id=\"CA1410\" Action=\"Warning\" />\n    <Rule Id=\"CA1415\" Action=\"Warning\" />\n    <Rule Id=\"CA1821\" Action=\"Warning\" />\n    <Rule Id=\"CA1900\" Action=\"Warning\" />\n    <Rule Id=\"CA1901\" Action=\"Warning\" />\n    <Rule Id=\"CA2002\" Action=\"Warning\" />\n    <Rule Id=\"CA2100\" Action=\"Warning\" />\n    <Rule Id=\"CA2101\" Action=\"Warning\" />\n    <Rule Id=\"CA2108\" Action=\"Warning\" />\n    <Rule Id=\"CA2111\" Action=\"Warning\" />\n    <Rule Id=\"CA2112\" Action=\"Warning\" />\n    <Rule Id=\"CA2114\" Action=\"Warning\" />\n    <Rule Id=\"CA2116\" Action=\"Warning\" />\n    <Rule Id=\"CA2117\" Action=\"Warning\" />\n    <Rule Id=\"CA2122\" Action=\"Warning\" />\n    <Rule Id=\"CA2123\" Action=\"Warning\" />\n    <Rule Id=\"CA2124\" Action=\"Warning\" />\n    <Rule Id=\"CA2126\" Action=\"Warning\" />\n    <Rule Id=\"CA2131\" Action=\"Warning\" />\n    <Rule Id=\"CA2132\" Action=\"Warning\" />\n    <Rule Id=\"CA2133\" Action=\"Warning\" />\n    <Rule Id=\"CA2134\" Action=\"Warning\" />\n    <Rule Id=\"CA2137\" Action=\"Warning\" />\n    <Rule Id=\"CA2138\" Action=\"Warning\" />\n    <Rule Id=\"CA2140\" Action=\"Warning\" />\n    <Rule Id=\"CA2141\" Action=\"Warning\" />\n    <Rule Id=\"CA2146\" Action=\"Warning\" />\n    <Rule Id=\"CA2147\" Action=\"Warning\" />\n    <Rule Id=\"CA2149\" Action=\"Warning\" />\n    <Rule Id=\"CA2200\" Action=\"Warning\" />\n    <Rule Id=\"CA2202\" Action=\"Warning\" />\n    <Rule Id=\"CA2207\" Action=\"Warning\" />\n    <Rule Id=\"CA2212\" Action=\"Warning\" />\n    <Rule Id=\"CA2213\" Action=\"Warning\" />\n    <Rule Id=\"CA2214\" Action=\"Warning\" />\n    <Rule Id=\"CA2216\" Action=\"Warning\" />\n    <Rule Id=\"CA2220\" Action=\"Warning\" />\n    <Rule Id=\"CA2229\" Action=\"Warning\" />\n    <Rule Id=\"CA2231\" Action=\"Warning\" />\n    <Rule Id=\"CA2232\" Action=\"Warning\" />\n    <Rule Id=\"CA2235\" Action=\"Warning\" />\n    <Rule Id=\"CA2236\" Action=\"Warning\" />\n    <Rule Id=\"CA2237\" Action=\"Warning\" />\n    <Rule Id=\"CA2238\" Action=\"Warning\" />\n    <Rule Id=\"CA2240\" Action=\"Warning\" />\n    <Rule Id=\"CA2241\" Action=\"Warning\" />\n    <Rule Id=\"CA2242\" Action=\"Warning\" />\n  </Rules>\n  <Rules AnalyzerId=\"LazyMixinAnalyzer\" RuleNamespace=\"LazyMixinAnalyzer\">\n    <Rule Id=\"DoNotUseLazyForProperty\" Action=\"None\" />\n    <Rule Id=\"DoNotUseLazyForReadonlyField\" Action=\"None\" />\n  </Rules>\n</RuleSet>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/LazyMixinDemo/Program.cs",
    "content": "﻿using System;\n\nnamespace LazyMixinDemo\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var sample = new Sample();\n\n            for (int i = 0; i < 4; i++)\n            {\n                sample.Counter.Add();\n                Console.WriteLine(sample.Counter.Count);\n            }\n\n            sample.Reset();\n\n            for (int i = 0; i < 4; i++)\n            {\n                sample.Counter.Add();\n                Console.WriteLine(sample.Counter.Count);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/LazyMixinDemo/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"LazyMixinDemo\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"LazyMixinDemo\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"45a8f3e7-187a-4b11-8470-1bf61f6fa9e7\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/LazyMixinDemo/Sample.cs",
    "content": "﻿using Laziness;\n\nnamespace LazyMixinDemo\n{\n    class Sample\n    {\n        public Counter Counter => _counter.Value;\n\n        private LazyMixin<Counter> _counter;\n\n        // readonly つけてしまうとどうなるか\n        //public Counter Counter => _counter.Value;\n        //private readonly LazyMixin<Counter> _counter;\n\n        // プロパティだとどうなるか\n        //public Counter Counter => _counter.Value;\n        //private LazyMixin<Counter> _counter { get; }\n\n        public void Reset() => _counter.Dispose();\n    }\n}\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/LazyMixinDemo/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"LazyMixin\" version=\"1.0.0.0\" targetFramework=\"net46\" userInstalled=\"true\" />\n</packages>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/NameofDemo/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/NameofDemo/NameofDemo.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{B51ECCF1-812E-4A54-9F7E-0BBF595264FD}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>NameofDemo</RootNamespace>\n    <AssemblyName>NameofDemo</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/NameofDemo/Program.cs",
    "content": "﻿using static System.Console;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        WriteLine(nameof(Person.Id) == \"Id\");\n    }\n}\n\nclass Person\n{\n    public string Id { get; set; }\n    public string Name { get; set; }\n    public int Age { get; set; }\n}\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/NameofDemo/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"NameofDemo\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"NameofDemo\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"b51eccf1-812e-4a54-9f7e-0bbf595264fd\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/NotifyPropertyChangedGeneratorDemo/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/NotifyPropertyChangedGeneratorDemo/NotifyAttribute.cs",
    "content": "﻿// used from NotifyPropertyChangedGenerator\n\nusing System;\nusing System.Diagnostics;\n\nnamespace NotifyPropertyChangedGeneratorDemo\n{\n    [Conditional(\"NEVER_USED_AT_RUNTIME\")]\n    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]\n    internal sealed class NotifyAttribute : Attribute,\n        // option, you can customize naming convention rule\n        NotifyAttribute.IPlain\n    {\n        // naming convention markers\n        internal interface IPlain { }\n        internal interface ILeadingUnderscore { }\n        internal interface ITrailingUnderscore { }\n\n        /// <summary>\n        /// No option.\n        /// </summary>\n        public NotifyAttribute() { }\n\n        /// <summary>\n        /// Specify options.\n        /// </summary>\n        /// <param name=\"compareMethod\">Comppare kind for raise property changed.</param>\n        public NotifyAttribute(NotifyCompareMethod compareMethod) { }\n    }\n\n    [Conditional(\"NEVER_USED_AT_RUNTIME\")]\n    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]\n    internal sealed class NonNotifyAttribute : Attribute\n    {\n\n    }\n\n    /// <summary>\n    /// Compare method in the generated SetProperty method.\n    /// </summary>\n    internal enum NotifyCompareMethod\n    {\n        /*\n            - None: raises `PropertyChanged` at any time when the property set\n            - ReferenceEquals: \n            - EqualityComparer: uses `EqualityComparer<T>.Default.Equals` to compare old and new values\n        */\n        /// <summary>\n        /// Raises `PropertyChanged` at any time when the property set.\n        /// </summary>\n        None,\n\n        /// <summary>\n        /// Uses <see cref=\"object.ReferenceEquals(object, object)\"/> to compare old and new values.\n        /// </summary>\n        ReferenceEquals,\n\n        /// <summary>\n        /// Uses <see cref=\"System.Collections.Generic.EqualityComparer{T}.Default\"/> to compare old and new values.\n        /// </summary>\n        EqualityComparer,\n    }\n}"
  },
  {
    "path": "Demo/2015/CompilerPlatform/NotifyPropertyChangedGeneratorDemo/NotifyPropertyChangedGeneratorDemo.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{0F979A2A-5DD9-42D3-B531-8AA9CCD9DF2D}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>NotifyPropertyChangedGeneratorDemo</RootNamespace>\n    <AssemblyName>NotifyPropertyChangedGeneratorDemo</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>NotifyPropertyChangedGeneratorDemo.ruleset</CodeAnalysisRuleSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>NotifyPropertyChangedGeneratorDemo.ruleset</CodeAnalysisRuleSet>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"NotifyAttribute.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"NotifyPropertyChangedGeneratorDemo.ruleset\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Analyzer Include=\"..\\packages\\NotifyPropertyChangedGenerator.1.1.0.0\\tools\\analyzers\\NotifyPropertyChangedGenerator.dll\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/NotifyPropertyChangedGeneratorDemo/NotifyPropertyChangedGeneratorDemo.ruleset",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RuleSet Name=\"Microsoft Managed Recommended Rules\" Description=\"These rules focus on the most critical problems in your code, including potential security holes, application crashes, and other important logic and design errors. It is recommended to include this rule set in any custom rule set you create for your projects.\" ToolsVersion=\"10.0\">\n  <Localization ResourceAssembly=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.dll\" ResourceBaseName=\"Microsoft.VisualStudio.CodeAnalysis.RuleSets.Strings.Localized\">\n    <Name Resource=\"MinimumRecommendedRules_Name\" />\n    <Description Resource=\"MinimumRecommendedRules_Description\" />\n  </Localization>\n  <Rules AnalyzerId=\"Microsoft.Analyzers.ManagedCodeAnalysis\" RuleNamespace=\"Microsoft.Rules.Managed\">\n    <Rule Id=\"CA1001\" Action=\"Warning\" />\n    <Rule Id=\"CA1009\" Action=\"Warning\" />\n    <Rule Id=\"CA1016\" Action=\"Warning\" />\n    <Rule Id=\"CA1033\" Action=\"Warning\" />\n    <Rule Id=\"CA1049\" Action=\"Warning\" />\n    <Rule Id=\"CA1060\" Action=\"Warning\" />\n    <Rule Id=\"CA1061\" Action=\"Warning\" />\n    <Rule Id=\"CA1063\" Action=\"Warning\" />\n    <Rule Id=\"CA1065\" Action=\"Warning\" />\n    <Rule Id=\"CA1301\" Action=\"Warning\" />\n    <Rule Id=\"CA1400\" Action=\"Warning\" />\n    <Rule Id=\"CA1401\" Action=\"Warning\" />\n    <Rule Id=\"CA1403\" Action=\"Warning\" />\n    <Rule Id=\"CA1404\" Action=\"Warning\" />\n    <Rule Id=\"CA1405\" Action=\"Warning\" />\n    <Rule Id=\"CA1410\" Action=\"Warning\" />\n    <Rule Id=\"CA1415\" Action=\"Warning\" />\n    <Rule Id=\"CA1821\" Action=\"Warning\" />\n    <Rule Id=\"CA1900\" Action=\"Warning\" />\n    <Rule Id=\"CA1901\" Action=\"Warning\" />\n    <Rule Id=\"CA2002\" Action=\"Warning\" />\n    <Rule Id=\"CA2100\" Action=\"Warning\" />\n    <Rule Id=\"CA2101\" Action=\"Warning\" />\n    <Rule Id=\"CA2108\" Action=\"Warning\" />\n    <Rule Id=\"CA2111\" Action=\"Warning\" />\n    <Rule Id=\"CA2112\" Action=\"Warning\" />\n    <Rule Id=\"CA2114\" Action=\"Warning\" />\n    <Rule Id=\"CA2116\" Action=\"Warning\" />\n    <Rule Id=\"CA2117\" Action=\"Warning\" />\n    <Rule Id=\"CA2122\" Action=\"Warning\" />\n    <Rule Id=\"CA2123\" Action=\"Warning\" />\n    <Rule Id=\"CA2124\" Action=\"Warning\" />\n    <Rule Id=\"CA2126\" Action=\"Warning\" />\n    <Rule Id=\"CA2131\" Action=\"Warning\" />\n    <Rule Id=\"CA2132\" Action=\"Warning\" />\n    <Rule Id=\"CA2133\" Action=\"Warning\" />\n    <Rule Id=\"CA2134\" Action=\"Warning\" />\n    <Rule Id=\"CA2137\" Action=\"Warning\" />\n    <Rule Id=\"CA2138\" Action=\"Warning\" />\n    <Rule Id=\"CA2140\" Action=\"Warning\" />\n    <Rule Id=\"CA2141\" Action=\"Warning\" />\n    <Rule Id=\"CA2146\" Action=\"Warning\" />\n    <Rule Id=\"CA2147\" Action=\"Warning\" />\n    <Rule Id=\"CA2149\" Action=\"Warning\" />\n    <Rule Id=\"CA2200\" Action=\"Warning\" />\n    <Rule Id=\"CA2202\" Action=\"Warning\" />\n    <Rule Id=\"CA2207\" Action=\"Warning\" />\n    <Rule Id=\"CA2212\" Action=\"Warning\" />\n    <Rule Id=\"CA2213\" Action=\"Warning\" />\n    <Rule Id=\"CA2214\" Action=\"Warning\" />\n    <Rule Id=\"CA2216\" Action=\"Warning\" />\n    <Rule Id=\"CA2220\" Action=\"Warning\" />\n    <Rule Id=\"CA2229\" Action=\"Warning\" />\n    <Rule Id=\"CA2231\" Action=\"Warning\" />\n    <Rule Id=\"CA2232\" Action=\"Warning\" />\n    <Rule Id=\"CA2235\" Action=\"Warning\" />\n    <Rule Id=\"CA2236\" Action=\"Warning\" />\n    <Rule Id=\"CA2237\" Action=\"Warning\" />\n    <Rule Id=\"CA2238\" Action=\"Warning\" />\n    <Rule Id=\"CA2240\" Action=\"Warning\" />\n    <Rule Id=\"CA2241\" Action=\"Warning\" />\n    <Rule Id=\"CA2242\" Action=\"Warning\" />\n  </Rules>\n  <Rules AnalyzerId=\"NotifyPropertyChangedGenerator\" RuleNamespace=\"NotifyPropertyChangedGenerator\">\n    <Rule Id=\"NotifyPropertyChangedGenerator\" Action=\"Error\" />\n  </Rules>\n</RuleSet>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/NotifyPropertyChangedGeneratorDemo/Program.cs",
    "content": "﻿namespace NotifyPropertyChangedGeneratorDemo\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n\n    [Notify]\n    public class Sample1\n    {\n        public string Name { get; set; }\n        public int X { get; set; }\n        public int Y { get; set; }\n    }\n\n    [Notify(NotifyCompareMethod.None)]\n    public class Sample2\n    {\n        public string Name { get; set; }\n        public int X { get; set; }\n        public int Y { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/NotifyPropertyChangedGeneratorDemo/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"NotifyPropertyChangedGeneratorDemo\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"NotifyPropertyChangedGeneratorDemo\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"0f979a2a-5dd9-42d3-b531-8aa9ccd9df2d\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/NotifyPropertyChangedGeneratorDemo/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"NotifyPropertyChangedGenerator\" version=\"1.1.0.0\" targetFramework=\"net45\" userInstalled=\"true\" />\n</packages>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/QuickActions/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/QuickActions/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace QuickActions\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var x = 0;\n            var y = 0;\n            var p = new Point();\n            Console.WriteLine(p);\n        }\n    }\n\n    class Point\n    {\n        public int X { get; set; }\n        public int Y { get; set; }\n        public int Area => this.X * this.Y;\n        public override string ToString() => $\"({X}, {Y})\";\n    }\n}\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/QuickActions/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"QuickActions\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"QuickActions\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"557c42f7-2403-45eb-8511-6d10c0ffeea8\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/QuickActions/QuickActions.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{557C42F7-2403-45EB-8511-6D10C0FFEEA8}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>QuickActions</RootNamespace>\n    <AssemblyName>QuickActions</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/RecordDemo/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2015/CompilerPlatform/RecordDemo/Program.cs",
    "content": "﻿namespace RecordDemo\n{\n    class Point\n    {\n        public int X { get; }\n        public int Y { get; }\n    }\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/RecordDemo/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"RecordDemo\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"RecordDemo\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"00459108-23f2-4a1c-abf3-9746d87df7ea\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2015/CompilerPlatform/RecordDemo/RecordDemo.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{00459108-23F2-4A1C-ABF3-9746D87DF7EA}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>RecordDemo</RootNamespace>\n    <AssemblyName>RecordDemo</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/Lazy/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/Lazy/Lazy.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{AA6F7A6C-0BF3-40B4-B9FC-8E6D1B0CAAE7}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Lazy</RootNamespace>\n    <AssemblyName>Lazy</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"LazyMixin.V2, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\LazyMixin.2.2.0.0\\lib\\net20\\LazyMixin.V2.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Sample.cs\" />\n    <Compile Include=\"X.cs\" />\n    <Compile Include=\"コード生成デモ用.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Analyzer Include=\"..\\packages\\LazyMixin.2.2.0.0\\tools\\analyzers\\LazyMixinAnalyzer.dll\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/Lazy/Program.cs",
    "content": "﻿using System;\n\nnamespace Lazy\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Console.WriteLine(\"1\");\n\n            var s = new Sample();\n\n            Console.WriteLine(\"2\");\n\n            var x = s.X; // ここで初めて X のコンストラクターが呼ばれる\n\n            Console.WriteLine(\"3\");\n\n/*\n結果:\n\n1\n2\nX のコンストラクター\n3\n*/\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/Lazy/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"Lazy\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Lazy\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります\n[assembly: Guid(\"aa6f7a6c-0bf3-40b4-b9fc-8e6d1b0caae7\")]\n\n// アセンブリのバージョン情報は次の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン\n//      ビルド番号\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/Lazy/Sample.cs",
    "content": "﻿namespace Lazy\n{\n    class Sample\n    {\n        public X X => _x.Value;\n\n        Laziness.LazyMixin<X> _x;\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/Lazy/X.cs",
    "content": "﻿using System;\n\nnamespace Lazy\n{\n    class X\n    {\n        public X()\n        {\n            Console.WriteLine($\"{nameof(X)} のコンストラクター\");\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/Lazy/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"LazyMixin\" version=\"2.2.0.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/Lazy/コード生成デモ用.cs",
    "content": "﻿using Laziness;\n\nnamespace Lazy\n{\n    class コード生成デモ用\n    {\n\n        LazyMixin<X> _x;\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/MyRoslynAnalyzers.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.23107.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Lazy\", \"Lazy\\Lazy.csproj\", \"{AA6F7A6C-0BF3-40B4-B9FC-8E6D1B0CAAE7}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ValueChanged\", \"ValueChanged\\ValueChanged.csproj\", \"{30EF2E4C-F6CE-43E8-A855-E0C571680D56}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RecordConstructor\", \"RecordConstructor\\RecordConstructor.csproj\", \"{1D0137C6-7B34-4E05-87E6-B6007B90003A}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"StructPitfall\", \"StructPitfall\\StructPitfall.csproj\", \"{4F41FB57-27F8-4179-B4E5-3325DF0E3DE2}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NotifyPropertyChanged\", \"NotifyPropertyChanged\\NotifyPropertyChanged.csproj\", \"{5DA9B0DE-F515-4608-95F8-60DD3DFFA47A}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{AA6F7A6C-0BF3-40B4-B9FC-8E6D1B0CAAE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AA6F7A6C-0BF3-40B4-B9FC-8E6D1B0CAAE7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AA6F7A6C-0BF3-40B4-B9FC-8E6D1B0CAAE7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AA6F7A6C-0BF3-40B4-B9FC-8E6D1B0CAAE7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{30EF2E4C-F6CE-43E8-A855-E0C571680D56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{30EF2E4C-F6CE-43E8-A855-E0C571680D56}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{30EF2E4C-F6CE-43E8-A855-E0C571680D56}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{30EF2E4C-F6CE-43E8-A855-E0C571680D56}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1D0137C6-7B34-4E05-87E6-B6007B90003A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1D0137C6-7B34-4E05-87E6-B6007B90003A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1D0137C6-7B34-4E05-87E6-B6007B90003A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1D0137C6-7B34-4E05-87E6-B6007B90003A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4F41FB57-27F8-4179-B4E5-3325DF0E3DE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4F41FB57-27F8-4179-B4E5-3325DF0E3DE2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4F41FB57-27F8-4179-B4E5-3325DF0E3DE2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4F41FB57-27F8-4179-B4E5-3325DF0E3DE2}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5DA9B0DE-F515-4608-95F8-60DD3DFFA47A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5DA9B0DE-F515-4608-95F8-60DD3DFFA47A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5DA9B0DE-F515-4608-95F8-60DD3DFFA47A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5DA9B0DE-F515-4608-95F8-60DD3DFFA47A}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/NotifyPropertyChanged/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/NotifyPropertyChanged/NotifyAttribute.cs",
    "content": "﻿// used from NotifyPropertyChangedGenerator\n\nusing System;\nusing System.Diagnostics;\n\nnamespace NotifyPropertyChanged\n{\n    [Conditional(\"NEVER_USED_AT_RUNTIME\")]\n    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = false, Inherited = false)]\n    internal sealed class NotifyAttribute : Attribute,\n        // option, you can customize naming convention rule\n        NotifyAttribute.IPlain\n    {\n        // naming convention markers\n        internal interface IPlain { }\n        internal interface ILeadingUnderscore { }\n        internal interface ITrailingUnderscore { }\n\n        /// <summary>\n        /// No option.\n        /// </summary>\n        public NotifyAttribute() { }\n\n        /// <summary>\n        /// Specify options.\n        /// </summary>\n        /// <param name=\"compareMethod\">Comppare kind for raise property changed.</param>\n        public NotifyAttribute(NotifyCompareMethod compareMethod) { }\n    }\n\n    [Conditional(\"NEVER_USED_AT_RUNTIME\")]\n    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]\n    internal sealed class NonNotifyAttribute : Attribute\n    {\n\n    }\n\n    /// <summary>\n    /// Compare method in the generated SetProperty method.\n    /// </summary>\n    internal enum NotifyCompareMethod\n    {\n        /*\n            - None: raises `PropertyChanged` at any time when the property set\n            - ReferenceEquals: \n            - EqualityComparer: uses `EqualityComparer<T>.Default.Equals` to compare old and new values\n        */\n        /// <summary>\n        /// Raises `PropertyChanged` at any time when the property set.\n        /// </summary>\n        None,\n\n        /// <summary>\n        /// Uses <see cref=\"object.ReferenceEquals(object, object)\"/> to compare old and new values.\n        /// </summary>\n        ReferenceEquals,\n\n        /// <summary>\n        /// Uses <see cref=\"System.Collections.Generic.EqualityComparer{T}.Default\"/> to compare old and new values.\n        /// </summary>\n        EqualityComparer,\n    }\n}"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/NotifyPropertyChanged/NotifyPropertyChanged.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{5DA9B0DE-F515-4608-95F8-60DD3DFFA47A}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>NotifyPropertyChanged</RootNamespace>\n    <AssemblyName>NotifyPropertyChanged</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"NotifyAttribute.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Sample.cs\" />\n    <Compile Include=\"コード生成デモ用.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Analyzer Include=\"..\\packages\\NotifyPropertyChangedGenerator.1.1.0.1\\analyzers\\dotnet\\cs\\NotifyPropertyChangedGenerator.dll\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/NotifyPropertyChanged/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace NotifyPropertyChanged\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var s = new Sample();\n\n            s.PropertyChanged += (_, e) =>\n            {\n                switch (e.PropertyName)\n                {\n                    case \"X\":\n                        Console.WriteLine($\"X = {s.X}\");\n                        break;\n                    case \"Y\":\n                        Console.WriteLine($\"Y = {s.Y}\");\n                        break;\n                }\n            };\n\n            s.X = 10;\n            s.Y = 20;\n\n/*\n結果:\n\nX = 10\nY = 20\n*/\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/NotifyPropertyChanged/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"NotifyPropertyChanged\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"NotifyPropertyChanged\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります\n[assembly: Guid(\"5da9b0de-f515-4608-95f8-60dd3dffa47a\")]\n\n// アセンブリのバージョン情報は次の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン\n//      ビルド番号\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/NotifyPropertyChanged/Sample.cs",
    "content": "﻿using System.ComponentModel;\n\nnamespace NotifyPropertyChanged\n{\n    [Notify]\n    class Sample : INotifyPropertyChanged\n    {\n        public int X { get { return x; } set { SetProperty(ref x, value, xPropertyChangedEventArgs); } }\n        public int Y { get { return y; } set { SetProperty(ref y, value, yPropertyChangedEventArgs); } }\n\n        #region NotifyPropertyChangedGenerator\n\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        private int x;\n        private static readonly PropertyChangedEventArgs xPropertyChangedEventArgs = new PropertyChangedEventArgs(nameof(X));\n        private int y;\n        private static readonly PropertyChangedEventArgs yPropertyChangedEventArgs = new PropertyChangedEventArgs(nameof(Y));\n\n        private void SetProperty<T>(ref T field, T value, PropertyChangedEventArgs ev)\n        {\n            if (!System.Collections.Generic.EqualityComparer<T>.Default.Equals(field, value))\n            {\n                field = value;\n                PropertyChanged?.Invoke(this, ev);\n            }\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/NotifyPropertyChanged/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"NotifyPropertyChangedGenerator\" version=\"1.1.0.1\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/NotifyPropertyChanged/コード生成デモ用.cs",
    "content": "﻿namespace NotifyPropertyChanged\n{\n    //[Notify] // このコメント外した瞬間、コード生成しない限りエラーに\n    class コード生成デモ用\n    {\n        public int X { get; }\n        public int Y { get; }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/RecordConstructor/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/RecordConstructor/Program.cs",
    "content": "﻿using System;\n\nnamespace RecordConstructor\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var s = new Sample(10, 20);\n\n            Console.WriteLine($\"({s.X}, {s.Y})\");\n/*\n結果:\n\n(10, 29)\n*/\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/RecordConstructor/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"RecordConstructor\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"RecordConstructor\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります\n[assembly: Guid(\"1d0137c6-7b34-4e05-87e6-b6007b90003a\")]\n\n// アセンブリのバージョン情報は次の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン\n//      ビルド番号\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/RecordConstructor/RecordConstructor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{1D0137C6-7B34-4E05-87E6-B6007B90003A}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>RecordConstructor</RootNamespace>\n    <AssemblyName>RecordConstructor</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Sample.cs\" />\n    <Compile Include=\"コード生成デモ用.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Analyzer Include=\"..\\packages\\RecordConstructorGenerator.3.0.0.0\\tools\\analyzers\\RecordConstructorGenerator.dll\" />\n    <Analyzer Include=\"..\\packages\\RecordConstructorGenerator.3.0.0.0\\tools\\analyzers\\System.Composition.AttributedModel.dll\" />\n    <Analyzer Include=\"..\\packages\\RecordConstructorGenerator.3.0.0.0\\tools\\analyzers\\System.Composition.Convention.dll\" />\n    <Analyzer Include=\"..\\packages\\RecordConstructorGenerator.3.0.0.0\\tools\\analyzers\\System.Composition.Hosting.dll\" />\n    <Analyzer Include=\"..\\packages\\RecordConstructorGenerator.3.0.0.0\\tools\\analyzers\\System.Composition.Runtime.dll\" />\n    <Analyzer Include=\"..\\packages\\RecordConstructorGenerator.3.0.0.0\\tools\\analyzers\\System.Composition.TypedParts.dll\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/RecordConstructor/Sample.cs",
    "content": "﻿namespace RecordConstructor\n{\n    class Sample\n    {\n        public int X { get; }\n        public int Y { get; }\n\n        /// <summary>Record Constructor</summary>\n        /// <param name=\"x\"><see cref=\"X\"/></param>\n        /// <param name=\"y\"><see cref=\"Y\"/></param>\n        public Sample(int x = default(int), int y = default(int))\n        {\n            X = x;\n            Y = y;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/RecordConstructor/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"RecordConstructorGenerator\" version=\"3.0.0.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/RecordConstructor/コード生成デモ用.cs",
    "content": "﻿namespace RecordConstructor\n{\n    class コード生成デモ用\n    {\n        public int X { get; }\n        public int Y { get; }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/StructPitfall/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/StructPitfall/Program.cs",
    "content": "﻿using System;\n\nnamespace StructPitfall\n{\n    struct Counter\n    {\n        public int Value { get; private set; }\n\n        public void Count() => Value++;\n\n        public void Reset() => Value = 0;\n    }\n\n    class Program\n    {\n        private static Counter field;\n\n        private readonly static Counter readonlyField;\n\n        private static Counter Property => field;\n\n        static void Main(string[] args)\n        {\n            // フィールド直利用\n            for (int i = 0; i < 3; i++)\n                field.Count();\n\n            Console.WriteLine(field.Value); // 3\n\n            // フィールド、いったんリセット\n            field.Reset();\n\n            // ローカル変数で受ける\n            var local = field;\n            for (int i = 0; i < 3; i++)\n                local.Count();\n\n            Console.WriteLine(field.Value); // 0 のまま\n            Console.WriteLine(local.Value); // 3\n\n            // プロパティごし\n            for (int i = 0; i < 3; i++)\n                Property.Count(); // プロパティ越しなので、コピーが作られてる\n\n            Console.WriteLine(field.Value); // 0 のまま\n            Console.WriteLine(Property.Value); // 0 のまま(の field を改めてコピー)\n\n            // readonly フィールド直利用\n            for (int i = 0; i < 3; i++)\n                readonlyField.Count(); // 実はここでいったんコピーが作られてる\n\n            Console.WriteLine(readonlyField.Value); // 0 のまま\n\n/*\n結果:\n\n3\n0\n3\n0\n0\n0\n*/\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/StructPitfall/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"StructPitfall\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"StructPitfall\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります\n[assembly: Guid(\"4f41fb57-27f8-4179-b4e5-3325df0e3de2\")]\n\n// アセンブリのバージョン情報は次の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン\n//      ビルド番号\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/StructPitfall/StructPitfall.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{4F41FB57-27F8-4179-B4E5-3325DF0E3DE2}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>StructPitfall</RootNamespace>\n    <AssemblyName>StructPitfall</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/ValueChanged/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/ValueChanged/BindableBase.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.ComponentModel;\n\nnamespace ValueChanged\n{\n    class BindableBase : INotifyPropertyChanged\n    {\n        public event PropertyChangedEventHandler PropertyChanged;\n\n        protected void SetProperty<T>(ref T storage, T value, PropertyChangedEventArgs args)\n        {\n            if(!EqualityComparer<T>.Default.Equals(storage, value))\n            {\n                storage = value;\n                PropertyChanged?.Invoke(this, args);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/ValueChanged/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ValueChanged\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var s = new Sample();\n\n            s.PropertyChanged += (_, e) =>\n            {\n                switch (e.PropertyName)\n                {\n                    case \"X\":\n                        Console.WriteLine($\"X = {s.X}\");\n                        break;\n                    case \"Y\":\n                        Console.WriteLine($\"Y = {s.Y}\");\n                        break;\n                }\n            };\n\n            s.X = 10;\n            s.Y = 20;\n\n/*\n結果:\n\nX = 10\nY = 20\n*/\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/ValueChanged/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ValueChanged\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ValueChanged\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります\n[assembly: Guid(\"30ef2e4c-f6ce-43e8-a855-e0c571680d56\")]\n\n// アセンブリのバージョン情報は次の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン\n//      ビルド番号\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/ValueChanged/Sample.ValueChanged.cs",
    "content": "﻿using System.ComponentModel;\n\nnamespace ValueChanged\n{\n    partial class Sample\n    {\n        private NotifyRecord _value;\n\n        public int X { get { return _value.X; } set { SetProperty(ref _value.X, value, XProperty); } }\n        private static readonly PropertyChangedEventArgs XProperty = new PropertyChangedEventArgs(nameof(X));\n        public int Y { get { return _value.Y; } set { SetProperty(ref _value.Y, value, YProperty); } }\n        private static readonly PropertyChangedEventArgs YProperty = new PropertyChangedEventArgs(nameof(Y));\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/ValueChanged/Sample.cs",
    "content": "﻿namespace ValueChanged\n{\n    partial class Sample : BindableBase\n    {\n        struct NotifyRecord\n        {\n            public int X;\n            public int Y;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/ValueChanged/ValueChanged.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{30EF2E4C-F6CE-43E8-A855-E0C571680D56}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ValueChanged</RootNamespace>\n    <AssemblyName>ValueChanged</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"BindableBase.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Sample.cs\" />\n    <Compile Include=\"Sample.ValueChanged.cs\" />\n    <Compile Include=\"コード生成デモ用.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Analyzer Include=\"..\\packages\\ValueChangedGanerator.2.0.0.0\\tools\\analyzers\\ValueChangedGanerator.dll\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/ValueChanged/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"ValueChangedGanerator\" version=\"2.0.0.0\" targetFramework=\"net452\" />\n</packages>"
  },
  {
    "path": "Demo/2015/MyRoslynAnalyzers/ValueChanged/コード生成デモ用.cs",
    "content": "﻿namespace ValueChanged\n{\n    partial class コード生成デモ用 : BindableBase\n    {\n        struct NotifyRecord\n        {\n            public int X;\n            public int Y;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/Channels.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.25928.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TaskLibrary.Channels\", \"src\\TaskLibrary.Channels\\TaskLibrary.Channels.csproj\", \"{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SystemAsync\", \"src\\SystemAsync\\SystemAsync.csproj\", \"{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"src\", \"src\", \"{861CEE1E-E0BD-4748-940B-215AABE2C4C5}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"tests\", \"tests\", \"{E249C39B-3758-4AEB-8203-A78C9903479E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TaskLibrary.Channels.Test\", \"tests\\TaskLibrary.Channels.Test\\TaskLibrary.Channels.Test.csproj\", \"{5ABCEB82-8930-4581-8E9B-B2CD392DC1DA}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"samples\", \"samples\", \"{CEAE20E2-82F6-4288-A0DC-CAA4BC34C6C1}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CardBattle.Models\", \"samples\\CardBattle\\CardBattle.Models\\CardBattle.Models.csproj\", \"{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CardBattle.Client\", \"samples\\CardBattle\\CardBattle.Client\\CardBattle.Client.csproj\", \"{242C5670-ECE8-4223-948A-D7B75B7FEF1B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tNoOpt|Any CPU = NoOpt|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}.NoOpt|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}.NoOpt|Any CPU.Build.0 = Release|Any CPU\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}.NoOpt|Any CPU.ActiveCfg = NoOpt|Any CPU\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}.NoOpt|Any CPU.Build.0 = NoOpt|Any CPU\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5ABCEB82-8930-4581-8E9B-B2CD392DC1DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5ABCEB82-8930-4581-8E9B-B2CD392DC1DA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5ABCEB82-8930-4581-8E9B-B2CD392DC1DA}.NoOpt|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5ABCEB82-8930-4581-8E9B-B2CD392DC1DA}.NoOpt|Any CPU.Build.0 = Release|Any CPU\n\t\t{5ABCEB82-8930-4581-8E9B-B2CD392DC1DA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5ABCEB82-8930-4581-8E9B-B2CD392DC1DA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}.NoOpt|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}.NoOpt|Any CPU.Build.0 = Release|Any CPU\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B}.NoOpt|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B}.NoOpt|Any CPU.Build.0 = Release|Any CPU\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C} = {861CEE1E-E0BD-4748-940B-215AABE2C4C5}\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9} = {861CEE1E-E0BD-4748-940B-215AABE2C4C5}\n\t\t{5ABCEB82-8930-4581-8E9B-B2CD392DC1DA} = {E249C39B-3758-4AEB-8203-A78C9903479E}\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440} = {CEAE20E2-82F6-4288-A0DC-CAA4BC34C6C1}\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B} = {CEAE20E2-82F6-4288-A0DC-CAA4BC34C6C1}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/App.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\"/>\n    </startup>\n</configuration>\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/App.xaml",
    "content": "﻿<Application x:Class=\"CardBattle.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:CardBattle\"\n             xmlns:views=\"clr-namespace:CardBattle.Views\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n        <views:SuitBrushConverter x:Key=\"suitBrush\" />\n        <views:SuitStringConverter x:Key=\"suitString\" />\n        <views:NumberTextConverter x:Key=\"numString\" />\n        <views:PlayerColorConverter x:Key=\"playerColor\" />\n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace CardBattle\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/CardBattle.Client.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{242C5670-ECE8-4223-948A-D7B75B7FEF1B}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>CardBattle.Client</RootNamespace>\n    <AssemblyName>CardBattle.Client</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <WarningLevel>4</WarningLevel>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>CardBattle.Client.ruleset</CodeAnalysisRuleSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <CodeAnalysisRuleSet>CardBattle.Client.ruleset</CodeAnalysisRuleSet>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xaml\">\n      <RequiredTargetFramework>4.0</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Compile Include=\"Views\\CommandSelectControl.xaml.cs\">\n      <DependentUpon>CommandSelectControl.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"Views\\ContinuePromptControl.xaml.cs\">\n      <DependentUpon>ContinuePromptControl.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"Views\\Extensions.cs\" />\n    <Compile Include=\"Views\\NumberTextConverter.cs\" />\n    <Compile Include=\"Views\\PlayAreaControl.xaml.cs\">\n      <DependentUpon>PlayAreaControl.xaml</DependentUpon>\n    </Compile>\n    <Compile Include=\"Views\\PlayerColorConverter.cs\" />\n    <Compile Include=\"Views\\SuitBrushConverter.cs\" />\n    <Compile Include=\"Views\\SuitStringConverter.cs\" />\n    <Page Include=\"MainWindow.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"MainWindow.xaml.cs\">\n      <DependentUpon>MainWindow.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Page Include=\"Views\\CommandSelectControl.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"Views\\ContinuePromptControl.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"Views\\PlayAreaControl.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <None Include=\"CardBattle.Client.ruleset\" />\n    <None Include=\"project.json\" />\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <AppDesigner Include=\"Properties\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\..\\src\\SystemAsync\\SystemAsync.csproj\">\n      <Project>{f861e95e-72c0-47e1-b282-f8fdbb79c8d9}</Project>\n      <Name>SystemAsync</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\..\\src\\TaskLibrary.Channels\\TaskLibrary.Channels.csproj\">\n      <Project>{a46dbf03-3d5e-4580-8bb0-fd5da4f1188c}</Project>\n      <Name>TaskLibrary.Channels</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\CardBattle.Models\\CardBattle.Models.csproj\">\n      <Project>{80ade6d3-1d9c-44e6-8688-ed2c8a6d7440}</Project>\n      <Name>CardBattle.Models</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/CardBattle.Client.ruleset",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RuleSet Name=\"Rules for CardBattle.Client\" Description=\"Code analysis rules for CardBattle.Client.csproj.\" ToolsVersion=\"15.0\">\n  <Rules AnalyzerId=\"Microsoft.Analyzers.ManagedCodeAnalysis\" RuleNamespace=\"Microsoft.Rules.Managed\">\n    <Rule Id=\"CA1001\" Action=\"Warning\" />\n    <Rule Id=\"CA1009\" Action=\"Warning\" />\n    <Rule Id=\"CA1016\" Action=\"Warning\" />\n    <Rule Id=\"CA1033\" Action=\"Warning\" />\n    <Rule Id=\"CA1049\" Action=\"Warning\" />\n    <Rule Id=\"CA1060\" Action=\"Warning\" />\n    <Rule Id=\"CA1061\" Action=\"Warning\" />\n    <Rule Id=\"CA1063\" Action=\"Warning\" />\n    <Rule Id=\"CA1065\" Action=\"Warning\" />\n    <Rule Id=\"CA1301\" Action=\"Warning\" />\n    <Rule Id=\"CA1400\" Action=\"Warning\" />\n    <Rule Id=\"CA1401\" Action=\"Warning\" />\n    <Rule Id=\"CA1403\" Action=\"Warning\" />\n    <Rule Id=\"CA1404\" Action=\"Warning\" />\n    <Rule Id=\"CA1405\" Action=\"Warning\" />\n    <Rule Id=\"CA1410\" Action=\"Warning\" />\n    <Rule Id=\"CA1415\" Action=\"Warning\" />\n    <Rule Id=\"CA1821\" Action=\"Warning\" />\n    <Rule Id=\"CA1900\" Action=\"Warning\" />\n    <Rule Id=\"CA1901\" Action=\"Warning\" />\n    <Rule Id=\"CA2002\" Action=\"Warning\" />\n    <Rule Id=\"CA2100\" Action=\"Warning\" />\n    <Rule Id=\"CA2101\" Action=\"Warning\" />\n    <Rule Id=\"CA2108\" Action=\"Warning\" />\n    <Rule Id=\"CA2111\" Action=\"Warning\" />\n    <Rule Id=\"CA2112\" Action=\"Warning\" />\n    <Rule Id=\"CA2114\" Action=\"Warning\" />\n    <Rule Id=\"CA2116\" Action=\"Warning\" />\n    <Rule Id=\"CA2117\" Action=\"Warning\" />\n    <Rule Id=\"CA2122\" Action=\"Warning\" />\n    <Rule Id=\"CA2123\" Action=\"Warning\" />\n    <Rule Id=\"CA2124\" Action=\"Warning\" />\n    <Rule Id=\"CA2126\" Action=\"Warning\" />\n    <Rule Id=\"CA2131\" Action=\"Warning\" />\n    <Rule Id=\"CA2132\" Action=\"Warning\" />\n    <Rule Id=\"CA2133\" Action=\"Warning\" />\n    <Rule Id=\"CA2134\" Action=\"Warning\" />\n    <Rule Id=\"CA2137\" Action=\"Warning\" />\n    <Rule Id=\"CA2138\" Action=\"Warning\" />\n    <Rule Id=\"CA2140\" Action=\"Warning\" />\n    <Rule Id=\"CA2141\" Action=\"Warning\" />\n    <Rule Id=\"CA2146\" Action=\"Warning\" />\n    <Rule Id=\"CA2147\" Action=\"Warning\" />\n    <Rule Id=\"CA2149\" Action=\"Warning\" />\n    <Rule Id=\"CA2200\" Action=\"Warning\" />\n    <Rule Id=\"CA2202\" Action=\"Warning\" />\n    <Rule Id=\"CA2207\" Action=\"Warning\" />\n    <Rule Id=\"CA2212\" Action=\"Warning\" />\n    <Rule Id=\"CA2213\" Action=\"Warning\" />\n    <Rule Id=\"CA2214\" Action=\"Warning\" />\n    <Rule Id=\"CA2216\" Action=\"Warning\" />\n    <Rule Id=\"CA2220\" Action=\"Warning\" />\n    <Rule Id=\"CA2229\" Action=\"Warning\" />\n    <Rule Id=\"CA2231\" Action=\"Warning\" />\n    <Rule Id=\"CA2232\" Action=\"Warning\" />\n    <Rule Id=\"CA2235\" Action=\"Warning\" />\n    <Rule Id=\"CA2236\" Action=\"Warning\" />\n    <Rule Id=\"CA2237\" Action=\"Warning\" />\n    <Rule Id=\"CA2238\" Action=\"Warning\" />\n    <Rule Id=\"CA2240\" Action=\"Warning\" />\n    <Rule Id=\"CA2241\" Action=\"Warning\" />\n    <Rule Id=\"CA2242\" Action=\"Warning\" />\n  </Rules>\n  <Rules AnalyzerId=\"Microsoft.CodeAnalysis.CSharp\" RuleNamespace=\"Microsoft.CodeAnalysis.CSharp\">\n    <Rule Id=\"CS1998\" Action=\"Info\" />\n  </Rules>\n</RuleSet>"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"CardBattle.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:CardBattle\"\n        xmlns:views=\"clr-namespace:CardBattle.Views\"\n        mc:Ignorable=\"d\"\n        Title=\"MainWindow\" Height=\"350\" Width=\"600\">\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"auto\"/>\n            <RowDefinition Height=\"auto\"/>\n        </Grid.RowDefinitions>\n        <views:PlayAreaControl x:Name=\"playArea\" Margin=\"10\" />\n        <views:CommandSelectControl x:Name=\"command\" Visibility=\"Collapsed\" Grid.Row=\"1\" Margin=\"10\" />\n        <views:ContinuePromptControl x:Name=\"continue\" Visibility=\"Collapsed\" Grid.Row=\"1\" Margin=\"10\" />\n        <TextBlock x:Name=\"generalMessage\" FontSize=\"20\" Visibility=\"Collapsed\" Grid.Row=\"1\" Margin=\"10\" />\n        <Button x:Name=\"generalButton\" Content=\"run\" FontSize=\"20\" Visibility=\"Collapsed\" Grid.Row=\"1\" Margin=\"10\" />\n    </Grid>\n</Window>\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/MainWindow.xaml.cs",
    "content": "﻿using CardBattle.Models;\nusing CardBattle.Models.GameRules;\nusing CardBattle.Models.Messages;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing TaskLibrary.Channels;\nusing static TaskLibrary.Channels.TypedAsyncAction<CardBattle.Models.Messages.GameProgress>;\n\nnamespace CardBattle\n{\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n\n            Loaded += MainWindow_Loaded;\n            System.Diagnostics.Debug.WriteLine(\"ctor \" + Thread.CurrentThread.ManagedThreadId);\n        }\n\n        private void MainWindow_Loaded(object sender, RoutedEventArgs e)\n        {\n            //TestPlayArea();\n            TestEngine();\n            //TestApi();\n        }\n\n        #region Chanel の listen。いずれ別クラスに移す。\n\n        /// <summary>\n        /// 自分のプレイヤーID。\n        /// このIDのやつだけ手作業コマンド選択。\n        /// 残りはAIプレイのつもり。\n        /// </summary>\n        const int MyPlayerId = 0;\n\n        private async void TestEngine()\n        {\n            System.Diagnostics.Debug.WriteLine(\"begin \" + Thread.CurrentThread.ManagedThreadId);\n            const int Players = 5;\n\n            var r = new Random();\n            var abilities = Enumerable.Range(0, Players).Select(i => GetRandomAbility(r,\n#if false\n                i // プレイヤーごとに強さを変えたいとき用\n#else\n                // プレイヤーの強さをそろえたいとき用\n                //4 // 勝つ\n                //3 // ぎりぎり勝てるくらい\n                2 // 負ける\n                //1 // 一撃死\n#endif\n                )).ToArray();\n\n            var c = new Channel<GameProgress>();\n            var d = c.ObserveOn().Distribute();\n\n            // MyPlayerId な IResponsiveMessage だけ受け取る\n            var playerChannel = d.GetChannel(0);\n            playerChannel.Subscribe(\n                Create<CommandPrompt>((x, ct) => OnCommandPrompt(x, r)),\n                Create<ContinuePrompt>((x, ct) => OnContinuePrompt(x, r))\n                );\n\n            // MyPlayerId でない IResponsiveMessage だけ受け取る\n            var aiChannel = d.Filter(x => x.Address != null && x.Address != 0, x => x.Message);\n            aiChannel.Subscribe(\n                Create<CommandPrompt>((x, ct) => OnAiCommandPrompt(x, r)),\n                Create<ContinuePrompt>((x, ct) => OnAiContinuePrompt(x, r))\n                );\n\n            // その他のメッセージ用\n            var generalChannel = d.GetChannel(null);\n            generalChannel.Subscribe(\n                Create<FinishGame>(OnFinishGame),\n                Create<TurnStarted>(OnTurnStarted),\n                Create<PlayerAttack>(OnPlayerAttack),\n                Create<BossAttack>(OnBossAttack),\n                Create<Continue>(OnContinue)\n                );\n\n            var engine = new GameEngine(c.WithCancel(CancellationToken.None), r.Next(), abilities);\n\n            //IsEnabled = false;\n\n            try\n            {\n                playArea.DataContext = engine;\n                await c.Completed;\n            }\n            finally\n            {\n                //IsEnabled = true;\n            }\n        }\n\n        private async Task OnContinue(Continue x, CancellationToken ct)\n        {\n            System.Diagnostics.Debug.WriteLine(\"OnContinue \" + Thread.CurrentThread.ManagedThreadId);\n            System.Diagnostics.Debug.WriteLine($\"continued : {string.Join(\", \", x.Players.Select(p => p.Id))}\");\n\n            generalMessage.Visibility = Visibility.Visible;\n            generalMessage.Text = $\"プレイヤー{string.Join(\", \", x.Players.Select(p => p.Id))}がコンティニューしました\";\n            await Task.Delay(1000);\n            generalMessage.Text = \"\";\n            generalMessage.Visibility = Visibility.Collapsed;\n        }\n\n        private async Task OnAiContinuePrompt(ContinuePrompt x, Random r)\n        {\n            System.Diagnostics.Debug.WriteLine(\"OnAiContinuePrompt \" + Thread.CurrentThread.ManagedThreadId);\n\n            var continued = false;\n            // 20% の確率でコンティニューさせとく\n            if(r.NextDouble() < 0.2)\n            {\n                x.Confirm();\n                continued = true;\n            }\n\n            System.Diagnostics.Debug.WriteLine($\"continue : ({x.PlayerId}) {continued}\");\n        }\n\n        private async Task OnContinuePrompt(ContinuePrompt x, Random r)\n        {\n            System.Diagnostics.Debug.WriteLine(\"OnContinuePrompt \" + Thread.CurrentThread.ManagedThreadId);\n            System.Diagnostics.Debug.WriteLine($\"continue : ({x.PlayerId})\");\n\n            @continue.Visibility = Visibility.Visible;\n\n            var res = await @continue.SelectAsync(CancellationToken.None);\n\n            if (res) x.Confirm();\n\n            @continue.Visibility = Visibility.Collapsed;\n        }\n\n        private async Task OnFinishGame(FinishGame x, CancellationToken ct)\n        {\n            System.Diagnostics.Debug.WriteLine(\"OnFinishGame \" + Thread.CurrentThread.ManagedThreadId);\n            System.Diagnostics.Debug.WriteLine($\"finished: {x.Status} in turn {x.Turn}, boss: {x.BossHp}, players: {string.Join(\", \", x.Players.Select(p => p.Hp))}\");\n        }\n\n        private async Task OnAiCommandPrompt(CommandPrompt x, Random r)\n        {\n            System.Diagnostics.Debug.WriteLine(\"OnAiCommandPrompt \" + Thread.CurrentThread.ManagedThreadId);\n            System.Diagnostics.Debug.WriteLine($\"command : ({x.PlayerId}) {string.Join(\", \", x.Hand.Cards)}\");\n\n            command.Visibility = Visibility.Visible;\n            command.DataContext = x;\n\n            // ランダムに0～4枚 redraw\n            var indexes = Enumerable.Range(0, r.Next(0, 5)).Select(_ => r.Next(0, 5)).Distinct().ToArray();\n\n            await command.ShowAsync(indexes, CancellationToken.None);\n\n            if (indexes.Any())\n                x.Redraw(indexes);\n\n            command.Visibility = Visibility.Collapsed;\n        }\n\n        private async Task OnCommandPrompt(CommandPrompt x, Random r)\n        {\n            System.Diagnostics.Debug.WriteLine(\"OnCommandPrompt \" + Thread.CurrentThread.ManagedThreadId);\n            System.Diagnostics.Debug.WriteLine($\"command : ({x.PlayerId}) {string.Join(\", \", x.Hand.Cards)}\");\n\n            command.Visibility = Visibility.Visible;\n            command.DataContext = x;\n\n            var indexes = await command.SelectAsync(CancellationToken.None);\n\n            System.Diagnostics.Debug.WriteLine($\"selection: ({x.PlayerId}) {string.Join(\", \", indexes)}\");\n\n            if (indexes.Any())\n                x.Redraw(indexes);\n\n            command.Visibility = Visibility.Collapsed;\n        }\n\n        private async Task OnTurnStarted(TurnStarted x, CancellationToken ct)\n        {\n            System.Diagnostics.Debug.WriteLine(\"OnTurnStarted \" + Thread.CurrentThread.ManagedThreadId);\n            System.Diagnostics.Debug.WriteLine($\"---- ターン{x.Turn} ----\");\n        }\n\n        private async Task OnPlayerAttack(PlayerAttack x, CancellationToken ct)\n        {\n            System.Diagnostics.Debug.WriteLine(\"OnPlayerAttack \" + Thread.CurrentThread.ManagedThreadId);\n            System.Diagnostics.Debug.WriteLine($\"attacked: ({x.Player.Id}) {string.Join(\", \", x.Hand.Cards)} / {x.Damage} => {x.BossHp}\");\n\n            await playArea.ShowAttack(x);\n        }\n\n        private async Task OnBossAttack(BossAttack x, CancellationToken ct)\n        {\n            System.Diagnostics.Debug.WriteLine(\"OnBossAttack \" + Thread.CurrentThread.ManagedThreadId);\n            System.Diagnostics.Debug.WriteLine($\"Boss attacks\");\n\n            await playArea.ShowAttack(x);\n        }\n\n        #endregion\n        #region PlayArea直接テスト\n\n        private static void TestPlayArea()\n        {\n            const int Players = 5;\n            const int Turns = 500;\n\n            var x = new PlayArea(0, Players);\n            var r = new Random();\n\n            var abilities = Enumerable.Range(0, Players).Select(i => GetRandomAbility(r, i)).ToArray();\n\n            var sum = new int[Players];\n\n            for (int turn = 0; turn < Turns; turn++)\n            {\n                System.Diagnostics.Debug.WriteLine($\"----- ターン {turn} -----\");\n                for (int player = 0; player < Players; player++)\n                {\n                    var p = x.Players[player];\n                    var a = abilities[player];\n                    var score = Judge.Score(p, a);\n                    sum[player] += score;\n                    System.Diagnostics.Debug.WriteLine($\"{player}: {string.Join(\", \", p.Cards)} → {score}\");\n\n                    var redrawIndexes = Enumerable.Range(0, r.Next(5)).Select(_ => r.Next(5)).Distinct().ToArray();\n                    x.Redraw(player, redrawIndexes);\n                }\n            }\n\n            System.Diagnostics.Debug.WriteLine(\"----- 平均 -----\");\n            for (int player = 0; player < Players; player++)\n            {\n                var s = sum[player];\n                var average = s / (double)Turns;\n                System.Diagnostics.Debug.WriteLine($\"{player}: {average}\");\n            }\n        }\n\n        #endregion\n        #region テスト用のランダムデータ作り\n\n        /// <summary>\n        /// テスト用の乱数生成能力値。\n        /// レベル帯 0～4で、20以下、40以下、60以下、80以下、100以下、くらいの能力値を想定。\n        ///\n        /// 試しにやってみたら、\n        /// L1帯でスコア5000～1万\n        /// L4帯でスコア5万～10万\n        /// くらいだったので、HPは同レベル対戦で10ターンくらい続く想定で5万～100万くらいで作ってみる。\n        /// </summary>\n        /// <param name=\"random\"></param>\n        /// <param name=\"level\"></param>\n        /// <returns></returns>\n        private static Ability GetRandomAbility(Random random, int level)\n        {\n            var i = level;\n            var j = level + 1;\n            return new Ability(\n                (int)(random.Next(2000, 3000) * Math.Pow(2.5, i) * 10), // L1帯で6万、L4帯で97万くらいの平均値になるはず\n                random.Next(20 * i, 20 * j),\n                random.Next(20 * i, 20 * j),\n                random.Next(20 * i, 20 * j),\n                random.Next(20 * i, 20 * j),\n                random.Next(20 * i, 20 * j),\n                random.Next(20 * i, 20 * j),\n                random.Next(20 * i, 20 * j),\n                random.Next(20 * i, 20 * j)\n                );\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"CardBattle.Client\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"CardBattle.Client\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n//In order to begin building localizable applications, set \n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\n//inside a <PropertyGroup>.  For example, if you are using US english\n//in your source files, set the <UICulture> to en-US.  Then uncomment\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\n//the line below to match the UICulture setting in the project file.\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n                                     //(used if a resource is not found in the page, \n                                     // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n                                              //(used if a resource is not found in the page, \n                                              // app, or any theme specific resource dictionaries)\n)]\n\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace CardBattle.Client.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"CardBattle.Client.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace CardBattle.Client.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"15.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Views/CommandSelectControl.xaml",
    "content": "﻿<UserControl x:Class=\"CardBattle.Views.CommandSelectControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:CardBattle.Views\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"300\" d:DesignWidth=\"300\"\n             FontSize=\"20\">\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"auto\"/>\n            <RowDefinition Height=\"84\"/>\n            <RowDefinition Height=\"auto\"/>\n        </Grid.RowDefinitions>\n\n        <StackPanel Orientation=\"Horizontal\" TextBlock.Foreground=\"{Binding PlayerId, Converter={StaticResource playerColor}}\">\n            <TextBlock>捨てるカードを選んで(プレイヤー </TextBlock>\n            <TextBlock Text=\"{Binding PlayerId}\" />\n            <TextBlock>)</TextBlock>\n        </StackPanel>\n\n        <ListView x:Name=\"list\" ItemsSource=\"{Binding Cards}\" SelectionMode=\"Multiple\" Grid.Row=\"1\">\n            <ListView.ItemsPanel>\n                <ItemsPanelTemplate>\n                    <StackPanel Orientation=\"Horizontal\" />\n                </ItemsPanelTemplate>\n            </ListView.ItemsPanel>\n            <ListView.ItemTemplate>\n                <DataTemplate>\n                    <Border Width=\"60\" BorderBrush=\"{Binding Suit, Converter={StaticResource suitBrush}}\" BorderThickness=\"2\">\n                        <StackPanel HorizontalAlignment=\"Center\">\n                            <TextBlock TextAlignment=\"Center\" FontSize=\"30\" Text=\"{Binding Suit, Converter={StaticResource suitString}}\" Foreground=\"{Binding Suit, Converter={StaticResource suitBrush}}\" />\n                            <TextBlock TextAlignment=\"Center\" FontSize=\"20\" Text=\"{Binding Number, Converter={StaticResource numString}}\" Foreground=\"{Binding Suit, Converter={StaticResource suitBrush}}\" />\n                        </StackPanel>\n                    </Border>\n                </DataTemplate>\n            </ListView.ItemTemplate>\n        </ListView>\n\n        <Button Content=\"決定\" Grid.Row=\"2\" x:Name=\"ok\" />\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Views/CommandSelectControl.xaml.cs",
    "content": "﻿using System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows.Controls;\n\nnamespace CardBattle.Views\n{\n    /// <summary>\n    /// コマンド選択(捨てる手札の選択)画面。\n    /// </summary>\n    public partial class CommandSelectControl : UserControl\n    {\n        public CommandSelectControl()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// 決定ボタンを押すまで待機。\n        /// </summary>\n        /// <returns>決定時に選択されていたインデックス。</returns>\n        public async Task<int[]> SelectAsync(CancellationToken ct)\n        {\n            ok.IsEnabled = true;\n            ok.Visibility = System.Windows.Visibility.Visible;\n\n            await ok.FirstClick(ct);\n\n            var items = list.ItemsSource.Cast<object>().ToArray();\n            return Enumerable.Range(0, items.Length)\n                .Where(i => list.SelectedItems.Contains(items[i]))\n                .ToArray();\n        }\n\n        /// <summary>\n        /// AI用。\n        /// 手札を0.5秒表示 → AI選択したカードを選択して0.5秒表示。\n        /// </summary>\n        /// <param name=\"selectedIndexes\">AIが選択したインデックス。</param>\n        /// <param name=\"ct\"></param>\n        public async Task ShowAsync(int[] selectedIndexes, CancellationToken ct)\n        {\n            ok.IsEnabled = false;\n            ok.Visibility = System.Windows.Visibility.Collapsed;\n\n            await Task.Delay(500);\n\n            var items = ((System.Collections.IList)list.ItemsSource);\n            list.SelectedItems.Clear();\n            foreach (var i in selectedIndexes)\n            {\n                list.SelectedItems.Add(items[i]);\n            }\n\n            await Task.Delay(500);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Views/ContinuePromptControl.xaml",
    "content": "﻿<UserControl x:Class=\"CardBattle.Views.ContinuePromptControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:CardBattle.Views\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"300\" d:DesignWidth=\"300\"\n             FontSize=\"20\">\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"auto\"/>\n            <RowDefinition Height=\"auto\"/>\n        </Grid.RowDefinitions>\n\n        <StackPanel Orientation=\"Horizontal\" TextBlock.Foreground=\"{Binding PlayerId, Converter={StaticResource playerColor}}\">\n            <TextBlock>プレイヤー</TextBlock>\n            <TextBlock Text=\"{Binding PlayerId}\" />\n            <TextBlock>のコンティニューをしますか？</TextBlock>\n        </StackPanel>\n\n        <StackPanel Orientation=\"Horizontal\" Grid.Row=\"2\">\n            <Button Content=\"はい\" x:Name=\"yes\" Width=\"60\" Margin=\"5\" />\n            <Button Content=\"いいえ\" x:Name=\"no\" Width=\"60\" Margin=\"5\" />\n        </StackPanel>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Views/ContinuePromptControl.xaml.cs",
    "content": "﻿using System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows.Controls;\n\nnamespace CardBattle.Views\n{\n    /// <summary>\n    /// コンティニュー催促に対して「はい」「いいえ」を答えるUI。\n    /// </summary>\n    public partial class ContinuePromptControl : UserControl\n    {\n        public ContinuePromptControl()\n        {\n            InitializeComponent();\n        }\n\n        /// <summary>\n        /// 決定ボタンを押すまで待機。\n        /// </summary>\n        /// <returns>「はい」ならtrue、「いいえ」ならfalse。</returns>\n        public async Task<bool> SelectAsync(CancellationToken ct)\n        {\n            var cts = CancellationTokenSource.CreateLinkedTokenSource(ct);\n\n            var y = yes.FirstClick(cts.Token);\n            var n = no.FirstClick(cts.Token);\n\n            var res = await Task.WhenAny(y, n);\n\n            cts.Cancel();\n\n            return res == y;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Views/Extensions.cs",
    "content": "﻿using System;\nusing System.Reactive.Linq;\nusing System.Reactive.Threading.Tasks;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Media.Animation;\n\nnamespace CardBattle.Views\n{\n    static class Extensions\n    {\n        /// <summary>\n        /// ボタンが1回押されるのを待つタスクを作る。\n        /// </summary>\n        /// <param name=\"b\"></param>\n        /// <param name=\"ct\"></param>\n        /// <returns></returns>\n        public static Task FirstClick(this Button b, CancellationToken ct)\n            => Observable.FromEventPattern<RoutedEventHandler, RoutedEventArgs>(\n                h => b.Click += h,\n                h => b.Click -= h)\n            .FirstAsync()\n            .ToTask(ct);\n\n        /// <summary>\n        /// ストーリーボードの再生。\n        /// </summary>\n        /// <param name=\"storyboard\"></param>\n        /// <returns>再生完了待ちタスク。</returns>\n        public static Task PlayAsync(this Storyboard storyboard)\n        {\n            TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();\n            if (storyboard == null)\n                tcs.SetException(new ArgumentNullException());\n            else\n            {\n                EventHandler onComplete = null;\n                onComplete = (s, e) => {\n                    storyboard.Completed -= onComplete;\n                    tcs.SetResult(true);\n                };\n                storyboard.Completed += onComplete;\n                storyboard.Begin();\n            }\n            return tcs.Task;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Views/NumberTextConverter.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing System.Windows.Data;\n\nnamespace CardBattle.Views\n{\n    public class NumberTextConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            var num = (int)value;\n\n            switch (num)\n            {\n                default: return num.ToString();\n                case 1: return \"A\";\n                case 11: return \"J\";\n                case 12: return \"Q\";\n                case 13: return \"K\";\n                case 15: return \"\"; // Joker\n            }\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Views/PlayAreaControl.xaml",
    "content": "﻿<UserControl x:Class=\"CardBattle.Views.PlayAreaControl\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" \n             xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" \n             xmlns:local=\"clr-namespace:CardBattle.Views\"\n             mc:Ignorable=\"d\" \n             d:DesignHeight=\"300\" d:DesignWidth=\"300\"\n             FontSize=\"20\">\n    <Grid>\n        <Grid.ColumnDefinitions>\n            <ColumnDefinition Width=\"150\"/>\n            <ColumnDefinition Width=\"*\"/>\n        </Grid.ColumnDefinitions>\n\n        <Grid Grid.Column=\"0\" DataContext=\"{Binding Boss}\">\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"40\"/>\n                <RowDefinition Height=\"auto\"/>\n                <RowDefinition Height=\"auto\"/>\n            </Grid.RowDefinitions>\n            <TextBlock FontSize=\"30\" Grid.Row=\"0\">ボス</TextBlock>\n            <StackPanel Orientation=\"Horizontal\" Grid.Row=\"1\">\n                <TextBlock>HP: </TextBlock>\n                <TextBlock Text=\"{Binding Hp}\" />\n            </StackPanel>\n            <StackPanel x:Name=\"bossAttackPanel\" Grid.Row=\"2\" Visibility=\"Collapsed\">\n                <ItemsControl ItemsSource=\"{Binding Attacks}\">\n                    <ItemsControl.ItemTemplate>\n                        <DataTemplate>\n                            <StackPanel Orientation=\"Horizontal\">\n                                <TextBlock>P(</TextBlock>\n                                <TextBlock Text=\"{Binding Player.Id}\" />\n                                <TextBlock>)に</TextBlock>\n                                <TextBlock Text=\"{Binding Damage}\" />\n                                <TextBlock>ダメージ</TextBlock>\n                            </StackPanel>\n                        </DataTemplate>\n                    </ItemsControl.ItemTemplate>\n                </ItemsControl>\n            </StackPanel>\n            <StackPanel x:Name=\"playerAttackPanel\" Grid.Row=\"2\" HorizontalAlignment=\"Center\" Visibility=\"Collapsed\">\n                <StackPanel Orientation=\"Horizontal\">\n                    <TextBlock>プレイヤー(</TextBlock>\n                    <TextBlock Text=\"{Binding Player.Id}\" />\n                    <TextBlock>)の攻撃</TextBlock>\n                </StackPanel>\n                <TextBlock Text=\"{Binding Damage}\"/>\n                <ItemsControl ItemsSource=\"{Binding Cards}\">\n                    <ItemsControl.ItemsPanel>\n                        <ItemsPanelTemplate>\n                            <StackPanel Orientation=\"Horizontal\" />\n                        </ItemsPanelTemplate>\n                    </ItemsControl.ItemsPanel>\n                    <ItemsControl.ItemTemplate>\n                        <DataTemplate>\n                            <Border BorderBrush=\"{Binding Suit, Converter={StaticResource suitBrush}}\" BorderThickness=\"1\">\n                                <StackPanel Orientation=\"Horizontal\">\n                                    <TextBlock TextAlignment=\"Center\" FontSize=\"10\" Text=\"{Binding Suit, Converter={StaticResource suitString}}\" Foreground=\"{Binding Suit, Converter={StaticResource suitBrush}}\" />\n                                    <TextBlock TextAlignment=\"Center\" FontSize=\"10\" Text=\"{Binding Number, Converter={StaticResource numString}}\" Foreground=\"{Binding Suit, Converter={StaticResource suitBrush}}\" />\n                                </StackPanel>\n                            </Border>\n                        </DataTemplate>\n                    </ItemsControl.ItemTemplate>\n                </ItemsControl>\n            </StackPanel>\n        </Grid>\n\n        <Grid Grid.Column=\"1\" DataContext=\"{Binding Players}\">\n            <ItemsControl ItemsSource=\"{Binding}\" FontSize=\"15\">\n                <ItemsControl.ItemTemplate>\n                    <DataTemplate>\n                        <StackPanel Orientation=\"Horizontal\" TextBlock.Foreground=\"{Binding Id, Converter={StaticResource playerColor}}\">\n                            <TextBlock>プレイヤー(</TextBlock>\n                            <TextBlock Text=\"{Binding Id}\" />\n                            <TextBlock>) HP: </TextBlock>\n                            <TextBlock Text=\"{Binding Hp}\" />\n                            <TextBlock Text=\"  \" />\n                            <ItemsControl ItemsSource=\"{Binding Cards}\">\n                                <ItemsControl.ItemsPanel>\n                                    <ItemsPanelTemplate>\n                                        <StackPanel Orientation=\"Horizontal\" />\n                                    </ItemsPanelTemplate>\n                                </ItemsControl.ItemsPanel>\n                                <ItemsControl.ItemTemplate>\n                                    <DataTemplate>\n                                        <Border BorderBrush=\"{Binding Suit, Converter={StaticResource suitBrush}}\" BorderThickness=\"1\">\n                                            <StackPanel Orientation=\"Horizontal\">\n                                                <TextBlock TextAlignment=\"Center\" FontSize=\"10\" Text=\"{Binding Suit, Converter={StaticResource suitString}}\" Foreground=\"{Binding Suit, Converter={StaticResource suitBrush}}\" />\n                                                <TextBlock TextAlignment=\"Center\" FontSize=\"10\" Text=\"{Binding Number, Converter={StaticResource numString}}\" Foreground=\"{Binding Suit, Converter={StaticResource suitBrush}}\" />\n                                            </StackPanel>\n                                        </Border>\n                                    </DataTemplate>\n                                </ItemsControl.ItemTemplate>\n                            </ItemsControl>\n                        </StackPanel>\n                    </DataTemplate>\n                </ItemsControl.ItemTemplate>\n            </ItemsControl>\n        </Grid>\n    </Grid>\n</UserControl>\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Views/PlayAreaControl.xaml.cs",
    "content": "﻿using CardBattle.Models.Messages;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Animation;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace CardBattle.Views\n{\n    /// <summary>\n    /// Interaction logic for PlayAreaControl.xaml\n    /// </summary>\n    public partial class PlayAreaControl : UserControl\n    {\n        public PlayAreaControl()\n        {\n            InitializeComponent();\n\n            _playerAttackAnimation = CreateDamageAnimation(playerAttackPanel);\n            _bossAttackAnimation = CreateDamageAnimation(bossAttackPanel);\n        }\n\n        Storyboard _playerAttackAnimation;\n        Storyboard _bossAttackAnimation;\n\n        public async Task ShowAttack(PlayerAttack attack)\n        {\n            playerAttackPanel.DataContext = attack;\n            playerAttackPanel.Visibility = Visibility.Visible;\n\n            await _playerAttackAnimation.PlayAsync();\n\n            playerAttackPanel.Visibility = Visibility.Collapsed;\n        }\n\n        public async Task ShowAttack(BossAttack attack)\n        {\n            bossAttackPanel.DataContext = attack;\n            bossAttackPanel.Visibility = Visibility.Visible;\n\n            await _bossAttackAnimation.PlayAsync();\n\n            bossAttackPanel.Visibility = Visibility.Collapsed;\n        }\n\n        private Storyboard CreateDamageAnimation(DependencyObject target)\n        {\n            var appeal = new DoubleAnimation\n            {\n                From = 0,\n                To = 1,\n                Duration = new Duration(TimeSpan.FromSeconds(1.5)),\n                AutoReverse = true,\n            };\n\n            Storyboard.SetTarget(appeal, target);\n            Storyboard.SetTargetProperty(appeal, new PropertyPath(OpacityProperty));\n\n            var s = new Storyboard { Children = { appeal } };\n            return s;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Views/PlayerColorConverter.cs",
    "content": "﻿using System;\nusing System.Globalization;\nusing System.Windows.Data;\nusing System.Windows.Media;\n\nnamespace CardBattle.Views\n{\n    public class PlayerColorConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            var playerId = (byte)value;\n\n            switch (playerId)\n            {\n                default:\n                case 0: return Brushes.DarkRed;\n                case 1: return Brushes.DarkBlue;\n                case 2: return Brushes.DarkOliveGreen;\n                case 3: return Brushes.DarkViolet;\n                case 4: return Brushes.DarkGoldenrod;\n            }\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Views/SuitBrushConverter.cs",
    "content": "﻿using CardBattle.Models.GameRules;\nusing System;\nusing System.Globalization;\nusing System.Windows.Data;\nusing System.Windows.Media;\n\nnamespace CardBattle.Views\n{\n    public class SuitBrushConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            var suit = (Suit)value;\n\n            switch (suit)\n            {\n                default:\n                case Suit.Spades:\n                case Suit.Clubs:\n                case Suit.Joker:\n                    return Brushes.Black;\n                case Suit.Hearts:\n                case Suit.Diamonds:\n                    return Brushes.Red;\n            }\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/Views/SuitStringConverter.cs",
    "content": "﻿using CardBattle.Models.GameRules;\nusing System;\nusing System.Globalization;\nusing System.Windows.Data;\n\nnamespace CardBattle.Views\n{\n    public class SuitStringConverter : IValueConverter\n    {\n        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            var suit = (Suit)value;\n\n            switch (suit)\n            {\n                case Suit.Spades: return \"♠\";\n                case Suit.Hearts: return \"♥\";\n                case Suit.Diamonds: return \"♦\";\n                case Suit.Clubs: return \"♣\";\n                default:\n                case Suit.Joker: return \"🃏\";\n            }\n        }\n\n        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)\n        {\n            throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Client/project.json",
    "content": "﻿{\n  \"frameworks\": {\n    \"net461\": {}\n  },\n  \"runtimes\": {\n    \"win\": {},\n    \"win-anycpu\": {}\n  },\n  \"dependencies\": {\n    \"System.Reactive\": \"3.0.0\",\n    \"System.Reactive.Windows.Threading\": \"3.0.0\",\n    \"System.ValueTuple\": \"4.0.1-beta-24416-08\"\n  }\n}"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/CardBattle.Models.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>CardBattle.Models</RootNamespace>\n    <AssemblyName>CardBattle.Models</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"GameEngine.cs\" />\n    <Compile Include=\"GameRules\\Ability.cs\" />\n    <Compile Include=\"GameRules\\Boss.cs\" />\n    <Compile Include=\"GameRules\\Card.cs\" />\n    <Compile Include=\"GameRules\\Hand.cs\" />\n    <Compile Include=\"GameRules\\Judge.cs\" />\n    <Compile Include=\"GameRules\\PlayArea.cs\" />\n    <Compile Include=\"GameRules\\Player.cs\" />\n    <Compile Include=\"GameStatus.cs\" />\n    <Compile Include=\"Lib\\BindableBase.cs\" />\n    <Compile Include=\"Lib\\EnumerableEx.cs\" />\n    <Compile Include=\"Lib\\RandomExtensions.cs\" />\n    <Compile Include=\"Messages\\BossAttack.cs\" />\n    <Compile Include=\"Messages\\CommandPrompt.cs\" />\n    <Compile Include=\"Messages\\Continue.cs\" />\n    <Compile Include=\"Messages\\ContinuePrompt.cs\" />\n    <Compile Include=\"Messages\\FinishGame.cs\" />\n    <Compile Include=\"Messages\\GameProgress.cs\" />\n    <Compile Include=\"Messages\\PlayerAttack.cs\" />\n    <Compile Include=\"Messages\\PlayerSnapshop.cs\" />\n    <Compile Include=\"Messages\\Responses\\CommandResonse.cs\" />\n    <Compile Include=\"Messages\\Responses\\Confirmation.cs\" />\n    <Compile Include=\"Messages\\Responses\\GameResponse.cs\" />\n    <Compile Include=\"Messages\\TurnStarted.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"Messages\\readme.md\" />\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\..\\src\\TaskLibrary.Channels\\TaskLibrary.Channels.csproj\">\n      <Project>{a46dbf03-3d5e-4580-8bb0-fd5da4f1188c}</Project>\n      <Name>TaskLibrary.Channels</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/GameEngine.cs",
    "content": "﻿using TaskLibrary.Channels;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing CardBattle.Models.GameRules;\nusing CardBattle.Lib;\nusing CardBattle.Models.Messages;\nusing System.Threading;\n\nnamespace CardBattle.Models\n{\n    /// <summary>\n    /// 1ゲーム分の実行エンジン。\n    /// <see cref=\"Channel{TMessage}\"/>使ってViewとやり取りしつつ、ゲームを進行する。\n    /// </summary>\n    public class GameEngine\n    {\n        private readonly PlayArea _area;\n        private readonly Player[] _players;\n        private readonly Random _random;\n\n        public GameEngine(CancellableReceiver<GameProgress> channel, int randomSeed, Ability[] playerAbilities)\n        {\n            _random = new Random(randomSeed);\n\n            var num = playerAbilities.Length;\n            _area = new PlayArea(randomSeed, num);\n            _players = new Player[num];\n\n            for (int i = 0; i < _players.Length; i++)\n            {\n                // とりあえずサンプルだし、ID = インデックスにしてしまう。\n                _players[i] = new Player(i, (byte)i, playerAbilities[i], _area.Players[i]);\n            }\n\n            Boss = new Boss();\n\n            channel.Execute(Execute);\n        }\n\n        /// <summary>\n        /// 参加プレイヤー。\n        /// </summary>\n        public IReadOnlyList<Player> Players => _players;\n\n        /// <summary>\n        /// みんなで倒すべき敵ボス。\n        /// </summary>\n        public Boss Boss { get; }\n\n        public async Task Execute(CancellableReceiver<GameProgress> channel)\n        {\n            var result = await ExecuteBody(channel);\n\n            await channel.SendAsync(new FinishGame(result.status, result.turn, Boss.Hp, Players.Select(x => x.Snapshot()).ToArray()));\n        }\n\n        public async Task<(GameStatus status, int turn)> ExecuteBody(CancellableReceiver<GameProgress> channel)\n        {\n            for (int i = 1; i <= 10; i++)\n            {\n                System.Diagnostics.Debug.WriteLine($\"Excute Turn {i} on thread {Thread.CurrentThread.ManagedThreadId}\");\n                var stat = await ExecuteTurn(i, channel);\n                if (stat != GameStatus.Playing) return (stat, i);\n            }\n            return (GameStatus.TurnOver, 10);\n        }\n\n        private async Task<GameStatus> ExecuteTurn(int turn, CancellableReceiver<GameProgress> channel)\n        {\n            await channel.SendAsync(new TurnStarted(turn));\n\n            foreach (var actor in GetActors())\n            {\n                var stat = await (actor != null ? ExecutePlayer(actor, channel): ExecuteBoss(channel));\n                if (stat != GameStatus.Playing) return stat;\n            }\n\n            return GameStatus.Playing;\n        }\n\n        private async Task<GameStatus> ExecuteBoss(CancellableReceiver<GameProgress> channel)\n        {\n            var v = _random.NextDouble();\n\n            if (v < 0.5)\n            {\n                // 50% で平均10万ダメージの全体攻撃\n                var attacks = _players.Where(p => !p.IsDead).Select(p => BossAttack(p, 90000, 110000)).ToArray();\n\n                await channel.SendAsync(new BossAttack(attacks));\n            }\n            else\n            {\n                // 50% で平均20万ダメージの単体攻撃\n                var alive = _players.Where(p => !p.IsDead).ToArray();\n                var i = _random.Next(alive.Length);\n                var target = alive[i];\n                var attack = BossAttack(target, 190000, 210000);\n\n                await channel.SendAsync(new BossAttack(new[] { attack }));\n            }\n\n            // コンティニュー処理\n            if (_players.Any(p => p.IsDead && !p.IsRetired))\n            {\n                var messages = _players.Where(p => p.IsDead && !p.IsRetired).Select(p => new ContinuePrompt(p)).ToArray();\n                await channel.SendAsync(messages);\n\n                var continuedPlayers = new List<PlayerSnapshop>();\n\n                foreach (var m in messages)\n                {\n                    // とりあえず、コンティニューしなかった人はリタイア扱いにしとく。\n                    if (m.Response)\n                    {\n                        m.Player.Resurrect();\n                        continuedPlayers.Add(m.Player.Snapshot());\n                    }\n                    else m.Player.Retire();\n                }\n\n                if(continuedPlayers.Any())\n                {\n                    await channel.SendAsync(new Continue(continuedPlayers));\n                }\n            }\n\n            // 全滅判定\n            if (_players.All(p => p.IsDead))\n                return GameStatus.PlayerDestroyed;\n\n            return GameStatus.Playing;\n        }\n\n        private BossAttackItem BossAttack(Player p, int damageMin, int damageMax)\n        {\n            var damage = (int)_random.NextDouble(damageMin, damageMax);\n            p.Hp = Math.Max(p.Hp - damage, 0);\n            var attack = new BossAttackItem(p.Snapshot(), damage);\n            return attack;\n        }\n\n        private async Task<GameStatus> ExecutePlayer(Player player, CancellableReceiver<GameProgress> channel)\n        {\n            if (player.IsDead) return GameStatus.Playing;\n\n            _area.RedrawAll(player.Index);\n            player.InvalidateHand();\n\n            var res = (await channel.SendAsync(new CommandPrompt(player))).GetResponse();\n\n            if (res?.RedrawCardIndexes is int[] indexes)\n                _area.Redraw(player.Index, indexes);\n\n            player.InvalidateHand();\n\n            var damage = Judge.Score(player);\n            Boss.Hp -= damage;\n            if (Boss.Hp < 0) Boss.Hp = 0;\n\n            await channel.SendAsync(new PlayerAttack(player.Snapshot(), player.Hand, damage, Boss.Hp));\n\n            if (Boss.Hp == 0) return GameStatus.BossDefeated;\n            else return GameStatus.Playing;\n        }\n\n        /// <summary>\n        /// ±20程度の乱数を足したうえで、スピード順に並べたアクター (= プレイヤー or ボス)を返す。\n        /// </summary>\n        /// <returns>スピード順のアクター。null の時がボスという扱い。</returns>\n        /// <remarks>\n        /// 死んでるやつも返すので、それをはじくのは使う側で。\n        /// (今の作りだと、最初に全部作っちゃうのでどうせターンの途中で死ぬ可能性がある。)\n        ///\n        /// null の時がボスってのも微妙だけど、まあ、手抜き。\n        /// ほんとはたぶん、Player | Boss な union クラス作った方がいいと思う。\n        ///\n        /// 実際のゲームだと、ターンの最中に補助スキル発動で速さ変わったりするんで、\n        /// 乱数だけ先に計算して、都度、現在位置版早いやつをyield returnみたいな実装の方がたぶんいい。\n        /// 今回は補助スキルないし、そこまでやらない。\n        /// </remarks>\n        private IEnumerable<Player> GetActors()\n            => _players\n                .Select(p => (speed: p.Ability.Speed + _random.NextDouble(-20, 20), player: p))\n                .Append((speed: 50 + _random.NextDouble(-20, 20), player: default(Player))) // ボスは速さ50固定\n                .OrderByDescending(p => p.speed)\n                .Select(p => p.player)\n                .ToArray();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/GameRules/Ability.cs",
    "content": "﻿namespace CardBattle.Models.GameRules\n{\n    /// <summary>\n    /// キャラ性能的なの。\n    /// </summary>\n    public class Ability\n    {\n        /// <summary>\n        /// 体力の最大値。\n        /// </summary>\n        public int MaxHp { get; }\n\n        /// <summary>\n        /// <see cref=\"Suit.Spades\"/>の攻撃力が上がる度合い。\n        /// </summary>\n        public int Spades { get; }\n\n        /// <summary>\n        /// <see cref=\"Suit.Hearts\"/>の攻撃力が上がる度合い。\n        /// </summary>\n        public int Hearts { get; }\n\n        /// <summary>\n        /// <see cref=\"Suit.Diamonds\"/>の攻撃力が上がる度合い。\n        /// </summary>\n        public int Diamonds { get; }\n\n        /// <summary>\n        /// <see cref=\"Suit.Clubs\"/>の攻撃力が上がる度合い。\n        /// </summary>\n        public int Clubs { get; }\n\n        /// <summary>\n        /// 同じ数字があったときに掛かるボーナス度合い。\n        /// </summary>\n        public int Pair { get; }\n\n        /// <summary>\n        /// 連番があったときに掛かるボーナス度合い。\n        /// </summary>\n        public int Straight { get; }\n\n        /// <summary>\n        /// 同柄があったときに掛かるボーナス度合い。\n        /// </summary>\n        public int Flush { get; }\n\n        /// <summary>\n        /// 速さ。行動順に影響あるやつ。\n        /// </summary>\n        public int Speed { get; }\n\n        /// <param name=\"maxHp\"><see cref=\"MaxHp\"/></param>\n        /// <param name=\"spades\"><see cref=\"Spades\"/></param>\n        /// <param name=\"hearts\"><see cref=\"Hearts\"/></param>\n        /// <param name=\"diamonds\"><see cref=\"Diamonds\"/></param>\n        /// <param name=\"clubs\"><see cref=\"Clubs\"/></param>\n        /// <param name=\"pair\"><see cref=\"Pair\"/></param>\n        /// <param name=\"straight\"><see cref=\"Straight\"/></param>\n        /// <param name=\"flush\"><see cref=\"Flush\"/></param>\n        public Ability(int maxHp, int spades, int hearts, int diamonds, int clubs, int pair, int straight, int flush, int speed)\n        {\n            MaxHp = maxHp;\n            Spades = spades;\n            Hearts = hearts;\n            Diamonds = diamonds;\n            Clubs = clubs;\n            Pair = pair;\n            Straight = straight;\n            Flush = flush;\n            Speed = speed;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/GameRules/Boss.cs",
    "content": "﻿using CardBattle.Lib.ComponentModel;\nusing System.ComponentModel;\n\nnamespace CardBattle.Models.GameRules\n{\n    /// <summary>\n    /// ボス(敵)。\n    /// </summary>\n    /// <remarks>\n    /// ゲーム的に、全プレイヤーで協力して1対のボスを殴るシステムにしてみる。\n    ///\n    /// 現実にはボス側もプレイヤー側と同じ仕組みで動かすとか、ボス用の能力値クラス作るとかが必要だけど、\n    /// めんどくさいんで全部固定。\n    ///\n    /// しかも、ボスは1体限りという手抜きルール。\n    /// </remarks>\n    public class Boss : BindableBase\n    {\n        /// <summary>\n        /// 現在の体力。\n        /// </summary>\n        /// <remarks>\n        /// これも固定で100万スタート。\n        /// </remarks>\n        public int Hp { get { return _hp; } internal set { SetProperty(ref _hp, value, HpProperty); } }\n        public static readonly PropertyChangedEventArgs HpProperty = new PropertyChangedEventArgs(nameof(Hp));\n        private int _hp = 1000000;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/GameRules/Card.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace CardBattle.Models.GameRules\n{\n    /// <summary>\n    /// カードの柄。\n    /// </summary>\n    public enum Suit : byte\n    {\n        Spades = 1,\n        Hearts = 2,\n        Diamonds = 4,\n        Clubs = 8,\n        Joker = 15,\n    }\n\n    /// <summary>\n    /// 要するにトランプ。\n    /// </summary>\n    public struct Card\n    {\n        private byte _value;\n\n        /// <summary>\n        /// 数字。\n        /// </summary>\n        public int Number => (_value >> 4) & 0xf;\n\n        /// <summary>\n        /// 柄。\n        /// </summary>\n        public Suit Suit => (Suit)(_value  & 0xf);\n\n        public Card(int number, Suit suit)\n        {\n            _value = (byte)((number << 4) | (int)suit);\n        }\n\n        public override string ToString() => $\"{ToString(Suit)}{Number,2}\";\n\n        private static string ToString(Suit s) =>\n            s == Suit.Spades ? \"♠\" :\n            s == Suit.Hearts ? \"♡\" :\n            s == Suit.Diamonds ? \"♢\" :\n            s == Suit.Clubs ? \"♣\" :\n            \"\";\n\n        /// <summary>\n        /// ジョーカー。\n        /// </summary>\n        public static Card Joker { get; } = new Card { _value = 0xff };\n\n        /// <summary>\n        /// 柄4つ並べたもの。\n        /// </summary>\n        public static IEnumerable<Suit> Suits = new[] { Suit.Spades, Suit.Hearts, Suit.Diamonds, Suit.Clubs };\n\n        /// <summary>\n        /// ジョーカー含む53枚を列挙。\n        /// </summary>\n        public static IEnumerable<Card> AllCards\n        {\n            get\n            {\n                for (int num = 1; num <= 13; num++)\n                {\n                    foreach (var suit in Suits)\n                    {\n                        yield return new Card(num, suit);\n                    }\n                }\n                yield return Joker;\n            }\n        }\n\n        /// <summary>\n        /// <paramref name=\"cards\"/>の先頭から<paramref name=\"length\"/>枚目のカードまでをシャッフル。\n        /// </summary>\n        /// <param name=\"cards\">シャッフル対象。</param>\n        /// <param name=\"length\">先頭からこの枚数までだけをシャッフル。</param>\n        /// <param name=\"random\">乱数</param>\n        /// <param name=\"shuffleCount\">シャッフル回数。</param>\n        public static void Shuffle(Card[] cards, int length, Random random, int shuffleCount = 100)\n        {\n            void swap(ref Card x, ref Card y)\n            {\n                var t = x;\n                x = y;\n                y = t;\n            }\n\n            for (int n = 0; n < shuffleCount; n++)\n            {\n                var i = random.Next(length);\n                var j = random.Next(length);\n                swap(ref cards[i], ref cards[j]);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/GameRules/Hand.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace CardBattle.Models.GameRules\n{\n    /// <summary>\n    /// プレイヤーの手札。\n    /// </summary>\n    /// <remarks>\n    /// 具体的な操作は<see cref=\"PlayArea\"/>越しでしかさせないためにインターフェイス。\n    /// </remarks>\n    public interface IHand\n    {\n        /// <summary>\n        /// 手札にあるカード。\n        /// </summary>\n        IReadOnlyList<Card> Cards { get; }\n\n        /// <summary>\n        /// ある時点での手札のスナップショットを取っておくためにクローンが必要。\n        /// </summary>\n        /// <returns>クローン。</returns>\n        IHand Clone();\n    }\n\n    public partial class PlayArea\n    {\n        private const int CardsInHand = 5;\n\n        private class Hand : IHand, IReadOnlyList<Card>\n        {\n            // GC 除けに固定長実装\n            public Card c0;\n            public Card c1;\n            public Card c2;\n            public Card c3;\n            public Card c4;\n\n            public IReadOnlyList<Card> Cards => this;\n\n            public ref Card this[int index]\n            {\n                get\n                {\n                    switch (index)\n                    {\n                        case 0: return ref c0;\n                        case 1: return ref c1;\n                        case 2: return ref c2;\n                        case 3: return ref c3;\n                        case 4: return ref c4;\n                        default:\n                            throw new IndexOutOfRangeException();\n                    }\n                }\n            }\n\n            Card IReadOnlyList<Card>.this[int index] => this[index];\n\n            int IReadOnlyCollection<Card>.Count => 5;\n\n            IEnumerator<Card> IEnumerable<Card>.GetEnumerator()\n            {\n                yield return c0;\n                yield return c1;\n                yield return c2;\n                yield return c3;\n                yield return c4;\n            }\n\n            IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable<Card>)this).GetEnumerator();\n\n            IHand IHand.Clone()\n            {\n                return new Hand\n                {\n                    c0 = c0,\n                    c1 = c1,\n                    c2 = c2,\n                    c3 = c3,\n                    c4 = c4,\n                };\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/GameRules/Judge.cs",
    "content": "﻿using System;\nusing System.Linq;\n\nnamespace CardBattle.Models.GameRules\n{\n    /// <summary>\n    /// 手札の役判定クラス。\n    /// 今回、\n    /// - pair    : 同じ数字のカード枚数の最大値(例えば 3, 3, 3, 2, 2 とかだと3枚)\n    /// - straight: 連番のカードの枚数の最大値(例えば 1, 2, 3, 7, 8 とかだと3枚)\n    /// - flush   : 同柄のカード枚数の最大値(例えば ♡, ♡, ♢, ♠, ♣ とかだと2枚)\n    /// を判定。\n    /// そろった数字は何番かとかは無関係。\n    /// </summary>\n    public class Judge\n    {\n        /// <summary>\n        /// pair, straight, flush の枚数を集計。\n        /// </summary>\n        /// <param name=\"hand\"></param>\n        /// <returns>それぞれの枚数</returns>\n        /// <remarks>\n        /// 最初はジョーカーをまじめに判定するつもりでいたけど、面倒になったのでやってない。\n        /// ジョーカーは何の役も作らない。\n        /// </remarks>\n        public static (int pair, int straight, int flush) Count(IHand hand)\n        {\n            var nums = hand.Cards.Select(x => x.Number).ToArray();\n            var suits = hand.Cards.Select(x => (int)x.Suit).ToArray();\n\n            var pair = nums.GroupBy(x => x).Max(g => g.Count());\n\n            // ストレート判定のために、ソートして、連番で番号を減らす\n            Array.Sort(nums);\n            for (int i = 0; i < 5; i++) nums[i] -= i;\n            var straight = nums.GroupBy(x => x).Max(g => g.Count());\n\n            var flush = suits.GroupBy(x => x).Max(g => g.Count());\n\n            return (pair, straight, flush);\n        }\n\n        /// <summary>\n        /// プレイヤーの手札の強さを評価。\n        /// <seealso cref=\"Score(IHand, Ability)\"/>\n        /// </summary>\n        /// <param name=\"player\"></param>\n        /// <returns></returns>\n        public static int Score(Player player) => Score(player.Hand, player.Ability);\n\n        /// <summary>\n        /// 手札の強さを評価。\n        /// </summary>\n        /// <param name=\"hand\">手札。</param>\n        /// <param name=\"ability\">能力値。</param>\n        /// <returns>威力的なもの。</returns>\n        /// <remarks>\n        /// 適当にそれっぽく。\n        ///\n        /// ・数字の価値\n        /// 2が一番弱くて、エース(1)は14扱いで評価。\n        /// 一律下駄をはかせて、2の時の威力が20で、エースが32。\n        ///\n        /// ・柄と数字の集計\n        /// で、これを各柄ごとに集計して、<see cref=\"Ability.Spades\"/>とかと掛ける。\n        /// ジョーカーがあったら、全柄分の能力値の和 × 20 を計算。\n        /// これらを全部合計する。\n        ///\n        /// ・役によるボーナス\n        /// 役によるボーナスは掛け算。\n        /// pair, straight, flush それぞれ、Pow(枚数, 能力値 / 100) を掛ける。\n        ///\n        /// ・切り上げ\n        /// 結果は整数になるよう、小数点以下切り上げ。\n        /// </remarks>\n        public static int Score(IHand hand, Ability ability)\n        {\n            var score = 0.0;\n\n            var suits = hand.Cards.GroupBy(x => x.Suit);\n\n            foreach (var s in suits)\n            {\n                if (s.Key == Suit.Joker)\n                {\n                    score += 20 * (ability.Spades + ability.Hearts + ability.Diamonds + ability.Clubs);\n                    continue;\n                }\n\n                var subScore = 0;\n\n                foreach (var x in s)\n                {\n                    var n = x.Number;\n                    var value = n == 1 ? 32 : n + 18;\n                    subScore += value;\n                }\n\n                var a =\n                    s.Key == Suit.Spades ? ability.Spades :\n                    s.Key == Suit.Hearts ? ability.Hearts :\n                    s.Key == Suit.Diamonds ? ability.Diamonds :\n                    s.Key == Suit.Clubs ? ability.Clubs :\n                    0;\n                score += subScore * a;\n            }\n\n            var (pair, straight, flush) = Count(hand);\n\n            score *= Math.Pow(pair, ability.Pair / 100.0);\n            score *= Math.Pow(straight, ability.Straight / 100.0);\n            score *= Math.Pow(flush, ability.Flush / 100.0);\n\n            return (int)Math.Ceiling(score);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/GameRules/PlayArea.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace CardBattle.Models.GameRules\n{\n    /// <summary>\n    /// 場全体。\n    /// </summary>\n    /// <remarks>\n    /// 山札の残り枚数、捨て札の枚数くらいは公開情報にしてもいい気がしつつ。\n    /// 言実装はその辺り手抜きで、手札のみ public。\n    /// </remarks>\n    public partial class PlayArea\n    {\n        /// <summary>\n        /// 山札。\n        /// 固定長で最大枚数(1デッキ = 53枚)分取っておく。\n        /// </summary>\n        private Card[] _pile;\n\n        /// <summary>\n        /// 山札のうち、何枚目まで配ったか。\n        /// 0ベース(<see cref=\"_pile\"/>のインデックス)。\n        /// </summary>\n        private int _pileTop;\n\n        /// <summary>\n        /// 捨て札。\n        /// 固定長で最大枚数(1デッキ = 53枚)分取っておく。\n        /// </summary>\n        private Card[] _discards;\n\n        /// <summary>\n        /// 捨て札が何枚積もったか。\n        /// 0ベース(<see cref=\"_discards\"/>のインデックス)。\n        /// </summary>\n        private int _discardsBottom;\n\n        private Random _random;\n\n        private Hand[] _players;\n\n        /// <summary>\n        /// </summary>\n        /// <param name=\"randomSeed\">乱数シード。</param>\n        /// <param name=\"numPlayers\">プレイヤー人数。</param>\n        public PlayArea(int randomSeed, int numPlayers = 4)\n        {\n            _random = new Random(randomSeed);\n\n            _pileTop = 0;\n            _pile = Card.AllCards.ToArray();\n            Card.Shuffle(_pile, _pile.Length, _random);\n\n            _discardsBottom = 0;\n            _discards = new Card[_pile.Length];\n\n            //todo: 上限人数チェックしないと、53枚で収まらなくなる。\n            _players = new Hand[numPlayers];\n            for (int i = 0; i < _players.Length; i++)\n            {\n                _players[i] = new Hand();\n            }\n\n            // 最初に5枚ずつ配る\n            for (int i = 0; i < CardsInHand; i++)\n            {\n                foreach (var p in _players)\n                {\n                    p[i] = GetNext();\n                }\n            }\n        }\n\n        /// <summary>\n        /// 各プレイヤーの手札。\n        /// </summary>\n        public IReadOnlyList<IHand> Players => _players;\n\n        /// <summary>\n        /// 山札から1枚取得。\n        /// 全部なくなったら<see cref=\"Refresh\"/>。\n        /// </summary>\n        /// <returns></returns>\n        private Card GetNext()\n        {\n            var card = _pile[_pileTop];\n            _pileTop++;\n\n            if (_pileTop == _pile.Length)\n            {\n                Refresh();\n            }\n\n            return card;\n        }\n\n        /// <summary>\n        /// 捨て札をシャッフルして山札に戻す。\n        /// </summary>\n        private void Refresh()\n        {\n            Card.Shuffle(_discards, _discardsBottom, _random);\n            _pileTop = _pile.Length - _discardsBottom;\n\n            for (int i = _pile.Length - 1, j = _discardsBottom - 1; j >= 0; i--, j--)\n            {\n                _pile[i] = _discards[j];\n            }\n\n            _discardsBottom = 0;\n        }\n\n        /// <summary>\n        /// カードを1枚捨てる\n        /// </summary>\n        /// <param name=\"c\"></param>\n        private void Discard(Card c)\n        {\n            _discards[_discardsBottom] = c;\n            _discardsBottom++;\n        }\n\n        /// <summary>\n        /// あるプレイヤーのカードを1枚捨てて引き直す。\n        /// </summary>\n        /// <param name=\"playerIndex\">プレイヤーのインデックス。</param>\n        /// <param name=\"cardIndex\">カードのインデックス</param>\n        public void Redraw(int playerIndex, int cardIndex)\n        {\n            var p = _players[playerIndex];\n\n            Redraw(p, cardIndex);\n        }\n\n        /// <summary>\n        /// あるプレイヤーのカードを全部捨てて引き直す。\n        /// </summary>\n        /// <param name=\"playerIndex\"></param>\n        public void RedrawAll(int playerIndex)\n        {\n            var p = _players[playerIndex];\n\n            for (int i = 0; i < CardsInHand; i++)\n            {\n                Redraw(p, i);\n            }\n        }\n\n        private void Redraw(Hand p, int cardIndex)\n        {\n            Discard(p[cardIndex]);\n            p[cardIndex] = GetNext();\n        }\n\n        /// <summary>\n        /// 数枚まとめて引き直し。\n        /// </summary>\n        /// <param name=\"playerIndex\"></param>\n        /// <param name=\"cardIndexes\"></param>\n        public void Redraw(int playerIndex, int[] cardIndexes)\n        {\n            var p = _players[playerIndex];\n\n            foreach (var i in cardIndexes)\n            {\n                Redraw(p, i);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/GameRules/Player.cs",
    "content": "﻿using CardBattle.Lib.ComponentModel;\nusing System.ComponentModel;\nusing System.Linq;\n\nnamespace CardBattle.Models.GameRules\n{\n    /// <summary>\n    /// 各プレイヤーの状態。\n    /// </summary>\n    public class Player : BindableBase\n    {\n        /// <summary>\n        /// <see cref=\"PlayArea\"/>での管理用のインデックス。\n        /// </summary>\n        internal int Index { get; }\n\n        /// <summary>\n        /// プレイヤーのID。\n        /// </summary>\n        public byte Id { get; }\n\n        /// <summary>\n        /// 現在の体力。\n        /// コンストラクターで<see cref=\"Ability.MaxHp\"/>に初期化。\n        /// </summary>\n        public int Hp { get { return _hp; } internal set { SetProperty(ref _hp, value, HpProperty); } }\n        public static readonly PropertyChangedEventArgs HpProperty = new PropertyChangedEventArgs(nameof(Hp));\n        private int _hp = 1000000;\n\n        /// <summary>\n        /// 能力値。\n        /// </summary>\n        public Ability Ability { get; }\n\n        /// <summary>\n        /// 手札。\n        /// </summary>\n        /// <remarks>\n        /// <see cref=\"PlayArea\"/>から、<see cref=\"PlayArea\"/>内で管理してるインスタンスを渡してもらう。\n        /// </remarks>\n        public IHand Hand { get; }\n\n        /// <summary>\n        /// View へのバインド用。\n        /// <see cref=\"Cards\"/>のクローン。\n        /// </summary>\n        /// <remarks>\n        /// GC 除けしてたらインスタンスが切り替わらず、\n        /// インスタンス切り替わらないと View の更新がうまくいかなかったり。\n        /// </remarks>\n        public Card[] Cards => Hand.Cards.ToArray();\n        public static readonly PropertyChangedEventArgs CloneCardsProperty = new PropertyChangedEventArgs(nameof(Cards));\n\n        internal void InvalidateHand() => OnPropertyChanged(CloneCardsProperty);\n\n        internal Player(int index, byte id, Ability ability, IHand hand)\n        {\n            Index = index;\n            Id = id;\n            Ability = ability;\n            Hand = hand;\n            Hp = ability.MaxHp;\n        }\n\n        /// <summary>\n        /// 死亡状態か判定。\n        /// </summary>\n        public bool IsDead => Hp <= 0;\n\n        /// <summary>\n        /// リタイア状況。\n        /// true ならもうコンティニューもしない状態。\n        /// </summary>\n        public bool IsRetired { get; private set; }\n\n        /// <summary>\n        /// 復活。\n        /// とりあえずHP全快で復活させる。\n        /// </summary>\n        internal void Resurrect()\n        {\n            Hp = Ability.MaxHp;\n        }\n\n        /// <summary>\n        /// リタイア。\n        /// </summary>\n        internal void Retire()\n        {\n            Hp = 0;\n            IsRetired = true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/GameStatus.cs",
    "content": "﻿namespace CardBattle.Models\n{\n    public enum GameStatus\n    {\n        /// <summary>\n        /// ゲーム進行中。\n        /// </summary>\n        Playing,\n\n        /// <summary>\n        /// プレイヤー側全滅。\n        /// </summary>\n        PlayerDestroyed,\n\n        /// <summary>\n        /// ボス撃破。\n        /// </summary>\n        BossDefeated,\n\n        /// <summary>\n        /// 規定ターンを超えたので終了。\n        /// </summary>\n        TurnOver,\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Lib/BindableBase.cs",
    "content": "﻿using System.ComponentModel;\n\nnamespace CardBattle.Lib.ComponentModel\n{\n    /// <summary>\n    /// データバインディング用共通基底。\n    /// </summary>\n    /// <remarks>\n    /// System.Threading.Tasks 版もある。\n    /// あっちは、[CallerMemberName] を使ってるのと、boxing 回避用オーバーロードがない。\n    /// </remarks>\n    public class BindableBase : INotifyPropertyChanged\n    {\n        /// <summary>\n        /// <see cref=\"INotifyPropertyChanged.PropertyChanged\"/>\n        /// </summary>\n        public event PropertyChangedEventHandler PropertyChanged { add { _PropertyChanged += value; } remove { _PropertyChanged -= value; } }\n\n        /// <summary>\n        /// 派生クラスから直接 Invoke したいことがあるので。\n        /// </summary>\n        protected PropertyChangedEventHandler _PropertyChanged { get; private set; }\n\n        /// <summary>\n        /// フィールドの値を書き替え＆通知。\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"storage\"></param>\n        /// <param name=\"value\"></param>\n        /// <param name=\"propertyName\"></param>\n        /// <returns></returns>\n        protected bool SetProperty<T>(ref T storage, T value, string propertyName) => SetProperty(ref storage, value, new PropertyChangedEventArgs(propertyName));\n\n        /// <summary>\n        /// 変更通知。\n        /// </summary>\n        /// <param name=\"propertyName\"></param>\n        protected void OnPropertyChanged(string propertyName) => OnPropertyChanged(new PropertyChangedEventArgs(propertyName));\n\n        /// <summary>\n        /// フィールドの値を書き替え＆通知。\n        /// </summary>\n        protected bool SetProperty<T>(ref T storage, T value, PropertyChangedEventArgs e)\n        {\n            if (Equals(storage, value)) return false;\n\n            storage = value;\n            OnPropertyChanged(e);\n            return true;\n\n        }\n\n        /// <summary>\n        /// 変更通知。\n        /// </summary>\n        protected virtual void OnPropertyChanged(PropertyChangedEventArgs e) => _PropertyChanged?.Invoke(this, e);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Lib/EnumerableEx.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace CardBattle.Lib\n{\n    public static class EnumerableEx\n    {\n        /// <summary>\n        /// https://github.com/dotnet/corefx/commit/964281dfc6e1828f078890099e0042f2e5ed85bf\n        /// .NET 4.6.2 で追加予定のメソッド。\n        /// 末尾に1要素追加。\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"source\"></param>\n        /// <param name=\"element\"></param>\n        /// <returns></returns>\n        public static IEnumerable<T> Append<T>(this IEnumerable<T> source, T element)\n        {\n            foreach (var item in source) yield return item;\n            yield return element;\n        }\n\n        /// <summary>\n        /// https://github.com/dotnet/corefx/commit/964281dfc6e1828f078890099e0042f2e5ed85bf\n        /// .NET 4.6.2 で追加予定のメソッド。\n        /// 先頭に1要素追加。\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"source\"></param>\n        /// <param name=\"element\"></param>\n        /// <returns></returns>\n        public static IEnumerable<T> Prepend<T>(this IEnumerable<T> source, T element)\n        {\n            yield return element;\n            foreach (var item in source) yield return item;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Lib/RandomExtensions.cs",
    "content": "﻿using System;\n\nnamespace CardBattle.Lib\n{\n    public static class RandomExtensions\n    {\n        public static double NextDouble(this Random random, double minInclusive, double maxExclusive)\n            => random.NextDouble() * (maxExclusive - minInclusive) + minInclusive;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/BossAttack.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace CardBattle.Models.Messages\n{\n    /// <summary>\n    /// ボスの攻撃で、どのプレイヤーにどのくらいのダメージ与えて、そのプレイヤーのHPがいくつになったか。\n    /// </summary>\n    public class BossAttack : GameProgress\n    {\n        public IEnumerable<BossAttackItem> Attacks { get; }\n\n        internal BossAttack(IEnumerable<BossAttackItem> attacks)\n        {\n            Attacks = attacks;\n        }\n    }\n\n    /// <summary>\n    /// ボス攻撃は全体攻撃があり得るので、その1個1個。\n    /// </summary>\n    public class BossAttackItem\n    {\n        /// <summary>\n        /// 攻撃を受けた直後のプレイヤーのスナップショット。\n        /// </summary>\n        public PlayerSnapshop Player { get; }\n\n        /// <summary>\n        /// 与えたダメージ。\n        /// </summary>\n        public int Damage { get; }\n\n        internal BossAttackItem(PlayerSnapshop player, int damage)\n        {\n            Player = player;\n            Damage = damage;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/CommandPrompt.cs",
    "content": "﻿using TaskLibrary.Channels;\nusing CardBattle.Models.GameRules;\nusing System;\nusing System.Linq;\n\nnamespace CardBattle.Models.Messages\n{\n    /// <summary>\n    /// コマンド入力を促すメッセージ。\n    /// </summary>\n    /// <remarks>\n    /// 今回の想定では、コマンド入力は逐次手番。\n    /// 1人ずつ手番が来て1人ずつ選択コマンド選択。\n    ///\n    /// コマンドというか、ポーカーのカード交換みたいなシステムの予定。\n    /// </remarks>\n    public class CommandPrompt : GameProgress, IResponsiveMessage<CommandResonse>\n    {\n        /// <summary>\n        /// 誰の手番か。\n        /// </summary>\n        public byte PlayerId { get; }\n\n        /// <summary>\n        /// 現在の手札。\n        /// </summary>\n        public IHand Hand { get; }\n\n        /// <summary>\n        /// View へのバインド用。\n        /// <see cref=\"Hand\"/>のクローン。\n        /// </summary>\n        public Card[] Cards => Hand.Cards.ToArray();\n\n        int IResponsiveMessage.Address => PlayerId;\n\n        CommandResonse IResponsiveMessage<CommandResonse>.Response { get { return _response; } set { _response = value; } }\n        object IResponsiveMessage.Response { get { return _response; } set { _response = (CommandResonse)value; } }\n        private CommandResonse _response;\n\n        internal CommandPrompt(byte playerId, IHand hand)\n        {\n            PlayerId = playerId;\n            Hand = hand;\n        }\n\n        public CommandPrompt(Player player) : this(player.Id, player.Hand) { }\n\n        /// <summary>\n        /// コマンド入力。\n        /// 交換したいカードのインデックスを指定する。\n        /// </summary>\n        public void Redraw(params int[] indexes)\n        {\n            if (indexes.Any(i => i < 0 || i >= 5)) throw new IndexOutOfRangeException(nameof(indexes));\n\n            _response = new CommandResonse(indexes);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/Continue.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace CardBattle.Models.Messages\n{\n    /// <summary>\n    /// 誰かがコンティニューした。\n    /// 復活演出とかが必要になるだろうからメッセージ送る。\n    /// </summary>\n    public class Continue : GameProgress\n    {\n        /// <summary>\n        /// コンティニューしたプレイヤーのコンティニュー直後の状態。\n        /// </summary>\n        public IEnumerable<PlayerSnapshop> Players { get; }\n\n        internal Continue(IEnumerable<PlayerSnapshop> players)\n        {\n            Players = players;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/ContinuePrompt.cs",
    "content": "﻿using TaskLibrary.Channels;\nusing CardBattle.Models.GameRules;\n\nnamespace CardBattle.Models.Messages\n{\n    /// <summary>\n    /// 死亡時に、コンティニューするかどうかを促すメッセージ。\n    /// </summary>\n    public class ContinuePrompt : GameProgress, IResponsiveMessage<Confirmation>\n    {\n        internal Player Player { get; }\n\n        internal ContinuePrompt(Player player)\n        {\n            Player = player;\n        }\n\n        /// <summary>\n        /// 誰が死んだか。\n        /// </summary>\n        public byte PlayerId => Player.Id;\n\n        int IResponsiveMessage.Address => PlayerId;\n\n        public Confirmation Response { get { return _response; } set { _response = value; } }\n        object IResponsiveMessage.Response { get { return _response; } set { _response = (Confirmation)value; } }\n        private Confirmation _response;\n\n        /// <summary>\n        /// コンティニューする/しないを決定。\n        /// </summary>\n        /// <param name=\"value\">コンティニューするときには true を渡す。</param>\n        /// <remarks>\n        /// 特に何もしなかったら Response が null のまま、かつ、null だったら false 扱いなので、\n        /// コンティニューするときだけこいつを呼べばいいんだけど。\n        /// 「すると思ったけどやっぱりやめた」があり得るかもしれないんで、取りやめのために <paramref name=\"value\"/> を用意。\n        /// </remarks>\n        public void Confirm(bool value = true)\n        {\n            _response = (Confirmation)value;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/FinishGame.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace CardBattle.Models.Messages\n{\n    /// <summary>\n    /// ゲーム終了メッセージ。\n    /// </summary>\n    public class FinishGame : GameProgress\n    {\n        /// <summary>\n        /// ゲームの最終状態。\n        /// </summary>\n        public GameStatus Status { get; }\n\n        /// <summary>\n        /// 最終ターン。\n        /// </summary>\n        public int Turn { get; }\n\n        /// <summary>\n        /// 最終的なボスのHP。\n        /// </summary>\n        public int BossHp { get; }\n\n        /// <summary>\n        /// プレイヤーの最終状態。\n        /// </summary>\n        public IReadOnlyCollection<PlayerSnapshop> Players { get; }\n\n        internal FinishGame(GameStatus status, int turn, int bossHp, IReadOnlyCollection<PlayerSnapshop> players)\n        {\n            Status = status;\n            Turn = turn;\n            BossHp = bossHp;\n            Players = players;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/GameProgress.cs",
    "content": "﻿namespace CardBattle.Models.Messages\n{\n    /// <summary>\n    /// ゲームの進行メッセージ。\n    /// </summary>\n    public class GameProgress\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/PlayerAttack.cs",
    "content": "﻿using CardBattle.Models.GameRules;\nusing System.Linq;\n\nnamespace CardBattle.Models.Messages\n{\n    /// <summary>\n    /// 誰の攻撃で、ボスにどのくらいのダメージ与えて、ボスのHPがいくつになったか。\n    /// </summary>\n    public class PlayerAttack : GameProgress\n    {\n        /// <summary>\n        /// 攻撃時点でのプレイヤーのスナップショット。\n        /// </summary>\n        public PlayerSnapshop Player { get; }\n\n        /// <summary>\n        /// この時点での手札。\n        /// </summary>\n        public IHand Hand { get; }\n\n        /// <summary>\n        /// 与えたダメージ。\n        /// </summary>\n        public int Damage { get; }\n\n        /// <summary>\n        /// ダメージを与えた直後のボス体力。\n        /// </summary>\n        public int BossHp { get; }\n\n        internal PlayerAttack(PlayerSnapshop player, IHand hand, int damage, int bossHp)\n        {\n            Player = player;\n            Hand = hand;\n            Damage = damage;\n            BossHp = bossHp;\n        }\n\n        /// <summary>\n        /// View へのバインド用。\n        /// <see cref=\"Cards\"/>のクローン。\n        /// </summary>\n        public Card[] Cards => Hand.Cards.ToArray();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/PlayerSnapshop.cs",
    "content": "﻿using CardBattle.Models.GameRules;\n\nnamespace CardBattle.Models.Messages\n{\n    /// <summary>\n    /// ある時点の<see cref=\"Player\"/>のスナップショット。\n    /// </summary>\n    /// <remarks>\n    /// 実際のゲームだと補助魔法とかで能力値も変動するんだけど、このサンプルだとその辺り考えない。\n    ///\n    /// ボスの方にもほんとはBossSnapshotみたいなクラスが必要だけど、今回はボスがHPしか持ってないし、そっちはint 1個で済ます。\n    /// </remarks>\n    public class PlayerSnapshop\n    {\n        /// <summary>\n        /// プレイヤーのID。\n        /// </summary>\n        public int Id { get; }\n\n        /// <summary>\n        /// 体力。\n        /// </summary>\n        public int Hp { get; }\n\n        internal PlayerSnapshop(Player player)\n        {\n            Id = player.Id;\n            Hp = player.Hp;\n        }\n    }\n\n    public static class PlayerExtensions\n    {\n        public static PlayerSnapshop Snapshot(this Player p) => new PlayerSnapshop(p);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/Responses/CommandResonse.cs",
    "content": "﻿namespace CardBattle.Models.Messages\n{\n    /// <summary>\n    /// <see cref=\"CommandPrompt\"/>の応答。\n    /// </summary>\n    /// <remarks>\n    /// コマンド入力は逐次手番なので、\n    /// - 1人1人の分だけ受け取る\n    /// - PlayerId は応答に含めなくても特定できる\n    /// </remarks>\n    public class CommandResonse : GameResponse\n    {\n        /// <summary>\n        /// 引き直したいカードのインデックス。\n        /// 引き直ししない場合は null でもOK。\n        /// </summary>\n        public int[] RedrawCardIndexes { get; }\n\n        /// <summary>\n        /// 引き直しなし。\n        /// </summary>\n        public CommandResonse() { }\n\n        /// <summary>\n        /// 引き直し。\n        /// </summary>\n        /// <param name=\"redrawCardIndexes\">引き直したいカードのインデックス一覧。</param>\n        public CommandResonse(params int[] redrawCardIndexes)\n        {\n            RedrawCardIndexes = redrawCardIndexes;\n        }\n\n        // もしかしたら、GC 除けに以下のようなべた展開したメンバーにした方がいいかも？\n        //public int Count { get; }\n        //public int Index1 { get; }\n        //public int Index2 { get; }\n        //public int Index3 { get; }\n        //public int Index4 { get; }\n        //public int Index5 { get; }\n\n        // もしくは、以下のように引き直すところだけ true 入れる作りにするか。\n        //public bool RedrawsIndex0;\n        //public bool RedrawsIndex1;\n        //...\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/Responses/Confirmation.cs",
    "content": "﻿namespace CardBattle.Models.Messages\n{\n    /// <summary>\n    /// はい か いいえ で応えれる応答。\n    /// 実質、bool のラッパー クラス。\n    /// </summary>\n    public class Confirmation : GameResponse\n    {\n        /// <summary>\n        /// 値。\n        /// </summary>\n        public bool Value { get; }\n\n        private Confirmation(bool value) { Value = value; }\n\n        /// <summary>\n        /// 「はい」。true ラッパー。\n        /// </summary>\n        public static Confirmation Yes { get; } = new Confirmation(true);\n\n        /// <summary>\n        /// 「いいえ」。false ラッパー。\n        /// </summary>\n        public static Confirmation No { get; } = new Confirmation(false);\n\n        public static explicit operator Confirmation(bool value) => value ? Yes : No;\n        public static explicit operator Confirmation(bool? value)\n            => value == null ? null :\n            value.Value ? Yes :\n            No;\n        public static bool operator true(Confirmation c) => c != null && c.Value;\n        public static bool operator false(Confirmation c) => c == null || !c.Value;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/Responses/GameResponse.cs",
    "content": "﻿namespace CardBattle.Models.Messages\n{\n    /// <summary>\n    /// <see cref=\"GameProgress\"/>のうち、ユーザーからの応答が必要なものがいくつかあるんで、その応答の基底クラス。\n    /// </summary>\n    public class GameResponse\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/TurnStarted.cs",
    "content": "﻿namespace CardBattle.Models.Messages\n{\n    /// <summary>\n    /// ターン開始の通知。\n    /// </summary>\n    public class TurnStarted : GameProgress\n    {\n        /// <summary>\n        /// ターン数。\n        /// 1スタート。\n        /// </summary>\n        public int Turn { get; }\n\n        internal TurnStarted(int turn)\n        {\n            Turn = turn;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Messages/readme.md",
    "content": "﻿## GameEngineの進捗メッセージ\n\nChannel (いわゆるメッセンジャーの実装)経由で、GameEngineからビューに対して送り付けるメッセージと、その応答。\n\nメッセージには応答が必要なものと必要ないものあり。\n\n- 応答が必要ないもの: ターン開始とか、コマンド実行結果とか(誰に何ダメージ入ったとか)\n- 応答が必要なもの: プレイヤーにコマンド選択してもらうとか、死亡時にコンティニューするかどうか聞いたりとか\n\n### 応答\n\nGameEngineはサーバーとクライアントで同データ・同乱数シードで実行する想定。\nクライアントのビュー上で入力した応答だけをサーバーに送れば、まったく同じ動作が得られる。\n\nなので、応答(コマンド選択結果とか、コンティニューするかどうかとか)だけ通信すればOK。\n\n本来、通信部分はContractsプロジェクトでの定義からコード生成する想定。\n\nこのフォルダー内の型で言うと、GameResponseと子クラスがその応答にあたる型。\nこれらは、本来はコード生成で作るもの。\nこのコンセプト実証プロジェクトでは、コード生成で得られる想定のクラスを手書きしている。\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"CardBattle.Models\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"CardBattle.Models\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"80ade6d3-1d9c-44e6-8688-ed2c8a6d7440\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.Models/project.json",
    "content": "﻿{\n  \"frameworks\": {\n    \"net461\": {}\n  },\n  \"runtimes\": {\n    \"win\": {},\n    \"win-anycpu\": {}\n  },\n  \"dependencies\": {\n    \"System.Reactive\": \"3.0.0\",\n    \"System.ValueTuple\": \"4.0.1-beta-24416-08\"\n  }\n}"
  },
  {
    "path": "Demo/2016/Channels/samples/CardBattle/CardBattle.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.25618.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CardBattle.Client\", \"CardBattle.Client\\CardBattle.Client.csproj\", \"{242C5670-ECE8-4223-948A-D7B75B7FEF1B}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CardBattle.Models\", \"CardBattle.Models\\CardBattle.Models.csproj\", \"{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"lib\", \"lib\", \"{AA1E681C-0B48-4D50-B8B4-785EF8BC9C4A}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TaskLibrary.Channels\", \"..\\..\\..\\src\\TaskLibraries\\TaskLibrary.Channels\\TaskLibrary.Channels.csproj\", \"{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SystemAsync\", \"..\\..\\..\\src\\TaskLibraries\\SystemAsync\\SystemAsync.csproj\", \"{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tNoOpt|Any CPU = NoOpt|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B}.NoOpt|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B}.NoOpt|Any CPU.Build.0 = Release|Any CPU\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{242C5670-ECE8-4223-948A-D7B75B7FEF1B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}.NoOpt|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}.NoOpt|Any CPU.Build.0 = Release|Any CPU\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{80ADE6D3-1D9C-44E6-8688-ED2C8A6D7440}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}.NoOpt|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}.NoOpt|Any CPU.Build.0 = Release|Any CPU\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}.NoOpt|Any CPU.ActiveCfg = NoOpt|Any CPU\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}.NoOpt|Any CPU.Build.0 = NoOpt|Any CPU\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C} = {AA1E681C-0B48-4D50-B8B4-785EF8BC9C4A}\n\t\t{F861E95E-72C0-47E1-B282-F8FDBB79C8D9} = {AA1E681C-0B48-4D50-B8B4-785EF8BC9C4A}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2016/Channels/src/SystemAsync/AsyncAction.cs",
    "content": "﻿using System.Threading;\nusing System.Threading.Tasks;\n\nnamespace SystemAsync\n{\n    /// <summary>\n    /// 非同期メソッド用共通デリゲート。\n    /// </summary>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public delegate Task AsyncAction(CancellationToken ct);\n\n    /// <summary>\n    /// 非同期メソッド用共通デリゲート。\n    /// </summary>\n    /// <typeparam name=\"T1\"></typeparam>\n    /// <param name=\"x1\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public delegate Task AsyncAction<T1>(T1 x1, CancellationToken ct);\n\n    /// <summary>\n    /// 非同期メソッド用共通デリゲート。\n    /// </summary>\n    /// <typeparam name=\"T1\"></typeparam>\n    /// <typeparam name=\"T2\"></typeparam>\n    /// <param name=\"x1\"></param>\n    /// <param name=\"x2\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public delegate Task AsyncAction<T1, T2>(T1 x1, T2 x2, CancellationToken ct);\n\n    /// <summary>\n    /// 非同期メソッド用共通デリゲート。\n    /// </summary>\n    /// <typeparam name=\"T1\"></typeparam>\n    /// <typeparam name=\"T2\"></typeparam>\n    /// <typeparam name=\"T3\"></typeparam>\n    /// <param name=\"x1\"></param>\n    /// <param name=\"x2\"></param>\n    /// <param name=\"x3\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public delegate Task AsyncAction<T1, T2, T3>(T1 x1, T2 x2, T3 x3, CancellationToken ct);\n\n    /// <summary>\n    /// 非同期メソッド用共通デリゲート。\n    /// </summary>\n    /// <typeparam name=\"TResult\"></typeparam>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public delegate Task<TResult> AsyncFunc<TResult>(CancellationToken ct);\n\n    /// <summary>\n    /// 非同期メソッド用共通デリゲート。\n    /// </summary>\n    /// <typeparam name=\"T1\"></typeparam>\n    /// <typeparam name=\"TResult\"></typeparam>\n    /// <param name=\"x1\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public delegate Task<TResult> AsyncFunc<T1, TResult>(T1 x1, CancellationToken ct);\n\n    /// <summary>\n    /// 非同期メソッド用共通デリゲート。\n    /// </summary>\n    /// <typeparam name=\"T1\"></typeparam>\n    /// <typeparam name=\"T2\"></typeparam>\n    /// <typeparam name=\"TResult\"></typeparam>\n    /// <param name=\"x1\"></param>\n    /// <param name=\"x2\"></param>\n    /// <param name=\"ct\"></param>\n    /// <returns></returns>\n    public delegate Task<TResult> AsyncFunc<T1, T2, TResult>(T1 x1, T2 x2, CancellationToken ct);\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/SystemAsync/AsyncDisposable.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\n\nnamespace SystemAsync\n{\n    /// <summary>\n    /// <see cref=\"IAsyncDisposable\"/> 関連、ユーティリティ メソッドや拡張。\n    /// </summary>\n    public static class AsyncDisposable\n    {\n        /// <summary>\n        /// <see cref=\"Func{Task}\"/> から <see cref=\"IAsyncDisposable\"/> を作る。\n        /// </summary>\n        /// <param name=\"disposeAsync\"><see cref=\"IAsyncDisposable.DisposeAsync\"/> で呼びたい処理。</param>\n        /// <returns><see cref=\"IAsyncDisposable\"/> 化したもの。</returns>\n        public static IAsyncDisposable Create(Func<Task> disposeAsync) => new AsyncActionDisposer(disposeAsync);\n    }\n\n    internal class AsyncActionDisposer : IAsyncDisposable\n    {\n        Func<Task> _onDispose;\n\n        public AsyncActionDisposer(Func<Task> onDispose)\n        {\n            if (onDispose == null)\n                throw new ArgumentNullException();\n            _onDispose = onDispose;\n        }\n\n        public Task DisposeAsync() => _onDispose();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/SystemAsync/AsyncEventExtensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace SystemAsync\n{\n    /// <summary>\n    /// <see cref=\"IAsyncEvent{TEventArgs}\"/>拡張。\n    /// </summary>\n    public static class AsyncEventExtensions\n    {\n        /// <summary>\n        /// <see cref=\"AsyncAction{T1}\"/>以外の形式でイベントを購読する。\n        /// </summary>\n        public static IDisposable Subscribe<T>(this IAsyncEvent<T> e, Func<T, Task> handler) => e.Subscribe((_1, arg) => handler(arg));\n\n        /// <summary>\n        /// <see cref=\"AsyncAction{T1}\"/>以外の形式でイベントを購読する。\n        /// </summary>\n        public static IDisposable Subscribe<T>(this IAsyncEvent<T> e, Func<Task> handler) => e.Subscribe((_1, _2) => handler());\n\n        /// <summary>\n        /// <see cref=\"AsyncAction{T1}\"/>以外の形式でイベントを購読する。\n        /// </summary>\n        public static IDisposable Subscribe<T>(this IAsyncEvent<T> e, Action handler) => e.Subscribe((_1, _2) => { handler(); return Task.CompletedTask; });\n\n        /// <summary>\n        /// <see cref=\"AsyncAction{T1}\"/>以外の形式でイベントを購読する。\n        /// </summary>\n        public static IDisposable Subscribe<T>(this IAsyncEvent<T> e, Action<T> handler) => e.Subscribe((_1, args) => { handler(args); return Task.CompletedTask; });\n\n        /// <summary>\n        /// キャンセルされるまでの間イベントを購読する。\n        /// </summary>\n        public static void SubscribeUntil<T>(this IAsyncEvent<T> e, CancellationToken ct, AsyncHandler<T> handler)\n        {\n            var d = e.Subscribe(handler);\n            ct.Register(d.Dispose);\n        }\n\n        /// <summary>\n        /// キャンセルされるまでの間イベントを購読する。\n        /// </summary>\n        public static void SubscribeUntil<T>(this IAsyncEvent<T> e, CancellationToken ct, Func<T, Task> handler)\n        {\n            var d = e.Subscribe(handler);\n            ct.Register(d.Dispose);\n        }\n\n        /// <summary>\n        /// キャンセルされるまでの間イベントを購読する。\n        /// </summary>\n        public static void SubscribeUntil<T>(this IAsyncEvent<T> e, CancellationToken ct, Func<Task> handler)\n        {\n            var d = e.Subscribe(handler);\n            ct.Register(d.Dispose);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/SystemAsync/AsyncExtensions.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace SystemAsync\n{\n    /// <summary>\n    /// <see cref=\"AsyncFunc{TResult}\"/> 関連拡張。\n    /// </summary>\n    public static partial class AsyncExtensions\n    {\n\n        /// <summary>\n        /// 複数のタスクのうち、どれか1つが終わるのを待つ。\n        /// その1つのタスクが終わったら、残りのタスクはキャンセルする。\n        /// (内部で作った <see cref=\"CancellationToken\"/> を引数に渡してタスクを起動。)\n        /// </summary>\n        public static Task<T> First<T>(params AsyncFunc<T>[] tasks)\n        {\n            var cts = new CancellationTokenSource();\n            return First<T>(cts, tasks);\n        }\n\n        /// <summary>\n        /// 複数のタスクのうち、どれか1つが終わるのを待つ。\n        /// その1つのタスクが終わったら、残りのタスクはキャンセルする。\n        /// (引数で渡した1つの <see cref=\"CancellationTokenSource.Token\"/> を引数に渡してタスクを起動。)\n        /// </summary>\n        public static Task<T> First<T>(CancellationTokenSource cts, params AsyncFunc<T>[] tasks)\n        {\n            // JITエラー出るので展開\n\n            if (tasks.Length == 0)\n                throw new ArgumentNullException(\"tasks must contain at least one task\", \"tasks\");\n\n            var t = tasks.Select(x => x(cts.Token)).ToArray();\n\n            var tcs = new TaskCompletionSource<T>();\n\n            foreach (var task in t)\n            {\n                task.ContinueWith(x =>\n                    {\n                        if (x.IsCanceled)\n                            tcs.TrySetCanceled();\n                        else if (x.Exception != null)\n                            tcs.TrySetException(x.Exception);\n                        else\n                            tcs.TrySetResult(x.Result);\n                        cts.Cancel();\n                    });\n            }\n\n            return tcs.Task;\n        }\n\n        /// <summary>\n        /// 複数のタスクのうち、どれか1つが終わるのを待つ。\n        /// その1つのタスクが終わったら、残りのタスクはキャンセルする。\n        /// (内部で作った <see cref=\"CancellationToken\"/> を引数に渡してタスクを起動。)\n        /// </summary>\n        public static Task First(params AsyncAction[] tasks)\n        {\n            var cts = new CancellationTokenSource();\n            return First(cts, tasks);\n        }\n\n        /// <summary>\n        /// 複数のタスクのうち、どれか1つが終わるのを待つ。\n        /// その1つのタスクが終わったら、残りのタスクはキャンセルする。\n        /// (引数で渡した1つの <see cref=\"CancellationTokenSource.Token\"/> を引数に渡してタスクを起動。)\n        /// </summary>\n        public static Task First(CancellationTokenSource cts, params AsyncAction[] tasks)\n        {\n            if (tasks.Length == 0)\n                throw new ArgumentNullException(\"tasks must contain at least one task\", \"tasks\");\n\n            var t = tasks.Select(x => x(cts.Token)).ToArray();\n\n            var tcs = new TaskCompletionSource<object>();\n\n            foreach (var task in t)\n            {\n                task.ContinueWith(x =>\n                {\n                    if (x.Exception != null)\n                        tcs.TrySetException(x.Exception);\n                    else\n                        tcs.TrySetResult(null);\n                    cts.Cancel();\n                });\n            }\n\n            return tcs.Task;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/SystemAsync/AsyncHandler.cs",
    "content": "﻿using System.Threading.Tasks;\n\nnamespace SystemAsync\n{\n    /// <summary>\n    /// <see cref=\"System.EventHandler{TEventArgs}\"/> の非同期版。\n    /// </summary>\n    /// <typeparam name=\"TEventArgs\">イベント引数の型。</typeparam>\n    /// <param name=\"sender\">イベント送信元。</param>\n    /// <param name=\"args\">イベント引数。</param>\n    public delegate Task AsyncHandler<TEventArgs>(object sender, TEventArgs args);\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/SystemAsync/AsyncHandlerList.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace SystemAsync\n{\n    /// <summary>\n    /// Rx でいう Subject : IObserver, IObservable。\n    /// <see cref=\"IAsyncEvent{TEventArgs}\"/> の実装。\n    ///\n    /// <see cref=\"AsyncHandler{TEventArgs}\"/> を束ねるクラス。\n    /// 1つ1つ await しないと行けないので、マルチキャスト デリゲート(デリゲートに対する += でデリゲート連結)が使えないので、Listで実装。\n    /// </summary>\n    /// <example>\n    /// <![CDATA[\n    /// public IAsyncEvent<T> SomeEvent { get { return _someEvent; } }\n    /// protected Task<T> OnSomeEvent(T args) => _someEvent.InvokeAsync(this, args);\n    /// private AsyncHandlerList<T> _someEvent = new AsyncHandlerList<T>();\n    /// ]]>\n    /// </example>\n    /// <typeparam name=\"TEventArgs\">イベント引数の型。</typeparam>\n    public class AsyncHandlerList<TEventArgs> : IAsyncEvent<TEventArgs>\n    {\n        private AsyncHandler<TEventArgs>[] _list;\n        private object _sync = new object();\n\n        /// <summary>\n        /// 1つでもハンドラーが刺さってたら true。\n        /// </summary>\n        public bool HasAny => _list != null && _list.Length != 0;\n\n        /// <summary>\n        /// イベントを起こす。\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"args\"></param>\n        /// <returns></returns>\n        public async Task InvokeAsync(object sender, TEventArgs args)\n        {\n            // ↓これだけでいいはずなんだけども、たぶん iOS AOT で動かない。\n            // var actions = System.Threading.Interlocked.Exchange(ref _list, null);\n            // _sync が要らなかったら、単なる配列の薄いラッパーだし、struct にしたいんだけども。\n            AsyncHandler<TEventArgs>[] actions;\n            lock (_sync)\n            {\n                actions = _list;\n            }\n\n            if (actions != null)\n                foreach (var a in actions)\n                    await a(sender, args);\n        }\n\n        private void Add(AsyncHandler<TEventArgs> action)\n        {\n            // こっちは CompareExchage\n            lock (_sync)\n            {\n                _list = _list == null\n                    ? new[] { action }\n                    : _list.Concat(new[] { action }).ToArray();\n            }\n        }\n\n        private void Remove(AsyncHandler<TEventArgs> action)\n        {\n            lock (_sync)\n            {\n                _list = _list == null\n                    ? new AsyncHandler<TEventArgs>[] { }\n                    : _list.Where(x => x != action).ToArray();\n            }\n        }\n\n        /// <summary>\n        /// <see cref=\"IDisposable.Dispose\"/>\n        /// ハンドラーを全削除。\n        /// </summary>\n        public void Dispose()\n        {\n            lock (_sync)\n            {\n                _list = null;\n            }\n        }\n\n        /// <summary>\n        /// イベント購読。\n        /// </summary>\n        /// <param name=\"handler\"></param>\n        /// <returns></returns>\n        public IDisposable Subscribe(AsyncHandler<TEventArgs> handler)\n        {\n            Add(handler);\n            return new ActionDisposer(() => Remove(handler));\n        }\n    }\n\n    internal class ActionDisposer : IDisposable\n    {\n        Action _onDispose;\n\n        public ActionDisposer(Action onDispose)\n        {\n            if (onDispose == null)\n                throw new ArgumentNullException();\n            _onDispose = onDispose;\n        }\n\n        public void Dispose()\n        {\n            _onDispose();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/SystemAsync/IAsyncDisposable.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\n\nnamespace SystemAsync\n{\n    /// <summary>\n    /// <see cref=\"IDisposable\"/> の非同期版。\n    /// </summary>\n    public interface IAsyncDisposable\n    {\n        /// <summary>\n        /// 破棄処理。\n        /// </summary>\n        /// <returns></returns>\n        Task DisposeAsync();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/SystemAsync/IAsyncEvent.cs",
    "content": "﻿using System;\n\nnamespace SystemAsync\n{\n    /// <summary>\n    /// イベント処理を非同期にやって、\n    /// それをイベント送信側で await したい場合に使う。\n    /// Rx 的にイベント処理するのの非同期ハンドリング版。\n    /// </summary>\n    /// <typeparam name=\"TEventArgs\"></typeparam>\n    public interface IAsyncEvent<TEventArgs> : IDisposable\n    {\n        /// <summary>\n        /// イベント購読。\n        /// Rx の Subscribe 的なもの。\n        /// </summary>\n        /// <param name=\"handler\">イベント ハンドラー。</param>\n        /// <returns>購読解除用の <see cref=\"IDisposable\"/>。</returns>\n        IDisposable Subscribe(AsyncHandler<TEventArgs> handler);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/SystemAsync/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"SystemAsync\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"SystemAsync\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"f861e95e-72c0-47e1-b282-f8fdbb79c8d9\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/Channels/src/SystemAsync/SynchronizationContextExtensions.cs",
    "content": "﻿using System;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace SystemAsync\n{\n    /// <summary>\n    /// <see cref=\"SynchronizationContext\"/>拡張。\n    /// </summary>\n    public static class SynchronizationContextExtensions\n    {\n        /// <summary>\n        /// null チェック付き\n        /// <paramref name=\"sync\"/> が <see cref=\"SynchronizationContext.Current\"/> と違うときだけ Post。\n        /// 同じなら直接アクション呼び出し。\n        /// </summary>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"action\"></param>\n        public static void PostIfNotCurrent(this SynchronizationContext sync, Action action)\n        {\n            if (sync != null && sync != SynchronizationContext.Current)\n                sync.Post(x => action(), null);\n            else\n                action();\n        }\n\n        /// <summary>\n        /// null チェック付き\n        /// <paramref name=\"sync\"/> が <see cref=\"SynchronizationContext.Current\"/> と違うときだけ Post。\n        /// 同じなら直接アクション呼び出し。\n        /// </summary>\n        /// <typeparam name=\"TState\"></typeparam>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"action\"></param>\n        /// <param name=\"state\"></param>\n        public static void PostIfNotCurrent<TState>(this SynchronizationContext sync, Action<TState> action, TState state)\n        {\n            if (sync != null && sync != SynchronizationContext.Current)\n                sync.Post(x => action((TState)x), state);\n            else\n                action(state);\n        }\n\n        /// <summary>\n        /// null チェック付き\n        /// <paramref name=\"sync\"/> が <see cref=\"SynchronizationContext.Current\"/> と違うときだけ Post。\n        /// 同じなら直接アクション呼び出し。\n        /// </summary>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"func\"></param>\n        public static Task<TResult> PostIfNotCurrentAsync<TResult>(this SynchronizationContext sync, Func<TResult> func)\n        {\n            if (sync != null && sync != SynchronizationContext.Current)\n            {\n                var tcs = new TaskCompletionSource<TResult>();\n                sync.Post(x =>\n                {\n                    try\n                    {\n                        var r = func();\n                        tcs.TrySetResult(r);\n                    }\n                    catch (Exception ex)\n                    {\n                        tcs.TrySetException(ex);\n                    }\n                }, null);\n\n                return tcs.Task;\n            }\n            else\n            {\n                return Task.FromResult(func());\n            }\n        }\n\n        /// <summary>\n        /// null チェック付き\n        /// <paramref name=\"sync\"/> が <see cref=\"SynchronizationContext.Current\"/> と違うときだけ Post。\n        /// 同じなら直接アクション呼び出し。\n        /// </summary>\n        /// <typeparam name=\"TState\"></typeparam>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"func\"></param>\n        /// <param name=\"state\"></param>\n        public static Task<TResult> PostIfNotCurrentAsync<TState, TResult>(this SynchronizationContext sync, Func<TState, TResult> func, TState state)\n        {\n            if (sync != null && sync != SynchronizationContext.Current)\n            {\n                var tcs = new TaskCompletionSource<TResult>();\n                sync.Post(x =>\n                {\n                    try\n                    {\n                        var r = func(state);\n                        tcs.TrySetResult(r);\n                    }\n                    catch (Exception ex)\n                    {\n                        tcs.TrySetException(ex);\n                    }\n                }, null);\n\n                return tcs.Task;\n            }\n            else\n            {\n                return Task.FromResult(func(state));\n            }\n        }\n\n        /// <summary>\n        /// null チェック付き\n        /// <paramref name=\"sync\"/> が <see cref=\"SynchronizationContext.Current\"/> と違うときだけ Post。\n        /// 同じなら直接アクション呼び出し。\n        /// </summary>\n        /// <typeparam name=\"TState\"></typeparam>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"func\"></param>\n        /// <param name=\"state\"></param>\n        /// <returns></returns>\n        public static Task PostIfNotCurrentAsync<TState>(this SynchronizationContext sync, Action<TState> func, TState state)\n            => PostIfNotCurrentAsync(sync, new Func<TState, object>(x => { func(x); return null; }), state);\n\n        /// <summary>\n        /// null チェック付き\n        /// <paramref name=\"sync\"/> が <see cref=\"SynchronizationContext.Current\"/> と違うときだけ Post。\n        /// 同じなら直接アクション呼び出し。\n        /// </summary>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"actionAsync\"></param>\n        /// <returns></returns>\n        public static Task PostIfNotCurrentAsync(this SynchronizationContext sync, Func<Task> actionAsync)\n        {\n            if (sync != null && sync != SynchronizationContext.Current)\n                return PostAsync(sync, actionAsync);\n            else\n                return actionAsync();\n        }\n\n        /// <summary>\n        /// null チェック付き\n        /// <paramref name=\"sync\"/> が <see cref=\"SynchronizationContext.Current\"/> と違うときだけ Post。\n        /// 同じなら直接アクション呼び出し。\n        /// </summary>\n        /// <typeparam name=\"TState\"></typeparam>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"actionAsync\"></param>\n        /// <param name=\"asyncState\"></param>\n        /// <returns></returns>\n        public static Task PostIfNotCurrentAsync<TState>(this SynchronizationContext sync, Func<TState, Task> actionAsync, TState asyncState)\n        {\n            if (sync != null && sync != SynchronizationContext.Current)\n                return PostAsync(sync, actionAsync, asyncState);\n            else\n                return actionAsync(asyncState);\n        }\n\n        /// <summary>\n        /// null チェック付き\n        /// <paramref name=\"sync\"/> が <see cref=\"SynchronizationContext.Current\"/> と違うときだけ Post。\n        /// 同じなら直接アクション呼び出し。\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"actionAsync\"></param>\n        /// <returns></returns>\n        public static Task<T> PostIfNotCurrentAsync<T>(this SynchronizationContext sync, Func<Task<T>> actionAsync)\n        {\n            if (sync != null && sync != SynchronizationContext.Current)\n                return PostAsync(sync, actionAsync);\n            else\n                return actionAsync();\n        }\n\n        /// <summary>\n        /// null チェック付き\n        /// <paramref name=\"sync\"/> が <see cref=\"SynchronizationContext.Current\"/> と違うときだけ Post。\n        /// 同じなら直接アクション呼び出し。\n        /// </summary>\n        /// <typeparam name=\"TState\"></typeparam>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"actionAsync\"></param>\n        /// <param name=\"asyncState\"></param>\n        /// <returns></returns>\n        public static Task<TResult> PostIfNotCurrentAsync<TState, TResult>(this SynchronizationContext sync, Func<TState, Task<TResult>> actionAsync, TState asyncState)\n        {\n            if (sync != null && sync != SynchronizationContext.Current)\n                return PostAsync(sync, actionAsync, asyncState);\n            else\n                return actionAsync(asyncState);\n        }\n\n        /// <summary>\n        /// <see cref=\"SynchronizationContext.Post(SendOrPostCallback, object)\"/> 内でタスクを起動。\n        /// </summary>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"actionAsync\"></param>\n        /// <returns></returns>\n        public static Task PostAsync(this SynchronizationContext sync, Func<Task> actionAsync)\n        {\n            var tcs = new TaskCompletionSource<object>();\n\n            sync.Post(async x =>\n            {\n                try\n                {\n                    await actionAsync();\n                    tcs.TrySetResult(null);\n                }\n                catch(Exception ex)\n                {\n                    tcs.TrySetException(ex);\n                }\n\n            }, null);\n\n            return tcs.Task;\n        }\n\n        /// <summary>\n        /// <see cref=\"SynchronizationContext.Post(SendOrPostCallback, object)\"/> 内でタスクを起動。\n        /// </summary>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"actionAsync\"></param>\n        /// <param name=\"asyncState\"></param>\n        /// <returns></returns>\n        public static Task PostAsync<TState>(this SynchronizationContext sync, Func<TState, Task> actionAsync, TState asyncState)\n        {\n            var tcs = new TaskCompletionSource<object>();\n\n            sync.Post(async x =>\n            {\n                try\n                {\n                    await actionAsync((TState)x);\n                    tcs.TrySetResult(null);\n                }\n                catch (Exception ex)\n                {\n                    tcs.TrySetException(ex);\n                }\n\n            }, asyncState);\n\n            return tcs.Task;\n        }\n\n        /// <summary>\n        /// <see cref=\"SynchronizationContext.Post(SendOrPostCallback, object)\"/> 内でタスクを起動。\n        /// </summary>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"actionAsync\"></param>\n        /// <returns></returns>\n        public static Task<TResult> PostAsync<TResult>(this SynchronizationContext sync, Func<Task<TResult>> actionAsync)\n        {\n            var tcs = new TaskCompletionSource<TResult>();\n\n            sync.Post(async x =>\n            {\n                try\n                {\n                    var r = await actionAsync();\n                    tcs.TrySetResult(r);\n                }\n                catch (Exception ex)\n                {\n                    tcs.TrySetException(ex);\n                }\n\n            }, null);\n\n            return tcs.Task;\n        }\n\n        /// <summary>\n        /// <see cref=\"SynchronizationContext.Post(SendOrPostCallback, object)\"/> 内でタスクを起動。\n        /// </summary>\n        /// <typeparam name=\"TState\"></typeparam>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"sync\"></param>\n        /// <param name=\"actionAsync\"></param>\n        /// <param name=\"asyncState\"></param>\n        /// <returns></returns>\n        public static Task<TResult> PostAsync<TState, TResult>(this SynchronizationContext sync, Func<TState, Task<TResult>> actionAsync, TState asyncState)\n        {\n            var tcs = new TaskCompletionSource<TResult>();\n\n            sync.Post(async x =>\n            {\n                try\n                {\n                    var r = await actionAsync((TState)x);\n                    tcs.TrySetResult(r);\n                }\n                catch (Exception ex)\n                {\n                    tcs.TrySetException(ex);\n                }\n\n            }, asyncState);\n\n            return tcs.Task;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/SystemAsync/SystemAsync.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{F861E95E-72C0-47E1-B282-F8FDBB79C8D9}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>SystemAsync</RootNamespace>\n    <AssemblyName>SystemAsync</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <DocumentationFile>bin\\Debug\\SystemAsync.XML</DocumentationFile>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <DocumentationFile>bin\\Release\\SystemAsync.XML</DocumentationFile>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'NoOpt|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <DocumentationFile>bin\\Release\\SystemAsync.XML</DocumentationFile>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"AsyncAction.cs\" />\n    <Compile Include=\"AsyncDisposable.cs\" />\n    <Compile Include=\"AsyncEventExtensions.cs\" />\n    <Compile Include=\"AsyncHandler.cs\" />\n    <Compile Include=\"AsyncHandlerList.cs\" />\n    <Compile Include=\"IAsyncDisposable.cs\" />\n    <Compile Include=\"IAsyncEvent.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"AsyncExtensions.cs\" />\n    <Compile Include=\"SynchronizationContextExtensions.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2016/Channels/src/SystemAsync/project.json",
    "content": "﻿{\n  \"frameworks\": {\n    \"net35\": {}\n  },\n  \"runtimes\": {\n    \"win\": {},\n    \"win-anycpu\": {}\n  },\n  \"dependencies\": {\n    \"MinimumAsyncBridge\": \"0.10.0.0\"\n  }\n}"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/AsyncActionList.cs",
    "content": "﻿using SystemAsync;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// <see cref=\"System.MulticastDelegate\"/>みたいなもの。\n    /// </summary>\n    /// <typeparam name=\"T\">引数の型。</typeparam>\n    /// <remarks>\n    /// 戻り値のあるデリゲートの += (<see cref=\"System.Delegate.Combine(System.Delegate, System.Delegate)\"/>)は、最初の1個の戻り値しか返さない。\n    /// 非同期メソッドをawaitするためには戻り値の<see cref=\"Task\"/>が必要なわけで、<see cref=\"System.MulticastDelegate\"/>は使えない。\n    ///\n    /// 引数の個数違いのやつを作るのは大変すぎるし、<see cref=\"ISender{TMessage}\"/>用と割り切ってるので、1引数版しか作らない。\n    ///\n    /// <see cref=\"Add(AsyncAction{T})\"/>とかの中で<see cref=\"Interlocked.CompareExchange{T}(ref T, T, T)\"/>を使ってる。\n    /// 古いUnityだとこのメソッドが呼べなかったんだけども。今なら使えると思う。たぶん。要確認。\n    /// </remarks>\n    internal struct AsyncActionList<T>\n    {\n        public AsyncAction<T>[] _actions;\n\n        public void Add(AsyncAction<T> action)\n        {\n            AsyncAction<T>[] x2;\n            var x1 = _actions;\n            do\n            {\n                x2 = x1;\n                var x3 = x2 == null ? new[] { action } : x2.Append(action).ToArray();\n                x1 = Interlocked.CompareExchange(ref _actions, x3, x2);\n            }\n            while (x1 != x2);\n        }\n\n        public void Remove(AsyncAction<T> action)\n        {\n            AsyncAction<T>[] x2;\n            var x1 = _actions;\n            do\n            {\n                x2 = x1;\n                var x3 = x2.Where(x => x != action).ToArray();\n                x1 = Interlocked.CompareExchange(ref _actions, x3, x2);\n            }\n            while (x1 != x2);\n        }\n\n        public async Task InvokeSequentialAsync(T args, CancellationToken ct)\n        {\n            var list = _actions;\n            if (list == null || list.Length == 0) return;\n            foreach (var x in list)\n            {\n                await x(args, ct);\n            }\n        }\n\n        public Task InvokeParallelAsync(T args, CancellationToken ct)\n        {\n            var list = _actions;\n            if (list == null || list.Length == 0) return Task.CompletedTask;\n            return Task.WhenAll(list.Select(x => x(args, ct)));\n        }\n    }\n\n    internal static class AsyncActionListExtensions\n    {\n        internal static Task InvokeAsync<T>(this AsyncActionList<T> list, InvocationMode mode, T args, CancellationToken ct)\n            => mode == InvocationMode.Sequential\n            ? list.InvokeSequentialAsync(args, ct)\n            : list.InvokeParallelAsync(args, ct);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/Backport/Disposable.cs",
    "content": "﻿using System;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// Reactive Extensions(Rx)にあるようなやつ。\n    /// これ1個だけのためにRx依存もしたくないので。\n    /// </summary>\n    internal class Disposable\n    {\n        public static IDisposable Create(Action dispose) => new ActionDisposable(dispose);\n\n        class ActionDisposable : IDisposable\n        {\n            private Action _dispose;\n            public ActionDisposable(Action dispose) { _dispose = dispose; }\n            public void Dispose() => _dispose();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/Backport/EnumerableEx.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace TaskLibrary.Channels\n{\n    internal static class EnumerableEx\n    {\n        /// <summary>\n        /// 末尾に1要素追加。\n        ///\n        /// https://github.com/dotnet/corefx/commit/964281dfc6e1828f078890099e0042f2e5ed85bf\n        /// .NET 4.6.2 で追加予定のメソッド。\n        /// もし 4.6.2 未満サポートを切ってもよくなったら消す。\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"source\"></param>\n        /// <param name=\"element\"></param>\n        /// <returns></returns>\n        public static IEnumerable<T> Append<T>(this IEnumerable<T> source, T element)\n        {\n            foreach (var item in source) yield return item;\n            yield return element;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/CancellableReceiver.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// (<see cref=\"Channel{TMessage}\"/>, <see cref=\"CancellationToken\"/>)のペア。\n    /// </summary>\n    /// <typeparam name=\"TMessage\"></typeparam>\n    public struct CancellableReceiver<TMessage>\n    {\n        /// <summary>\n        /// チャネル。\n        /// </summary>\n        public IReceiver<TMessage> Receiver { get; }\n\n        /// <summary>\n        /// <see cref=\"IReceiver{TMessage}.OnNext(Holder{TMessage}, CancellationToken)\"/>に渡すトークン。\n        /// </summary>\n        public CancellationToken CancellationToken { get; }\n\n        /// <summary></summary>\n        /// <param name=\"receiver\"><see cref=\"Channel\"/></param>\n        /// <param name=\"cancellationToken\"><see cref=\"CancellationToken\"/></param>\n        public CancellableReceiver(IReceiver<TMessage> receiver, CancellationToken cancellationToken)\n        {\n            Receiver = receiver;\n            CancellationToken = cancellationToken;\n        }\n    }\n\n    public static class CancellableChannel\n    {\n        /// <summary>\n        /// <see cref=\"IReceiver{TMessage}\"/>と<see cref=\"CancellationToken\"/>は大体ペアで引き回すことになるので、ペア化してしまう。\n        /// </summary>\n        public static CancellableReceiver<TMessage> WithCancel<TMessage>(this IReceiver<TMessage> reciever, CancellationToken ct)\n            => new CancellableReceiver<TMessage>(reciever, ct);\n\n        /// <summary>\n        /// <see cref=\"CancellableReceiver{TMessage}\"/>\n        /// <see cref=\"ReceiverExtensions.SendAsync{TMessageBase, TMessage}(IReceiver{TMessageBase}, TMessage, CancellationToken)\"/>\n        /// </summary>\n        public static Task<TMessage> SendAsync<TMessageBase, TMessage>(this CancellableReceiver<TMessageBase> reciever, TMessage message)\n            where TMessage : TMessageBase\n            => reciever.Receiver.SendAsync(message, reciever.CancellationToken);\n\n        /// <summary>\n        /// <see cref=\"CancellableReceiver{TMessage}\"/>\n        /// <see cref=\"ReceiverExtensions.SendAsync{TMessageBase, TMessage}(IReceiver{TMessageBase}, IEnumerable{TMessage}, CancellationToken)\"/>\n        /// </summary>\n        public static Task<IEnumerable<TMessage>> SendAsync<TMessageBase, TMessage>(this CancellableReceiver<TMessageBase> reciever, TMessage[] messages)\n            where TMessage : TMessageBase\n            => SendAsync(reciever, (IEnumerable<TMessage>)messages);\n\n        /// <summary>\n        /// <see cref=\"CancellableReceiver{TMessage}\"/>\n        /// <see cref=\"ReceiverExtensions.SendAsync{TMessageBase, TMessage}(IReceiver{TMessageBase}, IEnumerable{TMessage}, CancellationToken)\"/>\n        /// </summary>\n        public static Task<IEnumerable<TMessage>> SendAsync<TMessageBase, TMessage>(this CancellableReceiver<TMessageBase> reciever, IEnumerable<TMessage> messages)\n            where TMessage : TMessageBase\n            => reciever.Receiver.SendAsync(messages, reciever.CancellationToken);\n\n        /// <summary>\n        /// 定型処理になりそうだったので静的メソッドでチャネル生成。\n        /// </summary>\n        /// <typeparam name=\"TMessage\"></typeparam>\n        /// <param name=\"channel\"></param>\n        /// <param name=\"executor\">チャネルを使って、メッセージを送り出す非同期メソッド。</param>\n        /// <param name=\"ct\">キャンセル用のトークン。</param>\n        /// <returns>作ったチャネル。</returns>\n        public static void Execute<TMessage>(this IReceiver<TMessage> channel, Func<CancellableReceiver<TMessage>, Task> executor, CancellationToken ct)\n        {\n            channel.WithCancel(ct).Execute(executor);\n        }\n\n        /// <summary>\n        /// 定型処理になりそうだったので静的メソッドでチャネル生成。\n        /// </summary>\n        /// <typeparam name=\"TMessage\"></typeparam>\n        /// <param name=\"receiver\"></param>\n        /// <param name=\"executor\">チャネルを使って、メッセージを送り出す非同期メソッド。</param>\n        public static void Execute<TMessage>(this CancellableReceiver<TMessage> receiver, Func<CancellableReceiver<TMessage>, Task> executor)\n        {\n            receiver.Receiver.SetCompletion(executor(receiver));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/Channel.cs",
    "content": "﻿using System;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing SystemAsync;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// イベントの送信元と受信先の間に挟まるクラス。\n    /// Rxでいう<see cref=\"System.Reactive.Subjects.Subject{T}\"/>。\n    /// </summary>\n    /// <typeparam name=\"TMessage\">メッセージ(イベント引数)の型。</typeparam>\n    public class Channel<TMessage> : IReceiver<TMessage>, ISender<Holder<TMessage>>\n    {\n        /// <summary>\n        /// 複数のハンドラーが呼ばれた場合に、どう呼び出すか。\n        /// </summary>\n        public InvocationMode InvocationMode { get; }\n\n        /// <summary>\n        /// </summary>\n        /// <param name=\"mode\"><see cref=\"InvocationMode\"/></param>\n        public Channel(InvocationMode mode = InvocationMode.Parallel)\n        {\n            InvocationMode = mode;\n        }\n\n        /// <summary><see cref=\"IReceiver{TMessage}\"/></summary>\n        public Task OnNext(Holder<TMessage> message, CancellationToken ct)\n            =>  _handlers.InvokeAsync(InvocationMode, message, ct);\n\n        private AsyncActionList<Holder<TMessage>> _handlers;\n\n        /// <summary><see cref=\"ISender{TMessage}\"/></summary>\n        public IDisposable Subscribe(AsyncAction<Holder<TMessage>> handler)\n        {\n            _handlers.Add(handler);\n            return Disposable.Create(() => _handlers.Remove(handler));\n        }\n\n        /// <summary><see cref=\"ISender{TMessage}\"/></summary>\n        public Task Completed { get; private set; }\n\n        /// <summary><see cref=\"IReceiver{TMessage}\"/></summary>\n        public void SetCompletion(Task completion) => Completed = completion;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/DispatcherChannel.cs",
    "content": "﻿using SystemAsync;\nusing System;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// 同期コンテキストを拾って、<see cref=\"SynchronizationContext.Post(SendOrPostCallback, object)\"/>内でイベントハンドラーを実行するチャネル。\n    /// </summary>\n    /// <typeparam name=\"T\">メッセージの型。</typeparam>\n    public class DispatcherChannel<T> : ISender<T>\n    {\n        private ISender<T> _inner;\n        private SynchronizationContext _context;\n\n        /// <summary>\n        /// </summary>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"context\">ハンドラーを実行したい同期コンテキスト。null を渡すと、コンストラクター内で<see cref=\"SynchronizationContext.Current\"/>を拾う。</param>\n        public DispatcherChannel(ISender<T> sender, SynchronizationContext context = null)\n        {\n            _context = context ?? SynchronizationContext.Current;\n            _inner = sender;\n        }\n\n        /// <summary><see cref=\"ISender{TMessage}\"/></summary>\n        public IDisposable Subscribe(AsyncAction<T> handler)\n            => _inner.Subscribe(async (message, ct) =>\n            {\n                await _context.PostIfNotCurrentAsync(() => handler(message, ct)).ConfigureAwait(false);\n\n                // ↑のPostの実装的に、スレッドプール上で実行してても以降の処理がUIスレッドに移っちゃったりする。\n                // この空 await はちょっといまいちだけども…\n                await Task.Run(() => { }).ConfigureAwait(false);\n            });\n\n        /// <summary><see cref=\"ISender{TMessage}\"/></summary>\n        public Task Completed => _inner.Completed;\n    }\n\n    public static partial class Channel\n    {\n        /// <summary>\n        /// 拡張メソッドで<see cref=\"DispatcherChannel{T}\"/>生成。\n        /// </summary>\n        public static DispatcherChannel<T> ObserveOn<T>(this ISender<T> sender, SynchronizationContext context = null)\n            => new DispatcherChannel<T>(sender, context);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/DistributiveChannel.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing SystemAsync;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// 宛先ID ＋ メッセージ。\n    /// </summary>\n    /// <typeparam name=\"TMessage\">メッセージ(イベント引数)の型。</typeparam>\n    public struct DistributiveMessage<TMessage>\n    {\n        /// <summary>\n        /// 宛先ID。\n        /// null の時は全体宛。\n        /// </summary>\n        public int? Address { get; }\n\n        /// <summary>\n        /// 元々のメッセージ。\n        /// </summary>\n        public TMessage Message { get; }\n\n        /// <summary></summary>\n        /// <param name=\"address\"><see cref=\"Address\"/></param>\n        /// <param name=\"message\"><see cref=\"Message\"/></param>\n        public DistributiveMessage(int? address, TMessage message)\n        {\n            Address = address;\n            Message = message;\n        }\n    }\n\n    /// <summary>\n    /// 並列メッセージ送信(<see cref=\"IReceiver{TMessage}.OnNext(Holder{TMessage}, System.Threading.CancellationToken)\"/>に配列がわたってきてる)の時に、\n    /// 送付先を分配する(配列をばらして、1個1個ばらばらに<see cref=\"ISender{TMessage}.Subscribe(Async.AsyncAction{TMessage})\"/>したハンドラーに送る)。\n    /// </summary>\n    /// <typeparam name=\"TMessage\">メッセージ(イベント引数)の型。</typeparam>\n    /// <remarks>\n    /// コンストラクターで引数に渡した<see cref=\"ISender{TMessage}\"/>をsubscribeする。\n    /// 購読解除するためには<see cref=\"IDisposable.Dispose\"/>を呼ぶ。\n    /// </remarks>\n    public class DistributiveChannel<TMessage> : ISender<DistributiveMessage<TMessage>>\n    {\n        private ISender<Holder<TMessage>> _inner;\n\n        /// <summary>\n        /// </summary>\n        /// <param name=\"sender\">メッセージ送信元。</param>\n        public DistributiveChannel(ISender<Holder<TMessage>> sender)\n        {\n            _inner = sender;\n        }\n\n        /// <summary><see cref=\"ISender{TMessage}\"/></summary>\n        public IDisposable Subscribe(AsyncAction<DistributiveMessage<TMessage>> handler)\n            => _inner.Subscribe(async (message, ct) =>\n            {\n                var array = message.Array;\n                if (array != null)\n                {\n                    await Task.WhenAll(array.Select(x => HandleAsync(handler, x, ct)));\n                }\n                else\n                {\n                    await HandleAsync(handler, message.Value, ct);\n                }\n            });\n\n        private Task HandleAsync(AsyncAction<DistributiveMessage<TMessage>> handler, TMessage x, System.Threading.CancellationToken ct)\n        {\n            var responsive = x as IResponsiveMessage;\n            return handler(new DistributiveMessage<TMessage>(responsive?.Address, x), ct);\n        }\n\n        /// <summary><see cref=\"ISender{TMessage}\"/></summary>\n        public Task Completed => _inner.Completed;\n\n        /// <summary>\n        /// 指定した配送先のメッセージだけを取り出すチャネルを取得。\n        /// </summary>\n        /// <param name=\"address\">配送先。全体宛の(配送先の指定がない)メッセージを受け取りたい場合はnullを渡す。</param>\n        /// <returns></returns>\n        public ISender<TMessage> GetChannel(int? address)\n            => this.Filter(x => x.Address == address, x => x.Message);\n    }\n\n    public static partial class Channel\n    {\n        /// <summary>\n        /// 拡張メソッドで<see cref=\"DistributiveChannel{TMessage}\"/>生成。\n        /// </summary>\n        /// <typeparam name=\"TMessage\"></typeparam>\n        /// <param name=\"sender\"></param>\n        /// <returns></returns>\n        public static DistributiveChannel<TMessage> Distribute<TMessage>(this ISender<Holder<TMessage>> sender)\n            => new DistributiveChannel<TMessage>(sender);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/FilterChannel.cs",
    "content": "﻿using SystemAsync;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// Where, Select。\n    /// あんまりWhereとSelectを分ける意味なさそうだったので1クラスで両方。\n    /// </summary>\n    /// <typeparam name=\"TSource\">フィルター元の要素の型。</typeparam>\n    /// <typeparam name=\"TTarget\">フィルター結果の要素の型。</typeparam>\n    public class FilterChannel<TSource, TTarget> : ISender<TTarget>\n    {\n        private readonly ISender<TSource> _inner;\n        private readonly Func<TSource, bool> _predicate;\n        private readonly Func<TSource, TTarget> _selector;\n\n        /// <summary>\n        /// </summary>\n        /// <param name=\"sender\">フィルター元。</param>\n        /// <param name=\"predicate\">trueを返す要素だけを残す。</param>\n        /// <param name=\"selector\">要素の変換関数。</param>\n        public FilterChannel(ISender<TSource> sender, Func<TSource, bool> predicate, Func<TSource, TTarget> selector)\n        {\n            _inner = sender;\n            _predicate = predicate;\n            _selector = selector;\n        }\n\n        public Task Completed => _inner.Completed;\n\n        public IDisposable Subscribe(AsyncAction<TTarget> handler)\n            => _inner.Subscribe(async (message, ct) =>\n            {\n                if (_predicate(message))\n                {\n                    var t = _selector(message);\n                    await handler(t, ct);\n                }\n            });\n    }\n\n    public static partial class Channel\n    {\n        public static ISender<TTarget> Filter<TSource, TTarget>(this ISender<TSource> source, Func<TSource, bool> predicate, Func<TSource, TTarget> selector)\n            => new FilterChannel<TSource, TTarget>(source, predicate, selector);\n\n        public static ISender<TSource> Where<TSource>(this ISender<TSource> source, Func<TSource, bool> predicate)\n            => new FilterChannel<TSource, TSource>(source, predicate, x => x);\n\n        public static ISender<TTarget> Select<TSource, TTarget>(this ISender<TSource> source, Func<TSource, TTarget> selector)\n            => new FilterChannel<TSource, TTarget>(source, x => true, selector);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/Holder.cs",
    "content": "﻿namespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// 値 or その型の配列を格納する型。\n    /// union 型を使って T | T[] とか書きたいやつ。\n    /// </summary>\n    /// <typeparam name=\"T\">値の型。</typeparam>\n    /// <remarks>\n    /// 名前は要検討…\n    /// T[] で持って、値の時は new[] { value } するとかでもいいんだけど、ヒープ アロケーション減らすためにこれを使う。\n    /// </remarks>\n    public struct Holder<T>\n    {\n        private readonly object _value;\n\n        /// <summary>\n        /// 値を代入。\n        /// </summary>\n        /// <param name=\"value\"></param>\n        public Holder(T value)\n        {\n            _value = value;\n        }\n\n        /// <summary>\n        /// 配列を導入。\n        /// </summary>\n        /// <param name=\"value\"></param>\n        public Holder(T[] value)\n        {\n            _value = value;\n        }\n\n        /// <summary>\n        /// 中身が配列の時に限り、その配列を返す。\n        /// </summary>\n        /// <remarks>\n        /// 中身が値の時に呼ぶとnullを返す。\n        /// <see cref=\"IsArray\"/>が別途ある以上、中身が値の時に呼んだら例外出す方がAPIとしてはきれいだけど、性能優先。\n        /// is して as し直しみたいな流れがちょっともったいない(だったら as して null チェックの方が高速)ので、こういう仕様にしている。\n        /// </remarks>\n        public T[] Array => _value as T[];\n\n        /// <summary>\n        /// 中身が値の時に限り、その値を返す。\n        /// </summary>\n        /// <remarks>\n        /// こちらは、中身が配列だったら例外飛ばす。\n        /// 値型に対して as が使えないのでこういう仕様。\n        /// </remarks>\n        public T Value => (T)_value;\n\n        /// <summary>\n        /// 中身が配列のときにtrue。\n        /// </summary>\n        public bool IsArray => _value is T[];\n\n        public static implicit operator Holder<T>(T value) => new Holder<T>(value);\n        public static implicit operator Holder<T>(T[] value) => new Holder<T>(value);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/IReceiver.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// イベントを受け取る側のインターフェイス。\n    /// </summary>\n    /// <typeparam name=\"TMessage\">イベント引数の型。</typeparam>\n    /// <remarks>\n    /// チャネルを閉じるときに<see cref=\"IDisposable.Dispose\"/>を呼ぶ。\n    /// </remarks>\n    public interface IReceiver<TMessage>\n    {\n        /// <summary>\n        /// イベントを通知する。\n        /// </summary>\n        /// <param name=\"message\">イベント引数。</param>\n        /// <param name=\"ct\">ハンドラーの処理を止めるためのトークン。</param>\n        /// <returns>ハンドラー側の処理が終わるのを待つ。</returns>\n        Task OnNext(Holder<TMessage> message, CancellationToken ct);\n\n        /// <summary>\n        /// このreceiverを使っている非同期メソッドの完了待ちをするタスクを設定する。\n        /// </summary>\n        /// <param name=\"completion\"></param>\n        /// <remarks>\n        /// 最初は、\n        /// - チャネルを使い終わったらDisposeを呼んでもらう\n        /// - チャネル内で <see cref=\"TaskCompletionSource{TResult}.TrySetResult(TResult)\"/> 呼んで <see cref=\"ISender{TMessage}.Completed\"/> を完了状態にする\n        /// みたいな構造だったけど、それだと await して例外拾うとかできないんで。\n        ///\n        /// receiverを使っている非同期メソッド自体をsetする構造にした方が便利そうだった。\n        /// </remarks>\n        void SetCompletion(Task completion);\n    }\n\n    /// <summary>\n    /// <see cref=\"IReceiver{TMessage}\"/>向け拡張。\n    /// </summary>\n    public static class ReceiverExtensions\n    {\n        /// <summary>\n        /// イベントを送って、ハンドラーの処理が終わるのを待つ。\n        /// </summary>\n        /// <typeparam name=\"TMessageBase\"><see cref=\"IReceiver{TMessage}\"/>に渡す、メッセージの基底型。</typeparam>\n        /// <typeparam name=\"TMessage\">実際に送りたいメッセージの型。</typeparam>\n        /// <param name=\"reciever\">メッセージの送り先。</param>\n        /// <param name=\"message\"><see cref=\"IReceiver{TMessage}\"/></param>\n        /// <param name=\"ct\"><see cref=\"IReceiver{TMessage}\"/></param>\n        /// <returns>引数を素通し。</returns>\n        /// <remarks>\n        /// 基本的には<see cref=\"IReceiver{TMessage}.OnNext(Holder{TMessage}, CancellationToken)\"/>呼んでるだけ。\n        /// <see cref=\"IResponsiveMessage{T}.Response\"/>を抜き出すためとかに正確な型が必要なので、型引数<typeparamref name=\"TMessage\"/>を用意したり、戻り値に引数を素通りさせたりしてる。\n        ///\n        /// <see cref=\"ResponsiveMessageExtensions.GetResponse{TResponse}(IResponsiveMessage{TResponse})\"/>と組み合わせて使う。\n        /// <![CDATA[ TResponse res = (await receiver.SendAsync(message, ct)).GetResponse(); ]]>\n        /// </remarks>\n        public static async Task<TMessage> SendAsync<TMessageBase, TMessage>(this IReceiver<TMessageBase> reciever, TMessage message, CancellationToken ct)\n            where TMessage : TMessageBase\n        {\n            await reciever.OnNext(message, ct);\n            return message;\n        }\n\n        /// <summary>\n        /// イベントを送って、ハンドラーの処理が終わるのを待つ。\n        /// 並列メッセージ送付版。\n        /// </summary>\n        /// <typeparam name=\"TMessageBase\"><see cref=\"IReceiver{TMessage}\"/>に渡す、メッセージの基底型。</typeparam>\n        /// <typeparam name=\"TMessage\">実際に送りたいメッセージの型。</typeparam>\n        /// <param name=\"reciever\">メッセージの送り先。</param>\n        /// <param name=\"messages\"><see cref=\"IReceiver{TMessage}\"/></param>\n        /// <param name=\"ct\"><see cref=\"IReceiver{TMessage}\"/></param>\n        /// <returns>引数を素通し。</returns>\n        /// <remarks>\n        /// <see cref=\"SendAsync{TMessageBase, TMessage}(IReceiver{TMessageBase}, TMessage, CancellationToken)\"/>。\n        /// 加えて、<typeparamref name=\"TMessage\"/>の配列から<typeparamref name=\"TMessageBase\"/>の配列への変換とか。\n        ///\n        /// <see cref=\"ResponsiveMessageExtensions.GetResponse{TResponse}(IEnumerable{IResponsiveMessage{TResponse}})\"/>と組み合わせて使う。\n        /// <![CDATA[ IEnumerable<TResponse> res = (await receiver.SendAsync(messages, ct)).GetResponse(); ]]>\n        ///\n        /// <see cref=\"Holder{T}\"/>を挟んじゃってるせいで共変性が効かないので、配列のインスタンスが無駄に1個作られてたりはする。\n        /// </remarks>\n        public static async Task<IEnumerable<TMessage>> SendAsync<TMessageBase, TMessage>(this IReceiver<TMessageBase> reciever, IEnumerable<TMessage> messages, CancellationToken ct)\n            where TMessage : TMessageBase\n        {\n            await reciever.OnNext(messages.Cast<TMessageBase>().ToArray(), ct);\n            return messages;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/IResponsiveMessage.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// View 側から応答を返してもらう必要のあるメッセージにつけるインターフェイス。\n    /// この <see cref=\"Response\"/> に値を入れておくと、再現データとして記録される。\n    /// </summary>\n    public interface IResponsiveMessage\n    {\n        /// <summary>\n        /// 誰宛てか、誰が応答を返さないといけないかを判別するためのID。\n        /// </summary>\n        int Address { get; }\n\n        /// <summary>\n        /// View 側からの応答。\n        /// </summary>\n        object Response { get; set; }\n    }\n\n    /// <summary>\n    /// 応答の型指定版、View 側からの応答があるメッセージのインターフェイス。\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface IResponsiveMessage<T> : IResponsiveMessage\n    {\n        /// <summary>\n        /// View 側からの応答。\n        /// </summary>\n        new T Response { get; set; }\n    }\n\n    /// <summary>\n    /// <see cref=\"IResponsiveMessage{T}\"/>向け拡張。\n    /// </summary>\n    public static class ResponsiveMessageExtensions\n    {\n        /// <summary>\n        /// <see cref=\"IResponsiveMessage{T}\"/>は明示的実装を推奨してるので、キャストをさぼるための拡張メソッドを1個用意。\n        /// </summary>\n        /// <typeparam name=\"TResponse\"></typeparam>\n        /// <param name=\"message\"></param>\n        /// <returns></returns>\n        public static TResponse GetResponse<TResponse>(this IResponsiveMessage<TResponse> message) => message.Response;\n\n        /// <summary>\n        /// <see cref=\"GetResponse{TResponse}(IResponsiveMessage{TResponse})\"/>を、並列メッセージに対してやるための拡張メソッド。\n        /// </summary>\n        /// <typeparam name=\"TResponse\"></typeparam>\n        /// <param name=\"messages\"></param>\n        /// <returns></returns>\n        public static IEnumerable<TResponse> GetResponse<TResponse>(this IEnumerable<IResponsiveMessage<TResponse>> messages) => messages.Select(m => m.Response);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/ISender.cs",
    "content": "﻿using SystemAsync;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// イベントを起こす側のインターフェイス。\n    /// </summary>\n    /// <typeparam name=\"TMessage\">イベント引数の型。</typeparam>\n    public interface ISender<TMessage>\n    {\n        /// <summary>\n        /// イベント購読。\n        /// </summary>\n        /// <param name=\"handler\">イベントハンドラー。</param>\n        /// <returns>購読解除用に使うdisposable。</returns>\n        IDisposable Subscribe(AsyncAction<TMessage> handler);\n\n        /// <summary>\n        /// チャネルが閉じたときに完了するタスクを返す。\n        /// </summary>\n        Task Completed { get; }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/InvocationMode.cs",
    "content": "﻿namespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// <see cref=\"ISender{TMessage}.Subscribe(Async.AsyncAction{TMessage})\"/>に複数のハンドラーを登録したとき、\n    /// ハンドラーをどう呼び出すか。\n    /// </summary>\n    /// <remarks>\n    /// 要するにハンドラーが並列に動いてまずいかどうかで切り替え。\n    ///\n    /// 直列であっても、呼び出し順序の保証はできない(Subscribeした順ではあるものの、Subscribeした順なんて管理しきれない)ので注意。\n    /// <see cref=\"Channel{TMessage}\"/>の仕組み上、ハンドラー内で<see cref=\"IResponsiveMessage.Response\"/>を設定してもらうことになるけど、\n    /// 最後の1個だけが残り、かつ、どれが最後になるのかは制御できない。\n    ///\n    /// 複数のハンドラーを登録したいときって、大体の場合、処理の前後にログ的なものを挟みたいって要件だと思うので、\n    /// 複数回Subscribe書けるより、<see cref=\"LoggingChannel{T}\"/>を使うのを推奨。\n    /// </remarks>\n    public enum InvocationMode\n    {\n        /// <summary>\n        /// 逐次(foreachで1個1個待つ)。\n        /// </summary>\n        Sequential,\n\n        /// <summary>\n        /// 並列(<see cref=\"System.Threading.Tasks.Task.WhenAll(System.Threading.Tasks.Task[])\"/>で待つようになる)。\n        /// </summary>\n        Parallel,\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/LoggingChannel.cs",
    "content": "﻿using SystemAsync;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// イベント処理の前後をフックして、別の処理を行うチャネル。\n    /// </summary>\n    /// <typeparam name=\"T\">メッセージの型。</typeparam>\n    /// <remarks>\n    /// 複数個のハンドラーを<see cref=\"ISender{TMessage}.Subscribe(AsyncAction{TMessage})\"/>するのだと、実行順が不定なので。\n    /// 必ず最初に、必ず最後にやりたいイベント処理にはこのクラスを使う。\n    /// </remarks>\n    public class LoggingChannel<T> : ISender<T>, IDisposable\n    {\n        private ISender<T> _inner;\n        private IDisposable _subscription;\n\n        /// <summary>\n        /// </summary>\n        /// <param name=\"sender\">メッセージ送信元。</param>\n        /// <param name=\"beforeMessage\">イベント発生前に挟みたい処理。</param>\n        /// <param name=\"afterMessage\">イベント発生後に挟みたい処理。</param>\n        public LoggingChannel(ISender<T> sender, AsyncAction<T> beforeMessage, AsyncAction<T> afterMessage, InvocationMode mode = InvocationMode.Parallel)\n        {\n            _inner = sender;\n\n            _subscription = _inner.Subscribe(async (x, ct) =>\n            {\n                if (beforeMessage != null) await beforeMessage(x, ct);\n                await _handlers.InvokeAsync(mode, x, ct);\n                if (afterMessage != null) await afterMessage(x, ct);\n            });\n        }\n\n        /// <summary><see cref=\"ISender{TMessage}\"/></summary>\n        public Task Completed => _inner.Completed;\n\n        private AsyncActionList<T> _handlers;\n\n        /// <summary><see cref=\"ISender{TMessage}\"/></summary>\n        public IDisposable Subscribe(AsyncAction<T> handler)\n        {\n            _handlers.Add(handler);\n            return Disposable.Create(() => _handlers.Remove(handler));\n        }\n\n        public void Dispose() => _subscription.Dispose();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"TaskLibrary.Channels\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"TaskLibrary.Channels\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"a46dbf03-3d5e-4580-8bb0-fd5da4f1188c\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/RecordedResponse.cs",
    "content": "﻿namespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// 再現実行の際に、再現ずれがないかわかるように、応答のあるメッセージにはIDを振る。\n    /// メッセージが何番目で、誰宛てかで一意に弁別できるはず。\n    /// </summary>\n    public struct ResponsiveMessageId\n    {\n        private long _value;\n\n        /// <summary>\n        /// 何番目のメッセージか。\n        /// </summary>\n        public int SequenceNumber => unchecked((int)(_value >> 32));\n\n        /// <summary>\n        /// 誰宛てか。\n        /// </summary>\n        public int Address => unchecked((int)_value);\n\n        /// <summary>\n        /// </summary>\n        /// <param name=\"sequenceNumber\"><see cref=\"SequenceNumber\"/></param>\n        /// <param name=\"address\"><see cref=\"Address\"/></param>\n        public ResponsiveMessageId(int sequenceNumber, int address)\n        {\n            _value = ((long)sequenceNumber << 32) | (long)address;\n        }\n    }\n\n    /// <summary>\n    /// 応答を記録しておくための型。\n    /// </summary>\n    /// <typeparam name=\"TResponse\"></typeparam>\n    public struct RecordedResponse<TResponse>\n    {\n        /// <summary>\n        /// メッセージのID。\n        /// </summary>\n        public ResponsiveMessageId Id { get; }\n\n        /// <summary>\n        /// 応答内容。\n        /// </summary>\n        public TResponse Response { get; }\n\n        /// <summary></summary>\n        /// <param name=\"id\"><see cref=\"Id\"/></param>\n        /// <param name=\"response\"><see cref=\"Response\"/></param>\n        public RecordedResponse(ResponsiveMessageId id, TResponse response)\n        {\n            Id = id;\n            Response = response;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"sequenceNumber\"><see cref=\"ResponsiveMessageId.SequenceNumber\"/></param>\n        /// <param name=\"address\"><see cref=\"ResponsiveMessageId.Address\"/></param>\n        /// <param name=\"response\"><see cref=\"Response\"/></param>\n        public RecordedResponse(int sequenceNumber, int address, TResponse response) : this(new ResponsiveMessageId(sequenceNumber, address), response) { }\n    }\n\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/ReplicableChannel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing SystemAsync;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// 再現実行かどうかのフラグ ＋ メッセージ。\n    /// </summary>\n    /// <typeparam name=\"TMessage\">メッセージ(イベント引数)の型。</typeparam>\n    public struct ReplicableMessage<TMessage>\n    {\n        /// <summary>\n        /// 再現実行で自動的に応答が入っている状態ならtrue。\n        /// </summary>\n        public bool IsAuto { get; }\n\n        /// <summary>\n        /// 何番目のメッセージか。\n        /// </summary>\n        public int SequenceNumber { get; }\n\n        /// <summary>\n        /// 元々のメッセージ。\n        /// </summary>\n        public Holder<TMessage> Message { get; }\n\n        /// <summary></summary>\n        /// <param name=\"isAuto\"><see cref=\"IsAuto\"/></param>\n        /// <param name=\"sequenceNumber\"><see cref=\"SequenceNumber\"/></param>\n        /// <param name=\"message\"><see cref=\"Message\"/></param>\n        public ReplicableMessage(bool isAuto, int sequenceNumber, Holder<TMessage> message)\n        {\n            IsAuto = isAuto;\n            SequenceNumber = sequenceNumber;\n            Message = message;\n        }\n    }\n\n    /// <summary>\n    /// 応答の記録付きのチャネル。\n    /// </summary>\n    /// <typeparam name=\"TMessage\">メッセージ(イベント引数)の型。</typeparam>\n    /// <typeparam name=\"TResponse\">応答の型。</typeparam>\n    /// <remarks>\n    /// チャネルのメッセージ送信側は、(同じ乱数シードを与えれば)必ず同じ順でメッセージを送ってくるものとする。\n    /// この場合、応答を記録・再生すれば、完全に状況再現(replication)ができるはず。\n    /// その、記録と再生を担うクラス。\n    ///\n    /// 他のチャネルはSubscribe時にinner.Subscribeを呼ぶ作りなんだけど、こいつだけはコンストラクターでinner.Subscribeしてる。\n    /// (なので、このクラスの Dispose をちゃんと呼ばないと購読解除できない。)\n    /// こういう作りでないと、複数のハンドラーを登録したときにMoveNextが多重に呼ばれて挙動狂う。\n    /// このクラスは複数のハンドラーを登録するのには向いてないんで、そもそもそれを禁止した方がいいかも。\n    /// </remarks>\n    public class ReplicableChannel<TMessage, TResponse> : ISender<ReplicableMessage<TMessage>>, IDisposable\n    {\n        private readonly IDisposable _subscription;\n        private readonly ISender<Holder<TMessage>> _inner;\n        private readonly List<RecordedResponse<TResponse>> _responses = new List<RecordedResponse<TResponse>>();\n\n        /// <summary>\n        /// </summary>\n        /// <param name=\"sender\">メッセージの送信元。</param>\n        /// <param name=\"initialResponses\">再生したい応答。途中まで(メッセージ数に応答数が合わない・足りない)でもOK。その場合、再生中はisAutoがtrue、それ以降はisAutoがfalseになる。</param>\n        /// <param name=\"mode\"><see cref=\"InvocationMode\"/></param>\n        public ReplicableChannel(ISender<Holder<TMessage>> sender, IEnumerable<TResponse> initialResponses = null, InvocationMode mode = InvocationMode.Parallel)\n        {\n            var e = initialResponses?.ToArray().GetEnumerator();\n            _inner = sender;\n            int sequenceNumber = 0;\n            _subscription = sender.Subscribe(async (message, ct) =>\n            {\n                sequenceNumber++;\n\n                // 再現実行用。\n                var isAuto = false;\n                var array = message.Array;\n                if (array != null)\n                {\n                    foreach (var x in array)\n                    {\n                        Replicate(ref e, ref isAuto, x);\n                    }\n                }\n                else\n                {\n                    var x = message.Value;\n                    Replicate(ref e, ref isAuto, x);\n                }\n\n                await _handlers.InvokeAsync(mode, new ReplicableMessage<TMessage>(isAuto, sequenceNumber, message), ct);\n\n                // 結果記憶用。\n                if (array != null)\n                {\n                    foreach (var x in array)\n                    {\n                        var responsive = x as IResponsiveMessage;\n                        if (responsive != null)\n                            _responses.Add(new RecordedResponse<TResponse>(sequenceNumber, responsive.Address, (TResponse)responsive.Response));\n                    }\n                }\n                else\n                {\n                    var x = message.Value;\n                    var responsive = x as IResponsiveMessage;\n                    if (responsive != null)\n                        _responses.Add(new RecordedResponse<TResponse>(sequenceNumber, responsive.Address, (TResponse)responsive.Response));\n                }\n            });\n        }\n\n        /// <summary>\n        /// 記録した応答一覧。\n        /// </summary>\n        public IEnumerable<RecordedResponse<TResponse>> Responses => _responses;\n\n        /// <summary>\n        /// 再現実行状態のものは除いて、手動実行が必要なメッセージだけを通すチャネル。\n        /// </summary>\n        public ISender<Holder<TMessage>> ManualChannel => this.Filter(x => !x.IsAuto, x => x.Message);\n\n        private static void Replicate(ref System.Collections.IEnumerator e, ref bool isAuto, TMessage x)\n        {\n            var responsive = x as IResponsiveMessage;\n\n            if (e != null && responsive != null)\n            {\n                if (e.MoveNext())\n                {\n                    responsive.Response = e.Current;\n                    isAuto = true;\n                }\n                else e = null;\n            }\n        }\n\n        private AsyncActionList<ReplicableMessage<TMessage>> _handlers;\n\n        /// <summary><see cref=\"ISender{TMessage}\"/></summary>\n        public IDisposable Subscribe(AsyncAction<ReplicableMessage<TMessage>> handler)\n        {\n            _handlers.Add(handler);\n            return Disposable.Create(() => _handlers.Remove(handler));\n        }\n\n        /// <summary><see cref=\"ISender{TMessage}\"/></summary>\n        public Task Completed => _inner.Completed;\n\n        /// <summary>購読解除</summary>\n        public void Dispose() => _subscription.Dispose();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/TaskLibrary.Channels.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{A46DBF03-3D5E-4580-8BB0-FD5DA4F1188C}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>TaskLibrary.Channels</RootNamespace>\n    <AssemblyName>TaskLibrary.Channels</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"AsyncActionList.cs\" />\n    <Compile Include=\"Backport\\Disposable.cs\" />\n    <Compile Include=\"CancellableReceiver.cs\" />\n    <Compile Include=\"Channel.cs\" />\n    <Compile Include=\"DispatcherChannel.cs\" />\n    <Compile Include=\"DistributiveChannel.cs\" />\n    <Compile Include=\"Backport\\EnumerableEx.cs\" />\n    <Compile Include=\"FilterChannel.cs\" />\n    <Compile Include=\"Holder.cs\" />\n    <Compile Include=\"InvocationMode.cs\" />\n    <Compile Include=\"IReceiver.cs\" />\n    <Compile Include=\"IResponsiveMessage.cs\" />\n    <Compile Include=\"ISender.cs\" />\n    <Compile Include=\"LoggingChannel.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"RecordedResponse.cs\" />\n    <Compile Include=\"ReplicableChannel.cs\" />\n    <Compile Include=\"TypeSwitchChannel.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"project.json\" />\n    <None Include=\"readme.md\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\SystemAsync\\SystemAsync.csproj\">\n      <Project>{f861e95e-72c0-47e1-b282-f8fdbb79c8d9}</Project>\n      <Name>SystemAsync</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/TypeSwitchChannel.cs",
    "content": "﻿using SystemAsync;\nusing System;\nusing System.Linq;\n\nnamespace TaskLibrary.Channels\n{\n    /// <summary>\n    /// 型を見てアクションを呼び分けるのに使う。\n    /// <see cref=\"Type\"/>は、<typeparamref name=\"TBase\"/>の子クラスが入る想定。\n    /// </summary>\n    /// <remarks>\n    /// ほぼ、<see cref=\"KeyValuePair{Type, AsyncAction{TBase}}\"/>。\n    /// <see cref=\"Create{TMessage}(AsyncAction{TMessage})\"/>の戻り値をKeyValuePairにして、static classにしても良かったかも。\n    ///\n    /// 初期化時にいったんこの構造体作るだけ。すぐにToDictionaryして使う。\n    /// </remarks>\n    /// <typeparam name=\"TBase\">共通基底クラスの型。</typeparam>\n    public struct TypedAsyncAction<TBase>\n    {\n        /// <summary>\n        /// 受け付ける型。\n        /// </summary>\n        public Type Type { get; }\n\n        /// <summary>\n        /// 呼び出す処理。\n        /// </summary>\n        public AsyncAction<TBase> Action { get; }\n\n        /// <summary></summary>\n        /// <param name=\"type\"><see cref=\"Type\"/></param>\n        /// <param name=\"action\"><see cref=\"Action\"/></param>\n        public TypedAsyncAction(Type type, AsyncAction<TBase> action)\n        {\n            Type = type;\n            Action = action;\n        }\n\n        public static TypedAsyncAction<TBase> Create<TMessage>(AsyncAction<TMessage> action)\n            where TMessage : TBase\n            => new TypedAsyncAction<TBase>(typeof(TMessage), (arg, ct) => action((TMessage)arg, ct));\n    }\n\n    public static partial class Channel\n    {\n        /// <summary>\n        /// 送信元から送られてくるメッセージはいろんな型があるはずで、<typeparamref name=\"TMessageBase\"/>はその共通基底クラスになってるはず。\n        /// これを、具象型に応じて分岐、型ごとにイベントハンドラーを登録できるようにする。\n        /// </summary>\n        /// <typeparam name=\"TMessageBase\"></typeparam>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"actions\"></param>\n        /// <returns></returns>\n        /// <remarks>\n        /// A, B, C を T の子クラスとして、以下のように使う想定。\n        /// <code><![CDATA[\n        /// using static TypedAsyncAction<T>;\n        /// \n        /// sender.Subscribe(\n        ///     Create<A>(a => ...),\n        ///     Create<B>(b => ...),\n        ///     Create<C>(c => ...));\n        /// ]]></code>\n        /// \n        /// C# 7のtype switch構文が入ったら無用の長物かも。普通に、以下のように書くことできるし。\n        ///\n        /// <code><![CDATA[\n        /// sender.Subscribe((T message, CancellationToken ct) =>\n        /// {\n        ///     switch (message)\n        ///     {\n        ///         case A a: => ...\n        ///         case B b: => ...\n        ///         case C c: => ...\n        ///     }\n        /// });\n        /// ]]></code>\n        ///\n        /// <see cref=\"Channel.Where{TSource}(ISender{TSource}, Func{TSource, bool})\"/>とかでも同様のことはできるんだけど、\n        ///\n        /// - ハッシュテーブル的な分岐がしたい\n        /// - 型の数だけ<see cref=\"AsyncActionList{T}.Add(AsyncAction{T})\"/>されたくない\n        ///\n        /// など、主に計算量的なコストを避けるためにこのメソッドがある。\n        /// </remarks>\n        public static IDisposable Subscribe<TMessageBase>(this ISender<TMessageBase> sender, params TypedAsyncAction<TMessageBase>[] actions)\n        {\n            var dic = actions.ToDictionary(x => x.Type, x => x.Action);\n            return sender.Subscribe(async (message, ct) =>\n            {\n                var t = message.GetType();\n                AsyncAction<TMessageBase> handler;\n                if (dic.TryGetValue(t, out handler))\n                    await handler(message, ct);\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/project.json",
    "content": "﻿{\n  \"frameworks\": {\n    \"net35\": {}\n  },\n  \"runtimes\": {\n    \"win\": {},\n    \"win-anycpu\": {}\n  },\n  \"dependencies\": {\n    \"MinimumAsyncBridge\": \"0.10.0.0\"\n  }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/src/TaskLibrary.Channels/readme.md",
    "content": "﻿# チャネル\n\nいわゆるメッセンジャー。\nモデルからビューに何かしてほしい時にイベントを飛ばす中間媒体。\n\n## Reactive Extensionsとの類似\n\n担ってる債務的にはReactive Extensions(Rx)に近い。\nRxというかIObservableとの差は、Subscribeする側がIObserverじゃなくてAsyncFuncなこと。\n要するに、以下の点がRxとの違い。\n\n- イベントのハンドラー側の処理が終わるのをawaitしたい\n- ハンドラー側から結果が返ってくる/結果を受け取りたいことがある\n  - 結果を複数のハンドラーから返されても困るので、基本的にはハンドラーは1つだけの想定\n- イベント送信には並列送信(配列でメッセージを投げて、それを個別にハンドルしてもらって、WhenAllで並列に待つ)があり得る\n\n## 用途の例\n\n前節のような機能が必要になるのは、以下のような利用場面を想定しているから。\n\nRPGとかのバトルとかの、コマンド入力でゲームが進行していくような例を考える。\nあるいは、トランプのゲーム見たいな、手札の入れ替えとかの例を考える。\n\n- プレイヤーの入力に応じてゲームの進行を決める\n  - プレイヤーに入力を促すメッセージを投げて、プレイヤーからの応答を待たないといけない\n  - 逐次手番(七並べとかみたいに、一定順序で1人1人手札を出すようなやつ)も、同時手番(じゃんけんみたいに、全プレイヤーが同時に手を出すようなやつ)もあり得る\n- 応答を必要ないものでも、結果表示用のアニメーション再生などが終わるのを待ってからゲーム進行したい\n\n## チャネルのレイヤー\n\nメッセージ送信側と受信側でインターフェイスを分けた\n\n- ISender<T>  : メッセージ送信側\n- IReceiver<T>: メッセージ受信側\n- Channel<T>  : ISenderかつIRecieverな、媒介クラス\n\n送信側(IReceiverのインスタンスを持って、メッセージを渡す)は、以下のようなコードを書く。\n\n```cs\n// 応答をもらわなくていいもの\nawait receiver.SendAsync(message)\n\n// 応答をもらうもの\nvar res = (await receiver.SendAsync(message)).GetResponse()\n```\n\n受信側(ISenderのインスタンスを持って、メッセージを処理する)では、以下のようなコードを書く。\n\n```cs\nISender<Holder<GameProgress>> c = new Channel<GameProgress>();\n\n// プレイヤー単位でメッセージを分配\nvar d = c.ObserveOn().Distribute();\n\n// MyPlayerId な IResponsiveMessage だけ受け取る\nvar playerChannel = d.GetChannel(0);\n\nplayerChannel.Subscribe(\n    // メッセージの型に応じてスイッチ\n    Create<CommandPrompt>((x, ct) => OnCommandPrompt(x, r)),\n    Create<ContinuePrompt>((x, ct) => OnContinuePrompt(x, r))\n    );\n```\n"
  },
  {
    "path": "Demo/2016/Channels/tests/TaskLibrary.Channels.Test/Helper.cs",
    "content": "﻿namespace TaskLibrary.Channels.Test\n{\n    class Helper\n    {\n        public static int Sum1To(int x) => x * (x + 1) / 2;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/tests/TaskLibrary.Channels.Test/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"TaskLibrary.Channels.Test\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"TaskLibrary.Channels.Test\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"5abceb82-8930-4581-8e9b-b2cd392dc1da\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/Channels/tests/TaskLibrary.Channels.Test/TaskLibrary.Channels.Test.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{5ABCEB82-8930-4581-8E9B-B2CD392DC1DA}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>TaskLibrary.Channels.Test</RootNamespace>\n    <AssemblyName>TaskLibrary.Channels.Test</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <ReferencePath>$(ProgramFiles)\\Common Files\\microsoft shared\\VSTT\\$(VisualStudioVersion)\\UITestExtensionPackages</ReferencePath>\n    <IsCodedUITest>False</IsCodedUITest>\n    <TestProjectType>UnitTest</TestProjectType>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\">\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\n    </Reference>\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\" />\n      </ItemGroup>\n    </When>\n    <Otherwise>\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.UnitTestFramework\" />\n      </ItemGroup>\n    </Otherwise>\n  </Choose>\n  <ItemGroup>\n    <Compile Include=\"Helper.cs\" />\n    <Compile Include=\"TestData\\Message.cs\" />\n    <Compile Include=\"TestChannel.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"TestDispatcherChannel.cs\" />\n    <Compile Include=\"TestDistributiveChannel.cs\" />\n    <Compile Include=\"TestReplicableChannel.cs\" />\n    <Compile Include=\"TestLoggingChannel.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\SystemAsync\\SystemAsync.csproj\">\n      <Project>{f861e95e-72c0-47e1-b282-f8fdbb79c8d9}</Project>\n      <Name>SystemAsync</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\..\\src\\TaskLibrary.Channels\\TaskLibrary.Channels.csproj\">\n      <Project>{a46dbf03-3d5e-4580-8bb0-fd5da4f1188c}</Project>\n      <Name>TaskLibrary.Channels</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <Choose>\n    <When Condition=\"'$(VisualStudioVersion)' == '10.0' And '$(IsCodedUITest)' == 'True'\">\n      <ItemGroup>\n        <Reference Include=\"Microsoft.VisualStudio.QualityTools.CodedUITestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITest.Extension, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n        <Reference Include=\"Microsoft.VisualStudio.TestTools.UITesting, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n          <Private>False</Private>\n        </Reference>\n      </ItemGroup>\n    </When>\n  </Choose>\n  <Import Project=\"$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets\" Condition=\"Exists('$(VSToolsPath)\\TeamTest\\Microsoft.TestTools.targets')\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2016/Channels/tests/TaskLibrary.Channels.Test/TestChannel.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TaskLibrary.Channels.Test.TestData;\n\nnamespace TaskLibrary.Channels.Test\n{\n    using static Helper;\n\n    [TestClass]\n    public class TestChannel\n    {\n        [TestMethod]\n        public void Channelの基本動作()\n        {\n            const int NumExecuteLoop = 30;\n\n            var c = new Channel<Message>();\n            ISender<Holder<Message>> s = c;\n\n            var list = new List<Holder<Message>>();\n\n            int count = 0;\n\n            s.Subscribe((m, ct) =>\n            {\n                list.Add(m);\n\n                if(!m.IsArray)\n                {\n                    var b = m.Value as MessageB;\n                    if (b != null)\n                    {\n                        ++count;\n                        b.SetResult(count);\n                    }\n                }\n\n                return Task.CompletedTask;\n            });\n\n            int sum = 0;\n\n            Func<CancellableReceiver<Message>, Task> executor = async r =>\n            {\n                await Task.Run(() => { }).ConfigureAwait(false);\n\n                for (int i = 0; i < NumExecuteLoop; i++)\n                {\n                    await Task.Delay(1);\n                    await r.SendAsync(new MessageA(\"abc\"));\n                    var res = (await r.SendAsync(new MessageB(0, i))).GetResponse();\n                    sum += res.Value;\n                }\n            };\n\n            c.Execute(executor, CancellationToken.None);\n            c.Completed.Wait();\n\n            Assert.AreEqual(2 * NumExecuteLoop, list.Count);\n            Assert.AreEqual(NumExecuteLoop, count);\n            Assert.AreEqual(Sum1To(NumExecuteLoop), sum);\n\n            for (int i = 0; i < 10; i++)\n            {\n                var a = list[2 * i];\n                Assert.IsFalse(a.IsArray);\n                Assert.IsTrue(a.Value is MessageA);\n\n                var b = list[2 * i + 1];\n                Assert.IsFalse(b.IsArray);\n                Assert.IsTrue(b.Value is MessageB);\n                Assert.AreEqual(i, ((MessageB)b.Value).Value);\n            }\n        }\n\n        [TestMethod]\n        public void Subscribeの同時実行が正しく動いているか()\n        {\n            const int NumThreads = 20;\n            const int NumSubscribeLoop = 100;\n            const int NumExecuteLoop = 10;\n\n            var c = new Channel<Message>();\n\n            int count = 0;\n\n            Task.WhenAll(Enumerable.Range(0, NumThreads).Select(async i =>\n            {\n                await Task.Delay(1).ConfigureAwait(false);\n\n                for (int j = 0; j < NumSubscribeLoop; j++)\n                {\n                    c.Subscribe((m, ct) =>\n                    {\n                        Interlocked.Increment(ref count);\n                        return Task.CompletedTask;\n                    });\n                }\n            })).Wait();\n\n            Func<CancellableReceiver<Message>, Task> executor = async r =>\n            {\n                await Task.Run(() => { }).ConfigureAwait(false);\n\n                for (int i = 0; i < NumExecuteLoop; i++)\n                {\n                    await Task.Delay(1);\n                    await r.SendAsync(new MessageA(\"abc\"));\n                }\n            };\n\n            c.Execute(executor, CancellationToken.None);\n            c.Completed.Wait();\n\n            Assert.AreEqual(NumExecuteLoop * NumSubscribeLoop * NumThreads, count);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/tests/TaskLibrary.Channels.Test/TestData/Message.cs",
    "content": "﻿namespace TaskLibrary.Channels.Test.TestData\n{\n    class Message\n    {\n    }\n\n    class MessageA : Message\n    {\n        public string Message { get; }\n\n        public MessageA(string message)\n        {\n            Message = message;\n        }\n    }\n\n    class MessageB : Message, IResponsiveMessage<ResponseB>\n    {\n        public int Address { get; }\n        public int Value { get; }\n\n        public ResponseB Response { get; set; }\n        object IResponsiveMessage.Response { get { return Response; } set { Response = (ResponseB)value; } }\n\n        public MessageB(byte address, int value)\n        {\n            Address = address;\n            Value = value;\n        }\n\n        public void SetResult(int value)\n        {\n            Response = new ResponseB(value);\n        }\n    }\n\n    class Response\n    {\n    }\n\n    class ResponseB : Response\n    {\n        public int Value { get; }\n\n        public ResponseB(int value)\n        {\n            Value = value;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/tests/TaskLibrary.Channels.Test/TestDispatcherChannel.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TaskLibrary.Channels.Test.TestData;\n\nnamespace TaskLibrary.Channels.Test\n{\n    using System.Collections.Concurrent;\n\n    [TestClass]\n    public class TestDispatcherChannel\n    {\n        [TestMethod]\n        public void 単一スレッド動作()\n        {\n            const int NumExecuteLoop = 30;\n\n            var mp = new MessagePumpSynchronizationContext();\n\n            var c = new Channel<Message>();\n            ISender<Holder<Message>> s = c.ObserveOn(mp);\n\n            var subscriberThreadIds = new ConcurrentDictionary<int, int>();\n\n            s.Subscribe(async (m, ct) =>\n            {\n                await Task.Yield();\n                subscriberThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                await Task.Run(() => { });\n                subscriberThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                await Task.Delay(1);\n                subscriberThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n            });\n\n            var executorThreadIds = new ConcurrentDictionary<int, int>();\n\n            Func<CancellableReceiver<Message>, Task> executor = async r =>\n            {\n                await Task.Run(() => { }).ConfigureAwait(false);\n\n                for (int i = 0; i < NumExecuteLoop; i++)\n                {\n                    await Task.Delay(1);\n                    executorThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                    await r.SendAsync(new MessageA(\"abc\"));\n                    executorThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                    var res = (await r.SendAsync(new MessageB(0, i))).GetResponse();\n                    executorThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                }\n            };\n\n            c.Execute(executor, CancellationToken.None);\n            c.Completed.Wait();\n\n            Assert.IsTrue(executorThreadIds.Keys.Count() > 1);\n            Assert.AreEqual(1, subscriberThreadIds.Keys.Count());\n\n            Assert.AreEqual(mp.ManagedThreadId, subscriberThreadIds.First().Key);\n\n            foreach (var ek in executorThreadIds.Keys)\n            {\n                Assert.AreNotEqual(mp.ManagedThreadId, ek);\n            }\n\n            Assert.AreEqual(2 * 3 * NumExecuteLoop, subscriberThreadIds.Sum(x => x.Value));\n            Assert.AreEqual(3 * NumExecuteLoop, executorThreadIds.Sum(x => x.Value));\n\n            mp.Stop();\n        }\n\n        [TestMethod]\n        public void 同期コンテキストがnullでも動く()\n        {\n            const int NumExecuteLoop = 30;\n\n            var c = new Channel<Message>();\n            ISender<Holder<Message>> s = c.ObserveOn(null);\n\n            var subscriberThreadIds = new ConcurrentDictionary<int, int>();\n\n            s.Subscribe(async (m, ct) =>\n            {\n                await Task.Yield();\n                subscriberThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                await Task.Run(() => { });\n                subscriberThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                await Task.Delay(1);\n                subscriberThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n            });\n\n            var executorThreadIds = new ConcurrentDictionary<int, int>();\n\n            Func<CancellableReceiver<Message>, Task> executor = async r =>\n            {\n                await Task.Run(() => { }).ConfigureAwait(false);\n\n                for (int i = 0; i < NumExecuteLoop; i++)\n                {\n                    await Task.Delay(1);\n                    executorThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                    await r.SendAsync(new MessageA(\"abc\"));\n                    executorThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                    var res = (await r.SendAsync(new MessageB(0, i))).GetResponse();\n                    executorThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                }\n            };\n\n            c.Execute(executor, CancellationToken.None);\n            c.Completed.Wait();\n\n            Assert.IsTrue(subscriberThreadIds.Keys.Count() > 1);\n            Assert.IsTrue(executorThreadIds.Keys.Count() > 1);\n\n            Assert.AreEqual(2 * 3 * NumExecuteLoop, subscriberThreadIds.Sum(x => x.Value));\n            Assert.AreEqual(3 * NumExecuteLoop, executorThreadIds.Sum(x => x.Value));\n        }\n\n        [TestMethod]\n        public void DistribusiveChannelと組み合わせ()\n        {\n            const int NumExecuteLoop = 30;\n\n            var mp = new MessagePumpSynchronizationContext();\n\n            var c = new Channel<Message>();\n            ISender<Holder<Message>> s = c.ObserveOn(mp);\n            var d = s.Distribute();\n\n            var subscriberThreadIds = new ConcurrentDictionary<int, int>();\n\n            for (int i = 0; i < 6; i++)\n            {\n                d.GetChannel(i).Subscribe(async (m, ct) =>\n                {\n                    await Task.Yield();\n                    subscriberThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                    await Task.Run(() => { });\n                    subscriberThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                    await Task.Delay(1);\n                    subscriberThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                });\n            }\n\n            var executorThreadIds = new ConcurrentDictionary<int, int>();\n\n            Func<CancellableReceiver<Message>, Task> executor = async r =>\n            {\n                await Task.Run(() => { }).ConfigureAwait(false);\n\n                for (int i = 0; i < NumExecuteLoop; i++)\n                {\n                    await Task.Delay(1);\n                    executorThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                    await r.SendAsync(new MessageA(\"abc\"));\n                    executorThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                    var x = (await r.SendAsync(new MessageB(0, i))).GetResponse();\n                    var y = (await r.SendAsync(new[]\n                    {\n                        new MessageB(1, i),\n                        new MessageB(2, i),\n                        new MessageB(3, i),\n                        new MessageB(4, i),\n                        new MessageB(5, i),\n                    })).GetResponse();\n                    executorThreadIds.AddOrUpdate(Thread.CurrentThread.ManagedThreadId, 1, (k, v) => v + 1);\n                }\n            };\n\n            c.Execute(executor, CancellationToken.None);\n            c.Completed.Wait();\n\n            Assert.IsTrue(executorThreadIds.Keys.Count() > 1);\n            Assert.AreEqual(1, subscriberThreadIds.Keys.Count());\n\n            Assert.AreEqual(mp.ManagedThreadId, subscriberThreadIds.First().Key);\n\n            foreach (var ek in executorThreadIds.Keys)\n            {\n                Assert.AreNotEqual(mp.ManagedThreadId, ek);\n            }\n\n            Assert.AreEqual(6 * 3 * NumExecuteLoop, subscriberThreadIds.Sum(x => x.Value));\n            Assert.AreEqual(3 * NumExecuteLoop, executorThreadIds.Sum(x => x.Value));\n\n            mp.Stop();\n        }\n    }\n\n    class MessagePumpSynchronizationContext : SynchronizationContext\n    {\n        CancellationTokenSource _cts;\n        Thread _thread;\n\n        public int ManagedThreadId { get; private set; }\n\n        public MessagePumpSynchronizationContext()\n        {\n            _cts = new CancellationTokenSource();\n\n            _thread = new Thread(x =>\n            {\n                ManagedThreadId = Thread.CurrentThread.ManagedThreadId;\n\n                SetSynchronizationContext(this);\n                var ct = (CancellationToken)x;\n\n                while (true)\n                {\n                    if (_queue.Count == 0)\n                    {\n                        Thread.Sleep(10);\n                        if (ct.IsCancellationRequested) return;\n                        continue;\n                    }\n\n                    ValueTuple<SendOrPostCallback, object> v;\n                    while (_queue.TryDequeue(out v))\n                    {\n                        v.Item1(v.Item2);\n                        if (ct.IsCancellationRequested) return;\n                    }\n                }\n            });\n\n            _thread.Start(_cts.Token);\n        }\n\n        public void Stop()\n        {\n            _cts.Cancel();\n            _thread.Join();\n        }\n\n        private ConcurrentQueue<ValueTuple<SendOrPostCallback, object>> _queue = new ConcurrentQueue<ValueTuple<SendOrPostCallback, object>>();\n\n        public override void Post(SendOrPostCallback d, object state)\n        {\n            _queue.Enqueue(ValueTuple.Create(d, state));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/tests/TaskLibrary.Channels.Test/TestDistributiveChannel.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TaskLibrary.Channels.Test.TestData;\n\nnamespace TaskLibrary.Channels.Test\n{\n    using static Helper;\n\n    [TestClass]\n    public class TestDistributiveChannel\n    {\n        [TestMethod]\n        public void 分解できているか()\n        {\n            const int NumExecuteLoop = 30;\n\n            var c = new Channel<Message>();\n            ISender<Holder<Message>> s = c;\n\n            var d = s.Distribute();\n\n            var list = new List<Holder<Message>>();\n\n            int count1 = 0;\n            int count2 = 0;\n            int count3 = 0;\n\n            s.Subscribe((m, ct) =>\n            {\n                list.Add(m);\n\n                if (!m.IsArray) ++count1;\n                else\n                {\n                    ++count2;\n                    count3 += m.Array.Length;\n                }\n\n                return Task.CompletedTask;\n            });\n\n            var counts = new int[6];\n\n            for (int i = 0; i < counts.Length; i++)\n            {\n                var address = i;\n                var x = 0;\n                d.GetChannel(address).Subscribe((m, ct) =>\n                {\n                    ++counts[address];\n                    ((MessageB)m).SetResult(x);\n                    ++x;\n                    return Task.CompletedTask;\n                });\n\n            }\n\n            int sumA = 0;\n            int sumB = 0;\n\n            Func<CancellableReceiver<Message>, Task> executor = async r =>\n            {\n                await Task.Run(() => { }).ConfigureAwait(false);\n\n                for (int i = 0; i < NumExecuteLoop; i++)\n                {\n                    await Task.Run(() => { }).ConfigureAwait(false);\n                    var x = (await r.SendAsync(new MessageB(0, i))).GetResponse();\n                    var y = (await r.SendAsync(new[]\n                    {\n                        new MessageB(1, i),\n                        new MessageB(2, i),\n                        new MessageB(3, i),\n                        new MessageB(4, i),\n                        new MessageB(5, i),\n                    })).GetResponse();\n                    sumA += x.Value;\n                    sumB += y.Sum(yi => yi.Value);\n                }\n            };\n\n            c.Execute(executor, CancellationToken.None);\n\n            c.Completed.Wait();\n\n            Assert.AreEqual(2 * NumExecuteLoop, list.Count);\n            Assert.AreEqual(NumExecuteLoop, list.Count(x => x.IsArray));\n            Assert.AreEqual(NumExecuteLoop, list.Count(x => !x.IsArray));\n\n            Assert.AreEqual(NumExecuteLoop, count1);\n            Assert.AreEqual(NumExecuteLoop, count2);\n            Assert.AreEqual(5 * NumExecuteLoop, count3);\n            foreach (var x in counts)\n            {\n                Assert.AreEqual(NumExecuteLoop, x);\n            }\n\n            Assert.AreEqual(Sum1To(NumExecuteLoop - 1), sumA);\n            Assert.AreEqual(5 * Sum1To(NumExecuteLoop - 1), sumB);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/tests/TaskLibrary.Channels.Test/TestLoggingChannel.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TaskLibrary.Channels.Test.TestData;\n\nnamespace TaskLibrary.Channels.Test\n{\n    [TestClass]\n    public class TestLoggingChannel\n    {\n\n        [TestMethod]\n        public void 順序保証()\n        {\n            const int NumExecuteLoop = 30;\n\n            var c = new Channel<Message>(InvocationMode.Parallel);\n\n            var list = new List<int>();\n\n            Func<Holder<Message>, int, Task> f = async (m, offset) =>\n            {\n                await Task.Delay(1);\n                var value = ((MessageB)m.Value).Value;\n                lock (list)\n                    list.Add(3 * value + offset);\n            };\n\n            ISender<Holder<Message>> s = new LoggingChannel<Holder<Message>>(c,\n                (m, ct) => f(m, 0), // A\n                (m, ct) => f(m, 2), // B\n                InvocationMode.Parallel);\n\n            s.Subscribe((m, ct) => f(m, 1)); // C\n            s.Subscribe((m, ct) => f(m, 1));\n            s.Subscribe((m, ct) => f(m, 1));\n\n            //↑ メッセージが来るたびに、A, C, C, C, B の順で動くはず。C 3つの順序については保証なし。\n\n            Func<CancellableReceiver<Message>, Task> executor = async r =>\n            {\n                await Task.Run(() => { }).ConfigureAwait(false);\n\n                for (int i = 0; i < NumExecuteLoop; i++)\n                {\n                    await Task.Delay(1);\n                    var res = (await r.SendAsync(new MessageB(0, i))).GetResponse();\n                }\n            };\n\n            c.Execute(executor, CancellationToken.None);\n            c.Completed.Wait();\n\n            Assert.AreEqual(5 * NumExecuteLoop, list.Count);\n            Assert.IsTrue(list.SequenceEqual(list.OrderBy(x => x)));\n            Assert.AreEqual(NumExecuteLoop, list.Count(x => (x % 3) == 0));\n            Assert.AreEqual(3 * NumExecuteLoop, list.Count(x => (x % 3) == 1));\n            Assert.AreEqual(NumExecuteLoop, list.Count(x => (x % 3) == 2));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/tests/TaskLibrary.Channels.Test/TestReplicableChannel.cs",
    "content": "﻿using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing TaskLibrary.Channels.Test.TestData;\n\nnamespace TaskLibrary.Channels.Test\n{\n    [TestClass]\n    public class TestReplicableChannel\n    {\n        [TestMethod]\n        public void 再現実行できているか()\n        {\n            const int NumExecuteLoop = 10;\n            var initialValues = new[] { 1, 3, 5, 7, 11, 13 };\n\n            var res1 = Run(NumExecuteLoop, null, initialValues);\n            var res2 = Run(NumExecuteLoop, res1.Item1, initialValues); // 完全に再現実行\n            var res3 = Run(NumExecuteLoop, res1.Item1.Take(res1.Item1.Count() / 2), initialValues); // 半分だけ\n\n            var b1 = res1.Item1.OfType<ResponseB>().ToArray();\n            var b2 = res2.Item1.OfType<ResponseB>().ToArray();\n            var b3 = res3.Item1.OfType<ResponseB>().ToArray();\n\n            Assert.IsTrue(b1.SequenceEqual(b2, new ResponseBComparer()));\n            Assert.IsTrue(res1.Item2.SequenceEqual(res2.Item2));\n\n            Assert.IsTrue(b1.SequenceEqual(b3, new ResponseBComparer()));\n            Assert.IsTrue(res1.Item2.SequenceEqual(res3.Item2));\n        }\n\n        struct ResponseBComparer : IEqualityComparer<ResponseB>\n        {\n            public bool Equals(ResponseB x, ResponseB y) => x.Value == y.Value;\n            public int GetHashCode(ResponseB obj) => obj.Value.GetHashCode();\n        }\n\n        private static ValueTuple<IEnumerable<Response>, int[]> Run(int NumExecuteLoop, IEnumerable<Response> responses, int[] initialValues)\n        {\n            var values = initialValues.ToArray();\n\n            var c = new Channel<Message>();\n            var reproducer = new ReplicableChannel<Message, Response>(c, responses);\n            Subscribe(reproducer.ManualChannel);\n            Execute(NumExecuteLoop, c, values);\n\n            return ValueTuple.Create(reproducer.Responses.Select(x => x.Response), values);\n        }\n\n        private static void Subscribe(ISender<Holder<Message>> sender)\n        {\n            var d = sender.Distribute();\n\n            for (int i = 0; i < 6; i++)\n            {\n                var address = i;\n                d.GetChannel(address).Subscribe(new[]\n                {\n                    TypedAsyncAction<Message>.Create<MessageB>((m, ct) =>\n                    {\n                        var x = m.Value;\n                        m.SetResult(x + 1);\n                        return Task.CompletedTask;\n                    }),\n                });\n            }\n        }\n\n        private static Func<CancellableReceiver<Message>, Task> Execute(int NumExecuteLoop, Channel<Message> c, int[] values)\n        {\n            Func<CancellableReceiver<Message>, Task> executor = async r =>\n            {\n                await Task.Run(() => { }).ConfigureAwait(false);\n\n                for (int i = 0; i < NumExecuteLoop; i++)\n                {\n                    await r.SendAsync(new MessageA(\"abc\"));\n\n                    var x = (await r.SendAsync(new MessageB(0, values[0]))).GetResponse();\n                    var y = (await r.SendAsync(new[]\n                    {\n                        new MessageB(1, values[1]),\n                        new MessageB(2, values[2]),\n                        new MessageB(3, values[3]),\n                        new MessageB(4, values[4]),\n                        new MessageB(5, values[5]),\n                    })).GetResponse().ToArray();\n\n                    values[0] = y[0].Value;\n                    values[1] = y[1].Value;\n                    values[2] = y[2].Value;\n                    values[3] = y[3].Value;\n                    values[4] = y[4].Value;\n                    values[5] = x.Value;\n                }\n            };\n\n            c.Execute(executor, CancellationToken.None);\n            c.Completed.Wait();\n            return executor;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Channels/tests/TaskLibrary.Channels.Test/project.json",
    "content": "﻿{\n  \"frameworks\": {\n    \"net461\": {}\n  },\n  \"runtimes\": {\n    \"win\": {},\n    \"win-anycpu\": {}\n  },\n  \"dependencies\": {\n    \"MinimumAsyncBridge\": \"0.10.0.0\",\n    \"System.ValueTuple\": \"4.0.0-rc3-24212-01\"\n  }\n}"
  },
  {
    "path": "Demo/2016/CompilerPlatform/ConsoleApplication1/ConsoleApplication1/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2016/CompilerPlatform/ConsoleApplication1/ConsoleApplication1/ConsoleApplication1.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{5C0676D5-646D-4631-9E60-C757B4853345}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ConsoleApplication1</RootNamespace>\n    <AssemblyName>ConsoleApplication1</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"PropertyChanged.cs\" />\n    <Compile Include=\"Record.cs\" />\n    <Compile Include=\"TypeAlias.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Analyzer Include=\"..\\packages\\RecordConstructorGenerator.3.3.0\\tools\\analyzers\\C#\\RecordConstructorGenerator.dll\" />\n    <Analyzer Include=\"..\\packages\\RecordConstructorGenerator.3.3.0\\tools\\analyzers\\C#\\System.Composition.AttributedModel.dll\" />\n    <Analyzer Include=\"..\\packages\\RecordConstructorGenerator.3.3.0\\tools\\analyzers\\C#\\System.Composition.Convention.dll\" />\n    <Analyzer Include=\"..\\packages\\RecordConstructorGenerator.3.3.0\\tools\\analyzers\\C#\\System.Composition.Hosting.dll\" />\n    <Analyzer Include=\"..\\packages\\RecordConstructorGenerator.3.3.0\\tools\\analyzers\\C#\\System.Composition.Runtime.dll\" />\n    <Analyzer Include=\"..\\packages\\RecordConstructorGenerator.3.3.0\\tools\\analyzers\\C#\\System.Composition.TypedParts.dll\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2016/CompilerPlatform/ConsoleApplication1/ConsoleApplication1/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ConsoleApplication1\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n\n    class Point\n    {\n        public int X { get; }\n        public int Y { get; }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/CompilerPlatform/ConsoleApplication1/ConsoleApplication1/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ConsoleApplication1\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApplication1\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"5c0676d5-646d-4631-9e60-c757b4853345\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/CompilerPlatform/ConsoleApplication1/ConsoleApplication1/PropertyChanged.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.ComponentModel;\n\nnamespace ConsoleApplication1.PropertyChanged\n{\n    namespace 意味のある情報\n    {\n        class Point\n        {\n            public int X;\n            public int Y;\n            public int Sum => X + Y;\n        }\n    }\n\n    namespace 書かなきゃいけないコード\n    {\n        class Point : INotifyPropertyChanged\n        {\n            public event PropertyChangedEventHandler PropertyChanged;\n            private void OnPropertyChanged(PropertyChangedEventArgs args) => PropertyChanged?.Invoke(this, args);\n            private void SetProperty<T>(ref T storage, T value, PropertyChangedEventArgs args)\n            {\n                if (!EqualityComparer<T>.Default.Equals(storage, value))\n                {\n                    storage = value;\n                    OnPropertyChanged(args);\n                }\n            }\n\n            public int X\n            {\n                get { return _x; }\n                set { SetProperty(ref _x, value, XProperty); OnPropertyChanged(SumProperty); }\n            }\n            private int _x;\n            public static readonly PropertyChangedEventArgs XProperty = new PropertyChangedEventArgs(nameof(X));\n\n            public int Y\n            {\n                get { return _y; }\n                set { SetProperty(ref _y, value, YProperty); OnPropertyChanged(SumProperty); }\n            }\n            private int _y;\n            public static readonly PropertyChangedEventArgs YProperty = new PropertyChangedEventArgs(nameof(X));\n\n            public int Sum => _x * _y;\n            public static readonly PropertyChangedEventArgs SumProperty = new PropertyChangedEventArgs(nameof(Sum));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/CompilerPlatform/ConsoleApplication1/ConsoleApplication1/Record.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ConsoleApplication1.Record\n{\n    namespace 意味のある情報\n    {\n        struct Point\n        {\n            public int X { get; }\n            public int Y { get; }\n        }\n    }\n\n    namespace 来るべきレコード型\n    {\n#if false\n        struct Point(int X, int Y);\n#endif\n    }\n\n    namespace こう書かなきゃいけない\n    {\n        struct Point\n        {\n            public int X { get; }\n            public int Y { get; }\n            public Point(int x, int y) { X = x; Y = y; }\n            public void Deconstruct(out int x, out int y) { x = X; y = Y; }\n            // Equals, GetHashCode, ==, !=, With...\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/CompilerPlatform/ConsoleApplication1/ConsoleApplication1/TypeAlias.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ConsoleApplication1.TypeAlias\n{\n#if false // 書きたいコード\n    typedef StockId = int;\n#endif\n\n    public struct StockId\n    {\n        int _value;\n        public StockId(int value) { _value = value; }\n        public static explicit operator int(StockId id) => id._value;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/CompilerPlatform/ConsoleApplication1/ConsoleApplication1/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"RecordConstructorGenerator\" version=\"3.3.0\" targetFramework=\"net461\" />\n</packages>"
  },
  {
    "path": "Demo/2016/CompilerPlatform/ConsoleApplication1/ConsoleApplication1.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.25618.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApplication1\", \"ConsoleApplication1\\ConsoleApplication1.csproj\", \"{5C0676D5-646D-4631-9E60-C757B4853345}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{5C0676D5-646D-4631-9E60-C757B4853345}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5C0676D5-646D-4631-9E60-C757B4853345}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5C0676D5-646D-4631-9E60-C757B4853345}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5C0676D5-646D-4631-9E60-C757B4853345}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2016/DevsumiOpenJam/DevsumiOpenJam.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.24720.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"src\", \"src\", \"{F93B5B20-6EF7-4ECC-8E2C-8BA783CFCC27}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{B4EEE214-23DA-4BEE-817C-9381BA659CD1}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tglobal.json = global.json\n\tEndProjectSection\nEndProject\nProject(\"{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}\") = \"TwitterBot\", \"src\\TwitterBot\\TwitterBot.xproj\", \"{0BF82EF5-7AA7-404E-B3A8-90BDA1DA8E2B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{0BF82EF5-7AA7-404E-B3A8-90BDA1DA8E2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0BF82EF5-7AA7-404E-B3A8-90BDA1DA8E2B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0BF82EF5-7AA7-404E-B3A8-90BDA1DA8E2B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0BF82EF5-7AA7-404E-B3A8-90BDA1DA8E2B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{0BF82EF5-7AA7-404E-B3A8-90BDA1DA8E2B} = {F93B5B20-6EF7-4ECC-8E2C-8BA783CFCC27}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2016/DevsumiOpenJam/global.json",
    "content": "﻿{\n  \"projects\": [ \"src\", \"test\" ],\n  \"sdk\": {\n    \"version\": \"1.0.0-rc1-update1\"\n  }\n}\n"
  },
  {
    "path": "Demo/2016/DevsumiOpenJam/src/TwitterBot/Class1.cs",
    "content": "﻿using CoreTweet;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace TwitterBot\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            MainAsync(args).Wait();\n        }\n\n        private static async Task MainAsync(string[] args)\n        {\n            var keys = new\n            {\n                ConsumerKey = \"[you cosumer key]\",\n                ConsumerSecret = \"[you consumer secret\",\n                AccessToken = \"[access token to a bot account]\",\n                AccessSecret = \"[access secret to a bot account]\",\n            };\n\n            var tokens = Tokens.Create(keys.ConsumerKey, keys.ConsumerSecret, keys.AccessToken, keys.AccessSecret);\n            var message = $@\".NET Core からつぶやき\n{string.Join(\" \", args)}\n{DateTime.Now}\";\n            await tokens.Statuses.UpdateAsync(new { status = message });\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/DevsumiOpenJam/src/TwitterBot/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"TwitterBot\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"TwitterBot\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"0bf82ef5-7aa7-404e-b3a8-90bda1da8e2b\")]\n"
  },
  {
    "path": "Demo/2016/DevsumiOpenJam/src/TwitterBot/TwitterBot.xproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">14.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n\n  <Import Project=\"$(VSToolsPath)\\DNX\\Microsoft.DNX.Props\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>0bf82ef5-7aa7-404e-b3a8-90bda1da8e2b</ProjectGuid>\n    <RootNamespace>TwitterBot</RootNamespace>\n    <BaseIntermediateOutputPath Condition=\"'$(BaseIntermediateOutputPath)'=='' \">..\\..\\artifacts\\obj\\$(MSBuildProjectName)</BaseIntermediateOutputPath>\n    <OutputPath Condition=\"'$(OutputPath)'=='' \">..\\..\\artifacts\\bin\\$(MSBuildProjectName)\\</OutputPath>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <SchemaVersion>2.0</SchemaVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VSToolsPath)\\DNX\\Microsoft.DNX.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n</Project>\n"
  },
  {
    "path": "Demo/2016/DevsumiOpenJam/src/TwitterBot/project.json",
    "content": "﻿{\n  \"version\": \"1.0.0-*\",\n  \"compilationOptions\": {\n    \"emitEntryPoint\": true\n  },\n\n  \"dependencies\": {\n    \"CoreTweet\": \"0.6.1.267\",\n    \"NETStandard.Library\": \"1.0.0-rc2-23811\",\n    \"System.Linq.Expressions\": \"4.0.11-beta-23516\",\n    \"System.Net.Http\": \"4.0.1-beta-23516\",\n    \"System.Net.Primitives\": \"4.0.11-beta-23516\",\n    \"System.Dynamic.Runtime\": \"4.0.11-rc2-23811\",\n    \"System.Runtime.Serialization.Primitives\": \"4.0.11-beta-23409\",\n    \"System.Xml.XDocument\": \"4.0.11-beta-23516\"\n  },\n\n  \"frameworks\": {\n    \"dnxcore50\": { }\n  }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/GoodCode.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28010.2041\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"src\", \"src\", \"{D044DC9B-7C8F-441B-8F33-BFF6E75F0382}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"PropertySample\", \"src\\PropertySample\\PropertySample.csproj\", \"{05810A6F-49C9-4984-8D68-AA230965503B}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"IteratorSample\", \"src\\IteratorSample\\IteratorSample.csproj\", \"{07B73698-4EF3-43B9-BC3F-7C3D1CE859DE}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"LinqSample\", \"src\\LinqSample\\LinqSample.csproj\", \"{238281C9-FB98-49BF-A045-0B5DEFAF6737}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"NullabilitySample\", \"src\\NullabilitySample\\NullabilitySample.csproj\", \"{6506FA46-BB5D-43A9-9075-78E98CDED8F2}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"AsyncSample\", \"src\\AsyncSample\\AsyncSample.csproj\", \"{C20521F2-2959-4625-9AEF-1D61768BE863}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{05810A6F-49C9-4984-8D68-AA230965503B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{05810A6F-49C9-4984-8D68-AA230965503B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{05810A6F-49C9-4984-8D68-AA230965503B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{05810A6F-49C9-4984-8D68-AA230965503B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{07B73698-4EF3-43B9-BC3F-7C3D1CE859DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{07B73698-4EF3-43B9-BC3F-7C3D1CE859DE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{07B73698-4EF3-43B9-BC3F-7C3D1CE859DE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{07B73698-4EF3-43B9-BC3F-7C3D1CE859DE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{238281C9-FB98-49BF-A045-0B5DEFAF6737}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{238281C9-FB98-49BF-A045-0B5DEFAF6737}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{238281C9-FB98-49BF-A045-0B5DEFAF6737}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{238281C9-FB98-49BF-A045-0B5DEFAF6737}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{6506FA46-BB5D-43A9-9075-78E98CDED8F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6506FA46-BB5D-43A9-9075-78E98CDED8F2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6506FA46-BB5D-43A9-9075-78E98CDED8F2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6506FA46-BB5D-43A9-9075-78E98CDED8F2}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C20521F2-2959-4625-9AEF-1D61768BE863}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C20521F2-2959-4625-9AEF-1D61768BE863}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C20521F2-2959-4625-9AEF-1D61768BE863}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C20521F2-2959-4625-9AEF-1D61768BE863}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{05810A6F-49C9-4984-8D68-AA230965503B} = {D044DC9B-7C8F-441B-8F33-BFF6E75F0382}\n\t\t{07B73698-4EF3-43B9-BC3F-7C3D1CE859DE} = {D044DC9B-7C8F-441B-8F33-BFF6E75F0382}\n\t\t{238281C9-FB98-49BF-A045-0B5DEFAF6737} = {D044DC9B-7C8F-441B-8F33-BFF6E75F0382}\n\t\t{6506FA46-BB5D-43A9-9075-78E98CDED8F2} = {D044DC9B-7C8F-441B-8F33-BFF6E75F0382}\n\t\t{C20521F2-2959-4625-9AEF-1D61768BE863} = {D044DC9B-7C8F-441B-8F33-BFF6E75F0382}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {D7BD831D-3E50-4E06-AFDC-C1215D53AE5B}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2016/GoodCode/readme.md",
    "content": "# 今すぐ実践できる良いプログラムの書き方\n\n[Software Design 2016年4月号](http://gihyo.jp/magazine/SD/archive/2016/201604)の第1特集「今すぐ実践できる良いプログラムの書き方」用に書いたコード。\nこの特集はその後、「[プロになるなら身につけたいプログラマのコーディング基礎力](https://amzn.to/2QCzED7)」に再掲。\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/AsyncSample/AsyncSample.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/AsyncSample/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Net.Http;\n\nnamespace AsyncSample\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            MainAsync().Wait();\n        }\n\n        private static async Task MainAsync()\n        {\n            var c = new HttpClient();\n            var res = await c.GetAsync(\"http://ufcpp.net\");\n            var content = await res.Content.ReadAsStringAsync();\n            Console.WriteLine(content);\n        }\n\n        private static Task OldMainAsync()\n        {\n            var c = new HttpClient();\n            return c.GetAsync(\"http://ufcpp.net\")\n                .ContinueWith(res => res.Result.Content.ReadAsStringAsync())\n                .ContinueWith(content => Console.WriteLine(content.Result));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/IteratorSample/Enumerable.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace IteratorSample.Producer\n{\n    public class Program\n    {\n        public static void Run()\n        {\n            foreach (var x in ArrayEnumerable.Repeat(1, 5)) Console.WriteLine(x);\n            foreach (var x in ManualEnumerable.Repeat(2, 5)) Console.WriteLine(x);\n        }\n    }\n\n    public class IteratorEnumerable\n    {\n        public static IEnumerable<int> Repeat(int value, int count)\n        {\n            for (int i = 0; i < count; i++)\n            {\n                yield return value;\n            }\n        }\n    }\n\n    public class ArrayEnumerable\n    {\n        public static IEnumerable<int> Repeat(int value, int count)\n        {\n            var data = new int[count];\n            for (int i = 0; i < count; i++)\n            {\n                data[i] = value;\n            }\n            return data;\n        }\n    }\n\n    public class ManualEnumerable\n    {\n        struct Repeater : IEnumerable<int>, IEnumerator<int>\n        {\n            public int Current { get; }\n            readonly int _count;\n            int _i;\n\n            public Repeater(int value, int count)\n            {\n                Current = value;\n                _count = count;\n                _i = 0;\n            }\n\n            public bool MoveNext()\n            {\n                _i++;\n                return _i <= _count;\n            }\n\n            public IEnumerator<int> GetEnumerator()\n                => _i == 0 ? this : new Repeater(Current, _count);\n\n            object IEnumerator.Current => Current;\n            IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n            public void Dispose() { }\n\n            public void Reset()\n            {\n                throw new NotImplementedException();\n            }\n        }\n\n        public static IEnumerable<int> Repeat(int value, int count)\n            => new Repeater(value, count);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/IteratorSample/IteratorSample.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/IteratorSample/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace IteratorSample\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            Producer.Program.Run();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/IteratorSample/UseSequence.cs",
    "content": "﻿namespace IteratorSample.UseSequence\n{\n    using System;\n    using System.Collections.Generic;\n\n    class Program\n    {\n        public static void Run()\n        {\n            Write(new[] { 1, 2, 3, 4, 5 });\n            Write(new List<int> { 1, 2, 3, 4, 5 });\n        }\n\n        private static void Write<T>(IEnumerable<T> data)\n        {\n            foreach (var x in data)\n            {\n                Console.WriteLine(x);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/LinqSample/InputOutput.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace LinqSample.InputOutput\n{\n    class Program\n    {\n        public static void Run()\n        {\n            Write(Read()\n                .Where(x => (x % 2) == 1)\n                .Select(x => x * x)\n                );\n\n            Write(Filter(Read()));\n            HardCoded();\n        }\n\n        static IEnumerable<int> Read()\n        {\n            while (true)\n            {\n                var line = Console.ReadLine();\n                if (string.IsNullOrEmpty(line)) break;\n                yield return int.Parse(line);\n            }\n        }\n\n        static IEnumerable<int> Filter(IEnumerable<int> source)\n        {\n            foreach (var x in source)\n                if ((x % 2) == 1)\n                    yield return x * x;\n        }\n\n        static void Write(IEnumerable<int> source)\n        {\n            foreach (var x in source)\n                Console.WriteLine(x);\n        }\n\n        static void HardCoded()\n        {\n            while (true)\n            {\n                var line = Console.ReadLine();\n                if (string.IsNullOrEmpty(line)) break;\n                var x = int.Parse(line);\n\n                if ((x % 2) == 1)\n                {\n                    var y = x * x;\n                    Console.WriteLine(y);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/LinqSample/LinqSample.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/LinqSample/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace LinqSample\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            InputOutput.Program.Run();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/NullabilitySample/NullCoalescing.cs",
    "content": "﻿namespace NullabilitySample\n{\n    public class NullCoalescing\n    {\n        static void Run()\n        {\n            int? n = null;\n            int x = n ?? 0; // null だったら代わりに0を使う\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/NullabilitySample/NullConditional.cs",
    "content": "﻿namespace NullabilitySample\n{\n    public class NullConditional\n    {\n        static int? X(string s) => s?.Length;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/NullabilitySample/NullError.cs",
    "content": "﻿namespace NullabilitySample\n{\n    public class NullError\n    {\n        static void M() => X(null);\n\n        static int X(string s) => s.Length;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/NullabilitySample/NullabilitySample.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/NullabilitySample/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace NullabilitySample\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/NullabilitySample/WhatsNullable.cs",
    "content": "﻿namespace NullabilitySample\n{\n    public class WhatsNullable\n    {\n        private static void Run()\n        {\n            int a = 10; // OK\n#if ERRONEOUS_CODE\n            int b = null; // コンパイルエラー\n#endif\n\n            // 型名の後ろに ? を付けるとnull許容型になる\n            int? c = 10; // OK\n            int? d = null; // これもOK\n            c = a; // int → int? の変換は常に成功\n#if ERRONEOUS_CODE\n            a = c; // 逆はコンパイルエラー\n#endif\n            a = c ?? 0; // nullをなくす処理が必要\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/PropertySample/Csharp1.cs",
    "content": "﻿namespace PropertySample.Csharp1\n{\n    class Program\n    {\n        public void Run()\n        {\n            var s = new Sample();\n            s.X += 1;\n        }\n    }\n\n    class Sample\n    {\n        private int _x;\n        public int X\n        {\n            get { return _x; }\n            set { _x = value; }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/PropertySample/Csharp2.cs",
    "content": "﻿namespace PropertySample.Csharp2\n{\n    using static System.Console;\n\n    class Program\n    {\n        public void Run()\n        {\n            var s = new Sample(1);\n            WriteLine(s.X);\n        }\n    }\n\n    class Sample\n    {\n        private int _x;\n        public int X\n        {\n            get { return _x; }\n            private set { _x = value; }\n        }\n\n        public Sample(int x)\n        {\n            _x = x;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/PropertySample/Csharp3.cs",
    "content": "﻿namespace PropertySample.Csharp3\n{\n    using static System.Console;\n\n    class Program\n    {\n        public void Run()\n        {\n            var s = new Sample(1);\n            WriteLine(s.X);\n        }\n    }\n\n    class Sample\n    {\n        public int X { get; private set; }\n        public Sample(int x) { X = x; }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/PropertySample/Csharp登場以前.cs",
    "content": "﻿namespace PropertySample.Csharp登場以前\n{\n    class Program\n    {\n        public void Run()\n        {\n            var s = new Sample();\n            s.SetX(s.GetX() + 1);\n        }\n    }\n\n    class Sample\n    {\n        private int _x;\n        public int GetX() { return _x; }\n        public void SetX(int x) { _x = x; }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/PropertySample/ImmutableCsharp5.cs",
    "content": "﻿namespace PropertySample.ImmutableCsharp5\n{\n    using static System.Console;\n\n    class Program\n    {\n        public void Run()\n        {\n            var s = new Sample(1);\n            WriteLine(s.X);\n        }\n    }\n\n    class Sample\n    {\n        private readonly int _x;\n        public int X { get { return _x; } }\n        public Sample(int x) { _x = x; }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/PropertySample/ImmutableCsharp6.cs",
    "content": "﻿namespace PropertySample.ImmutableCsharp6\n{\n    using static System.Console;\n\n    class Program\n    {\n        public void Run()\n        {\n            var s = new Sample(1);\n            WriteLine(s.X);\n        }\n    }\n\n    class Sample\n    {\n        public int X { get; }\n        public Sample(int x) { X = x; }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/PropertySample/ImmutableCsharp7.cs",
    "content": "﻿#if RECORD\n\nnamespace PropertySample.ImmutableCsharp7\n{\n    using static System.Console;\n\n    class Program\n    {\n        public void Run()\n        {\n            var s = new Sample(1);\n            WriteLine(s.X);\n        }\n    }\n\n    class Sample(int X);\n}\n\n#endif\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/PropertySample/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace PropertySample\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/GoodCode/src/PropertySample/PropertySample.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryAndroid/Class1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ClassLibraryAndroid\n{\n    public class Class1\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryAndroid/ClassLibraryAndroid.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>8.0.30703</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{CEA08C6E-5BD9-4D7D-8133-F1B64A8BD9C1}</ProjectGuid>\n    <ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibraryAndroid</RootNamespace>\n    <AssemblyName>ClassLibraryAndroid</AssemblyName>\n    <FileAlignment>512</FileAlignment>\n    <AndroidResgenFile>Resources\\Resource.Designer.cs</AndroidResgenFile>\n    <GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>\n    <AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>\n    <TargetFrameworkVersion>v6.0</TargetFrameworkVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"FluentArithmetic, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\FluentArithmetic.0.1.0\\lib\\netstandard1.1\\FluentArithmetic.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Mono.Android\" />\n    <Reference Include=\"mscorlib\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Resources\\Resource.Designer.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n    <None Include=\"Resources\\AboutResources.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <AndroidResource Include=\"Resources\\Values\\Strings.xml\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\Xamarin\\Android\\Xamarin.Android.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryAndroid/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing Android.App;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClassLibraryAndroid\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibraryAndroid\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n[assembly: ComVisible(false)]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryAndroid/Resources/AboutResources.txt",
    "content": "Images, layout descriptions, binary blobs and string dictionaries can be included \nin your application as resource files.  Various Android APIs are designed to \noperate on the resource IDs instead of dealing with images, strings or binary blobs \ndirectly.\n\nFor example, a sample Android app that contains a user interface layout (main.axml),\nan internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png) \nwould keep its resources in the \"Resources\" directory of the application:\n\nResources/\n    drawable/\n        icon.png\n\n    layout/\n        main.axml\n\n    values/\n        strings.xml\n\nIn order to get the build system to recognize Android resources, set the build action to\n\"AndroidResource\".  The native Android APIs do not operate directly with filenames, but \ninstead operate on resource IDs.  When you compile an Android application that uses resources, \nthe build system will package the resources for distribution and generate a class called \"R\" \n(this is an Android convention) that contains the tokens for each one of the resources \nincluded. For example, for the above Resources layout, this is what the R class would expose:\n\npublic class R {\n    public class drawable {\n        public const int icon = 0x123;\n    }\n\n    public class layout {\n        public const int main = 0x456;\n    }\n\n    public class strings {\n        public const int first_string = 0xabc;\n        public const int second_string = 0xbcd;\n    }\n}\n\nYou would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main \nto reference the layout/main.axml file, or R.strings.first_string to reference the first \nstring in the dictionary file values/strings.xml."
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryAndroid/Resources/Resource.Designer.cs",
    "content": "﻿#pragma warning disable 1591\n//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\n[assembly: global::Android.Runtime.ResourceDesignerAttribute(\"ClassLibraryAndroid.Resource\", IsApplication=false)]\n\nnamespace ClassLibraryAndroid\n{\n\t\n\t\n\t[System.CodeDom.Compiler.GeneratedCodeAttribute(\"Xamarin.Android.Build.Tasks\", \"1.0.0.0\")]\n\tpublic partial class Resource\n\t{\n\t\t\n\t\tstatic Resource()\n\t\t{\n\t\t\tglobal::Android.Runtime.ResourceIdManager.UpdateIdValues();\n\t\t}\n\t\t\n\t\tpublic partial class Attribute\n\t\t{\n\t\t\t\n\t\t\tstatic Attribute()\n\t\t\t{\n\t\t\t\tglobal::Android.Runtime.ResourceIdManager.UpdateIdValues();\n\t\t\t}\n\t\t\t\n\t\t\tprivate Attribute()\n\t\t\t{\n\t\t\t}\n\t\t}\n\t\t\n\t\tpublic partial class String\n\t\t{\n\t\t\t\n\t\t\t// aapt resource value: 0x7f020001\n\t\t\tpublic static int ApplicationName = 2130837505;\n\t\t\t\n\t\t\t// aapt resource value: 0x7f020000\n\t\t\tpublic static int Hello = 2130837504;\n\t\t\t\n\t\t\tstatic String()\n\t\t\t{\n\t\t\t\tglobal::Android.Runtime.ResourceIdManager.UpdateIdValues();\n\t\t\t}\n\t\t\t\n\t\t\tprivate String()\n\t\t\t{\n\t\t\t}\n\t\t}\n\t}\n}\n#pragma warning restore 1591\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryAndroid/Resources/Values/Strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"Hello\">Hello World, Click Me!</string>\n    <string name=\"ApplicationName\">$projectname$</string>\n</resources>\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryAndroid/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"FluentArithmetic\" version=\"0.1.0\" targetFramework=\"monoandroid60\" />\n</packages>"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryImports/Class1.cs",
    "content": "﻿namespace ClassLibraryImports\n{\n    public class Class1\n    {\n        void X()\n        {\n            var x = Newtonsoft.Json.JsonConvert.DeserializeObject(\"{ \\\"a\\\": 1 }\");\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryImports/ClassLibraryImports.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{28924F8C-510C-484D-BF68-245083F2322E}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibraryImports</RootNamespace>\n    <AssemblyName>ClassLibraryImports</AssemblyName>\n    <DefaultLanguage>en-US</DefaultLanguage>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <TargetFrameworkProfile>\n    </TargetFrameworkProfile>\n    <TargetFrameworkVersion>v5.0</TargetFrameworkVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <!-- A reference to the entire .NET Framework is automatically included -->\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\Portable\\$(TargetFrameworkVersion)\\Microsoft.Portable.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryImports/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Resources;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClassLibraryImports\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibraryImports\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n[assembly: NeutralResourcesLanguage(\"en\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryImports/project.json",
    "content": "﻿{\n  \"supports\": {},\n  \"dependencies\": {\n    \"Microsoft.NETCore.Portable.Compatibility\": \"1.0.1\",\n    \"NETStandard.Library\": \"1.6.0\",\n    \"Newtonsoft.Json\": \"7.0.1\"\n  },\n  \"frameworks\": {\n    \"netstandard1.1\": { \"imports\": \".NETPortable,Version=v0.0,Profile=Profile328\" }\n  }\n}"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryNet35/Class1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ClassLibraryNet35\n{\n    public class Class1\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryNet35/ClassLibraryNet35.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>51b540e9-c2dd-4fa3-87e2-c0cd1be43bda</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibraryNet35</RootNamespace>\n    <AssemblyName>ClassLibraryNet35</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\"/>\n    \n    <Reference Include=\"System.Core\"/>\n    <Reference Include=\"System.Xml.Linq\"/>\n    <Reference Include=\"System.Data.DataSetExtensions\"/>\n    \n    \n    <Reference Include=\"System.Data\"/>\n    \n    <Reference Include=\"System.Xml\"/>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n\n </Project>\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryNet35/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClassLibraryNet35\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibraryNet35\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"51b540e9-c2dd-4fa3-87e2-c0cd1be43bda\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryNet45/Class1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ClassLibraryNet45\n{\n    public class Class1\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryNet45/ClassLibraryNet45.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{2E15ACA8-8A5D-4438-8FCE-085A507F678F}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibraryNet45</RootNamespace>\n    <AssemblyName>ClassLibraryNet45</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"FluentArithmetic, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\FluentArithmetic.0.1.0\\lib\\netstandard1.1\\FluentArithmetic.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryNet45/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClassLibraryNet45\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibraryNet45\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"2e15aca8-8a5d-4438-8fce-085a507f678f\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryNet45/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"FluentArithmetic\" version=\"0.1.0\" targetFramework=\"net45\" />\n</packages>"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryNetCore/Class1.cs",
    "content": "﻿using FluentArithmetic;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace ClassLibraryNetCore\n{\n    public class Class1\n    {\n        public Class1()\n        {\n            var x = 1.Add(2);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryNetCore/ClassLibraryNetCore.xproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">14.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n\n  <Import Project=\"$(VSToolsPath)\\DotNet\\Microsoft.DotNet.Props\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>3451ef12-1b90-4bdc-b2b5-e26b0f72efa7</ProjectGuid>\n    <RootNamespace>ClassLibraryNetCore</RootNamespace>\n    <BaseIntermediateOutputPath Condition=\"'$(BaseIntermediateOutputPath)'=='' \">.\\obj</BaseIntermediateOutputPath>\n    <OutputPath Condition=\"'$(OutputPath)'=='' \">.\\bin\\</OutputPath>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <SchemaVersion>2.0</SchemaVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VSToolsPath)\\DotNet\\Microsoft.DotNet.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n</Project>\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryNetCore/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibraryNetCore\")]\n[assembly: AssemblyTrademark(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"3451ef12-1b90-4bdc-b2b5-e26b0f72efa7\")]\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryNetCore/project.json",
    "content": "{\n  \"version\": \"1.0.0-*\",\n\n  \"dependencies\": {\n    \"FluentArithmetic\": \"0.1.0\",\n    \"NETStandard.Library\": \"1.6.0\"\n  },\n\n  \"frameworks\": {\n    \"netstandard1.6\": {\n      \"imports\": \"dnxcore50\"\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryProfileBased/Class1.cs",
    "content": "﻿using FluentArithmetic;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ClassLibraryProfileBased\n{\n    public class Class1\n    {\n        void X()\n        {\n            var x = 1.Add(2);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryProfileBased/ClassLibraryProfileBased.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>10.0</MinimumVisualStudioVersion>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{A6254B75-CD23-4903-9642-BE95FD41DB45}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibraryProfileBased</RootNamespace>\n    <AssemblyName>ClassLibraryProfileBased</AssemblyName>\n    <DefaultLanguage>en-US</DefaultLanguage>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <TargetFrameworkProfile>Profile7</TargetFrameworkProfile>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <!-- A reference to the entire .NET Framework is automatically included -->\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\Portable\\$(TargetFrameworkVersion)\\Microsoft.Portable.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryProfileBased/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Resources;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClassLibraryProfileBased\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibraryProfileBased\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n[assembly: NeutralResourcesLanguage(\"en\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryProfileBased/project.json",
    "content": "﻿{\n  \"supports\": {},\n  \"dependencies\": {\n    \"FluentArithmetic\": \"0.1.0\"\n  },\n  \"frameworks\": {\n    \".NETPortable,Version=v4.5,Profile=Profile7\": {}\n  }\n}"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryStandardBased/Class1.cs",
    "content": "﻿using FluentArithmetic;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ClassLibraryStandardBased\n{\n    public class Class1\n    {\n        void X()\n        {\n            var x = 1.Add(2);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryStandardBased/ClassLibraryStandardBased.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{18FAD28B-3EBF-4C04-8669-6750697785F5}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibraryStandardBased</RootNamespace>\n    <AssemblyName>ClassLibraryStandardBased</AssemblyName>\n    <DefaultLanguage>en-US</DefaultLanguage>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <TargetFrameworkProfile>\n    </TargetFrameworkProfile>\n    <TargetFrameworkVersion>v5.0</TargetFrameworkVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <!-- A reference to the entire .NET Framework is automatically included -->\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\Portable\\$(TargetFrameworkVersion)\\Microsoft.Portable.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryStandardBased/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Resources;\nusing System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClassLibraryStandardBased\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibraryStandardBased\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n[assembly: NeutralResourcesLanguage(\"en\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/NetStandard/ClassLibraryStandardBased/project.json",
    "content": "﻿{\n  \"supports\": {},\n  \"dependencies\": {\n    \"FluentArithmetic\": \"0.1.0\",\n    \"Microsoft.NETCore.Portable.Compatibility\": \"1.0.1\",\n    \"NETStandard.Library\": \"1.6.0\"\n  },\n  \"frameworks\": {\n    \"netstandard1.1\": {}\n  }\n}"
  },
  {
    "path": "Demo/2016/NetStandard/ConsoleApplicationNet46/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.1\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2016/NetStandard/ConsoleApplicationNet46/ConsoleApplicationNet46.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{1FD4D082-2BAB-4F47-BB82-BF521721822A}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ConsoleApplicationNet46</RootNamespace>\n    <AssemblyName>ConsoleApplicationNet46</AssemblyName>\n    <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"FluentArithmetic, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\FluentArithmetic.0.1.0\\lib\\netstandard1.1\\FluentArithmetic.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/2016/NetStandard/ConsoleApplicationNet46/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ConsoleApplicationNet46\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/NetStandard/ConsoleApplicationNet46/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ConsoleApplicationNet46\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApplicationNet46\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"1fd4d082-2bab-4f47-bb82-bf521721822a\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/NetStandard/ConsoleApplicationNet46/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"FluentArithmetic\" version=\"0.1.0\" targetFramework=\"net461\" />\n</packages>"
  },
  {
    "path": "Demo/2016/NetStandard/NetStandard.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25420.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibraryNet35\", \"ClassLibraryNet35\\ClassLibraryNet35.csproj\", \"{51B540E9-C2DD-4FA3-87E2-C0CD1BE43BDA}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibraryNet45\", \"ClassLibraryNet45\\ClassLibraryNet45.csproj\", \"{2E15ACA8-8A5D-4438-8FCE-085A507F678F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibraryProfileBased\", \"ClassLibraryProfileBased\\ClassLibraryProfileBased.csproj\", \"{A6254B75-CD23-4903-9642-BE95FD41DB45}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibraryStandardBased\", \"ClassLibraryStandardBased\\ClassLibraryStandardBased.csproj\", \"{18FAD28B-3EBF-4C04-8669-6750697785F5}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApplicationNet46\", \"ConsoleApplicationNet46\\ConsoleApplicationNet46.csproj\", \"{1FD4D082-2BAB-4F47-BB82-BF521721822A}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibraryAndroid\", \"ClassLibraryAndroid\\ClassLibraryAndroid.csproj\", \"{CEA08C6E-5BD9-4D7D-8133-F1B64A8BD9C1}\"\nEndProject\nProject(\"{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}\") = \"ClassLibraryNetCore\", \"ClassLibraryNetCore\\ClassLibraryNetCore.xproj\", \"{3451EF12-1B90-4BDC-B2B5-E26B0F72EFA7}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"UseStandardBasedLibrary\", \"UseStandardBasedLibrary\", \"{7B2BFD48-58A4-496D-92FE-FF51FA865811}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"CreateLibrary\", \"CreateLibrary\", \"{3F0FDE38-0E43-4A2D-8A43-34918EA6E89E}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"UseNonStandardLibrary\", \"UseNonStandardLibrary\", \"{088BF1B8-5EDD-4369-BADC-017E986A7C42}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibraryImports\", \"ClassLibraryImports\\ClassLibraryImports.csproj\", \"{28924F8C-510C-484D-BF68-245083F2322E}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{51B540E9-C2DD-4FA3-87E2-C0CD1BE43BDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{51B540E9-C2DD-4FA3-87E2-C0CD1BE43BDA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{51B540E9-C2DD-4FA3-87E2-C0CD1BE43BDA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{51B540E9-C2DD-4FA3-87E2-C0CD1BE43BDA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2E15ACA8-8A5D-4438-8FCE-085A507F678F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2E15ACA8-8A5D-4438-8FCE-085A507F678F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2E15ACA8-8A5D-4438-8FCE-085A507F678F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2E15ACA8-8A5D-4438-8FCE-085A507F678F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A6254B75-CD23-4903-9642-BE95FD41DB45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A6254B75-CD23-4903-9642-BE95FD41DB45}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A6254B75-CD23-4903-9642-BE95FD41DB45}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A6254B75-CD23-4903-9642-BE95FD41DB45}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{18FAD28B-3EBF-4C04-8669-6750697785F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{18FAD28B-3EBF-4C04-8669-6750697785F5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{18FAD28B-3EBF-4C04-8669-6750697785F5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{18FAD28B-3EBF-4C04-8669-6750697785F5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1FD4D082-2BAB-4F47-BB82-BF521721822A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1FD4D082-2BAB-4F47-BB82-BF521721822A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1FD4D082-2BAB-4F47-BB82-BF521721822A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1FD4D082-2BAB-4F47-BB82-BF521721822A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CEA08C6E-5BD9-4D7D-8133-F1B64A8BD9C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CEA08C6E-5BD9-4D7D-8133-F1B64A8BD9C1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CEA08C6E-5BD9-4D7D-8133-F1B64A8BD9C1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CEA08C6E-5BD9-4D7D-8133-F1B64A8BD9C1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3451EF12-1B90-4BDC-B2B5-E26B0F72EFA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3451EF12-1B90-4BDC-B2B5-E26B0F72EFA7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3451EF12-1B90-4BDC-B2B5-E26B0F72EFA7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3451EF12-1B90-4BDC-B2B5-E26B0F72EFA7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{28924F8C-510C-484D-BF68-245083F2322E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{28924F8C-510C-484D-BF68-245083F2322E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{28924F8C-510C-484D-BF68-245083F2322E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{28924F8C-510C-484D-BF68-245083F2322E}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{51B540E9-C2DD-4FA3-87E2-C0CD1BE43BDA} = {7B2BFD48-58A4-496D-92FE-FF51FA865811}\n\t\t{2E15ACA8-8A5D-4438-8FCE-085A507F678F} = {7B2BFD48-58A4-496D-92FE-FF51FA865811}\n\t\t{A6254B75-CD23-4903-9642-BE95FD41DB45} = {3F0FDE38-0E43-4A2D-8A43-34918EA6E89E}\n\t\t{18FAD28B-3EBF-4C04-8669-6750697785F5} = {3F0FDE38-0E43-4A2D-8A43-34918EA6E89E}\n\t\t{1FD4D082-2BAB-4F47-BB82-BF521721822A} = {7B2BFD48-58A4-496D-92FE-FF51FA865811}\n\t\t{CEA08C6E-5BD9-4D7D-8133-F1B64A8BD9C1} = {7B2BFD48-58A4-496D-92FE-FF51FA865811}\n\t\t{3451EF12-1B90-4BDC-B2B5-E26B0F72EFA7} = {7B2BFD48-58A4-496D-92FE-FF51FA865811}\n\t\t{28924F8C-510C-484D-BF68-245083F2322E} = {088BF1B8-5EDD-4369-BADC-017E986A7C42}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2016/PrivateField/ErroneousCodes/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2016/PrivateField/ErroneousCodes/DefiniteAssignement.cs",
    "content": "﻿struct EmptyStruct { }\nstruct Integer { private int _x; }\n\nstruct DefiniteAssignement\n{\n    EmptyStruct _e;\n    Integer _i;\n\n    DefiniteAssignement(int i)\n    {\n        // 中身があるものは初期化必須\n        _i = new Integer();\n        // 一方で、EmptyStruct みたいに空っぽのものは初期化不要\n    }\n}\n"
  },
  {
    "path": "Demo/2016/PrivateField/ErroneousCodes/ErroneousCodes.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{B72FD9EE-E720-4787-836D-34D9C5AD1874}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>ErroneousCodes</RootNamespace>\n    <AssemblyName>ErroneousCodes</AssemblyName>\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"DefiniteAssignement.cs\" />\n    <Compile Include=\"ManagedPointer.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"RecursiveLayout.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "Demo/2016/PrivateField/ErroneousCodes/ManagedPointer.cs",
    "content": "﻿using System.Runtime.InteropServices;\n\n// 参照型を含む構造体\nstruct Wrapper { object _obj; }\n\nclass ManagedPointer\n{\n    public unsafe void X()\n    {\n        // Wrapper みたいに内部的に参照型のフィールドを持っている型は、本来はポインター化できない\n        // sizeof 取得も本来はできない\n\n        // unmanaged なメモリを確保\n        // AllocHGlobal で取得したメモリ領域は初期化されている保証がない\n        // 実行するたびに違う値が入ってる\n        var p = Marshal.AllocHGlobal(sizeof(Wrapper));\n        Wrapper a = *(Wrapper*)p;\n\n        // ここで GC が発生したとすると、\n        // GC が TaskAwaiter 中の Task のフィールド(未初期化)を参照する\n        // 未初期化(= 意味のないランダムな値)な参照先を見に行こうとして死ぬ\n\n        Marshal.FreeHGlobal(p);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/PrivateField/ErroneousCodes/Program.cs",
    "content": "﻿namespace ErroneousCodes\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/PrivateField/ErroneousCodes/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ErroneousCodes\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ErroneousCodes\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"b72fd9ee-e720-4787-836d-34d9c5ad1874\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/PrivateField/ErroneousCodes/RecursiveLayout.cs",
    "content": "﻿struct Container<T>\n{\n    public T Item;\n}\n\nstruct RecursiveLayout\n{\n    // 無限再帰するので、この構造体はレイアウトが確定できない\n    Container<RecursiveLayout> _x; // PCL ではエラーにならない\n}\n"
  },
  {
    "path": "Demo/2016/PrivateField/PrivateField.ConsoleApp/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2016/PrivateField/PrivateField.ConsoleApp/PrivateField.ConsoleApp.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>PrivateField</RootNamespace>\n    <AssemblyName>PrivateField.ConsoleApp</AssemblyName>\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"..\\PrivateField.Shared\\PrivateField.Shared.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "Demo/2016/PrivateField/PrivateField.ConsoleApp/Program.cs",
    "content": "﻿namespace PrivateField\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/PrivateField/PrivateField.ConsoleApp/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"PrivateField.ConsoleApp\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"PrivateField.ConsoleApp\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"150fda0d-1c0a-4f03-9e6e-21b5eec62d25\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2016/PrivateField/PrivateField.Shared/DefiniteAssignment.cs",
    "content": "﻿using System;\n\nstruct DefiniteAssignment\n{\n    // DateTimeOffset には中身があるはずなのに…\n    DateTimeOffset _x;\n\n    public DefiniteAssignment(int n) { } // PCL ではエラーにならない\n}\n"
  },
  {
    "path": "Demo/2016/PrivateField/PrivateField.Shared/ManagedPointer.cs",
    "content": "﻿using System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\nclass ManagedPointer\n{\n    public unsafe void X()\n    {\n        // TaskAwaiter は内部的に Task クラスのフィールドを1個だけ持っている\n        // 本来はポインター化できない\n        var p = Marshal.AllocHGlobal(sizeof(TaskAwaiter));\n\n        // PCL ではエラーにならない\n        TaskAwaiter a = *(TaskAwaiter*)p;\n\n        // ここで GC が発生したとするとまずい\n\n        Marshal.FreeHGlobal(p);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/PrivateField/PrivateField.Shared/PrivateField.Shared.projitems",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>\n    <HasSharedItems>true</HasSharedItems>\n    <SharedGUID>43f6e03d-e27a-4ce6-9164-860cc0d17b7b</SharedGUID>\n  </PropertyGroup>\n  <PropertyGroup Label=\"Configuration\">\n    <Import_RootNamespace>PrivateField</Import_RootNamespace>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"$(MSBuildThisFileDirectory)DefiniteAssignment.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)ManagedPointer.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)RecursiveLayout.cs\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "Demo/2016/PrivateField/PrivateField.Shared/PrivateField.Shared.shproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>43f6e03d-e27a-4ce6-9164-860cc0d17b7b</ProjectGuid>\n    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\CodeSharing\\Microsoft.CodeSharing.Common.Default.props\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\CodeSharing\\Microsoft.CodeSharing.Common.props\" />\n  <PropertyGroup />\n  <Import Project=\"PrivateField.Shared.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\CodeSharing\\Microsoft.CodeSharing.CSharp.targets\" />\n</Project>\n"
  },
  {
    "path": "Demo/2016/PrivateField/PrivateField.Shared/RecursiveLayout.cs",
    "content": "﻿using System.Collections.Generic;\n\nstruct RecursiveLayout\n{\n    KeyValuePair<RecursiveLayout, RecursiveLayout> _x;\n}\n"
  },
  {
    "path": "Demo/2016/PrivateField/PrivateField.StandardLib/PrivateField.StandardLib.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\" ToolsVersion=\"15.0\">\n  <PropertyGroup Label=\"Configuration\">\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <RootNamespace>PrivateField</RootNamespace>\n  </PropertyGroup>\n  <PropertyGroup>\n    <TargetFramework>netstandard1.4</TargetFramework>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"**\\*.cs\" />\n    <EmbeddedResource Include=\"**\\*.resx\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"NETStandard.Library\" Version=\"1.6\" />\n  </ItemGroup>\n  <Import Project=\"..\\PrivateField.Shared\\PrivateField.Shared.projitems\" Label=\"Shared\" />\n</Project>"
  },
  {
    "path": "Demo/2016/PrivateField/PrivateField.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26014.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"PrivateField.StandardLib\", \"PrivateField.StandardLib\\PrivateField.StandardLib.csproj\", \"{E5F9B16F-7A24-4977-9E93-854278F1DB60}\"\nEndProject\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"PrivateField.Shared\", \"PrivateField.Shared\\PrivateField.Shared.shproj\", \"{43F6E03D-E27A-4CE6-9164-860CC0D17B7B}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"PrivateField.ConsoleApp\", \"PrivateField.ConsoleApp\\PrivateField.ConsoleApp.csproj\", \"{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ErroneousCodes\", \"ErroneousCodes\\ErroneousCodes.csproj\", \"{B72FD9EE-E720-4787-836D-34D9C5AD1874}\"\nEndProject\nGlobal\n\tGlobalSection(SharedMSBuildProjectFiles) = preSolution\n\t\tPrivateField.Shared\\PrivateField.Shared.projitems*{150fda0d-1c0a-4f03-9e6e-21b5eec62d25}*SharedItemsImports = 4\n\t\tPrivateField.Shared\\PrivateField.Shared.projitems*{43f6e03d-e27a-4ce6-9164-860cc0d17b7b}*SharedItemsImports = 13\n\tEndGlobalSection\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{E5F9B16F-7A24-4977-9E93-854278F1DB60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E5F9B16F-7A24-4977-9E93-854278F1DB60}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E5F9B16F-7A24-4977-9E93-854278F1DB60}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{E5F9B16F-7A24-4977-9E93-854278F1DB60}.Debug|x64.Build.0 = Debug|x64\n\t\t{E5F9B16F-7A24-4977-9E93-854278F1DB60}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{E5F9B16F-7A24-4977-9E93-854278F1DB60}.Debug|x86.Build.0 = Debug|x86\n\t\t{E5F9B16F-7A24-4977-9E93-854278F1DB60}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E5F9B16F-7A24-4977-9E93-854278F1DB60}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E5F9B16F-7A24-4977-9E93-854278F1DB60}.Release|x64.ActiveCfg = Release|x64\n\t\t{E5F9B16F-7A24-4977-9E93-854278F1DB60}.Release|x64.Build.0 = Release|x64\n\t\t{E5F9B16F-7A24-4977-9E93-854278F1DB60}.Release|x86.ActiveCfg = Release|x86\n\t\t{E5F9B16F-7A24-4977-9E93-854278F1DB60}.Release|x86.Build.0 = Release|x86\n\t\t{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}.Release|x64.Build.0 = Release|Any CPU\n\t\t{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{150FDA0D-1C0A-4F03-9E6E-21B5EEC62D25}.Release|x86.Build.0 = Release|Any CPU\n\t\t{B72FD9EE-E720-4787-836D-34D9C5AD1874}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B72FD9EE-E720-4787-836D-34D9C5AD1874}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B72FD9EE-E720-4787-836D-34D9C5AD1874}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{B72FD9EE-E720-4787-836D-34D9C5AD1874}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{B72FD9EE-E720-4787-836D-34D9C5AD1874}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{B72FD9EE-E720-4787-836D-34D9C5AD1874}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{B72FD9EE-E720-4787-836D-34D9C5AD1874}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B72FD9EE-E720-4787-836D-34D9C5AD1874}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B72FD9EE-E720-4787-836D-34D9C5AD1874}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{B72FD9EE-E720-4787-836D-34D9C5AD1874}.Release|x64.Build.0 = Release|Any CPU\n\t\t{B72FD9EE-E720-4787-836D-34D9C5AD1874}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{B72FD9EE-E720-4787-836D-34D9C5AD1874}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2016/Unicode/ConsoleApplication1/AllCharactersInUnicodeData.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Globalization;\nusing System.IO;\nusing System.Linq;\nusing System.Net.Http;\nusing System.Text.RegularExpressions;\nusing System.Threading.Tasks;\nusing static System.Text.Encoding;\n\n\nnamespace ConsoleApplication1\n{\n    class AllCharactersInUnicodeData\n    {\n        public static async Task Count()\n        {\n            const string dataFolder = \"data\";\n\n            await DownloadDataAsync(dataFolder);\n            var items = ReadData(dataFolder).ToArray();\n\n            foreach (var item in items)\n            {\n                Console.WriteLine(item.Version);\n\n                Console.WriteLine(\"  category : # all characters / # non-BMP characters\");\n                Console.WriteLine($\"  total: {item.List.Count} / {item.List.Count(x => x > 0x10000)}\");\n                Console.WriteLine($\"  added: {item.Difference.Count} / {item.Difference.Count(x => x > 0x10000)}\");\n\n                var buffer = new byte[4];\n\n                var categories = item.List\n                    .GroupBy(x => GetUnicodeCategory(x, buffer))\n                    .Select(g => (category: g.Key, count: g.Count(), scount: g.Count(x => x > 0x10000)))\n                    .ToArray();\n\n                foreach (var c in categories)\n                {\n                    Console.WriteLine($\"  {c.category,25}: {c.count,5} / {c.scount,5}\");\n                }\n\n                //Console.Read();\n            }\n        }\n\n        private static UnicodeCategory GetUnicodeCategory(int codePoint, byte[] buffer)\n        {\n            buffer[0] = unchecked((byte)(codePoint >> 0));\n            buffer[1] = unchecked((byte)(codePoint >> 8));\n            buffer[2] = unchecked((byte)(codePoint >> 16));\n            buffer[3] = unchecked((byte)(codePoint >> 24));\n            var s = UTF32.GetString(buffer);\n            var c = char.GetUnicodeCategory(s, 0);\n            return c;\n        }\n\n        struct Ucd\n        {\n            public string Version { get; }\n\n            /// <summary>\n            /// このバージョンが含んでいるコードポイント。\n            /// 順序通り。\n            /// </summary>\n            public IReadOnlyList<int> List { get; }\n\n            /// <summary>\n            /// このバージョンが含んでいるコードポイント。\n            /// 検索用。\n            /// </summary>\n            public ICollection<int> Set { get; }\n\n            /// <summary>\n            /// 前のバージョンからの差分\n            /// </summary>\n            public ICollection<int> Difference { get; }\n\n            public Ucd(string version, StreamReader unicodeData, Ucd prev = default(Ucd))\n            {\n                Version = version;\n\n                var list = new List<int>();\n\n                string line;\n                while ((line = unicodeData.ReadLine()) != null)\n                {\n                    if (string.IsNullOrWhiteSpace(line)) continue;\n                    if (line.StartsWith(\"#\")) continue;\n\n                    var items = line.Split(';');\n                    var codepoint = int.Parse(items[0], System.Globalization.NumberStyles.HexNumber);\n\n                    list.Add(codepoint);\n                }\n\n                List = list;\n                Set = new HashSet<int>(list);\n\n                if (prev.Set != null)\n                {\n                    Difference = list.Except(prev.Set).ToArray();\n                }\n                else\n                {\n                    Difference = Array.Empty<int>();\n                }\n            }\n        }\n\n        private static IEnumerable<Ucd> ReadData(string dataFolder)\n        {\n            var prev = default(Ucd);\n\n            foreach (var file in Directory.GetFiles(dataFolder))\n            {\n                var version = Path.GetFileName(file);\n\n                using (var r = new StreamReader(file))\n                {\n                    var ucd = new Ucd(version, r, prev);\n                    yield return ucd;\n                    prev = ucd;\n                }\n            }\n        }\n\n        private static async Task DownloadDataAsync(string dataFolder)\n        {\n            if (Directory.Exists(dataFolder))\n                return;\n\n            Directory.CreateDirectory(dataFolder);\n\n            var urls = new[]\n            {\n            \"http://www.unicode.org/Public/reconstructed/1.0.0/UnicodeData.txt\",\n            \"http://www.unicode.org/Public/reconstructed/1.0.1/UnicodeData.txt\",\n            \"http://www.unicode.org/Public/2.0-Update/UnicodeData-2.0.14.txt\",\n            \"http://www.unicode.org/Public/2.1-Update/UnicodeData-2.1.2.txt\",\n            \"http://www.unicode.org/Public/2.1-Update2/UnicodeData-2.1.5.txt\",\n            \"http://www.unicode.org/Public/2.1-Update3/UnicodeData-2.1.8.txt\",\n            \"http://www.unicode.org/Public/2.1-Update4/UnicodeData-2.1.9.txt\",\n            \"http://www.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.txt\",\n            \"http://www.unicode.org/Public/3.1-Update/UnicodeData-3.1.0.txt\",\n            \"http://www.unicode.org/Public/3.2-Update/UnicodeData-3.2.0.txt\",\n            \"http://www.unicode.org/Public/4.0-Update/UnicodeData-4.0.0.txt\",\n            \"http://www.unicode.org/Public/4.1.0/ucd/UnicodeData.txt\",\n            \"http://www.unicode.org/Public/5.0.0/ucd/UnicodeData.txt\",\n            \"http://www.unicode.org/Public/5.1.0/ucd/UnicodeData.txt\",\n            \"http://www.unicode.org/Public/5.2.0/ucd/UnicodeData.txt\",\n            \"http://www.unicode.org/Public/6.0.0/ucd/UnicodeData.txt\",\n            \"http://www.unicode.org/Public/6.1.0/ucd/UnicodeData.txt\",\n            \"http://www.unicode.org/Public/6.2.0/ucd/UnicodeData.txt\",\n            \"http://www.unicode.org/Public/6.3.0/ucd/UnicodeData.txt\",\n            \"http://www.unicode.org/Public/7.0.0/ucd/UnicodeData.txt\",\n            \"http://www.unicode.org/Public/8.0.0/ucd/UnicodeData.txt\",\n            \"http://www.unicode.org/Public/9.0.0/ucd/UnicodeData.txt\",\n            };\n\n            var regVersion = new Regex(@\"\\d+\\.\\d+\\.\\d+\");\n            var h = new HttpClient();\n\n            foreach (var url in urls)\n            {\n                var version = regVersion.Match(url).Value;\n\n                Console.WriteLine($\"download UnicodeData {version}\");\n\n                var res = await h.GetAsync(url);\n                using (var source = await res.Content.ReadAsStreamAsync())\n                using (var destination = File.OpenWrite(Path.Combine(dataFolder, version)))\n                {\n                    await source.CopyToAsync(destination);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/ConsoleApplication1/CharacterLength.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing static System.Text.Encoding;\n\nnamespace ConsoleApplication1\n{\n    class CharacterLength\n    {\n        public static void WriteLength()\n        {\n            WriteLength(\"{ \\\"key\\\": \\\"value\\\" }\");\n            WriteLength(\"aαあ😀\");\n            WriteLength(\"아조선글\");\n            WriteLength(\"👨‍👨‍👨‍👨‍👨‍👨‍👨\");\n            WriteLength(\"👨‍👩‍👦‍👦\"); // 25バイト文字\n            WriteLength(\"👨🏻‍👩🏿‍👦🏽‍👦🏼\"); // 41バイト文字\n            WriteLength(\"́\");\n            WriteLength(\"♢♠♤\");\n            WriteLength(\"🀄♔\");\n            WriteLength(\"☀☂☁\");\n            WriteLength(\"∀∂∋\");\n            WriteLength(\"ᚠᛃᚻ\");\n            WriteLength(\"𩸽\");\n        }\n\n        public static void WriteLength(string s)\n        {\n            var codes = GetCodePoints(s).ToArray();\n            Console.WriteLine(\"文字: \" + s);\n            Console.WriteLine(\"UTF32 len: \" + codes.Length);\n            Console.WriteLine(\"UTF16 len: \" + s.Length);\n            Console.WriteLine(\"UTF8  len: \" + UTF8.GetByteCount(s));\n\n            foreach (var c in codes)\n            {\n                Console.WriteLine($\"{c.value.ToString(\"X\"),6} / {Join(c.utf32)} / {Join(c.utf16)} / {Join(c.utf8)}\");\n            }\n\n            Console.Read();\n        }\n\n        private static string Join(byte[] codes) => string.Join(\", \", codes.Select(x => x.ToString(\"X2\")));\n        private static string Join(int[] codes) => string.Join(\", \", codes.Select(x => x.ToString(\"X4\")));\n\n        struct CodePoint\n        {\n            public int value;\n            public string @char;\n            public byte[] utf8;\n            public byte[] utf16;\n            public byte[] utf32;\n        }\n\n        static IEnumerable<CodePoint> GetCodePoints(string s)\n        {\n            var bytes = UTF32.GetBytes(s);\n\n            for (int i = 0; i < bytes.Length; i += 4)\n            {\n                var cp = new CodePoint();\n\n                var utf32 = new byte[4];\n                Array.Copy(bytes, i, utf32, 0, 4);\n                cp.utf32 = utf32;\n\n                cp.value = (utf32[0] << 0)\n                    | (utf32[1] << 8)\n                    | (utf32[2] << 16)\n                    | (utf32[3] << 24);\n\n                var decoded = UTF32.GetString(utf32);\n                cp.@char = decoded;\n                cp.utf16 = Unicode.GetBytes(decoded);\n                cp.utf8 = UTF8.GetBytes(decoded);\n\n                yield return cp;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/ConsoleApplication1/ComparisonWithSystemString.cs",
    "content": "﻿namespace ConsoleApplication1\n{\n    using System;\n    using System.Text.Utf8;\n\n    class ComparisonWithSystemString\n    {\n        public static void Run()\n        {\n            var utf8RawData = new byte[] { 0x7B, 0x20, 0x22, 0x6B, 0x65, 0x79, 0x22, 0x3A, 0x20, 0x22, 0x61, 0xE3, 0x81, 0x82, 0xF0, 0x9F, 0x98, 0x80, 0x22, 0x20, 0x7D };\n            var utf16RawData = new char[] { '{', ' ', '\"', 'k', 'e', 'y', '\"', ':', ' ', '\"', 'a', 'あ', (char)0xD83D, (char)0xDE00, '\"', ' ', '}' };\n\n            // string 型\n            {\n                // UTF-8 → UTF-16 の変換でヒープ確保が必要\n                var s1 = System.Text.Encoding.UTF8.GetString(utf8RawData);\n\n                // string 型は char[] を受け取る場合でも、内部でコピーを作るのでヒープ確保発生\n                var s2 = new string(utf16RawData);\n\n                // string.Substring もコピー発生\n                var sub = s1.Substring(10, 4);\n\n                Console.WriteLine(sub);\n            }\n\n            // Utf8String 型\n            {\n                // ヒープ確保しない実装\n                var s = new Utf8String(utf8RawData);\n\n                // インデックスでの文字取得はできない。s[0] は byte 単位のアクセスになる\n                // コード ポイントの取り出しには CodePoints を使う\n                // foreach もすべて構造体で展開されるのでヒープ確保不要\n                foreach (var c in s)\n                {\n                    Console.WriteLine(c);\n                }\n\n                // Substring もコピー不要な実装になっている\n                var sub = s.Substring(10, 8);\n\n                foreach (var c in sub)\n                {\n                    Console.WriteLine(c);\n                }\n            }\n\n            // string 型\n            {\n                // 内部でコピーしているので…\n                var s1 = new string(utf16RawData);\n                var s2 = new string(utf16RawData);\n\n                // 元データを書き換えても\n                utf16RawData[0] = '[';\n                utf16RawData[16] = ']';\n\n                // 影響は出ない\n                Console.WriteLine(s1); // { \"key\": \"aあ😀\" }\n                Console.WriteLine(s2); // { \"key\": \"aあ😀\" }\n            }\n\n            // Utf8String 型\n            {\n                // データを共有しているので…\n                var s1 = new Utf8String(utf8RawData);\n                var s2 = new Utf8String(utf8RawData);\n\n                //98, 227, 129, 132, 240, 159, 144, 136\n                // 元データを書き換えると\n                utf8RawData[10] = 98;\n                utf8RawData[11] = 227;\n                utf8RawData[12] = 129;\n                utf8RawData[13] = 132;\n                utf8RawData[14] = 240;\n                utf8RawData[15] = 159;\n                utf8RawData[16] = 144;\n                utf8RawData[17] = 136;\n\n                // 影響がある\n                Console.WriteLine(s1); // { \"key\": \"bい🐈\" }\n                Console.WriteLine(s2); // { \"key\": \"bい🐈\" }\n                Console.WriteLine(s1.Substring(10, 8)); // bい🐈\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/ConsoleApplication1/CompatibleWithBstr.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApplication1\n{\n    class CompatibleWithBstr\n    {\n        public static void WriteLayout()\n        {\n            WriteLayout(\"aαあ\");\n        }\n\n        private unsafe static void WriteLayout(string s)\n        {\n            Console.WriteLine(s);\n            Console.WriteLine(s.Length.ToString(\"X8\"));\n\n            fixed (char* ps = s)\n            {\n                byte* p = (byte*)ps;\n                for (int i = -4; i < (s.Length + 1) * 2; i++)\n                {\n                    var b = *(p + i);\n                    Console.Write(b.ToString(\"X2\"));\n                }\n            }\n\n            Console.WriteLine();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/ConsoleApplication1/ConsoleApplication1.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Text.Utf8String\" Version=\"0.1.0-preview2-181006-4\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\UtfString\\UtfString.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2016/Unicode/ConsoleApplication1/DecodeSample.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ConsoleApplication1\n{\n    class DecodeSample\n    {\n        public static void Decode()\n        {\n            Decode(\"aáαあ😀\");\n        }\n\n        public static void Decode(string s)\n        {\n            var utf8 = DecodeUtf8(s);\n            var utf16 = DecodeUtf16(s);\n            var utf32 = new UtfString.Utf32.String(Encoding.UTF32.GetBytes(s)).Select(x => x.Value);\n\n            void write(IEnumerable<uint> codes) => Console.WriteLine(string.Join(\" \", codes.Select(x => x.ToString(\"X2\"))));\n\n            write(utf8);\n            write(utf16);\n            write(utf32);\n        }\n\n        unsafe static IEnumerable<uint> DecodeUtf8(string s)\n        {\n            var buffer = Encoding.UTF8.GetBytes(s);\n            return DecodeUtf8(buffer);\n        }\n\n        private static unsafe IEnumerable<uint> DecodeUtf8(byte[] buffer)\n        {\n            var list = new List<uint>();\n            fixed (byte* begin = buffer)\n            {\n                var p = begin;\n                var end = p + buffer.Length;\n                while (p < end)\n                {\n                    var (cp, count) = DecodeUtf8(p);\n                    list.Add(cp);\n                    p += count;\n                }\n            }\n            return list;\n        }\n\n        unsafe static IEnumerable<uint> DecodeUtf16(string s)\n        {\n            var buffer = Encoding.Unicode.GetBytes(s);\n            return DecodeUtf16(buffer);\n        }\n\n        private static unsafe IEnumerable<uint> DecodeUtf16(byte[] buffer)\n        {\n            var list = new List<uint>();\n            fixed (byte* begin = buffer)\n            {\n                var p = (ushort*)begin;\n                var end = (ushort*)(begin + buffer.Length);\n                while (p < end)\n                {\n                    var (cp, count) = DecodeUtf16(p);\n                    list.Add(cp);\n                    p += count;\n                }\n            }\n            return list;\n        }\n\n        unsafe static (uint codePoint, int count) DecodeUtf8(byte* p)\n        {\n            uint code = p[0];\n\n            if (code < 0b1100_0000)\n            {\n                // 1バイト: ASCII 文字\n                return (code, 1);\n            }\n            if (code < 0b1110_0000)\n            {\n                // 2バイト: 主に欧米の文字\n                code &= 0b1_1111;\n                code = (code << 6) | (uint)(p[1] & 0b0011_1111);\n                return (code, 2);\n            }\n            if (code < 0b1111_0000)\n            {\n                // 3バイト: かな漢字など\n                code &= 0b1111;\n                code = (code << 6) | (uint)(p[1] & 0b0011_1111);\n                code = (code << 6) | (uint)(p[2] & 0b0011_1111);\n                return (code, 3);\n            }\n\n            // 4バイト: 絵文字など\n            code &= 0b0111;\n            code = (code << 6) | (uint)(p[1] & 0b0011_1111);\n            code = (code << 6) | (uint)(p[2] & 0b0011_1111);\n            code = (code << 6) | (uint)(p[3] & 0b0011_1111);\n            return (code, 4);\n        }\n\n        unsafe static (uint codePoint, int count) DecodeUtf16(ushort* p)\n        {\n            uint code = p[0];\n\n            if ((code & 0b1111_1100_0000_0000) == 0b1101_1000_0000_0000)\n            {\n                // サロゲート ペア: 絵文字など\n                code = (code & 0b0011_1111_1111) + 0b0100_0000;\n                code = (code << 10) | ((uint)p[1] & 0b0011_1111_1111);\n                return (code, 2);\n            }\n            else\n            {\n                // 頻度的に大半の文字がこっちに来るはず。バッファー内の値を素通し。\n                return (code, 1);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/ConsoleApplication1/DualEncoding.cs",
    "content": "﻿using System;\nusing System.Text;\n\nnamespace ConsoleApplication1\n{\n    class DualEncoding\n    {\n        public static void Run()\n        {\n            var s = \"Latin-1, abc àèì\";\n            byte[] latin1 = Encoding.GetEncoding(1252).GetBytes(s); // Latin-1\n            byte[] utf16 = Encoding.Unicode.GetBytes(s);           // UTF-16\n\n            for (int i = 0; i < latin1.Length; i++)\n            {\n                var x = latin1[i];\n                var y = utf16[2 * i];\n\n                // Latin-1 と UTF-16 の差は、バイト数の差だけ\n                // UTF-16 の方を1バイト飛ばしで読めば、必ず同じ値が入っている\n                if (x != y) throw new InvalidOperationException(); // ここは絶対に通らない\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/ConsoleApplication1/GraphemeIdentifiers.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApplication1\n{\n    /// <summary>\n    /// 結合文字(Mn, Mcカテゴリーの文字)や、formatting-character を識別子に使えることをいろいろ悪用。\n    /// </summary>\n    class GraphemeIdentifiers\n    {\n        /// <summary>\n        /// Cf 文字を識別子に使った場合、削除するらしい。\n        /// ab と a\\u200db (\\u200d は zero witdh joiner)は同じ識別子として扱われる。\n        /// </summary>\n        public static void ZeroWidthJoiner()\n        {\n            var ab = 0;\n            a\\u200db = 1; // ab と同じ扱い\n            Console.WriteLine(ab); // 1\n\n            Console.WriteLine(nameof(a\\u200db).Length); // 2。つまり、\"ab\" 扱い\n\n            var s1 = \"ab\";\n            var s2 = \"a\\u200db\";\n            Console.WriteLine(s1.Length); // 2\n            Console.WriteLine(s2.Length); // 3\n            Console.WriteLine(s1 == s2);  // false\n        }\n\n        /// <summary>\n        /// non-spacing mark(アクセント記号とか濁点とか)を使うと、\n        /// 見た目が全く同じで違う文字ってのが作れる。\n        /// </summary>\n        public static void DiacriticalMark()\n        {\n            var á = 1; // U+0061 U+0301\n            var á = 2; // U+00E1\n\n            Console.WriteLine(á); // 1\n            Console.WriteLine(á); // 2\n\n            var が = 1; // U+304B U+3099\n            var が = 2; // U+304C\n\n            Console.WriteLine(が); // 1\n            Console.WriteLine(が); // 2\n        }\n\n        public static void IdeographicVariationSelector()\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/ConsoleApplication1/NoAllocation.cs",
    "content": "﻿#define USE_UTF8\n\nusing System;\n\n#if USE_UTF8\nusing MyString = UtfString.Utf8.String;\n#else\nusing MyString = UtfString.Utf16.String;\n#endif\n\nnamespace ConsoleApplication1\n{\n    class NoAllocation\n    {\n        public static void AllocationCheck()\n        {\n            const int N = 10000;\n            var str = \"aáαℵあáあ゙亜👩👩🏽👨🏻‍👩🏿‍👦🏽‍👦🏼\";\n#if USE_UTF8\n            var encoding = System.Text.Encoding.UTF8;\n#else\n            var encoding = System.Text.Encoding.Unicode;\n#endif\n            var data = encoding.GetBytes(str);\n\n            Console.WriteLine(data.Length);\n            Console.WriteLine(str);\n            Console.WriteLine(str.Length);\n\n            GC.Collect();\n            {\n                Console.WriteLine(\"--------\");\n                var begin = GC.GetTotalMemory(false);\n                Console.WriteLine(begin);\n                (int total, int ascii, int latin1, int utf16, int surrogatePair) len = (0, 0, 0, 0, 0);\n\n                for (int i = 0; i < N; i++)\n                {\n                    var s = new MyString(data);\n                    len = (0, 0, 0, 0, 0);\n                    foreach (var x in s)\n                    {\n                        len.total++;\n                        if (x.Value < 0x80) len.ascii++;\n                        else if (x.Value < 0x100) len.latin1++;\n                        else if (x.Value < 0x10000) len.utf16++;\n                        else len.surrogatePair++;\n                    }\n                }\n                var end = GC.GetTotalMemory(false);\n                Console.WriteLine(end);\n                Console.WriteLine($\"{end - begin} {(end - begin) / N}\");\n                Console.WriteLine(\"\\t\" + len);\n            }\n\n            GC.Collect();\n            {\n                Console.WriteLine(\"--------\");\n                var begin = GC.GetTotalMemory(false);\n                Console.WriteLine(begin);\n                (int total, int ascii, int latin1, int utf16, int surrogatePair) len = (0, 0, 0, 0, 0);\n\n                for (int i = 0; i < N; i++)\n                {\n                    var s = encoding.GetString(data);\n                    len = (0, 0, 0, 0, 0);\n                    foreach (var x in s)\n                    {\n                        if (!char.IsLowSurrogate(x)) len.total++;\n                        if (x < 0x80) len.ascii++;\n                        else if (x < 0x100) len.latin1++;\n                        else if (!char.IsSurrogate(x)) len.utf16++;\n                        else if (char.IsHighSurrogate(x)) len.surrogatePair++;\n                    }\n                }\n                var end = GC.GetTotalMemory(false);\n                Console.WriteLine(end);\n                Console.WriteLine($\"{end - begin} {(end - begin) / N}\");\n                Console.WriteLine(\"\\t\" + len);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/ConsoleApplication1/Performance.cs",
    "content": "﻿#define ArrayImplementation\n\nusing System;\nusing System.Diagnostics;\nusing System.Text;\nusing System.Linq;\n\n#if !ArrayImplementation\n// こっちの実装だと、UTF-16の方がいちいちfixedが必要でちょっと性能悪い\nusing Utf8String = UtfString.Utf8.String;\nusing Utf16String = UtfString.Utf16.String;\n#else\nusing Utf8String = UtfString.ArrayImplementation.Utf8.String;\nusing Utf16String = UtfString.ArrayImplementation.Utf16.String;\n#endif\n\nusing LabUtf8String = System.Text.Utf8.Utf8String;\n\nnamespace ConsoleApplication1\n{\n    class Performance\n    {\n        public static void Check()\n        {\n            var s = \"a\";\n            var utf8 = Encoding.UTF8.GetBytes(s);\n#if !ArrayImplementation\n            var utf16 = Encoding.Unicode.GetBytes(s);\n#else\n            var utf16 = Copy8To16(Encoding.Unicode.GetBytes(s));\n#endif\n\n            // JIT の時間カウントしないように最初に1度アクセス\n            var s1 = new Utf8String(utf8);\n            var i1 = s1.Indexes;\n            var c1 = s1[i1.First()];\n            var s2 = new Utf16String(utf16);\n            var i2 = s2.Indexes;\n            var c2 = s2[i2.First()];\n\n            Console.WriteLine(\"絵文字あり\");\n            Check(\"ASCII: abcABC, Latin-1: ÀÁÂÃÄÅ, ελληνικά кириллица עִברִית ひらがな 한글 漢字, combining: áあ゙, emoji: 👩👩🏽👨‍👨‍👨‍👨‍👨‍👨‍👨👨🏻‍👩🏿‍👦🏽‍👦🏼\");\n\n            Console.WriteLine(\"絵文字なし\");\n            Check(\"ASCII: abcABC, Latin-1: ÀÁÂÃÄÅ, ελληνικά кириллица עִברִית ひらがな 한글 漢字, combining: áあ゙\");\n\n            Console.WriteLine(\"日本語\");\n            Check(\"寿限無、寿限無 五劫の擦り切れ 海砂利水魚の 水行末 雲来末 風来末 食う寝る処に住む処 藪ら柑子の藪柑子 パイポパイポパイポのシューリンガン シューリンガンのグーリンダイ グーリンダイのポンポコピーのポンポコナーの 長久命の長助\");\n\n            Console.WriteLine(\"絵文字のみ\");\n            Check(\"👩👩🏽👨‍👨‍👨‍👨‍👨‍👨‍👨👨🏻‍👩🏿‍👦🏽‍👦🏼🐀🐁🐂🐃🐄🐅🐆🐇🐈🐉🐊🐋🐌🐍🐎🐏🐐🐑🐒🐓🐔🐕🐖🐗🐘🐙🐚🐛🐜🐝🐞🐟🐠🐡🐢🐣🐤🐥🐦🐧🐨🐩🐪🐫🐬\");\n\n            Console.WriteLine(\"latin-1\");\n            Check(\"!\\\"#$%&'() 1234567890 AQWSEDRFTGYHUJIKOLP+@,./\\\\<>?_°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\");\n\n            Console.WriteLine(\"ASCII\");\n            Check(\"!\\\"#$%&'() 1234567890 AQWSEDRFTGYHUJIKOLP+@,./\\\\<>?_\");\n        }\n\n        static void Check(string s)\n        {\n            const int N = 100;\n            // 計測用に長めの文字列にしたいので 2^10 倍につなぐ\n            for (int i = 0; i < 10; i++)\n            {\n                s = s + s;\n            }\n\n            var utf8 = Encoding.UTF8.GetBytes(s);\n#if !ArrayImplementation\n            var utf16 = Encoding.Unicode.GetBytes(s);\n#else\n            var utf16 = Copy8To16(Encoding.Unicode.GetBytes(s));\n#endif\n            GC.Collect();\n\n            for (int n = 0; n < 3; n++)\n            {\n                Console.WriteLine(\"---- \" + n + \" ----\");\n                using (SW.New(\"corefxlab code point: \"))\n                {\n                    for (int i = 0; i < N; i++)\n                        foreach (var c in new LabUtf8String(utf8))\n                            ;\n                }\n                using (SW.New(\"  utf-8  code point: \"))\n                {\n                    for (int i = 0; i < N; i++)\n                        foreach (var c in new Utf8String(utf8))\n                            ;\n                }\n                using (SW.New(\"  utf-16 code point: \"))\n                {\n                    for (int i = 0; i < N; i++)\n                        foreach (var c in new Utf16String(utf16))\n                            ;\n                }\n                using (SW.New(\"  utf-8  index     : \"))\n                {\n                    for (int i = 0; i < N; i++)\n                    {\n                        var x = new Utf8String(utf8);\n                        foreach (var index in x.Indexes)\n                        {\n                            var c = x[index];\n                        }\n                    }\n                }\n                using (SW.New(\"  utf-16 index     : \"))\n                {\n                    for (int i = 0; i < N; i++)\n                    {\n                        var x = new Utf16String(utf16);\n                        foreach (var index in x.Indexes)\n                        {\n                            var c = x[index];\n                        }\n                    }\n                }\n            }\n        }\n\n        struct SW : IDisposable\n        {\n            private Stopwatch _sw;\n            private string _caption;\n            private SW(Stopwatch sw, string caption)\n            {\n                _sw = sw; sw.Start();\n                _caption = caption;\n            }\n            public static SW New(string caption) => new SW(new Stopwatch(), caption);\n            public void Dispose()\n            {\n                _sw.Stop();\n                Console.WriteLine(_caption + _sw.Elapsed);\n            }\n        }\n\n        private static ushort[] Copy8To16(byte[] encodedBytes)\n        {\n            if ((encodedBytes.Length % 2) != 0) throw new ArgumentException();\n            var output = new ushort[encodedBytes.Length / 2];\n            Buffer.BlockCopy(encodedBytes, 0, output, 0, encodedBytes.Length);\n            return output;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/ConsoleApplication1/Program.cs",
    "content": "﻿namespace ConsoleApplication1\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            DualEncoding.Run();\n            GraphemeIdentifiers.DiacriticalMark();\n            GraphemeIdentifiers.ZeroWidthJoiner();\n            GraphemeIdentifiers.IdeographicVariationSelector();\n            DecodeSample.Decode();\n            Performance.Check();\n            CompatibleWithBstr.WriteLayout();\n            NoAllocation.AllocationCheck();\n            AllCharactersInUnicodeData.Count().Wait();\n            CharacterLength.WriteLength();\n            ComparisonWithSystemString.Run();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/ConsoleApplication1/SurrogatePair.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApplication1\n{\n    class SurrogatePair\n    {\n        public static void Run()\n        {\n            var s = \"𩸽\";\n\n            // 「𩸽」はサロゲート ペアになっているので、char としては2文字になる\n            foreach (var c in s)\n            {\n                // Surrogate が2回表示される\n                Console.WriteLine(char.GetUnicodeCategory(c));\n            }\n\n            // string を受け取る GetUnicodeCategory オーバーロードなら、\n            // サロゲート ペアな文字もコード ポイントにデコードして正しくカテゴリー判定できる\n\n            // OtherLetter (漢字のカテゴリー)が表示される\n            Console.WriteLine(char.GetUnicodeCategory(s, 0));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/Unicode.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.25728.2\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApplication1\", \"ConsoleApplication1\\ConsoleApplication1.csproj\", \"{E95AB122-4543-4D5E-88CE-4F9B122B1B6B}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"UtfString\", \"UtfString\\UtfString.csproj\", \"{0D031BE1-34D0-4765-A9FF-6FB42C967F6A}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"UnitTestUtfString\", \"UnitTestUtfString\\UnitTestUtfString.csproj\", \"{DF0A2CD2-D921-4D43-8334-97C18BD22375}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{E95AB122-4543-4D5E-88CE-4F9B122B1B6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E95AB122-4543-4D5E-88CE-4F9B122B1B6B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E95AB122-4543-4D5E-88CE-4F9B122B1B6B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E95AB122-4543-4D5E-88CE-4F9B122B1B6B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0D031BE1-34D0-4765-A9FF-6FB42C967F6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0D031BE1-34D0-4765-A9FF-6FB42C967F6A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0D031BE1-34D0-4765-A9FF-6FB42C967F6A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0D031BE1-34D0-4765-A9FF-6FB42C967F6A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{DF0A2CD2-D921-4D43-8334-97C18BD22375}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{DF0A2CD2-D921-4D43-8334-97C18BD22375}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{DF0A2CD2-D921-4D43-8334-97C18BD22375}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{DF0A2CD2-D921-4D43-8334-97C18BD22375}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2016/Unicode/UnitTestUtfString/CharacterInfo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing static System.Text.Encoding;\n\nnamespace UnitTestUtfString\n{\n    struct CharacterInfo\n    {\n        public int codePoint;\n        public string @char;\n        public byte[] utf8;\n        public byte[] utf16;\n        public byte[] utf32;\n\n        public static IEnumerable<CharacterInfo> GetCharacters(string s)\n        {\n            var bytes = UTF32.GetBytes(s);\n\n            for (int i = 0; i < bytes.Length; i += 4)\n            {\n                var cp = new CharacterInfo();\n\n                var utf32 = new byte[4];\n                Array.Copy(bytes, i, utf32, 0, 4);\n                cp.utf32 = utf32;\n\n                cp.codePoint = (utf32[0] << 0)\n                    | (utf32[1] << 8)\n                    | (utf32[2] << 16)\n                    | (utf32[3] << 24);\n\n                var decoded = UTF32.GetString(utf32);\n                cp.@char = decoded;\n                cp.utf16 = Unicode.GetBytes(decoded);\n                cp.utf8 = UTF8.GetBytes(decoded);\n\n                yield return cp;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UnitTestUtfString/TestData.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace UnitTestUtfString\n{\n    internal struct TestData\n    {\n        public static readonly IEnumerable<TestData> Data = new[]\n        {\n            \"aáαあ😀\",\n            \"aáαℵあáあ゙亜👩👩🏽\",\n            \"아조선글\",\n            \"👨‍👨‍👨‍👨‍👨‍👨‍👨\",\n            \"👨‍👩‍👦‍👦\",\n            \"👨🏻‍👩🏿‍👦🏽‍👦🏼\",\n            \"́\",\n            \"♢♠♤\",\n            \"🀄♔\",\n            \"☀☂☁\",\n            \"∀∂∋\",\n            \"ᚠᛃᚻ\",\n            \"𩸽\",\n            \"\",\n            \"ascii string !\\\"#$%&'() 1234567890 AQWSEDRFTGYHUJIKOLP+@,./\\\\<>?_\",\n            \"latin1 string °±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\",\n        }.Select(s => new TestData(s)).ToArray();\n\n\n        public string String { get; }\n        public byte[] Utf8 { get; }\n        public byte[] Utf16B { get; }\n        public ushort[] Utf16S { get; }\n        public byte[] Utf32B { get; }\n        public uint[] Utf32I { get; }\n        public byte[] Latin1 { get; }\n\n        public TestData(string s)\n        {\n            String = s;\n            Utf8 = Encoding.UTF8.GetBytes(s);\n            Utf16B = Encoding.Unicode.GetBytes(s);\n            Utf16S = Copy8To16(Utf16B);\n            Utf32B = Encoding.UTF32.GetBytes(s);\n            Utf32I = Copy8To32(Utf32B);\n\n            if (s.All(c => c < 0x100))\n                Latin1 = Encoding.GetEncoding(\"iso-8859-1\").GetBytes(s);\n            else\n                Latin1 = null;\n        }\n\n        private static ushort[] Copy8To16(byte[] encodedBytes)\n        {\n            if ((encodedBytes.Length % 2) != 0) throw new ArgumentException();\n            var output = new ushort[encodedBytes.Length / 2];\n            Buffer.BlockCopy(encodedBytes, 0, output, 0, encodedBytes.Length);\n            return output;\n        }\n\n        private static uint[] Copy8To32(byte[] encodedBytes)\n        {\n            if ((encodedBytes.Length % 4) != 0) throw new ArgumentException();\n            var output = new uint[encodedBytes.Length / 4];\n            Buffer.BlockCopy(encodedBytes, 0, output, 0, encodedBytes.Length);\n            return output;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UnitTestUtfString/TestSlicesUtf8String.cs",
    "content": "﻿using Xunit;\nusing System;\nusing System.Linq;\nusing UtfString.Slices;\n\nnamespace UnitTestUtfString\n{\n    public class TestSlicesUtf8String\n    {\n        [Fact]\n        public void ShouldBeIdentical()\n        {\n            foreach (var s in TestData.Data)\n            {\n                ShouldBeIdenticalInternal(new Utf8String(s.Utf8), s.Utf32I);\n            }\n        }\n\n        private static void ShouldBeIdenticalInternal(Utf8String s, uint[] expected)\n        {\n            var codePoints = s.CodePoints.ToArray();\n\n            Assert.Equal(expected.Length, codePoints.Length);\n\n            for (int i = 0; i < codePoints.Length; i++)\n            {\n                Assert.Equal(expected[i], codePoints[i].Value);\n            }\n        }\n\n        [Fact]\n        public void NoAllocationWithForeach()\n        {\n            const int N = 1000;\n\n            foreach (var s in TestData.Data)\n            {\n                NoAllocationWithForeachInternal(new Utf8String(s.Utf8), N);\n            }\n        }\n\n        private static void NoAllocationWithForeachInternal(Utf8String s, int n)\n        {\n            var start = GC.GetTotalMemory(false);\n\n            for (int i = 0; i < n; i++)\n            {\n                foreach (var x in s.CodePoints)\n                    ;\n\n                if (s.Length > 3)\n                {\n                    var sub1 = s.Substring(1, 1);\n                    var sub2 = s.Substring(2);\n                    var sub3 = s.Substring(3);\n                }\n            }\n\n            var end = GC.GetTotalMemory(false);\n\n            Assert.Equal(start, end);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UnitTestUtfString/TestString.cs",
    "content": "﻿//#define GENERIC\n\nusing System;\nusing Xunit;\nusing Utf8StringA = UtfString.ArrayImplementation.Utf8.String;\nusing Utf16StringA = UtfString.ArrayImplementation.Utf16.String;\nusing Utf8String = UtfString.Utf8.String;\nusing Utf16StringU = UtfString.Utf16.String;\nusing Utf32String = UtfString.Utf32.String;\nusing CompactString = UtfString.DualEncoding.String;\n#if GENERIC\nusing Utf8StringG = UtfString.Generic.String<byte, UtfString.Generic.ByteAccessor, UtfString.Generic.Utf8Decoder>;\nusing Utf16StringG = UtfString.Generic.String<ushort, UtfString.Generic.ShortAccessor, UtfString.Generic.Utf16Decoder<UtfString.Generic.ShortAccessor>>;\nusing CompactStringG = UtfString.Generic.String<ushort, UtfString.Generic.DualAccessor, UtfString.Generic.Utf16Decoder<UtfString.Generic.DualAccessor>>;\nusing Utf32StringG = UtfString.Generic.String<uint, UtfString.Generic.IntAccessor, UtfString.Generic.Utf32Decoder>;\n#endif\nusing System.Collections.Generic;\nusing System.Linq;\nusing UtfString;\n\nnamespace UnitTestUtfString\n{\n    public partial class TestString\n    {\n        [Fact]\n        public void ShouldBeIdentical()\n        {\n            foreach (var item in TestData.Data)\n            {\n                ShouldBeIdenticalInternal(item);\n            }\n        }\n\n        private void ShouldBeIdenticalInternal(TestData s)\n        {\n            ShouldBeIdentical1(new Utf8String(s.Utf8), s.Utf32I);\n            ShouldBeIdentical1(new Utf8StringA(s.Utf8), s.Utf32I);\n            ShouldBeIdentical1(new Utf16StringA(s.Utf16S), s.Utf32I);\n            ShouldBeIdentical1(new Utf16StringU(s.Utf16B), s.Utf32I);\n            ShouldBeIdentical1(new Utf32String(s.Utf32B), s.Utf32I);\n\n            ShouldBeIdentical1(new CompactString(true, s.Utf16B), s.Utf32I);\n            if (s.Latin1 != null)\n            {\n                ShouldBeIdentical1(new CompactString(false, s.Latin1), s.Utf32I);\n            }\n\n#if GENERIC\n            ShouldBeIdentical1(new Utf8StringG(s.Utf8), s.Utf32I);\n            ShouldBeIdentical1(new Utf16StringG(s.Utf16B), s.Utf32I);\n            ShouldBeIdentical1(new Utf32StringG(s.Utf32B), s.Utf32I);\n            ShouldBeIdentical1(new CompactStringG(s.Utf16B), s.Utf32I);\n            if (s.Latin1 != null)\n            {\n                ShouldBeIdentical1(new CompactStringG((false, s.Latin1)), s.Utf32I);\n            }\n#endif\n        }\n\n        private static void ShouldBeIdentical1<TIndex, TEnumerator, TIndexEnumerable, TIndexEnumerator>(IString<TIndex, TEnumerator, TIndexEnumerable, TIndexEnumerator> s, uint[] expected)\n            where TIndex : struct\n            where TEnumerator : struct, IEnumerator<CodePoint>\n            where TIndexEnumerator : struct, IEnumerator<TIndex>\n            where TIndexEnumerable : struct, IIndexEnumerable<TIndex, TIndexEnumerator>\n        {\n            var codePoints = ((IEnumerable<CodePoint>)s).ToArray();\n            var indexes = ((IEnumerable<TIndex>)s.Indexes).ToArray();\n\n            Assert.Equal(codePoints.Length, indexes.Length);\n\n            for (int i = 0; i < codePoints.Length; i++)\n            {\n                Assert.Equal(expected[i], codePoints[i].Value);\n                Assert.Equal(expected[i], s[indexes[i]].Value);\n                Assert.Equal(codePoints[i], s[indexes[i]]);\n            }\n        }\n\n        [Fact]\n        public void NoAllocationWithForeach()\n        {\n            foreach (var item in TestData.Data)\n            {\n                NoAllocationWithForeachInternal(item);\n            }\n        }\n\n        private void NoAllocationWithForeachInternal(TestData s)\n        {\n            const int N = 1000;\n\n            NoAllocationWithForeachInternal(new Utf8String(s.Utf8), N);\n            NoAllocationWithForeachInternal(new Utf8StringA(s.Utf8), N);\n            NoAllocationWithForeachInternal(new Utf16StringA(s.Utf16S), N);\n            NoAllocationWithForeachInternal(new Utf16StringU(s.Utf16B), N);\n            NoAllocationWithForeachInternal(new Utf32String(s.Utf32B), N);\n\n            NoAllocationWithForeachInternal(new CompactString(true, s.Utf16B), N);\n            if (s.Latin1 != null)\n            {\n                NoAllocationWithForeachInternal(new CompactString(false, s.Latin1), N);\n            }\n\n#if GENERIC\n            NoAllocationWithForeach(new Utf8StringG(s.Utf8), N);\n            NoAllocationWithForeach(new Utf16StringG(s.Utf16B), N);\n            NoAllocationWithForeach(new Utf32StringG(s.Utf32B), N);\n            NoAllocationWithForeach(new CompactStringG(s.Utf16B), N);\n            if (s.Latin1 != null)\n            {\n                NoAllocationWithForeach(new CompactStringG((false, s.Latin1)), N);\n            }\n#endif\n        }\n\n        private static void NoAllocationWithForeachInternal<TIndex, TEnumerator, TIndexEnumerable, TIndexEnumerator>(IString<TIndex, TEnumerator, TIndexEnumerable, TIndexEnumerator> s, int n)\n            where TIndex : struct\n            where TEnumerator : struct, IEnumerator<CodePoint>\n            where TIndexEnumerator : struct, IEnumerator<TIndex>\n            where TIndexEnumerable : struct, IIndexEnumerable<TIndex, TIndexEnumerator>\n        {\n            var start = GC.GetTotalMemory(false);\n\n            for (int i = 0; i < n; i++)\n                foreach (var x in s)\n                    ;\n\n            for (int i = 0; i < n; i++)\n                foreach (var x in s.Indexes)\n                {\n                    var c = s[x];\n                }\n\n            var end = GC.GetTotalMemory(false);\n\n            Assert.Equal(start, end);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UnitTestUtfString/UnitTestUtfString.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"15.8.0\" />\n    <PackageReference Include=\"xunit\" Version=\"2.4.0\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.4.0\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\UtfString\\UtfString.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2016/Unicode/UnitTestUtfString/UnitTestUtfString.nuget.props",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"no\"?>\n<Project ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Condition=\"'$(NuGetPackageRoot)' == ''\">\n    <NuGetPackageRoot>$(UserProfile)\\.nuget\\packages\\</NuGetPackageRoot>\n  </PropertyGroup>\n  <ImportGroup>\n    <Import Project=\"$(NuGetPackageRoot)mstest.testadapter\\1.1.1-preview\\build\\net45\\MSTest.TestAdapter.props\" Condition=\"Exists('$(NuGetPackageRoot)mstest.testadapter\\1.1.1-preview\\build\\net45\\MSTest.TestAdapter.props')\" />\n  </ImportGroup>\n</Project>"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/ArrayImplementation/Utf16/Decoder.cs",
    "content": "﻿namespace UtfString.ArrayImplementation.Utf16\n{\n    public static class Decoder\n    {\n        public static int GetCount(ushort[] buffer)\n        {\n            var count = 0;\n            foreach (var x in buffer)\n                if ((x & 0b1111_1100_0000_0000) != 0b1101_1100_0000_0000)\n                    count++;\n            return count;\n        }\n\n        public static bool TryGetCount(ushort[] buffer, int index, out byte wordCount)\n        {\n            wordCount = 0;\n\n            if (index >= buffer.Length) return false;\n            uint x = buffer[index];\n            if ((x & 0b1111_1100_0000_0000) == 0b1101_1000_0000_0000)\n            {\n                if (index + 1 >= buffer.Length) return false;\n                wordCount = 2;\n            }\n            else\n                wordCount = 1;\n\n            return true;\n        }\n\n        public static CodePoint Decode(ushort[] buffer, Index index)\n        {\n            var i = index.index;\n            uint code = buffer[i];\n\n            if (index.wordCount == 2)\n            {\n                code = (code & 0b0011_1111_1111) + 0b0100_0000;\n                code = (code << 10) | ((uint)buffer[i + 1] & 0b0011_1111_1111);\n                return new CodePoint(code);\n            }\n            else\n            {\n                return new CodePoint(code);\n            }\n        }\n\n        public static bool TryDecode(ushort[] buffer, ref int index, out CodePoint codePoint)\n        {\n            codePoint = default(CodePoint);\n\n            if (index >= buffer.Length) return false;\n\n            uint x = buffer[index++];\n\n            if ((x & 0b1111_1100_0000_0000) == 0b1101_1000_0000_0000)\n            {\n                var code = (x & 0b0011_1111_1111) + 0b0100_0000;\n                if (index >= buffer.Length) return false;\n                x = buffer[index++];\n                if ((x & 0b1111_1100_0000_0000) != 0b1101_1100_0000_0000) return false;\n                code = (code << 10) | (x & 0b0011_1111_1111);\n\n                codePoint = new CodePoint(code);\n                return true;\n            }\n            else\n            {\n                codePoint = new CodePoint(x);\n                return true;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/ArrayImplementation/Utf16/Index.cs",
    "content": "﻿namespace UtfString.ArrayImplementation.Utf16\n{\n    public struct Index\n    {\n        internal int index;\n        internal byte wordCount;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/ArrayImplementation/Utf16/IndexEnumerable.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace UtfString.ArrayImplementation.Utf16\n{\n    public struct IndexEnumerable : IEnumerator<Index>, IEnumerable<Index>, IIndexEnumerable<Index, IndexEnumerable>\n    {\n        private readonly ushort[] _buffer;\n        private Index _i;\n\n        public IndexEnumerable(ushort[] buffer)\n        {\n            _buffer = buffer;\n            _i = default(Index);\n        }\n\n        public Index Current => _i;\n        public bool MoveNext()\n        {\n            _i.index += _i.wordCount;\n            return Decoder.TryGetCount(_buffer, _i.index, out _i.wordCount);\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n\n        public IndexEnumerable GetEnumerator() => new IndexEnumerable(_buffer);\n        IEnumerator<Index> IEnumerable<Index>.GetEnumerator() => GetEnumerator();\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/ArrayImplementation/Utf16/String.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\n\nnamespace UtfString.ArrayImplementation.Utf16\n{\n    public struct String : IEnumerable<CodePoint>, IString<Index, StringEnumerator, IndexEnumerable, IndexEnumerable>\n    {\n        private readonly ushort[] _buffer;\n\n        public String(ushort[] encodedUshorts)\n        {\n            _buffer = encodedUshorts;\n        }\n\n        public StringEnumerator GetEnumerator() => new StringEnumerator(_buffer);\n\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n        IEnumerator<CodePoint> IEnumerable<CodePoint>.GetEnumerator() => GetEnumerator();\n\n        public IndexEnumerable Indexes => new IndexEnumerable(_buffer);\n        public CodePoint this[Index index] => Decoder.Decode(_buffer, index);\n\n        public int Length => Decoder.GetCount(_buffer);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/ArrayImplementation/Utf16/StringEnumerator.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace UtfString.ArrayImplementation.Utf16\n{\n    public struct StringEnumerator : IEnumerator<CodePoint>\n    {\n        private readonly ushort[] _buffer;\n        private int _index;\n\n        public StringEnumerator(ushort[] buffer)\n        {\n            _buffer = buffer;\n            _index = 0;\n            Current = default(CodePoint);\n        }\n\n        public CodePoint Current { get; private set; }\n\n        public bool MoveNext()\n        {\n            if (_index >= _buffer.Length) return false;\n            uint x = _buffer[_index++];\n\n            if ((x & 0b1111_1100_0000_0000) == 0b1101_1000_0000_0000)\n            {\n                var code = (x & 0b0011_1111_1111) + 0b0100_0000;\n                if (_index >= _buffer.Length) return false;\n                x = _buffer[_index++];\n                if ((x & 0b1111_1100_0000_0000) != 0b1101_1100_0000_0000) return false;\n                code = (code << 10) | (x & 0b0011_1111_1111);\n\n                Current = new CodePoint(code);\n                return true;\n            }\n            else\n            {\n                Current = new CodePoint(x);\n                return true;\n            }\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/ArrayImplementation/Utf8/Decoder.cs",
    "content": "﻿using System;\n\nnamespace UtfString.ArrayImplementation.Utf8\n{\n    public static class Decoder\n    {\n        public static int GetByteCount(byte[] buffer)\n        {\n            var count = 0;\n            foreach (var x in buffer)\n                if ((x & 0b1100_0000) != 0b1000_0000)\n                    count++;\n            return count;\n        }\n\n        public static bool TryGetByteCount(byte[] buffer, int index, out byte byteCount)\n        {\n            byteCount = 0;\n\n            if (index >= buffer.Length) return false;\n\n            uint x = buffer[index];\n\n            if (x < 0b1100_0000U)\n            {\n                byteCount = 1;\n                return true;\n            }\n\n            if (x < 0b1110_0000U) byteCount = 2;\n            else if (x < 0b1111_0000U) byteCount = 3;\n            else byteCount = 4;\n\n            if (index + byteCount > buffer.Length) return false;\n\n            return true;\n        }\n\n        public static CodePoint Decode(byte[] buffer, Index index)\n        {\n            var i = index.index;\n            uint x = buffer[i];\n            uint code = 0;\n            switch (index.byteCount)\n            {\n                case 1:\n                    return new CodePoint(x);\n                case 2:\n                    code = x & 0b1_1111;\n                    code = (code << 6) | (uint)(buffer[++i] & 0b0011_1111);\n                    return new CodePoint(code);\n                case 3:\n                    code = x & 0b1111;\n                    code = (code << 6) | (uint)(buffer[++i] & 0b0011_1111);\n                    code = (code << 6) | (uint)(buffer[++i] & 0b0011_1111);\n                    return new CodePoint(code);\n                case 4:\n                    code = x & 0b0111;\n                    code = (code << 6) | (uint)(buffer[++i] & 0b0011_1111);\n                    code = (code << 6) | (uint)(buffer[++i] & 0b0011_1111);\n                    code = (code << 6) | (uint)(buffer[++i] & 0b0011_1111);\n                    return new CodePoint(code);\n                default:\n                    throw new IndexOutOfRangeException();\n            }\n        }\n\n        public static bool TryDecode(byte[] buffer, ref int index, out CodePoint codePoint)\n        {\n            codePoint = default(CodePoint);\n\n            if (index >= buffer.Length) return false;\n\n            uint code = buffer[index];\n\n            if (code < 0b1100_0000)\n            {\n                // ASCII 文字\n                codePoint = new CodePoint(code);\n                ++index;\n                return true;\n            }\n            if (code < 0b1110_0000)\n            {\n                // 2バイト文字\n                if (index + 1 >= buffer.Length) return false;\n                code &= 0b1_1111;\n                code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n                ++index;\n                codePoint = new CodePoint(code);\n                return true;\n            }\n            if (code < 0b1111_0000)\n            {\n                // 3バイト文字\n                if (index + 2 >= buffer.Length) return false;\n                code &= 0b1111;\n                code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n                code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n                ++index;\n                codePoint = new CodePoint(code);\n                return true;\n            }\n\n            // 4バイト文字\n            if (index + 3 >= buffer.Length) return false;\n            code &= 0b0111;\n            code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n            code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n            code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n            ++index;\n            codePoint = new CodePoint(code);\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/ArrayImplementation/Utf8/Index.cs",
    "content": "﻿namespace UtfString.ArrayImplementation.Utf8\n{\n    public struct Index\n    {\n        internal int index;\n        internal byte byteCount;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/ArrayImplementation/Utf8/IndexEnumerable.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace UtfString.ArrayImplementation.Utf8\n{\n    public struct IndexEnumerable : IEnumerator<Index>, IEnumerable<Index>, IIndexEnumerable<Index, IndexEnumerable>\n    {\n        private readonly byte[] _buffer;\n        private Index _i;\n\n        public IndexEnumerable(byte[] buffer)\n        {\n            _buffer = buffer;\n            _i = default(Index);\n        }\n\n        public Index Current => _i;\n        public bool MoveNext()\n        {\n            _i.index += _i.byteCount;\n            return Decoder.TryGetByteCount(_buffer, _i.index, out _i.byteCount);\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n\n        public IndexEnumerable GetEnumerator() => new IndexEnumerable(_buffer);\n        IEnumerator<Index> IEnumerable<Index>.GetEnumerator() => GetEnumerator();\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/ArrayImplementation/Utf8/String.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\n\nnamespace UtfString.ArrayImplementation.Utf8\n{\n    public struct String : IEnumerable<CodePoint>, IString<Index, StringEnumerator, IndexEnumerable, IndexEnumerable>\n    {\n        private readonly byte[] _buffer;\n\n        public String(byte[] encodedBytes) : this()\n        {\n            _buffer = encodedBytes;\n        }\n\n        public StringEnumerator GetEnumerator() => new StringEnumerator(_buffer);\n\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n        IEnumerator<CodePoint> IEnumerable<CodePoint>.GetEnumerator() => GetEnumerator();\n\n        public IndexEnumerable Indexes => new IndexEnumerable(_buffer);\n        public CodePoint this[Index index] => Decoder.Decode(_buffer, index);\n\n        public int Length => Decoder.GetByteCount(_buffer);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/ArrayImplementation/Utf8/StringEnumerator.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace UtfString.ArrayImplementation.Utf8\n{\n    public struct StringEnumerator : IEnumerator<CodePoint>\n    {\n        private readonly byte[] _buffer;\n        private int _index;\n        private CodePoint _current;\n\n        public StringEnumerator(byte[] buffer)\n        {\n            _buffer = buffer;\n            _index = 0;\n            _current = default(CodePoint);\n        }\n\n        public CodePoint Current => _current;\n        public bool MoveNext() => Decoder.TryDecode(_buffer, ref _index, out _current);\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/ArrayImplementation/readme.md",
    "content": "﻿配列を使った実装。\nUtf8の方はこれでいいけども、Utf16の方はbyte[]→ushort[]の変換が必要で、ここでアロケーションが必要。\n\n本家のUtf8StringはSpan (System.Slices)っていう型を挟んで、byteデータ列の扱いをもうちょっと賢くやってる。\n通信バッファーとかの大きなnativeデータ列の中の一部分を直接参照して、コピーなしで文字列操作できるようにしてたりする。\n\nそこまでやると本題とそれるので、説明用として、一番単純な配列で実装したのがこのフォルダー以下の実装。\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/CodePoint.cs",
    "content": "﻿using System;\n\nnamespace UtfString\n{\n    public struct CodePoint : IEquatable<CodePoint>\n    {\n        public CodePoint(uint value)\n        {\n            Value = value;\n        }\n\n        public uint Value { get; }\n\n        public override string ToString() => Value.ToString(\"X\");\n        public override bool Equals(object obj) => obj is CodePoint x && Value == x.Value;\n        public override int GetHashCode() => Value.GetHashCode();\n        public bool Equals(CodePoint other) => Value == other.Value;\n        public static bool operator ==(CodePoint x, CodePoint y) => x.Value == y.Value;\n        public static bool operator !=(CodePoint x, CodePoint y) => x.Value != y.Value;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Constants.cs",
    "content": "﻿namespace UtfString\n{\n    internal static class Constants\n    {\n        internal const byte InvalidCount = 0xff;\n        internal static readonly CodePoint EoS = new CodePoint(0xffff_ffff);\n        internal static readonly (CodePoint cp, byte count) End = (EoS, InvalidCount);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/DebugInterfaces.cs",
    "content": "﻿// インターフェイス越しでもヒープ確保なしでアクセスするためにはこのくらい型引数を並べないと無理\n// 使う側も IString<A, B, C, D> みたいな冗長な書き方が必要になるんで、実用性はあんまりなさげ。\n// テスト用。\n\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\n\n[assembly: InternalsVisibleTo(\"UnitTestUtfString\")]\n\nnamespace UtfString\n{\n    internal interface ICodePointEnumerable<TEnumerator>\n        where TEnumerator : struct, IEnumerator<CodePoint>\n    {\n        TEnumerator GetEnumerator();\n    }\n\n    internal interface IIndexEnumerable<TIndex, TEnumerator>\n        where TIndex : struct\n        where TEnumerator : struct, IEnumerator<TIndex>\n    {\n        TEnumerator GetEnumerator();\n    }\n\n    internal interface IString<TIndex, TEnumerator, TIndexEnumerable, TIndexEnumerator> : ICodePointEnumerable<TEnumerator>\n        where TIndex : struct\n        where TEnumerator : struct, IEnumerator<CodePoint>\n        where TIndexEnumerator : struct, IEnumerator<TIndex>\n        where TIndexEnumerable : struct, IIndexEnumerable<TIndex, TIndexEnumerator>\n    {\n        CodePoint this[TIndex index] { get; }\n        int Length { get; }\n        TIndexEnumerable Indexes { get; }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/DualEncoding/ArrayAccessor.cs",
    "content": "﻿namespace UtfString.DualEncoding\n{\n    /// <summary>\n    /// byte 配列から、\n    /// 2バイトずつ ushort として読みだすか、\n    /// 1バイトずつ byte として読みだすかを切り替えるラッパー型。\n    /// </summary>\n    public struct ArrayAccessor\n    {\n        private bool _isWideChar;\n        private readonly byte[] _data;\n\n        public ArrayAccessor(bool isWideChar, byte[] data)\n        {\n            _isWideChar = isWideChar;\n            _data = data;\n        }\n\n        public unsafe ushort this[int index]\n        {\n            get\n            {\n                if (_isWideChar)\n                {\n                    fixed (byte* pb = _data)\n                    {\n                        ushort* p = (ushort*)pb;\n                        return p[index];\n                    }\n                }\n                else return _data[index];\n            }\n        }\n\n        public int Length => _isWideChar ? _data.Length / 2 : _data.Length;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/DualEncoding/Decoder.cs",
    "content": "﻿namespace UtfString.DualEncoding\n{\n    public static class Decoder\n    {\n        public static int GetLength(ArrayAccessor buffer)\n        {\n            var count = 0;\n            for (int i = 0; i < buffer.Length; i++)\n            {\n                var x = buffer[i];\n                if ((x & 0b1111_1100_0000_0000) != 0b1101_1100_0000_0000)\n                    count++;\n            }\n            return count;\n        }\n\n        public static byte TyrGetCount(ArrayAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.InvalidCount;\n            uint x = buffer[index];\n            if ((x & 0b1111_1100_0000_0000) == 0b1101_1000_0000_0000)\n            {\n                if (index + 1 >= buffer.Length) return Constants.InvalidCount;\n                return 2;\n            }\n            else\n                return 1;\n        }\n\n        public static CodePoint Decode(ArrayAccessor buffer, Index index)\n        {\n            var i = index.index;\n            uint x = buffer[i];\n\n            if (index.count == 2)\n            {\n                uint y = buffer[i + 1];\n\n                var code = (x & 0b0011_1111_1111) + 0b0100_0000;\n                code = (code << 10) | (y & 0b0011_1111_1111);\n                return new CodePoint(code);\n            }\n            else\n            {\n                return new CodePoint(x);\n            }\n        }\n\n        public static (CodePoint cp, byte count) TryDecode(ArrayAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.End;\n\n            uint x = buffer[index++];\n\n            if ((x & 0b1111_1100_0000_0000) == 0b1101_1000_0000_0000)\n            {\n                var code = (x & 0b0011_1111_1111) + 0b0100_0000;\n                if (index >= buffer.Length) return Constants.End;\n                x = buffer[index++];\n                if ((x & 0b1111_1100_0000_0000) != 0b1101_1100_0000_0000) return Constants.End;\n                code = (code << 10) | (x & 0b0011_1111_1111);\n\n                return (new CodePoint(code), 2);\n            }\n            else\n            {\n                return (new CodePoint(x), 1);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/DualEncoding/String.cs",
    "content": "﻿// どの String 実装でもほぼ共通のコード。\n// 基本的にファイル コピー。変更点は以下の2つだけ\n// - 名前空間\n// - コンストラクター引数と、ArrayAccessor を作る部分\n//\n// インターフェイスを切れば1個の実装で済むけども、以下の理由でファイル コピーにしてる。\n// - パフォーマンス最優先で、static メソッドを直参照\n//   - ヒープ確保しないように\n// - 違うエンコーディングの Index を渡せてしまうと動作保証外なので、別の型にしたい\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace UtfString.DualEncoding\n{\n    public struct String : IEnumerable<CodePoint>, IString<Index, StringEnumerator, IndexEnumerable, IndexEnumerable>\n    {\n        private readonly ArrayAccessor _buffer;\n\n        public String(bool isWideChar, byte[] encodedBytes)\n        {\n            _buffer = new ArrayAccessor(isWideChar, encodedBytes);\n        }\n\n        public StringEnumerator GetEnumerator() => new StringEnumerator(_buffer);\n\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n        IEnumerator<CodePoint> IEnumerable<CodePoint>.GetEnumerator() => GetEnumerator();\n\n        public IndexEnumerable Indexes => new IndexEnumerable(_buffer);\n        public CodePoint this[Index index] => Decoder.Decode(_buffer, index);\n\n        public int Length => Decoder.GetLength(_buffer);\n    }\n\n    public struct Index\n    {\n        internal int index;\n        internal byte count;\n    }\n\n    public struct StringEnumerator : IEnumerator<CodePoint>\n    {\n        private readonly ArrayAccessor _buffer;\n        private Index _index;\n\n        public StringEnumerator(ArrayAccessor buffer)\n        {\n            _buffer = buffer;\n            _index = default(Index);\n            Current = default(CodePoint);\n        }\n\n        public CodePoint Current { get; private set; }\n\n        public bool MoveNext()\n        {\n            _index.index += _index.count;\n            var next = Decoder.TryDecode(_buffer, _index.index);\n            if (next.count == Constants.InvalidCount) return false;\n            _index.count = next.count;\n            Current = next.cp;\n            return true;\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n    }\n\n    public struct IndexEnumerable : IEnumerator<Index>, IEnumerable<Index>, IIndexEnumerable<Index, IndexEnumerable>\n    {\n        private readonly ArrayAccessor _buffer;\n        private Index _i;\n\n        public IndexEnumerable(ArrayAccessor buffer)\n        {\n            _buffer = buffer;\n            _i = default(Index);\n        }\n\n        public Index Current => _i;\n        public bool MoveNext()\n        {\n            _i.index += _i.count;\n            _i.count = Decoder.TyrGetCount(_buffer, _i.index);\n            return _i.count != Constants.InvalidCount;\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n\n        public IndexEnumerable GetEnumerator() => new IndexEnumerable(_buffer);\n        IEnumerator<Index> IEnumerable<Index>.GetEnumerator() => GetEnumerator();\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Generic/ArrayAccessor.cs",
    "content": "﻿namespace UtfString.Generic\n{\n    public interface IArrayAccessor<TChar>\n        where TChar : struct\n    {\n        TChar this[int index] { get; }\n        int Length { get; }\n    }\n\n    public struct ByteAccessor : IArrayAccessor<byte>\n    {\n        private readonly byte[] _data;\n        public ByteAccessor(byte[] data) { _data = data; }\n        public byte this[int index] => _data[index];\n        public int Length => _data.Length;\n\n        public static implicit operator ByteAccessor(byte[] data) => new ByteAccessor(data);\n    }\n\n    public struct ShortAccessor : IArrayAccessor<ushort>\n    {\n        private readonly byte[] _data;\n\n        public ShortAccessor(byte[] data) { _data = data; }\n\n        public unsafe ushort this[int index]\n        {\n            get\n            {\n                fixed (byte* pb = _data)\n                {\n                    ushort* p = (ushort*)pb;\n                    return p[index];\n                }\n            }\n        }\n\n        public int Length => _data.Length / 2;\n\n        public static implicit operator ShortAccessor(byte[] data) => new ShortAccessor(data);\n    }\n\n    public struct IntAccessor : IArrayAccessor<uint>\n    {\n        private readonly byte[] _data;\n\n        public IntAccessor(byte[] data) { _data = data; }\n\n        public unsafe uint this[int index]\n        {\n            get\n            {\n                fixed (byte* pb = _data)\n                {\n                    uint* p = (uint*)pb;\n                    return p[index];\n                }\n            }\n        }\n\n        public int Length => _data.Length / 4;\n\n        public static implicit operator IntAccessor(byte[] data) => new IntAccessor(data);\n    }\n\n    public struct DualAccessor : IArrayAccessor<ushort>\n    {\n        private bool _isWideChar;\n        private readonly byte[] _data;\n\n        public DualAccessor(bool isWideChar, byte[] data)\n        {\n            _isWideChar = isWideChar;\n            _data = data;\n        }\n\n        public unsafe ushort this[int index]\n        {\n            get\n            {\n                if (_isWideChar)\n                {\n                    fixed (byte* pb = _data)\n                    {\n                        ushort* p = (ushort*)pb;\n                        return p[index];\n                    }\n                }\n                else return _data[index];\n            }\n        }\n\n        public int Length => _isWideChar ? _data.Length / 2 : _data.Length;\n\n        public static implicit operator DualAccessor((bool isWideChar, byte[] data) x) => new DualAccessor(x.isWideChar, x.data);\n        public static implicit operator DualAccessor(byte[] data) => new DualAccessor(true, data);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Generic/Decoder.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace UtfString.Generic\n{\n    public interface IDecoder<TChar, ArrayAccessor>\n        where TChar : struct\n        where ArrayAccessor : struct, IArrayAccessor<TChar>\n    {\n        int GetLength(ArrayAccessor buffer);\n        byte TyrGetCount(ArrayAccessor buffer, int index);\n        CodePoint Decode(ArrayAccessor buffer, Index index);\n        (CodePoint cp, byte count) TryDecode(ArrayAccessor buffer, int index);\n    }\n\n    public struct Utf32Decoder : IDecoder<uint, IntAccessor>\n    {\n        public int GetLength(IntAccessor buffer) => buffer.Length;\n        public byte TyrGetCount(IntAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.InvalidCount;\n            return 1;\n        }\n\n        public CodePoint Decode(IntAccessor buffer, Index index) => new CodePoint(buffer[index.index]);\n\n        public (CodePoint cp, byte count) TryDecode(IntAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.End;\n            return (new CodePoint(buffer[index]), 1);\n        }\n    }\n\n    public struct Utf16Decoder<ArrayAccessor> : IDecoder<ushort, ArrayAccessor>\n        where ArrayAccessor : struct, IArrayAccessor<ushort>\n    {\n        public int GetLength(ArrayAccessor buffer)\n        {\n            var count = 0;\n            for (int i = 0; i < buffer.Length; i++)\n            {\n                var x = buffer[i];\n                if ((x & 0b1111_1100_0000_0000) != 0b1101_1100_0000_0000)\n                    count++;\n            }\n            return count;\n        }\n\n        public byte TyrGetCount(ArrayAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.InvalidCount;\n            uint x = buffer[index];\n            if ((x & 0b1111_1100_0000_0000) == 0b1101_1000_0000_0000)\n            {\n                if (index + 1 >= buffer.Length) return Constants.InvalidCount;\n                return 2;\n            }\n            else\n                return 1;\n        }\n\n        public CodePoint Decode(ArrayAccessor buffer, Index index)\n        {\n            var i = index.index;\n            uint x = buffer[i];\n\n            if (index.count == 2)\n            {\n                uint y = buffer[i + 1];\n\n                var code = (x & 0b0011_1111_1111) + 0b0100_0000;\n                code = (code << 10) | (y & 0b0011_1111_1111);\n                return new CodePoint(code);\n            }\n            else\n            {\n                return new CodePoint(x);\n            }\n        }\n\n        public (CodePoint cp, byte count) TryDecode(ArrayAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.End;\n\n            uint x = buffer[index++];\n\n            if ((x & 0b1111_1100_0000_0000) == 0b1101_1000_0000_0000)\n            {\n                var code = (x & 0b0011_1111_1111) + 0b0100_0000;\n                if (index >= buffer.Length) return Constants.End;\n                x = buffer[index++];\n                if ((x & 0b1111_1100_0000_0000) != 0b1101_1100_0000_0000) return Constants.End;\n                code = (code << 10) | (x & 0b0011_1111_1111);\n\n                return (new CodePoint(code), 2);\n            }\n            else\n            {\n                return (new CodePoint(x), 1);\n            }\n        }\n    }\n\n    public struct Utf8Decoder : IDecoder<byte, ByteAccessor>\n    {\n        public int GetLength(ByteAccessor buffer)\n        {\n            var count = 0;\n            for (int i = 0; i < buffer.Length; i++)\n            {\n                var x = buffer[i];\n                if ((x & 0b1100_0000) != 0b1000_0000)\n                    count++;\n            }\n            return count;\n        }\n\n        public byte TyrGetCount(ByteAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.InvalidCount;\n\n            uint x = buffer[index];\n\n            var byteCount =\n                (x >= 0b1111_0000U) ? (byte)4 :\n                (x >= 0b1110_0000U) ? (byte)3 :\n                (x >= 0b1100_0000U) ? (byte)2 :\n                (byte)1;\n\n            if (index + byteCount > buffer.Length) return Constants.InvalidCount;\n\n            return byteCount;\n        }\n\n        public CodePoint Decode(ByteAccessor buffer, Index index)\n        {\n            var i = index.index;\n            uint x = buffer[i++];\n            uint code = 0;\n            switch (index.count)\n            {\n                case 1:\n                    return new CodePoint(x);\n                case 2:\n                    code = x & 0b1_1111;\n                    code = (code << 6) | (uint)(buffer[i++] & 0b0011_1111);\n                    return new CodePoint(code);\n                case 3:\n                    code = x & 0b1111;\n                    code = (code << 6) | (uint)(buffer[i++] & 0b0011_1111);\n                    code = (code << 6) | (uint)(buffer[i++] & 0b0011_1111);\n                    return new CodePoint(code);\n                case 4:\n                    code = x & 0b0111;\n                    code = (code << 6) | (uint)(buffer[i++] & 0b0011_1111);\n                    code = (code << 6) | (uint)(buffer[i++] & 0b0011_1111);\n                    code = (code << 6) | (uint)(buffer[i++] & 0b0011_1111);\n                    return new CodePoint(code);\n                default:\n                    throw new IndexOutOfRangeException();\n            }\n        }\n\n        public (CodePoint cp, byte count) TryDecode(ByteAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.End;\n\n            uint code = buffer[index++];\n\n            if (code >= 0b1111_0000)\n            {\n                // 4バイト文字\n                code &= 0b0111;\n                if (!TryNext(buffer, ref index, ref code)) return Constants.End;\n                if (!TryNext(buffer, ref index, ref code)) return Constants.End;\n                if (!TryNext(buffer, ref index, ref code)) return Constants.End;\n                return (new CodePoint(code), 4);\n            }\n            if (code >= 0b1110_0000)\n            {\n                // 3バイト文字\n                code &= 0b1111;\n                if (!TryNext(buffer, ref index, ref code)) return Constants.End;\n                if (!TryNext(buffer, ref index, ref code)) return Constants.End;\n                return (new CodePoint(code), 3);\n            }\n            if (code >= 0b1100_0000)\n            {\n                // 2バイト文字\n                code &= 0b1_1111;\n                if (!TryNext(buffer, ref index, ref code)) return Constants.End;\n                return (new CodePoint(code), 2);\n            }\n\n            // ASCII 文字\n            return (new CodePoint(code), 1);\n        }\n\n        private bool TryNext(ByteAccessor buffer, ref int index, ref uint code)\n        {\n            if (index >= buffer.Length) return false;\n\n            var c = buffer[index++];\n            if ((c & 0b1100_0000) != 0b1000_0000) return false;\n\n            code = (code << 6) | (uint)(c & 0b0011_1111);\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Generic/String.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace UtfString.Generic\n{\n    public struct String<TChar, TArrayAccessor, TDecoder> : IEnumerable<CodePoint>, IString<Index, StringEnumerator<TChar, TArrayAccessor, TDecoder>, IndexEnumerable<TChar, TArrayAccessor, TDecoder>, IndexEnumerable<TChar, TArrayAccessor, TDecoder>>\n        where TChar : struct\n        where TArrayAccessor : struct, IArrayAccessor<TChar>\n        where TDecoder : struct, IDecoder<TChar, TArrayAccessor>\n    {\n        private readonly TArrayAccessor _buffer;\n\n        public String(TArrayAccessor array)\n        {\n            _buffer = array;\n        }\n\n        public StringEnumerator<TChar, TArrayAccessor, TDecoder> GetEnumerator() => new StringEnumerator<TChar, TArrayAccessor, TDecoder>(_buffer);\n\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n        IEnumerator<CodePoint> IEnumerable<CodePoint>.GetEnumerator() => GetEnumerator();\n\n        public IndexEnumerable<TChar, TArrayAccessor, TDecoder> Indexes => new IndexEnumerable<TChar, TArrayAccessor, TDecoder>(_buffer);\n        public CodePoint this[Index index] => default(TDecoder).Decode(_buffer, index);\n\n        public int Length => default(TDecoder).GetLength(_buffer);\n    }\n\n    public struct Index\n    {\n        internal int index;\n        internal byte count;\n    }\n\n    public struct StringEnumerator<TChar, TArrayAccessor, TDecoder> : IEnumerator<CodePoint>\n        where TChar : struct\n        where TArrayAccessor : struct, IArrayAccessor<TChar>\n        where TDecoder : struct, IDecoder<TChar, TArrayAccessor>\n    {\n        private readonly TArrayAccessor _buffer;\n        private Index _index;\n\n        public StringEnumerator(TArrayAccessor buffer)\n        {\n            _buffer = buffer;\n            _index = default(Index);\n            Current = default(CodePoint);\n        }\n\n        public CodePoint Current { get; private set; }\n\n        public bool MoveNext()\n        {\n            _index.index += _index.count;\n            var next = default(TDecoder).TryDecode(_buffer, _index.index);\n            if (next.count == Constants.InvalidCount) return false;\n            _index.count = next.count;\n            Current = next.cp;\n            return true;\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n    }\n\n    public struct IndexEnumerable<TChar, TArrayAccessor, TDecoder> : IEnumerator<Index>, IEnumerable<Index>, IIndexEnumerable<Index, IndexEnumerable<TChar, TArrayAccessor, TDecoder>>\n        where TChar : struct\n        where TArrayAccessor : struct, IArrayAccessor<TChar>\n        where TDecoder : struct, IDecoder<TChar, TArrayAccessor>\n    {\n        private readonly TArrayAccessor _buffer;\n        private Index _i;\n\n        public IndexEnumerable(TArrayAccessor buffer)\n        {\n            _buffer = buffer;\n            _i = default(Index);\n        }\n\n        public Index Current => _i;\n        public bool MoveNext()\n        {\n            _i.index += _i.count;\n            _i.count = default(TDecoder).TyrGetCount(_buffer, _i.index);\n            return _i.count != Constants.InvalidCount;\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n\n        public IndexEnumerable<TChar, TArrayAccessor, TDecoder> GetEnumerator() => new IndexEnumerable<TChar, TArrayAccessor, TDecoder>(_buffer);\n        IEnumerator<Index> IEnumerable<Index>.GetEnumerator() => GetEnumerator();\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Generic/readme.md",
    "content": "﻿何とかジェネリックな実装でもヒープ確保なしで動かせないかと苦心した結果。\n\n使う側が、\n\n```cs\nusing Utf8String = UtfString.Generic.String<byte, UtfString.Generic.ByteAccessor, UtfString.Generic.Utf8Decoder>;\nusing Utf16String = UtfString.Generic.String<ushort, UtfString.Generic.ShortAccessor, UtfString.Generic.Utf16Decoder<UtfString.Generic.ShortAccessor>>;\n```\n\nみたいになるので結構微妙。\nあと、単体テストプロジェクトがコンパイル エラー起こすようになってテストできてない。\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Slices/Decoder.cs",
    "content": "﻿namespace UtfString.Slices\n{\n    public static class Decoder\n    {\n        public static int GetByteCount(ReadOnlySpan buffer)\n        {\n            var count = 0;\n            foreach (var x in buffer)\n                if ((x & 0b1100_0000) != 0b1000_0000)\n                    count++;\n            return count;\n        }\n\n        public static bool TryDecode(ReadOnlySpan buffer, ref int index, out CodePoint codePoint)\n        {\n            codePoint = default(CodePoint);\n\n            if (index >= buffer.Length) return false;\n\n            uint code = buffer[index];\n\n            if (code < 0b1100_0000)\n            {\n                // ASCII 文字\n                codePoint = new CodePoint(code);\n                ++index;\n                return true;\n            }\n            if (code < 0b1110_0000)\n            {\n                // 2バイト文字\n                if (index + 1 >= buffer.Length) return false;\n                code &= 0b1_1111;\n                code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n                ++index;\n                codePoint = new CodePoint(code);\n                return true;\n            }\n            if (code < 0b1111_0000)\n            {\n                // 3バイト文字\n                if (index + 2 >= buffer.Length) return false;\n                code &= 0b1111;\n                code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n                code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n                ++index;\n                codePoint = new CodePoint(code);\n                return true;\n            }\n\n            // 4バイト文字\n            if (index + 3 >= buffer.Length) return false;\n            code &= 0b0111;\n            code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n            code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n            code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n            ++index;\n            codePoint = new CodePoint(code);\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Slices/ReadOnlySpan.cs",
    "content": "﻿namespace UtfString.Slices\n{\n    /// <summary>\n    /// https://github.com/dotnet/corefxlab/blob/master/src/System.Slices/System/Span.cs もどき。\n    /// 簡単化のために byte[] 限定に変更。\n    /// </summary>\n    public struct ReadOnlySpan\n    {\n        private byte[] _array;\n        private int _index;\n        private int _length;\n\n        public ReadOnlySpan(byte[] array) : this(array, 0, array.Length) { }\n        public ReadOnlySpan(byte[] array, int index) : this(array, index, array.Length - index) { }\n        public ReadOnlySpan(byte[] array, int index, int length)\n        {\n            _array = array;\n            _index = index;\n            _length = length;\n        }\n\n        public static implicit operator ReadOnlySpan(byte[] array) => new ReadOnlySpan(array);\n\n        public byte this[int index] => _array[_index + index];\n        public int Length => _length;\n\n        public ReadOnlySpan Slice(int index) => new ReadOnlySpan(_array, _index + index, _length - index);\n        public ReadOnlySpan Slice(int index, int length) => new ReadOnlySpan(_array, _index + index, length);\n\n        public struct Enumerator\n        {\n            private byte[] _array;\n            private int _index;\n            private int _end;\n\n            public Enumerator(ReadOnlySpan span)\n            {\n                _array = span._array;\n                _index = span._index - 1;\n                _end = span._index + span._length;\n            }\n\n            public bool MoveNext()\n            {\n                _index++;\n                return _index < _end;\n            }\n\n            public byte Current => _array[_index];\n        }\n\n        public Enumerator GetEnumerator() => new Enumerator(this);\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Slices/Utf8String.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace UtfString.Slices\n{\n    public struct Utf8String\n    {\n        private readonly ReadOnlySpan _buffer;\n\n        public Utf8String(ReadOnlySpan buffer)\n        {\n            _buffer = buffer;\n        }\n\n        public int Length => Decoder.GetByteCount(_buffer);\n\n        // この index/length は byte 配列のインデックスなので注意。文字数ベースじゃない。\n        public Utf8String Substring(int index) => new Utf8String(_buffer.Slice(index));\n        public Utf8String Substring(int index, int length) => new Utf8String(_buffer.Slice(index, length));\n\n        public CodePointEnumerable CodePoints => new CodePointEnumerable(_buffer);\n\n        public struct CodePointEnumerable : IEnumerable<CodePoint>\n        {\n            private readonly ReadOnlySpan _buffer;\n            public CodePointEnumerable(ReadOnlySpan buffer) { _buffer = buffer; }\n            public CodePointEnumerator GetEnumerator() => new CodePointEnumerator(_buffer);\n\n            IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n            IEnumerator<CodePoint> IEnumerable<CodePoint>.GetEnumerator() => GetEnumerator();\n        }\n\n        public struct CodePointEnumerator : IEnumerator<CodePoint>\n        {\n            private readonly ReadOnlySpan _buffer;\n            private int _index;\n            private CodePoint _current;\n\n            public CodePointEnumerator(ReadOnlySpan buffer)\n            {\n                _buffer = buffer;\n                _index = 0;\n                _current = default(CodePoint);\n            }\n\n            public CodePoint Current => _current;\n            public bool MoveNext() => Decoder.TryDecode(_buffer, ref _index, out _current);\n\n            object IEnumerator.Current => Current;\n            void IDisposable.Dispose() { }\n            void IEnumerator.Reset() { throw new NotImplementedException(); }\n        }\n\n        public override string ToString()\n        {\n            var sb = new System.Text.StringBuilder();\n            foreach (var c in CodePoints)\n            {\n                var v = c.Value;\n                if (v < 0x10000)\n                {\n                    sb.Append((char)v);\n                }\n                else\n                {\n                    var highSurrogate = ((v - 0x010000u) >> 10) | 0xD800;\n                    var lowSurrogate = (v & 0x38) | 0xDC00;\n                    sb.Append((char)highSurrogate);\n                    sb.Append((char)lowSurrogate);\n                }\n            }\n            return sb.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Utf16/ArrayAccessor.cs",
    "content": "﻿namespace UtfString.Utf16\n{\n    public struct ArrayAccessor\n    {\n        private readonly byte[] _data;\n\n        public ArrayAccessor(byte[] data) { _data = data; }\n\n        public unsafe ushort this[int index]\n        {\n            get\n            {\n                fixed (byte* pb = _data)\n                {\n                    ushort* p = (ushort*)pb;\n                    return p[index];\n                }\n            }\n        }\n\n        public int Length => _data.Length / 2;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Utf16/Decoder.cs",
    "content": "﻿namespace UtfString.Utf16\n{\n    public static class Decoder\n    {\n        public static int GetLength(ArrayAccessor buffer)\n        {\n            var count = 0;\n            for (int i = 0; i < buffer.Length; i++)\n            {\n                var x = buffer[i];\n                if ((x & 0b1111_1100_0000_0000) != 0b1101_1100_0000_0000)\n                    count++;\n            }\n            return count;\n        }\n\n        public static byte TyrGetCount(ArrayAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.InvalidCount;\n            uint x = buffer[index];\n            var count = (x & 0b1111_1100_0000_0000) == 0b1101_1000_0000_0000 ? (byte)2 : (byte)1;\n            if (index + count > buffer.Length) return Constants.InvalidCount;\n            return count;\n        }\n\n        public static CodePoint Decode(ArrayAccessor buffer, Index index)\n        {\n            var i = index.index;\n            uint x = buffer[i];\n\n            if (index.count == 2)\n            {\n                var code = (x & 0b0011_1111_1111) + 0b0100_0000;\n                code = (code << 10) | ((uint)buffer[i + 1] & 0b0011_1111_1111);\n                return new CodePoint(code);\n            }\n            else\n            {\n                return new CodePoint(x);\n            }\n        }\n\n        public static (CodePoint cp, byte count) TryDecode(ArrayAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.End;\n\n            uint x = buffer[index++];\n\n            if ((x & 0b1111_1100_0000_0000) == 0b1101_1000_0000_0000)\n            {\n                var code = (x & 0b0011_1111_1111) + 0b0100_0000;\n                if (index >= buffer.Length) return Constants.End;\n                x = buffer[index++];\n                if ((x & 0b1111_1100_0000_0000) != 0b1101_1100_0000_0000) return Constants.End;\n                code = (code << 10) | (x & 0b0011_1111_1111);\n\n                return (new CodePoint(code), 2);\n            }\n            else\n            {\n                return (new CodePoint(x), 1);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Utf16/String.cs",
    "content": "﻿// どの String 実装でもほぼ共通のコード。\n// 基本的にファイル コピー。変更点は以下の2つだけ\n// - 名前空間\n// - コンストラクター引数と、ArrayAccessor を作る部分\n//\n// インターフェイスを切れば1個の実装で済むけども、以下の理由でファイル コピーにしてる。\n// - パフォーマンス最優先で、static メソッドを直参照\n//   - ヒープ確保しないように\n// - 違うエンコーディングの Index を渡せてしまうと動作保証外なので、別の型にしたい\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace UtfString.Utf16\n{\n    public struct String : IEnumerable<CodePoint>, IString<Index, StringEnumerator, IndexEnumerable, IndexEnumerable>\n    {\n        private readonly ArrayAccessor _buffer;\n\n        public String(byte[] encodedBytes)\n        {\n            _buffer = new ArrayAccessor(encodedBytes);\n        }\n\n        public StringEnumerator GetEnumerator() => new StringEnumerator(_buffer);\n\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n        IEnumerator<CodePoint> IEnumerable<CodePoint>.GetEnumerator() => GetEnumerator();\n\n        public IndexEnumerable Indexes => new IndexEnumerable(_buffer);\n        public CodePoint this[Index index] => Decoder.Decode(_buffer, index);\n\n        public int Length => Decoder.GetLength(_buffer);\n    }\n\n    public struct Index\n    {\n        internal int index;\n        internal byte count;\n    }\n\n    public struct StringEnumerator : IEnumerator<CodePoint>\n    {\n        private readonly ArrayAccessor _buffer;\n        private Index _index;\n\n        public StringEnumerator(ArrayAccessor buffer)\n        {\n            _buffer = buffer;\n            _index = default(Index);\n            Current = default(CodePoint);\n        }\n\n        public CodePoint Current { get; private set; }\n\n        public bool MoveNext()\n        {\n            _index.index += _index.count;\n            var next = Decoder.TryDecode(_buffer, _index.index);\n            if (next.count == Constants.InvalidCount) return false;\n            _index.count = next.count;\n            Current = next.cp;\n            return true;\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n    }\n\n    public struct IndexEnumerable : IEnumerator<Index>, IEnumerable<Index>, IIndexEnumerable<Index, IndexEnumerable>\n    {\n        private readonly ArrayAccessor _buffer;\n        private Index _i;\n\n        public IndexEnumerable(ArrayAccessor buffer)\n        {\n            _buffer = buffer;\n            _i = default(Index);\n        }\n\n        public Index Current => _i;\n        public bool MoveNext()\n        {\n            _i.index += _i.count;\n            _i.count = Decoder.TyrGetCount(_buffer, _i.index);\n            return _i.count != Constants.InvalidCount;\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n\n        public IndexEnumerable GetEnumerator() => new IndexEnumerable(_buffer);\n        IEnumerator<Index> IEnumerable<Index>.GetEnumerator() => GetEnumerator();\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Utf32/ArrayAccessor.cs",
    "content": "﻿namespace UtfString.Utf32\n{\n    public struct ArrayAccessor\n    {\n        private readonly byte[] _data;\n\n        public ArrayAccessor(byte[] data) { _data = data; }\n\n        public unsafe uint this[int index]\n        {\n            get\n            {\n                fixed (byte* pb = _data)\n                {\n                    uint* p = (uint*)pb;\n                    return p[index];\n                }\n            }\n        }\n\n        public int Length => _data.Length / 4;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Utf32/Decoder.cs",
    "content": "﻿namespace UtfString.Utf32\n{\n    public static class Decoder\n    {\n        public static int GetLength(ArrayAccessor buffer) => buffer.Length;\n        public static byte TyrGetCount(ArrayAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.InvalidCount;\n            return 1;\n        }\n\n        public static CodePoint Decode(ArrayAccessor buffer, Index index) => new CodePoint(buffer[index.index]);\n\n        public static (CodePoint cp, byte count) TryDecode(ArrayAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.End;\n            return (new CodePoint(buffer[index]), 1);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Utf32/String.cs",
    "content": "﻿// どの String 実装でもほぼ共通のコード。\n// 基本的にファイル コピー。変更点は以下の2つだけ\n// - 名前空間\n// - コンストラクター引数と、ArrayAccessor を作る部分\n//\n// インターフェイスを切れば1個の実装で済むけども、以下の理由でファイル コピーにしてる。\n// - パフォーマンス最優先で、static メソッドを直参照\n//   - ヒープ確保しないように\n// - 違うエンコーディングの Index を渡せてしまうと動作保証外なので、別の型にしたい\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace UtfString.Utf32\n{\n    public struct String : IEnumerable<CodePoint>, IString<Index, StringEnumerator, IndexEnumerable, IndexEnumerable>\n    {\n        private readonly ArrayAccessor _buffer;\n\n        public String(byte[] encodedBytes)\n        {\n            _buffer = new ArrayAccessor(encodedBytes);\n        }\n\n        public StringEnumerator GetEnumerator() => new StringEnumerator(_buffer);\n\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n        IEnumerator<CodePoint> IEnumerable<CodePoint>.GetEnumerator() => GetEnumerator();\n\n        public IndexEnumerable Indexes => new IndexEnumerable(_buffer);\n        public CodePoint this[Index index] => Decoder.Decode(_buffer, index);\n\n        public int Length => Decoder.GetLength(_buffer);\n    }\n\n    public struct Index\n    {\n        internal int index;\n        internal byte count;\n    }\n\n    public struct StringEnumerator : IEnumerator<CodePoint>\n    {\n        private readonly ArrayAccessor _buffer;\n        private Index _index;\n\n        public StringEnumerator(ArrayAccessor buffer)\n        {\n            _buffer = buffer;\n            _index = default(Index);\n            Current = default(CodePoint);\n        }\n\n        public CodePoint Current { get; private set; }\n\n        public bool MoveNext()\n        {\n            _index.index += _index.count;\n            var next = Decoder.TryDecode(_buffer, _index.index);\n            if (next.count == Constants.InvalidCount) return false;\n            _index.count = next.count;\n            Current = next.cp;\n            return true;\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n    }\n\n    public struct IndexEnumerable : IEnumerator<Index>, IEnumerable<Index>, IIndexEnumerable<Index, IndexEnumerable>\n    {\n        private readonly ArrayAccessor _buffer;\n        private Index _i;\n\n        public IndexEnumerable(ArrayAccessor buffer)\n        {\n            _buffer = buffer;\n            _i = default(Index);\n        }\n\n        public Index Current => _i;\n        public bool MoveNext()\n        {\n            _i.index += _i.count;\n            _i.count = Decoder.TyrGetCount(_buffer, _i.index);\n            return _i.count != Constants.InvalidCount;\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n\n        public IndexEnumerable GetEnumerator() => new IndexEnumerable(_buffer);\n        IEnumerator<Index> IEnumerable<Index>.GetEnumerator() => GetEnumerator();\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Utf8/ArrayAccessor.cs",
    "content": "﻿namespace UtfString.Utf8\n{\n    public struct ArrayAccessor\n    {\n        private readonly byte[] _data;\n\n        public ArrayAccessor(byte[] data) { _data = data; }\n\n        public byte this[int index] => _data[index];\n\n        public int Length => _data.Length;\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Utf8/Decoder.cs",
    "content": "﻿using System;\n\nnamespace UtfString.Utf8\n{\n    public static class Decoder\n    {\n        public static int GetLength(ArrayAccessor buffer)\n        {\n            var count = 0;\n            for (int i = 0; i < buffer.Length; i++)\n            {\n                var x = buffer[i];\n                if ((x & 0b1100_0000) != 0b1000_0000)\n                    count++;\n            }\n            return count;\n        }\n\n        public static byte TyrGetCount(ArrayAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.InvalidCount;\n\n            uint x = buffer[index];\n\n            var byteCount =\n                (x < 0b1100_0000U) ? (byte)1 :\n                (x < 0b1110_0000U) ? (byte)2 :\n                (x < 0b1111_0000U) ? (byte)3 :\n                (byte)4;\n\n            if (index + byteCount > buffer.Length) return Constants.InvalidCount;\n\n            return byteCount;\n        }\n\n        public static CodePoint Decode(ArrayAccessor buffer, Index index)\n        {\n            var i = index.index;\n            uint x = buffer[i++];\n            uint code = 0;\n            switch (index.count)\n            {\n                case 1:\n                    return new CodePoint(x);\n                case 2:\n                    code = x & 0b1_1111;\n                    code = (code << 6) | (uint)(buffer[i++] & 0b0011_1111);\n                    return new CodePoint(code);\n                case 3:\n                    code = x & 0b1111;\n                    code = (code << 6) | (uint)(buffer[i++] & 0b0011_1111);\n                    code = (code << 6) | (uint)(buffer[i++] & 0b0011_1111);\n                    return new CodePoint(code);\n                case 4:\n                    code = x & 0b0111;\n                    code = (code << 6) | (uint)(buffer[i++] & 0b0011_1111);\n                    code = (code << 6) | (uint)(buffer[i++] & 0b0011_1111);\n                    code = (code << 6) | (uint)(buffer[i++] & 0b0011_1111);\n                    return new CodePoint(code);\n                default:\n                    throw new IndexOutOfRangeException();\n            }\n        }\n\n        public static (CodePoint cp, byte count) TryDecode(ArrayAccessor buffer, int index)\n        {\n            if (index >= buffer.Length) return Constants.End;\n\n            uint code = buffer[index];\n\n            if (code < 0b1100_0000)\n            {\n                // ASCII 文字\n                return (new CodePoint(code), 1);\n            }\n            if (code < 0b1110_0000)\n            {\n                // 2バイト文字\n                if (index + 1 >= buffer.Length) return Constants.End;\n                code &= 0b1_1111;\n                code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n                return (new CodePoint(code), 2);\n            }\n            if (code < 0b1111_0000)\n            {\n                // 3バイト文字\n                if (index + 2 >= buffer.Length) return Constants.End;\n                code &= 0b1111;\n                code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n                code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n                return (new CodePoint(code), 3);\n            }\n\n            // 4バイト文字\n            if (index + 3 >= buffer.Length) return Constants.End;\n            code &= 0b0111;\n            code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n            code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n            code = (code << 6) | (uint)(buffer[++index] & 0b0011_1111);\n            return (new CodePoint(code), 4);\n        }\n\n        private static bool TryNext(ArrayAccessor buffer, ref int index, ref uint code)\n        {\n            if (index >= buffer.Length) return false;\n\n            var c = buffer[index++];\n            if ((c & 0b1100_0000) != 0b1000_0000) return false;\n\n            code = (code << 6) | (uint)(c & 0b0011_1111);\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/Utf8/String.cs",
    "content": "﻿// どの String 実装でもほぼ共通のコード。\n// 基本的にファイル コピー。変更点は以下の2つだけ\n// - 名前空間\n// - コンストラクター引数と、ArrayAccessor を作る部分\n//\n// インターフェイスを切れば1個の実装で済むけども、以下の理由でファイル コピーにしてる。\n// - パフォーマンス最優先で、static メソッドを直参照\n//   - ヒープ確保しないように\n// - 違うエンコーディングの Index を渡せてしまうと動作保証外なので、別の型にしたい\n\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace UtfString.Utf8\n{\n    public struct String : IEnumerable<CodePoint>, IString<Index, StringEnumerator, IndexEnumerable, IndexEnumerable>\n    {\n        private readonly ArrayAccessor _buffer;\n\n        public String(byte[] encodedBytes)\n        {\n            _buffer = new ArrayAccessor(encodedBytes);\n        }\n\n        public StringEnumerator GetEnumerator() => new StringEnumerator(_buffer);\n\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n        IEnumerator<CodePoint> IEnumerable<CodePoint>.GetEnumerator() => GetEnumerator();\n\n        public IndexEnumerable Indexes => new IndexEnumerable(_buffer);\n        public CodePoint this[Index index] => Decoder.Decode(_buffer, index);\n\n        public int Length => Decoder.GetLength(_buffer);\n    }\n\n    public struct Index\n    {\n        internal int index;\n        internal byte count;\n    }\n\n    public struct StringEnumerator : IEnumerator<CodePoint>\n    {\n        private readonly ArrayAccessor _buffer;\n        private Index _index;\n\n        public StringEnumerator(ArrayAccessor buffer)\n        {\n            _buffer = buffer;\n            _index = default(Index);\n            Current = default(CodePoint);\n        }\n\n        public CodePoint Current { get; private set; }\n\n        public bool MoveNext()\n        {\n            _index.index += _index.count;\n            var next = Decoder.TryDecode(_buffer, _index.index);\n            if (next.count == Constants.InvalidCount) return false;\n            _index.count = next.count;\n            Current = next.cp;\n            return true;\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n    }\n\n    public struct IndexEnumerable : IEnumerator<Index>, IEnumerable<Index>, IIndexEnumerable<Index, IndexEnumerable>\n    {\n        private readonly ArrayAccessor _buffer;\n        private Index _i;\n\n        public IndexEnumerable(ArrayAccessor buffer)\n        {\n            _buffer = buffer;\n            _i = default(Index);\n        }\n\n        public Index Current => _i;\n        public bool MoveNext()\n        {\n            _i.index += _i.count;\n            _i.count = Decoder.TyrGetCount(_buffer, _i.index);\n            return _i.count != Constants.InvalidCount;\n        }\n\n        object IEnumerator.Current => Current;\n        void IDisposable.Dispose() { }\n        void IEnumerator.Reset() { throw new NotSupportedException(); }\n\n        public IndexEnumerable GetEnumerator() => new IndexEnumerable(_buffer);\n        IEnumerator<Index> IEnumerable<Index>.GetEnumerator() => GetEnumerator();\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n    }\n}\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/UtfString.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netstandard2.0</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2016/Unicode/UtfString/readme.md",
    "content": "﻿Utf8String: https://github.com/dotnet/corefxlab/tree/master/src/System.Text.Utf8\nの簡易実装版。\n\nUtf8Stringは https://github.com/dotnet/corefxlab/tree/master/src/System.Slices に依存してる。\n\nSlicesは安定性とかパフォーマンス向上のためにランタイムのレベルで手を入れたくて、C# 7時点ではリリースできない。\nSlicesに依存してるUtf8Stringも当然、リリースできない。\n\nなので、説明用に、Utf8Stringの簡易実装を作ってみた。\n"
  },
  {
    "path": "Demo/2017/BitFieldsSample/BitFieldsSample.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp1.1</TargetFramework>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BitFields\" Version=\"0.1.0\" />\n    <PackageReference Include=\"System.ValueTuple\" Version=\"4.3.0\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2017/BitFieldsSample/BitFieldsSample.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26403.7\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BitFieldsSample\", \"BitFieldsSample.csproj\", \"{4DD08754-1B75-46EE-87B6-FA16CDC95C9B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{4DD08754-1B75-46EE-87B6-FA16CDC95C9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4DD08754-1B75-46EE-87B6-FA16CDC95C9B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4DD08754-1B75-46EE-87B6-FA16CDC95C9B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4DD08754-1B75-46EE-87B6-FA16CDC95C9B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/BitFieldsSample/DoubleView.BitFields.cs",
    "content": "﻿using BitFields;\n\nnamespace BitFieldsSample\n{\n    partial struct DoubleView\n    {\n        public ulong Value;\n\n        private const int FractionShift = 0;\n        private const ulong FractionMask = unchecked((ulong)((1UL << 52) - (1UL << 0)));\n        public Bit52 Fraction\n        {\n            get => (Bit52)((Value & FractionMask) >> FractionShift);\n            set => Value = unchecked((ulong)((Value & ~FractionMask) | ((((ulong)value) << FractionShift) & FractionMask)));\n        }\n        private const int ExponentShift = 52;\n        private const ulong ExponentMask = unchecked((ulong)((1UL << 63) - (1UL << 52)));\n        public Bit11 Exponent\n        {\n            get => (Bit11)((Value & ExponentMask) >> ExponentShift);\n            set => Value = unchecked((ulong)((Value & ~ExponentMask) | ((((ulong)value) << ExponentShift) & ExponentMask)));\n        }\n        private const int SignShift = 63;\n        private const ulong SignMask = unchecked((ulong)((1UL << 64) - (1UL << 63)));\n        public Bit1 Sign\n        {\n            get => (Bit1)((Value & SignMask) >> SignShift);\n            set => Value = unchecked((ulong)((Value & ~SignMask) | ((((ulong)value) << SignShift) & SignMask)));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BitFieldsSample/DoubleView.cs",
    "content": "﻿namespace BitFieldsSample\n{\n    /*\n    // 初期状態\n    // BitFields という名前の inner enum を定義すると、アナライザーによってクイックアクションが表示される\n    // クイックアクションで、「Generate bit-fields」を選択するとコード生成が走る。\n    // *.BitFields.cs という名前の別ファイル内に生成。\n    struct DoubleView\n    {\n        enum BitFields\n        {\n            Fraction = 52,\n            Exponent = 11,\n            Sign = 1,\n        }\n    }\n     */\n\n    /// <summary>\n    /// double (IEEE 754 倍精度浮動小数点数)の中身をビット操作するための構造体。\n    /// </summary>\n    partial struct DoubleView\n    {\n        enum BitFields\n        {\n            Fraction = 52,\n            Exponent = 11,\n            Sign = 1,\n        }\n\n        public unsafe ref double AsFloat()\n        {\n            fixed (ulong* p = &Value)\n            {\n                return ref *(double*)p;\n            }\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/BitFieldsSample/Program.cs",
    "content": "﻿using BitFields;\nusing System;\n\nnamespace BitFieldsSample\n{\n    /// <summary>\n    /// https://www.nuget.org/packages/BitFields/ の簡単なサンプル。\n    ///\n    /// このライブラリが提供してるのは以下のようなもの。\n    ///\n    /// - Bit{N} 型: N ビットまでしか受け付けない unsigned 整数型\n    /// - BitNAnalyzer: N ビットまでしか受け付けない保証をするためのアナライザー\n    /// - BitFieldsGenerator: <see cref=\"DoubleView\"/>, <see cref=\"SingleView\"/>, <see cref=\"Rgb555\"/> みたいな型から、ビットフィールドを生成する Code-Fix \n    ///\n    /// その利用例として以下のようなものを用意。\n    ///\n    /// - double/float (IEEE 754 形式浮動小数点数)の中身をビット操作\n    /// - RGB555 形式(各色5ビットずつのRGB)\n    /// </summary>\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            DoubleViewSample();\n            SingleViewSample();\n            Rgb555Sample();\n        }\n\n        private static void DoubleViewSample()\n        {\n            var v = new DoubleView();\n\n            v.Sign = 1; // -\n            v.Exponent = 3 + 1023; // 2^3\n            v.Fraction = 0xE_0000_0000_0000; // 1.111b\n\n            Console.WriteLine(v.Value.ToString(\"X\"));\n            Console.WriteLine(v.AsFloat()); // -15\n        }\n\n        private static void SingleViewSample()\n        {\n            var v = new SingleView();\n\n            v.Sign = 1; // -\n            v.Exponent = 3 + 127; // 2^3\n            v.Fraction = 0x70_0000; // 1.111b\n\n            Console.WriteLine(v.Value.ToString(\"X\"));\n            Console.WriteLine(v.AsFloat()); // -15\n        }\n\n        private static void Rgb555Sample()\n        {\n            var color = new Rgb555(10, 20, 30);\n            Console.WriteLine(color.Value.ToString(\"X\"));\n            Console.WriteLine(color);\n            (byte r, byte g, byte b) = color;\n            Console.WriteLine((r, g, b));\n\n#if false\n            // #if を外すとコンパイルエラーになる\n\n            var color1 = new Rgb555(10, 20, 32); // Bit5 なので 32 (6ビット)はダメ\n            color1.R = 32;\n#endif\n        }\n\n        static void BitNSample()\n        {\n            Bit1 x1a = 0;\n            Bit1 x1b = 1;\n\n            Bit4 x4a = 15; // 4ビットなので15までOK\n            Bit63 x63a = 0x4000_0000_0000_0000;\n\n#if false\n            // #if を外すとコンパイルエラーになる\n\n            Bit1 x1c = 2; // 2は2ビットなのでダメ\n            Bit4 x4b = 16;\n            Bit63 x63b = 0x8000_0000_0000_0000;\n#endif\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/BitFieldsSample/Rgb555.BitFields.cs",
    "content": "﻿using BitFields;\n\nnamespace BitFieldsSample\n{\n    partial struct Rgb555\n    {\n        public ushort Value;\n\n        private const int BShift = 0;\n        private const ushort BMask = unchecked((ushort)((1U << 5) - (1U << 0)));\n        public Bit5 B\n        {\n            get => (Bit5)((Value & BMask) >> BShift);\n            set => Value = unchecked((ushort)((Value & ~BMask) | ((((ushort)value) << BShift) & BMask)));\n        }\n        private const int GShift = 5;\n        private const ushort GMask = unchecked((ushort)((1U << 10) - (1U << 5)));\n        public Bit5 G\n        {\n            get => (Bit5)((Value & GMask) >> GShift);\n            set => Value = unchecked((ushort)((Value & ~GMask) | ((((ushort)value) << GShift) & GMask)));\n        }\n        private const int RShift = 10;\n        private const ushort RMask = unchecked((ushort)((1U << 15) - (1U << 10)));\n        public Bit5 R\n        {\n            get => (Bit5)((Value & RMask) >> RShift);\n            set => Value = unchecked((ushort)((Value & ~RMask) | ((((ushort)value) << RShift) & RMask)));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BitFieldsSample/Rgb555.cs",
    "content": "﻿using BitFields;\n\nnamespace BitFieldsSample\n{\n    /*\n    // 初期状態\n    // BitFields という名前の inner enum を定義すると、アナライザーによってクイックアクションが表示される\n    // クイックアクションで、「Generate bit-fields」を選択するとコード生成が走る。\n    // *.BitFields.cs という名前の別ファイル内に生成。\n    struct Rgb555\n    {\n        enum BitFields\n        {\n            B = 5,\n            G = 5,\n            R = 5,\n        }\n    }\n     */\n\n    /// <summary>\n    /// RBG それぞれ5ビットずつで色を表現する構造体。\n    /// </summary>\n    partial struct Rgb555\n    {\n        enum BitFields\n        {\n            B = 5,\n            G = 5,\n            R = 5,\n        }\n\n        public Rgb555(Bit5 r, Bit5 g, Bit5 b) : this() => (R, G, B) = (r, g, b);\n        public void Deconstruct(out Bit5 r, out Bit5 g, out Bit5 b) => (r, g, b) = (R, G, B);\n\n        public override string ToString() => $\"((R): {R}, G: {G}, B: {B})\";\n    }\n}"
  },
  {
    "path": "Demo/2017/BitFieldsSample/SingleView.BitFields.cs",
    "content": "﻿using BitFields;\n\nnamespace BitFieldsSample\n{\n    partial struct SingleView\n    {\n        public uint Value;\n\n        private const int FractionShift = 0;\n        private const uint FractionMask = unchecked((uint)((1U << 23) - (1U << 0)));\n        public Bit23 Fraction\n        {\n            get => (Bit23)((Value & FractionMask) >> FractionShift);\n            set => Value = unchecked((uint)((Value & ~FractionMask) | ((((uint)value) << FractionShift) & FractionMask)));\n        }\n        private const int ExponentShift = 23;\n        private const uint ExponentMask = unchecked((uint)((1U << 31) - (1U << 23)));\n        public Bit8 Exponent\n        {\n            get => (Bit8)((Value & ExponentMask) >> ExponentShift);\n            set => Value = unchecked((uint)((Value & ~ExponentMask) | ((((uint)value) << ExponentShift) & ExponentMask)));\n        }\n        private const int SignShift = 31;\n        private const uint SignMask = unchecked((uint)((1U << 32) - (1U << 31)));\n        public Bit1 Sign\n        {\n            get => (Bit1)((Value & SignMask) >> SignShift);\n            set => Value = unchecked((uint)((Value & ~SignMask) | ((((uint)value) << SignShift) & SignMask)));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BitFieldsSample/SingleView.cs",
    "content": "﻿namespace BitFieldsSample\n{\n    /*\n    // 初期状態\n    // BitFields という名前の inner enum を定義すると、アナライザーによってクイックアクションが表示される\n    // クイックアクションで、「Generate bit-fields」を選択するとコード生成が走る。\n    // *.BitFields.cs という名前の別ファイル内に生成。\n    struct SingleView\n    {\n        enum BitFields\n        {\n            Fraction = 23,\n            Exponent = 8,\n            Sign = 1,\n        }\n    }\n     */\n\n    /// <summary>\n    /// float (IEEE 754 単精度浮動小数点数)の中身をビット操作するための構造体。\n    /// </summary>\n    partial struct SingleView\n    {\n        enum BitFields\n        {\n            Fraction = 23,\n            Exponent = 8,\n            Sign = 1,\n        }\n\n        public unsafe ref float AsFloat()\n        {\n            fixed (uint* p = &Value)\n            {\n                return ref *(float*)p;\n            }\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/BitOperations/BitOperations/BitOperations.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp1.1</TargetFramework>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Numerics.Vectors\" Version=\"4.3.0\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.3.0\" />\n    <PackageReference Include=\"System.ValueTuple\" Version=\"4.3.0\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2017/BitOperations/BitOperations/Bits.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace BitOperations\n{\n    public static class Bits\n    {\n        public static Bits<byte, ByteBitOperator> Create(ref byte x) => new Bits<byte, ByteBitOperator>(ref x);\n        public static Bits<ushort, ShortBitOperator> Create(ref ushort x) => new Bits<ushort, ShortBitOperator>(ref x);\n        public static Bits<uint, IntBitOperator> Create(ref uint x) => new Bits<uint, IntBitOperator>(ref x);\n        public static Bits<ulong, LongBitOperator> Create(ref ulong x) => new Bits<ulong, LongBitOperator>(ref x);\n        public static Bits<Bytes16, Bytes16BitOperator> Create(ref Bytes16 x) => new Bits<Bytes16, Bytes16BitOperator>(ref x);\n\n        // Known issue:\n        // - boxing\n        // - unsafe\n        // - suppors only 1, 2, 4, 8, 16 bytes\n        // - returns a boxed value of a blittable struct\n        public static IBits Create<T>(ref T x)\n            where T : struct\n        {\n            switch (Unsafe.SizeOf<T>())\n            {\n                case 1:\n                    ref var b = ref Unsafe.As<T, byte>(ref x);\n                    return Create(ref b);\n                case 2:\n                    ref var s = ref Unsafe.As<T, ushort>(ref x);\n                    return Create(ref s);\n                case 4:\n                    ref var i = ref Unsafe.As<T, uint>(ref x);\n                    return Create(ref i);\n                case 8:\n                    ref var l = ref Unsafe.As<T, ulong>(ref x);\n                    return Create(ref l);\n                case 16:\n                    ref var b16 = ref Unsafe.As<T, Bytes16>(ref x);\n                    return Create(ref b16);\n                default:\n                    throw new NotSupportedException(\"suppors only 1, 2, 4, 8, 16 bytes struct\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BitOperations/BitOperations/Bits_T.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\n\nnamespace BitOperations\n{\n    // Bits<T> should be a ref-like type (https://github.com/dotnet/csharplang/blob/master/meetings/2016/LDM-2016-11-01.md)\n    // Type parameter T should be blittabl (https://github.com/dotnet/csharplang/issues/187)\n    public unsafe struct Bits<T, TOperator> : IBits\n        where T : struct\n        where TOperator : SBitOperator<T>\n    {\n        // This should use ByReference<T> (https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/ByReference.cs) if possible\n        void* _ptr;\n        public Bits(ref T x) => _ptr = Unsafe.AsPointer(ref x);\n\n        /// <summary>\n        /// get/set a <paramref name=\"index\"/>-th bit。\n        /// </summary>\n        /// <remarks>\n        /// It depends on <see cref=\"TOperator\"/>'s implementaion whether order of bits is ascending or descending。\n        /// </remarks>\n        public bool this[int index]\n        {\n            get => default(TOperator).GetBit(ref Unsafe.AsRef<T>(_ptr), index);\n            set => default(TOperator).SetBit(ref Unsafe.AsRef<T>(_ptr), index, value);\n        }\n\n        /// <summary>\n        /// bit counts.\n        /// </summary>\n        public int Count => default(TOperator).Size;\n\n        Enumerator GetEnumerator() => new Enumerator(Unsafe.AsRef<T>(_ptr));\n        IEnumerator<bool> IEnumerable<bool>.GetEnumerator() => GetEnumerator();\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n        bool IReadOnlyList<bool>.this[int index] => this[index];\n\n        public struct Enumerator : IEnumerator<bool>\n        {\n            int _i;\n            T _x;\n            public Enumerator(T x) => (_x, _i) = (x, 0);\n\n            public bool Current => default(TOperator).GetBit(ref _x, 0);\n            object IEnumerator.Current => Current;\n            void IDisposable.Dispose() { }\n            public bool MoveNext()\n            {\n                if (_i == 0)\n                {\n                    ++_i;\n                    return true;\n                }\n                if (_i >= default(TOperator).Size) return false;\n                ++_i;\n                _x = default(TOperator).RightShift(_x);\n                return true;\n            }\n\n            public void Reset() => throw new NotImplementedException();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BitOperations/BitOperations/Bytes16.cs",
    "content": "﻿using System;\n\nnamespace BitOperations\n{\n    /// <summary>\n    /// A 16-byte-sized struct.\n    /// I assume little-endianness.\n    /// </summary>\n    public struct Bytes16\n    {\n        public ulong LowWord;\n        public ulong HighWord;\n    }\n\n    public struct Bytes16BitOperator : SBitOperator<Bytes16>\n    {\n        public int Size => 128;\n        public bool GetBit(ref Bytes16 x, int index)\n        {\n            if (index < 0 || index >= 128) throw new IndexOutOfRangeException();\n\n            if (index < 64) return (x.LowWord & (1UL << index)) != 0;\n            else return (x.HighWord & (1UL << (index - 64))) != 0;\n        }\n        public void SetBit(ref Bytes16 x, int index, bool value)\n        {\n            if (index < 64)\n            {\n                if (value) x.LowWord |= (1UL << index);\n                else x.LowWord &= ~(1UL << index);\n            }\n            else\n            {\n                index -= 64;\n                if (value) x.HighWord |= (1UL << index);\n                else x.HighWord &= ~(1UL << index);\n            }\n        }\n        public Bytes16 RightShift(Bytes16 x)\n        {\n            var lowestHigh = (x.HighWord & 1);\n            x.HighWord >>= 1;\n            x.LowWord >>= 1;\n            if (lowestHigh == 1) x.LowWord |= 0x8000_0000_0000_0000;\n            return x;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BitOperations/BitOperations/IBits.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace BitOperations\n{\n    public interface IBits : IEnumerable<bool>, IReadOnlyList<bool>\n    {\n        new bool this[int index] { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BitOperations/BitOperations/PrimitiveBitOperators.cs",
    "content": "﻿using System;\n\nnamespace BitOperations\n{\n    // BitOperator for byte, ushort, uint, ulong\n    // It might be better to use T4 template because these are almost copy & paste.\n\n    public struct ByteBitOperator : SBitOperator<byte>\n    {\n        public int Size => 8;\n        public bool GetBit(ref byte x, int index)\n        {\n            if (index < 0 || index >= Size) throw new IndexOutOfRangeException();\n            return (x & (1 << index)) != 0;\n        }\n        public void SetBit(ref byte x, int index, bool value)\n        {\n            if (index < 0 || index >= Size) throw new IndexOutOfRangeException();\n            if (value) x |= (byte)(1 << index);\n            else x &= (byte)~(1 << index);\n        }\n        public byte RightShift(byte x) => (byte)(x >> 1);\n    }\n\n    public struct ShortBitOperator : SBitOperator<ushort>\n    {\n        public int Size => 16;\n        public bool GetBit(ref ushort x, int index)\n        {\n            if (index < 0 || index >= Size) throw new IndexOutOfRangeException();\n            return (x & (1 << index)) != 0;\n        }\n        public void SetBit(ref ushort x, int index, bool value)\n        {\n            if (index < 0 || index >= Size) throw new IndexOutOfRangeException();\n            if (value) x |= (ushort)(1 << index);\n            else x &= (ushort)~(1 << index);\n        }\n        public ushort RightShift(ushort x) => (ushort)(x >> 1);\n    }\n\n    public struct IntBitOperator : SBitOperator<uint>\n    {\n        public int Size => 32;\n        public bool GetBit(ref uint x, int index)\n        {\n            if (index < 0 || index >= Size) throw new IndexOutOfRangeException();\n            return (x & (1 << index)) != 0;\n        }\n        public void SetBit(ref uint x, int index, bool value)\n        {\n            if (index < 0 || index >= Size) throw new IndexOutOfRangeException();\n            if (value) x |= (uint)(1 << index);\n            else x &= (uint)~(1 << index);\n        }\n        public uint RightShift(uint x) => (x >> 1);\n    }\n\n    public struct LongBitOperator : SBitOperator<ulong>\n    {\n        public int Size => 64;\n        public bool GetBit(ref ulong x, int index)\n        {\n            if (index < 0 || index >= Size) throw new IndexOutOfRangeException();\n            return (x & (1UL << index)) != 0;\n        }\n        public void SetBit(ref ulong x, int index, bool value)\n        {\n            if (index < 0 || index >= Size) throw new IndexOutOfRangeException();\n            if (value) x |= 1UL << index;\n            else x &= ~(1UL << index);\n        }\n        public ulong RightShift(ulong x) => (x >> 1);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BitOperations/BitOperations/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Numerics;\nusing System.Runtime.CompilerServices;\n\nnamespace BitOperations\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            ByteSample();\n            IntSample();\n            VectorSample();\n            GenericSample();\n        }\n\n        static void ByteSample()\n        {\n            byte b = 0;\n            var bits = Bits.Create(ref b);\n            Console.WriteLine(b); // 0\n            WriteAsEnumerable(bits);\n            WriteAsList(bits);\n\n            b = 0b1100_1010;\n            Console.WriteLine(b); // 202\n            WriteAsEnumerable(bits); // 0101_0011\n            WriteAsList(bits);\n\n            for (int i = 0; i < 8; i++) bits[i] = i % 2 == 1;\n            Console.WriteLine(b); // 170\n            WriteAsEnumerable(bits);\n            WriteAsList(bits);\n\n            for (int i = 0; i < 8; i++) bits[i] = true;\n            Console.WriteLine(b); // 255\n            WriteAsEnumerable(bits);\n            WriteAsList(bits);\n\n            for (int i = 0; i < 8; i++) bits[i] = i % 2 == 0;\n            Console.WriteLine(b); // 85\n            WriteAsEnumerable(bits);\n            WriteAsList(bits);\n\n            for (int i = 0; i < 8; i++) bits[i] = false;\n            Console.WriteLine(b); // 0\n            WriteAsEnumerable(bits);\n            WriteAsList(bits);\n        }\n\n        static void IntSample()\n        {\n            ushort i16 = 0x1234;\n            var bits16 = Bits.Create(ref i16);\n            WriteAsList(bits16);\n            for (int i = 0; i < bits16.Count; i++) bits16[i] = i % 2 == 0;\n            WriteAsList(bits16);\n            Console.WriteLine(i16);\n\n            uint i32 = 0x12345678;\n            var bits32 = Bits.Create(ref i32);\n            WriteAsList(bits32);\n            for (int i = 0; i < bits32.Count; i++) bits32[i] = i % 2 == 0;\n            WriteAsList(bits32);\n            Console.WriteLine(i32);\n\n            ulong i64 = 0x123456789ABCDEF0UL;\n            var bits64 = Bits.Create(ref i64);\n            WriteAsList(bits64);\n            for (int i = 0; i < bits64.Count; i++) bits64[i] = i % 2 == 0;\n            WriteAsList(bits64);\n            Console.WriteLine(i64);\n        }\n\n        static void VectorSample()\n        {\n            // System.Numerics.Vector<byte> is a 16-byte struct.\n            var vector = new Vector<byte>(Enumerable.Range(1, 16).Select(i => (byte)i).ToArray());\n\n            // Vector<byte> → Bytes16 (conversion between same-size structs)\n            ref Bytes16 bytes = ref Unsafe.As<Vector<byte>, Bytes16>(ref vector);\n\n            // bit operations on Vector<byte>\n            var bits = Bits.Create(ref bytes);\n\n            WriteAsEnumerable(bits);\n            WriteAsList(bits);\n\n            for (int i = 0; i < 128; i++) bits[i] = i % 2 == 1;\n\n            Console.WriteLine(vector);\n            WriteAsEnumerable(bits);\n            WriteAsList(bits);\n        }\n\n        static void GenericSample()\n        {\n            var vector = new Vector<byte>();\n            GenericSample(vector);\n\n            GenericSample((byte)0x12);\n            GenericSample((short)0x1224);\n            GenericSample(0x12345678);\n            GenericSample(0x123456789ABCDEF0L);\n        }\n\n        private static void GenericSample<T>(T x)\n            where T : struct\n        {\n            var bits = Bits.Create(ref x);\n            for (int i = 0; i < bits.Count; i++) bits[i] = i % 2 == 1;\n\n            Console.WriteLine(x);\n            WriteAsEnumerable(bits);\n            WriteAsList(bits);\n        }\n\n        static void WriteAsEnumerable(IEnumerable<bool> items)\n        {\n            int i = 0;\n            foreach (var item in items)\n            {\n                if ((i % 4) == 0 && i != 0) Console.Write(\"_\");\n                Console.Write(item ? 1 : 0);\n                i++;\n            }\n            Console.WriteLine();\n        }\n\n        static void WriteAsList(IReadOnlyList<bool> items)\n        {\n            for (int i = 0; i < items.Count; i++)\n            {\n                if ((i % 4) == 0 && i != 0) Console.Write(\"_\");\n                Console.Write(items[i] ? 1 : 0);\n            }\n            Console.WriteLine();\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/BitOperations/BitOperations/SBitOperator.cs",
    "content": "﻿namespace BitOperations\n{\n    /// <summary>\n    /// Type Class for reading/writing n-th bit and shifting.\n    /// </summary>\n    public interface SBitOperator<T>\n    {\n        int Size { get; }\n        bool GetBit(ref T x, int index);\n        void SetBit(ref T x, int index, bool value);\n        T RightShift(T x);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BitOperations/BitOperations.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26403.7\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BitOperations\", \"BitOperations\\BitOperations.csproj\", \"{7F291D3A-6097-4867-A48F-DB1045C59A4B}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"GenericBits\", \"GenericBits\\GenericBits.csproj\", \"{1FECE07F-8564-4091-A0BB-04864C07A501}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{7F291D3A-6097-4867-A48F-DB1045C59A4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7F291D3A-6097-4867-A48F-DB1045C59A4B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7F291D3A-6097-4867-A48F-DB1045C59A4B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7F291D3A-6097-4867-A48F-DB1045C59A4B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1FECE07F-8564-4091-A0BB-04864C07A501}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1FECE07F-8564-4091-A0BB-04864C07A501}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1FECE07F-8564-4091-A0BB-04864C07A501}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1FECE07F-8564-4091-A0BB-04864C07A501}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/BitOperations/GenericBits/Bits.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\n\nnamespace GenericBits\n{\n    public unsafe struct Bits<T> : IEnumerable<bool>, IReadOnlyList<bool>\n        where T : struct\n    {\n        private static readonly int NumBits = Unsafe.SizeOf<T>() * 8;\n\n        private byte* _ptr;\n        public Bits(ref T x) => _ptr = (byte*)Unsafe.AsPointer(ref x);\n\n        const int Shift = 3;\n        const int Mask = 0b111;\n\n        public bool this[int index]\n        {\n            get\n            {\n                if (index >= NumBits) throw new IndexOutOfRangeException();\n                return (_ptr[index >> Shift] & (1 << (index & Mask))) != 0;\n            }\n            set\n            {\n                if (index >= NumBits) throw new IndexOutOfRangeException();\n                if (value) _ptr[index >> Shift] |= (byte)(1UL << (index & Mask));\n                else _ptr[index >> Shift] &= (byte)~(1 << (index & Mask));\n            }\n        }\n\n        public int Count => NumBits;\n\n        public Enumerator GetEnumerator() => new Enumerator(this);\n        IEnumerator<bool> IEnumerable<bool>.GetEnumerator() => GetEnumerator();\n        IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n\n        public struct Enumerator : IEnumerator<bool>\n        {\n            private int _i;\n            private Bits<T> _bits;\n            public Enumerator(Bits<T> bits) => (_bits, _i) = (bits, -1);\n\n            public bool Current => _bits[_i];\n            object IEnumerator.Current => Current;\n            public void Dispose() { }\n            public bool MoveNext() => ++_i < _bits.Count;\n            public void Reset() => _i = -1;\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/BitOperations/GenericBits/GenericBits.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp1.1</TargetFramework>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.3.0\" />\n    <PackageReference Include=\"System.ValueTuple\" Version=\"4.3.0\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2017/BitOperations/GenericBits/Program.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace GenericBits\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Write((byte)0x12);\n            Write((short)0x1234);\n            Write(0x1234_5678);\n            Write(0x12345678abcdef0L);\n            Write(new Sample1(0x12, 0x34, 0x5678, 0x9abcdef0));\n            Write(new Sample2(0x1234, 0x5678_9abc, 0xde, 0x1234_5678_9abc_def0L));\n        }\n\n        static void Write<T>(T initialValue)\n            where T : struct\n        {\n            Console.WriteLine($\"---- write bits for {typeof(T).Name} (size = {Unsafe.SizeOf<T>()}) ----\");\n\n            var x = initialValue;\n            var bits = new Bits<T>(ref x);\n            Console.WriteLine($\"bits: {bits.Count}\");\n            Console.WriteLine(x);\n            WriteBits(bits);\n\n            for (int i = 0; i < bits.Count; i++) bits[i] = (i % 2) == 1;\n            Console.WriteLine(x);\n            WriteBits(bits);\n\n            for (int i = 0; i < bits.Count; i++) bits[i] = (i % 3) == 1;\n            Console.WriteLine(x);\n            WriteBits(bits);\n        }\n\n        static void WriteBits<T>(Bits<T> bits)\n            where T : struct\n        {\n            for (int i = 0; i < bits.Count; i++)\n            {\n                if ((i % 4 == 0 && i != 0)) Console.Write('_');\n                Console.Write(bits[i] ? '1' : '0');\n            }\n            Console.WriteLine();\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/BitOperations/GenericBits/Sample1.cs",
    "content": "﻿namespace GenericBits\n{\n    struct Sample1\n    {\n        public byte A;\n        public byte B;\n        public ushort C;\n        public uint D;\n        public Sample1(byte a, byte b, ushort c, uint d) => (A, B, C, D) = (a, b, c, d);\n        public override string ToString() => (A, B, C, D).ToString();\n    }\n}"
  },
  {
    "path": "Demo/2017/BitOperations/GenericBits/Sample2.cs",
    "content": "﻿namespace GenericBits\n{\n    struct Sample2\n    {\n        public short A;\n        public int B;\n        public byte C;\n        public long D;\n        public Sample2(short a, int b, byte c, long d) => (A, B, C, D) = (a, b, c, d);\n        public override string ToString() => (A, B, C, D).ToString();\n    }\n}"
  },
  {
    "path": "Demo/2017/BufferPerformance/BufferPerformance/BufferPerformance.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net462</TargetFramework>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.7\" />\n    <PackageReference Include=\"System.Buffers\" Version=\"4.3.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/BufferPerformance/BufferPerformance/Buffers/ArraySpan.cs",
    "content": "﻿using System;\n\nnamespace BufferPerformance.Buffers\n{\n    struct ArraySpan : IByteSpan\n    {\n        ArraySegment<byte> _segment;\n        public ArraySpan(byte[] array, int offset, int count) => _segment = new ArraySegment<byte>(array, offset, count);\n        public ArraySpan(ArraySegment<byte> segment) => _segment = segment;\n        public ref byte this[int index] => ref _segment.Array[_segment.Offset + index];\n        public int Length => _segment.Count;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BufferPerformance/BufferPerformance/Buffers/BufferA.cs",
    "content": "﻿using System;\n\nnamespace BufferPerformance.Buffers\n{\n    unsafe struct BufferA : IBuffer<ArraySpan>\n    {\n        private byte[] _buffer;\n        private int _writeLength;\n\n        public BufferA(int capacity)\n        {\n            _buffer = new byte[capacity];\n            _writeLength = 0;\n        }\n\n        public void Reserve(int length)\n        {\n            if (_writeLength + length >= _buffer.Length)\n            {\n                var capacity = Math.Max(_buffer.Length * 2, length);\n                var buffer = new byte[capacity];\n                Array.Copy(_buffer, buffer, _writeLength);\n                _buffer = buffer;\n            }\n        }\n        public void Skip(int length) => _writeLength += length;\n\n        public unsafe void Append(byte* data, int length)\n        {\n            Reserve(length);\n            fixed (byte* p = _buffer)\n                System.Buffer.MemoryCopy(data, p + _writeLength, _buffer.Length - _writeLength, length);\n            Skip(length);\n        }\n\n        public void Dispose()\n        {\n            _buffer = null;\n        }\n\n        public ArraySpan WrittenSpan => new ArraySpan(_buffer, 0, _writeLength);\n        public ArraySpan FreeSpan => new ArraySpan(_buffer, _writeLength, _buffer.Length - _writeLength);\n    }\n\n}\n"
  },
  {
    "path": "Demo/2017/BufferPerformance/BufferPerformance/Buffers/BufferB.cs",
    "content": "﻿using System;\nusing System.Buffers;\n\nnamespace BufferPerformance.Buffers\n{\n    unsafe struct BufferB : IBuffer<ArraySpan>\n    {\n        private static ArrayPool<byte> _pool = ArrayPool<byte>.Shared;\n\n        private byte[] _buffer;\n        private int _writeLength;\n\n        public BufferB(int capacity)\n        {\n            _buffer = _pool.Rent(capacity);\n            _writeLength = 0;\n        }\n\n        public void Reserve(int length)\n        {\n            if (_writeLength + length >= _buffer.Length)\n            {\n                var capacity = Math.Max(_buffer.Length * 2, length);\n                var buffer = _pool.Rent(capacity);\n                Array.Copy(_buffer, buffer, _writeLength);\n                _pool.Return(_buffer);\n                _buffer = buffer;\n            }\n        }\n        public void Skip(int length) => _writeLength += length;\n\n        public unsafe void Append(byte* data, int length)\n        {\n            Reserve(length);\n            fixed (byte* p = _buffer)\n                System.Buffer.MemoryCopy(data, p + _writeLength, _buffer.Length - _writeLength, length);\n            Skip(length);\n        }\n\n        public void Dispose()\n        {\n            _pool.Return(_buffer);\n            _buffer = null;\n        }\n\n        public ArraySpan WrittenSpan => new ArraySpan(_buffer, 0, _writeLength);\n        public ArraySpan FreeSpan => new ArraySpan(_buffer, _writeLength, _buffer.Length - _writeLength);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BufferPerformance/BufferPerformance/Buffers/BufferC.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace BufferPerformance.Buffers\n{\n    unsafe struct BufferC : IBuffer<PointerSpan>\n    {\n        private GCHandle _p;\n        private int _length;\n        private int _writeLength;\n\n        public BufferC(int capacity)\n        {\n            Allocate(capacity, out _p, out _length);\n            _writeLength = 0;\n        }\n\n        private static void Allocate(int capacity, out GCHandle p, out int length)\n        {\n            var buffer = new byte[capacity];\n            p = GCHandle.Alloc(buffer, GCHandleType.Pinned);\n            length = buffer.Length;\n        }\n\n        public void Reserve(int length)\n        {\n            if (_writeLength + length >= _length)\n            {\n                var buffer = (byte[])_p.Target;\n                Dispose();\n\n                var capacity = Math.Max(_length * 2, length);\n                Allocate(capacity, out var p, out var newLength);\n\n                Array.Copy(buffer, (byte[])p.Target, _writeLength);\n\n                _p = p;\n                _length = newLength;\n            }\n        }\n        public void Skip(int length) => _writeLength += length;\n\n        public unsafe void Append(byte* data, int length)\n        {\n            Reserve(length);\n            System.Buffer.MemoryCopy(data, (byte*)_p.AddrOfPinnedObject() + _writeLength, _length - _writeLength, length);\n            Skip(length);\n        }\n\n        public void Dispose()\n        {\n            _p.Free();\n            _p = default(GCHandle);\n        }\n\n        public PointerSpan WrittenSpan => new PointerSpan((byte*)_p.AddrOfPinnedObject(), _writeLength);\n        public PointerSpan FreeSpan => new PointerSpan((byte*)_p.AddrOfPinnedObject() + _writeLength, _length - _writeLength);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BufferPerformance/BufferPerformance/Buffers/BufferD.cs",
    "content": "﻿using System;\nusing System.Buffers;\nusing System.Runtime.InteropServices;\n\nnamespace BufferPerformance.Buffers\n{\n    unsafe struct BufferD : IBuffer<PointerSpan>\n    {\n        private static ArrayPool<byte> _pool = ArrayPool<byte>.Shared;\n\n        private GCHandle _p;\n        private int _length;\n        private int _writeLength;\n\n        public BufferD(int capacity)\n        {\n            Allocate(capacity, out _p, out _length);\n            _writeLength = 0;\n        }\n\n        private static void Allocate(int capacity, out GCHandle p, out int length)\n        {\n            var buffer = _pool.Rent(capacity);\n            p = GCHandle.Alloc(buffer, GCHandleType.Pinned);\n            length = buffer.Length;\n        }\n\n        public void Reserve(int length)\n        {\n            if (_writeLength + length >= _length)\n            {\n                var buffer = (byte[])_p.Target;\n                _p.Free();\n\n                var capacity = Math.Max(_length * 2, length);\n                Allocate(capacity, out var p, out var newLength);\n\n                Array.Copy(buffer, (byte[])p.Target, _writeLength);\n\n                ArrayPool<byte>.Shared.Return(buffer);\n\n                _p = p;\n                _length = newLength;\n            }\n        }\n        public void Skip(int length) => _writeLength += length;\n\n        public unsafe void Append(byte* data, int length)\n        {\n            Reserve(length);\n            Buffer.MemoryCopy(data, (byte*)_p.AddrOfPinnedObject() + _writeLength, _length - _writeLength, length);\n            Skip(length);\n        }\n\n        public void Dispose()\n        {\n            var buffer = (byte[])_p.Target;\n            _pool.Return(buffer);\n            _p.Free();\n            _p = default(GCHandle);\n        }\n\n        public PointerSpan WrittenSpan => new PointerSpan((byte*)_p.AddrOfPinnedObject(), _writeLength);\n        public PointerSpan FreeSpan => new PointerSpan((byte*)_p.AddrOfPinnedObject() + _writeLength, _length - _writeLength);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BufferPerformance/BufferPerformance/Buffers/BufferE.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace BufferPerformance.Buffers\n{\n    unsafe struct BufferE : IBuffer<PointerSpan>\n    {\n        private byte* _p;\n        private int _length;\n        private int _writeLength;\n\n        public BufferE(int capacity)\n        {\n            _length = capacity;\n            _p = (byte*)Marshal.AllocCoTaskMem(capacity);\n            _writeLength = 0;\n        }\n\n        public void Reserve(int length)\n        {\n            if (_writeLength + length >= _length)\n            {\n                var newLength = Math.Max(_length * 2, length);\n                var p = (byte*)Marshal.AllocCoTaskMem(newLength);\n\n                Buffer.MemoryCopy(_p, p, newLength, _writeLength);\n                Marshal.FreeCoTaskMem((IntPtr)_p);\n\n                _p = p;\n                _length = newLength;\n            }\n        }\n        public void Skip(int length) => _writeLength += length;\n\n        public unsafe void Append(byte* data, int length)\n        {\n            Reserve(length);\n            Buffer.MemoryCopy(data, _p + _writeLength, _length - _writeLength, length);\n            Skip(length);\n        }\n\n        public void Dispose()\n        {\n            Console.WriteLine(\"b\");\n            Marshal.FreeCoTaskMem((IntPtr)_p);\n            _p = default(byte*);\n            Console.WriteLine(\"c\");\n        }\n\n        public PointerSpan WrittenSpan => new PointerSpan(_p, _writeLength);\n        public PointerSpan FreeSpan => new PointerSpan(_p + _writeLength, _length - _writeLength);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BufferPerformance/BufferPerformance/Buffers/IBuffer.cs",
    "content": "﻿using System;\n\nnamespace BufferPerformance.Buffers\n{\n    interface IBuffer<TSpan> : IDisposable\n        where TSpan : IByteSpan\n    {\n        void Reserve(int length);\n        void Skip(int length);\n        unsafe void Append(byte* data, int length);\n        TSpan WrittenSpan { get; }\n        TSpan FreeSpan { get; }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BufferPerformance/BufferPerformance/Buffers/IByteSpan.cs",
    "content": "﻿namespace BufferPerformance.Buffers\n{\n    interface IByteSpan\n    {\n        ref byte this[int index] { get; }\n        int Length { get; }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BufferPerformance/BufferPerformance/Buffers/PointerSpan.cs",
    "content": "﻿namespace BufferPerformance.Buffers\n{\n    unsafe struct PointerSpan : IByteSpan\n    {\n        byte* _pointer;\n        int _length;\n        public PointerSpan(byte* pointer, int length)\n        {\n            _pointer = pointer;\n            _length = length;\n        }\n        public ref byte this[int index] => ref _pointer[index];\n        public int Length => _length;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BufferPerformance/BufferPerformance/Program.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing BufferPerformance.Buffers;\nusing System;\n\nnamespace BufferPerformance\n{\n    [MemoryDiagnoser]\n    public class Program\n    {\n        const int Loop = 1000;\n        const int Size = 500;\n        const int DefaultCapacity = Loop * Size / 4;\n\n        unsafe static void Main()\n        {\n            //Console.WriteLine(ReadWriteBuffer<BufferA, ArraySpan>(new BufferA(DefaultCapacity)));\n            //Console.WriteLine(ReadWriteBuffer<BufferB, ArraySpan>(new BufferB(DefaultCapacity)));\n            //Console.WriteLine(ReadWriteBuffer<BufferC, PointerSpan>(new BufferC(DefaultCapacity)));\n            //Console.WriteLine(ReadWriteBuffer<BufferD, PointerSpan>(new BufferD(DefaultCapacity)));\n            Console.WriteLine(ReadWriteBuffer<BufferE, PointerSpan>(new BufferE(DefaultCapacity)));\n\n            //for (int i = 0; i < 1000; i++)\n            //{\n            //    ReadWriteBuffer<BufferB, ArraySpan>(new BufferB(DefaultCapacity));\n            //}\n\n            //for (int i = 0; i < 1000; i++)\n            //{\n            //    Console.WriteLine(XXX<BufferC, PointerSpan>(new BufferC(DefaultCapacity)));\n            //    Console.WriteLine(GC.GetTotalMemory(true));\n            //}\n\n            //BenchmarkRunner.Run<Program>();\n        }\n\n        [Benchmark] public void A() => ReadWriteBuffer<BufferA, ArraySpan>(new BufferA(DefaultCapacity));\n        [Benchmark] public void B() => ReadWriteBuffer<BufferB, ArraySpan>(new BufferB(DefaultCapacity));\n        [Benchmark] public void C() => ReadWriteBuffer<BufferC, PointerSpan>(new BufferC(DefaultCapacity));\n        [Benchmark] public void D() => ReadWriteBuffer<BufferD, PointerSpan>(new BufferD(DefaultCapacity));\n        [Benchmark] public void E() => ReadWriteBuffer<BufferE, PointerSpan>(new BufferE(DefaultCapacity));\n\n        static int ReadWriteBuffer<TBuffer, TSpan>(TBuffer buffer)\n            where TBuffer : IBuffer<TSpan>\n            where TSpan : IByteSpan\n        {\n            using (buffer)\n            {\n                for (int i = 0; i < Loop; i++)\n                {\n                    buffer.Reserve(Size);\n                    var s = buffer.FreeSpan;\n                    for (int j = 0; j < Size; j++)\n                    {\n                        s[j] = (byte)j;\n                    }\n                    buffer.Skip(Size);\n                        Console.WriteLine(\"a \" + i);\n                }\n\n                var w = buffer.WrittenSpan;\n                var sum = 0;\n                for (int j = 0; j < w.Length; j++)\n                {\n                    sum += w[j];\n                }\n                return sum;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/BufferPerformance/BufferPerformance.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26510.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BufferPerformance\", \"BufferPerformance\\BufferPerformance.csproj\", \"{805F0010-9790-4E6B-9D9A-4599F557A636}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{805F0010-9790-4E6B-9D9A-4599F557A636}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{805F0010-9790-4E6B-9D9A-4599F557A636}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{805F0010-9790-4E6B-9D9A-4599F557A636}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{805F0010-9790-4E6B-9D9A-4599F557A636}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/01 Tuples/01.cs",
    "content": "﻿using System;\nusing System.Linq;\n\nnamespace ConsoleApp1._01_Tuples\n{\n    class _01\n    {\n        /// <summary>\n        /// C# 6コード\n        /// </summary>\n        public static void Run()\n        {\n            var data = Enumerable.Range(0, 10000).ToArray();\n\n            // この辺りを「メソッド抽出」すると…\n            var count = 0;\n            var sum = 0;\n            foreach (var x in data)\n            {\n                count++;\n                sum += x;\n            }\n\n            Console.WriteLine($\"{count} {sum}\");\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/01 Tuples/02.cs",
    "content": "﻿using System;\nusing System.Linq;\n\nnamespace ConsoleApp1._01_Tuples\n{\n    class _02\n    {\n        public static void Run()\n        {\n            var data = Enumerable.Range(0, 10000).ToArray();\n\n            // deconstruction に変更\n            var (count, sum) = Tally(data);\n\n            Console.WriteLine($\"{count} {sum}\");\n        }\n\n        // out 引数をタプルに変更\n        // 引数っぽい書き方\n        private static (int count, int sum) Tally(int[] data)\n        {\n            var count = 0;\n            var sum = 0;\n            foreach (var x in data)\n            {\n                count++;\n                sum += x;\n            }\n\n            return (count, sum);\n\n            // 引数っぽい書き方いくつか\n            // 名前付き\n            return (count: 1, sum: 2);\n\n            // 変数宣言(型の明示)\n            (int count, int sum) t = (1, 2);\n            return t;\n\n            // キャスト\n            return ((int count, int sum))(1, 2);\n        }\n\n        /* ちなみに、匿名型 new { count = 1, sum = 2 } みたいなのとの差\n         *\n         *           タプル                 匿名型\n         * 主な用途  多値戻り値              部分的なメンバー抜き出し\n         * 展開結果  ValueTuple構造体＋属性  クラスの生成\n         * 型の種類  値型                    参照型\n         * 見た目    引数の書き方に似ている   オブジェクト初期化子の書き方に似ている\n         *\n         * 概ね、「用途が違えば最適な実装も違う」という感じ。\n         */\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/01 Tuples/03.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace ConsoleApp1._01_Tuples\n{\n    class _03\n    {\n        public static async void Run()\n        {\n            var data = Enumerable.Range(0, 10000).ToArray();\n\n            var (count, sum) = await Tally(data);\n\n            Console.WriteLine($\"{count} {sum}\");\n        }\n\n        // 非同期にもしやすい\n        // ここでは書いてないけども、イテレーターにも\n        private static async Task<(int count, int sum)> Tally(int[] data)\n        {\n            await Task.Delay(1);\n\n            var count = 0;\n            var sum = 0;\n            foreach (var x in data)\n            {\n                count++;\n                sum += x;\n            }\n\n            return (count, sum);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/01 Tuples/04 Extensions-1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ConsoleApp1._01_Tuples\n{\n    static class Extensions1\n    {\n        // 実用の例。タプルを使った拡張メソッドを3つほど紹介\n        // 1つ目\n        public static void Run()\n        {\n            // インデックス付き foreach\n            foreach (var (x, i) in new[] { 1, 2, 3, 4, 5 }.Indexed())\n            {\n                Console.WriteLine($\"{x}, {i}\");\n            }\n        }\n\n        // インデックス付きで foreach するための拡張メソッド\n        public static IEnumerable<(T item, int index)> Indexed<T>(this IEnumerable<T> items)\n        {\n            var i = 0;\n            foreach (var x in items)\n            {\n                yield return (x, i);\n                ++i;\n            }\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/01 Tuples/04 Extensions-2.cs",
    "content": "﻿using System.Runtime.CompilerServices;\nusing System.Threading.Tasks;\n\nnamespace ConsoleApp1._01_Tuples\n{\n    static class Extensions2\n    {\n        // 実用の例。タプルを使った拡張メソッドを3つほど紹介\n        // 2つ目\n        public static async Task Run()\n        {\n            // 複数の Task をタプルを使って await\n            await (Task.Delay(1), Task.Delay(1));\n        }\n\n        // タプル用の GetAwaiter\n        public static TaskAwaiter GetAwaiter(this (Task t1, Task t2) t) => Task.WhenAll(t.t1, t.t2).GetAwaiter();\n    }\n}"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/01 Tuples/04 Extensions-3.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ConsoleApp1._01_Tuples\n{\n    static class Extensions3\n    {\n        // 実用の例。タプルを使った拡張メソッドを3つほど紹介\n        // 3つ目\n        public static void Run()\n        {\n            // 配列 ×2 なタプルに対して、IEnumerable ×2 タプルの拡張メソッドを呼べる\n            var x = (new[] { 1, 2, 3 }, new[] { \"a\", \"b\", \"c\" }).Zip();\n\n            foreach (var (i, s) in x)\n            {\n                Console.WriteLine($\"{i}: {s}\");\n            }\n        }\n\n        // 2つの IEnumerable を Zip\n        public static IEnumerable<(T x, U y)> Zip<T, U>(this (IEnumerable<T> x, IEnumerable<U> y) source) => source.x.Zip(source.y, (x, y) => (x, y));\n    }\n}"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/01 Tuples/05 Performance.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\n\nnamespace ConsoleApp1._01_Tuples\n{\n    class Performance\n    {\n        // 実用の例\n        // LINQのCountとかSumとかは、1つ1つループするけど、ループのオーバーヘッドが結構大きい\n        // CountとSumとか、同時に集計する方が速いものを、タプルで返すように\n        public static void Run()\n        {\n            var data = Enumerable.Range(0, 10000).ToArray();\n\n            // 実行時間を計測\n            void measure(Func<int[], (int count, int sum, double average, int min, int max)> a)\n            {\n                var sw = new Stopwatch();\n                sw.Start();\n\n                var r = a(data);\n\n                sw.Stop();\n                Console.WriteLine($\"{sw.Elapsed} {r}\");\n            }\n\n            // Count, Sum, ... を個別に、合計5ループで計算\n            measure(x =>\n            {\n                var count = x.Count();\n                var sum = x.Sum();\n                var ave = x.Average();\n                var min = x.Min();\n                var max = x.Max();\n                return (count, sum, ave, min, max);\n            });\n\n            // 1ループでまとめて計算\n            measure(Tally);\n        }\n\n        static (int count, int sum, double average, int min, int max) Tally(IEnumerable<int> data)\n        {\n            var count = 0;\n            var sum = 0;\n            var min = int.MaxValue;\n            var max = int.MinValue;\n\n            foreach (var x in data)\n            {\n                count++;\n                sum += x;\n                if (min > x) min = x;\n                if (max < x) max = x;\n            }\n\n            return (count, sum, sum / (double)count, min, max);\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/01 Tuples/06 Implementation.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1._01_Tuples\n{\n    class Implementation\n    {\n        // 元\n        public static void X1()\n        {\n            var (a, b) = Y1(1, 2);\n            (a, b) = (b, a);\n\n            var longTuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);\n            Console.WriteLine(longTuple.Item10);\n        }\n\n        public static (int a, int b) Y1(int x, int y) => (x + y, x - y);\n\n        // ↓\n\n        public static void X2()\n        {\n            //var (a, b) = Y1(1, 2);\n            // 普通に2行の変数宣言に展開\n            var t = Y2(1, 2);\n            var a = t.Item1;\n            var b = t.Item2;\n\n            //(a, b) = (b, a);\n            // 単純にタプル作成 → 分解 \n            var temp = new ValueTuple<int, int>(b, a);\n            a = temp.Item1;\n            b = temp.Item2;\n\n            //var longTuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);\n            // ValueTuple<> は8引数までしかない\n            // それを超えた分は再帰的に展開\n            var longTuple = new ValueTuple<int, int, int, int, int, int, int, ValueTuple<int, int, int>>(1, 2, 3, 4, 5, 6, 7, new ValueTuple<int, int, int>(8, 9, 10));\n\n            //Console.WriteLine(longTuple.Item10);\n            // Item10っていうメンバーも本来は持ってない。再帰的に展開\n            Console.WriteLine(longTuple.Rest.Item3);\n        }\n\n        // この属性、C# 7だと「タプル構文を使え」というエラーになる\n        //[TupleElementNames(new[] { \"a\", \"b\" })]\n        public static ValueTuple<int, int> Y2(int x, int y) => ValueTuple.Create(x + y, x - y);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/01 Tuples/07 KnownIssue.cs",
    "content": "﻿using System.Linq;\n\nnamespace ConsoleApp1._01_Tuples\n{\n    class KnownIssue\n    {\n        public static void Run()\n        {\n            var data = Enumerable.Range(0, 10000).ToArray();\n\n            // sum と count の順番間違えてる\n            // 今のところ警告も何もなし(将来追加予定)\n            var (sum, count) = Tally(data);\n        }\n\n        /// <summary>\n        /// docコメントを書いてみると…\n        /// </summary>\n\n        // 期待するもの\n\n        /// <param name=\"data\"></param>\n        /// <returns name=\"count\"></returns>\n        /// <returns name=\"sum\"></returns>\n\n        // 実際\n\n        /// <param name=\"data\"></param>\n        /// <returns></returns>\n        private static (int count, int sum) Tally(int[] data)\n        {\n            var count = 0;\n            var sum = 0;\n            foreach (var x in data)\n            {\n                count++;\n                sum += x;\n            }\n\n            return (count, sum);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/01-1 ExpressionBodied/01.cs",
    "content": "﻿using System;\nusing static System.Math;\n\nnamespace ConsoleApp1._01_ExpressionBodied1\n{\n    // コンストラクター、デストラクター、プロパティの set/get、イベントの add/remove でも\n    // => を使えるようになった\n    // タプルとの組み合わせが結構有効なのでここで紹介\n    class Point\n    {\n        public double X { get; set; }\n        public double Y { get; set; }\n\n        public Point(double x, double y)\n        {\n            X = x;\n            Y = y;\n        }\n\n        ~Point()\n        {\n            Console.WriteLine(\"destructor\");\n        }\n\n        public double Radius\n        {\n            get { return Sqrt(X * X + Y * Y); }\n            set\n            {\n                X = value * Cos(Theta);\n                Y = value * Sin(Theta);\n            }\n        }\n\n        public double Theta\n        {\n            get { return Atan2(Y, X); }\n            set\n            {\n                X = Radius * Cos(value);\n                Y = Radius * Sin(value);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/01-1 ExpressionBodied/02.cs",
    "content": "﻿using System;\nusing static System.Math;\n\nnamespace ConsoleApp1._01_ExpressionBodied2\n{\n    class Point\n    {\n        public double X { get; set; }\n        public double Y { get; set; }\n\n        // タプル・分解と組み合わせればコンストラクターも1行に (=> を使える)\n        public Point(double x, double y) => (X, Y) = (x, y);\n\n        ~Point() => Console.WriteLine(\"destructor\");\n\n        // set, get 個別に => を使えるように\n        public double Radius\n        {\n            get => Sqrt(X * X + Y * Y);\n            set => (X, Y) = (value * Cos(Theta), value * Sin(Theta));\n        }\n\n        public double Theta\n        {\n            get => Atan2(Y, X);\n            set => (X, Y) = (Radius * Cos(value), Radius * Sin(value));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/02 Patterns/01.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ConsoleApp1._02_Patterns\n{\n    class _01\n    {\n        public static void Run()\n        {\n            var d = new Dictionary<int, object>\n            {\n                [1] = 1,\n                [3] = new[] { 1, 2, 3 },\n                [5] = null,\n            };\n\n            KeyValuePair<int, object> f = d.First();\n            Console.WriteLine(f.Key);\n\n            var sum = 0;\n            foreach (var x in d)\n            {\n                if (x.Value is int) sum += (int)x.Value;\n\n                var a = x.Value as int[];\n                if (a != null) sum += a.Sum();\n            }\n\n            object v;\n            if (d.TryGetValue(1, out v))\n            {\n                Console.WriteLine(v);\n            }\n\n            string line;\n            while (!string.IsNullOrEmpty((line = Console.ReadLine())))\n            {\n                Console.WriteLine(line);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/02 Patterns/02.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ConsoleApp1._02_Patterns\n{\n    class _02\n    {\n        public static void Run()\n        {\n            var d = new Dictionary<int, object>\n            {\n                [1] = 1,\n                [3] = new[] { 1, 2, 3 },\n                [5] = null,\n            };\n\n            // 分解はタプルでなくても、所定のパターンを満たしたものなら何にでも使える\n            var (key, value) = d.First();\n            Console.WriteLine(key);\n\n            // ちなみに、↑は、↓みたいに展開されてる\n            d.First().Deconstruct(out key, out value);\n\n            var sum = 0;\n            foreach (var x in d)\n            {\n                if (x.Value is int) sum += (int)x.Value;\n\n                var a = x.Value as int[];\n                if (a != null) sum += a.Sum();\n            }\n\n            object v;\n            if (d.TryGetValue(1, out v))\n            {\n                Console.WriteLine(v);\n            }\n\n            string line;\n            while (!string.IsNullOrEmpty((line = Console.ReadLine())))\n            {\n                Console.WriteLine(line);\n            }\n        }\n    }\n\n    static class KeyValuePairExtensions\n    {\n        // Deconstruct って名前のメソッドがあれば分解できる\n        // ついでに: タプル+分解と、 => メソッドが結構相性いい\n        public static void Deconstruct<TKey, TValue>(this KeyValuePair<TKey, TValue> x, out TKey key, out TValue value) => (key, value) = (x.Key, x.Value);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/02 Patterns/03.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ConsoleApp1._02_Patterns\n{\n    class _03\n    {\n        public static void Run()\n        {\n            var d = new Dictionary<int, object>\n            {\n                [1] = 1,\n                [3] = new[] { 1, 2, 3 },\n                [5] = null,\n            };\n\n            {\n                var (key, value) = d.First();\n                Console.WriteLine(key);\n            }\n\n            // foreach でも分解可能\n            var sum = 0;\n            foreach (var (key, value) in d)\n            {\n                if (value is int) sum += (int)value;\n\n                var a = value as int[];\n                if (a != null) sum += a.Sum();\n            }\n\n            object v;\n            if (d.TryGetValue(1, out v))\n            {\n                Console.WriteLine(v);\n            }\n\n            string line;\n            while (!string.IsNullOrEmpty((line = Console.ReadLine())))\n            {\n                Console.WriteLine(line);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/02 Patterns/04.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ConsoleApp1._02_Patterns\n{\n    class _04\n    {\n        public static void Run()\n        {\n            var d = new Dictionary<int, object>\n            {\n                [1] = 1,\n                [3] = new[] { 1, 2, 3 },\n                [5] = null,\n            };\n\n            {\n                var (key, value) = d.First();\n                Console.WriteLine(key);\n            }\n\n            var sum = 0;\n            foreach (var (key, value) in d)\n            {\n                // is の後ろで変数に受けれる\n                if (value is int n) sum += n;\n                if (value is int[] a) sum += a.Sum();\n\n                // switch も可\n#if false\n                switch (value)\n                {\n                    case int n: sum += n;\n                    case int[] a: sum += a.Sum();\n                }\n#endif\n            }\n\n            object v;\n            if (d.TryGetValue(1, out v))\n            {\n                Console.WriteLine(v);\n            }\n\n            string line;\n            while (!string.IsNullOrEmpty((line = Console.ReadLine())))\n            {\n                Console.WriteLine(line);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/02 Patterns/05.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ConsoleApp1._02_Patterns\n{\n    class _05\n    {\n        public static void Run()\n        {\n            var d = new Dictionary<int, object>\n            {\n                [1] = 1,\n                [3] = new[] { 1, 2, 3 },\n                [5] = null,\n            };\n\n            {\n                var (key, value) = d.First();\n                Console.WriteLine(key);\n            }\n\n            var sum = 0;\n            foreach (var (key, value) in d)\n            {\n                if (value is int n) sum += n;\n                if (value is int[] a) sum += a.Sum();\n            }\n\n            // out 引数のところで変数に受けれる\n            if (d.TryGetValue(1, out var v))\n            {\n                Console.WriteLine(v);\n            }\n\n            string line;\n            while (!string.IsNullOrEmpty((line = Console.ReadLine())))\n            {\n                Console.WriteLine(line);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/02 Patterns/06.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ConsoleApp1._02_Patterns\n{\n    class _06\n    {\n        public static void Run()\n        {\n            var d = new Dictionary<int, object>\n            {\n                [1] = 1,\n                [3] = new[] { 1, 2, 3 },\n                [5] = null,\n            };\n\n            {\n                var (key, value) = d.First();\n                Console.WriteLine(key);\n            }\n\n            var sum = 0;\n            foreach (var (key, value) in d)\n            {\n                if (value is int n) sum += n;\n                if (value is int[] a) sum += a.Sum();\n            }\n\n            if (d.TryGetValue(1, out var v))\n            {\n                Console.WriteLine(v);\n            }\n\n            // while の条件式の中とかでも\n            // is の後ろでも var 利用可能\n            while (Console.ReadLine() is var line && !string.IsNullOrEmpty(line))\n            {\n                Console.WriteLine(line);\n            }\n            // line のスコープは漏れない(元のコードだと漏れてる)\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/02 Patterns/07.cs",
    "content": "﻿using System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ConsoleApp1._02_Patterns\n{\n    class _07\n    {\n        public static void Run()\n        {\n            var d = new Dictionary<int, object>\n            {\n                [1] = 1,\n                [3] = new[] { 1, 2, 3 },\n                [5] = null,\n            };\n\n            // 使わない値は _ で受ければ無視できる\n            var (key, _) = d.First();\n            Console.WriteLine(key);\n\n            // _ なら、同じスコープに複数書いても大丈夫\n            // _ は変数にならない = その後参照できない\n            // ちょっと見づらいけど、 _ のところは青色(キーワードと同じ色)になってて、特別なことがわかる\n            var sum = 0;\n            foreach (var (_, value) in d)\n            {\n                if (value is int n) sum += n;\n                if (value is int[] a) sum += a.Sum();\n            }\n\n            if (d.TryGetValue(1, out var v))\n            {\n                Console.WriteLine(v);\n            }\n\n            // out に対しても _ 利用可能\n            var cd = new ConcurrentDictionary<int, int>();\n            cd.TryRemove(1, out _);\n\n            while (Console.ReadLine() is var line && !string.IsNullOrEmpty(line))\n            {\n                Console.WriteLine(line);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/02 Patterns/08-0 Node.cs",
    "content": "﻿namespace ConsoleApp1._02_Patterns\n{\n    abstract partial class Node { }\n\n    partial class Var : Node { }\n\n    partial class Const : Node\n    {\n        public int Value { get; }\n        public Const(int value) { Value = value; }\n    }\n\n    partial class Add : Node\n    {\n        public Node X { get; set; }\n        public Node Y { get; set; }\n        public Add(Node x, Node y) { X = x; Y = y; }\n    }\n\n    partial class Mul : Node\n    {\n        public Node X { get; set; }\n        public Node Y { get; set; }\n        public Mul(Node x, Node y) { X = x; Y = y; }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/02 Patterns/08-1 virtual.cs",
    "content": "﻿namespace ConsoleApp1._02_Patterns\n{\n    // 仮想メソッドで実装する例\n    // 〇 それなりに高速\n    // 〇 クラスに変更があったとき、このメソッドの実装者が変更に気づきやすい\n    // × クラスの中にないといけない/クラス実装者にしか足せない\n    abstract partial class Node\n    {\n        public virtual Node Reduce() => this;\n    }\n\n    partial class Add : Node\n    {\n        public override Node Reduce()\n        {\n            var x = X.Reduce();\n            var y = Y.Reduce();\n\n            if (x is Const cx)\n                if (cx.Value == 0) return y;\n                else if (y is Const cy1) return new Const(cx.Value + cy1.Value);\n            if (y is Const cy)\n                if (cy.Value == 0) return x;\n                else if (x is Const cx1) return new Const(cx1.Value + cy.Value);\n            return new Add(x, y);\n        }\n    }\n\n    partial class Mul : Node\n    {\n        public override Node Reduce()\n        {\n            var x = X.Reduce();\n            var y = Y.Reduce();\n\n            if (x is Const cx)\n                if (cx.Value == 0) return new Const(0);\n                else if (cx.Value == 1) return y;\n                else if (y is Const cy1) return new Const(cx.Value * cy1.Value);\n            if (y is Const cy)\n                if (cy.Value == 0) return new Const(0);\n                else if (cy.Value == 1) return x;\n                else if (x is Const cx1) return new Const(cx1.Value * cy.Value);\n            return new Mul(x, y);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/02 Patterns/08-2 pattern.cs",
    "content": "﻿namespace ConsoleApp1._02_Patterns\n{\n    // 拡張メソッド + 型スイッチで実装する例\n    // 〇 クラスの外に書ける/別の人が書ける\n    // × クラスに変更があったとき、このメソッドの実装者が変更に気づきにくい\n    // × 多少オーバーヘッドあり\n    static class NodeExtensions\n    {\n        public static Node Reduce(this Node n)\n        {\n            // 一か所にコードが集まってることが利点になることもある。コード分量次第。ｚ\n            switch (n)\n            {\n                case Add a:\n                    {\n                        var x = a.X.Reduce();\n                        var y = a.Y.Reduce();\n\n                        if (x is Const cx)\n                            if (cx.Value == 0) return y;\n                            else if (y is Const cy1) return new Const(cx.Value + cy1.Value);\n                        if (y is Const cy)\n                            if (cy.Value == 0) return x;\n                            else if (x is Const cx1) return new Const(cx1.Value + cy.Value);\n                        return new Add(x, y);\n                    }\n                case Mul m:\n                    {\n                        var x = m.X.Reduce();\n                        var y = m.Y.Reduce();\n\n                        if (x is Const cx)\n                            if (cx.Value == 0) return new Const(0);\n                            else if (cx.Value == 1) return y;\n                            else if (y is Const cy1) return new Const(cx.Value * cy1.Value);\n                        if (y is Const cy)\n                            if (cy.Value == 0) return new Const(0);\n                            else if (cy.Value == 1) return x;\n                            else if (x is Const cx1) return new Const(cx1.Value * cy.Value);\n                        return new Mul(x, y);\n                    }\n\n                default:\n                    return n;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/02-1 ThrowExpression/01.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ConsoleApp1._02_1_ThrowExpression\n{\n    // throw を式中に書けるようになった (これまではステートメント)\n    // ただし、書けるのは以下の3つの状況のみ。\n    //   ?? の2項目\n    //   ?: の2、3項目\n    //   => 直後\n\n    // out var とかパターン マッチングとの相性がいいのでこのタイミングで紹介\n\n    class _01\n    {\n        // 値を返すときは => が使えたのに\n        public int GetValue() => 1;\n        // これまで例外を投げたいときは {} 必須だった\n        public void Never() { throw new InvalidOperationException(); }\n\n        public static void Run()\n        {\n            // ラムダ式でも同様\n            Action a = () => { throw new InvalidOperationException(); };\n        }\n\n        static int X(int? x)\n        {\n            // null チェック用の if\n            if (x == null) throw new ArgumentNullException(nameof(x), \"my error message\");\n            return (int)x;\n        }\n\n        static int ParsePositive(string s)\n        {\n            // TryParse + ちょっとした条件\n            int x;\n            if (int.TryParse(s, out x) && x > 0) return x;\n            throw new ArgumentOutOfRangeException();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/02-1 ThrowExpression/02.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ConsoleApp1._02_1_ThrowExpression\n{\n    // throw を式中に書けるようになった (これまではステートメント)\n    // ただし、書けるのは以下の3つの状況のみ。\n    //   ?? の2項目\n    //   ?: の2、3項目\n    //   => 直後\n\n    class _02\n    {\n        // 値を返すときは => が使えたのに\n        public int GetValue() => 1;\n        // 例外でも => が使える\n        public void Never() => throw new InvalidOperationException();\n\n        public static void Run()\n        {\n            // ラムダ式でも同様\n            Action a = () => throw new InvalidOperationException();\n        }\n\n        static int X(int? x) => x ?? throw new ArgumentNullException(nameof(x), \"my error message\");\n\n        static int ParsePositive(string s)\n            => int.TryParse(s, out var x) && x > 0\n            ? x\n            : throw new ArgumentOutOfRangeException();\n\n        // 将来的に switch 相当の式も入る予定で、それとの組み合わせも有効\n#if false\n        public static int Switch(object x)\n            => x match (\n                case int n => n,\n                case int[] a => a.Sum(),\n                default => throw new IndexOutOfRangeException()\n            );\n#endif\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/03 LocalFunctions/00.csx",
    "content": "﻿// C# Interactive 実行\n\n// ステートメント(メソッド内に書く書き方)\nvar n = 10;\n\n// と並べて、メソッド定義を書ける\nint f(int x) => n * x;\n\nf(5)\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/03 LocalFunctions/01.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ConsoleApp1._03_LocalFunctions\n{\n    // C# Interactiveのついなので、ローカル関数の導入自体は割と低コスト\n    // ラムダ式に対して出ていた要望のいくつかが、ローカル関数なら解決できる\n\n    static class _01\n    {\n        static event EventHandler<int> SomeEvent;\n\n        public static void Run()\n        {\n            // イベントを1回限り受け取る\n            EventHandler<int> handler = null;\n            handler = (sender, arg) =>\n            {\n                Console.WriteLine(\"1回きりの処理\");\n                SomeEvent -= handler;\n            };\n            SomeEvent += handler;\n\n            // 再帰呼び出し\n            Func<int, int> factorial = null;\n            factorial = x => x <= 1 ? 1 : x * factorial(x - 1);\n        }\n\n        static IEnumerable<(T item, int index)> Indexed<T>(this IEnumerable<T> source)\n        {\n            if (source == null) throw new ArgumentNullException(nameof(source));\n\n            return IndexedInternal(source);\n        }\n\n        // Indexed からしか呼ばないから隠したい\n        // でも、ラムダ式では yield return が使えない\n        static IEnumerable<(T item, int index)> IndexedInternal<T>(this IEnumerable<T> source)\n        {\n            var i = 0;\n            foreach (var x in source)\n            {\n                yield return (x, i);\n                ++i;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/03 LocalFunctions/02.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ConsoleApp1._03_LocalFunctions\n{\n    static class _02\n    {\n        static event EventHandler<int> SomeEvent;\n\n        public static void Run()\n        {\n            // 再帰とかイベント -= とか\n            // 一度 = null してから別の行で定義とかしなくてよくなる\n            void handler(object sender, int arg)\n            {\n                Console.WriteLine(\"1回きりの処理\");\n                SomeEvent -= handler;\n            }\n            SomeEvent += handler;\n\n            int factorial(int x) => x <= 1 ? 1 : x * factorial(x - 1);\n        }\n\n        static IEnumerable<(T item, int index)> Indexed<T>(this IEnumerable<T> source)\n        {\n            if (source == null) throw new ArgumentNullException(nameof(source));\n\n            return IndexedInternal(source);\n        }\n\n        static IEnumerable<(T item, int index)> IndexedInternal<T>(this IEnumerable<T> source)\n        {\n            var i = 0;\n            foreach (var x in source)\n            {\n                yield return (x, i);\n                ++i;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/03 LocalFunctions/03.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ConsoleApp1._03_LocalFunctions\n{\n    static class _03\n    {\n        static event EventHandler<int> SomeEvent;\n\n        public static void Run()\n        {\n            void handler(object sender, int arg)\n            {\n                Console.WriteLine(\"1回きりの処理\");\n                SomeEvent -= handler;\n            }\n            SomeEvent += handler;\n\n            int factorial(int x) => x <= 1 ? 1 : x * factorial(x - 1);\n        }\n\n        static IEnumerable<(T item, int index)> Indexed<T>(this IEnumerable<T> source)\n        {\n            if (source == null) throw new ArgumentNullException(nameof(source));\n\n            // ローカルでしか使わないものはローカルで定義\n            IEnumerable<(T item, int index)> f()\n            {\n                var i = 0;\n                foreach (var x in source)\n                {\n                    yield return (x, i);\n                    ++i;\n                }\n            }\n\n            return f();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/03 LocalFunctions/04 Performance.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1._03_LocalFunctions\n{\n    class Performance\n    {\n        public static void Run()\n        {\n            // ラムダ式でローカル変数をキャプチャすると、ヒープ確保発生\n            // (コンパイラーがクラスを1個生成して、new する)\n            var memory = GC.GetTotalMemory(false);\n\n            for (int i = 0; i < 1000; i++)\n            {\n                int a = 0; // キャプチャするための適当なローカル変数\n                Action<int> f = x => a += x;\n                f(10);\n            }\n\n            Console.WriteLine(GC.GetTotalMemory(false) - memory);\n\n            // ローカル関数でローカル変数をキャプチャすると発生しない\n            // (コンパイラーが構造体を1個生成して、ref 渡しする)\n            memory = GC.GetTotalMemory(false);\n\n            for (int i = 0; i < 1000; i++)\n            {\n                int a = 0; // キャプチャするための適当なローカル変数\n                void f(int x) => a += x;\n                f(10);\n            }\n\n            Console.WriteLine(GC.GetTotalMemory(false) - memory);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/04 Ref/01.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1._04_Ref01\n{\n    // ref を、戻り値とローカル変数でも使えるように\n    // 主な用途:\n    // - いくつかのアルゴリズムで、参照先を条件分岐で切り替えたい場面がある\n    // - 構造体の有効活用\n    // - native/unsafeコードとの連携\n    // いずれにしても、パフォーマンス改善に有効\n\n    struct Vector3\n    {\n        public int X;\n        public int Y;\n        public int Z;\n    }\n\n    static class VectorExtensions\n    {\n        // ベクトル計算時に、X, Y, Z 座標を 0, 1, 2 のインデックスで読み書きしたいことがある\n        public static int Get(ref Vector3 v, int index)\n        {\n            switch (index)\n            {\n                case 0: return v.X;\n                case 1: return v.Y;\n                case 2: return v.Z;\n                default: throw new ArgumentOutOfRangeException();\n            }\n        }\n\n        public static void Set(ref Vector3 v, int index, int value)\n        {\n            switch (index)\n            {\n                case 0: v.X = value; break;\n                case 1: v.Y = value; break;\n                case 2: v.Z = value; break;\n                default: throw new ArgumentOutOfRangeException();\n            }\n        }\n    }\n\n    struct PolyLine\n    {\n        private Vector3[] _points;\n        public PolyLine(int count) => _points = new Vector3[count];\n\n        // 構造体をインデクサー越しに読み書きしたい\n        // p[i].X = 10; みたいな書き方ができない\n        // 配列であればできるのに\n        public Vector3 this[int index]\n        {\n            get => _points[index];\n            set => _points[index] = value;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/04 Ref/02.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1._04_Ref02\n{\n    // - いくつかのアルゴリズムで、参照先を条件分岐で切り替えたい場面がある\n\n    struct Vector3\n    {\n        public int X;\n        public int Y;\n        public int Z;\n    }\n\n    static class VectorExtensions\n    {\n        // ベクトル計算時に、X, Y, Z 座標を 0, 1, 2 のインデックスで読み書きしたいことがある\n        // 読み書き共に頻繁なら、Get, Set を用意するよりも参照を返せるほうが高パフォーマンス\n        public static ref int Ref(ref Vector3 v, int index)\n        {\n            switch (index)\n            {\n                case 0: return ref v.X;\n                case 1: return ref v.Y;\n                case 2: return ref v.Z;\n                default: throw new ArgumentOutOfRangeException();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/04 Ref/03.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1._04_Ref03\n{\n    // - 構造体の有効活用\n\n    struct Vector3\n    {\n        public int X;\n        public int Y;\n        public int Z;\n    }\n\n    struct PolyLine\n    {\n        private Vector3[] _points;\n        public PolyLine(int count) => _points = new Vector3[count];\n\n        // 構造体をインデクサー越しに読み書きしたい\n        // 参照で返すなら、p[i].X = 10; みたいな書き方もできる\n        // 配列と同様\n        public ref Vector3 this[int index] => ref _points[index];\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/04 Ref/04 Unsafe.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace ConsoleApp1._04_Ref\n{\n\n    // ガベコレ管理対象外のヒープを使いたい\n    // 自前でメモリ管理をしたい場面、一般のアプリではほとんどないけど、native相互運用とかしだすとあり得る\n    unsafe struct UnmanagedReference<T> : IDisposable\n        where T : struct\n    {\n        void* _pointer;\n\n        public static UnmanagedReference<T> New() => new UnmanagedReference<T>(Size);\n        static readonly int Size = Unsafe.SizeOf<T>();\n        private UnmanagedReference(int size) => _pointer = (void*)Interop.malloc(size);\n\n        public ref T Value => ref Unsafe.AsRef<T>(_pointer);\n\n        public void Dispose() => Interop.free((IntPtr)_pointer);\n    }\n\n    struct Vector3\n    {\n        public int X;\n        public int Y;\n        public int Z;\n    }\n\n    class _04_Unsafe\n    {\n        public static void Run()\n        {\n            using (var r = UnmanagedReference<Vector3>.New())\n            {\n                ref var v = ref r.Value;\n\n                v.X = 1;\n                v.Y = 1;\n                v.Z = 1;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/04 Ref/05 SystemMemory.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1._04_Ref\n{\n    // System.Memory パッケージ内に Span っていう構造体があって\n    // こいつを使うと、\n    // - (managed な)配列\n    // - ネイティブ ヒープ上のメモリ領域\n    // - スタック(stackalloc したメモリ領域)\n    // などについて、共通処理が書ける。\n    class _05_SystemMemory\n    {\n        public unsafe static void Run()\n        {\n            ArraySpan();\n            MallocSpan();\n            StackallocSpan();\n        }\n\n        const int Length = 4;\n\n        // Span に対する値の書き込み\n        private static void SetValues(Span<int> s)\n        {\n            for (int i = 0; i < Length; i++)\n            {\n                // Span のインデクサーは ref 戻り値になってる\n                ref var x = ref s[i];\n                // Span が参照する先(配列 or ネイティブ ヒープ or スタック領域)が書き換わる\n                x = i;\n            }\n        }\n\n        // 配列からの Span 作成\n        private static unsafe void ArraySpan()\n        {\n            var a = new int[Length];\n            SetValues(new Span<int>(a));\n\n            for (int i = 0; i < Length; i++)\n            {\n                Console.WriteLine(a[i]);\n            }\n        }\n\n        // ネイティブ ヒープからの Span 作成\n        private static unsafe void MallocSpan()\n        {\n            var p = (int*)Interop.malloc(sizeof(int) * Length);\n            SetValues(new Span<int>((void*)p, Length));\n\n            for (int i = 0; i < Length; i++)\n            {\n                Console.WriteLine(p[i]);\n            }\n\n            Interop.free((IntPtr)p);\n        }\n\n        // スタックからの Span 作成\n        private static unsafe void StackallocSpan()\n        {\n            var p = stackalloc int[Length];\n            SetValues(new Span<int>(p, Length));\n\n            for (int i = 0; i < Length; i++)\n            {\n                Console.WriteLine(p[i]);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/05 GeneralizedAsync/01.cs",
    "content": "﻿using System.Threading.Tasks;\n\nnamespace ConsoleApp1._05_GeneralizedAsync\n{\n    class _01\n    {\n        static async Task<int> LoadAsync()\n        {\n            await Task.Delay(500); // ほんとは通信か何かしてる\n            return 123;\n        }\n\n        // 初回だけ通信して、後はローカルにキャッシュした値を読みたい\n        static Task<int> Cache => _cache ?? (_cache = LoadAsync());\n        static Task<int> _cache;\n\n        // キャッシュに依存した何らかの値をとりだす\n        static async Task<int> GetValue(int x) => x * (await Cache);\n\n        // なんども GetValue を呼ぶ\n        public static async Task Run()\n        {\n            for (int x = 0; x < 100000; x++)\n            {\n                var y = await GetValue(x);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/05 GeneralizedAsync/02.cs",
    "content": "﻿using System.Threading.Tasks;\n\nnamespace ConsoleApp1._05_GeneralizedAsync\n{\n    class _02\n    {\n        static async Task<int> LoadAsync()\n        {\n            await Task.Delay(500); // ほんとは通信か何かしてる\n            return 123;\n        }\n\n        static Task<int> Cache => _cache ?? (_cache = LoadAsync());\n        static Task<int> _cache;\n\n        // ここの戻り値をValueTaskに変える\n        // 他は変更なし\n        // ほとんどの場面で完了済みのものを await するときに非常に有効\n        static async ValueTask<int> GetValue(int x) => x * (await Cache);\n\n        public static async Task Run()\n        {\n            for (int x = 0; x < 100000; x++)\n            {\n                var y = await GetValue(x);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/05 GeneralizedAsync/Performance.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.Threading.Tasks;\n\nnamespace ConsoleApp1._05_GeneralizedAsync\n{\n    class Performance\n    {\n        public static void Run()\n        {\n            // キャッシュを効かせるために1回空呼び\n            _01.Run().Wait();\n            _02.Run().Wait();\n\n            // 実行時間を計測 ＆ ヒープ状況を観測\n            void measure(Func<Task> f)\n            {\n                var sw = new Stopwatch();\n                sw.Start();\n                var mem = GC.GetTotalMemory(false);\n\n                f().Wait();\n\n                mem = GC.GetTotalMemory(false) - mem; // ヒープ確保があれば値が変わる(GC 発生で減ることもある)\n                sw.Stop();\n                Console.WriteLine($\"elapsed time: {sw.Elapsed}, heap size: {mem}\");\n                sw.Reset();\n            }\n\n            // Task GetValue の方\n            measure(_01.Run);\n\n            // ValueTask GetValue の方\n            // ヒープ確保が0に。\n            measure(_02.Run);\n\n            // ValueTask は名前通り、構造体\n            // 完了済みのものの await なら Task クラスのインスタンスを作らないんで、ヒープ確保要らない\n            // これが結構有効な場面あり\n\n            // このために、非同期メソッドの戻り値を任意の型にできるようになった\n            // 所定のパターン (async method builder)の実装が必要\n\n            // 他の用途:\n            // - WinRT の IAsyncOperation を返す\n            // - Rx の何かを返す\n            // - await の既定動作を ConfigureAwait(false) 相当にしてしまう\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/06 Digits/01.cs",
    "content": "﻿using System;\nusing System.Text;\n\nnamespace ConsoleApp1._06_Digits\n{\n    enum ByteType\n    {\n        _1, // 1バイト文字\n        _2, // 2バイト文字の先頭\n        _3, // 3バイト文字の先頭\n        _4, // 4バイト文字の先頭\n        Cont, // 多バイト文字の2文字目以降\n    }\n\n    class _01\n    {\n        // UTF8 は各バイトの上位ビットを見れば、何バイト文字なのかわかるようになってる\n        static ByteType GetType(byte c)\n        {\n            // 2進数リテラルの必要性 … こういうビットパターンは10進とか16進だとわかりにくい\n            // 数字区切りの必要性    … 桁が大きな数字は区切りがないと桁を間違う\n            if ((c & 128) == 011) return ByteType._1;\n            if ((c & 192) == 128) return ByteType.Cont;\n            if ((c & 224) == 192) return ByteType._2;\n            if ((c & 240) == 224) return ByteType._3;\n            if ((c & 248) == 240) return ByteType._4;\n            throw new ArgumentOutOfRangeException();\n        }\n\n        public static void Run()\n        {\n            var utf8 = Encoding.UTF8.GetBytes(\"aαあ亜👤🐈\");\n\n            foreach (var c in utf8)\n            {\n                var t = GetType(c);\n                Console.WriteLine((c, t));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/06 Digits/02.cs",
    "content": "﻿using System;\nusing System.Text;\n\nnamespace ConsoleApp1._06_Digits\n{\n    class _02\n    {\n        static ByteType GetType(byte c)\n        {\n            // 2進数リテラル … 0b から始める数値リテラルは2進数になる\n            // 数字区切り … 数字と数字の間に _ を挟める\n            if ((c & 0b1000_0000) == 0b0000_0000) return ByteType._1;\n            if ((c & 0b1100_0000) == 0b1000_0000) return ByteType.Cont;\n            if ((c & 0b1110_0000) == 0b1100_0000) return ByteType._2;\n            if ((c & 0b1111_0000) == 0b1110_0000) return ByteType._3;\n            if ((c & 0b1111_1000) == 0b1111_0000) return ByteType._4;\n            throw new ArgumentOutOfRangeException();\n        }\n\n        // 実際、Utf8String (https://github.com/dotnet/corefxlab/tree/master/src/System.Text.Primitives)が最初の利用者かも\n        // 2進数リテラルが入るまでの間は、\n        const int b1000_0000 = 0x80;\n        // みたいな定数が並んでた\n\n        public static void Run()\n        {\n            var utf8 = Encoding.UTF8.GetBytes(\"aαあ亜👤🐈\");\n\n            foreach (var c in utf8)\n            {\n                var t = GetType(c);\n                Console.WriteLine((c, t));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/07 Future/01 cs71.cs",
    "content": "﻿namespace ConsoleApp1._07_Future._71\n{\n    // C# 7.1 予定リスト\n    // C# 7.0 の積み残し。大体仕様は固まっているけど、工数的な都合で実装されなかっただけ。\n\n#if false\n\n    using System;\n    using System.Threading.Tasks;\n\n    // Auto-Implemented Property Field-Targeted Attributes\n    [Serializable]\n    class SerializableSample\n    {\n        // 実はこいつのバッキングフィールドに NonSerialized 属性を付ける手段がない\n        // ↓書けてるように見えて、コンパイル エラーにならないだけで実は無効(警告は出る)\n        // 7.1 で付けれるように\n        public int Value { get; set; }\n    }\n\n    // Expression variables in initializers\n    class InitSample\n    {\n        public int Value { get; }\n\n        public InitSample(int v) => Value = v;\n        // フィールド初期化子、コンストラクター初期化子などで、今のところ out var など(宣言式)を使えない\n        public InitSample(string s) : this(int.TryParse(s, out var x) ? x : 0) { }\n    }\n\n    // Mix Declarations and Variables in Deconstruction\n    class DeconstructionSample\n    {\n        public static void Run()\n        {\n            var (x, y) = (1, 2); // OK。分解 + 宣言\n            (x, y) = (y, x); // OK。分解 + 代入\n\n            (var t, x) = (10, 20); // 今はダメ。宣言と代入の混在もできるべき\n        }\n    }\n\n    // Discard for lambda parameters (_, _) =>\n    class DiscardSample\n    {\n        public static void Run()\n        {\n            // OK。分解時の discard\n            (_, var x) = (1, 2);\n\n            // OK。out の discard\n            if(int.TryParse(\"abc\", out _))\n                Console.WriteLine(\"parse 成功\");\n\n            // 今はダメ。ラムダ式の引数でも discard 使いたい\n            EventHandler<string> e = (_, _) => Console.WriteLine(\"イベント\");\n        }\n    }\n\n    // Private protected\n    class AccessibilitySample\n    {\n        // どこからでも参照可能\n        public int Public;\n\n        // 派生クラスから参照可能\n        protected int Protected;\n\n        // 同一アセンブリ内から参照可能\n        internal int Internal;\n\n        // このクラス内からだけ参照可能\n        private int Pribate;\n\n        // 派生クラスからも、同一アセンブリ内からも参照可能\n        protected internal int ProtectedOrInternal;\n\n        // 同一アセンブリ内にあって、かつ、派生クラスから参照可能\n        // というアクセス レベルを作りたい\n        private protected int ProtectedAndInternal;\n    }\n\n    // Improved common type\n    class CommonTypeSample\n    {\n        private static Random _rand = new Random();\n        private static bool Rand() => _rand.NextDouble() < 0.5;\n\n        class Base { }\n        class A : Base { }\n        class B : Base { }\n\n        public static void Run()\n        {\n            var r = new Random();\n\n            // null を int? と認識してくれてもいいのに\n            int? x = Rand() ? 1 : null;\n\n            // ちなみに、これならOK\n            int? x1 = Rand() ? (int?)1 : null;\n            int? x2 = Rand() ? 1 : default(int?);\n\n            // A, B の共通項取って、Base と認識してくれてもいいのに\n            Base y = Rand() ? new A() : new B();\n\n            // ちなみに、これならOK\n            Base y1 = Rand() ? (Base)new A() : new B();\n            Base y2 = Rand() ? new A() : (Base)new B();\n        }\n    }\n\n    // \"default\" expression\n    class DefaultExpressionSample\n    {\n        // 両辺に型名を書くのだるい\n        int x0 = default(int);\n        int? y0 = default(int?);\n        string z0 = default(string);\n\n        public static void Run()\n        {\n            // ローカル変数なら、左辺→右辺の型推論が効くけども\n            var x = default(int);\n            var y = default(int?);\n            var z = default(string);\n        }\n\n        // 右辺からの型推論をしたいことがちらほら\n        // 「default 式」を導入したい\n        // 具体的な型は右辺から推論\n        int x = default;\n        int? y = default;\n        string z = default;\n\n        // 同様に、new も右辺から型推論する案あり(7.X)\n        object lockObj = new();\n    }\n\n    class AsyncMainSample\n    {\n        // ここをエントリーポイントにしたい\n        // 今は void でないとエントリーポイントとして認識されない\n        static async Task Main()\n        {\n            await Task.Delay(1);\n        }\n    }\n\n#endif\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/07 Future/02 cs72.cs",
    "content": "﻿namespace ConsoleApp1._07_Future._72\n{\n    // C# 7.2 予定リスト\n    // Span (System.Memory) とか Utf8String (System.Text.Primitives) とかに合わせて\n    // interop シナリオ、生バイナリ操作など、パフォーマンスがらみの機能強化\n\n#if false\n\n    using System;\n    using System.Text.Utf8;\n\n    // blittable\n    struct Point\n    {\n        // こういう、中身がプリミティブだけで構成されてる型は、本来ポインターにできたり、unsafe 的に融通が利く\n        // (C# 仕様書上) Unmanaged 型って呼ばれてる\n        // P/Invoke の文脈的に「blittable」って呼ばれてる。データのブロック転送可能、マーシャリングが低コストな型という意味\n        public int X;\n        public int Y;\n    }\n\n    unsafe class BlittableSample\n    {\n        private Point _point;\n\n        // この通り、非ジェネリックならポインター化可能\n        public Point* Alloc() => (Point*)Interop.malloc(sizeof(Point));\n\n        // ジェネリックだと、今は無理\n        // blittable 制約が欲しい\n        public T* Alloc<T>()\n            where T : blittable\n            => (T*)Interop.malloc(sizeof(Point));\n    }\n\n    // readonly for locals and parameters\n    class ReadonlySample\n    {\n        public static void Run(readonly int x)\n        {\n            x = 1; // 引数の書き換えとかバグの原因だし禁止したい\n\n            let y = x;\n\n            y = 10; // ローカル変数も、意図せず書き換えれないようにしたい\n\n            // 変数宣言に readonly を付けるか\n            // let を使うか\n        }\n    }\n\n    // ref extension methods on structs\n    static class RefExtensionMethodSample\n    {\n        // コピーコストを避けたいって意味だと、拡張メソッドでも構造体を ref 渡ししたい\n        static ref int Min(this ref Point p)\n        {\n            ref int x = ref p.X;\n            ref int y = ref p.Y;\n            if (x < y) return ref x;\n            else return ref y;\n        }\n    }\n\n    // slicing\n    class SlicingSample\n    {\n        public static void Run()\n        {\n            // 近々、System.Memory パッケージってのがリリースされる\n            // 配列の一部分を参照する Span っていうクラスが追加される\n            var array = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };\n            var slice1 = new Span<int>(array).Slice(2, 3); // 2, 3, 4 の部分を「参照」\n\n            // これに対して、C# 構文的にも何かサポートが欲しい\n            var slice2 = array[2:5];\n        }\n    }\n\n    // utf8 string literals\n    class Utf8StringLiteralSample\n    {\n        public static void Run()\n        {\n            // 近々、System.Text.Primitives パッケージってのがリリースされる\n            // UTF8 エンコードされた byte 列をそのまま文字列操作できるクラスが追加される\n\n            // これだと、内部的に UTF16 → UTF8 変換が掛かって無駄\n            var s1 = new Utf8String(\"あ亜🐕\");\n\n            // これだと、読めない。つらい\n            var s2 = new Utf8String(new byte[] { 227, 129, 130, 228, 186, 156, 240, 159, 144, 149 });\n\n            // UTF8 用の、何らかのリテラル構文が欲しい\n            Utf8String s3 = \"あ亜🐕\";\n        }\n    }\n\n    // pattern-based `with` expressions\n    class ImmutablePoint\n    {\n        // immutable なクラスを用意\n        public int X { get; }\n        public int Y { get; }\n        public ImmutablePoint(int x, int y) => (X, Y) = (x, y);\n\n        // こんな感じの、現在の値をコピーしてくれるような「規定値」が欲しい\n        public ImmutablePoint With(int X = this.X, int Y = this.Y) => new ImmutablePoint(X, Y);\n    }\n\n    class WithExpressionSample\n    {\n        public static void Run()\n        {\n            var a = new ImmutablePoint(1, 2);\n\n            // Y だけ書き換えたいとき、結構煩雑\n            var b = new ImmutablePoint(a.X, 3);\n\n            // こんな感じで略記したい\n            var c = a with { Y = 3 };\n\n            // ↑これは、↓こういう意味に\n            var d = a.With(Y: 3);\n        }\n    }\n\n    // Readonly ref\n    class ReadonlyRefSample\n    {\n        // メソッド内部で書き換えたいから ref なのか、\n        // コピーコストを避けるためだけに ref なのかが不明\n        static ref int Min(ref Point p)\n        {\n            ref int x = ref p.X;\n            ref int y = ref p.Y;\n            if (x < y) return ref x;\n            else return ref y;\n        }\n\n        // 書き換えないことを明示したい\n        // ref の前後に readonly を付ける案とか\n        // 引数に「in」修飾子を付ける案とか\n        static ref readonly int Min(in Point p)\n        {\n            ref readonly int x = ref p.X;\n            ref readonly int y = ref p.Y;\n            if (x < y) return ref x;\n            else return ref y;\n        }\n    }\n\n#endif\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/07 Future/02 cs7X.cs",
    "content": "﻿namespace ConsoleApp1._07_Future._7X\n{\n    // C# 7.X 予定リスト\n    // 7.1, 7.2 よりは具体性がなく、7.3 になるか 7.4 になるか… みたいなあいまいな感じ。\n\n#if false\n\n    using System;\n    using System.Collections.Generic;\n    using ConsoleApp1._02_Patterns;\n    using System.Linq;\n    using System.Threading.Tasks;\n    using global::System;\n\n    // Support for == and != on tuple types\n    class TupleEqualsSample\n    {\n        public static void Run()\n        {\n            // プリミティブ同士の == は型変換が掛かったり、\n            int i = 1;\n            double d = 1.0;\n            Console.WriteLine(i == d); // true\n            Console.WriteLine(i.Equals(d)); // 型があっていないので false\n\n            // NaN 同士の比較の挙動が Equals と違ったり\n            var n1 = double.NaN;\n            var n2 = double.NaN;\n            Console.WriteLine(n1 == n2); // false\n            Console.WriteLine(n1.Equals(n2)); // true\n\n            // Tuple には Equals はある。メンバーごとの Equals はある\n            Console.WriteLine((1, 1).Equals((i, d))); // 型があっていないので false\n            Console.WriteLine((double.NaN, double.NaN).Equals((n1, n2))); // true\n\n            // Tuple にも == があってもいいのではないか\n            Console.WriteLine((1, 1) == (i, d)); // 1 == i && 1 == d を期待 → true\n            Console.WriteLine((double.NaN, double.NaN) == (n1, n2)); // double.NaN == n1 && double.NaN == n2 を期待 → false\n        }\n    }\n\n    class DeconstructionInQuerySample\n    {\n        public static void Run()\n        {\n            // 変数宣言で分解\n            var (x, y) = (1, 2);\n\n            // foreach で分解\n            var items = new[] { 2, 3, 5, 7 }.Select((item, index) => (item, index));\n            foreach (var (item, index) in items)\n            {\n            }\n\n            // なら、クエリ式中でも分解構文を使えるべきではないか\n            var q =\n                from (item, index) in items               // from で分解\n                let (a, b) = (item + index, item * index) // let で分解\n                select a * b;\n\n            // ラムダ式の引数でも分解できるべきではないか\n            var ma = items.Select(var (a, b) => a * b).Sum();\n        }\n    }\n\n    // params IEnumerable<T>, ICollection<T> and IList<T>\n    class ParamesEnumerableSample\n    {\n        // これまで、params (可変長引数)にしたければ、引数の型は配列になる\n        public static int Sum1(params int[] items) => items.Sum();\n\n        // IEnumerable など、インターフェイスにしたければ、一段ラップが必要だった\n        public static int Sum2(params int[] items) => Sum2(items.AsEnumerable());\n        public static int Sum2(IEnumerable<int> items) => items.Sum();\n\n        // 直接、params IEnumerable<T> とかを書かせてほしい\n        public static int Sum3(params IEnumerable<int> items) => items.Sum();\n        public static int Sum3(params List<int> items) => items.Sum();\n\n        public static void Run()\n        {\n            Sum3(1, 2, 3); // どう展開されるべき？配列？\n            Sum3(new List<int> { 1, 2, 3 }); // 配列でないものに展開されるとして、コレクション初期化子(Add メソッド)を呼ぶべき？\n            Sum3(new List<int>(new[] { 1, 2, 3 })); // コンストラクターを呼ぶべき？\n        }\n    }\n\n    // Target-typed `new` expression\n    class TargetTypedNewSample\n    {\n        // ちょっとさすがにこんな長い型名を左右両辺に書きたくないんだけど…\n        static Dictionary<(int a, int b), ((string first, string last) name, int id)> _table1 = new Dictionary<(int a, int b), ((string first, string last) name, int id)>();\n\n        public static void LocalVar()\n        {\n            // ローカル変数なら、左辺→右辺の型推論が効くけども\n            var table = new Dictionary<(int a, int b), ((string first, string last) name, int id)>();\n        }\n\n        // フィールドとかに var を認めてしまうと、型推論に掛かる時間が非線形になったり、ちょっとしたことで public API が変わっちゃったり、まずい\n        // じゃあ、逆に、左辺から右辺の型を推論したい\n        static Dictionary<(int a, int b), ((string first, string last) name, int id)> _table2 = new();\n\n        // 戻り値とか\n        static Dictionary<(int a, int b), ((string first, string last) name, int id)> Return() => new();\n\n        // 引数とかでも同様\n        static void Param(Dictionary<(int a, int b), ((string first, string last) name, int id)> table) { }\n        static void Caller() => Param(new());\n    }\n\n    // Pattern Matching\n    static class NodeExtensions\n    {\n        // 02 Patterns で例に出したやつをちょこっと変更\n        public static Node Reduce(this Node n)\n        {\n            // if-else の連続よりも、case-when 並べる方がきれいなことが\n            switch (n)\n            {\n                case Add(Const x, Const y): return new Const(x.Value + y.Value);\n                case Add(Const x, var y) when x.Value == 0: return y;\n                case Add(var x, Const y) when y.Value == 0: return x;\n                case Mul(Const x, Const y): return new Const(x.Value * y.Value);\n                case Mul(Const x, var y) when x.Value == 0: return new Const(0);\n                case Mul(var x, Const y) when y.Value == 0: return new Const(0);\n                case Mul(Const x, var y) when x.Value == 1: return y;\n                case Mul(var x, Const y) when y.Value == 1: return x;\n                default: return n;\n            }\n        }\n    }\n\n    // Null-conditional await\n    class NullAwaitSample\n    {\n        // 既定動作は何もせず、派生クラスの一部でだけ何か処理を入れたいとき\n        public virtual Task<int> M1() => null; // これだと、await M1(); でぬるぽ\n        public virtual Task<int> M2() => Task.FromResult(0); // これだと、呼び出すたびに Task のアロケーションが発生\n\n        private Task<int> _default = Task.FromResult(0);\n        public virtual Task<int> M3() => _default; // 書くのだるい\n\n        public async Task Run()\n        {\n            // await にも null 条件版が必要なのではないか\n            int? n1 = await? M1();\n\n            // ↓こう展開されることを期待\n            var t = M1();\n            int? n2 = t == null ? default(int?) : await t;\n        }\n    }\n\n    // null coalescing assignment\n    class NullAssignmentSample\n    {\n        private static int CalculateValue()\n        {\n            // 計算に結構時間が掛かるものとして\n            return 0;\n        }\n\n        // キャッシュとかでよくあるパターン\n        // 長い…\n        private static int? _cache;\n\n        public static int CachedValue\n        {\n            get\n            {\n                if (_cache == null)\n                {\n                    _cache = CalculateValue();\n                }\n                return _cache.Value;\n            }\n        }\n\n        // 多少縮める手段はあるけども、これはこれでキモイ構文\n        // 式の途中で代入(副作用のある式)を書いてるし、最後の .Value アクセスが冗長だし\n        public static int CachedValue1 => _cache ?? (_cache = CalculateValue()).Value;\n\n        // 専用の構文があってもいいのではないか\n        public static int CachedValue2 => _cache ??= CalculateValue();\n    }\n\n\n    // Bestest Betterness\n    // オーバーロード解決の際、「より一致度の高い方を選ぶ」というのを指して「betterness rule」ってのを決めてる\n    // 「オーバーロード解決が賢くなったよ」ってのを指して「better betterness」って言ってたのが、\n    // その次のバージョンで best betterness\n    // さらに今、bestest betterness\n    // とか言ってる。\n\n    interface IA { }\n    interface IB { }\n    class X : IA, IB { }\n\n    class StaticResolutionSample\n    {\n        // 呼び分けが難しそうなもの\n        static void F(IA a) { }\n        void F(IB b) { }\n\n        // 比較用\n        static void FA(IA a) { }\n        void FB(IB b) { }\n\n        void X()\n        {\n            Action<X> fa = FA; // OK\n            Action<X> fb = FB; // OK\n\n            // 現状、解決不能\n            Action<X> a = F;      // this が付いてなかったら static 扱いで IA の方でいいのではないか\n            Action<X> b = this.F; // this を付けたら IB の方\n        }\n    }\n\n    class ConstraintResolutionSample\n    {\n        // 呼び分けが難しそうなもの\n        static void F<T>(T x) where T : struct { }\n        static void F<T>(IEnumerable<T> x) { }\n\n        // 比較用\n        static void FT<T>(T x) where T : struct { }\n        static void FE<T>(IEnumerable<T> x) { }\n\n        void X()\n        {\n            int[] array = null;\n\n            FT(array); // NG。struct 制約に合わない\n            FE(array); // OK\n\n            // 現状、解決不能\n            F(array); // F(T) の方は制約に合わないから候補から外して、F(IEnumerable<T>) の方を選べるべきではないか\n        }\n    }\n\n    class ReturnResolutionSample\n    {\n        // 呼び分けが難しそうなもの\n        static int F(IA x) => 0;\n        static string F(IB x) => \"\";\n\n        // 比較用\n        static int FI(IA x) => 0;\n        static string FS(IB x) => \"\";\n\n        void X()\n        {\n            Func<X, int> fi = FI;    // OK。引数に関して反変性が効いてる\n            Func<X, string> fs = FS; // OK。同上\n\n            // 現状、解決不能\n            Func<X, int> f1 = F;    // 戻り値の型も見て、int F(IA) を選べるべきではないか\n            Func<X, string> f2 = F; // 同上、string F(IB)\n        }\n    }\n\n    // Compiler intrinsics\n    namespace System.Runtime.CompilerServices\n    {\n        [AttributeUsage(AttributeTargets.Method)]\n        internal class CompilerIntrinsicAttribute : Attribute { }\n    }\n\n    class CompilerIntrinsicsSample\n    {\n        // まれに、C# では書けない IL 命令を使いたいことがある\n        // 例: https://github.com/dotnet/corefx/tree/master/src/System.Runtime.CompilerServices.Unsafe/src\n        // やろうと思えば、そこだけ IL アセンブラーを使えばいいんでできるけど、ビルド プロセスが面倒になったり\n\n        // なので C# 中に IL 命令を埋め込める「インライン アセンブラー」機能が欲しいという話もなくはない\n        // これはこれで、「2種類の言語を保守する羽目になる」「ildasm との2重管理になる」などの理由があってやりたくない\n\n        // そこで、特定のメソッド呼び出しを特定の IL 命令に置き換えるような特殊対応で考える\n        // 使ってる側からするとただのメソッド呼び出しだし、既存の C# パーサーで解釈できるし\n        // 一番低コストで当初目的を果たせそう\n\n        [System.Runtime.CompilerServices.CompilerIntrinsic]\n        static unsafe extern void* LoadFunctionPointer(Delegate target);  // ldftn 命令に置き換え\n    }\n\n#endif\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/ConsoleApp1.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{86C30859-BF60-40CD-8C73-713B854AB77A}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>ConsoleApp1</RootNamespace>\n    <AssemblyName>ConsoleApp1</AssemblyName>\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"**/*.cs\" Exclude=\"obj/**/*\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"System.Memory\">\n      <Version>4.4.0-beta-25109-09</Version>\n    </PackageReference>\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\">\n      <Version>4.3.0</Version>\n    </PackageReference>\n    <PackageReference Include=\"System.Text.Primitives\">\n      <Version>0.1.0-e170309-1</Version>\n    </PackageReference>\n    <PackageReference Include=\"System.Threading.Tasks.Extensions\">\n      <Version>4.3.0</Version>\n    </PackageReference>\n    <PackageReference Include=\"System.ValueTuple\">\n      <Version>4.3.0</Version>\n    </PackageReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/Interop.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace ConsoleApp1\n{\n    static class Interop\n    {\n        [DllImport(\"msvcrt.dll\", CallingConvention = CallingConvention.Cdecl)]\n        public static extern IntPtr malloc(int size);\n\n        [DllImport(\"msvcrt.dll\", CallingConvention = CallingConvention.Cdecl)]\n        public static extern void free(IntPtr ptr);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/Program.cs",
    "content": "﻿using System;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        ConsoleApp1._05_GeneralizedAsync.Performance.Run();\n    }\n}"
  },
  {
    "path": "Demo/2017/Csharp7/ConsoleApp1/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ConsoleApp1\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApp1\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"86c30859-bf60-40cd-8c73-713b854ab77a\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2017/Csharp7/Csharp7.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26206.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{86C30859-BF60-40CD-8C73-713B854AB77A}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{86C30859-BF60-40CD-8C73-713B854AB77A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{86C30859-BF60-40CD-8C73-713B854AB77A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{86C30859-BF60-40CD-8C73-713B854AB77A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{86C30859-BF60-40CD-8C73-713B854AB77A}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-0902/ConsoleApp2_6_0/ConsoleApp2_6_0.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Net.Compilers\" Version=\"2.6.0-beta1-62101-04\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview2-25405-01\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-0902/ConsoleApp2_6_0/Program.cs",
    "content": "﻿using System;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        Console.WriteLine(\"Hello World!\");\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-0902/ConsoleAppRefReadonly/ConsoleAppRefReadonly.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <LangVersion>7.2</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Net.Compilers\" Version=\"2.6.0-rdonly-ref-62101-05\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview2-25405-01\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-0902/ConsoleAppRefReadonly/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nstruct Vector2D\n{\n    public float X;\n    public float Y;\n\n    public Vector2D(float x, float y)\n    {\n        X = x;\n        Y = y;\n    }\n}\n\nstatic class Extensions\n{\n    public static float Dot(in this Vector2D p, in Vector2D q) => p.X * q.X + p.Y * q.Y;\n    public static float Cross(in this Vector2D p, in Vector2D q) => p.X * q.Y - p.Y * q.X;\n}\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        RefExtensionMethods();\n        SafeStackalloc();\n    }\n\n    private static void RefExtensionMethods()\n    {\n        var p = new Vector2D(1, 2);\n        var q = new Vector2D(3, 4);\n\n        Console.WriteLine(p.Dot(q));\n        Console.WriteLine(p.Cross(q));\n    }\n\n    // 特に unsafe を付けてない\n    private static void SafeStackalloc()\n    {\n        // safe な文脈で stackalloc！\n        Span<byte> buf = stackalloc byte[8];\n        for (int i = 0; i < buf.Length; i++)\n        {\n            buf[i] = (byte)((i + 1) * 0x11);\n        }\n\n        var x = buf.NonPortableCast<byte, ulong>()[0];\n        Console.WriteLine(x.ToString(\"X\")); // 8877665544332211\n    }\n\n    static IEnumerable<int> Iterator()\n    {\n        Span<byte> local = new byte[1]; // OK\n\n        yield return 0;\n#if NG\n            Span<byte> captured = new byte[1]; // NG\n            yield return 0;\n            captured = captured.Slice(1);\n#endif\n    }\n\n    static async Task<int> Async()\n    {\n#if NG\n            Span<byte> local = new byte[1]; // NG\n#endif\n\n        await Task.Delay(1);\n\n        return 1;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-0902/ConsoleAppRefReadonly/StackHashSet.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ConsoleAppRefReadonly\n{\n    static class StackHashSet\n    {\n        internal static int PowerOf2(int x)\n        {\n            var p = 1;\n            while (p < x) p <<= 1;\n            return p;\n        }\n\n        internal const int Skip = 928191829;\n\n        public static T[] Distinct<T, TComp>(this T[] items)\n            where TComp : struct, IEqualityComparer<T>\n        {\n            var len = PowerOf2(items.Length * 2);\n            Span<int> buckets = len <= 1024 ? (Span<int>)stackalloc int[len] : (Span<int>)new int[len];\n            Span<int> resultIndexes = len <= 1024 ? (Span<int>)stackalloc int[items.Length] : (Span<int>)new int[items.Length];\n\n            for (int i = 0; i < len; i++) buckets[i] = -1;\n\n            var mask = len - 1;\n            var count = 0;\n\n            for (int i = 0; i < items.Length; i++)\n            {\n                var item = items[i];\n\n                var hash = default(TComp).GetHashCode(item) & mask;\n\n                while (true)\n                {\n                    ref var b = ref buckets[hash];\n\n                    if (b == -1)\n                    {\n                        resultIndexes[count] = i;\n                        count++;\n                        b = i;\n                        break;\n                    }\n                    else if (default(TComp).Equals(item, items[b]))\n                    {\n                        break;\n                    }\n\n                    hash = (hash + Skip) & mask;\n                }\n            }\n\n            var results = new T[count];\n            for (int i = 0; i < results.Length; i++) results[i] = items[resultIndexes[i]];\n            return results;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-0902/NewLangFeatures.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26730.12\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ConsoleAppRefReadonly\", \"ConsoleAppRefReadonly\\ConsoleAppRefReadonly.csproj\", \"{168367EA-86F5-4EA5-A1F1-DEAE73C7EFD2}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ConsoleApp2_6_0\", \"ConsoleApp2_6_0\\ConsoleApp2_6_0.csproj\", \"{FC1712C7-F742-4929-9F15-38AB54D09882}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{168367EA-86F5-4EA5-A1F1-DEAE73C7EFD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{168367EA-86F5-4EA5-A1F1-DEAE73C7EFD2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{168367EA-86F5-4EA5-A1F1-DEAE73C7EFD2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{168367EA-86F5-4EA5-A1F1-DEAE73C7EFD2}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FC1712C7-F742-4929-9F15-38AB54D09882}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FC1712C7-F742-4929-9F15-38AB54D09882}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FC1712C7-F742-4929-9F15-38AB54D09882}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FC1712C7-F742-4929-9F15-38AB54D09882}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {6331A76E-EF42-465A-9E38-79ABDF180EA9}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ClassLibrary1/ClassLibrary1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.0</TargetFramework>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ClassLibrary1/PrivateProtected.cs",
    "content": "﻿namespace ClassLibrary1\n{\n    public class Base\n    {\n        public int Public { get; set; } // どこからでも\n        protected int Protected { get; set; } // 派生クラスからだけ\n        internal int Internal { get; set; } // 同一アセンブリ(同一 exe/同一 dll)内からだけ\n        protected internal int ProtectedInternal { get; set; } // 派生クラス \"もしくは\" 同一アセンブリ内 から\n        private protected int PrivateProtected { get; set; } // 派生クラス \"かつ\" 同一アセンブリ内 から(C# 7.2 以降)\n        private int Private { get; set; } // クラス内からだけ\n\n        public void Method()\n        {\n            // 同一クラス内\n            // 全部 OK\n            Public = 0;\n            Protected = 0;\n            Internal = 0;\n            ProtectedInternal = 0;\n            Private = 0;\n            PrivateProtected = 0;\n        }\n    }\n\n    internal class Derived : Base\n    {\n        public void MethodInDerived()\n        {\n            // 同一アセンブリ内の派生クラス\n            // コメントアウトしてないやつだけ OK\n            Public = 0;\n            Protected = 0;\n            Internal = 0;\n            ProtectedInternal = 0;\n            //Private = 0;\n            PrivateProtected = 0;\n        }\n    }\n\n    internal class OtherClass\n    {\n        public void Method()\n        {\n            // 同一アセンブリ内の他のクラス\n            // コメントアウトしてないやつだけ OK\n            var x = new Base();\n\n            x.Public = 0;\n            //x.Protected = 0;\n            x.Internal = 0;\n            x.ProtectedInternal = 0;\n            //x.Private = 0;\n            //x.PrivateProtected = 0;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ClassLibrary1/PrivateProtectedOrder.cs",
    "content": "﻿namespace ClassLibrary1\n{\n    class PrivateProtectedOrder\n    {\n        // どちらの順序でも同じ意味\n        protected internal int A1;\n        internal protected int A2;\n\n        private protected int B1;\n        protected private int B2;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/ConditionalRefOperator.cs",
    "content": "﻿using System;\n\nnamespace ConditionalRefOperator\n{\n    class Program\n    {\n        static void Main()\n        {\n            var x = 10;\n            var y = 5;\n            Max(ref x, ref y) = 0;\n\n            Console.WriteLine((x, y)); // (0, 5)\n        }\n\n        // C# 7.0\n        static ref int MaxCs70(ref int x, ref int y)\n        {\n            if (x < y) return ref y;\n            else return ref x;\n        }\n\n        // C# 7.2\n        static ref int Max(ref int x, ref int y) => ref x < y ? ref y : ref x;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/ConsoleApp1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <LangVersion>latest</LangVersion>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <StartupObject>SpanSample.Program</StartupObject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Memory\">\n      <Version>4.4.0-preview2-25405-01</Version>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ClassLibrary1\\ClassLibrary1.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/DigitSeparator.cs",
    "content": "﻿#pragma warning disable 0219\n\nnamespace DigitSeparator\n{\n    class Program\n    {\n        static void Main()\n        {\n            // C# 7.0\n            var b1 = 0b1111_0000;\n            var x1 = 0x0001_F408;\n\n            // C# 7.2\n            // b, x の直後に _ 入れてもOKに\n            var b2 = 0b_1111_0000;\n            var x2 = 0x_0001_F408;\n\n#if InvalidCode\n            var a = _10;\n            var b = 10_;\n            var c = 1._0;\n            var d = 1_.0;\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/NonTrailingNamedArguments.cs",
    "content": "﻿//#define InvalidCode\n\nusing System;\n\nnamespace NonTrailingNamedArguments\n{\n    class Program\n    {\n        static void Main()\n        {\n            // C# 4.0\n            // 名前付きにできるのは後ろの方だけ\n            Sum(1, 2, z: 3);\n            Sum(1, z: 3, y: 2);\n            Sum(x: 1, y: 2, z: 3);\n\n            // C# 7.2\n            // 末尾以外でも名前を書けるように\n            Sum(x: 1, 2, 3);\n\n#if InvalidCode\n            // C# 7.2 でもダメなやつ\n            // 末尾以外に名前付き引数を持ってきた場合、順序は厳守する必要あり\n            Sum(2, 3, x: 1);\n#endif\n        }\n\n        static void Order()\n        {\n            // OK: 前の方は位置指定、後ろの方は名前指定\n            Sum(1, z: 2, y: 3);\n\n#if InvalidCode\n            // コンパイル エラー: 前の方の引数を名前指定するのはダメ\n            Sum(1, x: 2, y: 3);\n#endif\n        }\n\n        static int Sum(int x = 0, int y = 0, int z = 0) => x + y + z;\n\n        static void ForInstance()\n        {\n            var a = new[] { 1, 2, 3, 4, 5 };\n            var b = new int[3];\n            Array.Copy(sourceArray: a, destinationArray: b, 3);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/PrivateProtected.cs",
    "content": "﻿namespace ConsoleApp1\n{\n    public class Derived : ClassLibrary1.Base\n    {\n        public void MethodInDerived()\n        {\n            // 他のアセンブリ内の派生クラス\n            // コメントアウトしてないやつだけ OK\n\n            Public = 0;\n            Protected = 0;\n            //Internal = 0;\n            ProtectedInternal = 0;\n            //Private = 0;\n            //PrivateProtected = 0; // ここが protected internal との差\n        }\n    }\n\n    internal class OtherClass\n    {\n        public void Method()\n        {\n            // 他のアセンブリ内の他のクラス\n            // public 以外全滅\n\n            var x = new ClassLibrary1.Base();\n\n            x.Public = 0;\n            //x.Protected = 0;\n            //x.Internal = 0;\n            //x.ProtectedInternal = 0;\n            //x.Private = 0;\n            //x.PrivateProtected = 0;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/Program.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1\n{\n    class Program\n    {\n#if false // 7.2 で入るかと思っていたら 7.X 行きになってた。それで確定だったらこのコード消す\n\n        static void RefLocalReassignment()\n        {\n            var x = 1;\n            ref var r = ref x;\n\n            var y = 2;\n            if (x < y) ref r = ref y;\n\n            r = 3;\n        }\n#endif\n\n        static void BugFix()\n        {\n            void X(int? x = default) => Console.WriteLine(x);\n\n            X();        // C# 7.1 まではなぜか 0 になってた\n            X(default); // こっちは null\n\n            // さすがにひどいバグなので、破壊的変更とはいえ、ちゃんと X() で null になるように修正された\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/ReadOnlyStruct.cs",
    "content": "﻿namespace ReadOnlyStruct\n{\n    struct Point\n    {\n        // フィールドに readonly を付けているものの…\n        public readonly int X;\n        public readonly int Y;\n\n        public Point(int x, int y) => (X, Y) = (x, y);\n\n        // this の書き換えができてしまうので、実は X, Y の書き換えが可能\n        public void Set(int x, int y) => this = new Point(x, y);\n    }\n\n    readonly struct ReadOnlyPoint\n    {\n        public readonly int X;\n        public readonly int Y;\n\n        public ReadOnlyPoint(int x, int y) => (X, Y) = (x, y);\n\n#if InvalidCode\n    // readonly struct なら、これがコンパイル エラーになる\n    public void Set(int x, int y) => this = new Point(x, y);\n#endif\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var p = new Point(1, 2);\n            p.Set(3, 4); // readonly フィールドの書き換えが出来ちゃう\n\n            System.Console.WriteLine(p.X); // 3\n            System.Console.WriteLine(p.Y); // 4\n\n            var r = new ReadOnlyPoint(1, 2);\n            System.Console.WriteLine(r.X); // こっちなら、絶対に 1 な保証あり\n            System.Console.WriteLine(r.Y); // 同、2\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/RefExtensionRefOperator.cs",
    "content": "﻿using System;\n\nnamespace RefExtensionRefOperator\n{\n    struct LargeStruct\n    {\n        public double A11;\n        public double A12;\n        public double A13;\n        public double A21;\n        public double A22;\n        public double A23;\n        public double A31;\n        public double A32;\n        public double A33;\n\n        public LargeStruct(double a11, double a12, double a13, double a21, double a22, double a23, double a31, double a32, double a33)\n        {\n            A11 = a11;\n            A12 = a12;\n            A13 = a13;\n            A21 = a21;\n            A22 = a22;\n            A23 = a23;\n            A31 = a31;\n            A32 = a32;\n            A33 = a33;\n        }\n\n        // 演算子の引数に in (意味的には ref readonly) が使えるように\n        public static LargeStruct operator +(in LargeStruct x, in LargeStruct y) => new LargeStruct(\n            x.A11 + y.A11,\n            x.A12 + y.A12,\n            x.A13 + y.A13,\n            x.A21 + y.A21,\n            x.A22 + y.A22,\n            x.A23 + y.A23,\n            x.A31 + y.A31,\n            x.A32 + y.A32,\n            x.A33 + y.A33);\n\n        public override string ToString() => $\"[({A11}, {A12}, {A13}) / ({A21}, {A22}, {A23}) / ({A31}, {A32}, {A33})]\";\n    }\n\n    static class Ex\n    {\n        // ref this で、拡張メソッドに参照を渡せるように\n        // this ref の語順じゃない理由は謎\n        public static void Transpose(ref this LargeStruct x)\n        {\n            (x.A12, x.A21) = (x.A21, x.A12);\n            (x.A23, x.A32) = (x.A32, x.A23);\n            (x.A31, x.A13) = (x.A13, x.A31);\n        }\n\n        // 同上、in this で読み取り専用に\n        public static double Trace(in this LargeStruct x)\n        {\n#if InvalidCode\n            x.A11 = 1; // 書き換え不可\n#endif\n            return x.A11 + x.A22 + x.A33;\n        }\n\n#if InvalidCode\n        // ちなみに、ref this が使えるのは値型のみ\n        // 参照型に対してやるのは禁止(コンパイル エラー)\n        public static int X(ref this string s) => s.Length;\n#endif\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var x = new LargeStruct(1, 2, 3, 4, 5, 6, 7, 8, 9);\n            var y = new LargeStruct(0, -1, -2, 0, -1, -2, 0, -1, -2);\n\n            Console.WriteLine(x);     // [(1, 2, 3) / (4, 5, 6) / (7, 8, 9)]\n\n            // 演算子に対して int (ref readonly) で渡る = コピーのコストがなくなる(※引数のみ。戻り値は相変わらずコピー)\n            Console.WriteLine(x + y); // [(1, 1, 1) / (4, 4, 4) / (7, 7, 7)]\n\n            // 拡張メソッドだけど、x がちゃんと書き換わる\n            x.Transpose();\n            Console.WriteLine(x);     // [(1, 4, 7) / (2, 5, 8) / (3, 6, 9)]\n\n            // 拡張メソッドだけど、コピーの発生を避けれる & ちゃんと readonly なので x が書き換わらない保証あり\n            Console.WriteLine(x.Trace()); // 15\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/RefReadonly.cs",
    "content": "﻿//#define InvalidCode\n\nnamespace ConsoleApp1.RefReadonly\n{\n    class Program\n    {\n        static void Main()\n        {\n            RefReadonlyVar();\n            RefCall();\n        }\n\n        private static void RefReadonlyVar()\n        {\n            int x = 0;\n\n            // 参照ローカル変数を readonly にできるように\n            ref readonly int rr = ref x;\n\n#if InvalidCode\n            // readonly なので、書き換えようとしたらエラーに\n            rr = 1;\n#endif\n\n            // 将来的には (ref ではない) readonly int とかも追加される予定だったはずだけど\n            // (もしかしたら let キーワードとか使うかも)\n            // とりあえず ref readonly だけ先に入ったっぽい\n        }\n\n        // in で「参照渡しなんだけど x は書き換えれない」という意味\n        // 元々 out が「戻り値として使う意図で参照渡し」という意味なので、それとの対比で in キーワードを使うことに\n        //\n        // 参照ローカル変数の場合は ref readonly を使うんで、引数でも ref readonly にするかどうかはちょっと迷ったみたい。結局 in に\n        static void RefMethod(in int x)\n        {\n#if InvalidCode\n            // readonly なので、書き換えようとしたらエラーに\n            x = 1;\n#endif\n        }\n\n        // ref T と T でオーバーロードを作れるんだけど、in T と T でも可能\n        static void Overload(int x) { }\n        static void Overload(in int x) { }\n\n        private static void RefCall()\n        {\n            int x = 0;\n\n            // in (ref readonly) の場合、ref 修飾なしでメソッドを呼べる\n            //\n            // (readonly でない) ref の場合に ref 修飾が必要なのは、メソッドの中で書き換わる可能性があるのが怖いから\n            // 書き換わらないなら修飾の類は必要とされない\n            RefMethod(x);\n\n            // 一応、in 修飾を付けても OK。値渡しと参照渡しの弁別用\n            RefMethod(in x);\n\n#if InvalidCode\n            // と言っても、今のバージョン(Preview 2。10/24版)ではこのコードはエラーに。たぶん、正式リリースまでには直る\n            Overload(x);\n#endif\n            // こっちは OK\n            Overload(in x);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/RefStruct.cs",
    "content": "﻿//#define InvalidCode\n\nusing System;\n\nnamespace RefStruct\n{\n    // Span<T> をフィールドとして持つためには ref 修飾が必要。\n    // SpanSafety の方で書いた通り、参照を握る(Span<T> を持つ)と、ref に準ずる制限が生じる。\n    ref struct Utf16Array\n    {\n        Span<char> _chars;\n\n        public Utf16Array(Span<char> chars) => _chars = chars;\n\n        public Enumerator GetEnumerator() => new Enumerator(_chars);\n\n        public ref struct Enumerator\n        {\n            Span<char> _chars;\n            int _index;\n\n            public Enumerator(Span<char> chars)\n            {\n                _chars = chars;\n                _index = -1;\n            }\n\n            public bool MoveNext() => ++_index < _chars.Length;\n            public uint Current\n            {\n                get\n                {\n                    var c = _chars[_index];\n                    if (!char.IsHighSurrogate(c))\n                    {\n                        return c;\n                    }\n                    else\n                    {\n                        _index++;\n                        if (_index >= _chars.Length) throw new FormatException();\n\n                        var x = (c & 0b00000011_11111111U) + 0b100_0000;\n                        x <<= 10;\n                        x |= (_chars[_index] & 0b00000011_11111111U);\n\n                        return x;\n                    }\n                }\n            }\n        }\n    }\n\n#if InvalidCode\n\n    // ref を付けてないのでコンパイル エラーに\n    struct Error1\n    {\n        Span<char> _chars;\n    }\n\n    // 他にも、インターフェイスを実装できないとかの制限あり\n    ref struct Error2 : System.Collections.Generic.IEnumerable<uint>\n    {\n        Span<char> _chars;\n    }\n\n    // クラスもダメ。クラスの時点で ref も付けれない\n    ref class Error3\n    {\n        Span<char> _chars;\n    }\n\n#endif\n\n    class Program\n    {\n        static void Main()\n        {\n            var chars = new char[] { (char)0x61, (char)0x3B1, (char)0x2135, (char)0x3042, (char)0xD83D, (char)0xDC08 };\n\n            var str = new Utf16Array(chars);\n\n            var i = 0;\n            foreach (var cp in str)\n            {\n                if (i == 0) Console.WriteLine(cp == 'a');\n                if (i == 1) Console.WriteLine(cp == 'α');\n                if (i == 2) Console.WriteLine(cp == 'ℵ');\n                if (i == 3) Console.WriteLine(cp == 'あ');\n                if (i == 4) Console.WriteLine(cp == char.ConvertToUtf32(\"🐈\", 0));\n\n                ++i;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/SafeStackalloc.cs",
    "content": "﻿using System;\n\nnamespace SafeStackalloc\n{\n    class Program\n    {\n        static void Main()\n        {\n            // 適当に入力したデータ列だけど、意図的に 3 を一番多く含むようにしてある\n            var data = new byte[] { 1, 2, 3, 4, 1, 34, 5, 7, 3, 5, 67, 2, 3, 45, 74, 3, 23, 63, 56, 8, 23, 12, 5, 23, 12, 64, 3, 12, 5, 23, 3, 76, 34, 75, 3, 86, 53, 2, 3, 124};\n\n            // 以下の3つはいずれも頻度最大の値を返すメソッド\n            // なので data を与えると 3 を返すはず\n            // 違いは、出現数をカウントするための一時バッファーの取り方\n            Console.WriteLine(SafeButSlow(data));\n            Console.WriteLine(FastButUnsafe(data));\n            Console.WriteLine(FastAndSafe(data));\n        }\n\n        static byte SafeButSlow(byte[] data)\n        {\n            // 安全なんだけど、この配列確保が結構負担\n            var counts = new byte[256];\n\n            foreach (var c in data) counts[c]++;\n\n            return Max(counts);\n        }\n\n        static unsafe byte FastButUnsafe(byte[] data)\n        {\n            // 配列確保の負担はなくなるんだけど、ポインターが必須\n            byte* counts = stackalloc byte[256];\n\n            foreach (var c in data) counts[c]++;\n\n            return Max(new Span<byte>(counts, 256));\n        }\n\n        static byte FastAndSafe(byte[] data)\n        {\n            // Span に対して代入するなら、unsafe を付けなくても stackalloc が使える\n            // counts.Length はちゃんと 256 だし、インデクサーの範囲チェックもされる = buffer over run 脆弱性とかは避けれる = 安全\n            Span<byte> counts = stackalloc byte[256];\n\n            foreach (var c in data) counts[c]++;\n\n            return Max(counts);\n        }\n\n        static byte Max(Span<byte> counts)\n        {\n            var max = 0;\n            byte maxC = 0;\n            for (int i = 0; i < 256; i++)\n            {\n                if (counts[i] > max)\n                {\n                    max = counts[i];\n                    maxC = (byte)i;\n                }\n            }\n            return maxC;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/SpanSafety.cs",
    "content": "﻿//#define InvalidCode\n\n// System.Span<T> 構造体は System.Memory パッケージ内に定義されてる\n\nusing System;\n\nnamespace SpanSafety\n{\n    class Program\n    {\n        static void Main()\n        {\n            byte x = 0;\n            ref var y = ref ValidRef(ref x);\n\n            var a = new byte[] { 1, 2, 3 };\n            var b = ValidSpan(a);\n\n            // その他、ref struct (Span<T> など) は、box 化してはいけないという制約があって、\n            // その結果、\n            // - ToString とか呼べない\n            // - ラムダ式にキャプチャできない\n            // - async/await と併用できない\n            // などの制限あり\n            //\n            // ちなみにその理由は、\n            // - ref は GC によるオブジェクトの移動に追従する必要があるけど、その追跡がスタック上でしかできない\n            // - Span<T> は、ref T とサイズのペアだけど、Span<T> 自身の書き換えはアトミックじゃない\n            //    - ref T だけ書き換わって、サイズが書き換わってない不整合があるとセキュリティホール(buffer over run)になる\n            //    - スタック上に限定してしまえば、不正な状態で読み書きされることはなくなる\n            // - スタック上の領域を参照している Span<T> を、ヒープ上に持っていかれると困る\n            //    - スタック上の領域はすぐに消える。消えた場所を参照するわけにはいかない\n\n#if InvalidCode\n            Span<byte> s1 = stackalloc byte[10];\n\n            var str = s1.ToString();\n\n            Func<byte> a1 => () => s1[0];\n\n            async System.Threading.Tasks.Task X()\n            {\n                Span<byte> s2 = stackalloc byte[10];\n                await System.Threading.Tasks.Task.Delay(1);\n                s2[0] = 1;\n            }\n\n            System.Collections.IEnumerator Y()\n            {\n                // yield 許されてるのはいいのかな？\n                Span<byte> s2 = stackalloc byte[10];\n                yield return 0;\n                s2[0] = 1;\n            }\n\n            // 余談: TypedReference 型も、今思えば、分類としては ref struct になるんだけど\n            // C# 7.1 まで、仕様漏れでまずい状態だったらしい\n            TypedReference tr = __makeref(x);\n            Func<int> a2 = tr.GetHashCode; // C# 7.1 まではコンパイルできてた。本来、まずい。要はコンパイラーの仕様漏れ\n#endif\n        }\n\n        #region C# 7.0 で参照戻り値追加\n\n        // 引数由来の参照を戻り値に返すのはOK\n        static ref byte ValidRef(ref byte x) => ref x;\n\n#if InvalidCode\n        // ローカル由来の参照を戻り値に返すのはNG\n        static ref byte InvalidRef()\n        {\n            byte x = 1;\n            return ref x;\n        }\n#endif\n\n#endregion C# 7.2\n\n        // 参照に類する型の扱いが出来るように\n        // ぶっちゃけ、Span<T> 構造体のために導入されたもの\n        // Span<T> は中身に「ref フィールド」的なものを持っているので、ref と同じ扱いをしないといけない\n        // 「Span<T> を持つ構造体」も、再帰的に同様の扱いにする必要あり\n\n        // 引数由来の参照を戻り値に返すのはOK\n        static Span<byte> ValidSpan(Span<byte> x) => x.Slice(1);\n\n#if InvalidCode\n        // ローカル由来の参照を戻り値に返すのはNG\n        static Span<byte> InvalidSpan()\n        {\n            Span<byte> x = stackalloc byte[10];\n            return x;\n        }\n#endif\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/ConsoleApp1/SpanSample.cs",
    "content": "﻿using System;\n\nnamespace SpanSample\n{\n    static class Ex\n    {\n        public static void Deconstruct<T>(this T[] array, out T head, out Span<T> rest) => new Span<T>(array).Deconstruct(out head, out rest);\n\n        public static void Deconstruct<T>(this Span<T> span, out T head, out Span<T> rest)\n        {\n            head = span[0];\n            rest = span.Slice(1);\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var array = new[] { 1, 2, 3, 4, 5 };\n\n            var (x, (y, (z, rest))) = array;\n\n            Console.WriteLine(x);\n            Console.WriteLine(y);\n            Console.WriteLine(z);\n            Console.WriteLine(\"rest length: \" + rest.Length);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Csharp7_2-1012/Csharp7_2-1012.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27009.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{19745587-A11E-4F6E-8E9D-8D8EAFE7BDCD}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibrary1\", \"ClassLibrary1\\ClassLibrary1.csproj\", \"{80519994-7D09-4CA1-BFAE-CC3741BE6713}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{19745587-A11E-4F6E-8E9D-8D8EAFE7BDCD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{19745587-A11E-4F6E-8E9D-8D8EAFE7BDCD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{19745587-A11E-4F6E-8E9D-8D8EAFE7BDCD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{19745587-A11E-4F6E-8E9D-8D8EAFE7BDCD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{80519994-7D09-4CA1-BFAE-CC3741BE6713}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{80519994-7D09-4CA1-BFAE-CC3741BE6713}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{80519994-7D09-4CA1-BFAE-CC3741BE6713}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{80519994-7D09-4CA1-BFAE-CC3741BE6713}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {C0A86F44-9FA8-42A7-8DC4-A852D8B7199F}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/.gitignore",
    "content": "*.dll\n*.pdb\n*.xml\n*.binlog\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/ClassLibrary1/Class1.cs",
    "content": "﻿using System;\n\nnamespace ClassLibrary\n{\n    public class Class1\n    {\n        public static string Id => \"ClassLibray-1 1.0.7\";\n    }\n}\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/ClassLibrary1/Class2.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ClassLibrary\n{\n    public class Class2\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/ClassLibrary1/ClassLibrary1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.0</TargetFramework>\n    <AssemblyName>ClassLibrary</AssemblyName>\n    <RootNamespace>ClassLibrary</RootNamespace>\n    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>\n    <IncludeSource>True</IncludeSource>\n    <IncludeSymbols>true</IncludeSymbols>\n    <PackageId>ClassLibrary-1</PackageId>\n    <DebugType>portable</DebugType>\n    <Version>1.0.0</Version>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/ClassLibrary1/Point.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ClassLibrary\n{\n    public struct Point\n    {\n        public int X;\n        public int Y;\n\n        public Point(int x, int y)\n        {\n            X = x;\n            Y = y;\n        }\n\n        public void Deconstruct(out int x, out int y)\n        {\n            x = X;\n            y = Y;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/ConsoleApp1/ConsoleApp1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net47</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"ClassLibrary-1\" Version=\"1.0.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Reference Include=\"a\">\n      <HintPath>..\\Lib\\a.dll</HintPath>\n    </Reference>\n    <Reference Include=\"b\">\n      <HintPath>..\\Lib\\b.dll</HintPath>\n    </Reference>\n    <Reference Include=\"c\">\n      <HintPath>..\\Lib\\c.dll</HintPath>\n    </Reference>\n    <Reference Include=\"d\">\n      <HintPath>..\\Lib\\d.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/ConsoleApp1/Program.cs",
    "content": "﻿using A;\nusing System;\nusing System.Linq;\n\nnamespace ConsoleApp1\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var x = new[] { 1, 2, 3, 4, 5 };\n            var a = x.Double().ToArray();\n            var b = x.Halve().ToArray();\n            var c = x.Quarter().ToArray();\n            var d = x.Triple().ToArray();\n\n            Console.WriteLine(string.Join(\", \", x));\n            Console.WriteLine(string.Join(\", \", a));\n            Console.WriteLine(string.Join(\", \", b));\n            Console.WriteLine(string.Join(\", \", c));\n            Console.WriteLine(string.Join(\", \", d));\n\n            Console.WriteLine(ClassLibrary.Class1.Id);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/EmbeddedSource.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27009.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ClassLibrary1\", \"ClassLibrary1\\ClassLibrary1.csproj\", \"{1B1F9358-AA33-4073-B5C3-A57A293642B7}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{2EB27A9C-7316-4279-A818-3FDCBC2B8953}\"\n\tProjectSection(ProjectDependencies) = postProject\n\t\t{1B1F9358-AA33-4073-B5C3-A57A293642B7} = {1B1F9358-AA33-4073-B5C3-A57A293642B7}\n\tEndProjectSection\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{1B1F9358-AA33-4073-B5C3-A57A293642B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1B1F9358-AA33-4073-B5C3-A57A293642B7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1B1F9358-AA33-4073-B5C3-A57A293642B7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1B1F9358-AA33-4073-B5C3-A57A293642B7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2EB27A9C-7316-4279-A818-3FDCBC2B8953}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2EB27A9C-7316-4279-A818-3FDCBC2B8953}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2EB27A9C-7316-4279-A818-3FDCBC2B8953}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2EB27A9C-7316-4279-A818-3FDCBC2B8953}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {557B201C-AD24-41D8-9EAD-771F3D472A28}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/Lib/a.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nnamespace A\n{\n    /// <summary>\n    /// Linq-like.\n    /// </summary>\n    public static class Extensions\n    {\n        /// <summary>\n        /// doubles a sequence.\n        /// </summary>\n        /// <typeparam name=\"T\">type of elements</typeparam>\n        /// <param name=\"source\">source sequence</param>\n        /// <returns>result sequence</returns>\n        public static IEnumerable<T> Double<T>(this IEnumerable<T> source)\n        {\n            if (source == null)\n            {\n                throw new System.ArgumentNullException(nameof(source));\n            }\n\n            return source.Concat(source);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/Lib/b.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nnamespace A\n{\n    /// <summary>\n    /// Linq-like.\n    /// </summary>\n    public static class Extensions\n    {\n        /// <summary>\n        /// halves a sequence.\n        /// </summary>\n        /// <typeparam name=\"T\">type of elements</typeparam>\n        /// <param name=\"source\">source sequence</param>\n        /// <returns>result sequence</returns>\n        public static IEnumerable<T> Halve<T>(this IEnumerable<T> source)\n        {\n            if (source == null)\n            {\n                throw new System.ArgumentNullException(nameof(source));\n            }\n\n            return source.Take(source.Count() / 2);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/Lib/build.ps1",
    "content": "﻿$csc = 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Enterprise\\MSBuild\\15.0\\Bin\\Roslyn\\csc.exe'\n\n& $csc a.cs /t:library /debug:portable /embed\n& $csc b.cs /t:library /debug:embedded /embed\n& $csc c.cs /t:library /debug:portable\n& $csc d.cs /t:library /debug:embedded\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/Lib/c.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nnamespace A\n{\n    /// <summary>\n    /// Linq-like.\n    /// </summary>\n    public static class Extensions\n    {\n        /// <summary>\n        /// quarters a sequence.\n        /// </summary>\n        /// <typeparam name=\"T\">type of elements</typeparam>\n        /// <param name=\"source\">source sequence</param>\n        /// <returns>result sequence</returns>\n        public static IEnumerable<T> Quarter<T>(this IEnumerable<T> source)\n        {\n            if (source == null)\n            {\n                throw new System.ArgumentNullException(nameof(source));\n            }\n\n            return source.Take(source.Count() / 4);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/Lib/d.cs",
    "content": "using System.Collections.Generic;\nusing System.Linq;\n\nnamespace A\n{\n    /// <summary>\n    /// Linq-like.\n    /// </summary>\n    public static class Extensions\n    {\n        /// <summary>\n        /// triples a sequence.\n        /// </summary>\n        /// <typeparam name=\"T\">type of elements</typeparam>\n        /// <param name=\"source\">source sequence</param>\n        /// <returns>result sequence</returns>\n        public static IEnumerable<T> Triple<T>(this IEnumerable<T> source)\n        {\n            if (source == null)\n            {\n                throw new System.ArgumentNullException(nameof(source));\n            }\n\n            return source.Concat(source).Concat(source);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/EmbeddedSource/NuGet.Config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <packageSources>\n    <add key=\"local1\" value=\"ClassLibrary1/bin/Debug\" />\n    <add key=\"nuget.org\" value=\"https://api.nuget.org/v3/index.json\" protocolVersion=\"3\" />\n  </packageSources>\n  <config>\n    <add key=\"DependencyVersion\" value=\"HighestPatch\" />\n  </config>\n</configuration>"
  },
  {
    "path": "Demo/2017/EmbeddedSource/readme.md",
    "content": "With Visual Studio 2017 15.5 Preview\n\n- Roslyn compiler\n  - supports\n    - `/debug:embedded`: embeds pdb info into dll/exe\n    - `/embed`: embeds source codes into pdb (dll/exe if `/debug:embedded`)\n  - see [`Lib/build.ps1`](Lib/build.ps1)\n- MSBuild (csproj)\n  - supports\n    - `/debug:embedded`: `<DebugType>embedded</DebugType>`\n  - does not support\n    - `/embed`\n      - near future (15.6)? `<EmbedSources>embedded</EmbedSources>`\n  - see [`ClassLibrary1/ClassLibrary1.csproj`](ClassLibrary1/ClassLibrary1.csproj)\n- The Debugger in Visual Studio\n  - supports\n    - Step Into (F11) the embedded source codes (in `/embed` pdb and `/debug:embedded /embed` exe)\n  - see: [`ConsoleApp1/Program.cs`](ConsoleApp1/Program.cs)\n    - can step into `Double` (in `a.dll`) and `Halve` (in `b.dll`) even if you remove `a.cs` and `b.cs` in `Lib` directory\n    - can step into `Quarter` (in `c.dll`) iff `c.cs` exists in `Lib` directory\n    - cannot step into `Triple` (in `d.dll`)\n- The C# Editor in Visual Studio\n  - does not support\n    - Go To Definition (F12) to the embedded source codes\n    - Show tooltip with doc comments from the embedded source codes\n"
  },
  {
    "path": "Demo/2017/InOperatorDifferentAssemly/ClassLibrary1/Class1.cs",
    "content": "﻿namespace ClassLibrary1\n{\n    public struct DifferentAssembly\n    {\n        public double W;\n        public double X;\n        public double Y;\n        public double Z;\n\n        public DifferentAssembly(double w, double x, double y, double z)\n        {\n            W = w;\n            X = x;\n            Y = y;\n            Z = z;\n        }\n\n        // by-val\n        public static DifferentAssembly operator +(DifferentAssembly a, DifferentAssembly b)\n            => new DifferentAssembly(\n                a.W + b.W,\n                a.X + b.X,\n                a.Y + b.Y,\n                a.Z + b.Z);\n\n        // by-ref-readonly\n        public static DifferentAssembly operator *(in DifferentAssembly a, in DifferentAssembly b)\n            => new DifferentAssembly(\n                a.W * b.W - a.X * b.X - a.Y * b.Y - a.Z * b.Z,\n                a.W * b.X + a.X * b.W + a.Y * b.Z - a.Z * b.Y,\n                a.W * b.Y + a.Y * b.W + a.Z * b.X - a.X * b.Z,\n                a.W * b.Z + a.Z * b.W + a.X * b.Y - a.Y * b.X);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InOperatorDifferentAssemly/ClassLibrary1/ClassLibrary1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard1.0</TargetFramework>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/InOperatorDifferentAssemly/ConsoleApp1/ConsoleApp1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ClassLibrary1\\ClassLibrary1.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/InOperatorDifferentAssemly/ConsoleApp1/Program.cs",
    "content": "﻿using ClassLibrary1;\nusing System;\n\nnamespace ConsoleApp1\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Legal();\n            Error();\n        }\n\n        private static void Legal()\n        {\n            var a = new SameAssembly(1, 2, 3, 4);\n            var b = new SameAssembly(1, -2, 3, -4);\n\n            // No error.\n            Console.WriteLine(a + b);\n\n            // No error.\n            Console.WriteLine(a * b);\n        }\n\n        private static void Error()\n        {\n            var a = new DifferentAssembly(1, 2, 3, 4);\n            var b = new DifferentAssembly(1, -2, 3, -4);\n\n            // pass by value. No error.\n            Console.WriteLine(a + b);\n\n            // pass by ref readonly.\n            // No error in the Visual Studio C# Editor\n            // but error on build.\n            Console.WriteLine(a * b);\n        }\n    }\n\n    /// <summary>\n    /// The same as <see cref=\"ClassLibrary1.DifferentAssembly\"/>.\n    /// </summary>\n    public struct SameAssembly\n    {\n        public double W;\n        public double X;\n        public double Y;\n        public double Z;\n\n        public SameAssembly(double w, double x, double y, double z)\n        {\n            W = w;\n            X = x;\n            Y = y;\n            Z = z;\n        }\n\n        // by-val\n        public static SameAssembly operator +(SameAssembly a, SameAssembly b)\n            => new SameAssembly(\n                a.W + b.W,\n                a.X + b.X,\n                a.Y + b.Y,\n                a.Z + b.Z);\n\n        // by-ref-readonly\n        public static SameAssembly operator *(in SameAssembly a, in SameAssembly b)\n            => new SameAssembly(\n                a.W * b.W - a.X * b.X - a.Y * b.Y - a.Z * b.Z,\n                a.W * b.X + a.X * b.W + a.Y * b.Z - a.Z * b.Y,\n                a.W * b.Y + a.Y * b.W + a.Z * b.X - a.X * b.Z,\n                a.W * b.Z + a.Z * b.W + a.X * b.Y - a.Y * b.X);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InOperatorDifferentAssemly/InOperatorDifferentAssemly.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27130.2003\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{69CCEF64-8B11-410D-9CA2-6B27821E2090}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibrary1\", \"ClassLibrary1\\ClassLibrary1.csproj\", \"{306F421F-B9F3-4F02-817C-BE7DC6016E9D}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{69CCEF64-8B11-410D-9CA2-6B27821E2090}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{69CCEF64-8B11-410D-9CA2-6B27821E2090}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{69CCEF64-8B11-410D-9CA2-6B27821E2090}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{69CCEF64-8B11-410D-9CA2-6B27821E2090}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{306F421F-B9F3-4F02-817C-BE7DC6016E9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{306F421F-B9F3-4F02-817C-BE7DC6016E9D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{306F421F-B9F3-4F02-817C-BE7DC6016E9D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{306F421F-B9F3-4F02-817C-BE7DC6016E9D}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {5BFEC2F4-DC48-4C18-87A1-572BACF6E030}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/Generics/03 Generics.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/Generics/BenchmarkCode.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Engines;\nusing System;\n\nnamespace Generics\n{\n    [SimpleJob(RunStrategy.Throughput)]\n    public class BenchmarkCode\n    {\n        [Benchmark]\n        public static void GenericCInt() => Target.Max<CInt>(Target.Max<CInt>(1, 3), 2);\n        [Benchmark]\n        public static void InstantiatedCInt() => Instantiated.Max(Instantiated.Max((CInt)1, (CInt)3), (CInt)2);\n\n        [Benchmark]\n        public static void GenericCString() => Target.Max<CString>(Target.Max<CString>(\"abc\", \"acd\"), \"aab\");\n        [Benchmark]\n        public static void InstantiatedCString() => Instantiated.Max(Instantiated.Max((CString)\"abc\", (CString)\"acd\"), (CString)\"aab\");\n\n        [Benchmark]\n        public static void GenericSInt() => Target.Max<SInt>(Target.Max<SInt>(1, 3), 2);\n        [Benchmark]\n        public static void InstantiatedSInt() => Instantiated.MaxSInt(Instantiated.MaxSInt((SInt)1, (SInt)3), (SInt)2);\n        [Benchmark]\n        public static void ObjectSInt() => Instantiated.Max(Instantiated.Max((SInt)1, (SInt)3), (SInt)2);\n\n        [Benchmark]\n        public static void GenericSString() => Target.Max<SString>(Target.Max<SString>(\"abc\", \"acd\"), \"aab\");\n        [Benchmark]\n        public static void InstantiatedSString() => Instantiated.MaxSString(Instantiated.MaxSString((SString)\"abc\", (SString)\"acd\"), (SString)\"aab\");\n        [Benchmark]\n        public static void ObjectSString() => Instantiated.Max(Instantiated.Max((SString)\"abc\", (SString)\"acd\"), (SString)\"aab\");\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/Generics/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace Generics\n{\n    /// <summary>\n    /// .NET のジェネリック メソッドがどんな感じで解釈されているかの例。\n    ///\n    /// 簡単に言うと、\n    /// - 参照型 → 全クラス共通の1つのメソッドに展開\n    /// - 値型   → 1つ1つ別々に展開\n    /// になってる。\n    ///\n    /// この例の内容:\n    /// ・型\n    ///   - C から始まる型(<see cref=\"CInt\"/>, <see cref=\"CString\"/>) … クラスで<see cref=\"ISample\"/>を実装したもの\n    ///   - S から始まる型(<see cref=\"SInt\"/>, <see cref=\"SString\"/>) … 構造体で<see cref=\"ISample\"/>を実装したもの\n    /// ・ベンチマーク\n    ///   - Generic から始まるベンチマーク … ジェネリック メソッドを呼び出す\n    ///   - Instantiated から始まるベンチマーク … そのジェネリック メソッドがどんな感じに展開されているか、手動展開したもの\n    ///   - Object から始まるベンチマーク … (参考)ジェネリックを使わず、object 経由にした場合\n    ///\n    /// 実行すると以下のような感じに。\n    ///               Method |       Mean |    StdErr |    StdDev |  Gen 0 | Allocated |\n    /// -------------------- |----------- |---------- |---------- |------- |---------- |\n    ///          GenericCInt | 21.8227 ns | 0.1326 ns | 0.5134 ns | 0.0069 |      36 B |\n    ///     InstantiatedCInt | 33.9643 ns | 0.3534 ns | 1.9678 ns | 0.0069 |      36 B |\n    ///       GenericCString | 25.9516 ns | 0.1144 ns | 0.4281 ns | 0.0069 |      36 B |\n    ///  InstantiatedCString | 37.5406 ns | 0.1983 ns | 0.6869 ns | 0.0071 |      36 B |\n    ///          GenericSInt |  3.9738 ns | 0.0200 ns | 0.0775 ns |      - |       0 B |\n    ///     InstantiatedSInt |  3.8817 ns | 0.0205 ns | 0.0795 ns |      - |       0 B |\n    ///           ObjectSInt | 36.9110 ns | 0.1633 ns | 0.6326 ns | 0.0067 |      36 B |\n    ///       GenericSString | 15.4912 ns | 0.0675 ns | 0.2614 ns |      - |       0 B |\n    ///  InstantiatedSString | 16.5152 ns | 0.1842 ns | 0.7132 ns |      - |       0 B |\n    ///        ObjectSString | 45.3602 ns | 0.2891 ns | 1.0423 ns | 0.0067 |      36 B |\n    ///\n    /// Generic… と Instantiated… はそんなに差が出ないはず。\n    /// キャスト不要になる分ちょっとだけ Generic… が有利。\n    ///\n    /// 値型に対して Object… を呼んでしまうとだいぶ遅くなる。\n    /// あと、「Gen 0」(GC 発生回数)と「Allocated」(ヒープ確保した量)の列を見ての通り、object を介したときだけヒープ確保が発生。\n    /// これは、値型を object に代入した時点で box 化が起きてるっていうこと。\n    /// ジェネリック メソッドが、値型だけ1つ1つ別々に展開してるのは、box 化を起こさないようにするため。\n    ///\n    /// <see cref=\"SInt\"/>が断トツで速いのは、インライン展開の結果、ほぼ、ただのintに対する操作に展開されてるから。\n    /// 値型に限り、1つ1つ別々に展開された結果、「仮想呼び出しが必要ない」(= インライン展開可能)判定を受けられるようになってる。\n    /// </summary>\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            BenchmarkRunner.Run<BenchmarkCode>();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/Generics/Target.cs",
    "content": "﻿using System;\n\nnamespace Generics\n{\n    interface ISample\n    {\n        int Value { get; }\n    }\n\n    class CInt : ISample\n    {\n        public CInt(int value) => Value = value;\n        public int Value { get; }\n        public static implicit operator CInt(int value) => new CInt(value);\n    }\n\n    class CString : ISample\n    {\n        public CString(string value) => _value = value;\n        public int Value => _value.Length;\n        public string _value;\n        public static implicit operator CString(string value) => new CString(value);\n    }\n\n    struct SInt : ISample\n    {\n        public SInt(int value) => Value = value;\n        public int Value { get; }\n        public static implicit operator SInt(int value) => new SInt(value);\n    }\n\n    struct SString : ISample\n    {\n        public SString(string value) => _value = value;\n        public int Value => _value.Length;\n        public string _value;\n        public static implicit operator SString(string value) => new SString(value);\n    }\n\n    /// <summary>\n    /// 計測の対象。\n    /// </summary>\n    class Target\n    {\n        public static T Max<T>(T x, T y)\n            where T : ISample\n            => x.Value > y.Value ? x : y;\n    }\n\n    /// <summary>\n    /// <see cref=\"Target.Max{T}(T, T)\"/>を、string, Version, int, DateTime 辺りで呼んだ場合、どんな感じになるか手動で展開したもの。\n    /// </summary>\n    class Instantiated\n    {\n        // Max<CInt>, Max<CString> はこういう感じの単一のメソッド呼び出しに展開される。\n        // 参照型に対しては同じメソッドが使いまわされる。\n        // ジェネリックにするメリットは、キャストが消える程度(コスト的にはそこまで大きくない。どちらかというと型安全性の問題)。\n        public static object Max(object x, object y)\n            => ((ISample)x).Value > ((ISample)y).Value ? x : y;\n\n        // 値型に対しては1個1個完全展開。\n        // object 版に値型を渡してしまうと box 化(そこそこのコスト)を起こすので、JITがそれぞれの型専用のコードに展開してしまう。\n        public static SInt MaxSInt(SInt x, SInt y) => x.Value > y.Value ? x : y;\n        public static SString MaxSString(SString x, SString y) => x.Value > y.Value ? x : y;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/InlineExpansion.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26206.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"01 InlinedOrNot\", \"InlinedOrNot\\01 InlinedOrNot.csproj\", \"{17C24ED2-E909-4A51-9F1B-7EE69469C810}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"02 VirtualCall\", \"VirtualCall\\02 VirtualCall.csproj\", \"{FA867395-FC89-4ACE-8971-9F0BFD8081D8}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"03 Generics\", \"Generics\\03 Generics.csproj\", \"{169A9475-3466-4043-8B6C-F10E2A3B30F1}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"04 ValueTypeGenerics\", \"ValueTypeGenerics\\04 ValueTypeGenerics.csproj\", \"{B2E829A0-BB72-40F7-A799-B55707559DE1}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{17C24ED2-E909-4A51-9F1B-7EE69469C810}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{17C24ED2-E909-4A51-9F1B-7EE69469C810}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{17C24ED2-E909-4A51-9F1B-7EE69469C810}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{17C24ED2-E909-4A51-9F1B-7EE69469C810}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{17C24ED2-E909-4A51-9F1B-7EE69469C810}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{17C24ED2-E909-4A51-9F1B-7EE69469C810}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{17C24ED2-E909-4A51-9F1B-7EE69469C810}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{17C24ED2-E909-4A51-9F1B-7EE69469C810}.Release|x64.Build.0 = Release|Any CPU\n\t\t{FA867395-FC89-4ACE-8971-9F0BFD8081D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FA867395-FC89-4ACE-8971-9F0BFD8081D8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FA867395-FC89-4ACE-8971-9F0BFD8081D8}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{FA867395-FC89-4ACE-8971-9F0BFD8081D8}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{FA867395-FC89-4ACE-8971-9F0BFD8081D8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FA867395-FC89-4ACE-8971-9F0BFD8081D8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FA867395-FC89-4ACE-8971-9F0BFD8081D8}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{FA867395-FC89-4ACE-8971-9F0BFD8081D8}.Release|x64.Build.0 = Release|Any CPU\n\t\t{169A9475-3466-4043-8B6C-F10E2A3B30F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{169A9475-3466-4043-8B6C-F10E2A3B30F1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{169A9475-3466-4043-8B6C-F10E2A3B30F1}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{169A9475-3466-4043-8B6C-F10E2A3B30F1}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{169A9475-3466-4043-8B6C-F10E2A3B30F1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{169A9475-3466-4043-8B6C-F10E2A3B30F1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{169A9475-3466-4043-8B6C-F10E2A3B30F1}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{169A9475-3466-4043-8B6C-F10E2A3B30F1}.Release|x64.Build.0 = Release|Any CPU\n\t\t{B2E829A0-BB72-40F7-A799-B55707559DE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B2E829A0-BB72-40F7-A799-B55707559DE1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B2E829A0-BB72-40F7-A799-B55707559DE1}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{B2E829A0-BB72-40F7-A799-B55707559DE1}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{B2E829A0-BB72-40F7-A799-B55707559DE1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B2E829A0-BB72-40F7-A799-B55707559DE1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B2E829A0-BB72-40F7-A799-B55707559DE1}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{B2E829A0-BB72-40F7-A799-B55707559DE1}.Release|x64.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {CC4C3C10-8EA4-402F-8E2C-BFDDD000DED7}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/InlinedOrNot/01 InlinedOrNot.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/InlinedOrNot/BenchmarkCode.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Engines;\nusing System;\n\nnamespace InlinedOrNot\n{\n    [SimpleJob(RunStrategy.Throughput)]\n    public class BenchmarkCode\n    {\n        static int[] testData;\n\n        static BenchmarkCode()\n        {\n            var r = new Random();\n            testData = new int[100];\n\n            for (int i = 0; i < testData.Length; i++)\n            {\n                testData[i] = r.Next();\n            }\n        }\n\n        [Benchmark]\n        public static int ManuallyInlined()\n        {\n            var sum = 0;\n            foreach (var x in testData) sum = sum + x;\n            return sum;\n        }\n\n        [Benchmark]\n        public static int Inlining()\n        {\n            var sum = 0;\n            foreach (var x in testData) sum = Target.Inlining(sum, x);\n            return sum;\n        }\n\n        [Benchmark]\n        public static int NoInlining()\n        {\n            var sum = 0;\n            foreach (var x in testData) sum = Target.NoInlining(sum, x);\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/InlinedOrNot/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace InlinedOrNot\n{\n    /// <summary>\n    /// インライン展開の有無でどのくらい性能差が出るかのベンチマーク。\n    /// 足し算1個だけの処理をループするだけ。\n    ///\n    /// 比較対象:\n    /// - <see cref=\"BenchmarkCode.ManuallyInlined\"/>: (参考) ループ中に + をべた書き\n    /// - <see cref=\"BenchmarkCode.Inlining\"/>       : インライン展開あり(+ 1個だけなら普通はインライン展開される)\n    /// - <see cref=\"BenchmarkCode.NoInlining\"/>     : インライン展開なし(わざわざ抑止オプションを付けてる)\n    ///\n    /// 実行すると以下のような感じに。\n    ///           Method |        Mean |    StdDev |\n    /// ---------------- |------------ |---------- |\n    ///  ManuallyInlined |  81.8159 ns | 3.0530 ns |\n    ///         Inlining |  82.7913 ns | 3.4481 ns |\n    ///       NoInlining | 243.7487 ns | 2.2184 ns |\n    ///\n    /// インライン展開があると、べた書きと同程度の性能になる。\n    ///\n    /// インライン展開しないものは3倍くらい遅い。\n    /// ジャンプ命令が2回(呼び出し → 復帰)挟まったりするコストがかかってる。\n    /// 他にも、レジスターの利用に制限が掛かったり、参照局所性的に不利だったりする。\n    /// 中身が小さい時には無視できないコストになる。\n    ///\n    /// .NET の場合、インライン展開が掛かるには以下のような条件が必要\n    /// - メソッドの中身が十分に小さい(32バイト程度)\n    /// - whileとかswitchとかの制御構文が入っていない\n    /// - 仮想呼び出しになっていない\n    ///\n    /// ちなみに、インライン展開が掛かるタイミングは JIT の際。\n    /// C# コンパイラーが生成する IL は、インライン展開前の状態になってる。\n    /// </summary>\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            BenchmarkRunner.Run<BenchmarkCode>();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/InlinedOrNot/Target.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nnamespace InlinedOrNot\n{\n    /// <summary>\n    /// 計測・比較したい対象。\n    /// </summary>\n    public class Target\n    {\n        // 普通に定義。このくらいの中身だと確実にインライン展開される\n        public static int Inlining(int x, int y) => x + y;\n\n        // インライン展開をわざわざ抑止\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        public static int NoInlining(int x, int y) => x + y;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/ValueTypeGenerics/04 ValueTypeGenerics.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/ValueTypeGenerics/BenchmarkCode.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Engines;\nusing System;\n\nnamespace ValueTypeGenerics\n{\n    [SimpleJob(RunStrategy.Throughput)]\n    public class BenchmarkCode\n    {\n        static int[] _data;\n\n        static BenchmarkCode()\n        {\n            var r = new Random();\n            _data = new int[50];\n            for (int i = 0; i < _data.Length; i++)\n            {\n                _data[i] = r.Next();\n            }\n        }\n\n        [Benchmark] public static void EmbeddedAdd() => Embedded.Sum(_data);\n        [Benchmark] public static void InterfaceAdd() { IGroup g = new AddGroup(); InterfaceParameter.Sum(_data, g); }\n        [Benchmark] public static void TypeClassAdd() => TypeClass.Sm<AddGroup>(_data);\n\n        [Benchmark] public static void EmbeddedMul() => Embedded.Prod(_data);\n        [Benchmark] public static void InterfaceMul() { IGroup g = new MulGroup(); InterfaceParameter.Sum(_data, g); }\n        [Benchmark] public static void TypeClassMul() => TypeClass.Sm<MulGroup>(_data);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/ValueTypeGenerics/IGroup.cs",
    "content": "﻿namespace ValueTypeGenerics\n{\n    /// <summary>\n    /// 零元と加算演算子がある集合。\n    /// </summary>\n    public interface IGroup\n    {\n        int Zero { get; }\n        int Op(int x, int y);\n    }\n\n    /// <summary>\n    /// 加法群。\n    /// </summary>\n    public struct AddGroup : IGroup\n    {\n        public int Zero => 0;\n        public int Op(int x, int y) => x + y;\n    }\n\n    /// <summary>\n    /// 乗法群。\n    /// </summary>\n    public struct MulGroup : IGroup\n    {\n        public int Zero => 1;\n        public int Op(int x, int y) => x * y;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/ValueTypeGenerics/Program.cs",
    "content": "﻿namespace ValueTypeGenerics\n{\n    /// <summary>\n    /// 01～03のまとめ:\n    /// 1. 中身が小さいメソッドは、インライン展開すると数倍速くなる\n    /// 2．仮想呼び出しがだとインライン展開できなくなる/JITの最適化で仮想呼び出しが消えることがある\n    /// 3. ジェネリックは、参照型の場合にはコード共有、値型の場合には個別展開になる\n    ///\n    /// これらを併せて、\n    /// 値型ジェネリックを使って汎用処理を書く → 個別展開される → 仮想呼び出しが消える → インライン展開可能\n    /// という最適化が期待できる。\n    ///\n    /// ということで、以下のような例を考える:\n    /// <see cref=\"System.Linq.Enumerable.Sum(System.Collections.Generic.IEnumerable{int})\"/> は、見ての通り、ジェネリック実装になっていない。\n    /// (int, long, ...など、型ごとに実装がある。)\n    /// でも、総和計算なんて、初期値(0)と2項演算子さえあればどんな型に対しても計算できるはず。\n    /// 実際、<see cref=\"IGroup\"/>みたいなインターフェイスを使えば汎用に総計処理できるはず\n    /// (例として、総和<see cref=\"AddGroup\"/>と総乗<see cref=\"MulGroup\"/>を用意)だし、\n    /// <see cref=\"System.Linq.Enumerable.Aggregate{TSource}(System.Collections.Generic.IEnumerable{TSource}, System.Func{TSource, TSource, TSource})\"/>でそんな感じの処理も書ける。\n    /// ただ、インターフェイスやデリゲートを介すると、上記の「インライン展開」問題で、数倍遅くなってしまう。\n    /// これに対して、01～03から、値型ジェネリックを使った最適化が期待できるので、それを試してみる。\n    /// \n    /// 試しに書いてみたもの:\n    /// <see cref=\"BenchmarkCode.EmbeddedAdd\"/> … + 演算子をベタ書きして(総和と総乗を個別に実装して)計算するもの\n    /// <see cref=\"BenchmarkCode.InterfaceAdd\"/> … (参考)引数にインターフェイス渡して総和を計算。インライン展開ができない\n    /// <see cref=\"BenchmarkCode.TypeClassAdd\"/> … 値型ジェネリックを使った最適化を期待したもの\n    /// 同様に、語尾が Mul のもので総乗を計算。\n    ///\n    /// 実行すると以下のような感じに。\n    ///        Method |        Mean |    StdDev | Allocated |\n    /// ------------- |------------ |---------- |---------- |\n    ///   EmbeddedAdd |  22.5229 ns | 0.2941 ns |       0 B |\n    ///  InterfaceAdd | 140.9058 ns | 1.0286 ns |      12 B |\n    ///  TypeClassAdd |  31.8188 ns | 0.2503 ns |       0 B |\n    ///   EmbeddedMul |  32.4480 ns | 0.1794 ns |       0 B |\n    ///  InterfaceMul | 140.0370 ns | 1.1462 ns |      12 B |\n    ///  TypeClassMul |  33.0551 ns | 0.3279 ns |       0 B |\n    ///\n    /// 期待通りに、\n    /// - インターフェイスを介するとインライン展開されていない(数倍遅い)\n    /// - 値型ジェネリックを使うと、汎用処理であるにもかかわらず、ちゃんとインライン展開が掛かっている(ベタ書き実装と遜色ない)\n    /// となってる。\n    /// </summary>\n    class Program\n    {\n        static void Main()\n        {\n            BenchmarkDotNet.Running.BenchmarkRunner.Run<BenchmarkCode>();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/ValueTypeGenerics/Target.cs",
    "content": "﻿namespace ValueTypeGenerics\n{\n    // 個別実装\n    public class Embedded\n    {\n        public static int Sum(int[] items)\n        {\n            var sum = 0;\n            foreach (var x in items) sum += x;\n            return sum;\n        }\n\n        public static int Prod(int[] items)\n        {\n            var sum = 1;\n            foreach (var x in items) sum *= x;\n            return sum;\n        }\n    }\n\n    // IGroup インターフェイスをを引数で受け取って使う\n    public class InterfaceParameter\n    {\n        public static int Sum(int[] items, IGroup op)\n        {\n            var sum = op.Zero;\n            foreach (var x in items) sum = op.Op(sum, x);\n            return sum;\n        }\n    }\n\n    // 値型ジェネリックを使って IGroup インスタンスを作る\n    public class TypeClass\n    {\n        public static int Sm<TGroup>(int[] items)\n            where TGroup : struct, IGroup\n        {\n            var g = default(TGroup);\n            var sum = g.Zero;\n            foreach (var x in items) sum = g.Op(sum, x);\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/VirtualCall/02 VirtualCall.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/VirtualCall/BenchmarkCode.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Engines;\nusing System;\n\nnamespace VirtualCall\n{\n    [SimpleJob(RunStrategy.Throughput)]\n    public class BenchmarkCode\n    {\n        static A a = new A();\n        static B b = new B();\n        const int Loops = 100;\n\n        [Benchmark]\n        public static int DirectA()\n        {\n            var sum = 0;\n            for (int i = 0; i < Loops; i++) sum += Target.CallA(a);\n            return sum;\n        }\n\n        [Benchmark]\n        public static int DirectB()\n        {\n            var sum = 0;\n            for (int i = 0; i < Loops; i++) sum += Target.CallB(b);\n            return sum;\n        }\n\n        [Benchmark]\n        public static int InterfaceA()\n        {\n            var sum = 0;\n            for (int i = 0; i < Loops; i++) sum += Target.CallInterface(a);\n            return sum;\n        }\n\n        [Benchmark]\n        public static int InterfaceB()\n        {\n            var sum = 0;\n            for (int i = 0; i < Loops; i++) sum += Target.CallInterface(b);\n            return sum;\n        }\n\n        [Benchmark]\n        public static int GenericA()\n        {\n            var sum = 0;\n            for (int i = 0; i < Loops; i++) sum += Target.Call(a);\n            return sum;\n        }\n\n        [Benchmark]\n        public static int GenericB()\n        {\n            var sum = 0;\n            for (int i = 0; i < Loops; i++) sum += Target.Call(b);\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/VirtualCall/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace VirtualCall\n{\n    /// <summary>\n    /// 仮想メソッド呼び出しが絡んだ時のインライン展開状況の確認。\n    ///\n    /// <see cref=\"A\"/>、<see cref=\"B\"/>の中身を見てもらっての通り、やってる処理自体は全く同じなので、\n    /// 性能差が出るとしたらインライン展開されるかどうかの問題。\n    ///\n    /// 比較対象:\n    /// <see cref=\"BenchmarkCode.DirectA\"/> … A 型変数に A 型インスタンス(<see cref=\"A.Value\"/>にはvirtualが付いてない)\n    /// <see cref=\"BenchmarkCode.DirectB\"/> … B 型変数に B 型インスタンス(<see cref=\"B.Value\"/>はvirtual)\n    /// <see cref=\"BenchmarkCode.InterfaceA\"/> … インターフェイス変数に A 型インスタンス\n    /// <see cref=\"BenchmarkCode.InterfaceB\"/> … インターフェイス変数に B 型インスタンス\n    /// <see cref=\"BenchmarkCode.GenericA\"/> … ジェネリック変数に A 型インスタンス\n    /// <see cref=\"BenchmarkCode.GenericB\"/> … ジェネリック変数に B 型インスタンス\n    ///\n    /// 実行すると以下のような感じに。\n    ///      Method |        Mean |    StdErr |     StdDev |\n    /// ----------- |------------ |---------- |----------- |\n    ///     DirectA |  70.2508 ns | 0.7156 ns |  3.5778 ns |\n    ///     DirectB | 205.1713 ns | 1.0471 ns |  4.0555 ns |\n    ///  InterfaceA | 276.4652 ns | 2.7201 ns | 11.2154 ns |\n    ///  InterfaceB | 272.4594 ns | 1.5071 ns |  5.8370 ns |\n    ///    GenericA | 274.8484 ns | 1.0688 ns |  4.1394 ns |\n    ///    GenericB | 275.0965 ns | 1.6639 ns |  6.4443 ns |\n    ///\n    /// 要するに、<see cref=\"A\"/>型の変数/引数に直接<see cref=\"A\"/>型のインスタンスを入れている場合だけインライン展開が掛かってる。\n    /// インターフェイスを介したり、virtual がついていたりするとインライン展開できない。\n    ///\n    /// InlinedOrNot プロジェクトの方にも書いた通り、原則的に、仮想呼び出しになっているものはインライン展開できない。\n    /// ただ、コンパイル時に具体的な型が確定しているようなものは、仮想でない呼び出しに変換する最適化が掛かる(結果的にインライン展開も掛かる)。\n    ///\n    /// この最適化が掛かるのも JIT の際。\n    /// IL 命令的には <see cref=\"Target.CallA(A)\"/> 内の <see cref=\"A.Value\"/> 呼び出しも callvirt 命令(仮想呼び出し)になってる。\n    /// というか、クラスのインスタンスに対するメソッド呼び出しは全部 callvirt になってる。\n    /// けど、JIT 的に「明らかに仮想な必要ない」と判断したものは通常の呼び出しに変換される。\n    ///\n    /// ここで、ジェネリックを使った場合はどうなのかという話もある。\n    /// 「<see cref=\"Target.Call{A}(A)\"/>の呼び出しは<see cref=\"A\"/>型の変数に<see cref=\"A\"/>型のインスタンスが入っていること確定ではないのか」ということになるんだけども…\n    /// この辺りは、ジェネリックがどう展開されているかが絡むのでまた次節で改めて。\n    /// </summary>\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            BenchmarkRunner.Run<BenchmarkCode>();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/InlineExpansion/VirtualCall/Target.cs",
    "content": "﻿namespace VirtualCall\n{\n    interface ISample\n    {\n        int Value { get; }\n    }\n\n    class A : ISample\n    {\n        public int Value => 1;\n    }\n\n    class B : ISample\n    {\n        // B の方にだけ virtual を付ける\n        public virtual int Value => 1;\n    }\n\n    class Target\n    {\n        // A, B の Value を直接呼ぶ\n        public static int CallA(A x) => x.Value;\n        public static int CallB(B x) => x.Value;\n\n        // インターフェイス越しに Value を呼ぶ\n        public static int CallInterface(ISample x) => x.Value;\n\n        // ジェネリック越しに Value を呼ぶ\n        public static int Call<T>(T x) where T : ISample => x.Value;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/IntTemplateParameter/IntTemplateParameter/ConstantInt.cs",
    "content": "﻿namespace IntTemplateParameter\n{\n    public static class ConstantInt\n    {\n        public struct _0 : IConstant<int> { public int Value => 0; }\n        public struct _1 : IConstant<int> { public int Value => 1; }\n        public struct _2 : IConstant<int> { public int Value => 2; }\n        public struct _3 : IConstant<int> { public int Value => 3; }\n        public struct _4 : IConstant<int> { public int Value => 4; }\n        public struct _5 : IConstant<int> { public int Value => 5; }\n        public struct _6 : IConstant<int> { public int Value => 6; }\n        public struct _7 : IConstant<int> { public int Value => 7; }\n        public struct _8 : IConstant<int> { public int Value => 8; }\n        public struct _9 : IConstant<int> { public int Value => 9; }\n        public struct _10 : IConstant<int> { public int Value => 10; }\n        public struct _11 : IConstant<int> { public int Value => 11; }\n        public struct _12 : IConstant<int> { public int Value => 12; }\n        public struct _13 : IConstant<int> { public int Value => 13; }\n        public struct _14 : IConstant<int> { public int Value => 14; }\n        public struct _15 : IConstant<int> { public int Value => 15; }\n        public struct _16 : IConstant<int> { public int Value => 16; }\n        public struct _17 : IConstant<int> { public int Value => 17; }\n        public struct _18 : IConstant<int> { public int Value => 18; }\n        public struct _19 : IConstant<int> { public int Value => 19; }\n        public struct _20 : IConstant<int> { public int Value => 20; }\n        public struct _21 : IConstant<int> { public int Value => 21; }\n        public struct _22 : IConstant<int> { public int Value => 22; }\n        public struct _23 : IConstant<int> { public int Value => 23; }\n        public struct _24 : IConstant<int> { public int Value => 24; }\n        public struct _25 : IConstant<int> { public int Value => 25; }\n        public struct _26 : IConstant<int> { public int Value => 26; }\n        public struct _27 : IConstant<int> { public int Value => 27; }\n        public struct _28 : IConstant<int> { public int Value => 28; }\n        public struct _29 : IConstant<int> { public int Value => 29; }\n        public struct _30 : IConstant<int> { public int Value => 30; }\n        public struct _31 : IConstant<int> { public int Value => 31; }\n        public struct _32 : IConstant<int> { public int Value => 32; }\n        public struct _33 : IConstant<int> { public int Value => 33; }\n        public struct _34 : IConstant<int> { public int Value => 34; }\n        public struct _35 : IConstant<int> { public int Value => 35; }\n        public struct _36 : IConstant<int> { public int Value => 36; }\n        public struct _37 : IConstant<int> { public int Value => 37; }\n        public struct _38 : IConstant<int> { public int Value => 38; }\n        public struct _39 : IConstant<int> { public int Value => 39; }\n        public struct _40 : IConstant<int> { public int Value => 40; }\n        public struct _41 : IConstant<int> { public int Value => 41; }\n        public struct _42 : IConstant<int> { public int Value => 42; }\n        public struct _43 : IConstant<int> { public int Value => 43; }\n        public struct _44 : IConstant<int> { public int Value => 44; }\n        public struct _45 : IConstant<int> { public int Value => 45; }\n        public struct _46 : IConstant<int> { public int Value => 46; }\n        public struct _47 : IConstant<int> { public int Value => 47; }\n        public struct _48 : IConstant<int> { public int Value => 48; }\n        public struct _49 : IConstant<int> { public int Value => 49; }\n        public struct _50 : IConstant<int> { public int Value => 50; }\n        public struct _51 : IConstant<int> { public int Value => 51; }\n        public struct _52 : IConstant<int> { public int Value => 52; }\n        public struct _53 : IConstant<int> { public int Value => 53; }\n        public struct _54 : IConstant<int> { public int Value => 54; }\n        public struct _55 : IConstant<int> { public int Value => 55; }\n        public struct _56 : IConstant<int> { public int Value => 56; }\n        public struct _57 : IConstant<int> { public int Value => 57; }\n        public struct _58 : IConstant<int> { public int Value => 58; }\n        public struct _59 : IConstant<int> { public int Value => 59; }\n        public struct _60 : IConstant<int> { public int Value => 60; }\n        public struct _61 : IConstant<int> { public int Value => 61; }\n        public struct _62 : IConstant<int> { public int Value => 62; }\n        public struct _63 : IConstant<int> { public int Value => 63; }\n        public struct _64 : IConstant<int> { public int Value => 64; }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/IntTemplateParameter/IntTemplateParameter/ConstantInt.tt",
    "content": "﻿<#@ template debug=\"false\" hostspecific=\"false\" language=\"C#\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ import namespace=\"System.Text\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n<#@ output extension=\".cs\" #>\nnamespace IntTemplateParameter\n{\n    public static class ConstantInt\n    {\n<#\nfor (var i = 0; i <= 64; ++i)\n{\n#>\n        public struct _<#= i #> : IConstant<int> { public int Value => <#= i #>; }\n<#\n}\n#>\n    }\n}\n"
  },
  {
    "path": "Demo/2017/IntTemplateParameter/IntTemplateParameter/GaloisField.cs",
    "content": "﻿namespace IntTemplateParameter\n{\n    using static ConstantInt;\n\n    public static class GaloisField\n    {\n        public static GaloisField<_2> Gf2(this int i) => new GaloisField<_2>(i);\n        public static GaloisField<_3> Gf3(this int i) => new GaloisField<_3>(i);\n        public static GaloisField<_5> Gf5(this int i) => new GaloisField<_5>(i);\n        public static GaloisField<_7> Gf7(this int i) => new GaloisField<_7>(i);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/IntTemplateParameter/IntTemplateParameter/GaloisField_N.cs",
    "content": "﻿using System;\n\nnamespace IntTemplateParameter\n{\n    /// <summary>\n    /// ガロアの有限体。\n    /// </summary>\n    /// <typeparam name=\"N\">有限体のモジュロ。</typeparam>\n    public struct GaloisField<N> : IEquatable<GaloisField<N>>\n        where N : struct, IConstant<int>\n    {\n        /// <summary>\n        /// 有限体のモジュロ。\n        /// </summary>\n        public static int Modulo => default(N).Value;\n\n        private int _value;\n        public GaloisField(int value) => _value = Mod(value);\n        public override string ToString() => _value.ToString();\n\n        public static explicit operator int(GaloisField<N> value) => value._value;\n        public static implicit operator GaloisField<N>(int value) => new GaloisField<N>(value);\n\n        public bool Equals(GaloisField<N> other) => _value == other._value;\n        public override bool Equals(object obj) => obj is GaloisField<N> other && Equals(other);\n        public override int GetHashCode() => _value.GetHashCode();\n        public static bool operator == (GaloisField<N> x, GaloisField<N> y) => x.Equals(y);\n        public static bool operator != (GaloisField<N> x, GaloisField<N> y) => !x.Equals(y);\n\n        public GaloisField<N> Inverse() => new GaloisField<N>(Egcd(_value, default(N).Value).x);\n        public static GaloisField<N> operator +(GaloisField<N> x) => x;\n        public static GaloisField<N> operator -(GaloisField<N> x) => new GaloisField<N>(-x._value);\n\n        public static GaloisField<N> operator +(GaloisField<N> x, GaloisField<N> y) => new GaloisField<N>(x._value + y._value);\n        public static GaloisField<N> operator -(GaloisField<N> x, GaloisField<N> y) => new GaloisField<N>(x._value - y._value);\n        public static GaloisField<N> operator *(GaloisField<N> x, GaloisField<N> y) => new GaloisField<N>(x._value * y._value);\n        public static GaloisField<N> operator /(GaloisField<N> x, GaloisField<N> y) => x * y.Inverse();\n\n        /// <summary>\n        /// 拡張ユークリッド互除法で、a * x + b * y == 1 (mod gcd(a, b)) となるような x, y を計算する。\n        /// b に N (素数前提)を与えることで、a * x == 1 (mode N) になるような x を計算で来て、a の逆元が求まる。\n        /// </summary>\n        static (int x, int y) Egcd(int a, int b)\n        {\n            if (b == 0) return (1, 0);\n            else\n            {\n                var (y, x) = Egcd(b, a % b);\n                y -= (a / b) * x;\n                return (x, y);\n            }\n        }\n\n        /// <summary>\n        /// <paramref name=\"i\"/>をNで割った余りを計算する。\n        /// C# の % だと、i が負の時に結果が負になるので、その場合には N を足して正にする。\n        /// </summary>\n        static int Mod(int i)\n        {\n            i %= default(N).Value;\n            if (i < 0) i += default(N).Value;\n            return i;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/IntTemplateParameter/IntTemplateParameter/IConstant.cs",
    "content": "﻿namespace IntTemplateParameter\n{\n    /// <summary>\n    /// 定数もどきジェネリクスのために使うインターフェイス。\n    /// </summary>\n    /// <remarks>\n    /// 1. このインターフェイスを実装して、定数を返す構造体を作る(例: <see cref=\"ConstantInt._0\"/>)\n    /// 2. その構造体から、default(T).Value で値を取り出す\n    /// 3. 値型ジェネリックの性質上、インライン展開されて、そこそこ良い最適化が掛かる期待がある。\n    /// </remarks>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface IConstant<T>\n    {\n        T Value { get; }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/IntTemplateParameter/IntTemplateParameter/IntTemplateParameter.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Update=\"ConstantInt.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>ConstantInt.tt</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"ConstantInt.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>ConstantInt.cs</LastGenOutput>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Service Include=\"{508349B6-6B84-4DF5-91F0-309BEEBAD82D}\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2017/IntTemplateParameter/IntTemplateParameter/Program.cs",
    "content": "﻿using System;\nusing static IntTemplateParameter.ConstantInt;\n\nnamespace IntTemplateParameter\n{\n    using Gf2 = GaloisField<_2>;\n    using Gf3 = GaloisField<_3>;\n    using Gf5 = GaloisField<_5>;\n    using Gf7 = GaloisField<_7>;\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            TestGf2();\n            TestGf3();\n            TestGf5();\n            TestGf7();\n        }\n\n        static void TestGf2()\n        {\n            Gf2 x = 0;\n            AssertEqual(x + 1, 1);\n            AssertEqual(x * 1, 0);\n\n            x = 1;\n            AssertEqual(x.Inverse(), 1);\n            AssertEqual(x + 1, 0);\n            AssertEqual(x * 1, 1);\n\n            for (int i = 1; i < Gf2.Modulo; i++)\n            {\n                // N 回足したら必ず 0\n                Gf2 s = 0;\n                for (int n = 0; n < Gf2.Modulo; n++) s += i;\n                AssertEqual(s, 0);\n\n                // N - 1 回掛けたら必ず 1\n                Gf2 p = 1;\n                for (int n = 0; n < Gf2.Modulo - 1; n++) p *= i;\n                AssertEqual(p, 1);\n            }\n        }\n\n        static void TestGf3()\n        {\n            Gf3 x = 0;\n            AssertEqual(x + 1, 1);\n            AssertEqual(x * 1, 0);\n\n            x = 1;\n            AssertEqual(x.Inverse(), 1);\n            AssertEqual(x + 1, 2);\n            AssertEqual(x + 2, 0);\n            AssertEqual(x * 1, 1);\n            AssertEqual(x * 2, 2);\n\n            x = 2;\n            AssertEqual(x.Inverse(), 2);\n            AssertEqual(x + 1, 0);\n            AssertEqual(x + 2, 1);\n            AssertEqual(x * 1, 2);\n            AssertEqual(x * 2, 1);\n\n            for (int i = 1; i < Gf3.Modulo; i++)\n            {\n                // N 回足したら必ず 0\n                Gf3 s = 0;\n                for (int n = 0; n < Gf3.Modulo; n++) s += i;\n                AssertEqual(s, 0);\n\n                // N - 1 回掛けたら必ず 1\n                Gf3 p = 1;\n                for (int n = 0; n < Gf3.Modulo - 1; n++) p *= i;\n                AssertEqual(p, 1);\n            }\n        }\n\n        static void TestGf5()\n        {\n            Gf5 x = 0;\n            AssertEqual(x + 1, 1);\n            AssertEqual(x * 1, 0);\n\n            x = 2;\n            AssertEqual(x.Inverse(), 3);\n            AssertEqual(x + 1, 3);\n            AssertEqual(x + 4, 1);\n            AssertEqual(x * 2, 4);\n            AssertEqual(x * 4, 3);\n\n            x = 3;\n            AssertEqual(x.Inverse(), 2);\n            AssertEqual(x + 4, 2);\n            AssertEqual(x + 2, 0);\n            AssertEqual(x * 3, 4);\n            AssertEqual(x * 2, 1);\n\n            for (int i = 1; i < Gf5.Modulo; i++)\n            {\n                // N 回足したら必ず 0\n                Gf5 s = 0;\n                for (int n = 0; n < Gf5.Modulo; n++) s += i;\n                AssertEqual(s, 0);\n\n                // N - 1 回掛けたら必ず 1\n                Gf5 p = 1;\n                for (int n = 0; n < Gf5.Modulo - 1; n++) p *= i;\n                AssertEqual(p, 1);\n            }\n        }\n\n        static void TestGf7()\n        {\n            Gf7 x = 0;\n            AssertEqual(x + 1, 1);\n            AssertEqual(x * 1, 0);\n\n            x = 3;\n            AssertEqual(x.Inverse(), 5);\n            AssertEqual(x + 6, 2);\n            AssertEqual(x + 3, 6);\n            AssertEqual(x * 2, 6);\n            AssertEqual(x * 4, 5);\n\n            x = 6;\n            AssertEqual(x.Inverse(), 6);\n            AssertEqual(x + 4, 3);\n            AssertEqual(x + 2, 1);\n            AssertEqual(x * 3, 4);\n            AssertEqual(x * 2, 5);\n\n            for (int i = 1; i < Gf7.Modulo; i++)\n            {\n                // N 回足したら必ず 0\n                Gf7 s = 0;\n                for (int n = 0; n < Gf7.Modulo; n++) s += i;\n                AssertEqual(s, 0);\n\n                // N - 1 回掛けたら必ず 1\n                Gf7 p = 1;\n                for (int n = 0; n < Gf7.Modulo - 1; n++) p *= i;\n                AssertEqual(p, 1);\n            }\n        }\n\n        static void AssertEqual<T>(T x, T y)\n            where T : IEquatable<T>\n        {\n            if (!x.Equals(y)) throw new InvalidOperationException();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/IntTemplateParameter/IntTemplateParameter/readme.md",
    "content": "﻿# C++ の `template<int N>` もどきを C# で\n\n※過度の期待はしないでください\n\n## 整数値テンプレート引数\n\nC++ の template でしかできないことの1つに、テンプレート引数に int を取れることがある。\n有名なのが、数論系のライブラリで、ガロアの有限体を作る例。C++ だと、\n\n```cpp\ntemplate<int N>\nclass GaloisField\n{\n}\n```\n\nみたいな定義で、`GaloisField<2>` とか `GaloisField<3>` とか(ぞれぞれ別の型扱いされる)を作れる。\n\n## C# の値型ジェネリクス最適化\n\n詳しくはこの辺りを: https://github.com/ufcpp/UfcppSample/tree/master/Demo/2017/InlineExpansion\n\nC# のジェネリクスでは、整数値を直接ジェネリック引数に取れない(「型引数」って呼ばれるように、型しかパラメーター化できない)。\nけど、C# のジェネリクスの以下のような性質を使って、疑似的な整数値ジェネリック引数ができるんじゃないかという発想。\n\n- 型引数に値型を渡すと、型毎に個別展開が行われる\n- 値型に対しては、`default(T).Method()` とかで、インスタンスを作らなくてもメソッドなどのメンバーを呼べる\n- virtual ではない小さい関数メンバーは、インライン展開が掛かって高速かできる\n\n## このプロジェクトでやっていること\n\n要するに、定数引数の代わりに、「定数っぽい挙動をする型引数」を使ってごまかす。\n\n以下のC++コードの代わりに、\n\n```cpp\ntemplate<int N>\nclass GaloisField\n{\n    // N で有限体のモジュロを表現\n}\n```\n\n以下のようなC#コードを用意する。\n\n```cs\nstruct GaloisField<N>\n    where N : IConstant<N>\n{\n    // default(N).Value で有限体のモジュロを表現\n}\n```\n\n`N`に対して直接整数値を渡せないので、代わりに、以下のような型を用意。\n\n```cs\npublic static class ConstantInt\n{\n    public struct _0 : IConstant<int> { public int Value => 0; }\n    public struct _1 : IConstant<int> { public int Value => 1; }\n    public struct _2 : IConstant<int> { public int Value => 2; }\n    ...\n}\n```\n\nC++ の `GaloisField<2>` とかの代わりに、`GaloisField<ConstantInt._2>` で、モジュロ2の有限体が作れる。\n\n## 制限事項\n\n仕組み上、`struct _0` みたいな型を大量に作らないといけない。\n今回の例では、T4 テンプレートを使って、0～64までを生成。それ以上の値は未提供。\n\nあと、定数(C#言語文法のconst)と比べるとやっぱりちょっと最適化掛かりにくいはず。\n"
  },
  {
    "path": "Demo/2017/IntTemplateParameter/IntTemplateParameter.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26403.7\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"IntTemplateParameter\", \"IntTemplateParameter\\IntTemplateParameter.csproj\", \"{1A4C40F3-F7FF-41B8-A832-0C16ED307FE5}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{1A4C40F3-F7FF-41B8-A832-0C16ED307FE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1A4C40F3-F7FF-41B8-A832-0C16ED307FE5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1A4C40F3-F7FF-41B8-A832-0C16ED307FE5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1A4C40F3-F7FF-41B8-A832-0C16ED307FE5}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/DisposePattern/02 DisposePattern.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/DisposePattern/Counter.cs",
    "content": "﻿using System;\nusing System.Threading;\n\nnamespace DisposePattern\n{\n    /// <summary>\n    /// 生成されているインスタンス数の現在値、過去の最大値をカウントするためのクラス。\n    /// </summary>\n    class Counter\n    {\n        public int _current;\n\n        public int Current => _current;\n        public int Max { get; private set; }\n\n        public void Increment()\n        {\n            Interlocked.Increment(ref _current);\n            Max = Math.Max(Max, _current);\n        }\n\n        public void Decrement() => Interlocked.Decrement(ref _current);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/DisposePattern/IReferenceCoutable.cs",
    "content": "﻿using System;\nusing System.Threading;\n\nnamespace DisposePattern\n{\n    /// <summary>\n    /// 参照カウントでリソース管理するためのインターフェイス。\n    /// </summary>\n    public interface IReferenceCoutable : IDisposable\n    {\n        /// <summary>\n        /// 今現在このインスタンスが参照されている数。\n        /// </summary>\n        ref int Count { get; }\n    }\n\n    /// <summary>\n    /// <see cref=\"IReferenceCoutable\"/>がらみの基本操作。\n    /// </summary>\n    /// <remarks>\n    /// 以下のようなルールでの運用が必須。\n    ///\n    /// - InitやShareを空呼びしない(変数で受ける必要がある)\n    /// - 最初に必ず1回Initを呼ぶ必要がある\n    /// - T型の変数に対して、Init、Share、Moveを介さない生代入をしてはいけない\n    /// - T型の変数の書き換え(再代入)をしてはいけない\n    /// - T型の変数に対して、Moveがない限り必ずReleaseを呼ばなければならない\n    ///   (確実に呼ばれるよう、finally句で呼ぶ必要あり)\n    /// - <see cref=\"IReferenceCoutable\"/>フィールドを持ちたい場合、その型も<see cref=\"IReferenceCoutable\"/>でなければならないし、\n    ///   <see cref=\"IDisposable.Dispose\"/>でフィールドをReleaseしなければならない\n    /// - 参照渡しでもらったT型の変数に対してMoveやReleaseはできない\n    ///\n    /// ルールが面倒なので、Analyzer を書いて静的コード解析でルールを強制できないと使い物にならない。\n    /// 逆に言うと、静的コード解析ができる分、Analyzerさえあれば自前でDispose管理するよりは気が楽。\n    /// (誰がDisposeの義務を負っているかが明確で、漏れていたらコンパイルエラーにできる。)\n    /// 何なら、コンパイラーによる何らかのサポートが入るべき。\n    /// </remarks>\n    public static class ReferenceCoutable\n    {\n        /// <summary>\n        /// 参照カウントの初期化。\n        /// 最初に必ず1回このメソッド呼ばないといけない。\n        /// </summary>\n        public static T Init<T>(this T obj)\n            where T : IReferenceCoutable\n        {\n            obj.Count = 1;\n            return obj;\n        }\n\n        /// <summary>\n        /// リソースを共有する。\n        /// </summary>\n        /// <remarks>\n        /// <see cref=\"IReferenceCoutable.Count\"/>を増やす。\n        /// 呼び出し元、戻り値で返した側の両方で <see cref=\"Release{T}(T)\"/>義務が発生。\n        /// </remarks>\n        public static T Share<T>(this T obj)\n            where T : IReferenceCoutable\n        {\n            Interlocked.Increment(ref obj.Count);\n            return obj;\n        }\n\n        /// <summary>\n        /// リソースを譲渡(所有権の移転)する。\n        /// </summary>\n        /// <remarks>\n        /// このメソッドを呼んで以降は、呼び出し元側の変数をもう使ってはいけない。\n        /// その代わり、呼び出し元からは<see cref=\"Release{T}(T)\"/>義務が消える。\n        /// </remarks>\n        public static T Move<T>(this T obj)\n            where T : IReferenceCoutable\n        {\n            return obj;\n        }\n\n        /// <summary>\n        /// リソースを開放する。\n        /// </summary>\n        /// <remarks>\n        /// <see cref=\"IReferenceCoutable.Count\"/>を減らして。\n        /// </remarks>\n        public static void Release<T>(this T obj)\n            where T : IReferenceCoutable\n        {\n            if (Interlocked.Decrement(ref obj.Count) == 0)\n            {\n                obj.Dispose();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/DisposePattern/Program.cs",
    "content": "﻿namespace DisposePattern\n{\n    /// <summary>\n    /// HeapAllocation プロジェクトの方で、単にヒープメモリ管理するだけなら GC を避ける理由はないという話はしたものの。\n    /// 一方で、.NET 管理外リソース(ファイルとかネットワーク コネクションとか、ネイティブ相互運用で得るリソース)は GC に頼るわけにはいかない。\n    /// 通常、<see cref=\"IDisposable\"/> を実装して明示的にリソースを解放するものの、Dispose忘れや、2重Disposeを起こしかねない(C++時代に戻ったかのようなつらさ)。\n    /// Dispose忘れくらい静的コード解析で対応できないのかと思うかもしれないけども、同じインスタンスを複数個所で使うと、「誰がDispose義務を負っていて、誰は負っていない」みたいなのの判定がかなり難しい。\n    /// 結局、この用途だと、参照カウント方式(それなりにコストはかかる)が現実解になるかもしれないという話。\n    /// </summary>\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Tests.ManualDispose.Test();\n            Tests.Finalizer.Test();\n            Tests.StructCantHaveFinalizer.Test();\n            Tests.ReferenceCount.Test();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/DisposePattern/Tests/01 ManualDispose.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace DisposePattern.Tests\n{\n    /// <summary>\n    /// ちゃんと正しく Dispose を管理できている例。\n    /// </summary>\n    /// <remarks>\n    /// 最低限の寿命で Dispose してるので、<see cref=\"Counter.Max\"/>はせいぜい並列度分までしか増えないはず。\n    /// パフォーマンスを考えるとちゃんと Dispose しろという話ではあるんだけど…\n    ///\n    /// この例のはそんなに複雑じゃない(await WhenAll するだけでいい)から管理が楽だけど、実際にはもっと面倒なこともある。\n    /// それに、呼び忘れがないか注意を払い続けるのは結構しんどい\n    /// (C++でnew/deleteを自前管理してた頃を彷彿とさせる)。\n    /// GCの楽さに慣れてしまった今となっては、この自前 Dispose 管理が旧時代的に見えてなおつらい。\n    /// </remarks>\n    class ManualDispose\n    {\n        public static void Test()\n        {\n            var counter = new Counter();\n            var r = new Random();\n\n            Task.WhenAll(Enumerable.Range(0, Constants.Parallelism).Select(_ => RunTask(counter, new Random()))).Wait();\n\n            Console.WriteLine($\"手動 Dispose, max: {counter.Max}, current: {counter.Current}\");\n        }\n\n        private static async Task RunTask(Counter counter, Random r)\n        {\n            var s = new SampleDisopsable(counter);\n\n            await Task.WhenAll(\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()));\n\n            // 正しく子タスクが全部終わったことを確認してから s を Dispose しないといけない\n            s.Dispose();\n        }\n\n        // s の Dispose 債務はこっち側にあるのか、呼び出し元にあるのかが不明\n        static async Task RunSubTask(SampleDisopsable s, TimeSpan delayTime)\n        {\n            await Task.Delay(delayTime);\n            // この例の場合は呼び出し元側でちゃんと管理しているからここで Dispose を呼んじゃダメ\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/DisposePattern/Tests/02 Finalizer.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace DisposePattern.Tests\n{\n    /// <summary>\n    /// Dispose 漏れがある場合の例。\n    /// </summary>\n    /// <remarks>\n    /// <see cref=\"SampleDisopsable\"/>はDisposeを呼ばなくてもデストラクター(Finalizer)でカウントダウンしているので、最終的に、GCさえ走れば<see cref=\"Counter.Current\"/>は0に戻るはず。\n    /// ただ、当然、無駄に寿命が伸びるんで、<see cref=\"Counter.Max\"/>は増える。\n    ///\n    /// <see cref=\"GC.Collect\"/>でGCを強制的に掛けているのでDisposeされずに残る時間はそこまで長くないけど、\n    /// GC強制起動とか普通はやらない操作なので、本来はもっと長時間Disposeされずに残る。\n    ///\n    /// それに、Finalizerの呼び出し自体が実は結構負担高い。\n    /// <see cref=\"SampleDisopsable.Dispose\"/>内で<see cref=\"GC.SuppressFinalize(object)\"/>を呼んでるのも、\n    /// そもそもFinalizerが呼ばれないようにしてパフォーマンスを向上させるため。\n    ///\n    /// 後述(<see cref=\"StructCantHaveFinalizer\"/>で説明するように、クラス(参照型)でしかこの手段(Finalizerに期待する)が使えないのも問題。\n    /// </remarks>\n    class Finalizer\n    {\n        public static void Test()\n        {\n            var counter = new Counter();\n            var r = new Random();\n\n            Task.WhenAll(Enumerable.Range(0, Constants.Parallelism).Select(_ => RunTask(counter, new Random()))).Wait();\n\n            // GCを掛けて、Finalizer 完了待ちしないと Current が 0 にならない。\n            GC.Collect(2, GCCollectionMode.Forced, true);\n            GC.WaitForPendingFinalizers();\n\n            Console.WriteLine($\"デストラクター任せ, max: {counter.Max}, current: {counter.Current}\");\n        }\n\n        private static async Task RunTask(Counter counter, Random r)\n        {\n            var s = new SampleDisopsable(counter);\n\n            await Task.WhenAll(\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()));\n\n            // 「子タスクの誰かが Dispose 呼ぶんじゃないかなぁ」みたいな「にらめっこ」の結果、Dispose が呼ばれてないとする\n        }\n\n        // s の Dispose 債務はこっち側にあるのか、呼び出し元にあるのかが不明\n        static async Task RunSubTask(SampleDisopsable s, TimeSpan delayTime)\n        {\n            await Task.Delay(delayTime);\n            // この例の場合は呼び出し元側でちゃんと管理していると思っているので、Dispose は呼ばない\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/DisposePattern/Tests/03 StructCantHaveFinalizer.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace DisposePattern.Tests\n{\n    /// <summary>\n    /// <see cref=\"Finalizer\"/>の例と同じことを構造体でやるとどうなるか。\n    /// すなわち、構造体でDispose漏れがある場合の例。\n    /// </summary>\n    /// <remarks>\n    /// クラス(参照型)でしかFinalizerが使えないので、構造体でDispose漏れを起こしたらその時点でリソースリーク確定。\n    /// GCを掛けようが何しようが、<see cref=\"Counter.Current\"/>は増えっぱなし(リーク)。\n    /// \n    /// この例(<see cref=\"Counter\"/>を1個だけ持つ小さい型)だけでなく、構造体を使いたい場面は結構多いはず。\n    /// 例えば、以下のように、小さいデータしか持たないものは構造体にしたい\n    /// (Native相互運用する上で、ポインターとかハンドル値とかを1個だけ持つ型ってのは高頻度であり得る)。\n    /// <code><![CDATA[\n    /// struct Sample : IDisposable\n    /// {\n    ///     IntPtr pointerToNativeResource;\n    ///     public void Disose() => ReleaseNativeResource();\n    /// }\n    /// ]]></code>\n    /// そうしたいけどもできない理由が、ここで例示したような、Dispose漏れをFinalizerでカバーできないという問題。\n    /// </remarks>\n    class StructCantHaveFinalizer\n    {\n        public static void Test()\n        {\n            var counter = new Counter();\n            var r = new Random();\n\n            Task.WhenAll(Enumerable.Range(0, Constants.Parallelism).Select(_ => RunTask(counter, new Random()))).Wait();\n\n            // GCを掛けたところで無駄。構造体はGC管理されてない。カウントダウン処理はどこからも実行されない。\n            GC.Collect(2, GCCollectionMode.Forced, true);\n            GC.WaitForPendingFinalizers();\n\n            Console.WriteLine($\"構造体でDisose漏れ, max: {counter.Max}, current: {counter.Current}\");\n        }\n\n        private static async Task RunTask(Counter counter, Random r)\n        {\n            var s = new SampleDisopsableStruct(counter);\n\n            await Task.WhenAll(\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()),\n                RunSubTask(s, r.Time()));\n\n            // 「子タスクの誰かが Dispose 呼ぶんじゃないかなぁ」みたいな「にらめっこ」の結果、Dispose が呼ばれてないとする\n        }\n\n        // s の Dispose 債務はこっち側にあるのか、呼び出し元にあるのかが不明\n        static async Task RunSubTask(SampleDisopsableStruct s, TimeSpan delayTime)\n        {\n            await Task.Delay(delayTime);\n            // この例の場合は呼び出し元側でちゃんと管理していると思っているので、Dispose は呼ばない\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/DisposePattern/Tests/04 ReferenceCount.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace DisposePattern.Tests\n{\n    /// <summary>\n    /// <see cref=\"StructCantHaveFinalizer\"/>とかとやってることは一緒。\n    /// 参照カウント処理を足した。\n    /// </summary>\n    /// <remarks>\n    /// HeapAllocationの例で示した通り、参照カウント自体そこそこ処理負担はある。\n    /// それでも、Finalizerに任せるよりはマシな負担だし、構造体を使えるのも大きい。\n    ///\n    /// 現状のC#だとコンパイラーのサポートがないので、Analyzerを書かないと静的チェックが効かないものの、そのAnalyzerを作る価値はあるかも。\n    /// もしかしたらコンパイラーのサポートを入れるべきかもしれない。\n    /// </remarks>\n    class ReferenceCount\n    {\n        public static void Test()\n        {\n            var counter = new Counter();\n            var r = new Random();\n\n            Task.WhenAll(Enumerable.Range(0, Constants.Parallelism).Select(_ => RunTask(counter, new Random()))).Wait();\n\n            Console.WriteLine($\"参照カウント, max: {counter.Max}, current: {counter.Current}\");\n        }\n\n        private static async Task RunTask(Counter counter, Random r)\n        {\n            var s = new SampleReferenceCount(counter).Init();\n\n            await Task.WhenAll(\n                RunSubTask(s.Share(), r.Time()),\n                RunSubTask(s.Share(), r.Time()),\n                RunSubTask(s.Share(), r.Time()),\n                RunSubTask(s.Share(), r.Time()),\n                RunSubTask(s.Share(), r.Time()),\n                RunSubTask(s.Move(), r.Time())); // 1個Moveしたので、もう親側にRelease義務なし\n        }\n\n        // s の Dispose 債務はこっち側にあるのか、呼び出し元にあるのかが不明\n        static async Task RunSubTask(SampleReferenceCount s, TimeSpan delayTime)\n        {\n            await Task.Delay(delayTime);\n\n            // 値渡しで s を受け取ってるので、Release義務が発生\n            // Releaseしないとコンパイルエラーになるべき(要Analyzer)\n            s.Release();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/DisposePattern/Tests/Constants.cs",
    "content": "﻿using System;\n\nnamespace DisposePattern.Tests\n{\n    static class Constants\n    {\n        /// <summary>\n        /// テスト用のコードを何並列で実行するか。\n        /// </summary>\n        public const int Parallelism = 10000;\n\n        /// <summary>\n        /// Delay 用に、ランダムな時間を作って返す。\n        /// </summary>\n        public static TimeSpan Time(this Random r) => TimeSpan.FromMilliseconds(r.NextDouble() * 30 + 1);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/DisposePattern/Tests/SampleDisopsable.cs",
    "content": "﻿using System;\nusing System.Threading;\n\nnamespace DisposePattern.Tests\n{\n    /// <summary>\n    /// コンストラクターでカウント +１、Dispose/デストラクターで -1 するクラス。\n    /// 2重Disposeされるとそれはそれでまずいという想定で、2度目のDisposeでは例外を投げる。\n    /// </summary>\n    /// <remarks>\n    /// 正しく Dipose されてればカウント数はそんなに増えないはずだけど、\n    /// デストラクター任せにするとGC発動するまでの間カウントが溜まってしまう。\n    /// かといって、2重Dispose禁止な実装なので、過剰になってもいいからDisposeしておくってわけにはいかない。\n    ///\n    /// このクラスは所詮ダミーで、カウントがいくら増えようと大した負担ではないけども、\n    /// 実用途だと、例えば数十～数百MBのグラフィックリソースを握っていたり、限りあるネットワークリソースを握っていたりする可能性があって、\n    /// カウントがあんまり増えると壊滅的にパフォーマンスを落とすはず。\n    /// </remarks>\n    class SampleDisopsable : IDisposable\n    {\n        private Counter _counter;\n\n        public SampleDisopsable(Counter counter)\n        {\n            counter.Increment();\n            _counter = counter;\n        }\n\n        public void Dispose()\n        {\n            Dispose(true);\n            GC.SuppressFinalize(this);\n        }\n\n        ~SampleDisopsable() => Dispose(false);\n\n        protected virtual void Dispose(bool isDisposing)\n        {\n            var c = Interlocked.Exchange(ref _counter, null);\n            if (c == null) throw new Exception(\"2重Disposeずるとまずいという想定\");\n            c.Decrement();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/DisposePattern/Tests/SampleDisopsableStruct.cs",
    "content": "﻿using System;\nusing System.Threading;\n\nnamespace DisposePattern.Tests\n{\n    /// <summary>\n    /// <see cref=\"SampleDisopsable\"/>とやっていることは一緒。\n    /// <see cref=\"Counter\"/>を1個だけ持つような小さい型に対して参照型(class)は使いたくないからstructに変えましたというもの。\n    /// </summary>\n    /// <remarks>\n    /// この手の class → struct への変更は、結構パフォーマンス向上に効き目がある。\n    /// その一方で、構造体だとデストラクターを使えないので、Dispose忘れが即リソース解放漏れになる。\n    /// </remarks>\n    struct SampleDisopsableStruct : IDisposable\n    {\n        private Counter _counter;\n\n        public SampleDisopsableStruct(Counter counter)\n        {\n            counter.Increment();\n            _counter = counter;\n        }\n\n        public void Dispose()\n        {\n            var c = Interlocked.Exchange(ref _counter, null);\n            if (c == null) throw new Exception(\"2重Disposeずるとまずいという想定\");\n            c.Decrement();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/DisposePattern/Tests/SampleReferenceCount.cs",
    "content": "﻿using System;\nusing System.Threading;\n\nnamespace DisposePattern.Tests\n{\n    /// <summary>\n    /// <see cref=\"SampleDisopsableStruct\"/>を参照カウント付きにしたもの。\n    /// </summary>\n    struct SampleReferenceCount : IReferenceCoutable\n    {\n        private Counter _counter;\n\n        public SampleReferenceCount(Counter counter)\n        {\n            counter.Increment();\n            _counter = counter;\n            _count = new Integer();\n        }\n\n        public void Dispose()\n        {\n            var c = Interlocked.Exchange(ref _counter, null);\n            if (c == null) throw new Exception(\"2重Disposeずるとまずいという想定\");\n            c.Decrement();\n        }\n\n        #region 参照カウント\n\n        // 複数の変数で参照カウントを共有するために1個クラスが必要。\n        // Nativeリソースとかを参照する構造体の場合、そのNative側にカウントを持ってもらう手もある。\n\n        class Integer { public int Value; }\n        private Integer _count;\n        public ref int Count => ref _count.Value;\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/01 HeapAllocation.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.1\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.5.2\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/Allocation.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\nusing HeapAllocation.Data;\nusing HeapAllocation.Allocators;\n\nnamespace HeapAllocation\n{\n    /// <summary>\n    /// 小さくて寿命が短いオブジェクトを大量に作ってみて性能を見てみる。\n    /// </summary>\n    public class Allocation\n    {\n        /// <summary>\n        /// 参考実装。\n        /// 構造体にするだけでどれくらい速いか。\n        ///\n        /// 当たり前だけどダントツで速い。\n        /// クラスを構造体に変えただけで、<see cref=\"GarbageCollection\"/>より余裕で1桁速い。\n        /// 小さくて頻繁に new して寿命が短いオブジェクトは構造体にしないといけないというのがよくわかる例。\n        /// </summary>\n        public static (int x, int y) Struct(int loops)\n        {\n            var p = new StructPoint(1, 2);\n            for (int i = 0; i < loops; i++)\n            {\n                p = new StructPoint(p.Y, p.X + p.Y);\n            }\n            return (p.X, p.Y);\n        }\n\n        /// <summary>\n        /// .NET の GC に任せる。\n        /// こんなコード、通常は構造体を使ってやるけども、そこをあえてクラスにするとどのくらいの負担か見てみる。\n        ///\n        /// <see cref=\"Struct(int)\"/>の7倍くらいの遅さ。\n        /// スタック(構造体利用)とヒープ(クラス利用)で1桁も差が付かないのは相当速い部類。\n        /// 一般に、Mark and Sweep でGC管理されてるヒープは確保のコスト低い。\n        /// </summary>\n        public static (int x, int y) GarbageCollection(int loops)\n        {\n            var p = new ClassPoint(1, 2);\n            for (int i = 0; i < loops; i++)\n            {\n                p = new ClassPoint(p.Y, p.X + p.Y);\n            }\n            return (p.X, p.Y);\n        }\n\n        /// <summary>\n        /// malloc (msvcrt.dll の P/Invoke)でメモリ確保してみる例。\n        /// ベタ書きな参考実装版。\n        /// <seealso cref=\"Malloc(int)\"/>\n        ///\n        /// 尋常じゃなく遅い。\n        /// (当たり前だけど、通常、こんな頻度でGC管理外メモリ確保しない。)\n        /// <see cref=\"GarbageCollection(int)\"/>より20倍くらい遅い。\n        ///\n        /// tcmallocとか、msvcrtのmallocよりも10倍くらい速いものもあるらしいけども。\n        /// tcmallocは内部的にGC的なことをしてるらしい。\n        /// 参考: http://pages.cs.wisc.edu/~danb/google-perftools-0.98/tcmalloc.html\n        /// </summary>\n        public unsafe static (int x, int y) Malloc0(int loops)\n        {\n            var p = (StructPoint*)Interop.malloc(sizeof(StructPoint));\n            p->X = 1;\n            p->Y = 2;\n\n            for (int i = 0; i < loops; i++)\n            {\n                var q = (StructPoint*)Interop.malloc(sizeof(StructPoint));\n                q->X = p->Y;\n                q->Y = p->X + p->Y;\n\n                Interop.free((IntPtr)p);\n                p = q;\n            }\n            var t = (p->X, p->Y);\n            Interop.free((IntPtr)p);\n            return t;\n        }\n\n        /// <summary>\n        /// 基本的にやってることは<see cref=\"Malloc0(int)\"/>と一緒。\n        /// 煩雑な処理を<see cref=\"IAllocator\"/>に閉じ込めただけ。\n        /// パフォーマンス的には<see cref=\"Malloc0(int)\"/> + ちょっとしたオーバーヘッド(誤差程度)になるはず。\n        /// もちろん、<see cref=\"Malloc0(int)\"/>と同様、.NETのGC基準で20倍遅い。\n        /// </summary>\n        public static (int x, int y) Malloc(int loops) => Pointer(MallocAllocator.Instance, loops);\n\n        /// <summary>\n        /// 自前でメモリ プールを作って、その中からメモリを払い出し・返却する実装。\n        /// lock 版。\n        ///\n        /// こういう実装ならGC発生は全くしないし、<see cref=\"Marshal.AllocHGlobal(int)\"/>呼び出しも最初の1回だけ。\n        /// じゃあ、<see cref=\"GarbageCollection(int)\"/>より速くなるかというと、実際計ってみると15～20倍くらい遅い。\n        /// <see cref=\"GarbageCollection(int)\"/>の方は、手元の環境だとGCが1000回の実行当たり平均55回程度発生してるけど、それでもマネージ ヒープの方が速い。\n        ///\n        /// 差が出る理由\n        /// - lock がかなりきつい\n        /// - 検索アルゴリズムの問題: 空いてるメモリ領域を探すのに、自作では並大抵のGC実装に勝てない\n        /// - 最近のGCはバックグラウンドGCになっててマルチコア環境だとほとんどコストが見えない\n        /// </summary>\n        public static (int x, int y) LockPoolPointer(int loops) => Pointer(LockPool.Instance, loops);\n\n        /// <summary>\n        /// <see cref=\"LockPoolPointer(int)\"/> CAS 版。\n        ///\n        /// lock はもともと結構重たいものなので、いわゆる lock-free アルゴリズムって言うやつで置き換え。\n        /// <see cref=\"LockPoolPointer(int)\"/>と比べると倍以上速い。\n        /// それでもまだ<see cref=\"GarbageCollection(int)\"/>より5～6倍遅い。\n        /// </summary>\n        public static (int x, int y) CasPoolPointer(int loops) => Pointer(CasPool.Instance, loops);\n\n        /// <summary>\n        /// <see cref=\"LockPoolPointer(int)\"/> のスレッド ローカル版。\n        ///\n        /// マルチスレッド動作はあきらめる。\n        /// 用途がかなり限られるものの、GCに頼らないメモリ管理としてはオーバーヘッド極小のはず。\n        /// ここまで削ってまだ<see cref=\"GarbageCollection(int)\"/>より2～3倍遅い。\n        /// Mark and Sweep はほんとに速い。\n        ///\n        /// これが Mark and Sweep より遅くなってそうな要因は、\n        /// - プールを準備する部分が重い\n        /// - 検索アルゴリズムの問題\n        /// - 一時変数 q が増えてるのでこれが最適化を阻害\n        /// - Delete 呼び出しのコスト\n        /// というあたり。\n        /// </summary>\n        public static (int x, int y) LocalPoolPointer(int loops)\n        {\n            using (var pool = new LocalPool(20))\n                return Pointer(new LocalPool(20), loops);\n        }\n\n        static (int x, int y) Pointer<Allocator>(Allocator pool, int loops)\n            where Allocator : IAllocator\n        {\n            var p = pool.New(1, 2);\n            for (int i = 0; i < loops; i++)\n            {\n                var q = pool.New(p.Y, p.X + p.Y);\n                pool.Delete(p);\n                p = q;\n            }\n            var t = (p.X, p.Y);\n            pool.Delete(p);\n            return t;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/AllocationBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Engines;\n\nnamespace HeapAllocation\n{\n    /// <summary>\n    /// <see cref=\"Allocation\"/>に対するベンチマーク。\n    /// </summary>\n    [SimpleJob(RunStrategy.Throughput)]\n    public class AllocationBenchmark\n    {\n        const int Loops = 10000;\n\n        [Benchmark]\n        public static (int x, int y) Struct() => Allocation.Struct(Loops);\n\n        [Benchmark]\n        public static (int x, int y) GarbageCollection() => Allocation.GarbageCollection(Loops);\n\n        [Benchmark]\n        public unsafe static (int x, int y) Malloc0() => Allocation.Malloc0(Loops);\n\n        [Benchmark]\n        public static (int x, int y) Malloc() => Allocation.Malloc(Loops);\n\n        [Benchmark]\n        public static (int x, int y) LockPoolPointer() => Allocation.LockPoolPointer(Loops);\n\n        [Benchmark]\n        public static (int x, int y) CasPoolPointer() => Allocation.CasPoolPointer(Loops);\n\n        [Benchmark]\n        public static (int x, int y) LocalPoolPointer() => Allocation.LocalPoolPointer(Loops);\n\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/Allocators/CasPool .cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\nusing System.Threading;\n\nnamespace HeapAllocation.Allocators\n{\n    /// <summary>\n    /// lock をやめて、CAS (Compare And Swap。<see cref=\"Interlocked.CompareExchange(ref int, int, int)\"/>)を使うようにしたメモリ プール。\n    /// lock よりはだいぶ速いはず。\n    /// </summary>\n    unsafe struct CasPool : IAllocator, IDisposable\n    {\n        public static readonly CasPool Instance = new CasPool(20);\n\n        private int _poolSize;\n        private int* _pool;\n\n        public CasPool(int poolSize)\n        {\n            _poolSize = poolSize;\n            var p = Interop.malloc(poolSize * (sizeof(int) * 3));\n            var ip = (int*)p;\n            for (int i = 0; i < poolSize * 3; i += 3)\n            {\n                ip[i] = 0;\n            }\n            _pool = ip;\n        }\n\n        public void Dispose() => Interop.free((IntPtr)_pool);\n\n        public int* Alloc()\n        {\n            for (int i = 0; i < _poolSize * 3; i += 3)\n            {\n                if (Interlocked.CompareExchange(ref _pool[i], 1, 0) == 0)\n                {\n                    return &_pool[i + 1];\n                }\n            }\n            throw new OutOfMemoryException();\n        }\n\n        public void Release(int* p)\n        {\n            Interlocked.Exchange(ref p[-1], 0);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/Allocators/IAllocator.cs",
    "content": "﻿namespace HeapAllocation.Allocators\n{\n    /// <summary>\n    /// メモリ確保・解放用のインターフェイス。\n    /// 特に汎用化するつもりはないので、<see cref=\"PointerPoint\"/>専用。\n    /// </summary>\n    unsafe interface IAllocator\n    {\n        /// <summary>\n        /// int 2つ分(8バイト)の領域を返してもらう。\n        /// </summary>\n        int* Alloc();\n\n        /// <summary>\n        /// <see cref=\"Alloc\"/>で確保した領域を解放する。\n        /// </summary>\n        void Release(int* p);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/Allocators/Interop.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace HeapAllocation.Allocators\n{\n    static class Interop\n    {\n        [DllImport(\"msvcrt.dll\", CallingConvention = CallingConvention.Cdecl)]\n        public static extern IntPtr malloc(int size);\n\n        [DllImport(\"msvcrt.dll\", CallingConvention = CallingConvention.Cdecl)]\n        public static extern void free(IntPtr ptr);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/Allocators/LocalPool.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace HeapAllocation.Allocators\n{\n    /// <summary>\n    /// スレッドごと個別のプールを持つ前提で、同時実行制御を一切しないメモリ プール。\n    /// マルチスレッド実行しないならこのプールを1個作って使うとかやると、他のプール実装よりはだいぶ速い。\n    /// </summary>\n    /// <remarks>\n    /// 性質上、static には管理できない。\n    ///\n    /// static がダメならスレッド ローカルにとか試みても、\n    /// <see cref=\"System.Threading.ThreadLocal{T}.Value\"/>取り出しが結構重たくてそんなに性能出ない。\n    /// </remarks>\n    unsafe struct LocalPool : IAllocator, IDisposable\n    {\n        private int _poolSize;\n        private int* _pool;\n\n        public LocalPool(int poolSize)\n        {\n            _poolSize = poolSize;\n            var p = Interop.malloc(poolSize * (sizeof(int) * 3));\n            var ip = (int*)p;\n            for (int i = 0; i < poolSize * 3; i += 3)\n            {\n                ip[i] = 0;\n            }\n            _pool = ip;\n        }\n\n        public void Dispose() => Interop.free((IntPtr)_pool);\n\n        public int* Alloc()\n        {\n            for (int i = 0; i < _poolSize * 3; i += 3)\n            {\n                if (_pool[i] == 0)\n                {\n                    _pool[i] = 1;\n                    return &_pool[i + 1];\n                }\n            }\n            throw new OutOfMemoryException();\n        }\n\n        public void Release(int* p)\n        {\n            p[-1] = 0;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/Allocators/LockPool.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace HeapAllocation.Allocators\n{\n    /// <summary>\n    /// lock を使ってスレッド安全にしたメモリ プール。\n    /// </summary>\n    unsafe struct LockPool : IAllocator, IDisposable\n    {\n        public static readonly LockPool Instance = new LockPool(20);\n\n        private int _poolSize;\n        private int* _pool;\n        private object _lockObj;\n\n        public LockPool(int poolSize)\n        {\n            _poolSize = poolSize;\n            var p = Interop.malloc(poolSize * (sizeof(int) * 3));\n            var ip = (int*)p;\n            for (int i = 0; i < poolSize * 3; i += 3)\n            {\n                ip[i] = 0;\n            }\n            _pool = ip;\n\n            _lockObj = new object();\n        }\n\n        public void Dispose() => Interop.free((IntPtr)_pool);\n\n        public int* Alloc()\n        {\n            for (int i = 0; i < _poolSize * 3; i += 3)\n            {\n                lock (_lockObj)\n                {\n                    if (_pool[i] == 0)\n                    {\n                        _pool[i] = 1;\n                        return &_pool[i + 1];\n                    }\n                }\n            }\n            throw new OutOfMemoryException();\n        }\n\n        public void Release(int* p)\n        {\n            lock(_lockObj)\n            {\n                p[-1] = 0;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/Allocators/MallocAllocator.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace HeapAllocation.Allocators\n{\n    /// <summary>\n    /// プールなし、普通に<see cref=\"Marshal.AllocHGlobal(int)\"/>を都度呼ぶアロケーター。\n    /// どうしようもなく遅い。\n    /// </summary>\n    unsafe struct MallocAllocator : IAllocator\n    {\n        public static readonly MallocAllocator Instance = new MallocAllocator();\n\n        public int* Alloc() => (int*)Interop.malloc(sizeof(int) * 2);\n        public void Release(int* p) => Interop.free((IntPtr)p);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/Data/ClassPoint.cs",
    "content": "﻿namespace HeapAllocation.Data\n{\n    /// <summary>\n    /// <see cref=\"StructPoint\"/>をクラスに変えるとどのくらい遅くなるか試す用のクラス。\n    /// </summary>\n    class ClassPoint\n    {\n        public int X { get; }\n        public int Y { get; }\n        public ClassPoint(int x, int y) => (X, Y) = (x, y);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/Data/PointerPoint.cs",
    "content": "﻿namespace HeapAllocation.Data\n{\n    /// <summary>\n    /// GC を起こさないようにメモリ プール管理するとどうなるかという例。\n    /// </summary>\n    unsafe struct PointerPoint\n    {\n        internal readonly int* _pointer;\n\n        public ref int X => ref *_pointer;\n        public ref int Y => ref _pointer[1];\n\n        internal PointerPoint(int* p) => _pointer = p;\n    }\n\n    unsafe static class PoolExtensions\n    {\n        public static PointerPoint New<Allocator>(this Allocator pool, int x, int y)\n            where Allocator : Allocators.IAllocator\n        {\n            var p = pool.Alloc();\n            p[0] = x;\n            p[1] = y;\n            return new PointerPoint(p);\n        }\n\n        public static void Delete<Allocator>(this Allocator pool, PointerPoint p)\n            where Allocator : Allocators.IAllocator\n        {\n            pool.Release(p._pointer);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/Data/StructPoint.cs",
    "content": "﻿namespace HeapAllocation.Data\n{\n    /// <summary>\n    /// int 2個程度のデータ構造なら、普通は構造体で作るよね、というもの。\n    /// 参考実装用。\n    /// </summary>\n    struct StructPoint\n    {\n        public int X;\n        public int Y;\n        public StructPoint(int x, int y) => (X, Y) = (x, y);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace HeapAllocation\n{\n/* 手元の環境でのベンチマーク実行結果の一例\n\n            Method |        Mean |     StdDev |   Gen 0 | Allocated |\n------------------ |------------ |----------- |-------- |---------- |\n            Struct |   5.5147 us |  0.0326 us |       - |      24 B |\n GarbageCollection |  35.2030 us |  0.1047 us | 55.8919 | 240.05 kB |\n           Malloc0 | 763.0477 us |  1.9576 us |       - |      32 B |\n            Malloc | 772.7615 us |  6.8421 us |       - |      32 B |\n   LockPoolPointer | 539.6967 us | 16.9640 us |       - |      32 B |\n    CasPoolPointer | 212.1614 us |  1.3458 us |       - |      32 B |\n  LocalPoolPointer |  85.5372 us |  0.4944 us |       - |      26 B |\n */\n\n    /// <summary>\n    /// .NET の GC (Mark and Sweep 方式)がどのくらい高性能かというのをベンチマーク取って調べる。\n    /// Javaとか.NETのヒープ確保はほんとかなり速い。\n    /// ちょっとやそっと自前メモリ管理を頑張ってもまず勝てない。\n    ///\n    /// まず、C++のnew/deleteみたいな処理と比べたら、GCは(たとえGCが発生しても)20倍くらい速い。\n    /// (元々、そんなに頻繁にnew/deleteしちゃダメ)\n    ///\n    /// なので、メモリ プール(最初に大き目の領域を new して、その中でメモリを自前管理)を作ったとして、それでも、単純な実装だとGCの方が1桁速い。\n    /// これでも、かなり用途を絞った(参照カウントとかが必要ない)実装なので速い方。\n    /// 参照カウントとかが必要になるとさらに遅くなるはず。\n    ///\n    /// 自前実装だから苦しいという面も多少あるだろうものの、原理的にもMark and Sweepはだいぶ速いはず。\n    ///\n    /// 要するに、管理対象がメモリだけなんだったら、わざわざ自前で頑張る必要性は皆無という話。\n    /// 問題はメモリ以外のリソース(ファイルとかネットワークとか)なんだけど、それはまた別途説明。\n    /// </summary>\n    public class Program\n    {\n        static void Main(string[] args)\n        {\n            Test.Run();\n            BenchmarkRunner.Run<AllocationBenchmark>();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/HeapAllocation/Test.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace HeapAllocation\n{\n    /// <summary>\n    /// <see cref=\"Allocation\"/>に対するテスト。\n    /// </summary>\n    static class Test\n    {\n        /// <summary>\n        /// どの実装でも結果が同じになってるかだけ確認。\n        /// どの実装でも最終的な計算結果は<see cref=\"ValueTuple{T1, T2}\"/>にして返しているので、それの一致を確認。\n        /// 1個でも不一致があったら<see cref=\"InvalidOperationException\"/>をthrow。\n        /// </summary>\n        public static void Run()\n        {\n            const int N = 50;\n            for (int i = 0; i < N; i++)\n            {\n                var a = Allocation.Struct(i);\n                if (!a.Equals(Allocation.GarbageCollection(i))) throw new InvalidOperationException();\n                if (!a.Equals(Allocation.Malloc0(i))) throw new InvalidOperationException();\n                if (!a.Equals(Allocation.Malloc(i))) throw new InvalidOperationException();\n            }\n\n            // プール実装だけは並列実行があっても大丈夫かの確認が必要\n            Task.WhenAll(\n                Parallel(() => LockMemoryPool(N))\n                .Concat(Parallel(() => LocalMemoryPool(N)))\n                .Concat(Parallel(() => CasMemoryPool(N)))\n                ).Wait();\n        }\n\n        private static IEnumerable<Task> Parallel(Action a) => Enumerable.Range(0, 10).Select(_ => Task.Run(a));\n\n        private static void CasMemoryPool(int N)\n        {\n            for (int i = 0; i < N; i++)\n            {\n                var a = Allocation.Struct(i);\n                var b = Allocation.CasPoolPointer(i);\n                if (!a.Equals(b)) throw new InvalidOperationException();\n            }\n        }\n\n        private static void LocalMemoryPool(int N)\n        {\n            for (int i = 0; i < N; i++)\n            {\n                var a = Allocation.Struct(i);\n                var b = Allocation.LocalPoolPointer(i);\n                if (!a.Equals(b)) throw new InvalidOperationException();\n            }\n        }\n\n        private static void LockMemoryPool(int N)\n        {\n            for (int i = 0; i < N; i++)\n            {\n                var a = Allocation.Struct(i);\n                var b = Allocation.LockPoolPointer(i);\n                if (!a.Equals(b)) throw new InvalidOperationException();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ManualResourceManagement/ManualResourceManagement.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26206.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"01 HeapAllocation\", \"HeapAllocation\\01 HeapAllocation.csproj\", \"{AEF49475-6C55-4112-BC4C-347AD13BFE78}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"02 DisposePattern\", \"DisposePattern\\02 DisposePattern.csproj\", \"{C95FAC1E-74B3-4832-BE32-5C262B3D942E}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{AEF49475-6C55-4112-BC4C-347AD13BFE78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AEF49475-6C55-4112-BC4C-347AD13BFE78}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AEF49475-6C55-4112-BC4C-347AD13BFE78}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{AEF49475-6C55-4112-BC4C-347AD13BFE78}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{AEF49475-6C55-4112-BC4C-347AD13BFE78}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AEF49475-6C55-4112-BC4C-347AD13BFE78}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AEF49475-6C55-4112-BC4C-347AD13BFE78}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{AEF49475-6C55-4112-BC4C-347AD13BFE78}.Release|x64.Build.0 = Release|Any CPU\n\t\t{C95FAC1E-74B3-4832-BE32-5C262B3D942E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C95FAC1E-74B3-4832-BE32-5C262B3D942E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C95FAC1E-74B3-4832-BE32-5C262B3D942E}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{C95FAC1E-74B3-4832-BE32-5C262B3D942E}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{C95FAC1E-74B3-4832-BE32-5C262B3D942E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C95FAC1E-74B3-4832-BE32-5C262B3D942E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C95FAC1E-74B3-4832-BE32-5C262B3D942E}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{C95FAC1E-74B3-4832-BE32-5C262B3D942E}.Release|x64.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {5926C1C4-FB9A-4B75-AAB3-591804A778FC}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/ModalDialogSample/App.xaml",
    "content": "﻿<Application x:Class=\"ModalDialogSample.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:ModalDialogSample\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Demo/2017/ModalDialogSample/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace ModalDialogSample\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ModalDialogSample/IResultDialog.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace ModalDialogSample\n{\n    public interface IResultDialog<T>\n    {\n        T Result { get; }\n    }\n\n    public static class DialogExtensions\n    {\n        public static Task<TResult> ShowDialogAsync<TWindow, TResult>()\n            where TWindow : Window, IResultDialog<TResult>, new()\n            => new TWindow().ShowDialogAsync<TWindow, TResult>();\n\n        public static Task<TResult> ShowDialogAsync<TWindow, TResult>(this TWindow window)\n            where TWindow : Window, IResultDialog<TResult>\n        {\n            var tcs = new TaskCompletionSource<TResult>();\n            EventHandler closed = null;\n            closed = (sender, e) =>\n            {\n                window.Closed -= closed;\n                tcs.TrySetResult(window.Result);\n            };\n\n            window.Closed += closed;\n            window.ShowDialog();\n\n            return tcs.Task;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ModalDialogSample/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"ModalDialogSample.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:ModalDialogSample\"\n        mc:Ignorable=\"d\"\n        Title=\"MainWindow\" Height=\"350\" Width=\"525\">\n    <StackPanel>\n        <TextBlock x:Name=\"result\" />\n        <Button Content=\"Run\" Click=\"Button_Click\" />\n    </StackPanel>\n</Window>\n"
  },
  {
    "path": "Demo/2017/ModalDialogSample/MainWindow.xaml.cs",
    "content": "﻿using System.Windows;\n\nnamespace ModalDialogSample\n{\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n        }\n\n        private async void Button_Click(object sender, RoutedEventArgs e)\n        {\n            var r = await DialogExtensions.ShowDialogAsync<Window1, string>();\n            result.Text = r;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/ModalDialogSample/ModalDialogSample.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <LanguageTargets Condition=\"Exists('$(MSBuildProjectDirectory)\\$(AssemblyName).csproj')\">$(MSBuildToolsPath)\\Microsoft.CSharp.targets</LanguageTargets>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>net472</TargetFramework>\n    <StartupObject>ModalDialogSample.App</StartupObject>\n    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <!-- App.xaml -->\n    <ApplicationDefinition Include=\"App.xaml\" SubType=\"Designer\" Generator=\"MSBuild:XamlIntelliSenseFileGenerator\" />\n    <!-- XAML elements -->\n    <Page Include=\"**\\*.xaml\" SubType=\"Designer\" Generator=\"MSBuild:Compile\" Exclude=\"App.xaml\" />\n    <Compile Update=\"**\\*.xaml.cs\" SubType=\"Designer\" DependentUpon=\"%(Filename)\" />\n    <Compile Update=\"$(IntermediateOutputPath)**\\*.g.cs\" Visible=\"false\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Memory\" Version=\"4.5.1\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "Demo/2017/ModalDialogSample/ModalDialogSample.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26020.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ModalDialogSample\", \"ModalDialogSample.csproj\", \"{81A98874-9815-4570-9332-BA00AFFCED9D}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{81A98874-9815-4570-9332-BA00AFFCED9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{81A98874-9815-4570-9332-BA00AFFCED9D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{81A98874-9815-4570-9332-BA00AFFCED9D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{81A98874-9815-4570-9332-BA00AFFCED9D}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/ModalDialogSample/Window1.xaml",
    "content": "﻿<Window x:Class=\"ModalDialogSample.Window1\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:ModalDialogSample\"\n        mc:Ignorable=\"d\"\n        Title=\"値の入力\" SizeToContent=\"Height\" Width=\"200\">\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"auto\"/>\n            <RowDefinition Height=\"auto\"/>\n        </Grid.RowDefinitions>\n        <TextBox x:Name=\"input\" />\n        <Button Grid.Row=\"1\" Content=\"OK\" Click=\"Button_Click\" />\n    </Grid>\n</Window>\n"
  },
  {
    "path": "Demo/2017/ModalDialogSample/Window1.xaml.cs",
    "content": "﻿using System.Windows;\n\nnamespace ModalDialogSample\n{\n    public partial class Window1 : Window, IResultDialog<string>\n    {\n        public Window1()\n        {\n            InitializeComponent();\n        }\n\n        public string Result => input.Text;\n\n        private void Button_Click(object sender, RoutedEventArgs e)\n        {\n            Close();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/ClassLibraryLink/ClassLibraryLink.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard1.4</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"..\\ClassLibraryNet35\\**\\*.cs\" Exclude=\"..\\ClassLibraryNet35\\obj\\**\\*.cs\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/ClassLibraryMultiTarget/Class1.cs",
    "content": "﻿using System;\n\nnamespace ClassLibraryStd20\n{\n    public class Class1\n    {\n#if NET35\n        public static string Name => \".NET Framework 3.5\";\n#elif NETSTANDARD1_0\n        public static string Name => \".NET Standard 1.0\";\n#endif\n    }\n}\n"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/ClassLibraryMultiTarget/ClassLibraryMultiTarget.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net35;netstandard1.0</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/ClassLibraryNet35/Class1.cs",
    "content": "﻿using System;\n\nnamespace ClassLibraryStd20\n{\n    public class Class1\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/ClassLibraryNet35/ClassLibraryNet35.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net35</TargetFramework>\n    <DebugType Condition=\"'$(Configuration)'=='DEBUG'\">full</DebugType>\n  </PropertyGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/ClassLibraryStd14/Class1.cs",
    "content": "﻿using System;\n\nnamespace ClassLibraryStd20\n{\n    public class Class1\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/ClassLibraryStd14/ClassLibraryStd14.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard1.4</TargetFramework>\n  </PropertyGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/ConsoleAppCore11/ConsoleAppCore11.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp1.1</TargetFramework>\n  </PropertyGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/ConsoleAppCore11/Program.cs",
    "content": "﻿using System;\n\nnamespace ConsoleAppCore11\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Console.WriteLine(\"Hello World!\");\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/ConsoleAppNet35/ConsoleAppNet35.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net35</TargetFramework>\n  </PropertyGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/ConsoleAppNet35/Program.cs",
    "content": "﻿using System;\n\nnamespace ConsoleAppCore11\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Console.WriteLine(\"Hello World!\");\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/WpfAppNet47/App.xaml",
    "content": "﻿<Application x:Class=\"WpfAppNet47.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:WpfAppNet47\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/WpfAppNet47/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace WpfAppNet47\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/WpfAppNet47/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"WpfAppNet47.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:WpfAppNet47\"\n        mc:Ignorable=\"d\"\n        Title=\"MainWindow\" Height=\"350\" Width=\"525\">\n    <Grid>\n        \n    </Grid>\n</Window>\n"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/WpfAppNet47/MainWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace WpfAppNet47\n{\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj/WpfAppNet47/WpfAppNet47.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>net47</TargetFramework>\n    <LanguageTargets>$(MSBuildExtensionsPath)\\$(VisualStudioVersion)\\Bin\\Microsoft.CSharp.targets</LanguageTargets>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\" SubType=\"Designer\" Generator=\"MSBuild:Compile\" />\n    <Page Include=\"**\\*.xaml\" Exclude=\"App.xaml\" SubType=\"Designer\" Generator=\"MSBuild:Compile\" />\n    <Compile Update=\"**\\*.xaml.cs\" SubType=\"Designer\" DependentUpon=\"%(Filename)\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n    <Reference Include=\"WindowsBase\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2017/NewCsproj/NewCsproj.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26430.4\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"NewCsproj\", \"NewCsproj\", \"{60BBAB71-3B75-4EA5-8A03-FCC55F802420}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"OldCsproj\", \"OldCsproj\", \"{9A7575F0-F32A-4E82-8C5D-15F56D2883DF}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ClassLibraryStd14\", \"NewCsproj\\ClassLibraryStd14\\ClassLibraryStd14.csproj\", \"{43B68EF1-5387-4564-8A92-C266029B9653}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ClassLibraryNet35\", \"NewCsproj\\ClassLibraryNet35\\ClassLibraryNet35.csproj\", \"{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibraryNet35\", \"OldCsproj\\ClassLibraryNet35\\ClassLibraryNet35.csproj\", \"{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ConsoleAppCore11\", \"NewCsproj\\ConsoleAppCore11\\ConsoleAppCore11.csproj\", \"{A287CB44-9C8C-4B3A-9A28-878020624373}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ConsoleAppNet35\", \"NewCsproj\\ConsoleAppNet35\\ConsoleAppNet35.csproj\", \"{9DECB191-642D-40B7-B35B-38B7BF15CB5D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleAppNet35\", \"OldCsproj\\ConsoleAppNet35\\ConsoleAppNet35.csproj\", \"{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WpfAppNet47\", \"OldCsproj\\WpfAppNet47\\WpfAppNet47.csproj\", \"{99748E63-11DC-41E4-A5D3-CB7E98F5C568}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"WpfAppNet47\", \"NewCsproj\\WpfAppNet47\\WpfAppNet47.csproj\", \"{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ClassLibraryMultiTarget\", \"NewCsproj\\ClassLibraryMultiTarget\\ClassLibraryMultiTarget.csproj\", \"{B5EAB8F3-4A71-4012-B220-5683C1A86E83}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibraryLink\", \"NewCsproj\\ClassLibraryLink\\ClassLibraryLink.csproj\", \"{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|ARM = Debug|ARM\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|ARM = Release|ARM\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Release|x64.Build.0 = Release|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653}.Release|x86.Build.0 = Release|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Release|x64.Build.0 = Release|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8}.Release|x86.Build.0 = Release|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Release|x64.Build.0 = Release|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7}.Release|x86.Build.0 = Release|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Release|x64.Build.0 = Release|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373}.Release|x86.Build.0 = Release|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Release|x64.Build.0 = Release|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D}.Release|x86.Build.0 = Release|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Release|x64.Build.0 = Release|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}.Release|x86.Build.0 = Release|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Release|x64.Build.0 = Release|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568}.Release|x86.Build.0 = Release|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Release|x64.Build.0 = Release|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6}.Release|x86.Build.0 = Release|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Release|x64.Build.0 = Release|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83}.Release|x86.Build.0 = Release|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Debug|ARM.ActiveCfg = Debug|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Debug|ARM.Build.0 = Debug|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Release|ARM.ActiveCfg = Release|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Release|ARM.Build.0 = Release|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Release|x64.Build.0 = Release|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{43B68EF1-5387-4564-8A92-C266029B9653} = {60BBAB71-3B75-4EA5-8A03-FCC55F802420}\n\t\t{8BCD6B44-6891-4E5C-BDD6-6C9541C265C8} = {60BBAB71-3B75-4EA5-8A03-FCC55F802420}\n\t\t{988C4C8D-0E5D-465E-8ECC-1F6849AAF6B7} = {9A7575F0-F32A-4E82-8C5D-15F56D2883DF}\n\t\t{A287CB44-9C8C-4B3A-9A28-878020624373} = {60BBAB71-3B75-4EA5-8A03-FCC55F802420}\n\t\t{9DECB191-642D-40B7-B35B-38B7BF15CB5D} = {60BBAB71-3B75-4EA5-8A03-FCC55F802420}\n\t\t{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3} = {9A7575F0-F32A-4E82-8C5D-15F56D2883DF}\n\t\t{99748E63-11DC-41E4-A5D3-CB7E98F5C568} = {9A7575F0-F32A-4E82-8C5D-15F56D2883DF}\n\t\t{8FCC7298-2594-4AD2-BBCD-2744CD2061B6} = {60BBAB71-3B75-4EA5-8A03-FCC55F802420}\n\t\t{B5EAB8F3-4A71-4012-B220-5683C1A86E83} = {60BBAB71-3B75-4EA5-8A03-FCC55F802420}\n\t\t{DBD1A6EE-5587-41C4-A10F-17DCA433CCE4} = {60BBAB71-3B75-4EA5-8A03-FCC55F802420}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/ClassLibraryNet35/Class1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ClassLibraryNet35\n{\n    public class Class1\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/ClassLibraryNet35/ClassLibraryNet35.csproj",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>988c4c8d-0e5d-465e-8ecc-1f6849aaf6b7</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibraryNet35</RootNamespace>\n    <AssemblyName>ClassLibraryNet35</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\"/>\n    \n    <Reference Include=\"System.Core\"/>\n    <Reference Include=\"System.Xml.Linq\"/>\n    <Reference Include=\"System.Data.DataSetExtensions\"/>\n    \n    \n    <Reference Include=\"System.Data\"/>\n    \n    <Reference Include=\"System.Xml\"/>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n </Project>\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/ClassLibraryNet35/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClassLibraryNet35\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibraryNet35\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"988c4c8d-0e5d-465e-8ecc-1f6849aaf6b7\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/ConsoleAppNet35/ConsoleAppNet35.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{4EB4ED4A-2FDC-4E6B-A079-7CC883C613F3}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>ConsoleAppNet35</RootNamespace>\n    <AssemblyName>ConsoleAppNet35</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/ConsoleAppNet35/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace ConsoleAppNet35\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/ConsoleAppNet35/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ConsoleAppNet35\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleAppNet35\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"4eb4ed4a-2fdc-4e6b-a079-7cc883c613f3\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/WpfAppNet47/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.7\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/WpfAppNet47/App.xaml",
    "content": "﻿<Application x:Class=\"WpfAppNet47.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:WpfAppNet47\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/WpfAppNet47/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace WpfAppNet47\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/WpfAppNet47/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"WpfAppNet47.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:WpfAppNet47\"\n        mc:Ignorable=\"d\"\n        Title=\"MainWindow\" Height=\"350\" Width=\"525\">\n    <Grid>\n        \n    </Grid>\n</Window>\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/WpfAppNet47/MainWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace WpfAppNet47\n{\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/WpfAppNet47/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"WpfAppNet47\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"WpfAppNet47\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n//In order to begin building localizable applications, set\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\n//inside a <PropertyGroup>.  For example, if you are using US english\n//in your source files, set the <UICulture> to en-US.  Then uncomment\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\n//the line below to match the UICulture setting in the project file.\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n                                     //(used if a resource is not found in the page,\n                                     // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n                                              //(used if a resource is not found in the page,\n                                              // app, or any theme specific resource dictionaries)\n)]\n\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/WpfAppNet47/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace WpfAppNet47.Properties\n{\n\n\n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources\n    {\n\n        private static global::System.Resources.ResourceManager resourceMan;\n\n        private static global::System.Globalization.CultureInfo resourceCulture;\n\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources()\n        {\n        }\n\n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager\n        {\n            get\n            {\n                if ((resourceMan == null))\n                {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"WpfAppNet47.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n\n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture\n        {\n            get\n            {\n                return resourceCulture;\n            }\n            set\n            {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/WpfAppNet47/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/WpfAppNet47/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace WpfAppNet47.Properties\n{\n\n\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"11.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase\n    {\n\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n\n        public static Settings Default\n        {\n            get\n            {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/WpfAppNet47/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "Demo/2017/NewCsproj/OldCsproj/WpfAppNet47/WpfAppNet47.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{99748E63-11DC-41E4-A5D3-CB7E98F5C568}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <RootNamespace>WpfAppNet47</RootNamespace>\n    <AssemblyName>WpfAppNet47</AssemblyName>\n    <TargetFrameworkVersion>v4.7</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <WarningLevel>4</WarningLevel>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xaml\">\n      <RequiredTargetFramework>4.0</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Page Include=\"MainWindow.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"MainWindow.xaml.cs\">\n      <DependentUpon>MainWindow.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "Demo/2017/PackageReference/ClassLibrary/Class1.cs",
    "content": "﻿namespace ClassLibrary\n{\n    public class Class1\n    {\n        public static string Id =\n#if A\n            \"ClassLibrary.A\"\n#elif B\n            \"ClassLibrary.B\"\n#else\n            \"ClassLibrary\"\n#endif\n        ;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PackageReference/ClassLibrary/ClassLibrary.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0;net35</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/PackageReference/ClassLibrary.A/ClassLibrary.A.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0;net35</TargetFrameworks>\n    <PackageId>ClassLibrary.A</PackageId>\n    <AssemblyName>ClassLibrary</AssemblyName>\n    <RootNamespace>ClassLibrary</RootNamespace>\n    <DefineConstants>$(DefineConstants);A</DefineConstants>\n    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary/**/*.cs\" Exclude=\"../ClassLibrary/obj/**/*.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/PackageReference/ClassLibrary.B/ClassLibrary.B.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>netstandard2.0;net35</TargetFrameworks>\n    <PackageId>ClassLibrary.B</PackageId>\n    <AssemblyName>ClassLibrary</AssemblyName>\n    <RootNamespace>ClassLibrary</RootNamespace>\n    <DefineConstants>$(DefineConstants);B</DefineConstants>\n    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary/**/*.cs\" Exclude=\"../ClassLibrary/obj/**/*.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/PackageReference/ClassLibraryDependsOnA/Class1.cs",
    "content": "﻿namespace ClassLibraryDependsOnA\n{\n    public class Class1\n    {\n        public static string Id => ClassLibrary.Class1.Id;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PackageReference/ClassLibraryDependsOnA/ClassLibraryDependsOnA.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"ClassLibrary.A\" Version=\"1.0.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/PackageReference/ConsoleApp1/ConsoleApp1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.0;net47</TargetFrameworks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"ClassLibrary.B\" Version=\"1.0.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ClassLibraryDependsOnA\\ClassLibraryDependsOnA.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/PackageReference/ConsoleApp1/Program.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Console.WriteLine(ClassLibraryDependsOnA.Class1.Id);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PackageReference/NuGet.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <packageSources>\n    <add key=\"local\" value=\"./\" />\n    <add key=\"nuget.org\" value=\"https://api.nuget.org/v3/index.json\" protocolVersion=\"3\" />\n  </packageSources>\n</configuration>"
  },
  {
    "path": "Demo/2017/PackageReference/PackageReference.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27004.2005\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ClassLibrary.A\", \"ClassLibrary.A\\ClassLibrary.A.csproj\", \"{A276C6C5-4D49-412A-A19C-BD860BDCBD5F}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ClassLibrary\", \"ClassLibrary\\ClassLibrary.csproj\", \"{E93FE303-8182-4057-8578-D1B2F8F97E1B}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ClassLibrary.B\", \"ClassLibrary.B\\ClassLibrary.B.csproj\", \"{4349F65E-8733-4AF9-8900-B6B298C22881}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ClassLibraryDependsOnA\", \"ClassLibraryDependsOnA\\ClassLibraryDependsOnA.csproj\", \"{2FD484BD-D282-4BE1-88F8-ABD0BB4BEF74}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{B4CE3A1C-63CF-48CF-898E-85D32815BAA7}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{A276C6C5-4D49-412A-A19C-BD860BDCBD5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A276C6C5-4D49-412A-A19C-BD860BDCBD5F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A276C6C5-4D49-412A-A19C-BD860BDCBD5F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A276C6C5-4D49-412A-A19C-BD860BDCBD5F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E93FE303-8182-4057-8578-D1B2F8F97E1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E93FE303-8182-4057-8578-D1B2F8F97E1B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E93FE303-8182-4057-8578-D1B2F8F97E1B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E93FE303-8182-4057-8578-D1B2F8F97E1B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4349F65E-8733-4AF9-8900-B6B298C22881}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4349F65E-8733-4AF9-8900-B6B298C22881}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4349F65E-8733-4AF9-8900-B6B298C22881}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4349F65E-8733-4AF9-8900-B6B298C22881}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2FD484BD-D282-4BE1-88F8-ABD0BB4BEF74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2FD484BD-D282-4BE1-88F8-ABD0BB4BEF74}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2FD484BD-D282-4BE1-88F8-ABD0BB4BEF74}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2FD484BD-D282-4BE1-88F8-ABD0BB4BEF74}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B4CE3A1C-63CF-48CF-898E-85D32815BAA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B4CE3A1C-63CF-48CF-898E-85D32815BAA7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B4CE3A1C-63CF-48CF-898E-85D32815BAA7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B4CE3A1C-63CF-48CF-898E-85D32815BAA7}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {F09A123C-35BB-49DD-ABB4-E0CA054341B7}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/PackageReference/build.ps1",
    "content": "﻿# build\n$msbuild = (Get-VSSetupInstance)[0].InstallationPath + '\\MSBuild\\15.0\\Bin\\MSBuild.exe'\n\n& $msbuild /p:Configuration=Release\n\ncp .\\ClassLibrary.A\\bin\\Release\\ClassLibrary.A.1.0.0.nupkg .\ncp .\\ClassLibrary.B\\bin\\Release\\ClassLibrary.B.1.0.0.nupkg .\n\ndotnet publish -c release -f netcoreapp2.0\n\n# run with net47 → ClassLibrary.B\n.\\ConsoleApp1\\bin\\Release\\net47\\ConsoleApp1.exe\n\n# run with netcoreapp2.0 Framework Dependent → ClassLibrary.A\ndotnet .\\ConsoleApp1\\bin\\Release\\netcoreapp2.0\\ConsoleApp1.dll\n\n# run with netcoreapp2.0 Self-contained → ClassLibrary.B\ndotnet .\\ConsoleApp1\\bin\\Release\\netcoreapp2.0\\publish\\ConsoleApp1.dll\n"
  },
  {
    "path": "Demo/2017/PackageReference/readme.md",
    "content": "# Inconsistent behavior between Framework Dependent and Self-contained deploy\n\n## step to repro\n\nrun [build.ps1](build.ps1)\n\n### expected result\n\nExecution results are consistent with .NET Framework, .NET Core (Framework Dependent), and .NET Core (Self-contained).\n\nThe result of `build.ps1` except for build logs is:\n\n```\nClassLibrary.B\nClassLibrary.B\nClassLibrary.B\n```\n\n### actual result\n\nThat of .NET Core (Framework Dependent) is inconsistent with others.\n\n```\nClassLibrary.B\nClassLibrary.A\nClassLibrary.B\n```\n\n## FYI\n\nThis solution contains libraries that have different package id and the same assembly name.\n\nSolution architecture:\n\n![project dependency](fig/dependency.png)\n\nThe `ConsoleApp1` refers\n\n- `ClassLibrary.B` in net47 and netcoreapp2.0 (Self-contained)\n- `ClassLibrary.A` in netcoreapp2.0 (Framework Dependent)\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/AccessorBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing PropertyAccessor.SampleData;\nusing System;\nusing System.Collections.Generic;\n\nnamespace PropertyAccessor\n{\n    /// <summary>\n    /// 実行結果一例:\n    ///                    Method |       Mean |     Error |    StdDev |  Gen 0 | Allocated |\n    /// ------------------------- |-----------:|----------:|----------:|-------:|----------:|\n    ///                ItemSwitch |   476.5 ns |  4.538 ns |  4.245 ns | 0.0639 |     272 B |\n    ///                ItemCustom |   916.9 ns |  3.646 ns |  3.232 ns | 0.0629 |     272 B |\n    ///            ItemDictionary | 1,092.8 ns | 28.030 ns | 33.368 ns | 0.0629 |     272 B |\n    ///   ItemImmutableDictionary | 1,804.7 ns | 19.790 ns | 18.511 ns | 0.0629 |     272 B |\n    ///      ItemSortedDictionary | 4,613.6 ns | 13.748 ns | 11.480 ns | 0.0610 |     272 B |\n    ///            ItemSortedList | 4,465.0 ns | 24.166 ns | 22.605 ns | 0.0610 |     272 B |\n    ///               PointSwitch |   191.1 ns |  1.429 ns |  1.267 ns | 0.0434 |     184 B |\n    ///               PointCustom |   278.3 ns |  2.976 ns |  2.784 ns | 0.0434 |     184 B |\n    ///           PointDictionary |   349.1 ns |  3.487 ns |  3.262 ns | 0.0434 |     184 B |\n    ///  PointImmutableDictionary |   673.5 ns |  2.679 ns |  2.506 ns | 0.0429 |     184 B |\n    ///     PointSortedDictionary | 1,078.4 ns | 16.282 ns | 15.230 ns | 0.0420 |     184 B |\n    ///           PointSortedList | 1,069.7 ns | 10.616 ns |  9.931 ns | 0.0420 |     184 B |\n    ///\n    /// switch の速さは、コード生成が複雑化してしまうつらさあってもおつりが来そう。\n    /// switch の次、ハッシュテーブルはやっぱ速いなぁ。\n    ///\n    /// ちなみに、.NET の実装では、\n    /// Dictionary → ハッシュテーブル\n    /// ImmutableDictionary → ハッシュテーブル\n    /// SortedDictionary → 赤黒ツリー\n    /// SortedList → ソート済み配列 + 2文探索\n    ///\n    /// Custom は、「プロパティ数は固定、かつ、たかだか知れた数しかない」って前提で固定長の配列で作ったハッシュテーブル。\n    /// </summary>\n    [MemoryDiagnoser]\n    public class AccessorBenchmark\n    {\n        Item item;\n        Dictionary<string, object> dicItem;\n\n        Point point;\n        Dictionary<string, object> dicPoint;\n\n        [GlobalSetup]\n        public void Setup()\n        {\n            item = new Item(123, \"abc\", 1.23, 0xde, true, false);\n            dicItem = new Dictionary<string, object>\n            {\n                { nameof(Item.Id), item.Id },\n                { nameof(Item.Name), item.Name },\n                { nameof(Item.Value), item.Value },\n                { nameof(Item.Code), item.Code },\n                { nameof(Item.TestCaseForLongPropertyName), item.TestCaseForLongPropertyName },\n                { nameof(Item.TestCaseForMultiByteCharacterマルチバイト文字), item.TestCaseForMultiByteCharacterマルチバイト文字 },\n            };\n\n            point = new Point(10, 20);\n            dicPoint = new Dictionary<string, object>\n            {\n                { nameof(Point.X), point.X },\n                { nameof(Point.Y), point.Y },\n            };\n\n            // コード生成の時間は別集計したいので、各 benchmark に時間が乗らないように setup 時点で1回アクセスしておく\n            var _1 = Accessors.SwitchCodeGenerator<Item>.Get;\n            var _2 = Accessors.EachCodeGenerator<Item>.Items;\n            var _3 = Accessors.SwitchCodeGenerator<Point>.Get;\n            var _4 = Accessors.EachCodeGenerator<Point>.Items;\n        }\n\n        [Benchmark] public void ItemSwitch() => Bench(dicItem, item, x => new Accessors.SwitchAccessor<Item>(x), Item.Equals);\n        [Benchmark] public void ItemCustom() => Bench(dicItem, item, x => new Accessors.CustomHashTableAccessor<Item>(x), Item.Equals);\n        [Benchmark] public void ItemDictionary() => Bench(dicItem, item, x => new Accessors.DictionaryAccessor<Item>(x), Item.Equals);\n\n        [Benchmark] public void PointSwitch() => Bench(dicPoint, point, x => new Accessors.SwitchAccessor<Point>(x), Point.Equals);\n        [Benchmark] public void PointCustom() => Bench(dicPoint, point, x => new Accessors.CustomHashTableAccessor<Point>(x), Point.Equals);\n        [Benchmark] public void PointDictionary() => Bench(dicPoint, point, x => new Accessors.DictionaryAccessor<Point>(x), Point.Equals);\n\n        // 以下、はっきり遅いことがわかってるのでベンチマーク省略。\n        [Benchmark] public void ItemImmutableDictionary() => Bench(dicItem, item, x => new Accessors.ImmutableDictionaryAccessor<Item>(x), Item.Equals);\n        [Benchmark] public void ItemSortedDictionary() => Bench(dicItem, item, x => new Accessors.SortedDictionaryAccessor<Item>(x), Item.Equals);\n        [Benchmark] public void ItemSortedList() => Bench(dicItem, item, x => new Accessors.SortedListAccessor<Item>(x), Item.Equals);\n                    \n        [Benchmark] public void PointImmutableDictionary() => Bench(dicPoint, point, x => new Accessors.ImmutableDictionaryAccessor<Point>(x), Point.Equals);\n        [Benchmark] public void PointSortedDictionary() => Bench(dicPoint, point, x => new Accessors.SortedDictionaryAccessor<Point>(x), Point.Equals);\n        [Benchmark] public void PointSortedList() => Bench(dicPoint, point, x => new Accessors.SortedListAccessor<Point>(x), Point.Equals);\n\n        static void Bench<T, Accessor>(Dictionary<string, object> expectedDic, T expectedObj, Func<T, Accessor> getAccessor, Func<T, T, bool> equals)\n            where T : new()\n            where Accessor : IAccessor<T>\n        {\n            var a = getAccessor(expectedObj);\n\n            foreach (var (key, x) in expectedDic)\n            {\n                var y = a[key];\n                if (!Equals(x, y)) throw new InvalidOperationException();\n            }\n\n            var b = getAccessor(new T());\n\n            foreach (var (key, x) in expectedDic)\n            {\n                b[key] = x;\n            }\n\n            if (!equals(expectedObj, b.Value)) throw new InvalidOperationException();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/Accessors/CustomHashTableAccessor.cs",
    "content": "﻿using System.Linq;\n\nnamespace PropertyAccessor.Accessors\n{\n    /// <summary>\n    /// プロパティが後から増えることはないんだから、最初にハッシュ値被りがない範囲で最小のサイズの配列を固定長で取ってしまうという、\n    /// メモリ効率をある程度妥協、「プロパティ数なんてたかが知れてるだろ」前提のハッシュテーブル。\n    ///\n    /// あと、この実装では、キーのチェックしないという妥協もしてる。\n    /// 要するに、\n    /// - 最初にハッシュ値被りがないように作ったんだから、ちゃんと存在するプロパティ名で値を引くことは正確にできる\n    /// - 一方で、存在しないプロパティ名で検索して、ハッシュ値が被ってる別のプロパティの値が取れてしまうことはあり得る\n    /// </summary>\n    /// <remarks>\n    /// 計測一例:\n    ///           Method |       Mean |     Error |    StdDev |  Gen 0 | Allocated |\n    /// ---------------- |-----------:|----------:|----------:|-------:|----------:|\n    ///       ItemSwitch |   479.7 ns |  6.655 ns |  5.900 ns | 0.0639 |     272 B |\n    ///       ItemCustom |   991.6 ns | 36.094 ns | 37.066 ns | 0.0629 |     272 B |\n    ///   ItemDictionary | 1,006.4 ns |  5.293 ns |  4.693 ns | 0.0629 |     272 B |\n    ///      PointSwitch |   253.2 ns |  1.395 ns |  1.305 ns | 0.0434 |     184 B |\n    ///      PointCustom |   280.3 ns |  1.409 ns |  1.318 ns | 0.0434 |     184 B |\n    ///  PointDictionary |   397.9 ns |  3.329 ns |  3.114 ns | 0.0434 |     184 B |\n    ///\n    /// 結構、高速化のために強い制限掛けて実装してる割には <see cref=\"System.Collections.Generic.Dictionary{TKey, TValue}\"/>との差がそんなに大きくない。\n    /// </remarks>\n    public class CustomHashTableAccessor<T> : IAccessor<T>\n    {\n        private static int _mask;\n        private static EachCodeGenerator<T>.Entry[] _array;\n\n        static CustomHashTableAccessor()\n        {\n            var items = EachCodeGenerator<T>.Items;\n\n            var mask = 0;\n            for (int i = 1; i < items.Count; i <<= 1) mask = (mask << 1) | 1;\n\n            var hashCodes = items.Keys.Select(k => k.GetHashCode()).ToArray();\n\n            for (int i = 0; i < 32; i++)\n            {\n                if (hashCodes.Select(x => x & mask).Distinct().Count() == hashCodes.Length) break;\n                mask = (mask << 1) | 1;\n            }\n\n            _array = new EachCodeGenerator<T>.Entry[mask + 1];\n\n            foreach (var (key, value) in items)\n            {\n                _array[key.GetHashCode() & mask] = value;\n            }\n\n            _mask = mask;\n        }\n\n        private T _value;\n        public CustomHashTableAccessor(T value) => _value = value;\n\n        public T Value => _value;\n        public object this[string name]\n        {\n            get => _array[name.GetHashCode() & _mask].Get(ref _value);\n            set => _array[name.GetHashCode() & _mask].Set(ref _value, value);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/Accessors/DictionaryAccessor.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace PropertyAccessor.Accessors\n{\n    public class DictionaryAccessor<T> : IAccessor<T>\n    {\n        private static Dictionary<string, EachCodeGenerator<T>.Entry> _accessors;\n\n        static DictionaryAccessor()\n        {\n            _accessors = new Dictionary<string, EachCodeGenerator<T>.Entry>(EachCodeGenerator<T>.Items);\n        }\n\n        private T _value;\n        public DictionaryAccessor(T value) => _value = value;\n\n        public T Value => _value;\n        public object this[string name]\n        {\n            get => _accessors[name].Get(ref _value);\n            set => _accessors[name].Set(ref _value, value);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/Accessors/EachCodeGenerator.cs",
    "content": "﻿using System.Collections.Generic;\nusing static System.Linq.Expressions.Expression;\n\nnamespace PropertyAccessor.Accessors\n{\n    public static class EachCodeGenerator<T>\n    {\n        public delegate object Getter(ref T obj);\n        public delegate void Setter(ref T obj, object value);\n\n        public static IDictionary<string, Entry> Items { get; } = new Dictionary<string, Entry>(Generate());\n\n        public struct Entry\n        {\n            public Getter Get { get; }\n            public Setter Set { get; }\n\n            public Entry(Getter getter, Setter setter)\n            {\n                Get = getter;\n                Set = setter;\n            }\n        }\n\n        private static IEnumerable<KeyValuePair<string, Entry>> Generate()\n        {\n            foreach (var p in typeof(T).GetProperties())\n            {\n                var obj = Parameter(typeof(T).MakeByRefType());\n\n                var value = Parameter(typeof(object));\n                var setex = Lambda<Setter>(\n                    Assign(\n                        MakeMemberAccess(obj, typeof(T).GetProperty(p.Name)),\n                        Convert(value, p.PropertyType)),\n                    obj, value);\n                var setter = setex.Compile();\n\n                var getex = Lambda<Getter>(\n                    Convert(\n                        MakeMemberAccess(obj, typeof(T).GetProperty(p.Name)),\n                        typeof(object)),\n                    obj);\n                var getter = getex.Compile();\n\n                yield return new KeyValuePair<string, Entry>(p.Name, new Entry(getter, setter));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/Accessors/ImmutableDictionaryAccessor.cs",
    "content": "﻿using System.Collections.Immutable;\n\nnamespace PropertyAccessor.Accessors\n{\n    public class ImmutableDictionaryAccessor<T> : IAccessor<T>\n    {\n        private static ImmutableDictionary<string, EachCodeGenerator<T>.Entry> _accessors;\n\n        static ImmutableDictionaryAccessor()\n        {\n            _accessors = ImmutableDictionary<string, EachCodeGenerator<T>.Entry>.Empty.AddRange(EachCodeGenerator<T>.Items);\n        }\n\n        private T _value;\n        public ImmutableDictionaryAccessor(T value) => _value = value;\n\n        public T Value => _value;\n        public object this[string name]\n        {\n            get => _accessors[name].Get(ref _value);\n            set => _accessors[name].Set(ref _value, value);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/Accessors/SortedDictionaryAccessor.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace PropertyAccessor.Accessors\n{\n    public class SortedDictionaryAccessor<T> : IAccessor<T>\n    {\n        private static SortedDictionary<string, EachCodeGenerator<T>.Entry> _accessors;\n\n        static SortedDictionaryAccessor()\n        {\n            _accessors = new SortedDictionary<string, EachCodeGenerator<T>.Entry>(EachCodeGenerator<T>.Items);\n        }\n\n        private T _value;\n        public SortedDictionaryAccessor(T value) => _value = value;\n\n        public T Value => _value;\n        public object this[string name]\n        {\n            get => _accessors[name].Get(ref _value);\n            set => _accessors[name].Set(ref _value, value);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/Accessors/SortedListAccessor.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace PropertyAccessor.Accessors\n{\n    public class SortedListAccessor<T> : IAccessor<T>\n    {\n        private static SortedList<string, EachCodeGenerator<T>.Entry> _accessors;\n\n        static SortedListAccessor()\n        {\n            _accessors = new SortedList<string, EachCodeGenerator<T>.Entry>(EachCodeGenerator<T>.Items);\n        }\n\n        private T _value;\n        public SortedListAccessor(T value) => _value = value;\n\n        public T Value => _value;\n        public object this[string name]\n        {\n            get => _accessors[name].Get(ref _value);\n            set => _accessors[name].Set(ref _value, value);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/Accessors/SwitchAccessor.cs",
    "content": "﻿namespace PropertyAccessor.Accessors\n{\n    public class SwitchAccessor<T> : IAccessor<T>\n    {\n        private T _value;\n        public SwitchAccessor(T value) => _value = value;\n\n        public T Value => _value;\n        public object this[string name]\n        {\n            get => SwitchCodeGenerator<T>.Get(ref _value, name);\n            set => SwitchCodeGenerator<T>.Set(ref _value, name, value);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/Accessors/SwitchCodeGenerator.cs",
    "content": "﻿using System.Linq;\nusing static System.Linq.Expressions.Expression;\n\nnamespace PropertyAccessor.Accessors\n{\n    public static class SwitchCodeGenerator<T>\n    {\n        public delegate object Getter(ref T obj, string name);\n        public delegate void Setter(ref T obj, string name, object value);\n\n        public static Getter Get { get; } = GetGetter();\n        public static Setter Set { get; } = GetSetter();\n\n        private static Getter GetGetter()\n        {\n            var t = typeof(T);\n\n            var properties = (\n                from p in t.GetAllProperties()\n                where p.GetGetMethod() != null\n                select p\n                ).ToArray();\n\n            if (!properties.Any()) return (ref T obj, string name) => null;\n\n            var instance = Parameter(t.MakeByRefType(), \"instance\");\n            var propertyName = Parameter(typeof(string), \"propertyName\");\n\n            var cases = (\n                from p in properties\n                select SwitchCase(\n                    Convert(Property(instance, p), typeof(object)),\n                    Constant(p.Name)\n                    )\n                ).ToArray();\n\n            var ex = Lambda<Getter>(\n                Switch(\n                    propertyName,\n                    Constant(null, typeof(object)),\n                    cases.ToArray()),\n                instance,\n                propertyName\n                );\n\n            return ex.Compile();\n        }\n\n        private static Setter GetSetter()\n        {\n            var t = typeof(T);\n\n            var properties = (\n                from p in t.GetAllProperties()\n                where p.GetSetMethod() != null\n                select p\n                ).ToArray();\n\n            if (!properties.Any()) return (ref T obj, string name, object v) => { };\n\n            var instance = Parameter(t.MakeByRefType(), \"instance\");\n            var propertyName = Parameter(typeof(string), \"propertyName\");\n            var value = Parameter(typeof(object), \"value\");\n\n            //System.Linq.Expressions.Expression.\n            var cases =\n                from p in properties\n                select SwitchCase(\n                    Block(typeof(void), Assign(Property(instance, p), Convert(value, p.PropertyType))),\n                    Constant(p.Name)\n                    );\n\n            var ex = Lambda<Setter>(\n                Switch(\n                    propertyName,\n                    cases.ToArray()),\n                instance,\n                propertyName,\n                value\n                );\n\n            return ex.Compile();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/Extensions.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\nusing static System.Reflection.BindingFlags;\n\nnamespace PropertyAccessor\n{\n    static class Extensions\n    {\n        public static IEnumerable<PropertyInfo> GetAllProperties(this Type t) => t.GetProperties(Public | Instance).Where(p => !p.GetCustomAttributes().Any(a => a.GetType().Name.Contains(\"Ignore\")));\n        public static void Deconstruct<TKey, TValue>(this KeyValuePair<TKey, TValue> p, out TKey key, out TValue value) => (key, value) = (p.Key, p.Value);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/IAccessor.cs",
    "content": "﻿namespace PropertyAccessor\n{\n    interface IAccessor<T>\n    {\n        T Value { get; }\n        object this[string name] { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace PropertyAccessor\n{\n    /// <summary>\n    /// https://github.com/ufcpp/UfcppUtils/tree/master/Source/DynamicUtils がらみの調査。\n    ///\n    /// プロパティ名を与えてそれの値を読み出すようなものを\n    /// <see cref=\"System.Linq.Expressions\"/>動的コード生成で作るとして、\n    /// \n    /// - プロパティ名で switch するようなコードも生成\n    /// - プロパティごとにコード生成して、それを string → Func/Action な辞書で管理\n    ///   - <see cref=\"System.Collections.Generic.Dictionary{TKey, TValue}\"/> 管理\n    ///   - <see cref=\"System.Collections.Generic.SortedDictionary{TKey, TValue}\"/> 管理\n    ///\n    /// 等のパフォーマンスを調査。\n    /// </summary>\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Test();\n            BenchmarkRunner.Run<AccessorBenchmark>();\n        }\n\n        private static void Test()\n        {\n            var x = new AccessorBenchmark();\n            x.Setup();\n            x.ItemSwitch();\n            x.ItemCustom();\n            x.ItemDictionary();\n            x.ItemImmutableDictionary();\n            x.ItemSortedDictionary();\n            x.ItemSortedList();\n            x.PointSwitch();\n            x.PointCustom();\n            x.PointDictionary();\n            x.PointImmutableDictionary();\n            x.PointSortedDictionary();\n            x.PointSortedList();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/PropertyAccessor.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.9\" />\n    <PackageReference Include=\"System.Collections.Immutable\" Version=\"1.3.1\" />\n    <PackageReference Include=\"System.ValueTuple\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/SampleData/Item.cs",
    "content": "﻿namespace PropertyAccessor.SampleData\n{\n    public class Item\n    {\n        public int Id { get; set; }\n        public string Name { get; set; }\n        public double Value { get; set; }\n        public byte Code { get; set; }\n        public bool TestCaseForLongPropertyName { get; set; }\n        public bool TestCaseForMultiByteCharacterマルチバイト文字 { get; set; }\n\n        public Item() { }\n        public Item(int id, string name, double value, byte code, bool a, bool b)\n        {\n            Id = id;\n            Name = name;\n            Value = value;\n            Code = code;\n            TestCaseForLongPropertyName = a;\n            TestCaseForMultiByteCharacterマルチバイト文字 = b;\n        }\n\n        public static bool Equals(Item x, Item y)\n        {\n            if (x == y) return true;\n            if (x == null || y == null) return false;\n            return x.Id == y.Id\n                && x.Name == y.Name\n                && x.Name == y.Name\n                && x.Value == y.Value\n                && x.Code == y.Code\n                && x.TestCaseForLongPropertyName == y.TestCaseForLongPropertyName\n                && x.TestCaseForMultiByteCharacterマルチバイト文字 == y.TestCaseForMultiByteCharacterマルチバイト文字\n                ;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor/SampleData/Point.cs",
    "content": "﻿namespace PropertyAccessor.SampleData\n{\n    public struct Point\n    {\n        public int X { get; set; }\n        public int Y { get; set; }\n\n        public Point(int x, int y) : this()\n        {\n            X = x;\n            Y = y;\n        }\n\n        public static bool Equals(Point x, Point y) => x.X == y.X && x.Y == y.Y;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/PropertyAccessor/PropertyAccessor.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26730.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"PropertyAccessor\", \"PropertyAccessor\\PropertyAccessor.csproj\", \"{AF172C1E-23C8-4547-B4FD-423AA2B41527}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{AF172C1E-23C8-4547-B4FD-423AA2B41527}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AF172C1E-23C8-4547-B4FD-423AA2B41527}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AF172C1E-23C8-4547-B4FD-423AA2B41527}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AF172C1E-23C8-4547-B4FD-423AA2B41527}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {1BF602D3-7E8B-4527-8FC5-46E59CA01A74}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/Roslyn2_6_0PossiblyBug/ConsoleApp1/ConsoleApp1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.0;net47</TargetFrameworks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp\" Version=\"2.6.0\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "Demo/2017/Roslyn2_6_0PossiblyBug/ConsoleApp1/Program.cs",
    "content": "﻿using System;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\nusing static Microsoft.CodeAnalysis.CSharp.SyntaxFactory;\n\npublic struct ExternalStruct { }\n\nclass Program\n{\n    static void Main()\n    {\n        var cu = ParseCompilationUnit(@\"\npublic class X\n{\n    public ExternalStruct e;\n    public InternalStruct i;\n    public System.DateTime d;\n}\n\npublic struct InternalStruct { }\n\");\n\n        var sem = GetSemantics(cu);\n\n        var classX = (ClassDeclarationSyntax)cu.Members[0];\n\n        // X.e (struct ExternalStruct)\n        ShowTypeInfo(sem, (FieldDeclarationSyntax)classX.Members[0]);\n\n        // X.i (struct InternalStruct)\n        ShowTypeInfo(sem, (FieldDeclarationSyntax)classX.Members[1]);\n\n        // X.d (struct DateTime)\n        ShowTypeInfo(sem, (FieldDeclarationSyntax)classX.Members[2]);\n\n/* results\n# with net47:\nStruct ExternalStruct\nStruct InternalStruct\nStruct DateTime\n\n# with netcoreapp2.0:\nClass ExternalStruct\nStruct InternalStruct\nStruct DateTime\n*/\n    }\n\n    private static void ShowTypeInfo(SemanticModel sem, FieldDeclarationSyntax field)\n    {\n        var t = sem.GetTypeInfo(field.Declaration.Type).Type;\n\n        Console.WriteLine($\"{t.TypeKind} {t.Name}\");\n    }\n\n    private static SemanticModel GetSemantics(CompilationUnitSyntax cu)\n    {\n        var compilation = CSharpCompilation.Create(\"sample\")\n            .AddReferences(\n                MetadataReference.CreateFromFile(typeof(object).Assembly.Location),\n                MetadataReference.CreateFromFile(typeof(Program).Assembly.Location))\n            .AddSyntaxTrees(cu.SyntaxTree);\n\n        var sem = compilation.GetSemanticModel(cu.SyntaxTree);\n        return sem;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Roslyn2_6_0PossiblyBug/ConsoleApp1.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27130.2010\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{84B35159-A4E1-4E8D-9BC6-181017D544DF}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{84B35159-A4E1-4E8D-9BC6-181017D544DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{84B35159-A4E1-4E8D-9BC6-181017D544DF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{84B35159-A4E1-4E8D-9BC6-181017D544DF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{84B35159-A4E1-4E8D-9BC6-181017D544DF}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {9D92D57D-85EE-40B3-92D7-6E91BAD0F745}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/SpanAsSafePointer/ConsoleApp1/ConsoleApp1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.0;net47</TargetFrameworks>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <LangVersion>latest</LangVersion>\n    <StartupObject>Program</StartupObject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.9\" />\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp\" Version=\"2.3.1\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"15.3.0\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview2-25405-01\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n    <PackageReference Include=\"xunit\" Version=\"2.2.0\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.2.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/SpanAsSafePointer/ConsoleApp1/Point.cs",
    "content": "﻿struct Point\n{\n    public double X;\n    public double Y;\n    public double Z;\n\n    public Point(double x, double y, double z) => (X, Y, Z) = (x, y, z);\n    public override string ToString() => $\"{X}, {Y}, {Z}\";\n}\n\ninterface IPointCopier\n{\n    void Copy(Point[] from, Point[] to);\n}\n"
  },
  {
    "path": "Demo/2017/SpanAsSafePointer/ConsoleApp1/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nclass Program\n{\n    static void Main()\n    {\n        BenchmarkRunner.Run<SaveLoadBenchmark>();\n    }\n}\n"
  },
  {
    "path": "Demo/2017/SpanAsSafePointer/ConsoleApp1/RefExtensions/Before.cs",
    "content": "﻿namespace ConsoleApp1.RefExtensions.Before\n{\n    using System;\n\n    struct Point\n    {\n        public int X;\n        public int Y;\n        public int Z;\n\n        public void IncX() => this.X++;\n\n        public override string ToString() => $\"{X}, {Y}, {Z}\";\n    }\n\n    static class PointExtensions\n    {\n        public static void IncY(this Point @this) => @this.Y++;\n        public static void IncZ(ref Point @this) => @this.Z++;\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var p = new Point();\n            p.IncX(); // 普通のメソッド: X は +1 される\n            p.IncY(); // 拡張メソッド: p のコピーが発生。コピーの方のYが書き換わる。p.Y は変化なし\n            PointExtensions.IncZ(ref p); // これなら、p.Z が変化する\n\n            Console.WriteLine(p); // 1, 0, 1\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/SpanAsSafePointer/ConsoleApp1/Safe/Stream.cs",
    "content": "﻿namespace ConsoleApp1.Safe\n{\n    using System;\n\n    // System.IO.Stream もどき(簡易実装)\n    // デモ用に固定長の配列相手に読み書き。\n    class Stream\n    {\n        // 通常は読み書き状況に応じて増減させたり、\n        // 場合によってはnative実装でnative(GC管理外)メモリになっている。\n        byte[] _buffer = new byte[100];\n        int _offset = 0;\n\n        public void Read(byte[] data, int offset, int length)\n        {\n            Buffer.BlockCopy(_buffer, _offset, data, offset, length);\n            _offset += length;\n        }\n\n        public void Write(byte[] data, int offset, int length)\n        {\n            Buffer.BlockCopy(data, offset, _buffer, _offset, length);\n            _offset += length;\n        }\n\n        public void Seek(int offset) => _offset = offset;\n    }\n\n    static class PointExtensions\n    {\n        public static void Save(this Stream s, Point[] points)\n        {\n            foreach (var p in points)\n            {\n                byte[] b = BitConverter.GetBytes(p.X);\n                s.Write(b, 0, b.Length);\n\n                b = BitConverter.GetBytes(p.Y);\n                s.Write(b, 0, b.Length);\n\n                b = BitConverter.GetBytes(p.Z);\n                s.Write(b, 0, b.Length);\n            }\n        }\n\n        public static void Load(this Stream s, Point[] points)\n        {\n            var buffer = new byte[8];\n            for (int i = 0; i < points.Length; i++)\n            {\n                s.Read(buffer, 0, 8);\n                points[i].X = BitConverter.ToDouble(buffer, 0);\n\n                s.Read(buffer, 0, 8);\n                points[i].Y = BitConverter.ToDouble(buffer, 0);\n\n                s.Read(buffer, 0, 8);\n                points[i].Z = BitConverter.ToDouble(buffer, 0);\n            }\n        }\n    }\n\n    struct Copier : IPointCopier\n    {\n        public void Copy(Point[] from, Point[] to)\n        {\n            var s = new Stream();\n            s.Save(from);\n            s.Seek(0);\n            s.Load(to);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/SpanAsSafePointer/ConsoleApp1/SaveLoadBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System;\n\n/// <summary>\n/// 実行結果一例:\n///    Method |      Mean |     Error |    StdDev |  Gen 0 | Allocated |\n/// --------- |----------:|----------:|----------:|-------:|----------:|\n///      Safe | 209.03 ns | 0.3908 ns | 0.3464 ns | 0.1142 |     480 B |\n///   Unsafe1 | 117.81 ns | 0.4740 ns | 0.4202 ns | 0.0379 |     160 B |\n///   Unsafe2 |  29.49 ns | 0.0974 ns | 0.0911 ns | 0.0381 |     160 B |\n///  SpanBase |  40.54 ns | 0.1086 ns | 0.1016 ns | 0.0381 |     160 B |\n/// </summary>\n[MemoryDiagnoser]\npublic class SaveLoadBenchmark\n{\n    private const int N = 3;\n    private Point[] _source;\n    private Point[] _destination;\n\n    [GlobalSetup]\n    public void GlobalSetup()\n    {\n        _source = new Point[N];\n        _destination = new Point[N];\n\n        var r = new Random();\n        for (int i = 0; i < _source.Length; i++)\n        {\n            _source[i] = new Point(r.NextDouble(), r.NextDouble(), r.NextDouble());\n        }\n    }\n\n    [Benchmark]\n    public void Safe() => default(ConsoleApp1.Safe.Copier).Copy(_source, _destination);\n\n    [Benchmark]\n    public void Unsafe1() => default(ConsoleApp1.Unsafe1.Copier).Copy(_source, _destination);\n\n    [Benchmark]\n    public void Unsafe2() => default(ConsoleApp1.Unsafe2.Copier).Copy(_source, _destination);\n\n    [Benchmark]\n    public void SpanBase() => default(ConsoleApp1.SpanBase.Copier).Copy(_source, _destination);\n}\n"
  },
  {
    "path": "Demo/2017/SpanAsSafePointer/ConsoleApp1/SaveLoadTest.cs",
    "content": "﻿using System;\nusing Xunit;\n\npublic class SaveLoadTest\n{\n    private const int N = 3;\n    private Point[] _source;\n\n    public SaveLoadTest()\n    {\n        _source = new Point[N];\n\n        var r = new Random();\n        for (int i = 0; i < _source.Length; i++)\n        {\n            _source[i] = new Point(r.NextDouble(), r.NextDouble(), r.NextDouble());\n        }\n    }\n\n    private static void AssertAll(Point[] a, Point[] b)\n    {\n        for (int i = 0; i < a.Length; i++)\n        {\n            Assert.Equal(a[i].X, b[i].X);\n            Assert.Equal(a[i].Y, b[i].Y);\n            Assert.Equal(a[i].Z, b[i].Z);\n        }\n    }\n\n    private void CopyTest<T>()\n        where T : struct, IPointCopier\n    {\n        var dest = new Point[_source.Length];\n        default(T).Copy(_source, dest);\n        AssertAll(_source, dest);\n    }\n\n    [Fact]\n    public void Safe() => CopyTest<ConsoleApp1.Safe.Copier>();\n    [Fact]\n    public void Unsafe1() => CopyTest<ConsoleApp1.Unsafe1.Copier>();\n    [Fact]\n    public void Unsafe2() => CopyTest<ConsoleApp1.Unsafe2.Copier>();\n    [Fact]\n    public void SpanBase() => CopyTest<ConsoleApp1.SpanBase.Copier>();\n}\n"
  },
  {
    "path": "Demo/2017/SpanAsSafePointer/ConsoleApp1/SpanBase/Stream.cs",
    "content": "﻿namespace ConsoleApp1.SpanBase\n{\n    using System;\n\n    // Span<T> を受け付ける版\n    class Stream\n    {\n        // 書き込み先は Safe 版と同じ\n        byte[] _buffer = new byte[100];\n        int _offset = 0;\n\n        public void Read(Span<byte> data)\n        {\n            var s = new Span<byte>(_buffer, _offset, data.Length);\n            s.CopyTo(data);\n            _offset += data.Length;\n        }\n\n        public void Write(ReadOnlySpan<byte> data)\n        {\n            var s = new Span<byte>(_buffer, _offset, data.Length);\n            data.CopyTo(s);\n            _offset += data.Length;\n        }\n\n        public void Seek(int offset) => _offset = offset;\n    }\n\n    static class PointExtensions\n    {\n        public static void Save(this Stream s, Point[] points)\n        {\n            Span<Point> span = points;\n            s.Write(span.AsBytes());\n        }\n\n        public static void Load(this Stream s, Point[] points)\n        {\n            Span<Point> span = points;\n            s.Read(span.AsBytes());\n        }\n    }\n\n    struct Copier : IPointCopier\n    {\n        public void Copy(Point[] from, Point[] to)\n        {\n            var s = new Stream();\n            s.Save(from);\n            s.Seek(0);\n            s.Load(to);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/SpanAsSafePointer/ConsoleApp1/Unsafe/Stream.cs",
    "content": "﻿using ConsoleApp1.Unsafe;\n\nnamespace ConsoleApp1.Unsafe\n{\n    using System;\n\n    // ポインターを受け付ける Unsafe 版\n    unsafe class Stream\n    {\n        // 書き込み先は Safe 版と同じ\n        byte[] _buffer = new byte[100];\n        int _offset = 0;\n\n        public void Read(byte* data, int length)\n        {\n            fixed (byte* p = _buffer)\n            {\n                Buffer.MemoryCopy(p + _offset, data, length, length);\n            }\n            _offset += length;\n        }\n\n        public void Write(byte* data, int length)\n        {\n            fixed (byte* p = _buffer)\n            {\n                Buffer.MemoryCopy(data, p + _offset, 100 - _offset, length);\n            }\n            _offset += length;\n        }\n\n        public void Seek(int offset) => _offset = offset;\n    }\n}\n\nnamespace ConsoleApp1.Unsafe1\n{\n    unsafe static class PointExtensions\n    {\n        public static void Save(this Stream s, Point[] points)\n        {\n            var buffer = stackalloc byte[sizeof(double)];\n            var pb = (double*)buffer;\n\n            foreach (var p in points)\n            {\n                *pb = p.X;\n                s.Write(buffer, sizeof(double));\n                *pb = p.Y;\n                s.Write(buffer, sizeof(double));\n                *pb = p.Z;\n                s.Write(buffer, sizeof(double));\n            }\n        }\n\n        public static void Load(this Stream s, Point[] points)\n        {\n            var buffer = stackalloc byte[sizeof(double)];\n            var pb = (double*)buffer;\n\n            for (int i = 0; i < points.Length; i++)\n            {\n                s.Read(buffer, sizeof(double));\n                points[i].X = *pb;\n                s.Read(buffer, sizeof(double));\n                points[i].Y = *pb;\n                s.Read(buffer, sizeof(double));\n                points[i].Z = *pb;\n            }\n        }\n    }\n\n    struct Copier : IPointCopier\n    {\n        public void Copy(Point[] from, Point[] to)\n        {\n            var s = new Stream();\n            s.Save(from);\n            s.Seek(0);\n            s.Load(to);\n        }\n    }\n}\n\nnamespace ConsoleApp1.Unsafe2\n{\n    unsafe static class PointExtensions\n    {\n        public static void Save(this Stream s, Point[] points)\n        {\n            fixed(Point* p = points)\n            {\n                s.Write((byte*)p, 24 * points.Length);\n            }\n        }\n\n        public static void Load(this Stream s, Point[] points)\n        {\n            fixed (Point* p = points)\n            {\n                s.Read((byte*)p, 24 * points.Length);\n            }\n        }\n    }\n\n    struct Copier : IPointCopier\n    {\n        public void Copy(Point[] from, Point[] to)\n        {\n            var s = new Stream();\n            s.Save(from);\n            s.Seek(0);\n            s.Load(to);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/SpanAsSafePointer/SpanAsSafePointer.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26730.8\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{818A2804-08E4-4E2F-97C3-EDC9411ECB09}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{818A2804-08E4-4E2F-97C3-EDC9411ECB09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{818A2804-08E4-4E2F-97C3-EDC9411ECB09}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{818A2804-08E4-4E2F-97C3-EDC9411ECB09}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{818A2804-08E4-4E2F-97C3-EDC9411ECB09}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {5C070516-B219-4BFC-881D-4592C9AD12AA}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/Data/Circular.cs",
    "content": "﻿namespace TupleMutableStruct.Data\n{\n    using System;\n\n    // 単位円周上の点\n    struct Circular1\n    {\n        public double X { get; }\n        public double Y { get; }\n        public Circular1(double x, double y)\n        {\n            var abs = Math.Sqrt(x * x + y * y);\n            X = x / abs;\n            Y = y / abs;\n        }\n    }\n\n    // 単位円周上の点なら、角度でデータを持てば double 1個で済む\n    // 計算誤差を除けば Circular1 と全く同じ挙動を、半分のメモリ消費で実現している\n    struct Circular2\n    {\n        private double _angle;\n        public Circular2(double angle)\n        {\n            if (angle == 0) angle = 2 * Math.PI; // default 値の挙動を Circular1 と合わせるため\n            _angle = angle;\n        }\n        public Circular2(double x, double y) : this(Math.Atan2(y, x)) { }\n\n        public double X => _angle == 0 ? 0 : Math.Cos(_angle);\n        public double Y => _angle == 0 ? 0 : Math.Sin(_angle);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/Data/Point.cs",
    "content": "﻿namespace TupleMutableStruct.Data\n{\n    public struct Point\n    {\n        public int X;\n        public int Y;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/Data/VirtualPoint.cs",
    "content": "﻿namespace TupleMutableStruct.Data.Virtual\n{\n    using System.ComponentModel;\n\n    // クラスの場合は virtual にすることでプロパティにする意味もある\n    public class Point\n    {\n        public virtual int X { get; set; }\n        public virtual int Y { get; set; }\n    }\n\n    // 例えば、既存の型に対して変更トラッキング機能を追加したい場面がある\n    internal class PointImpl : Point, INotifyPropertyChanging, INotifyPropertyChanged\n    {\n        public override int X\n        {\n            get => base.X;\n            set\n            {\n                if (base.X != value)\n                {\n                    PropertyChanging?.Invoke(this, new PropertyChangingEventArgs(nameof(X)));\n                    base.X = value;\n                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(X)));\n                }\n            }\n        }\n\n        // X と同様なので Y は省略\n        public override int Y\n        {\n            get => base.Y;\n            set\n            {\n                if (base.Y != value)\n                {\n                    PropertyChanging?.Invoke(this, new PropertyChangingEventArgs(nameof(Y)));\n                    base.Y = value;\n                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Y)));\n                }\n            }\n        }\n\n        public event PropertyChangingEventHandler PropertyChanging;\n        public event PropertyChangedEventHandler PropertyChanged;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/MemoryLayout/Benchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\n\nnamespace TupleMutableStruct.MemoryLayout\n{\n    public class VectorPerformance\n    {\n        [GlobalSetup]\n        public void Setup()\n        {\n            data = new(byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h)[N];\n\n            var r = new Random();\n            for (int i = 0; i < N; i++)\n            {\n                data[i] = r.RandomVector();\n            }\n        }\n\n        const int N = 2000;\n        (byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h)[] data;\n\n        [Benchmark]\n        public SafeAdd.Vector XVector()\n        {\n            SafeAdd.Vector x = data[0];\n            for (int i = 1; i < N; i++)\n            {\n                x = x.A * (x + data[i]);\n            }\n            return x;\n        }\n\n        [Benchmark]\n        public PointerAdd.Vector YVector()\n        {\n            PointerAdd.Vector x = data[0];\n            for (int i = 1; i < N; i++)\n            {\n                x = x.A * (x + data[i]);\n            }\n            return x;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/MemoryLayout/PointerAdd.cs",
    "content": "﻿using System;\n\nnamespace TupleMutableStruct.MemoryLayout.PointerAdd\n{\n    public struct Vector : IEquatable<Vector>\n    {\n        public byte A;\n        public byte B;\n        public byte C;\n        public byte D;\n        public byte E;\n        public byte F;\n        public byte G;\n        public byte H;\n\n        public Vector(byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) => (A, B, C, D, E, F, G, H) = (a, b, c, d, e, f, g, h);\n        public Vector((byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) t) => (A, B, C, D, E, F, G, H) = t;\n        public void Deconstruct(out byte a, out byte b, out byte c, out byte d, out byte e, out byte f, out byte g, out byte h) => (a, b, c, d, e, f, g, h) = (A, B, C, D, E, F, G, H);\n        public (byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) ToTuple() => (A, B, C, D, E, F, G, H);\n        public static implicit operator (byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) (Vector x) => x.ToTuple();\n        public static implicit operator Vector((byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) t) => new Vector(t);\n\n        public bool Equals(Vector other) => Equals(this, other);\n        public override bool Equals(object obj) => obj is Vector other && Equals(this, other);\n        public override int GetHashCode() => base.GetHashCode();\n\n        public unsafe static bool Equals(Vector x, Vector y)\n        {\n            var lx = *(ulong*)(&x);\n            var ly = *(ulong*)(&y);\n            return lx == ly;\n        }\n\n        static ulong evenMask = 0x00ff00ff00ff00ff;\n        static ulong oddMask = 0xff00ff00ff00ff00;\n\n        public unsafe static Vector operator +(Vector x, Vector y)\n        {\n            var lx = *(ulong*)(&x);\n            var ly = *(ulong*)(&y);\n            var lz = evenMask & ((evenMask & lx) + (evenMask & ly))\n                | oddMask & ((oddMask & lx) + (oddMask & ly));\n            return *(Vector*)(&lz);\n        }\n\n        public unsafe static Vector operator *(byte a, Vector x)\n        {\n            var lx = *(ulong*)(&x);\n            var lz = evenMask & (a * (evenMask & lx))\n                | oddMask & (a * (oddMask & lx));\n            return *(Vector*)(&lz);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/MemoryLayout/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace TupleMutableStruct.MemoryLayout\n{\n    class Program\n    {\n        static void Main()\n        {\n            new VectorTest().XAndYShouldBeIdentical();\n            BenchmarkRunner.Run<VectorPerformance>();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/MemoryLayout/RandomExtensions.cs",
    "content": "﻿using System;\n\nnamespace TupleMutableStruct.MemoryLayout\n{\n    static class RandomExtensions\n    {\n        public static (byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) RandomVector(this Random r) => (RandomByte(r), RandomByte(r), RandomByte(r), RandomByte(r), RandomByte(r), RandomByte(r), RandomByte(r), RandomByte(r));\n        public static byte RandomByte(this Random r) => (byte)(r.Next() % 256);\n\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/MemoryLayout/RefReturns.cs",
    "content": "﻿namespace TupleMutableStruct.MemoryLayout.RefReturns\n{\n    using static System.Console;\n    using System.Runtime.CompilerServices;\n\n    class Program\n    {\n        static void Main()\n        {\n            var v = new Vector { A = 1, B = 2, C = 3, D = 4, E = 5, F = 6, G = 7, H = 8 };\n\n            // これまでも書けたが、ポインターが必要だった\n            unsafe\n            {\n                long* p = (long*)(void*)&v;\n                WriteLine(p->ToString(\"X\"));\n            }\n\n            // 参照戻り値があれば、ポインターなしで同様のことができる\n            // ここには unsafe 宣言が不要\n            ref long r = ref AsLong(ref v);\n            WriteLine(r.ToString(\"X\"));\n        }\n\n        // Unsafe クラスを利用\n        // これ自身は、クラス名の通り unsafe だし、ポインターを介する\n        unsafe static ref long AsLong(ref Vector v)\n            => ref Unsafe.AsRef<long>(Unsafe.AsPointer(ref v));\n    }\n\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/MemoryLayout/SafeAdd.cs",
    "content": "﻿using System;\n\nnamespace TupleMutableStruct.MemoryLayout.SafeAdd\n{\n    public struct Vector : IEquatable<Vector>\n    {\n        public byte A;\n        public byte B;\n        public byte C;\n        public byte D;\n        public byte E;\n        public byte F;\n        public byte G;\n        public byte H;\n\n        public Vector(byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) => (A, B, C, D, E, F, G, H) = (a, b, c, d, e, f, g, h);\n        public Vector((byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) t) => (A, B, C, D, E, F, G, H) = t;\n        public void Deconstruct(out byte a, out byte b, out byte c, out byte d, out byte e, out byte f, out byte g, out byte h) => (a, b, c, d, e, f, g, h) = (A, B, C, D, E, F, G, H);\n        public (byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) ToTuple() => (A, B, C, D, E, F, G, H);\n        public static implicit operator (byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) (Vector x) => x.ToTuple();\n        public static implicit operator Vector((byte a, byte b, byte c, byte d, byte e, byte f, byte g, byte h) t) => new Vector(t);\n\n        public bool Equals(Vector other) => Equals(this, other);\n        public override bool Equals(object obj) => obj is Vector other && Equals(this, other);\n        public override int GetHashCode() => base.GetHashCode();\n\n        public static bool Equals(Vector x, Vector y)\n            => x.A == y.A\n            && x.B == y.B\n            && x.C == y.C\n            && x.D == y.D\n            && x.E == y.E\n            && x.F == y.F\n            && x.G == y.G\n            && x.H == y.H;\n\n        public static Vector operator +(Vector x, Vector y)\n            => new Vector(\n                (byte)(x.A + y.A),\n                (byte)(x.B + y.B),\n                (byte)(x.C + y.C),\n                (byte)(x.D + y.D),\n                (byte)(x.E + y.E),\n                (byte)(x.F + y.F),\n                (byte)(x.G + y.G),\n                (byte)(x.H + y.H));\n\n        public static Vector operator *(byte a, Vector x)\n            => new Vector(\n                (byte)(a * x.A),\n                (byte)(a * x.B),\n                (byte)(a * x.C),\n                (byte)(a * x.D),\n                (byte)(a * x.E),\n                (byte)(a * x.F),\n                (byte)(a * x.G),\n                (byte)(a * x.H));\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/MemoryLayout/Test.cs",
    "content": "﻿using System;\nusing Xunit;\n\nnamespace TupleMutableStruct.MemoryLayout\n{\n    public class VectorTest\n    {\n        [Fact]\n        public void XAndYShouldBeIdentical()\n        {\n            var r = new Random();\n\n            for (int i = 0; i < 1000; i++)\n            {\n                var a = r.RandomByte();\n                var x = r.RandomVector();\n                var y = r.RandomVector();\n\n                var a1 = (SafeAdd.Vector)x + y;\n                var a2 = (PointerAdd.Vector)x + y;\n                if (!a1.ToTuple().Equals(a2.ToTuple())) throw new InvalidOperationException();\n\n                var m1 = a * (SafeAdd.Vector)x;\n                var m2 = a * (PointerAdd.Vector)x;\n                if (!m1.ToTuple().Equals(m2.ToTuple())) throw new InvalidOperationException();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/MemoryLayout/Vector.cs",
    "content": "﻿namespace TupleMutableStruct.MemoryLayout\n{\n    public struct Vector\n    {\n        public byte A;\n        public byte B;\n        public byte C;\n        public byte D;\n        public byte E;\n        public byte F;\n        public byte G;\n        public byte H;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace TupleMutableStruct\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/StructProperties/GetSet.cs",
    "content": "﻿namespace TupleMutableStruct.StructProperties.GetSet\n{\n    // mutable な構造体\n    struct Point\n    {\n        public int X { get; set; }\n        public int Y { get; set; }\n        public Point(int x, int y) => (X, Y) = (x, y);\n    }\n\n    struct Polygon\n    {\n        private Point[] _vertices;\n\n        public Polygon(params Point[] vertices) => _vertices = vertices;\n\n        // mutable な構造体をプロパティ/インデクサー越しに読み書き\n        public Point this[int index]\n        {\n            get => _vertices[index];\n            set => _vertices[index] = value;\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var p = new Polygon(\n                new Point(0, 1),\n                new Point(1, 1),\n                new Point(1, 0)\n                );\n\n#if false\n            // なぜか書き換えできない(実際にはそういう仕様)\n            p[0].X = 2;\n#endif\n\n            // なぜか p[0].X が書き換わらない\n            var v0 = p[0];\n            v0.X = 2;\n\n            // p[0] が返す値も、v0 で受け取った値もコピーなので、元の値が書き換わらなくて当然\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/StructProperties/RefReturns.cs",
    "content": "﻿namespace TupleMutableStruct.StructProperties.RefReturns\n{\n    using Point = GetSet.Point;\n\n    // Point は元と一緒\n\n    struct Polygon\n    {\n        private Point[] _vertices;\n\n        public Polygon(params Point[] vertices) => _vertices = vertices;\n\n        // 構造体を mutable にしたいときってのは、大体パフォーマンス優先の時\n        // そういう時には ref returns が使える\n        public ref Point this[int index] => ref _vertices[index];\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var p = new Polygon(\n                new Point(0, 1),\n                new Point(1, 1),\n                new Point(1, 0)\n                );\n\n            // ちゃんと書き換わる\n            p[0].X = 2;\n\n            // ちゃんと p[0].X が書き換わる\n            ref var v0 = ref p[0];\n            v0.X = 2;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/TupleMutableStruct.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <StartupObject>TupleMutableStruct.Program</StartupObject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"xunit\" Version=\"2.4.0\" />\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.1\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.5.2\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/Usage/BindableBase.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.ComponentModel;\nusing System.Runtime.CompilerServices;\n\nnamespace TupleMutableStruct.Usage\n{\n    class BindableBase : INotifyPropertyChanged\n    {\n        public event PropertyChangedEventHandler PropertyChanged;\n        protected void SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)\n        {\n            if (!EqualityComparer<T>.Default.Equals(storage, value))\n            {\n                storage = value;\n                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/Usage/Field.cs",
    "content": "﻿namespace TupleMutableStruct.Usage.Field\n{\n    class Point : BindableBase\n    {\n        int x; // フィールドで直接保持\n        int y;\n\n        public int X { get => x; set => SetProperty(ref x, value); }\n        public int Y { get => y; set => SetProperty(ref y, value); }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/Usage/LooselyTyped.cs",
    "content": "﻿namespace TupleMutableStruct.Usage.LooselyTyped\n{\n    namespace ImmutableStruct\n    {\n        // X, Y を持つ書き換え不能な構造体\n        struct Point\n        {\n            public readonly (int X, int Y) Value;\n            public int X => Value.X;\n            public int Y => Value.Y;\n            public Point(int x, int y) => Value = (x, y);\n            public Point((int X, int Y) value) => Value = value;\n        }\n    }\n\n    namespace MutableClass\n    {\n        // X, Y を持つ通常のクラス\n        class Point\n        {\n            public (int X, int Y) Value;\n            public int X { get => Value.X; set => Value.X = value; }\n            public int Y { get => Value.Y; set => Value.Y = value; }\n        }\n    }\n\n    namespace ObserverbleClass\n    {\n        // X, Y を持つ変更通知付きのクラス\n        class Point : BindableBase\n        {\n            public (int X, int Y) Value;\n            public int X { get => Value.X; set => SetProperty(ref Value.X, value); }\n            public int Y { get => Value.Y; set => SetProperty(ref Value.Y, value); }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/Usage/Program.cs",
    "content": "﻿namespace TupleMutableStruct.Usage\n{\n    class Program\n    {\n        static void Variables()\n        {\n            var x = 1;\n            var y = 2;\n\n            // C# の変数は書き換え可能だし、\n            // ref/out 越しに参照できる\n            x = 10;\n            int.TryParse(\"123\", out x);\n            ref var r = ref y;\n            r = 456;\n        }\n\n        // 引数に対して\n        static void Parameters(int x, int y)\n        {\n            int.TryParse(\"123\", out x);\n            ref var r = ref y;\n            r = 456;\n        }\n\n        static void Deconstruction()\n        {\n            // タプルの分解で得た変数に対して\n            var (x, y) = (1, 2);\n\n            x = 10;\n            int.TryParse(\"123\", out x);\n            ref var r = ref y;\n            r = 456;\n        }\n\n        static void Tuple()\n        {\n            // タプル自体に対して\n            var t = (x: 1, y: 2);\n\n            t.x = 10;\n            int.TryParse(\"123\", out t.x);\n            ref var r = ref t.y;\n            r = 456;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/Usage/Tuple.cs",
    "content": "﻿namespace TupleMutableStruct.Usage.Tuple\n{\n    class Point : BindableBase\n    {\n        (int x, int y) t; // タプルにして保持\n\n        public int X { get => t.x; set => SetProperty(ref t.x, value); }\n        public int Y { get => t.y; set => SetProperty(ref t.y, value); }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/ValueObject/MutableClass.cs",
    "content": "﻿namespace TupleMutableStruct.ValueObject.MutableClass\n{\n    using System;\n\n    class MutableClass : IEquatable<MutableClass>\n    {\n        public int X { get; set; }\n        public int Y { get; set; }\n\n        public bool Equals(MutableClass other) => X == other.X && Y == other.Y;\n        public override bool Equals(object obj) => obj is MutableClass other && base.Equals(other);\n        public override int GetHashCode() => X.GetHashCode() * 1234567 + Y.GetHashCode();\n    }\n}\n\nnamespace TupleMutableStruct.ValueObject.MutableClass\n{\n    using System;\n    using System.Collections.Generic;\n\n    class Program\n    {\n        static void Main()\n        {\n            var map = new Dictionary<MutableClass, int>();\n\n            var key1 = new MutableClass { X = 1, Y = 2 };\n            map[key1] = 1;\n\n            // キーにしたインスタンスを書き換えてしまう\n            key1.X = 2;\n\n            // 当然、見つからなくなる\n            Console.WriteLine(map.TryGetValue(key1, out _)); // False\n\n            // 元のキーと同じ値の、別インスタンスを作る\n            var key2 = new MutableClass { X = 1, Y = 2 };\n\n            // これでも、見つからなくなる\n            Console.WriteLine(map.TryGetValue(key2, out _)); // False\n\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/ValueObject/MutableStruct.cs",
    "content": "﻿namespace TupleMutableStruct.ValueObject.MutableStruct\n{\n    using System;\n    using System.Collections.Generic;\n\n    struct MutableStruct : IEquatable<MutableStruct>\n    {\n        public int X { get; set; }\n        public int Y { get; set; }\n\n        public bool Equals(MutableStruct other) => X == other.X && Y == other.Y;\n        public override bool Equals(object obj) => obj is MutableStruct other && base.Equals(other);\n        public override int GetHashCode() => X.GetHashCode() * 1234567 + Y.GetHashCode();\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var map = new Dictionary<MutableStruct, int>();\n\n            var key1 = new MutableStruct { X = 1, Y = 2 };\n            map[key1] = 1;\n\n            // 構造体の場合、Dictionary にはコピーが渡るので、こっちを書き換えても map には影響なし\n            key1.X = 2;\n\n            // 当然、key1では見つけられない\n            Console.WriteLine(map.TryGetValue(key1, out _)); // False\n\n            // 元のキーと同じ値を作る\n            var key2 = new MutableStruct { X = 1, Y = 2 };\n\n            // 見つかる！\n            Console.WriteLine(map.TryGetValue(key2, out _)); // True\n        }\n    }\n\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct/ValueTuple.cs",
    "content": "﻿namespace TupleMutableStruct\n{\n    // System.ValueTuple の、必要な部分のみ抜粋\n    public struct ValueTuple<T1, T2>\n    {\n        public T1 Item1;\n        public T2 Item2;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TupleMutableStruct/TupleMutableStruct.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26228.10\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TupleMutableStruct\", \"TupleMutableStruct\\TupleMutableStruct.csproj\", \"{81D52D56-9A3D-42D7-8C90-F39F9360DBAD}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{81D52D56-9A3D-42D7-8C90-F39F9360DBAD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{81D52D56-9A3D-42D7-8C90-F39F9360DBAD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{81D52D56-9A3D-42D7-8C90-F39F9360DBAD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{81D52D56-9A3D-42D7-8C90-F39F9360DBAD}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/ByteToLongBenchmark/ByteToLongBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System;\n\n/// <summary>\n/// byte 配列を long にして8バイトずつ読みだす処理のベンチマーク。\n/// byte 配列長が8の倍数でない場合、最後の部分は0詰め(little endianだとlongの上位桁が0)。\n///\n/// 目的が文字列の UTF8 エンコード結果の比較なので、0はないはず(null文字には対応しない前提) → 0 詰めしても平気。\n///\n///             Method |     Mean |     Error |    StdDev |\n/// ------------------ |---------:|----------:|----------:|\n///   PointerBenchmark | 3.739 us | 0.0504 us | 0.0447 us |\n///  Pointer2Benchmark | 3.631 us | 0.0482 us | 0.0451 us |\n///      SpanBenchmark | 4.083 us | 0.0454 us | 0.0402 us |\n///\n/// ほんとにパフォーマンス最優先なところは unsafe 使いたい感じはある。\n/// </summary>\npublic class ByteToLongBenchmark\n{\n    byte[] rawData;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        rawData = new byte[256];\n        for (int i = 0; i < 256; i++) rawData[i] = (byte)i;\n    }\n\n    const int N = 32;\n\n    [Benchmark]\n    public unsafe ulong PointerBenchmark()\n    {\n        var r = new Random();\n        var sum = 0UL;\n\n        for (int itr = 0; itr < N; itr++)\n        {\n            var offset = r.Next(0, 256);\n            var length = r.Next(1, 256 - offset);\n\n            fixed (byte* p = rawData)\n            {\n                var x = p + offset;\n\n                while (MoveNext(ref x, ref length, out var v))\n                {\n                    sum += v;\n                }\n            }\n        }\n        return sum;\n    }\n\n    [Benchmark]\n    public unsafe ulong Pointer2Benchmark()\n    {\n        var r = new Random();\n        var sum = 0UL;\n\n        for (int itr = 0; itr < N; itr++)\n        {\n            var offset = r.Next(0, 256);\n            var length = r.Next(1, 256 - offset);\n\n            fixed (byte* p = rawData)\n            {\n                var x = p + offset;\n\n                while (MoveNext2(ref x, ref length, out var v))\n                {\n                    sum += v;\n                }\n            }\n        }\n        return sum;\n    }\n\n    [Benchmark]\n    public ulong SpanBenchmark()\n    {\n        var r = new Random();\n        var sum = 0UL;\n\n        for (int itr = 0; itr < N; itr++)\n        {\n            var offset = r.Next(0, 256);\n            var length = r.Next(1, 256 - offset);\n\n            ReadOnlySpan<byte> wholeSpan = rawData;\n            var x = wholeSpan.Slice(offset, length);\n\n            while (MoveNext(ref x, out var v))\n            {\n                sum += v;\n            }\n        }\n        return sum;\n    }\n\n    /// <summary>\n    /// <see cref=\"Span{T}\"/>版。\n    /// </summary>\n    public static bool MoveNext(ref ReadOnlySpan<byte> x, out ulong value)\n    {\n        var len = Math.Min(x.Length, 8);\n        switch (len)\n        {\n            default:\n            case 8:\n                value = x.NonPortableCast<byte, ulong>()[0];\n                break;\n            case 0:\n                value = 0;\n                return false;\n            case 1:\n                value = x[0];\n                break;\n            case 2:\n                value = x.NonPortableCast<byte, ushort>()[0];\n                break;\n            case 3:\n                value = x.NonPortableCast<byte, ushort>()[0] | ((ulong)x[2] << 16);\n                break;\n            case 4:\n                value = x.NonPortableCast<byte, uint>()[0];\n                break;\n            case 5:\n                value = x.NonPortableCast<byte, uint>()[0] | ((ulong)x[4] << 32);\n                break;\n            case 6:\n                value = x.NonPortableCast<byte, uint>()[0] | ((ulong)x.NonPortableCast<byte, ushort>()[2] << 32);\n                break;\n            case 7:\n                value = x.NonPortableCast<byte, uint>()[0] | ((ulong)x.NonPortableCast<byte, ushort>()[2] << 32) | ((ulong)x[6] << 48);\n                break;\n        }\n\n        x = x.Slice(len);\n        return true;\n    }\n\n    /// <summary>\n    /// ポインター版。\n    /// </summary>\n    public static unsafe bool MoveNext(ref byte* x, ref int length, out ulong value)\n    {\n        var len = Math.Min(length, 8);\n        switch (len)\n        {\n            default:\n            case 8:\n                value = *(ulong*)x;\n                break;\n            case 0:\n                value = 0;\n                return false;\n            case 1:\n                value = *x;\n                break;\n            case 2:\n                value = *((ushort*)x);\n                break;\n            case 3:\n                value = *((ushort*)x) | ((ulong)x[2] << 16);\n                break;\n            case 4:\n                value = *((uint*)x);\n                break;\n            case 5:\n                value = *((uint*)x) | ((ulong)x[4] << 32);\n                break;\n            case 6:\n                value = *((uint*)x) | ((ulong)(*(ushort*)(x + 4)) << 32);\n                break;\n            case 7:\n                value = *((uint*)x) | ((ulong)(*(ushort*)(x + 4)) << 32) | ((ulong)*(x + 6) << 48);\n                break;\n        }\n\n        x += len;\n        length -= len;\n        return true;\n    }\n\n    /// <summary>\n    /// 速いけど unsafe 必須のやり方。\n    ///\n    /// 末尾部分、8の倍数になってなくてもお構いなしにいったんはみ出して読んで、後でマスクを掛けてはみ出し部分を0クリアする。\n    /// いったんはみ出すのが<see cref=\"Span{T}\"/>(ちゃんと範囲チェックしてる)ではできない。\n    /// </summary>\n    static unsafe bool MoveNext2(ref byte* x, ref int length, out ulong value)\n    {\n        if (length == 0)\n        {\n            value = default;\n            return false;\n        }\n\n        var len = Math.Min(length, 8);\n        var mask = unchecked((1UL << (len * 8)) - 1);\n\n        value = *(ulong*)x & mask;\n\n        x += len;\n        length -= len;\n        return true;\n    }\n\n    public unsafe void Test()\n    {\n        var r = new Random();\n\n        for (int itr = 0; itr < 10; itr++)\n        {\n            var offset = r.Next(0, 256);\n            var length = r.Next(1, 256 - offset);\n\n            fixed (byte* p = rawData)\n            {\n                ReadOnlySpan<byte> wholeSpan = rawData;\n                var x1 = wholeSpan.Slice(offset, length);\n                var x2 = p + offset;\n                var x3 = p + offset;\n\n                var l2 = length;\n                var l3 = length;\n\n                var b1 = MoveNext(ref x1, out var v1);\n                var b2 = MoveNext(ref x2, ref l2, out var v2);\n                var b3 = MoveNext(ref x3, ref l3, out var v3);\n\n                if (b1 != b2 || b1 != b3) throw new Exception();\n                if (v1 != v2 || v1 != v3) throw new Exception();\n            }\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/ByteToLongBenchmark/ByteToLongBenchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.9\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview2-25405-01\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/ByteToLongBenchmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\npublic class Program\n{\n    static void Main()\n    {\n#if tru\n        var p = new ByteToLongBenchmark();\n        p.Setup();\n        p.PointerBenchmark();\n        p.Pointer2Benchmark();\n        p.SpanBenchmark();\n        p.Test();\n#else\n        BenchmarkRunner.Run<ByteToLongBenchmark>();\n#endif\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/DictionaryBenchmark/CharNode.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Text;\n\n/// <summary>\n/// \"aaa\", \"aa\", \"abc\", \"ba\", \"bb\" みたいなのを、\n///\n/// a---a\n///   | +---a\n///   +-b---c\n/// b---a\n///   +-b\n///\n/// みたいなツリー管理する。\n///\n/// これ自体からキー検索することもできるけど、そんな処理は重たいことわかってるので、\n/// 実際のところこのデータ構造から↓みたいなコードを生成できるといいなぁ、程度のもの。\n///\n/// <code><![CDATA[\n/// if (c[0] == 'a')\n/// {\n///     if (c[1] == 'a')\n///     {\n///         if (c.Length == 2) return ...;\n///         else if  (c[2] == 'a')\n///         {\n///             ...\n///         }\n///     }\n/// }\n/// ]]></code>\n///\n/// で、こういう処理をするにしても char のままでやると重たいんで、<see cref=\"LongNode{T}\"/>を使った方がよさげ。\n/// </summary>\nclass CharNode<T> : IReadOnlyDictionary<string, T>, IDictionary<string, T>\n{\n    struct Opt\n    {\n        public bool HasValue { get; }\n        public T Value { get; }\n\n        public Opt(T value)\n        {\n            HasValue = true;\n            Value = value;\n        }\n    }\n\n    Opt _value;\n    List<(char key, CharNode<T> node)> _children;\n\n    #region not implemented or thin wrapper\n    public IEnumerable<string> Keys => throw new NotImplementedException();\n    public IEnumerable<T> Values => throw new NotImplementedException();\n    public int Count => throw new NotImplementedException();\n    ICollection<string> IDictionary<string, T>.Keys => throw new NotImplementedException();\n    ICollection<T> IDictionary<string, T>.Values => throw new NotImplementedException();\n    public IEnumerator<KeyValuePair<string, T>> GetEnumerator() => throw new NotImplementedException();\n    IEnumerator IEnumerable.GetEnumerator() => throw new NotImplementedException();\n    public bool Remove(string key) => throw new NotImplementedException();\n    public void Clear() => throw new NotImplementedException();\n    public bool Contains(KeyValuePair<string, T> item) => throw new NotImplementedException();\n    public void CopyTo(KeyValuePair<string, T>[] array, int arrayIndex) => throw new NotImplementedException();\n    public bool Remove(KeyValuePair<string, T> item) => throw new NotImplementedException();\n    public bool IsReadOnly => true;\n    T IDictionary<string, T>.this[string key] { get => this[key]; set => throw new NotImplementedException(); }\n    public void Add(KeyValuePair<string, T> item) => Add(item.Key, item.Value);\n    #endregion\n\n    public T this[string key]\n    {\n        get\n        {\n            var n = Find(key, 0, false);\n            if (n == null || !n._value.HasValue) throw new KeyNotFoundException(key);\n            return n._value.Value;\n        }\n    }\n\n    public bool TryGetValue(string key, out T value)\n    {\n        var n = Find(key, 0, false);\n        if (n == null || !n._value.HasValue)\n        {\n            value = default;\n            return false;\n        }\n        else\n        {\n            value = n._value.Value;\n            return true;\n        }\n    }\n\n    public bool ContainsKey(string key)\n    {\n        var n = Find(key, 0, false);\n        return n != null && !n._value.HasValue;\n    }\n\n    public void Add(string key, T value)\n    {\n        var n = Find(key, 0, true);\n        n._value = new Opt(value);\n    }\n\n    private CharNode<T> Find(string key, int offset, bool add)\n    {\n        if(key.Length == offset)\n        {\n            return this;\n        }\n\n        if (_children == null) _children = new List<(char, CharNode<T>)>();\n\n        var c = key[offset];\n        var i = _children.FindIndex(t => t.key == c);\n        CharNode<T> n;\n        if (i < 0)\n        {\n            if (add)\n            {\n                n = new CharNode<T>();\n                _children.Add((c, n));\n            }\n            else return null;\n        }\n        else\n        {\n            n = _children[i].node;\n        }\n\n        return n.Find(key, offset + 1, add);\n    }\n\n    public override string ToString()\n    {\n        var sb = new StringBuilder();\n        Append(sb, 0);\n        return sb.ToString();\n    }\n\n    private void Append(StringBuilder sb, int offset)\n    {\n        if (_children != null)\n        {\n            foreach (var (key, node) in _children)\n            {\n                for (int i = 0; i < offset; i++) sb.Append(' ');\n                sb.Append(key);\n                sb.AppendLine();\n\n                node.Append(sb, offset + 1);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/DictionaryBenchmark/DictionaryBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\n/// <summary>\n/// いくつか前提が絞られてる状況下で、文字列キーの辞書の性能上げれないかなぁという検討。\n///\n/// 前提:\n/// ぶっちゃけ、クラス → Type とかプロパティ → PropertyInfo 的なものの辞書に使いたい。\n/// - 文字列長はそんなに長くない\n///   (もしかしたら、ASCII 文字前提にしてもいいかも。少なくとも99%くらいASCII文字)\n/// - キーの数もそこまで多くない\n///   (型数は千個くらい。プロパティ数は大半が10以下、多くてせいぜい数十。)\n/// - 増減しない\n///\n/// 場合によっては<see cref=\"System.Linq.Expressions.LambdaExpression.Compile\"/>とかで switch とかをコード生成するのが最速なのでそれも比較に並べたいけど、\n/// ベンチマーク上、最初の Compile に掛かる時間を避けるのをどうやればいいかで悩み中。\n///\n///    Method |      Mean |     Error |    StdDev |\n/// --------- |----------:|----------:|----------:|\n///  CharNode | 11.689 ms | 0.0681 ms | 0.0568 ms |\n///  LongNode |  9.125 ms | 0.0513 ms | 0.0480 ms |\n///       Sys |  2.396 ms | 0.0707 ms | 0.0814 ms |\n///     Fixed |  2.266 ms | 0.0151 ms | 0.0141 ms |\n/// </summary>\n[MemoryDiagnoser]\npublic class DictionaryBenchmark\n{\n    string[] allKeys;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        allKeys = TestData.TypeNames.SelectMany(x => x.propertyNames).Distinct().ToArray();\n    }\n\n    //[Benchmark]\n    public void CharNode()\n    {\n        foreach (var (t, p) in TestData.TypeNames.Take(1))\n        {\n            // 追加は1回限り\n            var items = p.Select(x => new KeyValuePair<string, string>(x, x));\n            var d = new CharNode<string>();\n            foreach (var (key, value) in items) d.Add(key, value);\n            Bench(items, allKeys.Except(p), d);\n        }\n    }\n\n    //[Benchmark]\n    public void LongNode()\n    {\n        foreach (var (t, p) in TestData.TypeNames.Take(1))\n        {\n            var items = p.Select(x => new KeyValuePair<string, string>(x, x));\n            var d = new LongNode<string>();\n            foreach (var (key, value) in items) d.Add(key, value);\n            Bench(items, allKeys.Except(p), d);\n        }\n    }\n\n    //[Benchmark]\n    public void Sys()\n    {\n        foreach (var (t, p) in TestData.TypeNames.Take(1))\n        {\n            var items = p.Select(x => new KeyValuePair<string, string>(x, x));\n            var d = new Dictionary<string, string>();\n            foreach (var (key, value) in items) d.Add(key, value);\n            Bench(items, allKeys.Except(p), d);\n        }\n    }\n\n    struct StringComparer : IEqualityComparer<string>\n    {\n        public bool Equals(string x, string y) => x == y;\n        public int GetHashCode(string obj) => obj.GetHashCode();\n    }\n\n    [Benchmark]\n    public void Fixed()\n    {\n        foreach (var (t, p) in TestData.TypeNames.Take(1))\n        {\n            var items = p.Select(x => new KeyValuePair<string, string>(x, x));\n            var d = new FixedDictionary<string, string, StringComparer>(items);\n            Bench(items, allKeys.Except(p), d);\n        }\n    }\n\n    [Benchmark]\n    public void Fixed2()\n    {\n        foreach (var (t, p) in TestData.TypeNames.Take(1))\n        {\n            var items = p.Select(x => new KeyValuePair<string, string>(x, x));\n            var d = new FixedDictionary2<string, string, StringComparer>(items);\n            Bench(items, allKeys.Except(p), d);\n        }\n    }\n\n    private static void Bench<T, TDictionary>(IEnumerable<KeyValuePair<string, T>> items, IEnumerable<string> otherKeys, TDictionary dic)\n        where TDictionary : IDictionary<string, T>\n    {\n        // 読む方が圧倒的に多いという想定\n\n        // 特に、ちゃんとあるはずのキーで読むことが大半\n        for (int i = 0; i < 200; i++)\n        {\n            foreach (var (key, value) in items)\n            {\n                var v = dic[key];\n                if (!EqualityComparer<T>.Default.Equals(value, v)) throw new Exception();\n                if (!dic.TryGetValue(key, out _)) throw new Exception();\n            }\n        }\n\n        // ないはずのキーでの検索(失敗前提)は↑の20分の1にする\n        for (int i = 0; i < 10; i++)\n        {\n            foreach (var key in otherKeys)\n            {\n                if (dic.TryGetValue(key, out _)) throw new Exception();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/DictionaryBenchmark/DictionaryBenchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.9\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview2-25405-01\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Include=\"..\\UtfCompareBenchmark\\StringExtensions.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/DictionaryBenchmark/Extensions.cs",
    "content": "﻿using System.Collections.Generic;\nstatic class Extensions\n{\n    public static void Deconstruct<TKey, TValue>(this KeyValuePair<TKey, TValue> p, out TKey key, out TValue value)\n    {\n        key = p.Key;\n        value = p.Value;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/DictionaryBenchmark/FixedDictionary.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\n\ninternal struct FixedDictionary<TKey, TValue, TComparer> : IDictionary<TKey, TValue>\n    where TComparer : struct, IEqualityComparer<TKey>\n{\n    private KeyValuePair<TKey, TValue>[][] table;\n    private int mask => table.Length - 1;\n\n    public bool IsNull => table == null;\n\n    public FixedDictionary(IEnumerable<KeyValuePair<TKey, TValue>> values)\n    {\n        var initialCapacity = values.Count();\n        var capacity = PowerOf2(initialCapacity);\n\n        table = new KeyValuePair<TKey, TValue>[capacity][];\n        var mask = capacity - 1;\n\n        foreach (var g in values.GroupBy(x => default(TComparer).GetHashCode(x.Key) & mask))\n        {\n            table[g.Key] = g.ToArray();\n        }\n    }\n\n    private static int PowerOf2(int x)\n    {\n        var p = 1;\n        while (p < x) p <<= 1;\n        return p;\n    }\n\n    public TValue Get(TKey key) => TryGet(key, out var value) ? value : throw new KeyNotFoundException(\"Type was not dound, Type: \" + key);\n\n    public bool TryGet(TKey key, out TValue value)\n    {\n        var hashCode = default(TComparer).GetHashCode(key);\n        var buckets = table[hashCode & mask];\n\n        if (buckets != null)\n        {\n            for (int i = 0; i < buckets.Length; i++)\n            {\n                if (default(TComparer).Equals(buckets[i].Key, key))\n                {\n                    value = buckets[i].Value;\n                    return true;\n                }\n            }\n        }\n\n        value = default(TValue);\n        return false;\n    }\n\n    ICollection<TKey> IDictionary<TKey, TValue>.Keys => throw new System.NotImplementedException();\n    ICollection<TValue> IDictionary<TKey, TValue>.Values => throw new System.NotImplementedException();\n    int ICollection<KeyValuePair<TKey, TValue>>.Count => throw new System.NotImplementedException();\n    bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly => true;\n    TValue IDictionary<TKey, TValue>.this[TKey key] { get => Get(key); set => throw new System.NotImplementedException(); }\n    bool IDictionary<TKey, TValue>.ContainsKey(TKey key) => TryGet(key, out _);\n    void IDictionary<TKey, TValue>.Add(TKey key, TValue value) => throw new System.NotImplementedException();\n    bool IDictionary<TKey, TValue>.Remove(TKey key) => throw new System.NotImplementedException();\n    bool IDictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value) => TryGet(key, out value);\n    void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item) => throw new System.NotImplementedException();\n    void ICollection<KeyValuePair<TKey, TValue>>.Clear() => throw new System.NotImplementedException();\n    bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item) => throw new System.NotImplementedException();\n    void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) => throw new System.NotImplementedException();\n    bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item) => throw new System.NotImplementedException();\n    IEnumerator<KeyValuePair<TKey, TValue>> IEnumerable<KeyValuePair<TKey, TValue>>.GetEnumerator() => table.SelectMany(x => x).GetEnumerator();\n    IEnumerator IEnumerable.GetEnumerator() => table.SelectMany(x => x).GetEnumerator();\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/DictionaryBenchmark/FixedDictionary2.cs",
    "content": "﻿using System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\n\n/// <summary>\n/// <see cref=\"FixedDictionary{TKey, TValue, TComparer}\"/>と性能差ほとんどなし。\n/// 向こうは2次元配列\n/// こっちは1次元配列なので、こっちの方がたぶんGCにやさしい。\n/// </summary>\ninternal struct FixedDictionary2<TKey, TValue, TComparer> : IDictionary<TKey, TValue>\n    where TComparer : struct, IEqualityComparer<TKey>\n{\n    private struct Bucket\n    {\n        public bool HasValue;\n        public TKey Key;\n        public TValue Value;\n    }\n\n    private Bucket[] _buckets;\n\n    public bool IsNull => _buckets == null;\n    private const int Skip = 655883; // 適当な大き目の素数(たぶん、奇数なら何でもいいはず)\n\n    public FixedDictionary2(IEnumerable<KeyValuePair<TKey, TValue>> values)\n    {\n        var initialCapacity = values.Count() * 2;\n        var capacity = PowerOf2(initialCapacity);\n\n        _buckets = new Bucket[capacity];\n        var mask = capacity - 1;\n\n        foreach (var x in values)\n        {\n            var hash = default(TComparer).GetHashCode(x.Key) & mask;\n\n            while (true)\n            {\n                ref var b = ref _buckets[hash];\n\n                if (!b.HasValue)\n                {\n                    b.HasValue = true;\n                    b.Key = x.Key;\n                    b.Value = x.Value;\n                    break;\n                }\n\n                hash = (hash + Skip) % mask;\n            }\n        }\n    }\n\n    private static int PowerOf2(int x)\n    {\n        var p = 1;\n        while (p < x) p <<= 1;\n        return p;\n    }\n\n    public TValue Get(TKey key) => TryGet(key, out var value) ? value : throw new KeyNotFoundException(\"Type was not dound, Type: \" + key);\n\n    public bool TryGet(TKey key, out TValue value)\n    {\n        var mask = _buckets.Length - 1;\n        var hash = default(TComparer).GetHashCode(key) & mask;\n\n        while (true)\n        {\n            ref var b = ref _buckets[hash];\n\n            if (!b.HasValue)\n            {\n                value = default;\n                return false;\n            }\n            else if (default(TComparer).Equals(b.Key, key))\n            {\n                value = b.Value;\n                return true;\n            }\n\n            hash = (hash + Skip) % mask;\n        }\n    }\n\n    ICollection<TKey> IDictionary<TKey, TValue>.Keys => throw new System.NotImplementedException();\n    ICollection<TValue> IDictionary<TKey, TValue>.Values => throw new System.NotImplementedException();\n    int ICollection<KeyValuePair<TKey, TValue>>.Count => throw new System.NotImplementedException();\n    bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly => true;\n    TValue IDictionary<TKey, TValue>.this[TKey key] { get => Get(key); set => throw new System.NotImplementedException(); }\n    bool IDictionary<TKey, TValue>.ContainsKey(TKey key) => TryGet(key, out _);\n    void IDictionary<TKey, TValue>.Add(TKey key, TValue value) => throw new System.NotImplementedException();\n    bool IDictionary<TKey, TValue>.Remove(TKey key) => throw new System.NotImplementedException();\n    bool IDictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value) => TryGet(key, out value);\n    void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item) => throw new System.NotImplementedException();\n    void ICollection<KeyValuePair<TKey, TValue>>.Clear() => throw new System.NotImplementedException();\n    bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item) => throw new System.NotImplementedException();\n    void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) => throw new System.NotImplementedException();\n    bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item) => throw new System.NotImplementedException();\n    IEnumerator<KeyValuePair<TKey, TValue>> IEnumerable<KeyValuePair<TKey, TValue>>.GetEnumerator() => _buckets.Where(x => x.HasValue).Select(x => new KeyValuePair<TKey, TValue>(x.Key, x.Value)).GetEnumerator();\n    IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable<KeyValuePair<TKey, TValue>>)this).GetEnumerator();\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/DictionaryBenchmark/LongNode.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Text;\n\n/// <summary>\n/// <see cref=\"CharNode{T}\"/>に対して、\n/// string を UTF16 のまま使うんじゃなくて、UTF8 化した上で、8バイトずつパックして ulong の状態で探索を行うバージョン。\n///\n/// 主たる用途として想定してるのが「プロパティ名と PropertyInfo の辞書」的なものなんだけど、\n/// その想定だと、たいていのプロパティは ASCII 8文字以内(つまり、ulong 1個)に収まってたりして、ツリー探索というかほぼ線形探索。\n/// </summary>\nclass LongNode<T> : IReadOnlyDictionary<string, T>, IDictionary<string, T>\n{\n    struct Opt\n    {\n        public bool HasValue { get; }\n        public T Value { get; }\n\n        public Opt(T value)\n        {\n            HasValue = true;\n            Value = value;\n        }\n    }\n\n    Opt _value;\n    List<(ulong key, LongNode<T> node)> _children;\n\n    #region not implemented or thin wrapper\n    public IEnumerable<string> Keys => throw new NotImplementedException();\n    public IEnumerable<T> Values => throw new NotImplementedException();\n    public int Count => throw new NotImplementedException();\n    ICollection<string> IDictionary<string, T>.Keys => throw new NotImplementedException();\n    ICollection<T> IDictionary<string, T>.Values => throw new NotImplementedException();\n    public IEnumerator<KeyValuePair<string, T>> GetEnumerator() => throw new NotImplementedException();\n    IEnumerator IEnumerable.GetEnumerator() => throw new NotImplementedException();\n    public bool Remove(string key) => throw new NotImplementedException();\n    public void Clear() => throw new NotImplementedException();\n    public bool Contains(KeyValuePair<string, T> item) => throw new NotImplementedException();\n    public void CopyTo(KeyValuePair<string, T>[] array, int arrayIndex) => throw new NotImplementedException();\n    public bool Remove(KeyValuePair<string, T> item) => throw new NotImplementedException();\n    public bool IsReadOnly => true;\n    T IDictionary<string, T>.this[string key] { get => this[key]; set => throw new NotImplementedException(); }\n    public void Add(KeyValuePair<string, T> item) => Add(item.Key, item.Value);\n    #endregion\n\n    public T this[string key] => TryGetValue(key, out var v) ? v : throw new KeyNotFoundException(key);\n\n    public bool TryGetValue(string key, out T value)\n    {\n        var n = Find(key, false);\n        if (n == null || !n._value.HasValue)\n        {\n            value = default;\n            return false;\n        }\n        else\n        {\n            value = n._value.Value;\n            return true;\n        }\n    }\n\n    public bool ContainsKey(string key) => TryGetValue(key, out _);\n\n    public void Add(string key, T value)\n    {\n        var n = Find(key, true);\n        n._value = new Opt(value);\n    }\n\n    // 8の倍数化\n    private static int Align(int x) => ((x + 7) / 8) * 8;\n\n    private LongNode<T> Find(string key, bool add)\n    {\n        unsafe\n        {\n            // ここの変換コストがちょっと気になるけども…\n            // 実用上は、UTF8 で来た文字列を UTF8 のままキーにして Find したいので、その用途であればこのコストはかからない。\n            // string を key にできないのは不便だからお情けで string 版 Find を用意してる感じ。\n            var len = Align(key.Length * 3);\n            byte* buf = stackalloc byte[len];\n            var len2 = StringExtensions.GetBytes(key, new Span<byte>(buf, len));\n            var len3 = Align(len2);\n            for (int i = len2; i < len3; i++) buf[i] = 0;\n\n            return Find(new Span<byte>(buf, len3).NonPortableCast<byte, ulong>(), 0, add);\n        }\n    }\n\n    private LongNode<T> Find(Span<ulong> key, int offset, bool add)\n    {\n        if(key.Length == offset)\n        {\n            return this;\n        }\n\n        if (_children == null) _children = new List<(ulong, LongNode<T>)>();\n\n        var c = key[offset];\n        var i = _children.FindIndex(t => t.key == c);\n        LongNode<T> n;\n        if (i < 0)\n        {\n            if (add)\n            {\n                n = new LongNode<T>();\n                _children.Add((c, n));\n            }\n            else return null;\n        }\n        else\n        {\n            n = _children[i].node;\n        }\n\n        return n.Find(key, offset + 1, add);\n    }\n\n    public override string ToString()\n    {\n        var sb = new StringBuilder();\n        Append(sb, 0);\n        return sb.ToString();\n    }\n\n    private void Append(StringBuilder sb, int offset)\n    {\n        if (_children != null)\n        {\n            foreach (var (key, node) in _children)\n            {\n                for (int i = 0; i < offset; i++) sb.Append(' ');\n                sb.Append(key);\n                sb.AppendLine();\n\n                node.Append(sb, offset + 1);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/DictionaryBenchmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nclass Program\n{\n    static void Main()\n    {\n        //Test();\n\n        //var x = new DictionaryBenchmark();\n        //x.Setup();\n        //x.Fixed();\n        //x.Fixed2();\n\n        BenchmarkRunner.Run<DictionaryBenchmark>();\n    }\n\n    private static void Test()\n    {\n        {\n            var items = new[]\n            {\n                (\"\", 1),\n                (\"abc\", 2),\n                (\"abcd\", 3),\n                (\"abc1\", 4),\n                (\"aaa\", 5),\n                (\"aab\", 6),\n                (\"aaa1\", 7),\n                (\"aaa2\", 8),\n            };\n            var otherKeys = new[] { \"a\", \"abc2\", \"aa\" };\n            Test(items, otherKeys);\n        }\n\n        var allKeys = TestData.TypeNames.SelectMany(x => x.propertyNames).Distinct().ToArray();\n\n        foreach (var (t, p) in TestData.TypeNames)\n        {\n            Console.WriteLine(t);\n            Test(p.Select(x => (x, x)), allKeys.Except(p));\n        }\n    }\n\n    private static void Test<T>(IEnumerable<(string, T)> items, IEnumerable<string> otherKeys)\n    {\n#if Char\n        var n = new CharNode<T>();\n#else\n        var n = new LongNode<T>();\n#endif\n\n        foreach (var (key, value) in items)\n        {\n            n.Add(key, value);\n        }\n\n        foreach (var (key, value) in items)\n        {\n            var v = n[key];\n            if (!EqualityComparer<T>.Default.Equals(value, v)) throw new Exception();\n            if (!n.TryGetValue(key, out _)) throw new Exception();\n        }\n\n        foreach (var key in otherKeys)\n        {\n            if (n.TryGetValue(key, out _)) throw new Exception();\n        }\n\n        Console.WriteLine(n);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/DictionaryBenchmark/TestData.cs",
    "content": "﻿class TestData\n{\n    public static (string className, string[] propertyNames)[] TypeNames = new[]\n{\n    (\"SyncResult\", new string[] {\"server_time\", \"is_cp_available\", \"user\", \"world\", \"city_position\", \"jobs\", \"resources\", \"building_outlines\", \"researches\", \"soldiers\", \"wounded_soldiers\", \"light_mode_wounded_soldiers\", \"valiants\", \"valiant_template_unlock_informations\", \"equipment_suites\", \"consumables\", \"used_vip_consumables\", \"materials\", \"equipments\", \"equipment_capacity\", \"enhancers\", \"treasure_boxes\", \"points\", \"vip_point\", \"main_quest\", \"first_situation_info\", \"ranking_event_outlines\", \"recommended_sku_items\", \"reinforcements\", \"rally_attacks\", \"notifications\", \"badges\", \"chat_groups\", \"chat_contents\", \"announcement_info\", \"blacklist_users\", \"war_events\", \"world_ability\", \"city_walker_read_infos\", \"is_portable_account_registered\", \"payment_info\", \"city_bonus_sneakers\", \"bookmarks\", \"bookmark_capacity\", \"read_valiant_level\", \"acquired_login_bonuses\", \"update_schedule_info\", \"first_valiant_template_id\", \"daily_barrier_info\", \"alliance_mission_results\", \"colosseum_info\", }),\n    (\"ChatAuthorizeResult\", new string[] {\"status\", \"server\", }),\n    (\"ChatLog\", new string[] {\"type\", \"user_id\", \"user_name\", \"data\", \"meta\", \"time\", \"id\", }),\n    (\"ChatRoom\", new string[] {\"name\", \"eventLog\", }),\n    (\"ChatRoomJoinRequestParameter\", new string[] {\"ticket\", \"timestamp\", \"room_id\", \"user_id\", \"limit\", \"type\", }),\n    (\"ChatRoomJoinResult\", new string[] {\"status\", \"room\", }),\n    (\"ReceivedChatMessage\", new string[] {\"room_id\", \"user_id\", \"user_name\", \"data\", \"meta\", \"time\", \"id\", }),\n    (\"AbilityDisplayMaster\", new string[] {\"code\", \"name\", \"value_format\", \"category\", \"format_type\", \"is_hidden\", }),\n    (\"AbilityGradeMaster\", new string[] {\"required_resources\", \"required_consumables\", \"required_seconds\", \"point\", \"abilities\", \"rewards\", }),\n    (\"AbilityGroupDisplayMaster\", new string[] {\"id\", \"name\", }),\n    (\"AbilityIndexedValue\", new string[] {\"index\", \"value\", }),\n    (\"AbilityLearning\", new string[] {\"tree_id\", \"node_id\", \"grade\", }),\n    (\"AbilityMaster\", new string[] {\"trees\", }),\n    (\"AbilityNodeMaster\", new string[] {\"id\", \"name\", \"description\", \"image_id\", \"rarity\", \"layout\", \"required_conditions\", \"required_grade\", \"grades\", }),\n    (\"AbilityTreeMaster\", new string[] {\"id\", \"name\", \"image_id\", \"nodes\", }),\n    (\"Achievement\", new string[] {\"name\", \"point\", \"value\", }),\n    (\"AchievementMemorial\", new string[] {\"name\", \"point\", \"value\", }),\n    (\"AchievementRanking\", new string[] {\"name\", \"point\", \"value\", \"total_rank\", \"weekly_rank\", }),\n    (\"AcquiredLoginBonus\", new string[] {\"master_id\", \"index\", \"date\", }),\n    (\"AllianceAdministration\", new string[] {}),\n    (\"AllianceAdministrationApproveApplicants\", new string[] {\"user_id\", \"accept\", }),\n    (\"AllianceAdministrationAssign\", new string[] {\"user_id\", \"assignment_type\", }),\n    (\"AllianceAdministrationChangeLanguageCode\", new string[] {\"language_code\", }),\n    (\"AllianceAdministrationChangeMemorialTitle\", new string[] {\"memorial_title_id\", }),\n    (\"AllianceAdministrationDissolve\", new string[] {}),\n    (\"AllianceAdministrationEditDescription\", new string[] {\"description\", }),\n    (\"AllianceAdministrationInduce\", new string[] {\"user_id\", \"inducement_message\", }),\n    (\"AllianceAdministrationKickOut\", new string[] {\"user_id\", }),\n    (\"AllianceAdministrationPromoteRank\", new string[] {\"user_id\", \"rank\", }),\n    (\"AllianceAdministrationRecruit\", new string[] {\"requires_approval\", \"recruitment_comment\", \"is_recommended_alliance\", }),\n    (\"AllianceAdministrationRename\", new string[] {\"name\", \"tag\", }),\n    (\"AllianceAdministrationSwitchLeader\", new string[] {\"user_id\", }),\n    (\"AllianceAdministrationUpdateAllianceIcon\", new string[] {\"icon_id\", }),\n    (\"AllianceAuthorityMaster\", new string[] {\"rank\", \"authority\", }),\n    (\"AllianceBoardItem\", new string[] {\"id\", \"subject\", \"body\", \"user\", \"last_updated_date\", \"is_important\", }),\n    (\"AllianceDetail\", new string[] {\"outline\", \"description\", \"leader\", \"is_recommended\", \"applicants_count\", \"world_id\", }),\n    (\"AllianceGift\", new string[] {\"id\", \"master_id\", \"end_date\", \"acquired_date\", \"rewards\", }),\n    (\"AllianceGiftCollection\", new string[] {\"items\", \"opened_items\", }),\n    (\"AllianceGiftMaster\", new string[] {\"id\", \"name\", \"image_id\", \"lottery_reward_display_master_id\", \"point\", }),\n    (\"AllianceHelpInfo\", new string[] {\"count\", \"max_count\", }),\n    (\"AllianceHelpRequest\", new string[] {\"user_outline\", \"job\", }),\n    (\"AllianceLevelMaster\", new string[] {\"required_exp\", \"max_alliance_members\", \"help_reward_image_id\", }),\n    (\"AllianceMaster\", new string[] {\"id\", \"level_masters\", }),\n    (\"AllianceMembership\", new string[] {\"rank\", \"type\", }),\n    (\"AllianceMission\", new string[] {\"master_id\", \"point\", \"end_date\", }),\n    (\"AllianceMissionCompletion\", new string[] {}),\n    (\"AllianceMissionCompletionAllianceHelp\", new string[] {}),\n    (\"AllianceMissionCompletionBuildingGradeUp\", new string[] {\"master_id\", }),\n    (\"AllianceMissionCompletionBuildingPower\", new string[] {}),\n    (\"AllianceMissionCompletionCollection\", new string[] {\"resource_type\", }),\n    (\"AllianceMissionCompletionCraftEquipment\", new string[] {\"master_id\", }),\n    (\"AllianceMissionCompletionCreateSoldier\", new string[] {\"points\", }),\n    (\"AllianceMissionCompletionDefeatFieldBoss\", new string[] {\"grade\", \"is_awakening\", \"field_boss_master_ids\", \"points\", }),\n    (\"AllianceMissionCompletionLootedResource\", new string[] {\"resource_type\", }),\n    (\"AllianceMissionCompletionResearchPower\", new string[] {}),\n    (\"AllianceMissionCompletionUpgradeResearch\", new string[] {\"ability_tree_master_id\", \"ability_node_master_id\", }),\n    (\"AllianceMissionCompletionUseConsumable\", new string[] {\"consumable_master_id\", \"allow_all_variations\", }),\n    (\"AllianceMissionMaster\", new string[] {\"id\", \"title\", \"description\", \"completion_type\", \"required_point\", \"rarity\", \"rewards\", }),\n    (\"AllianceMissionResult\", new string[] {\"id\", \"master_id\", }),\n    (\"AllianceOutline\", new string[] {\"summary\", \"alliance_master_id\", \"name\", \"recruitment_comment\", \"exp\", \"member_count\", \"power\", \"memorial_title\", \"requires_approval\", \"language_code\", }),\n    (\"AllianceSummary\", new string[] {\"id\", \"name\", \"tag\", \"icon_image_id\", }),\n    (\"AnnouncementDetail\", new string[] {\"items\", }),\n    (\"AnnouncementInfo\", new string[] {\"rotation_banner_ids\", \"announcement_ids\", }),\n    (\"AnnouncementOutline\", new string[] {\"id\", \"title\", \"announcement_type\", \"display_date\", \"order\", \"is_important\", \"image_id\", \"description\", }),\n    (\"ApplicationError\", new string[] {\"type\", \"message\", \"message_code\", }),\n    (\"AssetMetaData\", new string[] {}),\n    (\"AssetMetaDataDithering\", new string[] {\"is_enabled\", }),\n    (\"AssetMetaDataPadding\", new string[] {\"padding\", }),\n    (\"AttackCityVoice\", new string[] {\"is_victory\", \"voices\", }),\n    (\"AttackFieldBossVoice\", new string[] {\"effect_type\", \"voices\", }),\n    (\"Badge\", new string[] {\"type\", \"count\", }),\n    (\"BattleAssistedUser\", new string[] {\"user\", \"decimated_soldiers\", \"soldiers\", }),\n    (\"BattleAttendee\", new string[] {\"type\", \"id\", \"start_date\", \"finish_date\", \"user_outline\", \"valiant_info\", \"soldiers\", }),\n    (\"BattleLifeInfo\", new string[] {\"max\", \"previous\", \"current\", }),\n    (\"BattleReport\", new string[] {\"is_offensive\", \"user_outline\", \"city_position\", \"battle_report_soldiers_item\", \"battle_report_valiant_item\", \"lost_power\", }),\n    (\"BattleReportDetail\", new string[] {\"own_detail\", \"opponent_detail\", }),\n    (\"BattleReportDetailItem\", new string[] {\"is_offensive\", \"users\", }),\n    (\"BattleReportSoldierDetail\", new string[] {\"master_id\", \"living\", \"wounded\", \"killed\", }),\n    (\"BattleReportSoldiersItem\", new string[] {\"embedded_soldier\", \"wounded_soldier\", \"killed_soldier\", \"wounded_defense_soldier\", \"killed_defense_soldier\", }),\n    (\"BattleReportStandbySoldierDetail\", new string[] {\"user\", \"soldiers\", }),\n    (\"BattleReportValiantItem\", new string[] {\"valiant\", \"life_info\", \"exp\", }),\n    (\"Bookmark\", new string[] {\"id\", \"name\", \"type\", \"position\", }),\n    (\"BoostCategoryMaster\", new string[] {\"id\", \"name\", \"order\", \"type\", }),\n    (\"BoostMaster\", new string[] {\"parameter_code\", \"name\", \"description\", \"order\", \"alternation_group_id\", \"category_id\", }),\n    (\"BuildingGradeMaster\", new string[] {\"image_id\", \"required_conditions\", \"required_resources\", \"required_consumables\", \"abilities\", \"rewards\", \"required_seconds\", }),\n    (\"BuildingMaster\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterAcademy\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", \"ability\", }),\n    (\"BuildingMasterBarracks\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterFarm\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterHospital\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterLogginCamp\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterMarketplace\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterMilitaryOffice\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterMine\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterPrison\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", \"abilities\", }),\n    (\"BuildingMasterQuarry\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterSanctuary\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterSmithy\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", \"great_success_drama_ids\", \"instance_ability_redraw_drama_ids\", }),\n    (\"BuildingMasterStorehouse\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterStronghold\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", \"familiarity_grade\", \"capturable_grade\", \"sealable_grade\", \"stronghold_grades\", }),\n    (\"BuildingMasterStrongroom\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterVilla\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterWall\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingMasterWatchtower\", new string[] {\"id\", \"description\", \"name\", \"is_inside\", \"max_construction\", \"deletion_seconds\", \"grades\", \"recommended_place_ids\", }),\n    (\"BuildingOutline\", new string[] {\"master_id\", \"place_id\", \"grade\", }),\n    (\"BuyableItemId\", new string[] {}),\n    (\"BuyableItemIdPointShop\", new string[] {\"id\", }),\n    (\"BuyableItemIdSkuGroup\", new string[] {\"id\", }),\n    (\"CapturedValiant\", new string[] {}),\n    (\"CapturedValiantActual\", new string[] {\"user_outline\", \"valiant_info\", }),\n    (\"CapturedValiantDummy\", new string[] {\"level\", }),\n    (\"CapturingAbility\", new string[] {\"code\", \"gain_per_grade\", \"gain_per_valiant_level\", }),\n    (\"CellMaster\", new string[] {\"vertex\", \"type_id\", \"name\", \"can_occupy\", }),\n    (\"ChatContent\", new string[] {\"id\", \"user_outline\", \"user_vip_rank\", \"message\", \"language_code\", \"sent_date\", }),\n    (\"ChatContentFieldBossHelp\", new string[] {\"id\", \"user_outline\", \"user_vip_rank\", \"message\", \"language_code\", \"sent_date\", \"boss\", \"position\", }),\n    (\"ChatContentMessage\", new string[] {\"id\", \"user_outline\", \"user_vip_rank\", \"message\", \"language_code\", \"sent_date\", \"positions\", }),\n    (\"ChatContentReport\", new string[] {\"id\", \"user_outline\", \"user_vip_rank\", \"message\", \"language_code\", \"sent_date\", }),\n    (\"ChatContentSystemMessage\", new string[] {\"id\", \"user_outline\", \"user_vip_rank\", \"message\", \"language_code\", \"sent_date\", \"positions\", }),\n    (\"ChatGroup\", new string[] {\"id\", \"name\", \"type\", \"created_date\", }),\n    (\"ChatId\", new string[] {\"group_id\", \"message_id\", }),\n    (\"CityBonusSneaker\", new string[] {\"id\", \"image_id\", \"name\", \"voices\", \"rarity\", \"rewards\", \"drama_id\", }),\n    (\"CityNode\", new string[] {\"id\", \"next_ids\", \"is_terminal\", \"x\", \"y\", \"order\", }),\n    (\"CityNpcCondition\", new string[] {}),\n    (\"CityNpcConditionNpcMessage\", new string[] {\"required_id\", }),\n    (\"CityNpcConditionStronghold\", new string[] {\"min_grade\", \"max_grade\", }),\n    (\"CityNpcConditionValiantTemplate\", new string[] {\"template_id\", \"positive\", }),\n    (\"CityNpcConditionWorldAbility\", new string[] {\"master_id\", \"positive\", }),\n    (\"CityPlaceMaster\", new string[] {\"id\", \"is_inside\", }),\n    (\"CityWalkerMaster\", new string[] {\"id\", \"image_id\", \"speed\", \"name\", \"voices\", \"rewards\", \"drama_id\", \"conditions\", \"unique_group_id\", \"appearance_building_master_ids\", \"disappearance_building_master_ids\", \"weight\", \"is_enable\", }),\n    (\"CityWalkerReadInfo\", new string[] {\"id\", }),\n    (\"ClientConfig\", new string[] {\"bgm_volume\", \"se_volume\", \"voice_volume\", \"is_voice_playable\", \"resolution\", \"fps\", \"march_line\", \"extent_of_field_view\", \"alliance_chat\", \"alliance_gift_quantity\", \"suppressed_vibration_types\", \"suppressed_dialogs\", \"charge_coin_consumption_warning_threshold\", \"is_recording_mode\", \"is_hint_hidden\", \"is_social_signin\", \"energy_acquisition_item_use_type\", \"is_additional_attack_enabled\", \"is_automatically_tracking_operation\", \"is_play_movie_to_change_hero\", \"notification_position\", }),\n    (\"ClientLoginHistory\", new string[] {\"history\", }),\n    (\"ClientLoginHistoryData\", new string[] {\"home_world_id\", \"portable_account_id\", \"login_token\", }),\n    (\"CollaborationCode\", new string[] {\"id\", \"code\", }),\n    (\"Color\", new string[] {\"a\", \"r\", \"g\", \"b\", }),\n    (\"ColosseumInfo\", new string[] {\"colosseum_state\", \"colosseum_state_for_user\", \"can_cancel_teleport\", \"can_return_from_colosseum\", \"wait_persons\", \"wait_persons_before_me\", \"visiting_limit_date\", }),\n    (\"ConditionAbilityNode\", new string[] {\"tree_id\", \"node_id\", }),\n    (\"ConditionBuilding\", new string[] {\"master_id\", \"grade\", }),\n    (\"Consumable\", new string[] {\"master_id\", \"quantity\", }),\n    (\"ConsumableMaster\", new string[] {\"id\", \"code\", \"info\", \"group_id\", \"rarity\", \"display_grade\", \"can_use_multiple\", \"is_vip_only\", }),\n    (\"ConsumableValueMaster\", new string[] {\"variation_id\", }),\n    (\"ConsumableValueMasterAcquisition\", new string[] {\"variation_id\", \"quantity\", }),\n    (\"ConsumableValueMasterBoost\", new string[] {\"variation_id\", \"effect_seconds\", \"percentage\", }),\n    (\"ConsumableValueMasterCapacityExtension\", new string[] {\"variation_id\", \"quantity\", }),\n    (\"ConsumableValueMasterCaptureDummyValiant\", new string[] {\"variation_id\", \"effect_seconds\", \"level\", }),\n    (\"ConsumableValueMasterMarchShortening\", new string[] {\"variation_id\", \"shortening_ratio\", }),\n    (\"ConsumableValueMasterShortening\", new string[] {\"variation_id\", \"shortening_seconds\", }),\n    (\"ConsumableValueMasterSummonFieldBoss\", new string[] {\"variation_id\", \"summonable_area\", \"summon_field_boss_lottery_table_master_id\", \"summon_bonuses\", }),\n    (\"CrystalCastle\", new string[] {}),\n    (\"CrystalCastleActual\", new string[] {\"id\", \"image_id\", \"status_type\", \"domination_alliance\", \"domination_alliance_leader\", \"protection_job\", \"dominating_finish_date\", \"next_war_event_domination_start_date\", }),\n    (\"CrystalCastleMaster\", new string[] {\"id\", \"name\", \"reinforcement_slot\", \"reinforcement_capacity\", \"scout_cost\", \"rally_attack_cost\", }),\n    (\"CrystalCastlePart\", new string[] {\"actual_position\", }),\n    (\"DailyBarrierInfo\", new string[] {\"is_enabled\", \"start_time\", }),\n    (\"DailyReward\", new string[] {\"reward\", \"vip_point\", \"character_image_id\", \"character_name\", \"today_messages\", \"tomorrow_messages\", }),\n    (\"DocumentItem\", new string[] {}),\n    (\"DocumentItemBanner\", new string[] {\"image_id\", }),\n    (\"DocumentItemCollaborationCounter\", new string[] {\"collaboration_master_id\", \"title\", \"count\", }),\n    (\"DocumentItemHeader\", new string[] {\"size\", \"text\", }),\n    (\"DocumentItemHelpButton\", new string[] {\"help_id\", \"label\", }),\n    (\"DocumentItemOpenCollaborationUrlButton\", new string[] {\"collaboration_master_id\", \"url\", \"label\", \"noncompletion_label\", \"noncompletion_message\", }),\n    (\"DocumentItemOpenInvitationUrlButton\", new string[] {\"label\", }),\n    (\"DocumentItemOpenUrlAndIncrementCollaborationCounterButton\", new string[] {\"collaboration_master_id\", \"items\", \"label\", }),\n    (\"DocumentItemOpenUrlButton\", new string[] {\"url\", \"label\", }),\n    (\"DocumentItemPageButton\", new string[] {\"page_group_name\", \"label\", }),\n    (\"DocumentItemShowRecommendSkuGroupDialog\", new string[] {\"label\", \"sku_group_master_id\", }),\n    (\"DocumentItemShowValiantSkuGroups\", new string[] {\"label\", }),\n    (\"DocumentItemText\", new string[] {\"text\", }),\n    (\"Drama\", new string[] {\"title\", \"label\", \"triggers\", \"librettos\", \"next_label\", \"is_last\", }),\n    (\"DramaAction\", new string[] {\"duration\", }),\n    (\"DramaActionBackground\", new string[] {\"duration\", \"image_id\", \"color\", \"filter\", }),\n    (\"DramaActionChangeAnimation\", new string[] {\"duration\", \"animation_id\", \"trigger\", }),\n    (\"DramaActionCloseShutter\", new string[] {\"duration\", \"shutter_type\", \"color\", }),\n    (\"DramaActionEffect\", new string[] {\"duration\", \"await_tap\", \"drama_effect_type\", \"color\", \"value\", }),\n    (\"DramaActionEffectActor\", new string[] {\"duration\", \"alignment\", \"actor_effect_type\", \"value\", \"facial_type\", \"emotion_type\", }),\n    (\"DramaActionEffectWindow\", new string[] {\"duration\", \"drama_effect_type\", \"color\", \"value\", }),\n    (\"DramaActionHideActor\", new string[] {\"duration\", \"alignment\", \"appearance_type\", }),\n    (\"DramaActionHideAnimation\", new string[] {\"duration\", \"animation_id\", }),\n    (\"DramaActionHideArrow\", new string[] {\"duration\", \"focus\", }),\n    (\"DramaActionHideBanner\", new string[] {\"duration\", \"banner_name\", }),\n    (\"DramaActionHideWindow\", new string[] {\"duration\", }),\n    (\"DramaActionOpenShutter\", new string[] {\"duration\", \"shutter_type\", \"color\", }),\n    (\"DramaActionOpenUrl\", new string[] {\"duration\", \"ios_url\", \"android_url\", }),\n    (\"DramaActionPlayBgm\", new string[] {\"duration\", \"wait_seconds\", \"bgm_name\", \"loop_count\", \"volume\", }),\n    (\"DramaActionPlayMovie\", new string[] {\"duration\", \"movie_name\", \"is_horizontal\", }),\n    (\"DramaActionPlaySe\", new string[] {\"duration\", \"wait_seconds\", \"se_name\", \"loop_count\", \"volume\", }),\n    (\"DramaActionReviewApplication\", new string[] {\"duration\", }),\n    (\"DramaActionSelection\", new string[] {\"duration\", \"selection_items\", }),\n    (\"DramaActionShowActor\", new string[] {\"duration\", \"alignment\", \"image_id\", \"flip\", \"appearance_type\", \"facial_type\", \"emotion_type\", }),\n    (\"DramaActionShowAnimation\", new string[] {\"duration\", \"animation_id\", \"layer\", \"position\", \"scale\", \"trigger\", }),\n    (\"DramaActionShowArrow\", new string[] {\"duration\", \"await_tap\", \"focus\", \"direction\", \"mask\", }),\n    (\"DramaActionShowBanner\", new string[] {\"duration\", \"banner_name\", \"layer\", \"position\", \"scale\", }),\n    (\"DramaActionShowShopItemDialog\", new string[] {\"duration\", \"sku_group_master_id\", }),\n    (\"DramaActionShowSkipButton\", new string[] {\"duration\", }),\n    (\"DramaActionSlideshow\", new string[] {\"duration\", \"title\", \"image_names\", }),\n    (\"DramaActionStopSe\", new string[] {\"duration\", \"se_name\", }),\n    (\"DramaActionTelop\", new string[] {\"duration\", \"image_id\", }),\n    (\"DramaFocus\", new string[] {\"offset\", }),\n    (\"DramaFocusBuilding\", new string[] {\"offset\", \"master_id\", \"is_create\", }),\n    (\"DramaFocusFieldBoss\", new string[] {\"offset\", \"level\", }),\n    (\"DramaFocusFieldPosition\", new string[] {\"offset\", \"position\", }),\n    (\"DramaFocusFieldResource\", new string[] {\"offset\", \"resource\", }),\n    (\"DramaFocusItem\", new string[] {\"offset\", \"id\", }),\n    (\"DramaFocusUI\", new string[] {\"offset\", \"u_i_name\", }),\n    (\"DramaLibretto\", new string[] {\"memo\", \"label\", \"actions\", \"talk_actor\", \"must_play\", }),\n    (\"DramaMask\", new string[] {\"offset\", \"hook_event\", }),\n    (\"DramaMaster\", new string[] {\"id\", \"title\", \"dramas\", }),\n    (\"DramaMessage\", new string[] {\"voice_name\", \"font_size\", \"wait_seconds\", \"message\", \"facial_type\", \"emotion_type\", }),\n    (\"DramaSelectionItem\", new string[] {\"name\", \"destination_label\", }),\n    (\"DramaTalk\", new string[] {\"alignment\", \"other_alignments\", \"name\", \"messages\", }),\n    (\"DramaTrigger\", new string[] {\"conditions\", }),\n    (\"DramaTriggerCondition\", new string[] {\"exists\", }),\n    (\"DramaTriggerConditionBadge\", new string[] {\"exists\", \"badge_type\", }),\n    (\"DramaTriggerConditionBuilding\", new string[] {\"exists\", \"master_id\", \"min_grade\", \"max_grade\", \"value\", }),\n    (\"DramaTriggerConditionEmptyMarchCount\", new string[] {\"exists\", \"empty_march_count\", }),\n    (\"DramaTriggerConditionEquipmentDelivered\", new string[] {\"exists\", }),\n    (\"DramaTriggerConditionHeroStatusType\", new string[] {\"exists\", \"status_type\", \"battle_increments_ratio\", \"boss_increments_ratio\", }),\n    (\"DramaTriggerConditionJob\", new string[] {\"exists\", \"job_type\", \"march_type\", \"value\", \"can_request_alliance_help\", }),\n    (\"DramaTriggerConditionLanguageCode\", new string[] {\"exists\", \"language_codes\", }),\n    (\"DramaTriggerConditionPeriod\", new string[] {\"exists\", \"start_date\", \"end_date\", }),\n    (\"DramaTriggerConditionQuestCompleted\", new string[] {\"exists\", }),\n    (\"DramaTriggerConditionRankingEvent\", new string[] {\"exists\", \"slot_id\", \"event_id\", }),\n    (\"DramaTriggerConditionRecommendedSkuGroupID\", new string[] {\"exists\", \"sku_group_i_d\", }),\n    (\"DramaTriggerConditionSoldierCount\", new string[] {\"exists\", \"soldier_count\", }),\n    (\"DramaTriggerConditionTreasureBox\", new string[] {\"exists\", \"master_id\", \"treasure_box_count\", }),\n    (\"DramaTriggerConditionValiantTemplate\", new string[] {\"exists\", \"template_id\", \"is_first_valiant\", }),\n    (\"DramaTriggerConditionWoundedSoldierCount\", new string[] {\"exists\", \"wounded_soldier_count\", }),\n    (\"DramaTriggerDialogOpened\", new string[] {\"conditions\", \"dialog_name\", \"value\", \"is_sufficiency_resource\", }),\n    (\"DramaTriggerInScene\", new string[] {\"conditions\", \"scene_name\", }),\n    (\"DramaTriggerInstantly\", new string[] {\"conditions\", }),\n    (\"DramaTriggerJobFinished\", new string[] {\"conditions\", \"job_type\", \"march_type\", \"value\", }),\n    (\"DramaTriggerJobStarted\", new string[] {\"conditions\", \"job_type\", \"march_type\", \"value\", }),\n    (\"DramaTriggerOnTapHelp\", new string[] {\"conditions\", }),\n    (\"EffectiveTitleMaster\", new string[] {\"id\", \"name\", \"image_id\", \"description\", \"is_king\", \"abilities\", \"is_positive\", }),\n    (\"Enhancer\", new string[] {\"master_id\", \"grade\", \"quantity\", }),\n    (\"EnhancerGradeMaster\", new string[] {\"grade\", \"abilities\", \"required_items\", \"next_master_id\", \"next_grade\", }),\n    (\"EnhancerMaster\", new string[] {\"id\", \"info\", \"rarity\", \"grades\", \"craft_drama_master_id\", }),\n    (\"EnhancerSlot\", new string[] {\"id\", }),\n    (\"Equipment\", new string[] {\"id\", \"master_id\", \"grade\", \"enhancer_slots\", \"instance_ability\", }),\n    (\"EquipmentAvailability\", new string[] {\"part\", \"quantity\", }),\n    (\"EquipmentGradeMaster\", new string[] {\"grade\", \"abilities\", \"craft_rewards\", \"enhancer_lottery_table_master_id\", \"craft_drama_master_id\", \"selling_prices\", }),\n    (\"EquipmentInstanceAbility\", new string[] {\"ability\", \"rank\", }),\n    (\"EquipmentMaster\", new string[] {\"id\", \"info\", \"grade_masters\", \"ability_group_id\", \"great_success_grade_probability_master_id\", \"enhancer_lottery_grade_probability_master_id\", \"instance_ability_lottery_grade_probability_master_id\", \"instance_ability_redraw_recipe_master_id\", \"required_level\", \"rarity\", \"part\", \"enhancer_slot\", \"rank\", \"order\", }),\n    (\"EquipmentRecipeMaster\", new string[] {\"id\", \"required_equipment_master_id\", \"required_equipment_grade\", \"required_materials\", \"cost\", \"required_seconds\", \"equipment_master_id\", \"grade\", }),\n    (\"EquipmentSeriesMaster\", new string[] {\"id\", \"name\", \"description\", \"image_id\", \"order\", \"equipment_master_ids\", }),\n    (\"EquipmentSlot\", new string[] {\"part\", \"equipment_id\", }),\n    (\"EquipmentSuite\", new string[] {\"id\", \"equipments\", }),\n    (\"ErrorContainer\", new string[] {\"application_error\", }),\n    (\"FieldBoss\", new string[] {\"id\", \"master_id\", \"type\", \"life\", \"actual_position\", }),\n    (\"FieldBossAchievement\", new string[] {\"master_id\", \"victory_bonus_count\", \"attack_count\", }),\n    (\"FieldBossComboBonus\", new string[] {\"bonus\", \"attacker_count\", }),\n    (\"FieldBossHelp\", new string[] {\"field_detail\", \"combo_bonus\", \"user_outline\", }),\n    (\"FieldBossMaster\", new string[] {\"object_id\", \"name\", \"image_id\", \"description\", \"level\", \"max_life\", \"required_energy\", \"boss_type\", \"weapon_type\", \"is_unique_boss\", \"is_awakening\", \"lottery_reward_display_master_id\", \"alliance_gift_master_ids\", }),\n    (\"FieldBossSummonInfo\", new string[] {\"created_date\", \"member_count\", \"max_summon_bonus_member_count\", }),\n    (\"FieldBossTimeAttackInfo\", new string[] {\"ordinal\", \"total_count\", }),\n    (\"FieldDestinationInfo\", new string[] {}),\n    (\"FieldDestinationInfoCrystalCastle\", new string[] {\"name\", \"alliance_tag\", }),\n    (\"FieldDestinationInfoFieldBoss\", new string[] {\"master_id\", }),\n    (\"FieldDestinationInfoResourceArea\", new string[] {\"master_id\", }),\n    (\"FieldDestinationInfoUser\", new string[] {\"alliance_tag\", \"name\", }),\n    (\"FieldDetail\", new string[] {\"position\", }),\n    (\"FieldDetailCrystalCastle\", new string[] {\"position\", \"crystal_castle\", }),\n    (\"FieldDetailEmpire\", new string[] {\"position\", \"image_id\", \"grade\", \"visible_jobs\", \"owner\", \"power\", \"has_captured_hero\", \"is_absent\", \"is_barriered\", \"is_victory\", }),\n    (\"FieldDetailFieldBoss\", new string[] {\"position\", \"field_boss\", \"ending_date\", \"summoner_info\", \"time_attack_info\", }),\n    (\"FieldDetailFieldBossTimeAttackInfo\", new string[] {\"alliance\", \"begin_time\", }),\n    (\"FieldDetailObstacle\", new string[] {\"position\", \"image_id\", }),\n    (\"FieldDetailResource\", new string[] {\"position\", \"master_id\", \"resource\", \"job\", }),\n    (\"FieldResourceMaster\", new string[] {\"object_id\", \"name\", \"image_id\", \"description\", \"level\", \"resource_type\", \"is_boss_resource\", \"lottery_reward_display_master_id\", }),\n    (\"FirstSituationInfo\", new string[] {\"display_ids\", }),\n    (\"FirstSituationMaster\", new string[] {\"id\", \"title\", \"required_quest_id\", \"order\", \"trigger\", \"drama_id\", \"rewards\", }),\n    (\"FriendshipVoiceLevelRangeMaster\", new string[] {\"level\", \"voices\", }),\n    (\"GalleryGradeSummaryCount\", new string[] {\"counts\", }),\n    (\"GalleryItem\", new string[] {\"master_id\", }),\n    (\"GalleryItemEnhancer\", new string[] {\"master_id\", \"acquired_grades\", }),\n    (\"GalleryItemEquipment\", new string[] {\"master_id\", \"acquired_grades\", }),\n    (\"GalleryItemFieldBoss\", new string[] {\"master_id\", \"achievements\", }),\n    (\"GalleryMaster\", new string[] {\"id\", \"number\", \"hint\", }),\n    (\"GalleryMasterEnhancer\", new string[] {\"id\", \"number\", \"hint\", \"master_id\", }),\n    (\"GalleryMasterEquipment\", new string[] {\"id\", \"number\", \"hint\", \"master_id\", }),\n    (\"GalleryMasterFieldBoss\", new string[] {\"id\", \"number\", \"hint\", \"master_ids\", \"is_victory_bonus_count_hidden\", }),\n    (\"GameConfig\", new string[] {\"LoginServerUrl\", \"StoreUrl\", \"ReviewUrl\", \"OfficialUrl\", \"TermsOfServiceUrl\", \"TradeUrl\", \"SettlementUrl\", \"PrivacyPolicyUrl\", \"TwitterUrl\", \"Gu3NativeBaseUrl\", \"Gu3AppName\", \"DmmChargeUrl\", \"SupportEmail\", \"ResourceTarget\", \"AssetVersion\", \"ClientVersion\", \"BuildNumber\", \"UnderDevelopment\", \"ChatEngineApplicationId\", }),\n    (\"GetMastersOption\", new string[] {\"version\", \"language_code\", }),\n    (\"GetQuestMastersResponse\", new string[] {\"masters\", }),\n    (\"GetSkuLineupOption\", new string[] {\"sku_group_ids\", \"ignore_sales_period\", }),\n    (\"GlobalPosition\", new string[] {\"world_id\", \"position\", }),\n    (\"HelpGroupMaster\", new string[] {\"id\", \"title\", \"items\", }),\n    (\"HelpGroupMasterItem\", new string[] {\"title\", \"master_ids\", }),\n    (\"HelpMaster\", new string[] {\"id\", \"key\", \"title\", \"items\", }),\n    (\"HintMaster\", new string[] {\"order\", \"probability\", \"drama_ids\", }),\n    (\"Icon\", new string[] {\"id\", \"image_id\", \"name\", \"is_new\", }),\n    (\"IndexedValue\", new string[] {\"index\", \"value\", }),\n    (\"InstanceAbilityCandidate\", new string[] {\"id\", \"ability\", }),\n    (\"InstanceAbilityRedrawRecipeMaster\", new string[] {\"id\", \"name\", \"required_materials\", \"cost\", }),\n    (\"InventoryCapacity\", new string[] {\"value\", \"max\", }),\n    (\"InvitationInfo\", new string[] {\"url\", \"invitation_code\", \"activated_invitation_count\", }),\n    (\"InvitationSettings\", new string[] {\"can_invite\", \"stronghold_grade\", }),\n    (\"ItemInfo\", new string[] {\"image_id\", \"name\", \"description\", \"selling_info\", \"alliance_level\", }),\n    (\"ItemUseOption\", new string[] {\"item_master_id\", }),\n    (\"ItemUseOptionJob\", new string[] {\"item_master_id\", \"job_id\", \"job_discriminator\", }),\n    (\"ItemUseOptionNone\", new string[] {\"item_master_id\", }),\n    (\"ItemUseOptionPosition\", new string[] {\"item_master_id\", \"world_id\", \"position\", }),\n    (\"ItemUseOptionRemoveEnhancer\", new string[] {\"item_master_id\", \"equipment_id\", \"enhancer_id\", }),\n    (\"ItemUseOptionUserRename\", new string[] {\"item_master_id\", \"name\", }),\n    (\"ItemUseOptionValiant\", new string[] {\"item_master_id\", \"valiant_id\", }),\n    (\"ItemUseOptionValiantMetamorphose\", new string[] {\"item_master_id\", \"valiant_id\", \"template_id\", }),\n    (\"ItemUseVoice\", new string[] {\"consumable_master_id\", \"voices\", }),\n    (\"Job\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", }),\n    (\"JobBoost\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"consumable_master_id\", }),\n    (\"JobBuilding\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"place_id\", \"is_deleting\", \"building_master_id\", \"grade\", }),\n    (\"JobCaptured\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"captor_city_position\", \"captor_outline\", \"can_seal\", }),\n    (\"JobCapturing\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"city_position\", \"valiant\", \"can_seal\", }),\n    (\"JobCollection\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"user_outline\", \"position\", \"start_resource\", \"quantity\", \"valiant_info\", \"soldiers\", }),\n    (\"JobCreateEquipment\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"equipment_recipe_master_id\", }),\n    (\"JobCrystalCastleProtection\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", }),\n    (\"JobHealing\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"soldiers\", \"is_light_mode\", }),\n    (\"JobMarch\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"origin\", \"destination\", \"user_outline\", \"valiant_info\", \"soldiers\", \"animation_id\", \"march_type\", \"resources\", \"original_job\", \"destination_info\", \"arrival_result\", \"total_soldiers\", \"rally_attack_id\", \"with_additional\", }),\n    (\"JobMarchSummary\", new string[] {\"original_id\", \"user_id\", \"start_date\", \"finish_date\", \"origin\", \"destination\", \"march_type\", \"destination_info\", }),\n    (\"JobPostwar\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"is_victory\", }),\n    (\"JobRallyPreparation\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"rally_attack_id\", \"user_outline\", \"valiant_info\", \"soldiers\", }),\n    (\"JobResearch\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"tree_id\", \"node_id\", \"grade\", }),\n    (\"JobSoldierCreation\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"soldier\", }),\n    (\"JobUpgradeEquipment\", new string[] {\"id\", \"start_date\", \"finish_date\", \"original_finish_date\", \"cancel_type\", \"can_help_request\", \"help_info\", \"equipment_id\", \"equipment_recipe_master_id\", }),\n    (\"LanguageMaster\", new string[] {\"language_code\", \"name\", }),\n    (\"LifeDamage\", new string[] {\"effect_type\", \"value\", }),\n    (\"LoadingTipsMaster\", new string[] {\"id\", \"name\", \"description\", \"duration\", }),\n    (\"LoadingTipsMasterDramaActor\", new string[] {\"id\", \"name\", \"description\", \"duration\", \"image_id\", \"voice_name\", }),\n    (\"LoadingTipsMasterImage\", new string[] {\"id\", \"name\", \"description\", \"duration\", \"image_id\", }),\n    (\"LoginBonusFixedRewards\", new string[] {\"rewards\", \"character_image_id\", \"character_name\", \"messages\", }),\n    (\"LoginBonusMaster\", new string[] {\"id\", \"is_enable\", \"order\", \"name\", \"image_id\", }),\n    (\"LoginBonusMasterCollaboration\", new string[] {\"id\", \"is_enable\", \"order\", \"name\", \"image_id\", \"fixed_rewards\", }),\n    (\"LoginBonusMasterFirstTimeDaily\", new string[] {\"id\", \"is_enable\", \"order\", \"name\", \"image_id\", \"daily_rewards\", }),\n    (\"LoginBonusMasterLimited\", new string[] {\"id\", \"is_enable\", \"order\", \"name\", \"image_id\", \"banner_id\", \"period\", \"rewards\", \"character_image_id\", \"character_name\", \"messages\", }),\n    (\"LoginBonusMasterNormalDaily\", new string[] {\"id\", \"is_enable\", \"order\", \"name\", \"image_id\", \"daily_rewards\", }),\n    (\"LoginBonusMasterOnlyOnceAfterLastAccess\", new string[] {\"id\", \"is_enable\", \"order\", \"name\", \"image_id\", \"seconds_after_last_access\", \"rewards\", \"character_image_id\", \"character_name\", \"messages\", \"push_notification_title\", }),\n    (\"LoginBonusMasterOnlyOnceLimited\", new string[] {\"id\", \"is_enable\", \"order\", \"name\", \"image_id\", \"banner_id\", \"period\", \"rewards\", \"character_image_id\", \"character_name\", \"messages\", }),\n    (\"LotteryRewardDisplayMaster\", new string[] {\"id\", \"name\", \"rewards\", }),\n    (\"MainQuest\", new string[] {\"quest\", \"completion_condition\", \"main_quest_master\", }),\n    (\"MainQuestMaster\", new string[] {\"drama_id\", \"tutorial_type\", \"has_completed_drama\", }),\n    (\"MarchArrivalResult\", new string[] {}),\n    (\"MarchArrivalResultAttackCity\", new string[] {\"is_victory\", }),\n    (\"MarchArrivalResultAttackFieldBoss\", new string[] {\"field_boss_master_id\", \"life_damages\", }),\n    (\"MarchArrivalResultAttackFieldBossDummy\", new string[] {}),\n    (\"MasterVersion\", new string[] {\"small\", \"building\", \"city_place\", \"consumable\", \"equipment\", \"equipment_recipe\", \"equipment_series\", \"enhancer\", \"material\", \"treasure_box\", \"soldier\", \"valiant\", \"first_situation\", \"terrain\", \"world_ability\", \"city_walker\", \"help\", \"help_group\", \"login_bonus\", \"alliance_gift\", \"field_boss\", \"field_resource\", \"lottery_reward_display\", \"drama\", \"effective_title\", \"hint\", \"instance_ability_redraw_recipe\", \"alliance_mission\", \"universal_alliance\", \"alliance\", \"valiant_template_grade_ability\", \"vip_rank\", \"gallery\", \"crystal_castle\", }),\n    (\"Material\", new string[] {\"master_id\", \"quantity\", }),\n    (\"MaterialMaster\", new string[] {\"id\", \"order\", \"info\", \"rarity\", \"category\", \"display_grade\", }),\n    (\"MaterialRecipeMaster\", new string[] {\"id\", \"required_items\", \"next_master_id\", }),\n    (\"MemorialTitleDetail\", new string[] {\"outline\", \"description\", \"is_new\", }),\n    (\"MemorialTitleOutline\", new string[] {\"id\", \"image_id\", \"display_grade\", \"is_alliance\", \"name\", \"game_center_achivement_id\", \"google_play_games_achivement_id\", }),\n    (\"Notification\", new string[] {\"id\", \"title\", \"description\", \"notification_sound_type\", }),\n    (\"NotificationAlert\", new string[] {\"id\", \"title\", \"description\", \"notification_sound_type\", \"image_id\", }),\n    (\"NotificationAllianceGift\", new string[] {\"id\", \"title\", \"description\", \"notification_sound_type\", \"alliance_gift_master_id\", }),\n    (\"NotificationEmphasis\", new string[] {\"id\", \"title\", \"description\", \"notification_sound_type\", \"image_id\", }),\n    (\"NotificationImportantWorldNews\", new string[] {\"id\", \"title\", \"description\", \"notification_sound_type\", \"image_id\", }),\n    (\"NotificationInformation\", new string[] {\"id\", \"title\", \"description\", \"notification_sound_type\", \"image_id\", }),\n    (\"NotificationMemorialTitle\", new string[] {\"id\", \"title\", \"description\", \"notification_sound_type\", \"memorial_title\", }),\n    (\"NotificationWorldNews\", new string[] {\"id\", \"title\", \"description\", \"notification_sound_type\", }),\n    (\"ParameterIndexedValue\", new string[] {\"index\", \"value\", }),\n    (\"PaymentInfo\", new string[] {\"is_birth_date_unregistered\", \"remaining_value\", }),\n    (\"Period\", new string[] {\"start\", \"end\", }),\n    (\"PlatformUrlItem\", new string[] {\"client_platform\", \"url\", }),\n    (\"PlayerConfig\", new string[] {\"vip_rank_display_mode\", }),\n    (\"PointAcquisitionCondition\", new string[] {\"description\", \"point\", }),\n    (\"PointShopItem\", new string[] {\"master_id\", \"info\", \"quantity\", }),\n    (\"PointShopItemInfo\", new string[] {\"order\", \"description\", \"reward\", \"max_quantity\", \"prices\", \"is_reset_purchase_count\", \"category\", \"period\", \"can_buy_multiple\", }),\n    (\"PortableAccount\", new string[] {\"account_id\", \"password\", }),\n    (\"Position\", new string[] {\"x\", \"y\", }),\n    (\"PositionRange\", new string[] {\"min_x\", \"min_y\", \"max_x\", \"max_y\", }),\n    (\"Purchase\", new string[] {\"game_sku_id\", \"sku_group_id\", \"platform_sku_id\", \"order_id\", \"user_id\", \"language_locale\", \"currency\", \"price\", }),\n    (\"PurchaseAndroid\", new string[] {\"game_sku_id\", \"sku_group_id\", \"platform_sku_id\", \"order_id\", \"user_id\", \"language_locale\", \"currency\", \"price\", \"signature\", \"data\", }),\n    (\"PurchaseIos\", new string[] {\"game_sku_id\", \"sku_group_id\", \"platform_sku_id\", \"order_id\", \"user_id\", \"language_locale\", \"currency\", \"price\", \"deprecated_receipt\", \"receipt\", }),\n    (\"PushNotificationSetting\", new string[] {\"type\", \"enable_mode\", }),\n    (\"Quest\", new string[] {\"id\", \"quest_type\", \"name\", \"outline\", \"description\", \"is_completed\", \"rewards\", }),\n    (\"QuestCompletion\", new string[] {}),\n    (\"QuestCompletionAssortGalleryItem\", new string[] {\"gallery_master_id\", \"grade\", }),\n    (\"QuestCompletionAssortMultipleGalleryItem\", new string[] {\"gallery_master_type\", \"grade\", \"count\", }),\n    (\"QuestCompletionAttackEmpire\", new string[] {\"unique_user_count\", }),\n    (\"QuestCompletionAttackFieldBoss\", new string[] {\"grade\", }),\n    (\"QuestCompletionAttackMultipleFieldBoss\", new string[] {\"master_id\", \"count\", }),\n    (\"QuestCompletionBuildingGradeUp\", new string[] {\"building_master_id\", \"count\", \"grade\", }),\n    (\"QuestCompletionCollection\", new string[] {\"resource_type\", \"resource_value\", }),\n    (\"QuestCompletionCraftEquipment\", new string[] {\"equipment_master_id\", \"min_grade\", }),\n    (\"QuestCompletionCreateSoldier\", new string[] {\"soldier\", }),\n    (\"QuestCompletionEnhancer\", new string[] {}),\n    (\"QuestCompletionEquipment\", new string[] {}),\n    (\"QuestCompletionFieldBossKillsAchievement\", new string[] {\"field_boss_kills_achievement_point\", }),\n    (\"QuestCompletionJoinAlliance\", new string[] {\"stronghold_grade\", }),\n    (\"QuestCompletionPower\", new string[] {\"power\", }),\n    (\"QuestCompletionReadFirstSituation\", new string[] {\"first_situation_master_id\", }),\n    (\"QuestCompletionReadValiantFriendshipPointStory\", new string[] {\"episode_id\", \"story_type\", }),\n    (\"QuestCompletionRegisterPortableAccount\", new string[] {}),\n    (\"QuestCompletionScout\", new string[] {\"unique_user_count\", }),\n    (\"QuestCompletionSoldierKillsAchievementByAttack\", new string[] {\"soldier_kills_achievement_by_attack_point\", }),\n    (\"QuestCompletionSoldierKillsAchievementByDefense\", new string[] {\"soldier_kills_achievement_by_defense_point\", }),\n    (\"QuestCompletionUpgradeHero\", new string[] {\"level\", }),\n    (\"QuestCompletionUpgradeResearch\", new string[] {\"ability_tree_master_id\", \"ability_node_master_id\", \"grade\", }),\n    (\"QuestCompletionUpgradeValiantSkill\", new string[] {\"ability_tree_master_id\", \"ability_node_master_id\", \"grade\", }),\n    (\"QuestCompletionUseConsumable\", new string[] {\"consumable_master_id\", \"allow_all_variations\", }),\n    (\"QuestCompletionVictoryMultipleFieldBoss\", new string[] {\"master_id\", \"count\", }),\n    (\"QuestMaster\", new string[] {\"id\", \"required_quest_id\", \"quest_type\", \"name\", \"outline\", \"description\", \"order\", \"main_quest\", \"rewards\", \"completion_condition\", }),\n    (\"RallyAttackInfo\", new string[] {\"id\", \"promoter\", \"destination\", \"promotion_date\", \"start_date\", \"finish_date\", \"soldier_capacity\", }),\n    (\"RallyPreparationDurationMaster\", new string[] {\"id\", \"duration_seconds\", }),\n    (\"Ranking\", new string[] {\"rank\", \"point\", }),\n    (\"RankingAlliance\", new string[] {\"rank\", \"point\", \"outline\", }),\n    (\"RankingDetail\", new string[] {\"name\", \"period\", \"my_ranking\", \"rankings\", }),\n    (\"RankingEventAllianceRank\", new string[] {\"rank\", \"alliance_id\", }),\n    (\"RankingEventDetail\", new string[] {\"outline\", \"difficulty\", \"conditions\", \"solo_event\", \"alliance_event\", }),\n    (\"RankingEventInfo\", new string[] {\"point_rewards\", \"ranking_rewards\", \"top_ranks\", \"my_rank\", }),\n    (\"RankingEventOutline\", new string[] {\"id\", \"slot_id\", \"event_id\", \"category\", \"image_id\", \"name\", \"league_name\", \"description\", \"start_date\", \"end_date\", \"record\", \"my_rank\", \"required_points\", \"progress\", }),\n    (\"RankingEventPointReward\", new string[] {\"required_point\", \"rewards\", }),\n    (\"RankingEventProgress\", new string[] {\"ranking_reward\", \"point_rewards\", }),\n    (\"RankingEventRank\", new string[] {\"rank\", \"record\", \"user\", }),\n    (\"RankingEventRankingAbilityReward\", new string[] {\"top\", \"bottom\", \"abilities\", }),\n    (\"RankingEventRankingReward\", new string[] {\"top\", \"bottom\", \"rewards\", }),\n    (\"RankingEventRankRecord\", new string[] {}),\n    (\"RankingEventRankRecordPoint\", new string[] {\"point\", }),\n    (\"RankingEventRankRecordTimeAttack\", new string[] {\"time_record\", \"victory_count\", }),\n    (\"RankingOutline\", new string[] {\"id\", \"name\", \"ranking_type\", \"period_type\", \"top_rankings\", }),\n    (\"RankingUser\", new string[] {\"rank\", \"point\", \"user_outline\", }),\n    (\"RecommendedSkuItem\", new string[] {\"sku_group\", \"icon_image_id\", \"lottery_weight\", \"is_force_pickup\", }),\n    (\"RecoverableValue\", new string[] {\"code\", \"value\", \"hourly_increment\", \"hourly_decrement\", \"capacity\", }),\n    (\"RecoverableValueSet\", new string[] {\"server_time\", \"items\", }),\n    (\"Reinforcement\", new string[] {\"id\", \"soldiers\", }),\n    (\"ReinforcementInfo\", new string[] {\"jobs\", \"reinforcements\", }),\n    (\"ReinforcementReceived\", new string[] {\"id\", \"soldiers\", \"user_outline\", }),\n    (\"ReinforcementSent\", new string[] {\"id\", \"soldiers\", \"position\", \"destination_info\", }),\n    (\"RepeatablePeriod\", new string[] {\"start\", \"sales_time_span_seconds\", \"repeat_time_span_seconds\", \"repeat_count\", }),\n    (\"Report\", new string[] {\"report_id\", \"user_id\", \"title\", \"sub_title\", \"body\", \"banner_id\", \"date\", \"is_read\", \"is_protected\", \"is_replied\", }),\n    (\"ReportBattle\", new string[] {\"report_id\", \"user_id\", \"title\", \"sub_title\", \"body\", \"banner_id\", \"date\", \"is_read\", \"is_protected\", \"is_replied\", \"position\", \"is_victory\", \"resources\", \"items\", \"own_battle_report\", \"opponent_battle_report\", \"has_standby_soldiers\", }),\n    (\"ReportCollection\", new string[] {\"report_id\", \"user_id\", \"title\", \"sub_title\", \"body\", \"banner_id\", \"date\", \"is_read\", \"is_protected\", \"is_replied\", \"position\", \"resources\", \"rewards\", }),\n    (\"ReportFieldBoss\", new string[] {\"report_id\", \"user_id\", \"title\", \"sub_title\", \"body\", \"banner_id\", \"date\", \"is_read\", \"is_protected\", \"is_replied\", \"position\", \"is_victory\", \"resources\", \"items\", \"alliance_exp\", \"battle_report_valiant_items\", \"boss\", \"combo_bonus\", }),\n    (\"ReportGeneral\", new string[] {\"report_id\", \"user_id\", \"title\", \"sub_title\", \"body\", \"banner_id\", \"date\", \"is_read\", \"is_protected\", \"is_replied\", \"page_button\", }),\n    (\"ReportId\", new string[] {\"type\", \"id\", }),\n    (\"ReportInvitationMail\", new string[] {\"report_id\", \"user_id\", \"title\", \"sub_title\", \"body\", \"banner_id\", \"date\", \"is_read\", \"is_protected\", \"is_replied\", \"user_outline\", \"alliance_outline\", \"language_code\", }),\n    (\"ReportMail\", new string[] {\"report_id\", \"user_id\", \"title\", \"sub_title\", \"body\", \"banner_id\", \"date\", \"is_read\", \"is_protected\", \"is_replied\", \"send_user_outline\", \"receive_user_outlines\", \"language_code\", }),\n    (\"ReportOpponentValiantSealed\", new string[] {\"report_id\", \"user_id\", \"title\", \"sub_title\", \"body\", \"banner_id\", \"date\", \"is_read\", \"is_protected\", \"is_replied\", \"dark_crystal_quantity\", \"user_outline\", \"valiant_outline\", }),\n    (\"ReportOutline\", new string[] {\"report_id\", \"user_id\", \"title\", \"sub_title\", \"body\", \"banner_id\", \"date\", \"is_read\", \"is_protected\", \"is_replied\", \"report_type\", }),\n    (\"ReportOwnValiantSealed\", new string[] {\"report_id\", \"user_id\", \"title\", \"sub_title\", \"body\", \"banner_id\", \"date\", \"is_read\", \"is_protected\", \"is_replied\", \"friendship_point_info\", \"valiant_outline\", \"valiant_info\", \"user_outline\", \"memorial_title\", \"position\", }),\n    (\"ReportRankingEvent\", new string[] {\"report_id\", \"user_id\", \"title\", \"sub_title\", \"body\", \"banner_id\", \"date\", \"is_read\", \"is_protected\", \"is_replied\", \"outline\", }),\n    (\"ReportScout\", new string[] {\"report_id\", \"user_id\", \"title\", \"sub_title\", \"body\", \"banner_id\", \"date\", \"is_read\", \"is_protected\", \"is_replied\", \"position\", \"is_success\", \"resources\", \"soldiers\", \"reinforce_soldiers\", \"reinforce_users\", \"reinforce_user_outlines\", \"valiants\", \"valiant_infos\", \"buildings\", \"boost_abilities\", \"scout_ability\", \"opponent\", }),\n    (\"ResourceInfo\", new string[] {\"version\", \"url\", }),\n    (\"RewardPlan\", new string[] {\"quantity\", }),\n    (\"RewardPlanAllianceGift\", new string[] {\"quantity\", \"master_id\", }),\n    (\"RewardPlanConsumable\", new string[] {\"quantity\", \"master_id\", }),\n    (\"RewardPlanDifferences\", new string[] {\"consumables\", \"resources\", \"points\", \"vip_point\", \"valiants\", \"valiant_template_unlock_informations\", \"equipments\", \"materials\", \"enhancers\", \"treasure_boxes\", \"notifications\", \"badges\", }),\n    (\"RewardPlanEnhancer\", new string[] {\"quantity\", \"master_id\", \"grade\", }),\n    (\"RewardPlanEquipment\", new string[] {\"quantity\", \"master_id\", \"grade\", }),\n    (\"RewardPlanExp\", new string[] {\"quantity\", }),\n    (\"RewardPlanFriendshipGrade\", new string[] {\"quantity\", \"master_id\", }),\n    (\"RewardPlanFriendshipPoint\", new string[] {\"quantity\", }),\n    (\"RewardPlanMaterial\", new string[] {\"quantity\", \"master_id\", }),\n    (\"RewardPlanResource\", new string[] {\"quantity\", \"parameter_code\", }),\n    (\"RewardPlans\", new string[] {\"rewards\", }),\n    (\"RewardPlanStoryUnlock\", new string[] {\"quantity\", \"display_name\", \"story_master_id\", \"valiant_template_master_id\", }),\n    (\"RewardPlanTreasureBox\", new string[] {\"quantity\", \"master_id\", }),\n    (\"RewardPlanUserIcon\", new string[] {\"quantity\", \"icon\", }),\n    (\"RewardPlanValiantSkinUnlock\", new string[] {\"quantity\", \"template_master_id\", \"skin_template_id\", }),\n    (\"RewardPlanValiantUnlock\", new string[] {\"quantity\", \"master_id\", }),\n    (\"RotationBanner\", new string[] {\"id\", \"image_id\", \"order\", \"duration\", \"transition_action\", }),\n    (\"SalesPeriod\", new string[] {}),\n    (\"SalesPeriodAfterLastAccess\", new string[] {\"seconds_after_last_access\", \"time_span_seconds\", \"end_date\", \"limit_count\", }),\n    (\"SalesPeriodEternity\", new string[] {\"start_date\", }),\n    (\"SalesPeriodLimited\", new string[] {\"periods\", }),\n    (\"SalesPeriodStronghold\", new string[] {\"stronghold_grade\", \"time_span_seconds\", }),\n    (\"SealedFriendshipPointInfo\", new string[] {\"level\", \"previous\", \"current\", }),\n    (\"SellingInfo\", new string[] {\"charge_coin\", \"loyalty_point\", \"type\", }),\n    (\"SerialCodeCampaignDetail\", new string[] {\"id\", \"name\", \"image_id\", \"end_date\", \"missions\", }),\n    (\"SerialCodeMission\", new string[] {\"id\", \"name\", \"description\", \"serial_code\", \"end_date\", }),\n    (\"SkuGroup\", new string[] {\"id\", \"order\", \"begin_date\", \"end_date\", \"remaining_count\", \"is_recommended\", \"banner_image_id\", \"items\", }),\n    (\"SkuGroupMaster\", new string[] {\"id\", \"name\", \"order\", \"icon_image_id\", \"is_recommended\", \"banner_image_id\", \"sales_period\", \"max_purchase_count\", \"is_reset_purchase_count\", \"preceding_group_id\", \"stage\", \"is_stage_promoted\", \"lottery_weight\", \"is_force_pickup\", \"game_sku_ids\", \"world_filter_condition\", }),\n    (\"SkuItemMaster\", new string[] {\"id\", \"ios_platform_sku_id\", \"android_platform_sku_id\", \"value\", \"title\", \"description\", \"rewards\", }),\n    (\"SkuLineupItem\", new string[] {\"sku_group\", \"subsequent_sku_groups\", }),\n    (\"SleepModeOption\", new string[] {\"start_time\", \"end_time\", \"offset_time\", }),\n    (\"SmallMaster\", new string[] {\"id\", }),\n    (\"SmallMasterAbilityDisplay\", new string[] {\"id\", \"ability_display_masters\", }),\n    (\"SmallMasterAbilityGroupDisplay\", new string[] {\"id\", \"ability_group_display_masters\", }),\n    (\"SmallMasterAllianceMissionSettings\", new string[] {\"id\", \"is_enabled\", }),\n    (\"SmallMasterBaseAbility\", new string[] {\"id\", \"abilities\", }),\n    (\"SmallMasterBlacklist\", new string[] {\"id\", \"capacity\", }),\n    (\"SmallMasterBoost\", new string[] {\"id\", \"boost_masters\", \"daily_barrier_consumable_master_id\", \"daily_barrier_shortest_due_seconds\", \"daily_barrier_change_interval_seconds\", }),\n    (\"SmallMasterBoostCategory\", new string[] {\"id\", \"boost_category_masters\", }),\n    (\"SmallMasterCell\", new string[] {\"id\", \"cell_masters\", }),\n    (\"SmallMasterCityWalkerOptions\", new string[] {\"id\", \"unique_city_walker_group_probability_masters\", \"weight_factor_after_read\", }),\n    (\"SmallMasterConsumableValue\", new string[] {\"id\", \"consumable_value_masters\", }),\n    (\"SmallMasterEquipmentDisplayGrade\", new string[] {\"id\", \"grades\", }),\n    (\"SmallMasterEquipmentSuiteSettings\", new string[] {\"id\", \"default_count\", \"unlock_conditions\", }),\n    (\"SmallMasterLanguage\", new string[] {\"id\", \"language_masters\", \"is_translator_enabled\", }),\n    (\"SmallMasterLoadingTips\", new string[] {\"id\", \"max_count\", \"background_image_id\", \"loading_tips_masters\", }),\n    (\"SmallMasterOperation\", new string[] {\"id\", \"basic_march_count\", \"march_speed_cells_per_minutes\", \"basic_reinforcement_count\", \"basic_rally_attack_count\", \"max_march_distance\", \"scout_costs\", \"rally_attack_costs\", \"scout_speed\", \"gold_collection_coefficient\", \"teleport_area_resistance\", \"additional_seconds_by_attack_to_user\", \"rally_preparation_duration_masters\", }),\n    (\"SmallMasterStaticGameSettings\", new string[] {\"id\", \"field_serialization_mode\", \"stronghold_grade_for_hint_button_hide\", \"invitation_settings\", \"time_synchronization_interval\", \"recommended_sku_item_force_pickup_seconds\", }),\n    (\"SmallMasterTroopsSuiteSettings\", new string[] {\"id\", \"default_count\", \"unlock_conditions\", \"troops_suite_boost_masters\", }),\n    (\"SmallMasterVip\", new string[] {\"id\", \"complete_job_instantly_seconds\", \"required_rank_for_open_all_alliance_gifts\", \"required_rank_for_search_recommended_field_boss\", }),\n    (\"SmithyInfo\", new string[] {\"acquired_date\", \"equipment\", }),\n    (\"SmithyInfoCraft\", new string[] {\"acquired_date\", \"equipment\", \"enhancer\", \"rewards\", \"is_great_success\", \"instance_ability_drama_master_id\", }),\n    (\"SmithyInfoInstanceAbilityRedraw\", new string[] {\"acquired_date\", \"equipment\", \"instance_ability_candidates\", \"drama_master_id\", \"selected_instance_ability_candidate_id\", }),\n    (\"SocialAccount\", new string[] {\"type\", \"access_token\", }),\n    (\"Soldier\", new string[] {\"master_id\", \"quantity\", }),\n    (\"SoldierMaster\", new string[] {\"id\", \"name\", \"tier\", \"image_id\", \"type\", \"description\", \"attack_level\", \"defense_level\", \"life_level\", \"march_speed\", \"hourly_outgo\", \"power\", \"payload\", \"costs\", \"healing_costs\", \"healing_seconds\", \"light_mode_healing_costs\", \"light_mode_healing_seconds\", \"creation_seconds\", \"required_conditions\", \"strengths\", \"weaknesses\", }),\n    (\"SoldierStrength\", new string[] {\"target\", \"value\", }),\n    (\"StrongholdGradeMaster\", new string[] {\"stay_of_execution\", }),\n    (\"SummonBonus\", new string[] {\"member_count\", \"items\", }),\n    (\"SummonBonusItem\", new string[] {\"lottery_reward_display_master_id\", \"probability\", \"lottery_count\", }),\n    (\"SummonerInfo\", new string[] {\"summoner\", \"summoner_alliance\", \"protection_end_date\", }),\n    (\"SyncData\", new string[] {\"items\", }),\n    (\"SyncDifference\", new string[] {\"action\", \"item\", \"id\", }),\n    (\"SyncDifferences\", new string[] {\"user\", \"world\", \"city_position\", \"jobs\", \"resources\", \"building_outlines\", \"researches\", \"soldiers\", \"wounded_soldiers\", \"light_mode_wounded_soldiers\", \"valiants\", \"valiant_template_unlock_informations\", \"equipment_suites\", \"consumables\", \"used_vip_consumables\", \"materials\", \"equipments\", \"equipment_capacity\", \"enhancers\", \"treasure_boxes\", \"points\", \"vip_point\", \"main_quest\", \"first_situation_info\", \"ranking_event_outlines\", \"recommended_sku_items\", \"reinforcements\", \"rally_attacks\", \"notifications\", \"badges\", \"chat_groups\", \"chat_contents\", \"announcement_info\", \"blacklist_users\", \"war_events\", \"world_ability\", \"city_walker_read_infos\", \"is_portable_account_registered\", \"payment_info\", \"city_bonus_sneakers\", \"bookmarks\", \"bookmark_capacity\", \"read_valiant_level\", \"acquired_login_bonuses\", \"alliance_mission_results\", \"colosseum_info\", }),\n    (\"SystemGift\", new string[] {\"id\", \"message\", \"reward\", \"expired_date\", }),\n    (\"TeleportArea\", new string[] {\"other_consumable_index\", \"ranges\", }),\n    (\"TermCondition\", new string[] {\"and_conditions\", }),\n    (\"TerrainMaster\", new string[] {\"id\", \"teleport_areas\", }),\n    (\"TimeOfDay\", new string[] {\"hour\", \"minute\", \"second\", }),\n    (\"TransitionAction\", new string[] {}),\n    (\"TransitionActionAnnouncementDetail\", new string[] {\"announcement_id\", }),\n    (\"TransitionActionHelp\", new string[] {\"help_id\", }),\n    (\"TransitionActionOpenUrl\", new string[] {\"url\", }),\n    (\"TransitionActionPage\", new string[] {\"page_group_name\", }),\n    (\"TreasureBox\", new string[] {\"master_id\", \"quantity\", }),\n    (\"TreasureBoxMaster\", new string[] {\"id\", \"info\", \"rarity\", \"display_grade\", \"lottery_reward_display_master_id\", }),\n    (\"TroopsSuite\", new string[] {\"with_valiant\", \"soldiers\", \"troops_suite_boost_master_id\", }),\n    (\"TroopsSuiteBoostMaster\", new string[] {\"id\", \"boost_rate\", }),\n    (\"TroopsSuiteConfig\", new string[] {\"suites\", }),\n    (\"UnexpectedExceptionLog\", new string[] {\"user_id\", \"device_name\", \"client_version\", \"build_number\", \"items\", }),\n    (\"UnexpectedExceptionLogItem\", new string[] {\"date\", \"time_zone_standard_name\", \"time_zone_offset_minutes\", \"page_stack\", \"language_code\", \"error_title\", \"message\", }),\n    (\"UniqueCityWalkerGroupProbabilityMaster\", new string[] {\"id\", \"probability\", \"message_probability\", }),\n    (\"UniversalAllianceMaster\", new string[] {\"id\", \"max_support_count\", \"reset_times\", \"authority_masters\", \"stronghold_grade_for_creation\", }),\n    (\"UpdateSchedule\", new string[] {\"start_date\", }),\n    (\"UpdateScheduleInfo\", new string[] {\"event_update_schedules\", }),\n    (\"UpdateScheduleRankingEvent\", new string[] {\"start_date\", }),\n    (\"UpdateScheduleWarEvent\", new string[] {\"start_date\", }),\n    (\"User\", new string[] {\"id\", \"code\", \"image_id\", \"name\", \"comment\", \"memorial_title\", \"effective_title_master_id\", \"alliance\", \"alliance_membership\", \"hero\", \"home_world_id\", \"visiting_world_id\", }),\n    (\"UserAchievement\", new string[] {\"achievement\", \"game_center_leader_board_id\", \"google_play_games_leader_board_id\", }),\n    (\"UserAndValiantOutline\", new string[] {\"user_outline\", \"valiant_outline\", }),\n    (\"UserForAlliance\", new string[] {\"user\", \"power\", \"last_login_date\", }),\n    (\"UserOutline\", new string[] {\"home_world_id\", \"visiting_world_id\", \"id\", \"image_id\", \"name\", \"alliance_summary\", \"alliance_membership\", \"effective_title_master_id\", }),\n    (\"UserOutlineForWorldSearch\", new string[] {\"outline\", \"power\", }),\n    (\"Valiant\", new string[] {\"info\", \"equipment_suite_id\", \"battle_increments\", \"boss_increments\", \"skills\", \"friendship_points\", }),\n    (\"ValiantAbility\", new string[] {\"abilities\", }),\n    (\"ValiantFriendshipPoint\", new string[] {\"id\", \"point\", \"grade\", }),\n    (\"ValiantFriendshipPointLevelMaster\", new string[] {\"required_point\", \"ability\", \"valiant_ability\", \"attained_voices\", \"required_grade\", }),\n    (\"ValiantFriendshipPointStoryCondition\", new string[] {}),\n    (\"ValiantFriendshipPointStoryConditionLevel\", new string[] {\"template_id\", \"required_level\", }),\n    (\"ValiantFriendshipPointStoryConditionRead\", new string[] {\"story_id\", }),\n    (\"ValiantFriendshipPointStoryConditionRewardPlan\", new string[] {\"description\", }),\n    (\"ValiantFriendshipPointStoryOutline\", new string[] {\"id\", \"title\", \"type\", \"episode_number\", \"status\", \"order\", \"conditions\", }),\n    (\"ValiantHero\", new string[] {\"info\", \"equipment_suite_id\", \"battle_increments\", \"boss_increments\", \"skills\", \"friendship_points\", \"status_type\", }),\n    (\"ValiantHourlyVoice\", new string[] {\"hour\", \"greeting\", \"reaction\", \"persistent\", }),\n    (\"ValiantInfo\", new string[] {\"id\", \"owner_user_id\", \"master_id\", \"template_id\", \"skin_template_id\", \"exp\", }),\n    (\"ValiantLevelMaster\", new string[] {\"required_exp\", \"skill_points\", \"abilities\", \"dark_crystal_potential\", }),\n    (\"ValiantMaster\", new string[] {\"id\", \"type\", \"template_masters\", \"ability\", \"is_hero\", \"equipments\", \"level_masters\", }),\n    (\"ValiantOutline\", new string[] {\"info\", \"equipment_slots\", \"equipments\", }),\n    (\"ValiantSkinTemplate\", new string[] {\"id\", \"memo\", \"override_template\", \"required_condition\", \"required_item_id\", \"start_date\", \"hide_if_locked\", }),\n    (\"ValiantTemplate\", new string[] {\"default_name\", \"image_id\", \"march_animation_id\", \"description\", \"voice_master\", }),\n    (\"ValiantTemplateAbility\", new string[] {\"name\", \"description\", \"abilities\", }),\n    (\"ValiantTemplateGradeAbilityMaster\", new string[] {\"grade\", \"valiant_template_id\", \"abilities\", \"required_condition\", }),\n    (\"ValiantTemplateMaster\", new string[] {\"id\", \"order\", \"template\", \"skin_templates\", \"level_masters\", \"is_initial_template\", \"hide_if_locked\", \"required_condition\", \"required_item_id\", \"valiant_friendship_point_story_type\", \"start_date\", }),\n    (\"ValiantTemplateUnlockInfo\", new string[] {\"template_master_id\", \"skin_template_ids\", }),\n    (\"ValiantTemplateVoiceMaster\", new string[] {\"cv_name\", \"hourly\", \"leveled_up\", \"captured\", \"sealed\", \"dead\", \"built\", \"researched\", \"detail\", \"acquired_reward\", \"recommended_sku_item\", \"daily_bonus\", \"attack_city\", \"defense_city\", \"attack_field_boss\", \"item_use\", \"summoned\", \"introduction\", \"ranking_event_good_record\", \"ranking_event_excellent_record\", }),\n    (\"VipRankMaster\", new string[] {\"rank\", \"memo\", \"required_vip_point\", \"additional_activation_time\", \"abilities\", \"consumables\", \"reward\", }),\n    (\"VipRankRewardMaster\", new string[] {\"rewards\", \"outline\", \"description\", }),\n    (\"WarEvent\", new string[] {\"id\", \"start_date\", \"end_date\", \"is_visible\", \"description\", \"field_bgm_name\", \"image_id\", }),\n    (\"WarEventCrystalCastleDomination\", new string[] {\"id\", \"start_date\", \"end_date\", \"is_visible\", \"description\", \"field_bgm_name\", \"image_id\", \"dominating_finish_date\", \"remaining_dominating_timer_seconds\", \"dominating_timer_seconds\", }),\n    (\"WarEventCrystalCastleUniqueBoss\", new string[] {\"id\", \"start_date\", \"end_date\", \"is_visible\", \"description\", \"field_bgm_name\", \"image_id\", }),\n    (\"WarEventCrystalCastleWishSelecting\", new string[] {\"id\", \"start_date\", \"end_date\", \"is_visible\", \"description\", \"field_bgm_name\", \"image_id\", }),\n    (\"WarEventLightMode\", new string[] {\"id\", \"start_date\", \"end_date\", \"is_visible\", \"description\", \"field_bgm_name\", \"image_id\", }),\n    (\"World\", new string[] {\"id\", \"name\", \"description\", \"world_type\", \"is_max\", \"is_maintenance\", \"release_date\", \"terrain_id\", \"minimum_stronghold_grade_for_teleport\", \"maximum_stronghold_grade_for_teleport\", \"world_filter_for_teleport\", \"entry_period\", }),\n    (\"WorldAbility\", new string[] {\"master_id\", \"start_date\", \"end_date\", \"related_rankings\", }),\n    (\"WorldAbilityMaster\", new string[] {\"id\", \"name\", \"description\", \"image_id\", \"rarity\", \"event_id\", \"abilities\", \"ranking_abilities\", }),\n    (\"WorldFilterCondition\", new string[] {}),\n    (\"WorldFilterConditionBlackList\", new string[] {\"world_ids\", }),\n    (\"WorldFilterConditionWhiteList\", new string[] {\"world_ids\", }),\n    (\"AcquireSmithyInfoCraftedRequest\", new string[] {\"equipment_id\", }),\n    (\"AcquireSmithyInfoCraftedResponse\", new string[] {\"sync\", }),\n    (\"AcquireSmithyInfoInstanceAbilityRedrawRequest\", new string[] {\"equipment_id\", \"instance_ability_candidate_id\", }),\n    (\"AcquireSmithyInfoInstanceAbilityRedrawResponse\", new string[] {\"resources\", \"equipments\", \"badges\", \"sync\", }),\n    (\"ActivateCollaborationCodeRequest\", new string[] {\"code\", }),\n    (\"ActivateCollaborationCodeResponse\", new string[] {\"acquired_login_bonus\", \"points\", \"consumables\", \"equipments\", \"enhancers\", \"materials\", \"treasure_boxes\", \"sync\", }),\n    (\"ActivateInvitationCodeRequest\", new string[] {\"code\", }),\n    (\"ActivateInvitationCodeResponse\", new string[] {\"message\", \"is_success\", \"points\", \"consumables\", \"equipments\", \"enhancers\", \"materials\", \"treasure_boxes\", \"sync\", }),\n    (\"AddAllianceBoardItemRequest\", new string[] {\"subject\", \"body\", \"is_important\", }),\n    (\"AddBlacklistRequest\", new string[] {\"user_id\", }),\n    (\"AddBlacklistResponse\", new string[] {\"blacklist_users\", }),\n    (\"AddBookmarkRequest\", new string[] {\"name\", \"type\", \"position\", }),\n    (\"AddBookmarkResponse\", new string[] {\"bookmarks\", }),\n    (\"AddEnhancerRequest\", new string[] {\"equipment_id\", \"slot\", \"enhancer_id\", }),\n    (\"AddEnhancerResponse\", new string[] {\"sync\", }),\n    (\"AddEquipmentRequest\", new string[] {\"valiant_id\", \"suite\", \"slot\", \"equipment_id\", }),\n    (\"AddEquipmentResponse\", new string[] {\"sync\", }),\n    (\"AdministerAllianceRequest\", new string[] {\"authority\", }),\n    (\"AdministerAllianceResponse\", new string[] {\"detail\", \"sync\", }),\n    (\"BuyPointShopItemsRequest\", new string[] {\"point_shop_item_master_id\", \"quantity\", }),\n    (\"BuyPointShopItemsResponse\", new string[] {\"item\", \"points\", \"consumables\", \"equipments\", \"enhancers\", \"materials\", \"treasure_boxes\", \"sync\", }),\n    (\"BuyShopItemRequest\", new string[] {\"item_master_id\", \"item_master_type\", \"parameter_code\", \"quantity\", }),\n    (\"BuyShopItemResponse\", new string[] {\"points\", \"consumables\", \"equipments\", \"enhancers\", \"materials\", \"treasure_boxes\", }),\n    (\"BuySkuItemRequest\", new string[] {\"purchase\", }),\n    (\"BuySkuItemResponse\", new string[] {\"sku_item_master\", \"error_message\", \"sync\", }),\n    (\"CancelAllianceJoinRequestRequest\", new string[] {\"alliance_id\", }),\n    (\"CancelColosseumTeleportRequest\", new string[] {\"login_token\", }),\n    (\"CancelColosseumTeleportResponse\", new string[] {\"colosseum_info\", \"sync\", }),\n    (\"CancelJobRequest\", new string[] {\"id\", \"discriminator\", }),\n    (\"CancelJobResponse\", new string[] {\"sync\", }),\n    (\"ChangeEquipmentSuiteRequest\", new string[] {\"valiant_id\", \"suite\", }),\n    (\"ChangeEquipmentSuiteResponse\", new string[] {\"resources\", \"valiants\", \"quest_rewards\", }),\n    (\"ChangeHeroRequest\", new string[] {\"hero_template_id\", }),\n    (\"ChangeHeroResponse\", new string[] {\"valiants\", }),\n    (\"ChangePortableAccountIdRequest\", new string[] {\"id\", }),\n    (\"ChangePortableAccountIdResponse\", new string[] {\"login_token\", }),\n    (\"ChangePortableAccountPasswordRequest\", new string[] {\"password\", }),\n    (\"ChangePortableAccountPasswordResponse\", new string[] {\"login_token\", }),\n    (\"ChangeSkinRequest\", new string[] {\"template_id\", \"skin_template_id\", }),\n    (\"ChangeSkinResponse\", new string[] {\"valiants\", }),\n    (\"CollectQuestRewardRequest\", new string[] {\"id\", \"quest_filter_type\", }),\n    (\"CollectQuestRewardResponse\", new string[] {\"quests\", \"sync\", }),\n    (\"CombineEnhancerRequest\", new string[] {\"enhancer\", \"equipment_id\", }),\n    (\"CombineEnhancerResponse\", new string[] {\"sync\", }),\n    (\"CombineMaterialRequest\", new string[] {\"material\", }),\n    (\"CombineMaterialResponse\", new string[] {\"sync\", }),\n    (\"CompleteJobInstantlyRequest\", new string[] {\"id\", }),\n    (\"CompleteJobInstantlyResponse\", new string[] {\"sync\", }),\n    (\"CreateAllianceRequest\", new string[] {\"name\", \"tag\", \"description\", \"icon_id\", \"language_code\", \"requires_approval\", }),\n    (\"CreateAllianceResponse\", new string[] {\"alliance_detail\", \"sync\", }),\n    (\"CreateBuildingRequest\", new string[] {\"place_id\", \"master_id\", \"instantly\", }),\n    (\"CreateBuildingResponse\", new string[] {\"sync\", }),\n    (\"CreateEquipmentRequest\", new string[] {\"equipment_recipe_master_id\", \"instantly\", }),\n    (\"CreateEquipmentResponse\", new string[] {\"sync\", }),\n    (\"CreateSoldierRequest\", new string[] {\"soldier\", \"instantly\", }),\n    (\"CreateSoldierResponse\", new string[] {\"sync\", }),\n    (\"DecideWishRequest\", new string[] {\"world_ability_master_id\", }),\n    (\"DeleteBuildingRequest\", new string[] {\"place_id\", \"instantly\", }),\n    (\"DeleteBuildingResponse\", new string[] {\"sync\", }),\n    (\"DeleteReportsRequest\", new string[] {\"ids\", }),\n    (\"DeleteSoldierRequest\", new string[] {\"soldier\", }),\n    (\"DeleteSoldierResponse\", new string[] {\"soldiers\", \"resources\", }),\n    (\"ForceBuySkuItemRequest\", new string[] {\"game_sku_id\", \"sku_group_id\", }),\n    (\"ForceBuySkuItemResponse\", new string[] {\"sku_item_master\", \"error_message\", \"sync\", }),\n    (\"ForceLoginRequest\", new string[] {\"user_id\", \"device_name\", \"client_platform\", \"device_token\", \"language_code\", \"is_not_stealth\", \"master_version\", }),\n    (\"ForceLoginResponse\", new string[] {\"base_url\", \"resources_update_time\", }),\n    (\"GetAllianceAchievementsForAlliancePageResponse\", new string[] {\"power_achievement\", \"last_aggregated_date_time\", }),\n    (\"GetAllianceAchievementsForAllianceProfilePageRequest\", new string[] {\"world_id\", \"id\", }),\n    (\"GetAllianceAchievementsForAllianceProfilePageResponse\", new string[] {\"power_achievement\", \"field_boss_kills_achievement\", \"soldier_kills_achievement_by_attack\", \"soldier_kills_achievement_by_defense\", \"last_aggregated_date_time\", }),\n    (\"GetAllianceAchievementsRequest\", new string[] {\"world_id\", \"alliance_id\", }),\n    (\"GetAllianceAchievementsResponse\", new string[] {\"achievements\", }),\n    (\"GetAllianceBoardItemsResponse\", new string[] {\"items\", \"badges\", }),\n    (\"GetAllianceDetailRequest\", new string[] {\"world_id\", \"id\", }),\n    (\"GetAllianceDetailResponse\", new string[] {\"detail\", \"has_join_request\", }),\n    (\"GetAllianceGiftMastersRequest\", new string[] {\"option\", }),\n    (\"GetAllianceGiftMastersResponse\", new string[] {\"masters\", }),\n    (\"GetAllianceGiftsResponse\", new string[] {\"collection\", \"badges\", }),\n    (\"GetAllianceHelpRequestsResponse\", new string[] {\"supported_count\", \"help_requests\", \"points\", }),\n    (\"GetAllianceJoinRequestResponse\", new string[] {\"outlines\", }),\n    (\"GetAllianceMastersRequest\", new string[] {\"option\", }),\n    (\"GetAllianceMastersResponse\", new string[] {\"masters\", }),\n    (\"GetAllianceMembersRequest\", new string[] {\"alliance_id\", }),\n    (\"GetAllianceMembersResponse\", new string[] {\"members\", }),\n    (\"GetAllianceMemorialTitlesRequest\", new string[] {\"world_id\", \"alliance_id\", }),\n    (\"GetAllianceMemorialTitlesResponse\", new string[] {\"memorial_titles\", }),\n    (\"GetAllianceMissionHistoriesResponse\", new string[] {\"missions\", }),\n    (\"GetAllianceMissionMastersRequest\", new string[] {\"option\", }),\n    (\"GetAllianceMissionMastersResponse\", new string[] {\"masters\", }),\n    (\"GetAllianceMissionsResponse\", new string[] {\"missions\", }),\n    (\"GetAnnouncementDetailRequest\", new string[] {\"id\", }),\n    (\"GetAnnouncementDetailResponse\", new string[] {\"detail\", }),\n    (\"GetAnnouncementOutlinesResponse\", new string[] {\"banners\", \"outlines\", \"announcement_info\", }),\n    (\"GetApplicantsResponse\", new string[] {\"applicants\", }),\n    (\"GetAvailableAllianceIconsResponse\", new string[] {\"icons\", }),\n    (\"GetAvailableUserIconsResponse\", new string[] {\"icons\", }),\n    (\"GetBattleReportDetailRequest\", new string[] {\"id\", \"chat_id\", }),\n    (\"GetBattleReportDetailResponse\", new string[] {\"detail\", }),\n    (\"GetBattleReportStandbySoldierDetailRequest\", new string[] {\"id\", \"chat_id\", }),\n    (\"GetBattleReportStandbySoldierDetailResponse\", new string[] {\"detail\", }),\n    (\"GetBuildingMastersRequest\", new string[] {\"option\", }),\n    (\"GetBuildingMastersResponse\", new string[] {\"masters\", }),\n    (\"GetCapturedValiantsRequest\", new string[] {\"world_id\", \"user_id\", }),\n    (\"GetCapturedValiantsResponse\", new string[] {\"valiants\", }),\n    (\"GetChargeCoinDetailResponse\", new string[] {\"free\", \"paid\", \"limit_value\", }),\n    (\"GetChatEngineTicketRequest\", new string[] {\"room_id\", }),\n    (\"GetChatEngineTicketResponse\", new string[] {\"server\", \"user_id\", \"ticket\", \"timestamp\", }),\n    (\"GetCityPlaceMastersRequest\", new string[] {\"option\", }),\n    (\"GetCityPlaceMastersResponse\", new string[] {\"masters\", }),\n    (\"GetCityWalkerMastersRequest\", new string[] {\"option\", }),\n    (\"GetCityWalkerMastersResponse\", new string[] {\"masters\", }),\n    (\"GetConsumableMastersRequest\", new string[] {\"option\", }),\n    (\"GetConsumableMastersResponse\", new string[] {\"masters\", }),\n    (\"GetCrystalCastleMastersRequest\", new string[] {\"option\", }),\n    (\"GetCrystalCastleMastersResponse\", new string[] {\"masters\", }),\n    (\"GetCrystalCastleReinforcementInfoResponse\", new string[] {\"reinforcement_info\", \"field_detail\", \"crystal_castle_dominated_alliance_id\", }),\n    (\"GetDramaMastersRequest\", new string[] {\"option\", }),\n    (\"GetDramaMastersResponse\", new string[] {\"masters\", }),\n    (\"GetEachGradeGalleryItemsCountsRequest\", new string[] {\"gallery_master_types\", }),\n    (\"GetEachGradeGalleryItemsCountsResponse\", new string[] {\"counts\", }),\n    (\"GetEffectiveTitleHoldersRequest\", new string[] {\"world_id\", }),\n    (\"GetEffectiveTitleHoldersResponse\", new string[] {\"outlines\", }),\n    (\"GetEffectiveTitleMastersRequest\", new string[] {\"option\", }),\n    (\"GetEffectiveTitleMastersResponse\", new string[] {\"masters\", }),\n    (\"GetEnhancerMastersRequest\", new string[] {\"option\", }),\n    (\"GetEnhancerMastersResponse\", new string[] {\"masters\", }),\n    (\"GetEquipmentMastersRequest\", new string[] {\"option\", }),\n    (\"GetEquipmentMastersResponse\", new string[] {\"masters\", }),\n    (\"GetEquipmentRecipeMastersRequest\", new string[] {\"option\", }),\n    (\"GetEquipmentRecipeMastersResponse\", new string[] {\"masters\", }),\n    (\"GetEquipmentSeriesMastersRequest\", new string[] {\"option\", }),\n    (\"GetEquipmentSeriesMastersResponse\", new string[] {\"masters\", }),\n    (\"GetFieldBossAdditionalInfoRequest\", new string[] {\"id\", }),\n    (\"GetFieldBossAdditionalInfoResponse\", new string[] {\"combo_bonus\", \"summon_info\", \"time_attack_info\", }),\n    (\"GetFieldBossAttackRankingsRequest\", new string[] {\"world_id\", \"id\", \"type\", }),\n    (\"GetFieldBossAttackRankingsResponse\", new string[] {\"my_ranking\", \"rankings\", }),\n    (\"GetFieldBossHelpRequestsResponse\", new string[] {\"field_bosses\", }),\n    (\"GetFieldBossMastersRequest\", new string[] {\"option\", }),\n    (\"GetFieldBossMastersResponse\", new string[] {\"masters\", }),\n    (\"GetFieldDetailsRequest\", new string[] {\"position\", \"half_width\", }),\n    (\"GetFieldDetailsResponse\", new string[] {\"details\", }),\n    (\"GetFieldResourceMastersRequest\", new string[] {\"option\", }),\n    (\"GetFieldResourceMastersResponse\", new string[] {\"masters\", }),\n    (\"GetFieldServerUrlRequest\", new string[] {\"world_id\", }),\n    (\"GetFieldServerUrlResponse\", new string[] {\"server_url\", }),\n    (\"GetFirstSituationMastersRequest\", new string[] {\"option\", }),\n    (\"GetFirstSituationMastersResponse\", new string[] {\"masters\", }),\n    (\"GetForceLoginUserRequest\", new string[] {\"user_id\", \"user_name\", }),\n    (\"GetForceLoginUserResponse\", new string[] {\"users\", }),\n    (\"GetFriendshipPointStoryDramaRequest\", new string[] {\"id\", }),\n    (\"GetFriendshipPointStoryDramaResponse\", new string[] {\"drama\", }),\n    (\"GetFriendshipPointStoryOutlinesRequest\", new string[] {\"template_id\", }),\n    (\"GetFriendshipPointStoryOutlinesResponse\", new string[] {\"outlines\", }),\n    (\"GetFriendshipPointStorySummaryRequest\", new string[] {\"id\", }),\n    (\"GetFriendshipPointStorySummaryResponse\", new string[] {\"title\", \"template_ids\", }),\n    (\"GetFriendshipPointStoryUnreadIdsResponse\", new string[] {\"template_ids\", }),\n    (\"GetFulfillResultRequest\", new string[] {\"payment_id\", }),\n    (\"GetFulfillResultResponse\", new string[] {\"sku_item_master\", \"valiants\", \"consumables\", \"materials\", \"equipments\", \"enhancers\", \"treasure_boxes\", \"points\", \"main_quest\", \"first_situation_info\", \"recommended_sku_items\", \"notifications\", \"badges\", \"payment_info\", \"sync\", }),\n    (\"GetGalleryItemsRequest\", new string[] {\"gallery_master_type\", }),\n    (\"GetGalleryItemsResponse\", new string[] {\"items\", }),\n    (\"GetGalleryMastersRequest\", new string[] {\"option\", }),\n    (\"GetGalleryMastersResponse\", new string[] {\"masters\", }),\n    (\"GetGameSettingRequest\", new string[] {\"resource_version\", \"resource_target\", \"language_code\", }),\n    (\"GetGameSettingResponse\", new string[] {\"asset_root_url\", \"master_version\", \"resource_info\", \"resources_update_time\", }),\n    (\"GetHelpGroupMastersRequest\", new string[] {\"option\", }),\n    (\"GetHelpGroupMastersResponse\", new string[] {\"masters\", }),\n    (\"GetHelpMastersRequest\", new string[] {\"option\", }),\n    (\"GetHelpMastersResponse\", new string[] {\"masters\", }),\n    (\"GetHintMastersRequest\", new string[] {\"option\", }),\n    (\"GetHintMastersResponse\", new string[] {\"masters\", }),\n    (\"GetInstanceAbilityCandidatesRequest\", new string[] {\"equipment_master_id\", }),\n    (\"GetInstanceAbilityCandidatesResponse\", new string[] {\"instance_abilities\", }),\n    (\"GetInstanceAbilityRedrawRecipeMastersRequest\", new string[] {\"option\", }),\n    (\"GetInstanceAbilityRedrawRecipeMastersResponse\", new string[] {\"masters\", }),\n    (\"GetInvitationInfoResponse\", new string[] {\"info\", }),\n    (\"GetJobCompletionInfoRequest\", new string[] {\"job_id\", \"discriminator\", }),\n    (\"GetJobCompletionInfoResponse\", new string[] {\"sync\", \"is_missing_job\", }),\n    (\"GetLoginBonusMastersRequest\", new string[] {\"option\", }),\n    (\"GetLoginBonusMastersResponse\", new string[] {\"masters\", }),\n    (\"GetLoginDataResponse\", new string[] {\"agreement_type\", \"stronghold_grade_for_world_chat\", \"sync_result\", }),\n    (\"GetLotteryRewardDisplayMastersRequest\", new string[] {\"option\", }),\n    (\"GetLotteryRewardDisplayMastersResponse\", new string[] {\"masters\", }),\n    (\"GetMaterialMastersRequest\", new string[] {\"option\", }),\n    (\"GetMaterialMastersResponse\", new string[] {\"masters\", }),\n    (\"GetPlayerConfigResponse\", new string[] {\"config\", }),\n    (\"GetPointShopItemsResponse\", new string[] {\"items\", }),\n    (\"GetPointShopRotationBannersResponse\", new string[] {\"banners\", }),\n    (\"GetPortableAccountResponse\", new string[] {\"id\", \"can_change_id\", }),\n    (\"GetPushNotificationSettingResponse\", new string[] {\"settings\", \"sleep_mode_option\", }),\n    (\"GetQuestsRequest\", new string[] {\"quest_filter_type\", }),\n    (\"GetQuestsResponse\", new string[] {\"quests\", }),\n    (\"GetRankingDetailRequest\", new string[] {\"id\", }),\n    (\"GetRankingDetailResponse\", new string[] {\"detail\", }),\n    (\"GetRankingEventDetailRequest\", new string[] {\"id\", }),\n    (\"GetRankingEventDetailResponse\", new string[] {\"detail\", }),\n    (\"GetRankingEventOutlinesResponse\", new string[] {\"ranking_event_outlines\", }),\n    (\"GetRankingOutlinesRequest\", new string[] {\"ranking_type\", \"period_type\", }),\n    (\"GetRankingOutlinesResponse\", new string[] {\"outlines\", }),\n    (\"GetReceivedRallyAttackDetailRequest\", new string[] {\"rally_attack_id\", }),\n    (\"GetReceivedRallyAttackDetailResponse\", new string[] {\"watchtower\", \"attendee\", }),\n    (\"GetRecommendedAllianceResponse\", new string[] {\"outlines\", \"banner_id\", \"sync\", }),\n    (\"GetReinforcementInfoRequest\", new string[] {\"user_id\", }),\n    (\"GetReinforcementInfoResponse\", new string[] {\"reinforcement_soldier_capacity\", \"reinforcement_info\", \"field_detail\", }),\n    (\"GetReportOutlinesRequest\", new string[] {\"type\", \"protection\", }),\n    (\"GetReportOutlinesResponse\", new string[] {\"outlines\", }),\n    (\"GetReportsRequest\", new string[] {\"ids\", }),\n    (\"GetReportsResponse\", new string[] {\"reports\", }),\n    (\"GetRewardDeliveredRanksResponse\", new string[] {\"ranks\", }),\n    (\"GetSentRallyAttackDetailRequest\", new string[] {\"rally_attack_id\", }),\n    (\"GetSentRallyAttackDetailResponse\", new string[] {\"attendees\", }),\n    (\"GetSerialCodeCampaignDetailRequest\", new string[] {\"id\", }),\n    (\"GetSerialCodeCampaignDetailResponse\", new string[] {\"detail\", }),\n    (\"GetServerUrlRequest\", new string[] {\"client_version\", \"client_platform\", \"login_token\", \"account\", \"social_account\", \"language_code\", }),\n    (\"GetServerUrlResponse\", new string[] {\"server_url\", }),\n    (\"GetSharedReportRequest\", new string[] {\"chat_id\", }),\n    (\"GetSharedReportResponse\", new string[] {\"report\", }),\n    (\"GetSkuLineupRequest\", new string[] {\"option\", }),\n    (\"GetSkuLineupResponse\", new string[] {\"items\", }),\n    (\"GetSmallMastersRequest\", new string[] {\"option\", }),\n    (\"GetSmallMastersResponse\", new string[] {\"masters\", }),\n    (\"GetSmithyInfoResponse\", new string[] {\"smithy_infos\", }),\n    (\"GetSmithyInfosCraftHistoryResponse\", new string[] {\"smithy_infos\", }),\n    (\"GetSocialAccountExistsRequest\", new string[] {\"type\", }),\n    (\"GetSocialAccountExistsResponse\", new string[] {\"is_registerd\", }),\n    (\"GetSocialAccountOtherAssociationRequest\", new string[] {\"account\", }),\n    (\"GetSocialAccountOtherAssociationResponse\", new string[] {\"user_name\", \"portable_account_id\", }),\n    (\"GetSoldierMastersRequest\", new string[] {\"option\", }),\n    (\"GetSoldierMastersResponse\", new string[] {\"masters\", }),\n    (\"GetSystemGiftsResponse\", new string[] {\"system_gifts\", }),\n    (\"GetTerrainMastersRequest\", new string[] {\"option\", }),\n    (\"GetTerrainMastersResponse\", new string[] {\"masters\", }),\n    (\"GetTreasureBoxMastersRequest\", new string[] {\"option\", }),\n    (\"GetTreasureBoxMastersResponse\", new string[] {\"masters\", }),\n    (\"GetUniversalAllianceMastersRequest\", new string[] {\"option\", }),\n    (\"GetUniversalAllianceMastersResponse\", new string[] {\"masters\", }),\n    (\"GetUnlockedValiantTemplateIdsResponse\", new string[] {\"template_ids\", }),\n    (\"GetUserAchievementsRequest\", new string[] {\"world_id\", \"user_id\", }),\n    (\"GetUserAchievementsResponse\", new string[] {\"achievements\", }),\n    (\"GetUserForProfileRequest\", new string[] {\"world_id\", \"user_id\", \"user_name\", }),\n    (\"GetUserForProfileResponse\", new string[] {\"user\", \"user_vip_rank\", \"power_achievement\", \"field_boss_kills_achievement\", \"soldier_kills_achievement_by_attack\", \"soldier_kills_achievement_by_defense\", \"wins_point\", \"losses_point\", \"last_aggregate_date_time\", \"has_new_memorial_title\", }),\n    (\"GetUserMemorialTitlesRequest\", new string[] {\"world_id\", \"user_id\", }),\n    (\"GetUserMemorialTitlesResponse\", new string[] {\"memorial_titles\", }),\n    (\"GetUserOutlineFromUniverseRequest\", new string[] {\"username\", }),\n    (\"GetUserOutlineFromUniverseResponse\", new string[] {\"users\", }),\n    (\"GetUserOutlineFromWorldRequest\", new string[] {\"world_id\", \"username\", }),\n    (\"GetUserOutlineFromWorldResponse\", new string[] {\"users\", }),\n    (\"GetUserPolicyRequest\", new string[] {\"language_code\", }),\n    (\"GetUserPolicyResponse\", new string[] {\"user_policy\", }),\n    (\"GetValiantMastersRequest\", new string[] {\"option\", }),\n    (\"GetValiantMastersResponse\", new string[] {\"masters\", }),\n    (\"GetValiantTemplateGradeAbilityMastersRequest\", new string[] {\"option\", }),\n    (\"GetValiantTemplateGradeAbilityMastersResponse\", new string[] {\"masters\", }),\n    (\"GetVipRankMastersRequest\", new string[] {\"option\", }),\n    (\"GetVipRankMastersResponse\", new string[] {\"masters\", }),\n    (\"GetWishesResponse\", new string[] {\"world_ability_master_ids\", }),\n    (\"GetWorldAbilityMastersRequest\", new string[] {\"option\", }),\n    (\"GetWorldAbilityMastersResponse\", new string[] {\"masters\", }),\n    (\"GetWorldsResponse\", new string[] {\"worlds\", }),\n    (\"GiveEffectiveTitleRequest\", new string[] {\"user_id\", \"effective_title_master_id\", }),\n    (\"GoBackCrystalCastleReinforcementRequest\", new string[] {\"id\", }),\n    (\"GoBackCrystalCastleReinforcementResponse\", new string[] {\"jobs\", \"reinforcements\", }),\n    (\"GoBackReinforcementRequest\", new string[] {\"id\", }),\n    (\"GoBackReinforcementResponse\", new string[] {\"jobs\", \"reinforcements\", }),\n    (\"HealSoldierRequest\", new string[] {\"soldiers\", \"instantly\", \"is_light_mode\", }),\n    (\"HealSoldierResponse\", new string[] {\"sync\", }),\n    (\"IncrementCollaborationCounterRequest\", new string[] {\"id\", }),\n    (\"InitializeHeroRequest\", new string[] {\"hero_template_id\", }),\n    (\"InitializeHeroResponse\", new string[] {\"first_valiant_template_id\", \"valiants\", \"user\", }),\n    (\"JoinRallyAttackRequest\", new string[] {\"rally_attack_id\", \"sending_soldiers\", }),\n    (\"JoinRallyAttackResponse\", new string[] {\"jobs\", \"soldiers\", \"sync\", }),\n    (\"LeaveAllianceRequest\", new string[] {\"alliance_id\", }),\n    (\"LeaveAllianceResponse\", new string[] {\"sync\", }),\n    (\"LoginPortableAccountRequest\", new string[] {\"account\", \"dmm_viewer_id\", \"dmm_onetime_token\", \"device_name\", \"client_platform\", \"os_version\", \"device_token\", \"tracking_id\", \"language_code\", \"master_version\", }),\n    (\"LoginPortableAccountResponse\", new string[] {\"base_url\", \"login_token\", \"force_logout_id\", }),\n    (\"LoginRequest\", new string[] {\"device_name\", \"client_platform\", \"os_version\", \"login_token\", \"dmm_viewer_id\", \"dmm_onetime_token\", \"device_token\", \"tracking_id\", \"language_code\", \"master_version\", }),\n    (\"LoginResponse\", new string[] {\"base_url\", \"resources_update_time\", \"force_logout_id\", }),\n    (\"LoginSocialAccountRequest\", new string[] {\"account\", \"device_name\", \"client_platform\", \"os_version\", \"device_token\", \"tracking_id\", \"language_code\", \"master_version\", }),\n    (\"LoginSocialAccountResponse\", new string[] {\"base_url\", \"login_token\", \"force_logout_id\", }),\n    (\"LogUnexpectedExceptionRequest\", new string[] {\"log\", }),\n    (\"MarchFieldBossRequest\", new string[] {\"valiant_ids\", \"destination\", \"with_additional\", }),\n    (\"MarchFieldBossResponse\", new string[] {\"sync\", }),\n    (\"MarchRequest\", new string[] {\"valiant_id\", \"soldiers\", \"destination\", \"type\", }),\n    (\"MarchResponse\", new string[] {\"sync\", }),\n    (\"MoveBuildingRequest\", new string[] {\"source_place_id\", \"target_place_id\", }),\n    (\"MoveBuildingResponse\", new string[] {\"building_outlines\", \"quest_rewards\", }),\n    (\"NextMainQuestRequest\", new string[] {\"quest_id\", }),\n    (\"NextMainQuestResponse\", new string[] {\"main_quest\", }),\n    (\"NotifyAllianceBoardItemRequest\", new string[] {\"id\", }),\n    (\"OpenAllAllianceGiftsResponse\", new string[] {\"rewards\", \"sync\", }),\n    (\"OpenAllianceGiftsRequest\", new string[] {\"ids\", }),\n    (\"OpenAllianceGiftsResponse\", new string[] {\"collection\", \"sync\", }),\n    (\"OpenSystemGiftsRequest\", new string[] {\"gift_ids\", }),\n    (\"OpenSystemGiftsResponse\", new string[] {\"rewards\", \"sync\", }),\n    (\"OpenTreasureBoxRequest\", new string[] {\"treasure_id\", }),\n    (\"OpenTreasureBoxResponse\", new string[] {\"rewards\", \"sync\", }),\n    (\"PollRequest\", new string[] {\"read_ids\", }),\n    (\"PollResponse\", new string[] {\"sync\", \"interval_seconds\", }),\n    (\"PromoteRallyAttackRequest\", new string[] {\"destination\", \"valiant_id\", \"sending_soldiers\", \"duration_master_id\", }),\n    (\"PromoteRallyAttackResponse\", new string[] {\"rally_attacks\", \"resources\", \"jobs\", \"soldiers\", \"sync\", }),\n    (\"ProtectReportsRequest\", new string[] {\"ids\", \"is_protect\", }),\n    (\"ReadAllianceMissionResultRequest\", new string[] {\"ids\", }),\n    (\"ReadAllianceMissionResultResponse\", new string[] {\"alliance_mission_results\", }),\n    (\"ReadCityBonusSneakerRequest\", new string[] {\"id\", }),\n    (\"ReadCityBonusSneakerResponse\", new string[] {\"sync\", }),\n    (\"ReadCityWalkerRequest\", new string[] {\"id\", }),\n    (\"ReadCityWalkerResponse\", new string[] {\"sync\", \"has_reward\", }),\n    (\"ReadFirstSituationRequest\", new string[] {\"id\", }),\n    (\"ReadFirstSituationResponse\", new string[] {\"sync\", }),\n    (\"ReadFriendshipPointStoryRequest\", new string[] {\"id\", }),\n    (\"ReadFriendshipPointStoryResponse\", new string[] {\"rewards\", \"outlines\", \"sync\", }),\n    (\"ReadLoginBonusRequest\", new string[] {\"id\", }),\n    (\"ReadLoginBonusResponse\", new string[] {\"acquired_login_bonuses\", }),\n    (\"ReadRankingEventProgressRequest\", new string[] {\"id\", \"milestone_index\", \"read_ranking\", }),\n    (\"ReadRankingEventProgressResponse\", new string[] {\"ranking_event_outlines\", }),\n    (\"ReadReportsRequest\", new string[] {\"ids\", }),\n    (\"ReadReportsResponse\", new string[] {\"badges\", }),\n    (\"ReadValiantLevelUpSummaryResponse\", new string[] {\"read_valiant_level\", }),\n    (\"ReceiveAllianceHelpResponse\", new string[] {\"supported_count\", \"help_requests\", \"sync\", \"reward\", }),\n    (\"ReceiveRankRewardsRequest\", new string[] {\"vip_rank\", }),\n    (\"ReceiveRankRewardsResponse\", new string[] {\"ranks\", \"rewards\", \"sync_reward_plans\", \"sync\", }),\n    (\"RedrawInstanceAbilityRequest\", new string[] {\"equipment_id\", }),\n    (\"RedrawInstanceAbilityResponse\", new string[] {\"resources\", \"materials\", \"badges\", \"sync\", }),\n    (\"RegisterPortableAccountRequest\", new string[] {\"account\", }),\n    (\"RegisterPortableAccountResponse\", new string[] {\"sync\", \"login_token\", }),\n    (\"RegisterSocialAccountRequest\", new string[] {\"account\", }),\n    (\"RegisterSocialAccountResponse\", new string[] {\"login_token\", }),\n    (\"RegisterUserRequest\", new string[] {\"language_code\", \"client_platform\", \"tracking_id\", }),\n    (\"RegisterUserResponse\", new string[] {\"login_token\", }),\n    (\"RemoveAllianceBoardItemRequest\", new string[] {\"id\", }),\n    (\"RemoveBlacklistRequest\", new string[] {\"user_id\", }),\n    (\"RemoveBlacklistResponse\", new string[] {\"blacklist_users\", }),\n    (\"RemoveBookmarkRequest\", new string[] {\"id\", }),\n    (\"RemoveBookmarkResponse\", new string[] {\"bookmarks\", }),\n    (\"RemoveEquipmentFromRequest\", new string[] {\"valiant_id\", \"suite\", \"slot\", }),\n    (\"RemoveEquipmentFromResponse\", new string[] {\"sync\", }),\n    (\"RemoveEquipmentRequest\", new string[] {\"equipment_id\", }),\n    (\"RemoveEquipmentResponse\", new string[] {\"sync\", }),\n    (\"RequestAllianceHelpRequest\", new string[] {\"job_id\", }),\n    (\"RequestAllianceHelpResponse\", new string[] {\"jobs\", }),\n    (\"RequestFieldBossHelpRequest\", new string[] {\"id\", \"message\", }),\n    (\"RequestJoinAllianceRequest\", new string[] {\"alliance_id\", }),\n    (\"RequestJoinAllianceResponse\", new string[] {\"detail\", \"sync\", }),\n    (\"ReturnFromColosseumResponse\", new string[] {\"colosseum_info\", \"sync\", }),\n    (\"ReviewApplicationResponse\", new string[] {\"points\", \"consumables\", \"equipments\", \"enhancers\", \"materials\", \"treasure_boxes\", \"sync\", }),\n    (\"ScoutRequest\", new string[] {\"destination\", }),\n    (\"ScoutResponse\", new string[] {\"sync\", }),\n    (\"SearchAllianceRequest\", new string[] {\"word\", }),\n    (\"SearchAllianceResponse\", new string[] {\"outlines\", }),\n    (\"SellEquipmentRequest\", new string[] {\"equipment_id\", }),\n    (\"SellEquipmentResponse\", new string[] {\"sync\", }),\n    (\"SendChatMessageRequest\", new string[] {\"read_id\", \"message\", \"positions\", \"report_id\", }),\n    (\"SendChatMessageResponse\", new string[] {\"chat_contents\", }),\n    (\"SendMailRequest\", new string[] {\"ids\", \"title\", \"body\", \"reply_report_id\", }),\n    (\"SendSerialCodeRequest\", new string[] {\"campaign_id\", \"serial_code\", }),\n    (\"SendSerialCodeResponse\", new string[] {\"badges\", }),\n    (\"SetBirthDateRequest\", new string[] {\"year\", \"month\", \"day\", }),\n    (\"SetBirthDateResponse\", new string[] {\"payment_info\", }),\n    (\"SetDailyBarrierEnabledRequest\", new string[] {\"enabled\", }),\n    (\"SetDailyBarrierEnabledResponse\", new string[] {\"daily_barrier_info\", }),\n    (\"SetPlayerConfigRequest\", new string[] {\"config\", }),\n    (\"SetPushNotificationSettingRequest\", new string[] {\"settings\", \"sleep_mode_option\", }),\n    (\"SynchronizeColosseumTeleportRequest\", new string[] {\"login_token\", }),\n    (\"SynchronizeColosseumTeleportResponse\", new string[] {\"colosseum_info\", \"sync\", }),\n    (\"SynchronizeJobCompletionResponse\", new string[] {\"city_position\", \"jobs\", \"soldiers\", \"wounded_soldiers\", \"light_mode_wounded_soldiers\", \"valiants\", \"consumables\", \"materials\", \"enhancers\", \"treasure_boxes\", \"points\", \"main_quest\", \"first_situation_info\", \"reinforcements\", \"rally_attacks\", }),\n    (\"SynchronizeRecommendedLineupResponse\", new string[] {\"recommended_sku_items\", }),\n    (\"SynchronizeResponse\", new string[] {\"sync_result\", }),\n    (\"SynchronizeTimeResponse\", new string[] {\"server_time\", }),\n    (\"TranslateChatMessageRequest\", new string[] {\"id\", \"language_code\", }),\n    (\"TranslateChatMessageResponse\", new string[] {\"message\", }),\n    (\"TranslateMailRequest\", new string[] {\"id\", \"language_code\", }),\n    (\"TranslateMailResponse\", new string[] {\"mail\", }),\n    (\"UpdateAllianceBoardItemRequest\", new string[] {\"id\", \"subject\", \"body\", \"is_important\", }),\n    (\"UpdateBookmarkRequest\", new string[] {\"id\", \"name\", \"type\", }),\n    (\"UpdateBookmarkResponse\", new string[] {\"bookmarks\", }),\n    (\"UpdateDailyBarrierStartTimeRequest\", new string[] {\"start_time\", }),\n    (\"UpdateDailyBarrierStartTimeResponse\", new string[] {\"daily_barrier_info\", }),\n    (\"UpdateProfileCommentRequest\", new string[] {\"comment\", }),\n    (\"UpdateProfileCommentResponse\", new string[] {\"user\", }),\n    (\"UpdateRankingEventsResponse\", new string[] {\"ranking_event_outlines\", }),\n    (\"UpdateUserIconRequest\", new string[] {\"id\", }),\n    (\"UpdateUserIconResponse\", new string[] {\"user\", }),\n    (\"UpdateUserMemorialTitleRequest\", new string[] {\"memorial_title_id\", }),\n    (\"UpdateUserMemorialTitleResponse\", new string[] {\"user\", }),\n    (\"UpdateWarEventResponse\", new string[] {\"war_events\", \"world_ability\", }),\n    (\"UpgradeBuildingRequest\", new string[] {\"place_id\", \"instantly\", }),\n    (\"UpgradeBuildingResponse\", new string[] {\"sync\", }),\n    (\"UpgradeEquipmentRequest\", new string[] {\"equipment_id\", \"equipment_recipe_master_id\", \"instantly\", }),\n    (\"UpgradeEquipmentResponse\", new string[] {\"sync\", }),\n    (\"UpgradeResearchRequest\", new string[] {\"tree_id\", \"node_id\", \"instantly\", }),\n    (\"UpgradeResearchResponse\", new string[] {\"sync\", }),\n    (\"UpgradeSkillRequest\", new string[] {\"valiant_id\", \"tree_id\", \"node_id\", }),\n    (\"UpgradeSkillResponse\", new string[] {\"sync\", }),\n    (\"UseConsumableRequest\", new string[] {\"item_use_type\", \"item_use_option\", \"quantity\", }),\n    (\"UseConsumableResponse\", new string[] {\"used_quantity\", \"sync\", \"base_url\", }),\n    (\"ValidateCollaborationCodeRequest\", new string[] {\"code\", }),\n    (\"ValidateCollaborationCodeResponse\", new string[] {\"is_valid\", \"collaboration_title\", \"message\", }),\n    (\"FieldSyncResult\", new string[] {\"immovables\", \"movables\", }),\n    (\"AdminBlockStatRequest\", new string[] {\"index\", }),\n    (\"AdminBlockStatResponse\", new string[] {\"client_ids\", \"immovable_ids\", \"movable_ids\", \"originated_ids\", \"destinated_ids\", }),\n    (\"AdminGetClientIdsResponse\", new string[] {\"blocks\", }),\n    (\"AdminGetClientPositionRequest\", new string[] {\"id\", }),\n    (\"AdminGetClientPositionResponse\", new string[] {\"x\", \"y\", }),\n    (\"AdminGetDetailRequest\", new string[] {\"position\", }),\n    (\"AdminGetDetailResponse\", new string[] {\"item\", }),\n    (\"AdminGetJobRequest\", new string[] {\"id\", }),\n    (\"AdminGetJobResponse\", new string[] {\"block_index\", \"x\", \"y\", \"item\", }),\n    (\"AdminGetRequest\", new string[] {\"left_top\", \"right_bottom\", \"from_block\", }),\n    (\"AdminGetResponse\", new string[] {\"immovables\", \"movables\", }),\n    (\"AdminStatResponse\", new string[] {\"start_date\", \"last_access_date\", \"client_count\", \"immovable_count\", \"movable_count\", \"originated_count\", \"destinated_count\", }),\n    (\"AdminUpdateRequest\", new string[] {\"added_immovables\", \"added_movables\", \"removed_immovables\", \"removed_movables\", }),\n    (\"BlockDiagnosticInfo\", new string[] {\"x\", \"y\", \"immovables\", \"movables\", \"client_ids\", }),\n    (\"CreateRoomRequest\", new string[] {\"room_id\", \"width\", \"height\", }),\n    (\"DeleteRoomRequest\", new string[] {\"room_id\", }),\n    (\"GetInactiveRoomsRequest\", new string[] {\"period_seconds\", }),\n    (\"GetInactiveRoomsResponse\", new string[] {\"room_ids\", }),\n    (\"GetRoomsResponse\", new string[] {\"room_ids\", }),\n    (\"GetStatResponse\", new string[] {\"rooms\", \"offset_ticks\", \"offset_hours\", }),\n    (\"GetTypeHashRequest\", new string[] {\"type_name\", }),\n    (\"GetTypeHashResponse\", new string[] {\"hash_code\", }),\n    (\"SetInactiveThresholdRequest\", new string[] {\"period_seconds\", }),\n    (\"SetNowRequest\", new string[] {\"now\", }),\n    (\"NotifyDifferenceRequest\", new string[] {\"added_immovables\", \"added_movables\", \"removed_immovables\", \"removed_movables\", \"reason\", }),\n    (\"NotifyWholeRequest\", new string[] {\"sync_result\", }),\n    (\"UpdateRequest\", new string[] {\"position\", \"is_forced\", }),\n};\n\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Grisu3DoubleConversion/DiyFp.cs",
    "content": "﻿using System.Diagnostics;\n\nnamespace Grisu3DoubleConversion\n{\n    /// <summary>\n    /// https://github.com/google/double-conversion/blob/master/double-conversion/diy-fp.cc\n    /// </summary>\n    public struct DiyFp\n    {\n        public ulong F;\n        public int E;\n\n        public const ulong Uint64MSB = 0x80000000_00000000;\n        public const int SignificandSize = 64;\n\n        public DiyFp(ulong significand, int exponent)\n        {\n            F = significand;\n            E = exponent;\n        }\n\n        // this = this - other.\n        // The exponents of both numbers must be the same and the significand of this\n        // must be bigger than the significand of other.\n        // The result will not be normalized.\n        void Subtract(DiyFp other)\n        {\n            Debug.Assert(E == other.E);\n            Debug.Assert(F >= other.F);\n            F -= other.F;\n        }\n\n        // Returns a - b.\n        // The exponents of both numbers must be the same and this must be bigger\n        // than other. The result will not be normalized.\n        public static DiyFp operator -(DiyFp a, DiyFp b)\n        {\n            DiyFp result = a;\n            result.Subtract(b);\n            return result;\n        }\n\n\n        // this = this * other.\n        void Multiply(DiyFp other)\n        {\n            // Simply \"emulates\" a 128 bit multiplication.\n            // However: the resulting number only contains 64 bits. The least\n            // significant 64 bits are only used for rounding the most significant 64\n            // bits.\n            const ulong kM32 = 0xFFFFFFFFU;\n            ulong a = F >> 32;\n            ulong b = F & kM32;\n            ulong c = other.F >> 32;\n            ulong d = other.F & kM32;\n            ulong ac = a * c;\n            ulong bc = b * c;\n            ulong ad = a * d;\n            ulong bd = b * d;\n            ulong tmp = (bd >> 32) + (ad & kM32) + (bc & kM32);\n            // By adding 1U << 31 to tmp we round the final result.\n            // Halfway cases will be round up.\n            tmp += 1U << 31;\n            ulong result_f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32);\n            E += other.E + 64;\n            F = result_f;\n        }\n\n        // returns a * b;\n        public static DiyFp operator *(DiyFp a, DiyFp b)\n        {\n            DiyFp result = a;\n            result.Multiply(b);\n            return result;\n        }\n\n        public void Normalize()\n        {\n            Debug.Assert(F != 0);\n            ulong significand = F;\n            int exponent = E;\n\n            // This method is mainly called for normalizing boundaries. In general\n            // boundaries need to be shifted by 10 bits. We thus optimize for this case.\n            const ulong k10MSBits = 0xFFC00000_00000000;\n            while ((significand & k10MSBits) == 0)\n            {\n                significand <<= 10;\n                exponent -= 10;\n            }\n            while ((significand & Uint64MSB) == 0)\n            {\n                significand <<= 1;\n                exponent--;\n            }\n            F = significand;\n            E = exponent;\n        }\n\n        public static DiyFp Normalize(DiyFp a)\n        {\n            DiyFp result = a;\n            result.Normalize();\n            return result;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Grisu3DoubleConversion/DoubleConversion.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\n\nnamespace Grisu3DoubleConversion\n{\n    /// <summary>\n    /// https://github.com/google/double-conversion/blob/master/double-conversion/fast-dtoa.cc\n    /// </summary>\n    public static unsafe class DoubleConversion\n    {\n        private const int kMinimalTargetExponent = -60;\n        private const int kMaximalTargetExponent = -32;\n\n        private static bool RoundWeed(\n            Span<byte> buffer,\n            int length,\n            ulong distance_too_high_w,\n            ulong unsafe_interval,\n            ulong rest,\n            ulong ten_kappa,\n            ulong unit)\n        {\n            ulong small_distance = distance_too_high_w - unit;\n            ulong big_distance = distance_too_high_w + unit;\n            Debug.Assert(rest <= unsafe_interval);\n            while (rest < small_distance &&  // Negated condition 1\n                unsafe_interval - rest >= ten_kappa &&  // Negated condition 2\n                (rest + ten_kappa < small_distance ||  // buffer{-1} > w_high\n                small_distance - rest >= rest + ten_kappa - small_distance))\n            {\n                buffer[length - 1]--;\n                rest += ten_kappa;\n            }\n\n            if (rest < big_distance &&\n                unsafe_interval - rest >= ten_kappa &&\n                (rest + ten_kappa < big_distance || big_distance - rest > rest + ten_kappa - big_distance))\n            {\n                return false;\n            }\n\n            return (2 * unit <= rest) && (rest <= unsafe_interval - 4 * unit);\n        }\n\n        private static readonly uint[] kSmallPowersOfTen = { 0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };\n\n        private static void BiggestPowerTen(\n            uint number,\n            int number_bits,\n            out uint power,\n            out int exponent_plus_one)\n        {\n            Debug.Assert(number < (1u << (number_bits + 1)));\n            int exponent_plus_one_guess = ((number_bits + 1) * 1233 >> 12);\n            exponent_plus_one_guess++;\n            if (number < kSmallPowersOfTen[exponent_plus_one_guess])\n            {\n                exponent_plus_one_guess--;\n            }\n            power = kSmallPowersOfTen[exponent_plus_one_guess];\n            exponent_plus_one = exponent_plus_one_guess;\n        }\n\n        private static bool DigitGen(\n            DiyFp low,\n            DiyFp w,\n            DiyFp high,\n            Span<byte> buffer,\n            out int length,\n            out int kappa)\n        {\n            Debug.Assert(low.E == w.E && w.E == high.E);\n            Debug.Assert(low.F + 1 <= high.F - 1);\n            Debug.Assert(kMinimalTargetExponent <= w.E && w.E <= kMaximalTargetExponent);\n\n            ulong unit = 1;\n            DiyFp too_low = new DiyFp(low.F - unit, low.E);\n            DiyFp too_high = new DiyFp(high.F + unit, high.E);\n            DiyFp unsafe_interval = too_high - too_low;\n            DiyFp one = new DiyFp(1UL << -w.E, w.E);\n            uint integrals = unchecked((uint)(too_high.F >> -one.E));\n            ulong fractionals = too_high.F & (one.F - 1);\n            BiggestPowerTen(integrals, DiyFp.SignificandSize - (-one.E),\n                out var divisor, out var divisor_exponent_plus_one);\n            kappa = divisor_exponent_plus_one;\n            length = 0;\n            while (kappa > 0)\n            {\n                int digit = unchecked((int)(integrals / divisor));\n                Debug.Assert(digit <= 9);\n                buffer[length] = (byte)('0' + digit);\n                length++;\n                integrals %= divisor;\n                kappa--;\n                ulong rest =\n                    ((ulong)(integrals) << -one.E) + fractionals;\n                if (rest < unsafe_interval.F)\n                {\n                    return RoundWeed(buffer, length, (too_high - w).F,\n                                     unsafe_interval.F, rest,\n                                     (ulong)(divisor) << -one.E, unit);\n                }\n                divisor /= 10;\n            }\n\n            Debug.Assert(one.E >= -60);\n            Debug.Assert(fractionals < one.F);\n            Debug.Assert(0xFFFFFFFF_FFFFFFFFUL / 10 >= one.F);\n            for (; ; )\n            {\n                fractionals *= 10;\n                unit *= 10;\n                unsafe_interval.F = (unsafe_interval.F * 10);\n                int digit = unchecked((int)(fractionals >> -one.E));\n                Debug.Assert(digit <= 9);\n                buffer[length] = (byte)('0' + digit);\n                (length)++;\n                fractionals &= one.F - 1;  // Modulo by one.\n                (kappa)--;\n                if (fractionals < unsafe_interval.F)\n                {\n                    return RoundWeed(buffer, length, (too_high - w).F * unit,\n                                     unsafe_interval.F, fractionals, one.F, unit);\n                }\n            }\n        }\n\n        public static bool ToString(\n            double v,\n            bool isSinglePrecision,\n            Span<byte> buffer,\n            out int length,\n            out int decimal_exponent)\n        {\n            DiyFp w = new DoubleView(v).AsNormalizedDiyFp();\n\n            DiyFp boundary_minus, boundary_plus;\n            if (!isSinglePrecision)\n            {\n                new DoubleView(v).NormalizedBoundaries(out boundary_minus, out boundary_plus);\n            }\n            else\n            {\n                new SingleView((float)v).NormalizedBoundaries(out boundary_minus, out boundary_plus);\n            }\n            Debug.Assert(boundary_plus.E == w.E);\n            int ten_mk_minimal_binary_exponent = kMinimalTargetExponent - (w.E + DiyFp.SignificandSize);\n            int ten_mk_maximal_binary_exponent = kMaximalTargetExponent - (w.E + DiyFp.SignificandSize);\n            PowersOfTenCache.GetCachedPowerForBinaryExponentRange(\n                ten_mk_minimal_binary_exponent,\n                ten_mk_maximal_binary_exponent,\n                out var ten_mk, out var mk);\n            Debug.Assert((kMinimalTargetExponent <= w.E + ten_mk.E +\n                    DiyFp.SignificandSize) &&\n                   (kMaximalTargetExponent >= w.E + ten_mk.E +\n                    DiyFp.SignificandSize));\n\n            DiyFp scaled_w = (w * ten_mk);\n            Debug.Assert(scaled_w.E ==\n                   boundary_plus.E + ten_mk.E + DiyFp.SignificandSize);\n\n            DiyFp scaled_boundary_minus = (boundary_minus * ten_mk);\n            DiyFp scaled_boundary_plus = (boundary_plus * ten_mk);\n\n            bool result = DigitGen(scaled_boundary_minus, scaled_w, scaled_boundary_plus,\n                                   buffer, out length, out var kappa);\n            decimal_exponent = -mk + kappa;\n            return result;\n        }\n\n        public static bool ToString(float v, out NumberStringBuffer buffer)\n        {\n            if (v == 0)\n            {\n                buffer = NumberStringBuffer.Zero;\n                return true;\n            }\n            else if(float.IsPositiveInfinity(v))\n            {\n                buffer = NumberStringBuffer.PositiveInfinity;\n                return false;\n            }\n            else if (float.IsNegativeInfinity(v))\n            {\n                buffer = NumberStringBuffer.NegativeInfinity;\n                return false;\n            }\n            else if (float.IsNaN(v))\n            {\n                buffer = NumberStringBuffer.NaN;\n                return false;\n            }\n\n            buffer = default;\n            buffer.IsSinglePrecision = true;\n            if (v < 0)\n            {\n                buffer.IsNegative = true;\n                v = -v;\n            }\n\n            fixed (byte* p = buffer.Digits)\n            {\n                var result = ToString(v, true, new Span<byte>(p, NumberStringBuffer.MaxDigits), out var len, out var exp);\n                buffer.Length = (byte)len;\n                buffer.DecimalExponent = (short)exp;\n                return result;\n            }\n        }\n\n        public static bool ToString(double v, out NumberStringBuffer buffer)\n        {\n            if (v == 0)\n            {\n                buffer = NumberStringBuffer.Zero;\n                return true;\n            }\n            else if (double.IsPositiveInfinity(v))\n            {\n                buffer = NumberStringBuffer.PositiveInfinity;\n                return false;\n            }\n            else if (double.IsNegativeInfinity(v))\n            {\n                buffer = NumberStringBuffer.NegativeInfinity;\n                return false;\n            }\n            else if (double.IsNaN(v))\n            {\n                buffer = NumberStringBuffer.NaN;\n                return false;\n            }\n\n            buffer = default;\n            if (v < 0)\n            {\n                buffer.IsNegative = true;\n                v = -v;\n            }\n\n            fixed (byte* p = buffer.Digits)\n            {\n                var result = ToString(v, false, new Span<byte>(p, NumberStringBuffer.MaxDigits), out var len, out var exp);\n                buffer.Length = (byte)len;\n                buffer.DecimalExponent = (short)exp;\n                return result;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Grisu3DoubleConversion/DoubleConversionBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System.Text;\n\nnamespace Grisu3DoubleConversion\n{\n    public class DoubleConversionBenchmark\n    {\n        TestData data;\n\n        [GlobalSetup]\n        public void Setup()\n        {\n            data = new TestData(1000);\n        }\n\n        [Benchmark]\n        public void SystemToString()\n        {\n            foreach (var x in data.DoubleValues) SystemToString(x);\n            foreach (var x in data.SingleValues) SystemToString(x);\n        }\n\n        [Benchmark]\n        public void SystemGetBytes()\n        {\n            foreach (var x in data.DoubleValues) SystemGetBytes(x);\n            foreach (var x in data.SingleValues) SystemGetBytes(x);\n        }\n\n        [Benchmark]\n        public void Grisu3ToString()\n        {\n            foreach (var x in data.DoubleValues) Grisu3ToString(x);\n            foreach (var x in data.SingleValues) Grisu3ToString(x);\n        }\n\n        [Benchmark]\n        public void Grisu3GetBytes()\n        {\n            foreach (var x in data.DoubleValues) Grisu3GetBytes(x);\n            foreach (var x in data.SingleValues) Grisu3GetBytes(x);\n        }\n\n        public static string SystemToString(double x) => x.ToString();\n        public static string SystemToString(float x) => x.ToString();\n\n        public static string Grisu3ToString(double x)\n        {\n            DoubleConversion.ToString(x, out var buffer);\n            return buffer.ToString();\n        }\n\n        public static string Grisu3ToString(float x)\n        {\n            DoubleConversion.ToString(x, out var buffer);\n            return buffer.ToString();\n        }\n\n        public static byte[] SystemGetBytes(double x) => Encoding.UTF8.GetBytes(x.ToString());\n        public static byte[] SystemGetBytes(float x) => Encoding.UTF8.GetBytes(x.ToString());\n\n        public static byte[] Grisu3GetBytes(double x)\n        {\n            DoubleConversion.ToString(x, out var buffer);\n            return buffer.GetUtf8Bytes();\n        }\n\n        public static byte[] Grisu3GetBytes(float x)\n        {\n            DoubleConversion.ToString(x, out var buffer);\n            return buffer.GetUtf8Bytes();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Grisu3DoubleConversion/DoubleConversionTest.cs",
    "content": "﻿//#define VERBOSE\n\nusing System;\nusing System.Linq;\n\nnamespace Grisu3DoubleConversion\n{\n    class DoubleConversionTest\n    {\n        public static void Test()\n        {\n#if VERBOSE\n            const int N = 100;\n#else\n            const int N = 100_000;\n#endif\n            var data = new TestData(N);\n\n            foreach (var x in data.DoubleValues) Test(x);\n            foreach (var x in data.SingleValues) Test(x);\n        }\n\n        private static void WriteLine((string, string) x)\n        {\n#if VERBOSE\n            Console.WriteLine(x);\n#endif\n        }\n\n        private static void Test(double x)\n        {\n            DoubleConversion.ToString(x, out var buffer);\n            WriteLine((x.ToString(), buffer.ToString()));\n\n            var xs = x.ToString();\n            var ys = buffer.ToString();\n\n            if (xs.Contains('E') != ys.Contains('E')) throw new Exception();\n\n            var y = double.Parse(ys);\n            var diff = Math.Abs((x - y) / x);\n            if (diff > 1E-15) throw new Exception();\n        }\n\n        private static void Test(float x)\n        {\n            DoubleConversion.ToString(x, out var buffer);\n            WriteLine((x.ToString(), buffer.ToString()));\n\n            var xs = x.ToString();\n            var ys = buffer.ToString();\n\n            if(xs.Contains('E') != ys.Contains('E')) throw new Exception();\n\n            var y = float.Parse(ys);\n            var diff = Math.Abs((x - y) / x);\n            if (diff > 2E-7) throw new Exception();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Grisu3DoubleConversion/DoubleView.cs",
    "content": "﻿using System.Diagnostics;\nusing System.Runtime.InteropServices;\n\nnamespace Grisu3DoubleConversion\n{\n    /// <summary>\n    /// https://github.com/google/double-conversion/blob/master/double-conversion/ieee.h\n    /// </summary>\n    public struct DoubleView\n    {\n        private static unsafe ulong BitCast(double x) => *(ulong*)&x;\n        private static unsafe double BitCast(ulong x) => *(double*)&x;\n\n        public const ulong kSignMask = 0x80000000_00000000UL;\n        public const ulong kExponentMask = 0x7FF00000_00000000UL;\n        public const ulong kSignificandMask = 0x000FFFFF_FFFFFFFFUL;\n        public const ulong kHiddenBit = 0x00100000_00000000UL;\n        public const int kPhysicalSignificandSize = 52;  // Excludes the hidden bit.\n        public const int kSignificandSize = 53;\n        private const int kExponentBias = 0x3FF + kPhysicalSignificandSize;\n        private const int kDenormalExponent = -kExponentBias + 1;\n        private const int kMaxExponent = 0x7FF - kExponentBias;\n        private const ulong kInfinity = 0x7FF00000_00000000UL;\n        private const ulong kNaN = 0x7FF80000_00000000UL;\n\n        private ulong _v;\n\n        public DoubleView(double v) => _v = BitCast(v);\n\n        public double Value => BitCast(_v);\n\n        public ulong Significand\n        {\n            get\n            {\n                ulong significand = _v & kSignificandMask;\n                if (!IsDenormal)\n                {\n                    return significand + kHiddenBit;\n                }\n                else\n                {\n                    return significand;\n                }\n            }\n        }\n\n        public int Exponent\n        {\n            get\n            {\n                if (IsDenormal) return kDenormalExponent;\n\n                int biased_e =\n                    (int)((_v & kExponentMask) >> kPhysicalSignificandSize);\n                return biased_e - kExponentBias;\n            }\n        }\n\n        public bool IsDenormal => (_v & kExponentMask) == 0;\n\n        public bool IsSpecial => (_v & kExponentMask) == kExponentMask;\n\n        public bool IsNan => ((_v & kExponentMask) == kExponentMask) && ((_v & kSignificandMask) != 0);\n\n        public bool IsInfinite => ((_v & kExponentMask) == kExponentMask) && ((_v & kSignificandMask) == 0);\n\n        public int Sign => (_v & kSignMask) == 0 ? 1 : -1;\n\n        public DiyFp AsNormalizedDiyFp()\n        {\n            Debug.Assert(Value > 0.0);\n            ulong f = Significand;\n            int e = Exponent;\n\n            // The current double could be a denormal.\n            while ((f & kHiddenBit) == 0)\n            {\n                f <<= 1;\n                e--;\n            }\n            // Do the final shifts in one go.\n            f <<= DiyFp.SignificandSize - kSignificandSize;\n            e -= DiyFp.SignificandSize - kSignificandSize;\n            return new DiyFp(f, e);\n        }\n\n        public DiyFp AsDiyFp()\n        {\n            Debug.Assert(Sign > 0);\n            Debug.Assert(!IsSpecial);\n            return new DiyFp(Significand, Exponent);\n        }\n\n        public void NormalizedBoundaries(out DiyFp out_m_minus, out DiyFp out_m_plus)\n        {\n            Debug.Assert(Value > 0.0);\n            DiyFp v = AsDiyFp();\n            DiyFp m_plus = DiyFp.Normalize(new DiyFp((v.F << 1) + 1, v.E - 1));\n            DiyFp m_minus;\n            if (LowerBoundaryIsCloser())\n            {\n                m_minus = new DiyFp((v.F << 2) - 1, v.E - 2);\n            }\n            else\n            {\n                m_minus = new DiyFp((v.F << 1) - 1, v.E - 1);\n            }\n\n            m_minus.F = m_minus.F << (m_minus.E - m_plus.E);\n            m_minus.E = m_plus.E;\n\n            out_m_plus = m_plus;\n            out_m_minus = m_minus;\n        }\n\n        bool LowerBoundaryIsCloser()\n        {\n            bool physical_significand_is_zero = ((_v & kSignificandMask) == 0);\n            return physical_significand_is_zero && (Exponent != kDenormalExponent);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Grisu3DoubleConversion/FastDtoaMode.cs",
    "content": "﻿namespace Grisu3DoubleConversion\n{\n    public enum FastDtoaMode\n    {\n        // Computes the shortest representation of the given input. The returned\n        // result will be the most accurate number of this length. Longer\n        // representations might be more accurate.\n        FAST_DTOA_SHORTEST,\n        // Same as FAST_DTOA_SHORTEST but for single-precision floats.\n        FAST_DTOA_SHORTEST_SINGLE,\n        // Computes a representation where the precision (number of digits) is\n        // given as input. The precision is independent of the decimal point.\n        FAST_DTOA_PRECISION\n    };\n}"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Grisu3DoubleConversion/Grisu3DoubleConversion.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.9\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview2-25405-01\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Grisu3DoubleConversion/NumberStringBuffer.cs",
    "content": "﻿using System;\nusing System.Text;\n\nnamespace Grisu3DoubleConversion\n{\n    public unsafe struct NumberStringBuffer\n    {\n        public const int MaxDigits = 17; // IEEE 754 double presicion floating point\n\n        public short DecimalExponent;\n        public byte Length;\n\n        public bool IsNegative;\n        public bool IsSinglePrecision;\n        public bool IsInfinity;\n        public bool IsNaN;\n\n        public static NumberStringBuffer PositiveInfinity => new NumberStringBuffer { IsInfinity = true };\n        public static NumberStringBuffer NegativeInfinity => new NumberStringBuffer { IsNegative = true, IsInfinity = true };\n        public static NumberStringBuffer NaN => new NumberStringBuffer { IsNaN = true };\n        public static NumberStringBuffer Zero\n        {\n            get\n            {\n                var buf = default(NumberStringBuffer);\n                buf.Digits[0] = (byte)'0';\n                buf.Length = 1;\n                return buf;\n            }\n        }\n\n        public fixed byte Digits[MaxDigits];\n\n        public byte[] GetUtf8Bytes()\n        {\n            var buffer = stackalloc byte[MaxDigits + 7]; // '-' \"Digits\"(max = 17) '.' 'E' '-' \"Exponent\"(max = 3)\n            var length = Format(buffer);\n\n            var a = new byte[length];\n            fixed(byte* pa = a) Buffer.MemoryCopy(buffer, pa, length, length);\n            return a;\n        }\n\n        public override string ToString()\n        {\n            var buffer = stackalloc byte[MaxDigits + 7]; // '-' \"Digits\"(max = 17) '.' 'E' '-' \"Exponent\"(max = 3)\n            var length = Format(buffer);\n            return Encoding.UTF8.GetString(buffer, length);\n        }\n\n        private int Format(byte* buffer)\n        {\n            var exp = Length + DecimalExponent;\n\n            if (exp > 0 && exp <= (IsSinglePrecision ? 7 : 15))\n            {\n                return FormatPositiveExp(buffer);\n            }\n            else if (exp <= 0 && exp > -4)\n            {\n                return FormatNegativeExp(buffer);\n            }\n\n            return FormatScientific(buffer);\n        }\n\n        private int FormatPositiveExp(byte* buffer)\n        {\n            var pb = buffer;\n\n            if (IsNegative)\n            {\n                *(pb++) = (byte)'-';\n            }\n\n            fixed (byte* fd = Digits)\n            {\n                var pd = fd;\n\n                int posLength = Length;\n                if (DecimalExponent < 0) posLength += DecimalExponent;\n\n                for (int i = 0; i < posLength; i++) *(pb++) = *(pd++);\n                for (int i = 0; i < DecimalExponent; i++) *(pb++) = (byte)'0';\n\n                if (DecimalExponent < 0)\n                {\n                    *(pb++) = (byte)'.';\n                    for (int i = DecimalExponent; i < 0; i++) *(pb++) = *(pd++);\n                }\n            }\n\n            int length = (int)(pb - buffer);\n            return length;\n        }\n\n        private int FormatNegativeExp(byte* buffer)\n        {\n            var pb = buffer;\n\n            if (IsNegative)\n            {\n                *(pb++) = (byte)'-';\n            }\n\n            *(pb++) = (byte)'0';\n            *(pb++) = (byte)'.';\n\n            var exp = Length + DecimalExponent;\n\n            for (int i = 0; i < -exp; i++)\n            {\n                *(pb++) = (byte)'0';\n            }\n\n            fixed (byte* fd = Digits)\n            {\n                var pd = fd;\n\n                for (int i = 0; i < Length; i++)\n                {\n                    *(pb++) = *(pd++);\n                }\n            }\n\n            int length = (int)(pb - buffer);\n            return length;\n        }\n\n        private int FormatScientific(byte* buffer)\n        {\n            var pb = buffer;\n\n            if (IsNegative)\n            {\n                *(pb++) = (byte)'-';\n            }\n\n            if(IsInfinity)\n            {\n                *(pb++) = 226;\n                *(pb++) = 136;\n                *(pb++) = 158;\n                goto END;\n            }\n            else if (IsNaN)\n            {\n                *(pb++) = 78;\n                *(pb++) = 97;\n                *(pb++) = 78;\n                goto END;\n            }\n\n            fixed (byte* fd = Digits)\n            {\n                var pd = fd;\n                var last = fd + Length;\n\n                *(pb++) = *(pd++);\n\n                if (Length > 1)\n                {\n                    *(pb++) = (byte)'.';\n\n                    while (pd != last) *(pb++) = *(pd++);\n                }\n\n                var exp = Length + DecimalExponent - 1;\n                if (exp != 0)\n                {\n                    *(pb++) = (byte)'E';\n\n                    if (exp < 0)\n                    {\n                        *(pb++) = (byte)'-';\n                        exp = -exp;\n                    }\n                    else\n                    {\n                        *(pb++) = (byte)'+';\n                    }\n\n                    if (exp >= 100)\n                    {\n                        *(pb++) = (byte)(exp / 100 + '0');\n                        exp %= 100;\n                    }\n\n                    *(pb++) = (byte)(exp / 10 + '0');\n                    exp %= 10;\n                    *(pb++) = (byte)(exp + '0');\n                }\n            }\n\n            END:\n            int length = (int)(pb - buffer);\n            return length;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Grisu3DoubleConversion/PowersOfTenCache.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\n\nnamespace Grisu3DoubleConversion\n{\n    public class PowersOfTenCache\n    {\n        private static readonly (ulong significand, int binary_exponent, int decimal_exponent)[] kCachedPowers = new(ulong, int, int)[]\n        {\n            (0xfa8fd5a0_081c0288UL, -1220, -348),\n            (0xbaaee17f_a23ebf76UL, -1193, -340),\n            (0x8b16fb20_3055ac76UL, -1166, -332),\n            (0xcf42894a_5dce35eaUL, -1140, -324),\n            (0x9a6bb0aa_55653b2dUL, -1113, -316),\n            (0xe61acf03_3d1a45dfUL, -1087, -308),\n            (0xab70fe17_c79ac6caUL, -1060, -300),\n            (0xff77b1fc_bebcdc4fUL, -1034, -292),\n            (0xbe5691ef_416bd60cUL, -1007, -284),\n            (0x8dd01fad_907ffc3cUL, -980, -276),\n            (0xd3515c28_31559a83UL, -954, -268),\n            (0x9d71ac8f_ada6c9b5UL, -927, -260),\n            (0xea9c2277_23ee8bcbUL, -901, -252),\n            (0xaecc4991_4078536dUL, -874, -244),\n            (0x823c1279_5db6ce57UL, -847, -236),\n            (0xc2109436_4dfb5637UL, -821, -228),\n            (0x9096ea6f_3848984fUL, -794, -220),\n            (0xd77485cb_25823ac7UL, -768, -212),\n            (0xa086cfcd_97bf97f4UL, -741, -204),\n            (0xef340a98_172aace5UL, -715, -196),\n            (0xb23867fb_2a35b28eUL, -688, -188),\n            (0x84c8d4df_d2c63f3bUL, -661, -180),\n            (0xc5dd4427_1ad3cdbaUL, -635, -172),\n            (0x936b9fce_bb25c996UL, -608, -164),\n            (0xdbac6c24_7d62a584UL, -582, -156),\n            (0xa3ab6658_0d5fdaf6UL, -555, -148),\n            (0xf3e2f893_dec3f126UL, -529, -140),\n            (0xb5b5ada8_aaff80b8UL, -502, -132),\n            (0x87625f05_6c7c4a8bUL, -475, -124),\n            (0xc9bcff60_34c13053UL, -449, -116),\n            (0x964e858c_91ba2655UL, -422, -108),\n            (0xdff97724_70297ebdUL, -396, -100),\n            (0xa6dfbd9f_b8e5b88fUL, -369, -92),\n            (0xf8a95fcf_88747d94UL, -343, -84),\n            (0xb9447093_8fa89bcfUL, -316, -76),\n            (0x8a08f0f8_bf0f156bUL, -289, -68),\n            (0xcdb02555_653131b6UL, -263, -60),\n            (0x993fe2c6_d07b7facUL, -236, -52),\n            (0xe45c10c4_2a2b3b06UL, -210, -44),\n            (0xaa242499_697392d3UL, -183, -36),\n            (0xfd87b5f2_8300ca0eUL, -157, -28),\n            (0xbce50864_92111aebUL, -130, -20),\n            (0x8cbccc09_6f5088ccUL, -103, -12),\n            (0xd1b71758_e219652cUL, -77, -4),\n            (0x9c400000_00000000UL, -50, 4),\n            (0xe8d4a510_00000000UL, -24, 12),\n            (0xad78ebc5_ac620000UL, 3, 20),\n            (0x813f3978_f8940984UL, 30, 28),\n            (0xc097ce7b_c90715b3UL, 56, 36),\n            (0x8f7e32ce_7bea5c70UL, 83, 44),\n            (0xd5d238a4_abe98068UL, 109, 52),\n            (0x9f4f2726_179a2245UL, 136, 60),\n            (0xed63a231_d4c4fb27UL, 162, 68),\n            (0xb0de6538_8cc8ada8UL, 189, 76),\n            (0x83c7088e_1aab65dbUL, 216, 84),\n            (0xc45d1df9_42711d9aUL, 242, 92),\n            (0x924d692c_a61be758UL, 269, 100),\n            (0xda01ee64_1a708deaUL, 295, 108),\n            (0xa26da399_9aef774aUL, 322, 116),\n            (0xf209787b_b47d6b85UL, 348, 124),\n            (0xb454e4a1_79dd1877UL, 375, 132),\n            (0x865b8692_5b9bc5c2UL, 402, 140),\n            (0xc83553c5_c8965d3dUL, 428, 148),\n            (0x952ab45c_fa97a0b3UL, 455, 156),\n            (0xde469fbd_99a05fe3UL, 481, 164),\n            (0xa59bc234_db398c25UL, 508, 172),\n            (0xf6c69a72_a3989f5cUL, 534, 180),\n            (0xb7dcbf53_54e9beceUL, 561, 188),\n            (0x88fcf317_f22241e2UL, 588, 196),\n            (0xcc20ce9b_d35c78a5UL, 614, 204),\n            (0x98165af3_7b2153dfUL, 641, 212),\n            (0xe2a0b5dc_971f303aUL, 667, 220),\n            (0xa8d9d153_5ce3b396UL, 694, 228),\n            (0xfb9b7cd9_a4a7443cUL, 720, 236),\n            (0xbb764c4c_a7a44410UL, 747, 244),\n            (0x8bab8eef_b6409c1aUL, 774, 252),\n            (0xd01fef10_a657842cUL, 800, 260),\n            (0x9b10a4e5_e9913129UL, 827, 268),\n            (0xe7109bfb_a19c0c9dUL, 853, 276),\n            (0xac2820d9_623bf429UL, 880, 284),\n            (0x80444b5e_7aa7cf85UL, 907, 292),\n            (0xbf21e440_03acdd2dUL, 933, 300),\n            (0x8e679c2f_5e44ff8fUL, 960, 308),\n            (0xd433179d_9c8cb841UL, 986, 316),\n            (0x9e19db92_b4e31ba9UL, 1013, 324),\n            (0xeb96bf6e_badf77d9UL, 1039, 332),\n            (0xaf87023b_9bf0ee6bUL, 1066, 340),\n        };\n\n        private const int kCachedPowersOffset = 348;  // -1 * the first decimal_exponent.\n        private const double kD_1_LOG2_10 = 0.30102999566398114;  //  1 / lg(10)\n                                                                  // Difference between the decimal exponents in the table above.\n        const int kDecimalExponentDistance = 8;\n        const int kMinDecimalExponent = -348;\n        const int kMaxDecimalExponent = 340;\n\n        public static void GetCachedPowerForBinaryExponentRange(\n            int min_exponent,\n            int max_exponent,\n            out DiyFp power,\n            out int decimal_exponent)\n        {\n            int kQ = DiyFp.SignificandSize;\n            double k = Math.Ceiling((min_exponent + kQ - 1) * kD_1_LOG2_10);\n            int foo = kCachedPowersOffset;\n            int index =\n                (foo + (int)(k) - 1) / kDecimalExponentDistance + 1;\n            Debug.Assert(0 <= index && index < kCachedPowers.Length);\n            var cached_power = kCachedPowers[index];\n            Debug.Assert(min_exponent <= cached_power.binary_exponent);\n            //(void)max_exponent;  // Mark variable as used.\n            Debug.Assert(cached_power.binary_exponent <= max_exponent);\n            decimal_exponent = cached_power.decimal_exponent;\n            power = new DiyFp(cached_power.significand, cached_power.binary_exponent);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Grisu3DoubleConversion/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace Grisu3DoubleConversion\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            //DoubleConversionTest.Test();\n\n#if tru\n            var x = new DoubleConversionBenchmark();\n            x.Setup();\n            x.SystemToString();\n            x.SystemGetBytes();\n            x.Grisu3ToString();\n            x.Grisu3GetBytes();\n#else\n            BenchmarkRunner.Run<DoubleConversionBenchmark>();\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Grisu3DoubleConversion/SingleView.cs",
    "content": "﻿using System.Diagnostics;\n\nnamespace Grisu3DoubleConversion\n{\n    /// <summary>\n    /// https://github.com/google/double-conversion/blob/master/double-conversion/ieee.h\n    /// </summary>\n    public struct SingleView\n    {\n        private static unsafe uint BitCast(float x) => *(uint*)&x;\n        private static unsafe float BitCast(uint x) => *(float*)&x;\n\n        public const uint kSignMask = 0x80000000;\n        public const uint kExponentMask = 0x7F800000;\n        public const uint kSignificandMask = 0x007FFFFF;\n        public const uint kHiddenBit = 0x00800000;\n        public const int kPhysicalSignificandSize = 23;  // Excludes the hidden bit.\n        public const int kSignificandSize = 24;\n        private const int kExponentBias = 0x7F + kPhysicalSignificandSize;\n        private const int kDenormalExponent = -kExponentBias + 1;\n        private const int kMaxExponent = 0xFF - kExponentBias;\n        private const uint kInfinity = 0x7F800000;\n        private const uint kNaN = 0x7FC00000;\n\n        private uint _v;\n\n        public SingleView(float v) => _v = BitCast(v);\n\n        public float Value => BitCast(_v);\n\n        public ulong Significand\n        {\n            get\n            {\n                uint significand = _v & kSignificandMask;\n                if (!IsDenormal)\n                {\n                    return significand + kHiddenBit;\n                }\n                else\n                {\n                    return significand;\n                }\n            }\n        }\n\n        public int Exponent\n        {\n            get\n            {\n                if (IsDenormal) return kDenormalExponent;\n\n                int biased_e =\n                    (int)((_v & kExponentMask) >> kPhysicalSignificandSize);\n                return biased_e - kExponentBias;\n            }\n        }\n\n        public bool IsDenormal => (_v & kExponentMask) == 0;\n\n        public bool IsSpecial => (_v & kExponentMask) == kExponentMask;\n\n        public bool IsNan => ((_v & kExponentMask) == kExponentMask) && ((_v & kSignificandMask) != 0);\n\n        public bool IsInfinite => ((_v & kExponentMask) == kExponentMask) && ((_v & kSignificandMask) == 0);\n\n        public int Sign => (_v & kSignMask) == 0 ? 1 : -1;\n\n        public DiyFp AsNormalizedDiyFp()\n        {\n            Debug.Assert(Value > 0.0);\n            ulong f = Significand;\n            int e = Exponent;\n\n            // The current double could be a denormal.\n            while ((f & kHiddenBit) == 0)\n            {\n                f <<= 1;\n                e--;\n            }\n            // Do the final shifts in one go.\n            f <<= DiyFp.SignificandSize - kSignificandSize;\n            e -= DiyFp.SignificandSize - kSignificandSize;\n            return new DiyFp(f, e);\n        }\n\n        public DiyFp AsDiyFp()\n        {\n            Debug.Assert(Sign > 0);\n            Debug.Assert(!IsSpecial);\n            return new DiyFp(Significand, Exponent);\n        }\n\n        public void NormalizedBoundaries(out DiyFp out_m_minus, out DiyFp out_m_plus)\n        {\n            Debug.Assert(Value > 0.0);\n            DiyFp v = AsDiyFp();\n            DiyFp m_plus = DiyFp.Normalize(new DiyFp((v.F << 1) + 1, v.E - 1));\n            DiyFp m_minus;\n            if (LowerBoundaryIsCloser())\n            {\n                m_minus = new DiyFp((v.F << 2) - 1, v.E - 2);\n            }\n            else\n            {\n                m_minus = new DiyFp((v.F << 1) - 1, v.E - 1);\n            }\n\n            m_minus.F = m_minus.F << (m_minus.E - m_plus.E);\n            m_minus.E = m_plus.E;\n\n            out_m_plus = m_plus;\n            out_m_minus = m_minus;\n        }\n\n        bool LowerBoundaryIsCloser()\n        {\n            bool physical_significand_is_zero = ((_v & kSignificandMask) == 0);\n            return physical_significand_is_zero && (Exponent != kDenormalExponent);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Grisu3DoubleConversion/TestData.cs",
    "content": "﻿using System;\n\nnamespace Grisu3DoubleConversion\n{\n    class TestData\n    {\n        public double[] DoubleValues;\n        public float[] SingleValues;\n\n        public TestData(int n)\n        {\n            var r = new Random();\n\n            var x = new double[3 * n + 1];\n            x[0] = 2e15;\n            var i = 1;\n            for (; i <= n; i++) x[i] = r.Next() * Math.Pow(10, r.Next(1, 15));\n            for (; i <= 2 * n; i++) x[i] = (2 * r.NextDouble() - 1) * Math.Pow(10, r.Next(-300, 300));\n            for (; i <= 3 * n; i++) x[i] = (2 * r.NextDouble() - 1) * Math.Pow(10, r.Next(-5, 15));\n            DoubleValues = x;\n\n            var y = new float[3 * n + 1];\n            y[0] = 2e7f;\n            i = 1;\n            for (; i <= n; i++) y[i] = (float)(r.Next() * Math.Pow(10, r.Next(1, 7)));\n            for (; i <= 2 * n; i++) y[i] = (float)((2 * r.NextDouble() - 1) * Math.Pow(10, r.Next(-35, 35)));\n            for (; i <= 3 * n; i++) y[i] = (float)((2 * r.NextDouble() - 1) * Math.Pow(10, r.Next(-5, 7)));\n            SingleValues = y;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/OptionalArrayBenchmark/BitArray64.cs",
    "content": "﻿struct BitArray64\n{\n    long _bits;\n\n    public bool this[int index]\n    {\n        get => (_bits & (1L << index)) != 0L;\n        set\n        {\n            if (value) _bits |= (1L << index);\n            else _bits &= ~(1L << index);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/OptionalArrayBenchmark/Optional.cs",
    "content": "﻿using System;\n\nstruct Optional<T>\n{\n    public bool HasValue { get; }\n    private T _value;\n\n    internal Optional(T value, bool hasValue)\n    {\n        _value = value;\n        HasValue = hasValue;\n    }\n    public Optional(T value) : this(value, true) { }\n    public static readonly Optional<T> None = default(Optional<T>);\n\n    public T Value => HasValue ? _value : throw new NullReferenceException();\n    public T GetValueOrDefault() => _value;\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/OptionalArrayBenchmark/OptionalArray.cs",
    "content": "﻿#define USE_BITARRAY64\n\nusing System;\nusing System.Collections.Generic;\nusing System.Collections;\n\n#if USE_BITARRAY64\nusing BitArray = BitArray64;\n#else\nusing BitArray = System.Collections.BitArray;\n#endif\n\nstruct OptionalArray<T> : IReadOnlyList<Optional<T>>\n{\n    private T[] _array;\n    private BitArray _hasValue;\n\n    public OptionalArray(int length)\n    {\n        _array = new T[length];\n#if USE_BITARRAY64\n        _hasValue = new BitArray();\n#else\n        _hasValue = new BitArray(length);\n#endif\n    }\n\n    public Optional<T> this[int index]\n    {\n        get => new Optional<T>(_array[index], _hasValue[index]);\n        set\n        {\n            _array[index] = value.GetValueOrDefault();\n            _hasValue[index] = value.HasValue;\n        }\n    }\n\n    public int Length => _array.Length;\n    int IReadOnlyCollection<Optional<T>>.Count => _array.Length;\n\n    public OptionalArrayEnumerator GetEnumerator() => new OptionalArrayEnumerator(_array, _hasValue);\n    IEnumerator<Optional<T>> IEnumerable<Optional<T>>.GetEnumerator() => GetEnumerator();\n    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n\n    public struct OptionalArrayEnumerator : IEnumerator<Optional<T>>\n    {\n        private T[] _array;\n        private BitArray _hasValue;\n        private int _index;\n\n        public OptionalArrayEnumerator(T[] array, BitArray hasValue) : this()\n        {\n            _array = array;\n            _hasValue = hasValue;\n            _index = -1;\n        }\n\n        public Optional<T> Current => new Optional<T>(_array[_index], _hasValue[_index]);\n        public bool MoveNext()\n        {\n            // 速度 >> 安全性 な実装\n            _index++;\n            return _index < _array.Length;\n        }\n\n        object IEnumerator.Current => Current;\n        public void Dispose() { }\n        public void Reset() => throw new NotImplementedException();\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/OptionalArrayBenchmark/OptionalArrayBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System;\n\n/// <summary>\n/// <see cref=\"Nullable{T}\"/>とか<see cref=\"Optional{T}\"/>みたいな型は、(bool, T) のペアなわけだけど、\n/// アラインメントのためにたかが bool 1個のために数バイト(例えば T が参照型だった場合、T が8バイト、それに合せるために bool も8バイト)使っちゃう。\n/// それを配列で持つとなるとちょっと無駄が多すぎる。\n///\n/// なので、<see cref=\"OptionalArray{T}\"/>みたいな型を用意。\n/// ただの T の配列 + bool を1か所で管理。\n/// で、<see cref=\"Optional{T}\"/>の配列と、その<see cref=\"OptionalArray{T}\"/>の列挙の速度比較をしたい。\n///\n///  Method |     Mean |     Error |    StdDev |  Gen 0 | Allocated |\n/// ------- |---------:|----------:|----------:|-------:|----------:|\n///       A | 2.555 us | 0.0172 us | 0.0144 us | 0.2518 |    1072 B |\n///       B | 2.605 us | 0.0126 us | 0.0118 us | 0.1602 |     688 B |\n///\n/// 思ったよりも <see cref=\"OptionalArray{T}\"/> のペナルティなさそう？\n/// ヒープ確保量は想定通り、ほぼ半減。\n/// \n/// ちなみに、<see cref=\"BitArray64\"/>をクラスに変更\n///       B | 2.916 us | 0.0102 us | 0.0091 us | 0.1678 |     712 B |\n///\n/// <see cref=\"BitArray64\"/>を<see cref=\"System.Collections.BitArray\"/>に変更\n///  Method |     Mean |     Error |    StdDev |  Gen 0 | Allocated |\n///       B | 3.306 us | 0.0215 us | 0.0201 us | 0.1793 |     760 B |\n/// ちょっとコスト高かなぁ…\n///\n/// それでも<see cref=\"OptionalArray{T}\"/>のメリットは、配列の共変性をそのまま享受できる点。\n/// <see cref=\"Optional{T}\"/>の配列を作ると無理。\n/// </summary>\n[MemoryDiagnoser]\npublic class OptionalArrayBenchmark\n{\n    const int Seed = 12345678;\n    const int Length = 48;\n\n    [Benchmark]\n    public double A()\n    {\n        var r = new Random();\n        var array = new Optional<double>[Length];\n        for (int i = 0; i < array.Length; i++)\n        {\n            array[i] = r.NextDouble() < 0.1 ? Optional<double>.None : new Optional<double>(r.NextDouble());\n        }\n\n        var sum = 0.0;\n\n        for (int i = 0; i < array.Length; i++)\n        {\n            var x = array[i];\n            if (x.HasValue) sum += x.GetValueOrDefault();\n        }\n        foreach (var x in array)\n        {\n            if (x.HasValue) sum += x.GetValueOrDefault();\n        }\n        return sum;\n    }\n\n    [Benchmark]\n    public double B()\n    {\n        var r = new Random();\n        var array = new OptionalArray<double>(Length);\n        for (int i = 0; i < array.Length; i++)\n        {\n            array[i] = r.NextDouble() < 0.1 ? Optional<double>.None : new Optional<double>(r.NextDouble());\n        }\n\n        var sum = 0.0;\n\n        for (int i = 0; i < array.Length; i++)\n        {\n            var x = array[i];\n            if (x.HasValue) sum += x.GetValueOrDefault();\n        }\n        foreach (var x in array)\n        {\n            if (x.HasValue) sum += x.GetValueOrDefault();\n        }\n        return sum;\n    }\n}"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/OptionalArrayBenchmark/OptionalArrayBenchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.9\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview2-25405-01\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/OptionalArrayBenchmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        BenchmarkRunner.Run<OptionalArrayBenchmark>();\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/ParseIntBnechmark/ParseIntBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System;\nusing System.Runtime.CompilerServices;\nusing System.Text;\n\n/// <summary>\n/// UTF8 エンコード結果の byte[] から Int.Parse したいとき用。\n/// int.Parse(UTF8.GetString(data))とかアロケーション多すぎなので避けたい。\n/// なので byte 列操作を直接やるんだけど、単純に for で回すべきか、展開すべきか。\n///\n///  Method |     Mean |     Error |    StdDev | Allocated |\n/// ------- |---------:|----------:|----------:|----------:|\n///       A | 1.357 us | 0.0203 us | 0.0190 us |       0 B |\n///       B | 1.470 us | 0.0062 us | 0.0058 us |       0 B |\n///       C | 1.373 us | 0.0178 us | 0.0166 us |       0 B |\n///       D | 1.289 us | 0.0063 us | 0.0056 us |       0 B |\n///       E | 2.728 us | 0.0298 us | 0.0278 us |       0 B |\n///\n/// この程度の処理なら simple is the best 感強い。\n/// </summary>\n[MemoryDiagnoser]\npublic class ParseIntBenchmark\n{\n    const int N = 128;\n    byte[][] data;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        var r = new Random();\n        data = new byte[N][];\n\n        for (int i = 0; i < data.Length; i++)\n        {\n            var x = r.Next();\n            data[i] = Encoding.ASCII.GetBytes(x.ToString());\n        }\n    }\n\n    [Benchmark] public void A() { foreach (var x in data) ParseA(x); }\n    [Benchmark] public void B() { foreach (var x in data) ParseB(x); }\n    [Benchmark] public void C() { foreach (var x in data) ParseC(x); }\n    [Benchmark] public void D() { foreach (var x in data) ParseD(x); }\n    [Benchmark] public void E() { foreach (var x in data) ParseE(x); }\n\n    public static int ParseA(byte[] b)\n    {\n        int x = 0;\n        for (int i = 0; i < b.Length; i++)\n        {\n            x *= 10;\n            x += b[i] - Zero;\n        }\n        return x;\n    }\n\n    private const byte Zero = (byte)'0';\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static int ParseB(byte[] b)\n    {\n        switch (b.Length)\n        {\n            case 1: return (b[0] - Zero);\n            case 2: return (b[0] - Zero) * 10 + (b[1] - Zero);\n            case 3: return (b[0] - Zero) * 100 + (b[1] - Zero) * 10 + (b[2] - Zero);\n            case 4: return (b[0] - Zero) * 1000 + (b[1] - Zero) * 100 + (b[2] - Zero) * 10 + (b[3] - Zero);\n            case 5: return (b[0] - Zero) * 10000 + (b[1] - Zero) * 1000 + (b[2] - Zero) * 100 + (b[3] - Zero) * 10 + (b[4] - Zero);\n            case 6: return (b[0] - Zero) * 100000 + (b[1] - Zero) * 10000 + (b[2] - Zero) * 1000 + (b[3] - Zero) * 100 + (b[4] - Zero) * 10 + (b[5] - Zero);\n            case 7: return (b[0] - Zero) * 1000000 + (b[1] - Zero) * 100000 + (b[2] - Zero) * 10000 + (b[3] - Zero) * 1000 + (b[4] - Zero) * 100 + (b[5] - Zero) * 10 + (b[6] - Zero);\n            case 8: return (b[0] - Zero) * 10000000 + (b[1] - Zero) * 1000000 + (b[2] - Zero) * 100000 + (b[3] - Zero) * 10000 + (b[4] - Zero) * 1000 + (b[5] - Zero) * 100 + (b[6] - Zero) * 10 + (b[7] - Zero);\n            case 9: return (b[0] - Zero) * 100000000 + (b[1] - Zero) * 10000000 + (b[2] - Zero) * 1000000 + (b[3] - Zero) * 100000 + (b[4] - Zero) * 10000 + (b[5] - Zero) * 1000 + (b[6] - Zero) * 100 + (b[7] - Zero) * 10 + (b[8] - Zero);\n            case 10: return (b[0] - Zero) * 1000000000 + (b[1] - Zero) * 100000000 + (b[2] - Zero) * 10000000 + (b[3] - Zero) * 1000000 + (b[4] - Zero) * 100000 + (b[5] - Zero) * 10000 + (b[6] - Zero) * 1000 + (b[7] - Zero) * 100 + (b[8] - Zero) * 10 + (b[9] - Zero);\n            default: throw new ArgumentException(\"Int32 out of range count\");\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static int ParseC(byte[] b)\n    {\n        switch (b.Length)\n        {\n            case 1: return (b[0] - Zero);\n            case 2: return 10 * (b[0] - Zero) + (b[1] - Zero);\n            case 3: return 10 * (10 * (b[0] - Zero) + (b[1] - Zero)) + (b[2] - Zero);\n            case 4: return 10 * (10 * (10 * (b[0] - Zero) + (b[1] - Zero)) + (b[2] - Zero)) + (b[3] - Zero);\n            case 5: return 10 * (10 * (10 * (10 * (b[0] - Zero) + (b[1] - Zero)) + (b[2] - Zero)) + (b[3] - Zero)) + (b[4] - Zero);\n            case 6: return 10 * (10 * (10 * (10 * (10 * (b[0] - Zero) + (b[1] - Zero)) + (b[2] - Zero)) + (b[3] - Zero)) + (b[4] - Zero)) + (b[5] - Zero);\n            case 7: return 10 * (10 * (10 * (10 * (10 * (10 * (b[0] - Zero) + (b[1] - Zero)) + (b[2] - Zero)) + (b[3] - Zero)) + (b[4] - Zero)) + (b[5] - Zero)) + (b[6] - Zero);\n            case 8: return 10 * (10 * (10 * (10 * (10 * (10 * (10 * (b[0] - Zero) + (b[1] - Zero)) + (b[2] - Zero)) + (b[3] - Zero)) + (b[4] - Zero)) + (b[5] - Zero)) + (b[6] - Zero)) + (b[7] - Zero);\n            case 9: return 10 * (10 * (10 * (10 * (10 * (10 * (10 * (10 * (b[0] - Zero) + (b[1] - Zero)) + (b[2] - Zero)) + (b[3] - Zero)) + (b[4] - Zero)) + (b[5] - Zero)) + (b[6] - Zero)) + (b[7] - Zero)) + (b[8] - Zero);\n            case 10: return 10 * (10 * (10 * (10 * (10 * (10 * (10 * (10 * (10 * (b[0] - Zero) + (b[1] - Zero)) + (b[2] - Zero)) + (b[3] - Zero)) + (b[4] - Zero)) + (b[5] - Zero)) + (b[6] - Zero)) + (b[7] - Zero)) + (b[8] - Zero)) + (b[9] - Zero);\n            default: throw new ArgumentException(\"Int32 out of range count\");\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static int ParseD(byte[] b)\n    {\n        switch (b.Length)\n        {\n            case 1: return (b[0] - Zero);\n            case 2: return 10 * (b[0] - Zero) + (b[1] - Zero);\n            case 3: return 10 * (10 * (b[0] - Zero) + (b[1] - Zero)) + (b[2] - Zero);\n            case 4: return 10 * (10 * (10 * (b[0] - Zero) + (b[1] - Zero)) + (b[2] - Zero)) + (b[3] - Zero);\n        }\n\n        int x = 0;\n        for (int i = 0; i < b.Length; i++)\n        {\n            x *= 10;\n            x += b[i] - Zero;\n        }\n        return x;\n    }\n\n    // '0' (U+30)を 8バイト並べたもの。\n    const ulong LongZero = 0x30303030_30303030;\n    const ushort ShortZero = 0x3030;\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public unsafe static int ParseE(byte[] b)\n    {\n        byte* buf = stackalloc byte[10];\n\n        fixed (byte* p = b)\n        {\n            *(ulong*)buf = *(ulong*)p - LongZero;\n            *(ushort*)(buf + 8) = (ushort)(*(ushort*)(p + 8) - ShortZero);\n        }\n\n        int x = 0;\n        for (int i = 0; i < b.Length; i++)\n        {\n            x = (x << 3) + (x << 1); // x * 10。C# はこの手の定数掛け算最適化してくれなかったと思うんで。\n            x += buf[i];\n        }\n        return x;\n    }\n}"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/ParseIntBnechmark/ParseIntBnechmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.9\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview2-25405-01\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/ParseIntBnechmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\nusing System;\nusing System.Text;\n\nclass Program\n{\n    static void Main()\n    {\n        Test();\n\n        BenchmarkRunner.Run<ParseIntBenchmark>();\n    }\n\n    private static void Test()\n    {\n        var r = new Random();\n\n        for (int i = 0; i < 128; i++)\n        {\n            var x = r.Next();\n            var str = Encoding.ASCII.GetBytes(x.ToString());\n\n            var a = ParseIntBenchmark.ParseA(str);\n            var b = ParseIntBenchmark.ParseB(str);\n            var c = ParseIntBenchmark.ParseC(str);\n            var d = ParseIntBenchmark.ParseC(str);\n            var e = ParseIntBenchmark.ParseE(str);\n\n            if (x != a) throw new Exception();\n            if (x != b) throw new Exception();\n            if (x != c) throw new Exception();\n            if (x != d) throw new Exception();\n            if (x != e) throw new Exception();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/SequenceBenchmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n#if tru\n        var x = new SequenceBenchmark();\n        x.Setup();\n        x.LinqSequenceEqual();\n        x.SpanSequenceEqual();\n#else\n        BenchmarkRunner.Run<SequenceBenchmark>();\n#endif\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/SequenceBenchmark/SequenceBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System;\nusing System.Linq;\n\n/// <summary>\n/// byte 列のsequence equalの速度。\n///\n///             Method |        Mean |     Error |    StdDev |  Gen 0 | Allocated |\n/// ------------------ |------------:|----------:|----------:|-------:|----------:|\n///  LinqSequenceEqual | 2,349.54 ns | 14.6437 ns | 13.6977 ns | 0.1640 |     704 B |\n///  SpanSequenceEqual |    65.60 ns |  0.1678 ns |  0.1310 ns |      - |       0 B |\n///    MySequenceEqual |   128.53 ns |  0.3044 ns |  0.2542 ns |      - |       0 B |\n///\n/// <see cref=\"IEnumerable{byte}\"/>越しの操作がものすごい遅いのはしょうがないとして、\n/// それを差し引いても<see cref=\"SpanExtensions.SequenceEqual(ReadOnlySpan{byte}, ReadOnlySpan{byte})\"/>が爆速すぎてビビる。\n/// </summary>\n[MemoryDiagnoser]\npublic class SequenceBenchmark\n{\n    const int M = 5;\n    const int N = 2000;\n    byte[][] items;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        var r = new Random();\n\n        items = new byte[M][];\n\n        for (int i = 0; i < items.Length; i++)\n        {\n            var len = 1 + r.Next(0, 5) + r.Next(0, 5) + r.Next(0, 5) + r.Next(0, 5) + r.Next(0, 5) + r.Next(0, 5);\n            var item = new byte[len];\n            for (int j = 0; j < item.Length; j++)\n            {\n                item[j] = (byte)r.Next(0, 256);\n            }\n            items[i] = item;\n        }\n    }\n\n    [Benchmark]\n    public void LinqSequenceEqual()\n    {\n        for (int i = 0; i < M; i++)\n            for (int j = 0; j < M; j++)\n            {\n                var a = items[i];\n                var b = items[j];\n\n                var x = i == j;\n                var y = Enumerable.SequenceEqual(a, b);\n\n                if (x != y) throw new Exception();\n            }\n    }\n\n    [Benchmark]\n    public void SpanSequenceEqual()\n    {\n        for (int i = 0; i < M; i++)\n            for (int j = 0; j < M; j++)\n            {\n                Span<byte> a = items[i];\n                Span<byte> b = items[j];\n\n                var x = i == j;\n                var y = SpanExtensions.SequenceEqual(a, b);\n\n                if (x != y) throw new Exception();\n            }\n    }\n\n    [Benchmark]\n    public void MySequenceEqual()\n    {\n        for (int i = 0; i < M; i++)\n            for (int j = 0; j < M; j++)\n            {\n                var a = items[i];\n                var b = items[j];\n\n                var x = i == j;\n                var y = MySequenceEqual(a, b);\n\n                if (x != y) throw new Exception();\n            }\n    }\n\n    private unsafe bool MySequenceEqual(byte[] a, byte[] b)\n    {\n        if (a.Length != b.Length) return false;\n\n        fixed (byte* pa = a)\n        fixed (byte* pb = b)\n            return MySequenceEqual(pa, pb, a.Length);\n    }\n\n    /// <summary>\n    /// <see cref=\"Span{T}\"/>が使えない環境向けに unsafe で自前実装。\n    /// </summary>\n    /// <remarks>\n    /// <see cref=\"SpanExtensions.SequenceEqual(Span{byte}, ReadOnlySpan{byte})\"/>は SIMD 命令とかまで使って相当最適化してあるので、正直勝つのは難しい。\n    /// あくまで、System.Memory パッケージが使えない環境向けの救済策。\n    /// </remarks>\n    private unsafe static bool MySequenceEqual(byte* first, byte* second, int length)\n    {\n        if (length < 0) throw new ArgumentException();\n\n        while (length >= 8)\n        {\n            if (*(ulong*)first != *(ulong*)second) return false;\n            length -= 8;\n            first += 8;\n            second += 8;\n        }\n        while (length >= 0)\n        {\n            if (*first != *second) return false;\n            --length;\n            first += 1;\n            second += 1;\n        }\n        return true;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/SequenceBenchmark/SequenceBenchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.9\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview2-25405-01\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/StackallocDistinctBenchmark/ArrayHashSet.cs",
    "content": "﻿using System.Collections.Generic;\n\n/// <summary>\n/// 比較用。\n/// <see cref=\"StackHashSet\"/>のほぼコピペ。\n/// stackalloc が new (普通に配列をヒープ確保)に変えただけ。\n/// <see cref=\"System.Linq.Enumerable.Distinct{TSource}(IEnumerable{TSource})\"/>は「配列とstackallocの比較」に使うには重たすぎるんで。\n/// </summary>\nstatic class ArrayHashSet\n{\n    public static T[] Distinct<T, TComp>(T[] items)\n        where TComp : struct, IEqualityComparer<T>\n    {\n        var len = StackHashSet.PowerOf2(items.Length * 2);\n        var buckets = new int[len];\n        var resultIndexes = new int[items.Length];\n\n        for (int i = 0; i < len; i++) buckets[i] = -1;\n\n        var mask = len - 1;\n        var count = 0;\n\n        for (int i = 0; i < items.Length; i++)\n        {\n            var item = items[i];\n\n            var hash = default(TComp).GetHashCode(item) & mask;\n\n            while (true)\n            {\n                ref var b = ref buckets[hash];\n\n                if (b == -1)\n                {\n                    resultIndexes[count] = i;\n                    count++;\n                    b = i;\n                    break;\n                }\n                else if (default(TComp).Equals(item, items[b]))\n                {\n                    break;\n                }\n\n                hash = (hash + StackHashSet.Skip) & mask;\n            }\n        }\n\n        var results = new T[count];\n        for (int i = 0; i < results.Length; i++) results[i] = items[resultIndexes[i]];\n        return results;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/StackallocDistinctBenchmark/DistinctBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System;\nusing System.Linq;\n\n/// <summary>\n/// いろんなベンチマーク取ってて至った境地が「stackalloc 強すぎ」だったので、\n/// 手段と目的を逆転させて stackalloc で何かできないか考えた結果。\n///\n/// サイズが最初からわかってる配列に対する Distinct を高速化できるんじゃないかと思ってやってみた。\n/// 原理は、stackalloc でスタック上にハッシュテーブルを構築して、それで重複チェック。\n/// (削除を考えなくていいハッシュテーブルは割とシンプルに書ける。)\n///\n/// stackalloc の性質上、\n/// - yield や await を挟めない(あくまで一括処理できるデータ列のみが対象)\n/// - あんまり大きな配列に対しては使えない(スタックオーバーフローを起こす)\n///\n/// 結果の一例:\n///\n///  Method |      Mean |     Error |    StdDev |   Gen 0 | Allocated |\n/// ------- |----------:|----------:|----------:|--------:|----------:|\n///   Linq0 | 33.216 us | 0.4380 us | 0.4097 us | 16.6626 |   70032 B |\n///   Linq1 | 32.803 us | 0.3541 us | 0.3312 us |  8.4839 |   35664 B |\n///   Linq2 | 18.743 us | 0.0964 us | 0.0902 us |  1.0986 |    4736 B |\n///   Linq3 | 17.365 us | 0.0765 us | 0.0678 us |  0.1526 |     672 B |\n///  Array0 |  4.652 us | 0.0356 us | 0.0333 us |  4.8981 |   20576 B |\n///  Array1 |  4.448 us | 0.0515 us | 0.0482 us |  4.1656 |   17504 B |\n///  Array2 |  3.285 us | 0.0119 us | 0.0099 us |  3.1395 |   13184 B |\n///  Array3 |  3.098 us | 0.0080 us | 0.0075 us |  2.9640 |   12464 B |\n///  Stack0 |  4.202 us | 0.0815 us | 0.0722 us |  1.9608 |    8240 B |\n///  Stack1 |  3.864 us | 0.0273 us | 0.0255 us |  1.2360 |    5200 B |\n///  Stack2 |  2.957 us | 0.0139 us | 0.0116 us |  0.1984 |     848 B |\n///  Stack3 |  2.716 us | 0.0133 us | 0.0104 us |  0.0229 |     128 B |\n///\n/// LINQ と自作のを比較してる。\n/// - Linq から始まるやつが <see cref=\"Enumerable.Distinct{TSource}(IEnumerable{TSource})\"/>を使ったもの。\n/// - Array から始まるやつは、長さが最初から分かってる前提で最適化実装したもの。ただし、一時バッファは配列(普通に new)。\n/// - Stack から始まるやつが今回の主役の stackalloc版。new が stackalloc に変わった以外は Array と同じ。\n///\n/// Distinct の対象にするデータは4種類あって、\n/// - 0 … 全部違う値\n/// - 1 … 0～999までの範囲(1000種)でランダム\n/// - 2 … 0～90までの範囲(100種)でランダム\n/// - 3 … 0～9までの範囲(10種)でランダム\n/// (種類が少ないほどハッシュ値の衝突が少なくて速い)\n/// で、いずれも1024要素の配列。\n/// </summary>\n[MemoryDiagnoser]\npublic class DistinctBenchmark\n{\n    const int N = 1024;\n    int[] data0;\n    int[] data1;\n    int[] data2;\n    int[] data3;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        var r = new Random();\n\n        data0 = new int[N];\n        for (int i = 0; i < data0.Length; i++) data0[i] = i;\n\n        data1 = new int[N];\n        for (int i = 0; i < data1.Length; i++) data1[i] = r.Next(0, 1000);\n\n        data2 = new int[N];\n        for (int i = 0; i < data2.Length; i++) data2[i] = r.Next(0, 100);\n\n        data3 = new int[N];\n        for (int i = 0; i < data3.Length; i++) data3[i] = r.Next(0, 10);\n    }\n\n    [Benchmark] public int[] Linq0() => data0.Distinct().ToArray();\n    [Benchmark] public int[] Linq1() => data1.Distinct().ToArray();\n    [Benchmark] public int[] Linq2() => data2.Distinct().ToArray();\n    [Benchmark] public int[] Linq3() => data3.Distinct().ToArray();\n    [Benchmark] public int[] Array0() => ArrayHashSet.Distinct<int, IntComp>(data0);\n    [Benchmark] public int[] Array1() => ArrayHashSet.Distinct<int, IntComp>(data1);\n    [Benchmark] public int[] Array2() => ArrayHashSet.Distinct<int, IntComp>(data2);\n    [Benchmark] public int[] Array3() => ArrayHashSet.Distinct<int, IntComp>(data3);\n    [Benchmark] public int[] Stack0() => StackHashSet.Distinct<int, IntComp>(data0);\n    [Benchmark] public int[] Stack1() => StackHashSet.Distinct<int, IntComp>(data1);\n    [Benchmark] public int[] Stack2() => StackHashSet.Distinct<int, IntComp>(data2);\n    [Benchmark] public int[] Stack3() => StackHashSet.Distinct<int, IntComp>(data3);\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/StackallocDistinctBenchmark/IntComp.cs",
    "content": "﻿using System.Collections.Generic;\nstruct IntComp : IEqualityComparer<int>\n{\n    public bool Equals(int x, int y) => x == y;\n    public int GetHashCode(int obj) => obj.GetHashCode();\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/StackallocDistinctBenchmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\nusing System;\nusing System.Linq;\n\npublic class Program\n{\n    static void Main()\n    {\n        var x = new DistinctBenchmark();\n        x.Setup();\n\n        if (!x.Linq0().SequenceEqual(x.Stack0())) throw new Exception();\n        if (!x.Linq1().SequenceEqual(x.Stack1())) throw new Exception();\n        if (!x.Linq2().SequenceEqual(x.Stack2())) throw new Exception();\n        if (!x.Linq3().SequenceEqual(x.Stack3())) throw new Exception();\n        if (!x.Linq0().SequenceEqual(x.Array0())) throw new Exception();\n        if (!x.Linq1().SequenceEqual(x.Array1())) throw new Exception();\n        if (!x.Linq2().SequenceEqual(x.Array2())) throw new Exception();\n        if (!x.Linq3().SequenceEqual(x.Array3())) throw new Exception();\n\n        BenchmarkRunner.Run<DistinctBenchmark>();\n    }\n}"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/StackallocDistinctBenchmark/StackHashSet.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Runtime.CompilerServices;\n\n/// <summary>\n/// <see cref=\"ArrayHashSet\"/>をstackallocで実装したもの。\n///\n/// 以下の前提で最適化実装した<see cref=\"System.Linq.Enumerable.Distinct{TSource}(IEnumerable{TSource})\"/>。\n/// - (配列とか)最初からシーケンスの長さが分かってる\n/// - そんなに長くない(せいぜい数百～千程度)ことが分かってる\n/// - 遅延評価も要らない(結果の格納用にその場で配列を作る)\n///\n/// <see cref=\"ArrayHashSet\"/>の方も同じ前提で同じロジックで実装したものなんだけど、\n/// こっちはさらに「一時バッファーをstackallocで取る」って最適化をしたもの。\n/// stackallocなのでそんなに長いシーケンスに対しては使えないけど、長さによって配列かstackallocかを切り替えるような処理を入れれば実用に足ると思う。\n///\n/// 実用化するなら:\n/// - 入力の長さによって new か stackalloc を切り替える(あんまり長いものに対して stackalloc するとスタックオーバーフローの原因になる)\n/// - 引数の型は <see cref=\"IReadOnlyList{T}\"/> の方がいいかも\n/// - C# 7.2 で、Span を使えば safe にできる & 配列とstackallocで共通ロジックを使える\n/// </summary>\nstatic class StackHashSet\n{\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    internal static int PowerOf2(int x)\n    {\n        var p = 1;\n        while (p < x) p <<= 1;\n        return p;\n    }\n\n    private static unsafe T[] ToArray<T>(T[] items, int* resultIndexes, int count)\n    {\n        var results = new T[count];\n        for (int i = 0; i < results.Length; i++) results[i] = items[resultIndexes[i]];\n        return results;\n    }\n\n    public static unsafe T[] Distinct<T, TComp>(this T[] items)\n        where TComp : struct, IEqualityComparer<T>\n    {\n        var len = PowerOf2(items.Length * 2);\n        var buckets = stackalloc int[len];\n        var set = new StackHashSet<T, TComp>(items, buckets, len);\n\n        var resultIndexes = stackalloc int[items.Length];\n        var count = 0;\n\n        for (int i = 0; i < items.Length; i++)\n        {\n            if (!set.Add(items[i], i))\n            {\n                resultIndexes[count++] = i;\n            }\n        }\n\n        return ToArray(items, resultIndexes, count);\n    }\n\n    public static unsafe T[] Except<T, TComp>(this T[] first, T[] second)\n        where TComp : struct, IEqualityComparer<T>\n    {\n        var len = PowerOf2(second.Length * 2);\n        var buckets = stackalloc int[len];\n        var set = new StackHashSet<T, TComp>(second, buckets, len);\n\n        set.MakeHashtTable();\n\n        var resultIndexes = stackalloc int[first.Length];\n        var count = 0;\n\n        for (int i = 0; i < first.Length; i++)\n        {\n            if (!set.Contains(first[i]))\n            {\n                resultIndexes[count++] = i;\n            }\n        }\n\n        return ToArray(first, resultIndexes, count);\n    }\n}\n\nunsafe struct StackHashSet<T, TComp>\n    where TComp : struct, IEqualityComparer<T>\n{\n    internal const int Skip = 928191829;\n\n    private T[] items;\n    private int* buckets;\n    int len;\n    int mask;\n\n    public StackHashSet(T[] items, int* buckets, int len)\n    {\n        this.items = items;\n        this.buckets = buckets;\n        this.len = len;\n        mask = len - 1;\n\n        for (int i = 0; i < len; i++) buckets[i] = -1;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public bool Contains(T item)\n    {\n        var hash = default(TComp).GetHashCode(item) & mask;\n        while (true)\n        {\n            ref var b = ref buckets[hash];\n\n            if (b == -1)\n            {\n                return false;\n            }\n            else if (default(TComp).Equals(item, items[b]))\n            {\n                return true;\n            }\n\n            hash = (hash + Skip) & mask;\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public void MakeHashtTable()\n    {\n        var mask = len - 1;\n        for (int i = 0; i < items.Length; i++)\n        {\n            Add(items[i], i);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public bool Add(T item, int i)\n    {\n        var hash = default(TComp).GetHashCode(item) & mask;\n\n        while (true)\n        {\n            ref var b = ref buckets[hash];\n\n            if (b == -1)\n            {\n                b = i;\n                return false;\n            }\n            else if (default(TComp).Equals(item, items[b]))\n            {\n                return true;\n            }\n\n            hash = (hash + Skip) & mask;\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/StackallocDistinctBenchmark/StackallocDistinctBenchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.9\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview2-25405-01\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/TypeRepositoryBenchmarks.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26823.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DictionaryBenchmark\", \"DictionaryBenchmark\\DictionaryBenchmark.csproj\", \"{CB2051C0-9686-4105-AEE4-9CCC283757DD}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"UtfCompareBenchmark\", \"UtfCompareBenchmark\\UtfCompareBenchmark.csproj\", \"{9F591A69-89AE-46C3-9D21-0066982F7C88}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"SequenceBenchmark\", \"SequenceBenchmark\\SequenceBenchmark.csproj\", \"{19BF9222-FCB2-4DA1-A797-C089B6D32E43}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ByteToLongBenchmark\", \"ByteToLongBenchmark\\ByteToLongBenchmark.csproj\", \"{66A72AFE-8F93-4131-83D6-02DEEF93B57A}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ParseIntBnechmark\", \"ParseIntBnechmark\\ParseIntBnechmark.csproj\", \"{D8B2E730-8464-450B-81C3-6A44329E6ABF}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"OptionalArrayBenchmark\", \"OptionalArrayBenchmark\\OptionalArrayBenchmark.csproj\", \"{C49B8737-7087-4145-96D0-F027BE5845DC}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"StackallocDistinctBenchmark\", \"StackallocDistinctBenchmark\\StackallocDistinctBenchmark.csproj\", \"{FE751ED5-3089-472C-A6A7-2FD4C95B95E3}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Utf8SearchBenchmark\", \"Utf8SearchBenchmark\\Utf8SearchBenchmark.csproj\", \"{BA25B084-2485-4FD4-AAF9-DD7A8B910215}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Grisu3DoubleConversion\", \"Grisu3DoubleConversion\\Grisu3DoubleConversion.csproj\", \"{72269EA9-CC8A-4AAD-807B-D5A9B05F8A2C}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{CB2051C0-9686-4105-AEE4-9CCC283757DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CB2051C0-9686-4105-AEE4-9CCC283757DD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CB2051C0-9686-4105-AEE4-9CCC283757DD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CB2051C0-9686-4105-AEE4-9CCC283757DD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{9F591A69-89AE-46C3-9D21-0066982F7C88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9F591A69-89AE-46C3-9D21-0066982F7C88}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9F591A69-89AE-46C3-9D21-0066982F7C88}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9F591A69-89AE-46C3-9D21-0066982F7C88}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{19BF9222-FCB2-4DA1-A797-C089B6D32E43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{19BF9222-FCB2-4DA1-A797-C089B6D32E43}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{19BF9222-FCB2-4DA1-A797-C089B6D32E43}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{19BF9222-FCB2-4DA1-A797-C089B6D32E43}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{66A72AFE-8F93-4131-83D6-02DEEF93B57A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{66A72AFE-8F93-4131-83D6-02DEEF93B57A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{66A72AFE-8F93-4131-83D6-02DEEF93B57A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{66A72AFE-8F93-4131-83D6-02DEEF93B57A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D8B2E730-8464-450B-81C3-6A44329E6ABF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D8B2E730-8464-450B-81C3-6A44329E6ABF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D8B2E730-8464-450B-81C3-6A44329E6ABF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D8B2E730-8464-450B-81C3-6A44329E6ABF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C49B8737-7087-4145-96D0-F027BE5845DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C49B8737-7087-4145-96D0-F027BE5845DC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C49B8737-7087-4145-96D0-F027BE5845DC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C49B8737-7087-4145-96D0-F027BE5845DC}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FE751ED5-3089-472C-A6A7-2FD4C95B95E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FE751ED5-3089-472C-A6A7-2FD4C95B95E3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FE751ED5-3089-472C-A6A7-2FD4C95B95E3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FE751ED5-3089-472C-A6A7-2FD4C95B95E3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{BA25B084-2485-4FD4-AAF9-DD7A8B910215}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BA25B084-2485-4FD4-AAF9-DD7A8B910215}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BA25B084-2485-4FD4-AAF9-DD7A8B910215}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BA25B084-2485-4FD4-AAF9-DD7A8B910215}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{72269EA9-CC8A-4AAD-807B-D5A9B05F8A2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{72269EA9-CC8A-4AAD-807B-D5A9B05F8A2C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{72269EA9-CC8A-4AAD-807B-D5A9B05F8A2C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{72269EA9-CC8A-4AAD-807B-D5A9B05F8A2C}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {DE2A1875-1B81-4325-9375-26676000E193}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Utf8SearchBenchmark/BoyerMoore.cs",
    "content": "﻿using System;\n\n/// <summary>\n/// UTF8 な byte 列を、UTF8 のままで文字列検索するために、Boyer Moore アルゴリズムを自前で実装したもの。\n/// https://github.com/likejazz/boyer-moore-string-search/blob/master/boyer-moore.c がベース。\n/// </summary>\nunsafe static class BoyerMoore\n{\n    static void MakeDelta1(int* delta1, byte* pattern, int patternLength)\n    {\n        for (var i = 0; i < 256; i++)\n        {\n            delta1[i] = patternLength;\n        }\n        for (var i = 0; i < patternLength - 1; i++)\n        {\n            delta1[pattern[i]] = patternLength - 1 - i;\n        }\n    }\n\n    static bool IsPrefix(byte* word, int wordLength, int pos)\n    {\n        var suffixLen = wordLength - pos;\n\n        for (var i = 0; i < suffixLen; i++)\n        {\n            if (word[i] != word[pos + i])\n            {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    static int SuffixLength(byte* word, int wordLength, int pos)\n    {\n        int i;\n        for (i = 0; (word[pos - i] == word[wordLength - 1 - i]) && (i < pos); i++) ;\n        return i;\n    }\n\n    static void MakeDelta2(int* delta2, byte* pattern, int patternLength)\n    {\n        int lastPrefixIndex = 1;\n\n        for (var p = patternLength - 1; p >= 0; p--)\n        {\n            if (IsPrefix(pattern, patternLength, p)) lastPrefixIndex = p;\n            delta2[p] = (patternLength - p) + lastPrefixIndex;\n        }\n\n        for (var p = 0; p < patternLength - 1; p++)\n        {\n            var suffixLength = SuffixLength(pattern, patternLength, p);\n            var i = patternLength - 1 - suffixLength;\n            if (pattern[p - suffixLength] != pattern[i])\n            {\n                delta2[i] = patternLength - 1 - p + suffixLength;\n            }\n        }\n    }\n\n    public static unsafe int IndexOf(Span<byte> str, Span<byte> pattern)\n    {\n        fixed (byte* ps = &str.DangerousGetPinnableReference())\n        fixed (byte* pp = &pattern.DangerousGetPinnableReference())\n            return IndexOf(ps, str.Length, pp, pattern.Length);\n    }\n\n    public static int IndexOf(byte* str, int strLength, byte* pattern, int patternLength)\n    {\n        int* delta1 = stackalloc int[256];\n        int* delta2 = stackalloc int[patternLength];\n        MakeDelta1(delta1, pattern, patternLength);\n        MakeDelta2(delta2, pattern, patternLength);\n\n        var i = patternLength - 1;\n        while (i < strLength)\n        {\n            var j = patternLength - 1;\n            while (j >= 0 && (str[i] == pattern[j]))\n            {\n                --i;\n                --j;\n            }\n            if (j < 0) return i + 1;\n\n            i += Math.Max(delta1[str[i]], delta2[j]);\n        }\n        return strLength;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Utf8SearchBenchmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\nusing System;\nusing System.Text;\n\npublic class Program\n{\n    static void Main()\n    {\n#if tru\n        var x = new FindBenchmark();\n        x.Setup();\n        Console.WriteLine(x.OrdinalIndexOf());\n        Console.WriteLine(x.BoyerMooreIndexOf());\n#else\n        //BenchmarkRunner.Run<StringComparisonBenchmark>();\n        BenchmarkRunner.Run<Utf8SearchBenchmark>();\n#endif\n    }\n\n    private static void Find(byte[] data)\n    {\n        var utf8 = Encoding.UTF8;\n        var pattern = utf8.GetBytes(\"タプル\");\n\n        Span<byte> str = data;\n        while (true)\n        {\n            var i = BoyerMoore.IndexOf(str, pattern);\n            if (str.Length == i) break;\n            Console.WriteLine($\"{i}: {utf8.GetString(str.Slice(i, pattern.Length).ToArray())}\");\n            str = str.Slice(i + 1);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Utf8SearchBenchmark/StringComparisonBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\n/// <summary>\n/// おまけ。\n///\n/// <see cref=\"Utf8SearchBenchmark\"/>を作るためにC# boyer mooreとかでググる\n/// ↓\n/// string.IndexOf の性能に関するStackOverlfow投稿が目に付く\n/// ↓\n/// Ordinal付けるかどうかで性能差すごいらしい？\n/// ↓\n/// 30倍違った…(今ここ)\n/// \n/// こんなの、常に Ordinal 付けるしかないじゃない…\n/// (デフォルト動作が CurrentCulture なのつらい。)\n///\n///                 Method |        Mean |      Error |     StdDev | Allocated |\n/// ---------------------- |------------:|-----------:|-----------:|----------:|\n///  CurrentCultureIndexOf | 16,411.8 us | 173.195 us | 135.219 us |       0 B |\n///         OrdinalIndexOf |    552.2 us |   2.131 us |   1.889 us |       0 B |\n///\n/// ちなみに、<see cref=\"StringComparison.Ordinal\"/>以外での<see cref=\"string.IndexOf(string)\"/>は、前方から1文字1文字調べていくタイプのアルゴリズムっぽい。\n/// ↑いわゆる O(N * M) のやつ(N が検索対象の、M が検索したいパターンの長さ)。\n/// <see cref=\"StringComparison.Ordinal\"/>の時だけネイティブ実装に飛ばされて、おそらくその中で O(N / M) なアルゴリズムが使われてる。\n/// </summary>\n[MemoryDiagnoser]\npublic class StringComparisonBenchmark\n{\n    string text;\n    string[] patterns;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        text = LoadDataAsync().GetAwaiter().GetResult();\n\n        async Task<string> LoadDataAsync()\n        {\n            var c = new HttpClient();\n            var res = await c.GetAsync(\"http://ufcpp.net/study/csharp/cheatsheet/ap_ver7/\");\n            return await res.Content.ReadAsStringAsync();\n        }\n\n        patterns = new[]\n        {\n            \"C#\",\n            \"throw\",\n            \"new\",\n            \"演算子\",\n            \"タプル\",\n            \"なさそうなもじれつ\",\n            \"一番重要視しているのは生産性の高さで、書きやすさ、読みやすさなどが一番大事です。\",\n            \"<span\",\n            \" \",\n        };\n    }\n\n    [Benchmark]\n    public int CurrentCultureIndexOf()\n    {\n        var sum = 0;\n        foreach (var p in patterns)\n            sum += Count(text, p, StringComparison.CurrentCulture);\n        return sum;\n    }\n\n    [Benchmark]\n    public int OrdinalIndexOf()\n    {\n        var sum = 0;\n        foreach (var p in patterns)\n            sum += Count(text, p, StringComparison.Ordinal);\n        return sum;\n    }\n\n    private static int Count(string text, string pattern, StringComparison comp)\n    {\n        var count = 0;\n        var i = 0;\n        while (true)\n        {\n            i = text.IndexOf(pattern, i, comp);\n            if (i < 0) return count;\n            count++;\n            i++;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Utf8SearchBenchmark/Utf8SearchBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System;\nusing System.Linq;\nusing System.Net.Http;\nusing System.Text;\nusing System.Threading.Tasks;\n\n/// <summary>\n/// だいたい UTF8 → string への変換(と、string 自体のヒープアロケーション)がつらいことはわかってる\n/// ↓\n/// しょうがないから UTF8 のままでいろいろと処理\n/// ↓\n/// 標準ライブラリに頼れないし、ネットで検索しても出てるコードは大体 string 前提\n/// ↓\n/// SequenceEqual、GetHashCode、IndexOf 辺りを自作(今IndexOf)\n///\n/// 雑に数時間で書いた割には、標準ライブラリの<see cref=\"string.LastIndexOf(string, StringComparison)\"/>の3倍程度の遅さで済んでるので及第点かなぁ。\n///\n///             Method |       Mean |    Error |   StdDev |\n/// ------------------ |-----------:|---------:|---------:|\n///     OrdinalIndexOf |   553.8 us | 6.796 us | 6.024 us | ← 標準の\n///  BoyerMooreIndexOf | 1,600.2 us | 4.034 us | 3.773 us | ← 自作の\n/// </summary>\npublic class Utf8SearchBenchmark\n{\n    (string utf16, byte[] utf8) text;\n    (string utf16, byte[] utf8)[] patterns;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        async Task<byte[]> LoadDataAsync()\n        {\n            var c = new HttpClient();\n            var res = await c.GetAsync(\"http://ufcpp.net/study/csharp/cheatsheet/ap_ver7/\");\n            return await res.Content.ReadAsByteArrayAsync();\n        }\n\n        text.utf8 = LoadDataAsync().GetAwaiter().GetResult();\n        text.utf16 = Encoding.UTF8.GetString(text.utf8);\n\n        patterns = new[]\n        {\n            \"C#\",\n            \"throw\",\n            \"new\",\n            \"演算子\",\n            \"タプル\",\n            \"なさそうなもじれつ\",\n            \"一番重要視しているのは生産性の高さで、書きやすさ、読みやすさなどが一番大事です。\",\n            \"<span\",\n            \" \",\n        }\n        .Select(s => (s, Encoding.UTF8.GetBytes(s)))\n        .ToArray();\n    }\n\n    [Benchmark]\n    public int OrdinalIndexOf()\n    {\n        var sum = 0;\n        foreach (var (utf16, _) in patterns)\n            sum += Count(text.utf16, utf16, StringComparison.Ordinal);\n        return sum;\n    }\n\n    private static int Count(string text, string pattern, StringComparison comp)\n    {\n        var count = 0;\n        var i = 0;\n        while (true)\n        {\n            i = text.IndexOf(pattern, i, comp);\n            if (i < 0) return count;\n            count++;\n            i++;\n        }\n    }\n\n    [Benchmark]\n    public int BoyerMooreIndexOf()\n    {\n        var sum = 0;\n        foreach (var (_, utf8) in patterns)\n            sum += Count(text.utf8, utf8);\n        return sum;\n    }\n\n    private static int Count(byte[] text, byte[] pattern)\n    {\n        var count = 0;\n        Span<byte> s = text;\n        while (true)\n        {\n            var i = BoyerMoore.IndexOf(s, pattern);\n            if (i == s.Length) return count;\n            count++;\n            s = s.Slice(i + 1);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/Utf8SearchBenchmark/Utf8SearchBenchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.9\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview2-25405-01\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/UtfCompareBenchmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\nusing System;\nusing System.Linq;\nusing System.Text;\n\npublic class Program\n{\n    static void Main()\n    {\n#if tru\n        var x = new StringBenchmark();\n        x.Setup();\n        x.EncodingGetBytesUnsafe();\n        x.StringToUtf8Byte();\n        x.EncodingGetBytes();\n        x.EncodingGetString();\n        x.EncodingGetCharsUnsafe();\n        x.MyGetBytes();\n#else\n        BenchmarkRunner.Run<StringBenchmark>();\n#endif\n        //Test();\n    }\n\n    private static void Test()\n    {\n        var s = \"🐭🐮🐯あいうαβγabc\";\n        var bytes = Encoding.UTF8.GetBytes(s);\n\n        foreach (var x in s.AsBytes().Zip(bytes, (x, y) => (x, y)))\n        {\n            Console.WriteLine((x.x.ToString(\"X\"), x.y.ToString(\"X\")));\n        }\n\n        Console.WriteLine(Enumerable.SequenceEqual(s.AsBytes(), bytes));\n    }\n}"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/UtfCompareBenchmark/StringBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System;\nusing System.Linq;\nusing System.Text;\n\n/// <summary>\n/// UTF8 な byte 列と UTF16 な char 列(string)の比較はどうするのは速いのかなぁと。\n///\n///                  Method |      Mean |     Error |    StdDev |   Gen 0 | Allocated |\n/// ----------------------- |----------:|----------:|----------:|--------:|----------:|\n///  EncodingGetBytesUnsafe | 105.58 us | 0.4337 us | 0.4057 us |       - |       0 B |\n///        EncodingGetBytes | 158.86 us | 1.1790 us | 0.9205 us | 17.5781 |   73832 B |\n///       EncodingGetString | 204.73 us | 0.9916 us | 0.8280 us | 17.8223 |   75728 B |\n///  EncodingGetCharsUnsafe | 136.66 us | 0.9853 us | 0.9216 us |       - |       0 B |\n///        StringToUtf8Byte | 291.99 us | 1.0604 us | 0.8855 us |       - |       0 B |\n///              MyGetBytes |  95.09 us | 0.5053 us | 0.4479 us |       - |       0 B |\n///\n/// 結論としては stackalloc で取った領域に対して書き込んだ結果を、\n/// <see cref=\"SpanExtensions.SequenceEqual(ReadOnlySpan{byte}, ReadOnlySpan{byte})\"/> するのが最速。\n/// スタックの性質上、あんまり長い文字列に対しては使えないけども。\n///\n/// その方式なら標準の<see cref=\"Encoding.GetBytes(char*, int, byte*, int)\"/>で十分(<see cref=\"EncodingGetBytesUnsafe\"/>)。\n///\n/// 一応、範囲チェックとかを微妙にさぼることで、<see cref=\"Encoding.GetBytes(char*, int, byte*, int)\"/>をちょっとだけ抜けることは確認(<see cref=\"MyGetBytes\"/>)。\n///\n/// corefxlab 実装の System.Text.Primitives の Encoders が速く安定してくれれば…\n/// ↑ byte* を int* 扱いして4文字同時エンコード/デコードとかやってるんで、さすがに速そう。\n/// </summary>\n[MemoryDiagnoser]\npublic class StringBenchmark\n{\n    static readonly Encoding utf8 = new UTF8Encoding(false);\n    const int N = 1000;\n    (string utf16, byte[] utf8)[] items;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        var r = new Random();\n\n        items = new(string, byte[])[N];\n\n        for (int n = 0; n < items.Length; n++)\n        {\n            var len = r.Next(0, 5) + r.Next(0, 5) + r.Next(0, 5) + r.Next(0, 5) + r.Next(0, 5) + r.Next(0, 5);\n            int[] cp = new int[len];\n            for (int i = 0; i < len; i++)\n            {\n                cp[i] = r.Next(1, 0xFFFFF);\n            }\n\n            var s = Utf32ToString(cp);\n            var b = utf8.GetBytes(s);\n\n            items[n] = (s, b);\n        }\n    }\n\n    private static unsafe string Utf32ToString(int[] cp)\n    {\n        if (cp.Length == 0) return \"\";\n\n        fixed (int* p = cp)\n        {\n            return Encoding.UTF32.GetString((byte*)p, cp.Length * 4);\n        }\n    }\n\n    [Benchmark]\n    public void EncodingGetBytesUnsafe()\n    {\n        foreach (var item in items)\n        {\n            unsafe\n            {\n                int len = item.utf16.Length * 3;\n                var buf = stackalloc byte[len + 1];\n                fixed (char* p = item.utf16)\n                {\n                    len = utf8.GetBytes(p, item.utf16.Length, buf, len);\n                }\n                var b = new Span<byte>(buf, len);\n                if (!b.SequenceEqual(item.utf8)) throw new Exception();\n            }\n        }\n    }\n\n    [Benchmark]\n    public void EncodingGetBytes()\n    {\n        foreach (var item in items)\n        {\n            Span<byte> b = utf8.GetBytes(item.utf16);\n            if (!b.SequenceEqual(item.utf8)) throw new Exception();\n        }\n    }\n\n    [Benchmark]\n    public void EncodingGetString()\n    {\n        foreach (var item in items)\n        {\n            var s = utf8.GetString(item.utf8);\n            if (item.utf16 != s) throw new Exception();\n        }\n    }\n\n    [Benchmark]\n    public void EncodingGetCharsUnsafe()\n    {\n        foreach (var item in items)\n        {\n            unsafe\n            {\n                fixed (byte* p = item.utf8)\n                {\n                    var len = item.utf8.Length;\n                    char* c = stackalloc char[len];\n                    len = utf8.GetChars(p, len, c, len);\n\n                    fixed (char* p16 = item.utf16)\n                    {\n                        Span<char> a = new Span<char>(c, len);\n                        Span<char> b = new Span<char>(p16, item.utf16.Length);\n                        if (!a.SequenceEqual(b)) throw new Exception();\n                    }\n                }\n            }\n        }\n    }\n\n    [Benchmark]\n    public void StringToUtf8Byte()\n    {\n        foreach (var item in items)\n        {\n            unsafe\n            {\n                var buf = stackalloc byte[item.utf16.Length * 3];\n                var u = item.utf16.AsBytes();\n\n                var p = buf;\n                foreach (var x in item.utf16.AsBytes())\n                {\n                    *p = x;\n                    ++p;\n                }\n                var len = p - buf;\n\n                var b = new Span<byte>(buf, (int)len);\n                if (!b.SequenceEqual(item.utf8)) throw new Exception();\n            }\n        }\n    }\n\n    [Benchmark]\n    public void MyGetBytes()\n    {\n        foreach (var item in items)\n        {\n            unsafe\n            {\n                var len = item.utf16.Length * 3;\n                var p = stackalloc byte[len];\n                Span<byte> buf = new Span<byte>(p, len);\n                len = item.utf16.GetBytes(buf);\n                buf = buf.Slice(0, len);\n                if (!buf.SequenceEqual(item.utf8)) throw new Exception();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/UtfCompareBenchmark/StringExtensions.cs",
    "content": "﻿using System;\npublic static class StringExtensions\n{\n    /// <summary>\n    /// 結局、これが有力。\n    /// stackalloc した領域に直接エンコード結果を書き込む。\n    /// UTF16とUTF8の性質上、string の UTF8 エンコード結果の byte 数は、元の<see cref=\"string.Length\"/>の3倍の長さ以上にはならない。\n    /// なので、GetByteCount 的なものは実装せず、3倍長さで stackalloc してしまう想定。\n    /// </summary>\n    public static int GetBytes(this string s, Span<byte> buf)\n    {\n        int j = 0;\n        for (int i = 0; i < s.Length; i++)\n        {\n            var c = s[i];\n\n            if (c < 0x80)\n            {\n                buf[j++] = (byte)c;\n            }\n            else if (c < 0b1000_0000_0000)\n            {\n                buf[j++] = (byte)(0b11000000 | (c >> 6) & 0b1_1111);\n                buf[j++] = (byte)(0b10000000 | c & 0b11_1111);\n            }\n            else if (!char.IsHighSurrogate(c))\n            {\n                buf[j++] = (byte)(0b11100000 | (c >> 12) & 0b1111);\n                buf[j++] = (byte)(0b10000000 | (c >> 6) & 0b11_1111);\n                buf[j++] = (byte)(0b10000000 | c & 0b11_1111);\n            }\n            else\n            {\n                var cp = (uint)(c & 0b0011_1111_1111) + 0b0100_0000;\n\n                ++i;\n                if (i == s.Length) return i;\n\n                cp = (cp << 10) | ((uint)s[i] & 0b0011_1111_1111);\n\n                buf[j++] = (byte)(0b11110000 | (cp >> 18) & 0b111);\n                buf[j++] = (byte)(0b10000000 | (cp >> 12) & 0b11_1111);\n                buf[j++] = (byte)(0b10000000 | (cp >> 6) & 0b11_1111);\n                buf[j++] = (byte)(0b10000000 | cp & 0b11_1111);\n            }\n        }\n        return j;\n    }\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/UtfCompareBenchmark/StringToUtf8Byte.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections;\n\n/// <summary>\n/// string を UTF8 エンコードした結果を、アロケーションなしで1バイトずつ列挙するための型。\n///\n/// 没。\n/// 遅い。\n/// MoveNext() → Current でアクセスするのとかほんと遅い。\n/// これだったら<see cref=\"Encoding.GetString(byte[])\"/>/<see cref=\"Encoding.GetBytes(string)\"/>する方が速かった。\n///\n/// <see cref=\"IEnumerable{byte}\"/>の状態で SequenceEqual すると絶望的に遅くて、\n/// 結局それも、stackalloc した領域にコピーしてから<see cref=\"SpanExtensions.SequenceEqual(Span{byte}, ReadOnlySpan{byte})\"/>する方がだいぶ速かった。\n/// (やっぱ、<see cref=\"Span{T}\"/>みたいにメモリが連続的に配置されている前提があるとむちゃくちゃ速い。)\n/// </summary>\npublic struct StringToUtf8Byte : IEnumerable<byte>\n{\n    string _s;\n\n    public StringToUtf8Byte(string s) => _s = s;\n\n    public Enumerator GetEnumerator() => new Enumerator(_s);\n    IEnumerator<byte> IEnumerable<byte>.GetEnumerator() => GetEnumerator();\n    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n\n    public struct Enumerator : IEnumerator<byte>\n    {\n        string _s;\n        int _index;\n        byte _c0;\n        byte _c1;\n        byte _c2;\n        byte _c3;\n        int _rest;\n\n        public Enumerator(string s) : this()\n        {\n            _s = s;\n        }\n\n        public byte Current\n        {\n            get\n            {\n                switch (_rest)\n                {\n                    default: throw new IndexOutOfRangeException();\n                    case 0: return _c0;\n                    case 1: return _c1;\n                    case 2: return _c2;\n                    case 3: return _c3;\n                }\n            }\n        }\n\n        public bool MoveNext()\n        {\n            --_rest;\n            if (_rest < 0)\n            {\n                if (_index == _s.Length) return false;\n\n                var c = _s[_index];\n\n                if (c < 0x80)\n                {\n                    _c0 = (byte)c;\n                    _rest = 0;\n                }\n                else if (c < 0b1000_0000_0000)\n                {\n                    _c0 = (byte)(0b10000000 | c & 0b11_1111);\n                    _c1 = (byte)(0b11000000 | (c >> 6) & 0b1_1111);\n                    _rest = 1;\n                }\n                else if (!char.IsHighSurrogate(c))\n                {\n                    _c0 = (byte)(0b10000000 | c & 0b11_1111);\n                    _c1 = (byte)(0b10000000 | (c >> 6) & 0b11_1111);\n                    _c2 = (byte)(0b11100000 | (c >> 12) & 0b1111);\n                    _rest = 2;\n                }\n                else\n                {\n                    var cp = (uint)(c & 0b0011_1111_1111) + 0b0100_0000;\n\n                    ++_index;\n                    if (_index == _s.Length) return false;\n\n                    cp = (cp << 10) | ((uint)_s[_index] & 0b0011_1111_1111);\n\n                    _c0 = (byte)(0b10000000 | cp & 0b11_1111);\n                    _c1 = (byte)(0b10000000 | (cp >> 6) & 0b11_1111);\n                    _c2 = (byte)(0b10000000 | (cp >> 12) & 0b11_1111);\n                    _c3 = (byte)(0b11110000 | (cp >> 18) & 0b111);\n                    _rest = 3;\n                }\n\n                ++_index;\n            }\n            return true;\n        }\n\n        object IEnumerator.Current => Current;\n        public void Dispose() { }\n        void IEnumerator.Reset() => throw new NotImplementedException();\n    }\n}\n\npublic static class StringToUtf8ByteExtensions\n{\n    /// <summary>\n    /// 同上、没。\n    /// <see cref=\"StringToUtf8Byte\"/>\n    /// </summary>\n    public static StringToUtf8Byte AsBytes(this string s) => new StringToUtf8Byte(s);\n}\n"
  },
  {
    "path": "Demo/2017/TypeRepositoryBenchmarks/UtfCompareBenchmark/UtfCompareBenchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.9\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.4.0-preview2-25405-01\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Generator.cs",
    "content": "﻿using System;\n\nnamespace UnionTypes\n{\n    partial class Generator\n    {\n        public static Union1<int> Random_int_1(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_int, Union1.New, Union1.New);\n        public static Union1<Vector> Random_Vector_1(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_Vector, Union1.New, Union1.New);\n        public static Union1<string> Random_string_1(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_string, Union1.New, Union1.New);\n        public static Union2<int> Random_int_2(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_int, Union2.New, Union2.New);\n        public static Union2<Vector> Random_Vector_2(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_Vector, Union2.New, Union2.New);\n        public static Union2<string> Random_string_2(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_string, Union2.New, Union2.New);\n        public static Union3<int> Random_int_3(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_int, Union3.New, Union3.New);\n        public static Union3<Vector> Random_Vector_3(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_Vector, Union3.New, Union3.New);\n        public static Union3<string> Random_string_3(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_string, Union3.New, Union3.New);\n        public static Union4<int> Random_int_4(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_int, Union4.New, Union4.New);\n        public static Union4<Vector> Random_Vector_4(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_Vector, Union4.New, Union4.New);\n        public static Union4<string> Random_string_4(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_string, Union4.New, Union4.New);\n        public static Union5<int> Random_int_5(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_int, Union5.New, Union5.New);\n        public static Union5<Vector> Random_Vector_5(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_Vector, Union5.New, Union5.New);\n        public static Union5<string> Random_string_5(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_string, Union5.New, Union5.New);\n\n        public static Union1<int> Fix_int_1(Random r, double arrayRate) => FixUnion(r, arrayRate, value_int, array_int, Union1.New, Union1.New);\n        public static Union1<Vector> Fix_Vector_1(Random r, double arrayRate) => FixUnion(r, arrayRate, value_Vector, array_Vector, Union1.New, Union1.New);\n        public static Union1<string> Fix_string_1(Random r, double arrayRate) => FixUnion(r, arrayRate, value_string, array_string, Union1.New, Union1.New);\n        public static Union2<int> Fix_int_2(Random r, double arrayRate) => FixUnion(r, arrayRate, value_int, array_int, Union2.New, Union2.New);\n        public static Union2<Vector> Fix_Vector_2(Random r, double arrayRate) => FixUnion(r, arrayRate, value_Vector, array_Vector, Union2.New, Union2.New);\n        public static Union2<string> Fix_string_2(Random r, double arrayRate) => FixUnion(r, arrayRate, value_string, array_string, Union2.New, Union2.New);\n        public static Union3<int> Fix_int_3(Random r, double arrayRate) => FixUnion(r, arrayRate, value_int, array_int, Union3.New, Union3.New);\n        public static Union3<Vector> Fix_Vector_3(Random r, double arrayRate) => FixUnion(r, arrayRate, value_Vector, array_Vector, Union3.New, Union3.New);\n        public static Union3<string> Fix_string_3(Random r, double arrayRate) => FixUnion(r, arrayRate, value_string, array_string, Union3.New, Union3.New);\n        public static Union4<int> Fix_int_4(Random r, double arrayRate) => FixUnion(r, arrayRate, value_int, array_int, Union4.New, Union4.New);\n        public static Union4<Vector> Fix_Vector_4(Random r, double arrayRate) => FixUnion(r, arrayRate, value_Vector, array_Vector, Union4.New, Union4.New);\n        public static Union4<string> Fix_string_4(Random r, double arrayRate) => FixUnion(r, arrayRate, value_string, array_string, Union4.New, Union4.New);\n        public static Union5<int> Fix_int_5(Random r, double arrayRate) => FixUnion(r, arrayRate, value_int, array_int, Union5.New, Union5.New);\n        public static Union5<Vector> Fix_Vector_5(Random r, double arrayRate) => FixUnion(r, arrayRate, value_Vector, array_Vector, Union5.New, Union5.New);\n        public static Union5<string> Fix_string_5(Random r, double arrayRate) => FixUnion(r, arrayRate, value_string, array_string, Union5.New, Union5.New);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Generator.partial.cs",
    "content": "﻿using System;\n\nnamespace UnionTypes\n{\n    partial class Generator\n    {\n        static int value_int = 0;\n        static int[] array_int = new[] { 1, 2, 3, 4, 5 };\n        static int Random_int(Random r) => r.Next();\n\n        static Vector value_Vector = default(Vector);\n        static Vector[] array_Vector = new[] { default(Vector), default(Vector), default(Vector), default(Vector), default(Vector) };\n        static Vector Random_Vector(Random r) => new Vector(r.Next(), r.Next(), r.Next());\n\n        static string value_string = \"zero\";\n        static string[] array_string = new[] { \"one\", \"two\", \"three\", \"four\", \"five\" };\n        static string Random_string(Random r)\n        {\n            switch (r.Next(0, 5))\n            {\n                default: return \"zero\";\n                case 1: return \"one\";\n                case 2: return \"two\";\n                case 3: return \"thre\";\n                case 4: return \"four\";\n            }\n        }\n\n        static Union FixUnion<T, Union>(Random r, double arrayRate, T v, T[] a, Func<T, Union> value, Func<T[], Union> array)\n            where Union : IUnion<T>\n        {\n            if (r.NextDouble() < arrayRate) return array(a);\n            else return value(v);\n        }\n\n        static Union RandomUnion<T, Union>(Random r, double arrayRate, Func<Random, T> generator, Func<T, Union> value, Func<T[], Union> array)\n            where Union : IUnion<T>\n        {\n            if (r.NextDouble() < arrayRate) return array(RandomArray(r, generator));\n            else return value(generator(r));\n        }\n\n        static T[] RandomArray<T>(Random r, Func<Random, T> generator)\n        {\n            var array = new T[r.Next(1, 5)];\n            for (int i = 0; i < array.Length; i++) array[i] = generator(r);\n            return array;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Generator.tt",
    "content": "﻿<#@ template debug=\"false\" hostspecific=\"false\" language=\"C#\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ import namespace=\"System.Text\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n<#@ output extension=\".cs\" #>\n<#\nvar unions = 5;\nvar types = new[] { \"int\", \"Vector\", \"string\" };\n#>\nusing System;\n\nnamespace UnionTypes\n{\n    partial class Generator\n    {\n<#\nfor (var u = 1; u <= unions; u++)\nforeach (var t in types)\n{\n#>\n        public static Union<#= u #><<#= t #>> Random_<#= t #>_<#= u #>(Random r, double arrayRate) => RandomUnion(r, arrayRate, Random_<#= t #>, Union<#= u #>.New, Union<#= u #>.New);\n<#\n}\n#>\n\n<#\nfor (var u = 1; u <= unions; u++)\nforeach (var t in types)\n{\n#>\n        public static Union<#= u #><<#= t #>> Fix_<#= t #>_<#= u #>(Random r, double arrayRate) => FixUnion(r, arrayRate, value_<#= t #>, array_<#= t #>, Union<#= u #>.New, Union<#= u #>.New);\n<#\n}\n#>\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/IUnion.cs",
    "content": "﻿namespace UnionTypes\n{\n    /// <summary>\n    /// 値と配列の直和。\n    /// どっちか片方だけ値を持っている想定。\n    /// </summary>\n    interface IUnion<T>\n    {\n        T[] Array { get; }\n        T Value { get; }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Program.cs",
    "content": "﻿namespace UnionTypes\n{\n    class Program\n    {\n        /// <summary>\n        /// <see cref=\"IUnion{T}\"/>みたいな型、要するに「値、もしくは、配列のどちらか片方を持つ型」の実装方式で何が一番コスト低いかを調べる。\n        ///\n        /// 実行結果は微々たる差(特にReleaseビルドだと差が出ない。せいぜい5%、よく順番もひっくり返る)だった。\n        /// \n        /// 一応、順序的には、\n        /// 速\n        /// 4: 常に配列で持つ。長さ1の配列と値の区別がつかないので不完全\n        /// 2: object で持つ\n        /// 1: T と T[] の2つのフィールドで持つ\n        /// 3: 派生クラスで分岐\n        /// 5: 4にちゃんと値と配列を弁別するためのフラグを足したもの\n        /// 遅\n        ///\n        /// 印象としては、\n        /// - コピーのコスト大きい。native intサイズを超えた時点でbox化の方が有効\n        /// - as も案外コスト\n        /// - さすがに3みたいに常に間接参照が1段階挟まるのは損\n        /// </summary>\n        static void Main(string[] args)\n        {\n            Runner.Run();\n            Runner.Run();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Runner.cs",
    "content": "﻿using System;\n\nnamespace UnionTypes\n{\n    partial class Runner\n    {\n\n        public static void Run()\n        {\n            var r = new Random();\n\n            var t1 = TimeSpan.Zero;\n            var t2 = TimeSpan.Zero;\n            var t3 = TimeSpan.Zero;\n            var t4 = TimeSpan.Zero;\n            var t5 = TimeSpan.Zero;\n\n            for (int i = 0; i < 3; i++)\n            {\n                foreach (var rate in new[] { 0.1, 0.3, 0.5, 0.7, 0.9 })\n                {\n                    //Console.WriteLine(rate);\n\n                    t1 += Run<int, Union1<int>>(\"rnd 1 int\", rate, r, Generator.Random_int_1);\n                    t1 += Run<int, Union1<int>>(\"fix 1 int\", rate, r, Generator.Fix_int_1);\n                    t1 += Run<Vector, Union1<Vector>>(\"rnd 1 Vec\", rate, r, Generator.Random_Vector_1);\n                    t1 += Run<Vector, Union1<Vector>>(\"fix 1 Vec\", rate, r, Generator.Fix_Vector_1);\n                    t1 += Run<string, Union1<string>>(\"rnd 1 str\", rate, r, Generator.Random_string_1);\n                    t1 += Run<string, Union1<string>>(\"fix 1 str\", rate, r, Generator.Fix_string_1);\n                    t2 += Run<int, Union2<int>>(\"rnd 2 int\", rate, r, Generator.Random_int_2);\n                    t2 += Run<int, Union2<int>>(\"fix 2 int\", rate, r, Generator.Fix_int_2);\n                    t2 += Run<Vector, Union2<Vector>>(\"rnd 2 Vec\", rate, r, Generator.Random_Vector_2);\n                    t2 += Run<Vector, Union2<Vector>>(\"fix 2 Vec\", rate, r, Generator.Fix_Vector_2);\n                    t2 += Run<string, Union2<string>>(\"rnd 2 str\", rate, r, Generator.Random_string_2);\n                    t2 += Run<string, Union2<string>>(\"fix 2 str\", rate, r, Generator.Fix_string_2);\n                    t3 += Run<int, Union3<int>>(\"rnd 3 int\", rate, r, Generator.Random_int_3);\n                    t3 += Run<int, Union3<int>>(\"fix 3 int\", rate, r, Generator.Fix_int_3);\n                    t3 += Run<Vector, Union3<Vector>>(\"rnd 3 Vec\", rate, r, Generator.Random_Vector_3);\n                    t3 += Run<Vector, Union3<Vector>>(\"fix 3 Vec\", rate, r, Generator.Fix_Vector_3);\n                    t3 += Run<string, Union3<string>>(\"rnd 3 str\", rate, r, Generator.Random_string_3);\n                    t3 += Run<string, Union3<string>>(\"fix 3 str\", rate, r, Generator.Fix_string_3);\n                    t4 += Run<int, Union4<int>>(\"rnd 4 int\", rate, r, Generator.Random_int_4);\n                    t4 += Run<int, Union4<int>>(\"fix 4 int\", rate, r, Generator.Fix_int_4);\n                    t4 += Run<Vector, Union4<Vector>>(\"rnd 4 Vec\", rate, r, Generator.Random_Vector_4);\n                    t4 += Run<Vector, Union4<Vector>>(\"fix 4 Vec\", rate, r, Generator.Fix_Vector_4);\n                    t4 += Run<string, Union4<string>>(\"rnd 4 str\", rate, r, Generator.Random_string_4);\n                    t4 += Run<string, Union4<string>>(\"fix 4 str\", rate, r, Generator.Fix_string_4);\n                    t5 += Run<int, Union5<int>>(\"rnd 5 int\", rate, r, Generator.Random_int_5);\n                    t5 += Run<int, Union5<int>>(\"fix 5 int\", rate, r, Generator.Fix_int_5);\n                    t5 += Run<Vector, Union5<Vector>>(\"rnd 5 Vec\", rate, r, Generator.Random_Vector_5);\n                    t5 += Run<Vector, Union5<Vector>>(\"fix 5 Vec\", rate, r, Generator.Fix_Vector_5);\n                    t5 += Run<string, Union5<string>>(\"rnd 5 str\", rate, r, Generator.Random_string_5);\n                    t5 += Run<string, Union5<string>>(\"fix 5 str\", rate, r, Generator.Fix_string_5);\n                }\n            }\n\n            Console.WriteLine(\"Union1: \" + t1);\n            Console.WriteLine(\"Union2: \" + t2);\n            Console.WriteLine(\"Union3: \" + t3);\n            Console.WriteLine(\"Union4: \" + t4);\n            Console.WriteLine(\"Union5: \" + t5);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Runner.partial.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\n\nnamespace UnionTypes\n{\n    partial class Runner\n    {\n        const int NumLoop = 1000000;\n\n        public static TimeSpan Run<T, Union>(string message, double arrayRate, Random r, Func<Random, double, Union> generator)\n            where Union : IUnion<T>\n        {\n            GC.Collect();\n\n            int arrayCount = 0;\n            int valueCount = 0;\n            int itemCount = 0;\n\n            var sw = new Stopwatch();\n            sw.Start();\n\n            for (int i = 0; i < NumLoop; i++)\n            {\n                var x = generator(r, arrayRate);\n                var a = x.Array;\n                if (a != null)\n                {\n                    arrayCount++;\n                    itemCount += a.Length;\n                }\n                else\n                {\n                    valueCount++;\n                    itemCount++;\n                }\n            }\n\n            sw.Stop();\n            //Console.WriteLine($\"{message}: {sw.Elapsed}\");\n            //Console.WriteLine($\"{arrayCount} {valueCount} {itemCount} {arrayCount + valueCount}\");\n            //Console.WriteLine();\n\n            return sw.Elapsed;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Runner.tt",
    "content": "﻿<#@ template debug=\"false\" hostspecific=\"false\" language=\"C#\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ import namespace=\"System.Text\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n<#@ output extension=\".cs\" #>\n<#\nvar unions = 5;\nvar types = new[] { \"int\", \"Vector\", \"string\" };\n#>\nusing System;\n\nnamespace UnionTypes\n{\n    partial class Runner\n    {\n\n        public static void Run()\n        {\n            var r = new Random();\n\n<#\nfor (var u = 1; u <= unions; u++)\n{\n#>\n            var t<#= u #> = TimeSpan.Zero;\n<#\n}\n#>\n\n            for (int i = 0; i < 3; i++)\n            {\n                foreach (var rate in new[] { 0.1, 0.3, 0.5, 0.7, 0.9 })\n                {\n                    //Console.WriteLine(rate);\n\n<#\nfor (var u = 1; u <= unions; u++)\nforeach (var t in types)\n{\n#>\n                    t<#= u #> += Run<<#= t #>, Union<#= u #><<#= t #>>>(\"rnd <#= u #> <#= t.Substring(0, 3) #>\", rate, r, Generator.Random_<#= t #>_<#= u #>);\n                    t<#= u #> += Run<<#= t #>, Union<#= u #><<#= t #>>>(\"fix <#= u #> <#= t.Substring(0, 3) #>\", rate, r, Generator.Fix_<#= t #>_<#= u #>);\n<#\n}\n#>\n                }\n            }\n\n<#\nfor (var u = 1; u <= unions; u++)\n{\n#>\n            Console.WriteLine(\"Union<#= u #>: \" + t<#= u #>);\n<#\n}\n#>\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Union1.cs",
    "content": "﻿namespace UnionTypes\n{\n    /// <summary>\n    /// 値と配列、2つのフィールドを持つやり方。\n    /// 〇 ボックス化起きない\n    /// × フィールドが2個でコピーコストが高い\n    /// </summary>\n    struct Union1<T> : IUnion<T>\n    {\n        T _value;\n        T[] _array;\n\n        public T[] Array => _array;\n        public T Value => _value;\n\n        public Union1(T value)\n        {\n            _value = value;\n            _array = null;\n        }\n\n        public Union1(T[] array)\n        {\n            _value = default(T);\n            _array = array;\n        }\n    }\n\n    static class Union1\n    {\n        public static Union1<T> New<T>(T value) => new Union1<T>(value);\n        public static Union1<T> New<T>(T[] array) => new Union1<T>(array);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Union2.cs",
    "content": "﻿namespace UnionTypes\n{\n    /// <summary>\n    /// object に格納するやり方。\n    /// 〇 フィールドが1個\n    /// × 値型の時にbox化が起きる\n    /// × 値の取り出し時にも as (isinst命令)のコスト\n    /// </summary>\n    struct Union2<T> : IUnion<T>\n    {\n        object _value;\n\n        public T[] Array => _value as T[];\n        public T Value => (T)_value;\n\n        public Union2(T value) => _value = value;\n        public Union2(T[] array) => _value = array;\n    }\n\n    static class Union2\n    {\n        public static Union2<T> New<T>(T value) => new Union2<T>(value);\n        public static Union2<T> New<T>(T[] array) => new Union2<T>(array);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Union3.cs",
    "content": "﻿namespace UnionTypes\n{\n    /// <summary>\n    /// virtual な実装。\n    /// 〇 as とかはなくなる\n    /// × 常にヒープ確保\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    abstract class Union3<T> : IUnion<T>\n    {\n        public abstract T[] Array { get; }\n        public abstract T Value { get; }\n        private Union3() { }\n\n        public class UnionValue : Union3<T>\n        {\n            public override T[] Array => null;\n            public override T Value { get; }\n            public UnionValue(T value) => Value = value;\n        }\n\n        public class UnionArray : Union3<T>\n        {\n            public override T[] Array { get; }\n            public override T Value => default(T);\n            public UnionArray(T[] array) => Array = array;\n        }\n\n        public static Union3<T> New(T value) => new UnionValue(value);\n        public static Union3<T> New(T[] array) => new UnionArray(array);\n    }\n\n    static class Union3\n    {\n        public static Union3<T> New<T>(T value) => Union3<T>.New(value);\n        public static Union3<T> New<T>(T[] array) => Union3<T>.New(array);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Union4.cs",
    "content": "﻿namespace UnionTypes\n{\n    /// <summary>\n    /// 常に配列で持つ。\n    /// 〇 as 不要\n    /// × 値の時に常に配列の new 発生\n    /// × 要素1の配列と値を区別したければ別途 isArray フラグが必要(これはこのフラグを**持たない**実装)\n    /// </summary>\n    struct Union4<T> : IUnion<T>\n    {\n        T[] _array;\n\n        public T[] Array => _array;\n        public T Value => _array.Length >= 1 ? _array[0] : default(T);\n\n        public Union4(T value)\n        {\n            _array = new[] { value };\n        }\n        public Union4(T[] array)\n        {\n            _array = array;\n        }\n    }\n\n    static class Union4\n    {\n        public static Union4<T> New<T>(T value) => new Union4<T>(value);\n        public static Union4<T> New<T>(T[] array) => new Union4<T>(array);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Union5.cs",
    "content": "﻿namespace UnionTypes\n{\n    /// <summary>\n    /// 常に配列で持つ。\n    /// 〇 as 不要\n    /// × 値の時に常に配列の new 発生\n    /// × 要素1の配列と値を区別したければ別途 isArray フラグが必要(これはこのフラグを**持つ**実装)\n    /// </summary>\n    struct Union5<T> : IUnion<T>\n    {\n        bool _isArray;\n        T[] _array;\n\n        public T[] Array => _isArray ? _array : null;\n        public T Value => _array[0];\n\n        public Union5(T value)\n        {\n            _isArray = false;\n            _array = new[] { value };\n        }\n        public Union5(T[] array)\n        {\n            _isArray = true;\n            _array = array;\n        }\n    }\n\n    static class Union5\n    {\n        public static Union5<T> New<T>(T value) => new Union5<T>(value);\n        public static Union5<T> New<T>(T[] array) => new Union5<T>(array);\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/UnionTypes.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Update=\"Generator.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Generator.tt</DependentUpon>\n    </Compile>\n    <Compile Update=\"Runner.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Runner.tt</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Generator.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>Generator.cs</LastGenOutput>\n    </Content>\n    <Content Include=\"Runner.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>Runner.cs</LastGenOutput>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Service Include=\"{508349B6-6B84-4DF5-91F0-309BEEBAD82D}\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes/Vector.cs",
    "content": "﻿namespace UnionTypes\n{\n    internal struct Vector\n    {\n        public int X;\n        public int Y;\n        public int Z;\n        public Vector(int x, int y, int z)\n        {\n            X = x;\n            Y = y;\n            Z = z;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnionTypes/UnionTypes.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26020.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"UnionTypes\", \"UnionTypes\\UnionTypes.csproj\", \"{C909A08E-7940-40E3-BAFB-066FD285EF78}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{C909A08E-7940-40E3-BAFB-066FD285EF78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C909A08E-7940-40E3-BAFB-066FD285EF78}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C909A08E-7940-40E3-BAFB-066FD285EF78}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C909A08E-7940-40E3-BAFB-066FD285EF78}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/UnsafeRefReturns/UnsafeRefReturns/AccessViolation.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace UnsafeRefReturns.AccessViolation\n{\n    // # blittable/unmanaged types\n    //\n    // ## unmanaged\n    //\n    // C# でポインターにできるのは、値型しか含まない構造体だけ。\n    // GC 管理対象のmanaged参照を持っているとポインター化するの危ない。\n    // (別の型に変換し放題で、managed参照を自由に書き換えられる。\n    //  そういうことすると、GCクラッシュさせたりバッファーオーバーフロー的なセキュリティリスクがある。)\n    // managed参照を一切持たないという意味で、「unmanaged型」って呼ぶ。\n    //\n    // ## blittable\n    //\n    // C#でいうunmanaged型は、別の文脈(主にnative interop)ではblittable型って呼ばれる。\n    // ポインターを使うと、メモリ領域を丸コピーしたり、byte操作で読み書きしたりできる。\n    // 「メモリ領域丸コピーできる」って意味で、ブロック転送(blt)可能型 → blittable。\n    // ネイティブコードに対して、データをブロック転送で渡したい(マーシャリングのコストを掛けたくない)時に使うことが多いんで、「blittable型」って呼ばれる。\n    //\n    // # blittable 制約\n    //\n    // これと同じ条件を、ジェネリック型に対しても使いたいんだけど、そのためには型制約が必要。\n    // where T : unmanged とか\n    // where T : blittable とか\n    // where T : fixed とか\n    // いくつか候補あり。\n\n    class Program\n    {\n        unsafe static ref U Cast<T, U>(ref T x)\n            // こういう型制約が必要かも\n            //where T : blittable\n            //where U : blittable\n            => ref Unsafe.AsRef<U>(Unsafe.AsPointer(ref x));\n\n        static void Main() // Main には unsafe ついてない\n        {\n            var s = \"abcde\";\n            ref IntPtr p = ref Cast<string, IntPtr>(ref s); // 元凶のコード。こいつの中身自身は unsafe\n            p = (IntPtr)123456789; // 適当な値\n            Console.WriteLine(s); // safe な文脈なのに AccessViolation 例外起こせる\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnsafeRefReturns/UnsafeRefReturns/Color.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace UnsafeRefReturns\n{\n    struct Color\n    {\n        public byte A;\n        public byte R;\n        public byte G;\n        public byte B;\n        public Color(byte a, byte r, byte g, byte b) => (A, R, G, B) = (a, r, g, b);\n        public override string ToString() => (A, R, G, B).ToString();\n    }\n\n    namespace ColorSample\n    {\n        class Program\n        {\n            unsafe static void Main()\n            {\n                // 4バイトのデータ構造\n                var color = new Color(255, 204, 204, 255);\n\n                // 無理やり uint 扱いして、4バイト単位で読み書き\n                var p = (uint*)&color;\n                Console.WriteLine(p->ToString(\"X\")); // FFCCCCFF\n\n                *p = 0xFFFFA8F0;\n                Console.WriteLine(color); // (240, 168, 255, 255)\n            }\n\n            // 一応 OK\n            unsafe void NonGeneric(ref Color color)\n            {\n                fixed (Color* pc = &color)\n                {\n                    var p = (uint*)pc;\n                    Console.WriteLine(p->ToString(\"X\"));\n\n                    *p = 0xFFFFA8F0;\n                    Console.WriteLine(color);\n                }\n            }\n\n#if false\n        // これだとダメ\n        // ジェネリック型のポインターは作れない\n        unsafe void Generic<T>(ref T color)\n        {\n            fixed (T* pc = &color)\n            {\n                var p = (uint*)pc;\n                Console.WriteLine(p->ToString(\"X\"));\n\n                *p = 0xFFFFA8F0;\n                Console.WriteLine(color);\n            }\n        }\n#endif\n\n            // Unsafeクラスならできる\n            // ジェネリック型のポインター化を無理やりできる\n            unsafe void UseUnsafeClass<T>(ref T color)\n            {\n                ref uint p = ref Unsafe.AsRef<uint>(Unsafe.AsPointer(ref color));\n                Console.WriteLine(p.ToString(\"X\"));\n\n                p = 0xFFFFA8F0;\n                Console.WriteLine(color);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnsafeRefReturns/UnsafeRefReturns/Point3D.Managed.cs",
    "content": "﻿namespace UnsafeRefReturns\n{\n    namespace Managed\n    {\n        /// <summary>\n        /// 配列の薄いラッパー。\n        /// これくらいなら、set/get 用意したプロパティにしてもいいと言えばいいんだけども。\n        /// たまに、<![CDATA[ ref p.X ]]> したいときに面倒。\n        /// </summary>\n        struct Point3D\n        {\n            int[] _data;\n            private Point3D(params int[] data) => _data = data;\n            public static Point3D New(int x, int y, int z) => new Point3D(x, y, z);\n            public ref int X => ref _data[0];\n            public ref int Y => ref _data[1];\n            public ref int Z => ref _data[2];\n        }\n\n        struct Triangle\n        {\n            public Point3D[] _vertices;\n            private Triangle(params Point3D[] vertices) => _vertices = vertices;\n            public static Triangle New(Point3D a, Point3D b, Point3D c) => new Triangle(a, b, c);\n            public ref Point3D A => ref _vertices[0];\n            public ref Point3D B => ref _vertices[0];\n            public ref Point3D C => ref _vertices[0];\n        }\n\n        class Program\n        {\n            static void Main()\n            {\n                var t = Triangle.New(Point3D.New(1, 0, 0), Point3D.New(0, 1, 0), Point3D.New(0, 0, 1));\n                t.A.X = 10;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnsafeRefReturns/UnsafeRefReturns/Point3D.Pointer.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace UnsafeRefReturns\n{\n    namespace Pointer\n    {\n        /// <summary>\n        /// ポインターに対しても同じ物が書ける。\n        /// X で直接\n        /// </summary>\n        unsafe struct Point3D\n        {\n            int* _data;\n            public Point3D(int* data) => _data = data;\n            public ref int X => ref _data[0];\n            public ref int Y => ref _data[1];\n            public ref int Z => ref _data[2];\n        }\n\n        unsafe struct Triangle\n        {\n            public int* _data;\n            public Triangle(int* data) => _data = data;\n            public Point3D A => new Point3D(_data);\n            public Point3D B => new Point3D(_data + 3);\n            public Point3D C => new Point3D(_data + 6);\n        }\n\n        class Program\n        {\n            unsafe static void Main()\n            {\n                var nativePointer = Interop.Malloc(12);\n                var native = new Point3D((int*)nativePointer);\n                Interop.Free(nativePointer);\n\n                var stackPointer = stackalloc int[4];\n                var stack = new Point3D(stackPointer);\n\n                int* data = stackalloc int[9];\n                var t = new Triangle(data);\n                t.A.X = 10;\n            }\n        }\n\n        static class Interop\n        {\n            [DllImport(\"msvcrt.dll\", CallingConvention = CallingConvention.Cdecl)]\n            public static extern IntPtr Malloc(int size);\n\n            [DllImport(\"msvcrt.dll\", CallingConvention = CallingConvention.Cdecl)]\n            public static extern void Free(IntPtr ptr);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnsafeRefReturns/UnsafeRefReturns/UnsafeRefReturns.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <LangVersion>latest</LangVersion>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.5.2\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/UnsafeRefReturns/UnsafeRefReturns/ValueNull.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nnamespace UnsafeRefReturns.ValueNull\n{\n    class Program\n    {\n        unsafe static ref T NullRef<T>()\n            // こういう型制約が必要かも\n            //where T : blittable\n            => ref Unsafe.AsRef<T>((void*)0);\n\n        unsafe static void Main()\n        {\n            ref int x = ref NullRef<int>();\n\n            x = 10; // int への書き込みなのにぬるぽ\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/UnsafeRefReturns/UnsafeRefReturns.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26228.12\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"UnsafeRefReturns\", \"UnsafeRefReturns\\UnsafeRefReturns.csproj\", \"{071685AB-25C5-4E76-9EDC-81535067D702}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{071685AB-25C5-4E76-9EDC-81535067D702}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{071685AB-25C5-4E76-9EDC-81535067D702}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{071685AB-25C5-4E76-9EDC-81535067D702}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{071685AB-25C5-4E76-9EDC-81535067D702}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.0\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace Ạṇạḷỵẓẹṛ\n{\n    using System;\n    using System.Reflection;\n\n\n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources\n    {\n\n        private static global::System.Resources.ResourceManager resourceMan;\n\n        private static global::System.Globalization.CultureInfo resourceCulture;\n\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources()\n        {\n        }\n\n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager\n        {\n            get\n            {\n                if (object.ReferenceEquals(resourceMan, null))\n                {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"Ạṇạḷỵẓẹṛ.Resources\", typeof(Resources).GetTypeInfo().Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n\n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture\n        {\n            get\n            {\n                return resourceCulture;\n            }\n            set\n            {\n                resourceCulture = value;\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized string similar to Type names should be all uppercase..\n        /// </summary>\n        internal static string AnalyzerDescription\n        {\n            get\n            {\n                return ResourceManager.GetString(\"AnalyzerDescription\", resourceCulture);\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized string similar to Type name &apos;{0}&apos; contains lowercase letters.\n        /// </summary>\n        internal static string AnalyzerMessageFormat\n        {\n            get\n            {\n                return ResourceManager.GetString(\"AnalyzerMessageFormat\", resourceCulture);\n            }\n        }\n\n        /// <summary>\n        ///   Looks up a localized string similar to Type name contains lowercase letters.\n        /// </summary>\n        internal static string AnalyzerTitle\n        {\n            get\n            {\n                return ResourceManager.GetString(\"AnalyzerTitle\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Resources.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"AnalyzerDescription\" xml:space=\"preserve\">\n    <value>Type names should be all uppercase.</value>\n    <comment>An optional longer localizable description of the diagnostic.</comment>\n  </data>\n  <data name=\"AnalyzerMessageFormat\" xml:space=\"preserve\">\n    <value>Type name '{0}' contains lowercase letters</value>\n    <comment>The format-able message the diagnostic displays.</comment>\n  </data>\n  <data name=\"AnalyzerTitle\" xml:space=\"preserve\">\n    <value>Type name contains lowercase letters</value>\n    <comment>The title of the diagnostic.</comment>\n  </data>\n</root>"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/tools/install.ps1",
    "content": "param($installPath, $toolsPath, $package, $project)\n\nif($project.Object.SupportsPackageDependencyResolution)\n{\n    if($project.Object.SupportsPackageDependencyResolution())\n    {\n        # Do not install analyzers via install.ps1, instead let the project system handle it.\n        return\n    }\n}\n\n$analyzersPaths = Join-Path (Join-Path (Split-Path -Path $toolsPath -Parent) \"analyzers\") * -Resolve\n\nforeach($analyzersPath in $analyzersPaths)\n{\n    if (Test-Path $analyzersPath)\n    {\n        # Install the language agnostic analyzers.\n        foreach ($analyzerFilePath in Get-ChildItem -Path \"$analyzersPath\\*.dll\" -Exclude *.resources.dll)\n        {\n            if($project.Object.AnalyzerReferences)\n            {\n                $project.Object.AnalyzerReferences.Add($analyzerFilePath.FullName)\n            }\n        }\n    }\n}\n\n# $project.Type gives the language name like (C# or VB.NET)\n$languageFolder = \"\"\nif($project.Type -eq \"C#\")\n{\n    $languageFolder = \"cs\"\n}\nif($project.Type -eq \"VB.NET\")\n{\n    $languageFolder = \"vb\"\n}\nif($languageFolder -eq \"\")\n{\n    return\n}\n\nforeach($analyzersPath in $analyzersPaths)\n{\n    # Install language specific analyzers.\n    $languageAnalyzersPath = join-path $analyzersPath $languageFolder\n    if (Test-Path $languageAnalyzersPath)\n    {\n        foreach ($analyzerFilePath in Get-ChildItem -Path \"$languageAnalyzersPath\\*.dll\" -Exclude *.resources.dll)\n        {\n            if($project.Object.AnalyzerReferences)\n            {\n                $project.Object.AnalyzerReferences.Add($analyzerFilePath.FullName)\n            }\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/tools/uninstall.ps1",
    "content": "param($installPath, $toolsPath, $package, $project)\n\nif($project.Object.SupportsPackageDependencyResolution)\n{\n    if($project.Object.SupportsPackageDependencyResolution())\n    {\n        # Do not uninstall analyzers via uninstall.ps1, instead let the project system handle it.\n        return\n    }\n}\n\n$analyzersPaths = Join-Path (Join-Path (Split-Path -Path $toolsPath -Parent) \"analyzers\") * -Resolve\n\nforeach($analyzersPath in $analyzersPaths)\n{\n    # Uninstall the language agnostic analyzers.\n    if (Test-Path $analyzersPath)\n    {\n        foreach ($analyzerFilePath in Get-ChildItem -Path \"$analyzersPath\\*.dll\" -Exclude *.resources.dll)\n        {\n            if($project.Object.AnalyzerReferences)\n            {\n                $project.Object.AnalyzerReferences.Remove($analyzerFilePath.FullName)\n            }\n        }\n    }\n}\n\n# $project.Type gives the language name like (C# or VB.NET)\n$languageFolder = \"\"\nif($project.Type -eq \"C#\")\n{\n    $languageFolder = \"cs\"\n}\nif($project.Type -eq \"VB.NET\")\n{\n    $languageFolder = \"vb\"\n}\nif($languageFolder -eq \"\")\n{\n    return\n}\n\nforeach($analyzersPath in $analyzersPaths)\n{\n    # Uninstall language specific analyzers.\n    $languageAnalyzersPath = join-path $analyzersPath $languageFolder\n    if (Test-Path $languageAnalyzersPath)\n    {\n        foreach ($analyzerFilePath in Get-ChildItem -Path \"$languageAnalyzersPath\\*.dll\" -Exclude *.resources.dll)\n        {\n            if($project.Object.AnalyzerReferences)\n            {\n                try\n                {\n                    $project.Object.AnalyzerReferences.Remove($analyzerFilePath.FullName)\n                }\n                catch\n                {\n\n                }\n            }\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.0</TargetFramework>\n    <IncludeBuildOutput>false</IncludeBuildOutput>\n    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>\n  </PropertyGroup>\n  \n  <PropertyGroup>\n    <PackageId>Ạṇạḷỵẓẹṛ</PackageId>\n    <PackageVersion>1.0.0.0</PackageVersion>\n    <Authors>Ạụṭḥọṛ</Authors>\n    <PackageLicenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINE</PackageLicenseUrl>\n    <PackageProjectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINE</PackageProjectUrl>\n    <PackageIconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINE</PackageIconUrl>\n    <RepositoryUrl>http://REPOSITORY_URL_HERE_OR_DELETE_THIS_LINE</RepositoryUrl>\n    <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>\n    <Description>Ạṇạḷỵẓẹṛ</Description>\n    <PackageReleaseNotes>Summary of changes made in this release of the package.</PackageReleaseNotes>\n    <Copyright>Copyright</Copyright>\n    <PackageTags>Ạṇạḷỵẓẹṛ, analyzers</PackageTags>\n    <NoPackageAnalysis>true</NoPackageAnalysis>\n  </PropertyGroup>\n   \n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp.Workspaces\" Version=\"4.4.0\" PrivateAssets=\"all\" />\n    <PackageReference Update=\"NETStandard.Library\" PrivateAssets=\"all\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Update=\"Resources.Designer.cs\" DesignTime=\"True\" AutoGen=\"True\" DependentUpon=\"Resources.resx\" />\n    <EmbeddedResource Update=\"Resources.resx\" Generator=\"ResXFileCodeGenerator\" LastGenOutput=\"Resources.Designer.cs\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"tools\\*.ps1\" CopyToOutputDirectory=\"Always\" Pack=\"true\" PackagePath=\"\" />\n    <None Include=\"$(OutputPath)\\$(AssemblyName).dll\" Pack=\"true\" PackagePath=\"analyzers/dotnet/cs\" Visible=\"false\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/ẠṇạḷỵẓẹṛAnalyzer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Linq;\nusing System.Threading;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\nusing Microsoft.CodeAnalysis.Diagnostics;\n\nnamespace Ạṇạḷỵẓẹṛ\n{\n    [DiagnosticAnalyzer(LanguageNames.CSharp)]\n    public class ẠṇạḷỵẓẹṛAnalyzer : DiagnosticAnalyzer\n    {\n        public const string DiagnosticId = \"Ạṇạḷỵẓẹṛ\";\n\n        // You can change these strings in the Resources.resx file. If you do not want your analyzer to be localize-able, you can use regular strings for Title and MessageFormat.\n        // See https://github.com/dotnet/roslyn/blob/master/docs/analyzers/Localizing%20Analyzers.md for more on localization\n        private static readonly LocalizableString Title = new LocalizableResourceString(nameof(Resources.AnalyzerTitle), Resources.ResourceManager, typeof(Resources));\n        private static readonly LocalizableString MessageFormat = new LocalizableResourceString(nameof(Resources.AnalyzerMessageFormat), Resources.ResourceManager, typeof(Resources));\n        private static readonly LocalizableString Description = new LocalizableResourceString(nameof(Resources.AnalyzerDescription), Resources.ResourceManager, typeof(Resources));\n        private const string Category = \"Naming\";\n\n        private static DiagnosticDescriptor Rule = new DiagnosticDescriptor(DiagnosticId, Title, MessageFormat, Category, DiagnosticSeverity.Warning, isEnabledByDefault: true, description: Description);\n\n        public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get { return ImmutableArray.Create(Rule); } }\n\n        public override void Initialize(AnalysisContext context)\n        {\n            // TODO: Consider registering other actions that act on syntax instead of or in addition to symbols\n            // See https://github.com/dotnet/roslyn/blob/master/docs/analyzers/Analyzer%20Actions%20Semantics.md for more information\n            context.RegisterSymbolAction(AnalyzeSymbol, SymbolKind.NamedType);\n        }\n\n        private static void AnalyzeSymbol(SymbolAnalysisContext context)\n        {\n            // TODO: Replace the following code with your own analysis, generating Diagnostic objects for any issues you find\n            var namedTypeSymbol = (INamedTypeSymbol)context.Symbol;\n\n            // Find just those named type symbols with names containing lowercase letters.\n            if (namedTypeSymbol.Name.ToCharArray().Any(char.IsLower))\n            {\n                // For all such symbols, produce a diagnostic.\n                var diagnostic = Diagnostic.Create(Rule, namedTypeSymbol.Locations[0], namedTypeSymbol.Name);\n\n                context.ReportDiagnostic(diagnostic);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/ẠṇạḷỵẓẹṛCodeFixProvider.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Composition;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CodeFixes;\nusing Microsoft.CodeAnalysis.CodeActions;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\nusing Microsoft.CodeAnalysis.Rename;\nusing Microsoft.CodeAnalysis.Text;\n\nnamespace Ạṇạḷỵẓẹṛ\n{\n    [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(ẠṇạḷỵẓẹṛCodeFixProvider)), Shared]\n    public class ẠṇạḷỵẓẹṛCodeFixProvider : CodeFixProvider\n    {\n        private const string title = \"Make uppercase\";\n\n        public sealed override ImmutableArray<string> FixableDiagnosticIds\n        {\n            get { return ImmutableArray.Create(ẠṇạḷỵẓẹṛAnalyzer.DiagnosticId); }\n        }\n\n        public sealed override FixAllProvider GetFixAllProvider()\n        {\n            // See https://github.com/dotnet/roslyn/blob/master/docs/analyzers/FixAllProvider.md for more information on Fix All Providers\n            return WellKnownFixAllProviders.BatchFixer;\n        }\n\n        public sealed override async Task RegisterCodeFixesAsync(CodeFixContext context)\n        {\n            var root = await context.Document.GetSyntaxRootAsync(context.CancellationToken).ConfigureAwait(false);\n\n            // TODO: Replace the following code with your own analysis, generating a CodeAction for each fix to suggest\n            var diagnostic = context.Diagnostics.First();\n            var diagnosticSpan = diagnostic.Location.SourceSpan;\n\n            // Find the type declaration identified by the diagnostic.\n            var declaration = root.FindToken(diagnosticSpan.Start).Parent.AncestorsAndSelf().OfType<TypeDeclarationSyntax>().First();\n\n            // Register a code action that will invoke the fix.\n            context.RegisterCodeFix(\n                CodeAction.Create(\n                    title: title,\n                    createChangedSolution: c => MakeUppercaseAsync(context.Document, declaration, c), \n                    equivalenceKey: title),\n                diagnostic);\n        }\n\n        private async Task<Solution> MakeUppercaseAsync(Document document, TypeDeclarationSyntax typeDecl, CancellationToken cancellationToken)\n        {\n            // Compute new uppercase name.\n            var identifierToken = typeDecl.Identifier;\n            var newName = identifierToken.Text.ToUpperInvariant();\n\n            // Get the symbol representing the type to be renamed.\n            var semanticModel = await document.GetSemanticModelAsync(cancellationToken);\n            var typeSymbol = semanticModel.GetDeclaredSymbol(typeDecl, cancellationToken);\n\n            // Produce a new solution that has all references to that type renamed, including the declaration.\n            var originalSolution = document.Project.Solution;\n            var optionSet = originalSolution.Workspace.Options;\n            var newSolution = await Renamer.RenameSymbolAsync(document.Project.Solution, typeSymbol, newName, optionSet, cancellationToken).ConfigureAwait(false);\n\n            // Return the new solution with the now-uppercase type name.\n            return newSolution;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/DataSource/result-schema.json",
    "content": "﻿{\n    \"$schema\": \"http://json-schema.org/draft-04/schema\",\n\n    \"title\": \"Json schema for Diagnostic Results\",\n\n    \"type\": \"array\",\n\n    \"items\": {\n        \"type\": \"object\",\n\n        \"properties\": {\n            \"id\": { \"type\": \"string\", \"description\": \"A unique identifier for the diagnostic.\" },\n            \"sevirity\": { \"enum\": [ \"Hidden\", \"Info\", \"Warning\", \"Error\" ], \"description\": \"Describes how severe a diagnostic is.\" },\n            \"line\": { \"type\": \"integer\", \"description\": \"The line number of location where the diagnostic appears.\" },\n            \"column\": { \"type\": \"integer\", \"description\": \"The column number of location where the diagnostic appears.\" },\n            \"path\": { \"type\": \"string\", \"description\": \"The path of the source document file.\" },\n          \"message-args\": {\n            \"type\": \"array\",\n            \"items\": { \"type\": \"string\" },\n            \"description\": \"Arguments to a format message string.\"\n          }\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/DataSource/ẠṇạḷỵẓẹṛUnitTests/EmptySource/Source/Class1.csx",
    "content": "﻿"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/DataSource/ẠṇạḷỵẓẹṛUnitTests/LowercaseLetters/Diagnostic/Results.json",
    "content": "﻿[\n  {\n    \"id\": \"Ạṇạḷỵẓẹṛ\",\n    \"sevirity\": \"Warning\",\n    \"line\": 10,\n    \"column\": 11,\n    \"path\": \"Class1.csx\",\n    \"message-args\": [\"TypeName\"]\n  }\n]"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/DataSource/ẠṇạḷỵẓẹṛUnitTests/LowercaseLetters/Expected/Class1.csx",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Diagnostics;\n\nnamespace ConsoleApplication1\n{\n    class TYPENAME\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/DataSource/ẠṇạḷỵẓẹṛUnitTests/LowercaseLetters/Source/Class1.csx",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Diagnostics;\n\nnamespace ConsoleApplication1\n{\n    class TypeName\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/Helpers/CodeFixVerifier.Helper.cs",
    "content": "using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CodeActions;\nusing Microsoft.CodeAnalysis.Formatting;\nusing Microsoft.CodeAnalysis.Simplification;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\n\nnamespace TestHelper\n{\n    /// <summary>\n    /// Diagnostic Producer class with extra methods dealing with applying codefixes\n    /// All methods are static\n    /// </summary>\n    public abstract partial class CodeFixVerifier : DiagnosticVerifier\n    {\n        /// <summary>\n        /// Apply the inputted CodeAction to the inputted document.\n        /// Meant to be used to apply codefixes.\n        /// </summary>\n        /// <param name=\"document\">The Document to apply the fix on</param>\n        /// <param name=\"codeAction\">A CodeAction that will be applied to the Document.</param>\n        /// <returns>A Document with the changes from the CodeAction</returns>\n        private static Document ApplyFix(Document document, CodeAction codeAction)\n        {\n            var operations = codeAction.GetOperationsAsync(CancellationToken.None).Result;\n            var solution = operations.OfType<ApplyChangesOperation>().Single().ChangedSolution;\n            return solution.GetDocument(document.Id);\n        }\n\n        /// <summary>\n        /// Compare two collections of Diagnostics,and return a list of any new diagnostics that appear only in the second collection.\n        /// Note: Considers Diagnostics to be the same if they have the same Ids.  In the case of multiple diagnostics with the same Id in a row,\n        /// this method may not necessarily return the new one.\n        /// </summary>\n        /// <param name=\"diagnostics\">The Diagnostics that existed in the code before the CodeFix was applied</param>\n        /// <param name=\"newDiagnostics\">The Diagnostics that exist in the code after the CodeFix was applied</param>\n        /// <returns>A list of Diagnostics that only surfaced in the code after the CodeFix was applied</returns>\n        private static IEnumerable<Diagnostic> GetNewDiagnostics(IEnumerable<Diagnostic> diagnostics, IEnumerable<Diagnostic> newDiagnostics)\n        {\n            var oldArray = diagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray();\n            var newArray = newDiagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray();\n\n            int oldIndex = 0;\n            int newIndex = 0;\n\n            while (newIndex < newArray.Length)\n            {\n                if (oldIndex < oldArray.Length && oldArray[oldIndex].Id == newArray[newIndex].Id)\n                {\n                    ++oldIndex;\n                    ++newIndex;\n                }\n                else\n                {\n                    yield return newArray[newIndex++];\n                }\n            }\n        }\n\n        /// <summary>\n        /// Get the existing compiler diagnostics on the inputted document.\n        /// </summary>\n        /// <param name=\"document\">The Document to run the compiler diagnostic analyzers on</param>\n        /// <returns>The compiler diagnostics that were found in the code</returns>\n        private static IEnumerable<Diagnostic> GetCompilerDiagnostics(Document document)\n        {\n            return document.GetSemanticModelAsync().Result.GetDiagnostics();\n        }\n\n        /// <summary>\n        /// Given a document, turn it into a string based on the syntax root\n        /// </summary>\n        /// <param name=\"document\">The Document to be converted to a string</param>\n        /// <returns>A string containing the syntax of the Document after formatting</returns>\n        public static string GetStringFromDocument(Document document)\n        {\n            var simplifiedDoc = Simplifier.ReduceAsync(document, Simplifier.Annotation).Result;\n            var root = simplifiedDoc.GetSyntaxRootAsync().Result;\n            root = Formatter.Format(root, Formatter.Annotation, simplifiedDoc.Project.Solution.Workspace);\n            return root.GetText().ToString();\n        }\n    }\n}\n\n"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/Helpers/DiagnosticResult.cs",
    "content": "using Microsoft.CodeAnalysis;\nusing System;\n\nnamespace TestHelper\n{\n    /// <summary>\n    /// Location where the diagnostic appears, as determined by path, line number, and column number.\n    /// </summary>\n    public struct DiagnosticResultLocation\n    {\n        public DiagnosticResultLocation(string path, int line, int column)\n        {\n            if (line < -1)\n            {\n                throw new ArgumentOutOfRangeException(nameof(line), \"line must be >= -1\");\n            }\n\n            if (column < -1)\n            {\n                throw new ArgumentOutOfRangeException(nameof(column), \"column must be >= -1\");\n            }\n\n            this.Path = path;\n            this.Line = line;\n            this.Column = column;\n        }\n\n        public string Path { get; }\n        public int Line { get; }\n        public int Column { get; }\n    }\n\n    /// <summary>\n    /// Struct that stores information about a Diagnostic appearing in a source\n    /// </summary>\n    public struct DiagnosticResult\n    {\n        private DiagnosticResultLocation[] locations;\n\n        public DiagnosticResultLocation[] Locations\n        {\n            get\n            {\n                if (this.locations == null)\n                {\n                    this.locations = new DiagnosticResultLocation[] { };\n                }\n                return this.locations;\n            }\n\n            set\n            {\n                this.locations = value;\n            }\n        }\n\n        public DiagnosticSeverity Severity { get; set; }\n\n        public string Id { get; set; }\n\n        public string Message { get; set; }\n\n        public string Path\n        {\n            get\n            {\n                return this.Locations.Length > 0 ? this.Locations[0].Path : \"\";\n            }\n        }\n\n        public int Line\n        {\n            get\n            {\n                return this.Locations.Length > 0 ? this.Locations[0].Line : -1;\n            }\n        }\n\n        public int Column\n        {\n            get\n            {\n                return this.Locations.Length > 0 ? this.Locations[0].Column : -1;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/Helpers/DiagnosticVerifier.Helper.cs",
    "content": "using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.Diagnostics;\nusing Microsoft.CodeAnalysis.Text;\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.Linq;\n\nnamespace TestHelper\n{\n    /// <summary>\n    /// Class for turning strings into documents and getting the diagnostics on them\n    /// All methods are static\n    /// </summary>\n    public abstract partial class DiagnosticVerifier\n    {\n        private static readonly MetadataReference CorlibReference = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);\n        private static readonly MetadataReference SystemCoreReference = MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location);\n        private static readonly MetadataReference CSharpSymbolsReference = MetadataReference.CreateFromFile(typeof(CSharpCompilation).Assembly.Location);\n        private static readonly MetadataReference CodeAnalysisReference = MetadataReference.CreateFromFile(typeof(Compilation).Assembly.Location);\n\n        internal static string DefaultFilePathPrefix = \"Test\";\n        internal static string CSharpDefaultFileExt = \"cs\";\n        internal static string VisualBasicDefaultExt = \"vb\";\n        internal static string TestProjectName = \"TestProject\";\n\n        #region  Get Diagnostics\n\n        /// <summary>\n        /// Given classes in the form of strings, their language, and an IDiagnosticAnalyzer to apply to it, return the diagnostics found in the string after converting it to a document.\n        /// </summary>\n        /// <param name=\"sources\">Classes in the form of strings</param>\n        /// <param name=\"language\">The language the source classes are in</param>\n        /// <param name=\"analyzer\">The analyzer to be run on the sources</param>\n        /// <returns>An IEnumerable of Diagnostics that surfaced in the source code, sorted by Location</returns>\n        private static Diagnostic[] GetSortedDiagnostics(string[] sources, string language, DiagnosticAnalyzer analyzer)\n        {\n            return GetSortedDiagnosticsFromDocuments(analyzer, GetDocuments(sources, language));\n        }\n\n        /// <summary>\n        /// Given an analyzer and a document to apply it to, run the analyzer and gather an array of diagnostics found in it.\n        /// The returned diagnostics are then ordered by location in the source document.\n        /// </summary>\n        /// <param name=\"analyzer\">The analyzer to run on the documents</param>\n        /// <param name=\"documents\">The Documents that the analyzer will be run on</param>\n        /// <returns>An IEnumerable of Diagnostics that surfaced in the source code, sorted by Location</returns>\n        protected static Diagnostic[] GetSortedDiagnosticsFromDocuments(DiagnosticAnalyzer analyzer, Document[] documents)\n        {\n            var projects = new HashSet<Project>();\n            foreach (var document in documents)\n            {\n                projects.Add(document.Project);\n            }\n\n            var diagnostics = new List<Diagnostic>();\n            foreach (var project in projects)\n            {\n                var compilationWithAnalyzers = project.GetCompilationAsync().Result.WithAnalyzers(ImmutableArray.Create(analyzer));\n                var diags = compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync().Result;\n                foreach (var diag in diags)\n                {\n                    if (diag.Location == Location.None || diag.Location.IsInMetadata)\n                    {\n                        diagnostics.Add(diag);\n                    }\n                    else\n                    {\n                        for (int i = 0; i < documents.Length; i++)\n                        {\n                            var document = documents[i];\n                            var tree = document.GetSyntaxTreeAsync().Result;\n                            if (tree == diag.Location.SourceTree)\n                            {\n                                diagnostics.Add(diag);\n                            }\n                        }\n                    }\n                }\n            }\n\n            var results = SortDiagnostics(diagnostics);\n            diagnostics.Clear();\n            return results;\n        }\n\n        /// <summary>\n        /// Sort diagnostics by location in source document\n        /// </summary>\n        /// <param name=\"diagnostics\">The list of Diagnostics to be sorted</param>\n        /// <returns>An IEnumerable containing the Diagnostics in order of Location</returns>\n        private static Diagnostic[] SortDiagnostics(IEnumerable<Diagnostic> diagnostics)\n        {\n            return diagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray();\n        }\n\n        #endregion\n\n        #region Set up compilation and documents\n        /// <summary>\n        /// Given an array of strings as sources and a language, turn them into a project and return the documents and spans of it.\n        /// </summary>\n        /// <param name=\"sources\">Classes in the form of strings</param>\n        /// <param name=\"language\">The language the source code is in</param>\n        /// <returns>A Tuple containing the Documents produced from the sources and their TextSpans if relevant</returns>\n        private static Document[] GetDocuments(string[] sources, string language)\n        {\n            if (language != LanguageNames.CSharp && language != LanguageNames.VisualBasic)\n            {\n                throw new ArgumentException(\"Unsupported Language\");\n            }\n\n            var project = CreateProject(sources, language);\n            var documents = project.Documents.ToArray();\n\n            if (sources.Length != documents.Length)\n            {\n                throw new InvalidOperationException(\"Amount of sources did not match amount of Documents created\");\n            }\n\n            return documents;\n        }\n\n        /// <summary>\n        /// Create a Document from a string through creating a project that contains it.\n        /// </summary>\n        /// <param name=\"source\">Classes in the form of a string</param>\n        /// <param name=\"language\">The language the source code is in</param>\n        /// <returns>A Document created from the source string</returns>\n        protected static Document CreateDocument(string source, string language = LanguageNames.CSharp)\n        {\n            return CreateProject(new[] { source }, language).Documents.First();\n        }\n\n        /// <summary>\n        /// Create a project using the inputted strings as sources.\n        /// </summary>\n        /// <param name=\"sources\">Classes in the form of strings</param>\n        /// <param name=\"language\">The language the source code is in</param>\n        /// <returns>A Project created out of the Documents created from the source strings</returns>\n        private static Project CreateProject(string[] sources, string language = LanguageNames.CSharp)\n        {\n            string fileNamePrefix = DefaultFilePathPrefix;\n            string fileExt = language == LanguageNames.CSharp ? CSharpDefaultFileExt : VisualBasicDefaultExt;\n\n            var projectId = ProjectId.CreateNewId(debugName: TestProjectName);\n\n            var solution = new AdhocWorkspace()\n                .CurrentSolution\n                .AddProject(projectId, TestProjectName, TestProjectName, language)\n                .AddMetadataReference(projectId, CorlibReference)\n                .AddMetadataReference(projectId, SystemCoreReference)\n                .AddMetadataReference(projectId, CSharpSymbolsReference)\n                .AddMetadataReference(projectId, CodeAnalysisReference);\n\n            int count = 0;\n            foreach (var source in sources)\n            {\n                var newFileName = fileNamePrefix + count + \".\" + fileExt;\n                var documentId = DocumentId.CreateNewId(projectId, debugName: newFileName);\n                solution = solution.AddDocument(documentId, newFileName, SourceText.From(source));\n                count++;\n            }\n            return solution.GetProject(projectId);\n        }\n        #endregion\n    }\n}\n\n"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/Verifiers/CodeFixVerifier.cs",
    "content": "using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CodeActions;\nusing Microsoft.CodeAnalysis.CodeFixes;\nusing Microsoft.CodeAnalysis.Diagnostics;\nusing Microsoft.CodeAnalysis.Formatting;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing Xunit;\n\nnamespace TestHelper\n{\n    /// <summary>\n    /// Superclass of all Unit tests made for diagnostics with codefixes.\n    /// Contains methods used to verify correctness of codefixes\n    /// </summary>\n    public abstract partial class CodeFixVerifier : DiagnosticVerifier\n    {\n        /// <summary>\n        /// Returns the codefix being tested (C#) - to be implemented in non-abstract class\n        /// </summary>\n        /// <returns>The CodeFixProvider to be used for CSharp code</returns>\n        protected virtual CodeFixProvider GetCSharpCodeFixProvider() => null;\n\n        /// <summary>\n        /// Returns the codefix being tested (VB) - to be implemented in non-abstract class\n        /// </summary>\n        /// <returns>The CodeFixProvider to be used for VisualBasic code</returns>\n        protected virtual CodeFixProvider GetBasicCodeFixProvider() => null;\n\n        /// <summary>\n        /// Called to test a C# codefix when applied on the inputted string as a source\n        /// </summary>\n        /// <param name=\"oldSource\">A class in the form of a string before the CodeFix was applied to it</param>\n        /// <param name=\"newSource\">A class in the form of a string after the CodeFix was applied to it</param>\n        /// <param name=\"codeFixIndex\">Index determining which codefix to apply if there are multiple</param>\n        /// <param name=\"allowNewCompilerDiagnostics\">A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied</param>\n        protected void VerifyCSharpFix(string oldSource, string newSource, int? codeFixIndex = null, bool allowNewCompilerDiagnostics = false)\n        {\n            VerifyFix(LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), GetCSharpCodeFixProvider(), oldSource, newSource, codeFixIndex, allowNewCompilerDiagnostics);\n        }\n\n        /// <summary>\n        /// Called to test a VB codefix when applied on the inputted string as a source\n        /// </summary>\n        /// <param name=\"oldSource\">A class in the form of a string before the CodeFix was applied to it</param>\n        /// <param name=\"newSource\">A class in the form of a string after the CodeFix was applied to it</param>\n        /// <param name=\"codeFixIndex\">Index determining which codefix to apply if there are multiple</param>\n        /// <param name=\"allowNewCompilerDiagnostics\">A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied</param>\n        protected void VerifyBasicFix(string oldSource, string newSource, int? codeFixIndex = null, bool allowNewCompilerDiagnostics = false)\n        {\n            VerifyFix(LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), GetBasicCodeFixProvider(), oldSource, newSource, codeFixIndex, allowNewCompilerDiagnostics);\n        }\n\n        /// <summary>\n        /// General verifier for codefixes.\n        /// Creates a Document from the source string, then gets diagnostics on it and applies the relevant codefixes.\n        /// Then gets the string after the codefix is applied and compares it with the expected result.\n        /// Note: If any codefix causes new diagnostics to show up, the test fails unless allowNewCompilerDiagnostics is set to true.\n        /// </summary>\n        /// <param name=\"language\">The language the source code is in</param>\n        /// <param name=\"analyzer\">The analyzer to be applied to the source code</param>\n        /// <param name=\"codeFixProvider\">The codefix to be applied to the code wherever the relevant Diagnostic is found</param>\n        /// <param name=\"oldSource\">A class in the form of a string before the CodeFix was applied to it</param>\n        /// <param name=\"newSource\">A class in the form of a string after the CodeFix was applied to it</param>\n        /// <param name=\"codeFixIndex\">Index determining which codefix to apply if there are multiple</param>\n        /// <param name=\"allowNewCompilerDiagnostics\">A bool controlling whether or not the test will fail if the CodeFix introduces other warnings after being applied</param>\n        private void VerifyFix(string language, DiagnosticAnalyzer analyzer, CodeFixProvider codeFixProvider, string oldSource, string newSource, int? codeFixIndex, bool allowNewCompilerDiagnostics)\n        {\n            var document = CreateDocument(oldSource, language);\n            var analyzerDiagnostics = GetSortedDiagnosticsFromDocuments(analyzer, new[] { document });\n            var compilerDiagnostics = GetCompilerDiagnostics(document);\n            var attempts = analyzerDiagnostics.Length;\n\n            for (int i = 0; i < attempts; ++i)\n            {\n                var actions = new List<CodeAction>();\n                var context = new CodeFixContext(document, analyzerDiagnostics[0], (a, d) => actions.Add(a), CancellationToken.None);\n                codeFixProvider.RegisterCodeFixesAsync(context).Wait();\n\n                if (!actions.Any())\n                {\n                    break;\n                }\n\n                if (codeFixIndex != null)\n                {\n                    document = ApplyFix(document, actions.ElementAt((int)codeFixIndex));\n                    break;\n                }\n\n                document = ApplyFix(document, actions.ElementAt(0));\n                analyzerDiagnostics = GetSortedDiagnosticsFromDocuments(analyzer, new[] { document });\n\n                var newCompilerDiagnostics = GetNewDiagnostics(compilerDiagnostics, GetCompilerDiagnostics(document));\n\n                //check if applying the code fix introduced any new compiler diagnostics\n                if (!allowNewCompilerDiagnostics && newCompilerDiagnostics.Any())\n                {\n                    // Format and get the compiler diagnostics again so that the locations make sense in the output\n                    document = document.WithSyntaxRoot(Formatter.Format(document.GetSyntaxRootAsync().Result, Formatter.Annotation, document.Project.Solution.Workspace));\n                    newCompilerDiagnostics = GetNewDiagnostics(compilerDiagnostics, GetCompilerDiagnostics(document));\n\n                    Assert.True(false,\n                        string.Format(\"Fix introduced new compiler diagnostics:\\r\\n{0}\\r\\n\\r\\nNew document:\\r\\n{1}\\r\\n\",\n                            string.Join(\"\\r\\n\", newCompilerDiagnostics.Select(d => d.ToString())),\n                            document.GetSyntaxRootAsync().Result.ToFullString()));\n                }\n\n                //check if there are analyzer diagnostics left after the code fix\n                if (!analyzerDiagnostics.Any())\n                {\n                    break;\n                }\n            }\n\n            //after applying all of the code fixes, compare the resulting string to the inputted one\n            var actual = GetStringFromDocument(document);\n            Assert.Equal(newSource, actual);\n        }\n    }\n}"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/Verifiers/ConventionCodeFixVerifier.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Collections.Immutable;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.CompilerServices;\nusing System.Threading;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CodeActions;\nusing Microsoft.CodeAnalysis.CodeFixes;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.Diagnostics;\nusing Microsoft.CodeAnalysis.Text;\nusing Newtonsoft.Json;\nusing System;\nusing Xunit;\n\nnamespace TestHelper\n{\n    public abstract class ConventionCodeFixVerifier : CodeFixVerifier\n    {\n        public ConventionCodeFixVerifier()\n        {\n            var t = GetType();\n            DataSourcePath = Path.Combine(\"../../../DataSource\", t.Name);\n        }\n\n        private string DataSourcePath { get; }\n\n        private static string ReadIfExists(string path)\n        {\n            if (!File.Exists(path)) return string.Empty;\n            return File.ReadAllText(path);\n        }\n\n        protected void VerifyCSharpByConvention([CallerMemberName]string testName = null)\n        {\n            var sourcePath = Path.Combine(DataSourcePath, testName, \"Source\");\n            VerifyCSharpByConventionV2(testName);\n        }\n\n        private void VerifyCSharpByConventionV2(string testName)\n        {\n            var sources = ReadSources(testName);\n            var expectedResults = ReadDiagnosticResultsFromFolder(testName);\n            var expectedSources = ReadExpectedSources(testName);\n\n            VerifyCSharp(sources, expectedResults.ToArray(), expectedSources.ToArray());\n        }\n\n        private IEnumerable<DiagnosticResult> ReadDiagnosticResultsFromFolder(string testName)\n        {\n            var diagnosticPath = Path.Combine(DataSourcePath, testName, \"Diagnostic\");\n\n            if (!Directory.Exists(diagnosticPath))\n                return Array.Empty<DiagnosticResult>();\n\n            var results = ReadResultsFromFolder(diagnosticPath);\n\n            return GetDiagnosticResult(results);\n        }\n\n        private IEnumerable<Result> ReadResultsFromFolder(string diagnosticPath)\n        {\n            foreach (var file in Directory.GetFiles(diagnosticPath, \"*.json\"))\n            {\n                if (file.EndsWith(\"action.json\", System.StringComparison.InvariantCultureIgnoreCase))\n                    continue;\n\n                foreach (var r in ReadResults(file))\n                {\n                    yield return r;\n                }\n            }\n        }\n\n\n        private Dictionary<string, string> ReadSources(string testName)\n        {\n            var sourcePath = Path.Combine(DataSourcePath, testName, \"Source\");\n\n            return ReadFiles(sourcePath);\n        }\n\n        private IEnumerable<FixResult> ReadExpectedSources(string testName)\n        {\n            var testPath = Path.Combine(DataSourcePath, testName);\n\n            var exprectedFolders = Directory.GetDirectories(testPath, \"Expected*\");\n\n            foreach (var expectedPath in exprectedFolders)\n            {\n                var m = System.Text.RegularExpressions.Regex.Match(expectedPath, @\"\\d+$\");\n                var index = m.Success ? int.Parse(m.Value) : 0;\n\n                yield return new FixResult(index, ReadFiles(expectedPath));\n            }\n        }\n\n        private static Dictionary<string, string> ReadFiles(string sourcePath)\n        {\n            if (!Directory.Exists(sourcePath))\n                return null;\n\n            var sources = new Dictionary<string, string>();\n\n            foreach (var file in Directory.GetFiles(sourcePath, \"*.csx\"))\n            {\n                var code = File.ReadAllText(file);\n                var name = Path.GetFileName(file);\n                sources.Add(name, code);\n            }\n\n            return sources;\n        }\n\n        class FixResult\n        {\n            public int Index { get; }\n\n            public Dictionary<string, string> ExpectedSources { get; }\n\n            /// <summary></summary>\n            /// <param name=\"index\"><see cref=\"Index\"/></param>\n            /// <param name=\"expectedSources\"><see cref=\"ExpectedSources\"/></param>\n            public FixResult(int index, Dictionary<string, string> expectedSources)\n            {\n                Index = index;\n                ExpectedSources = expectedSources;\n            }\n        }\n\n        private void VerifyCSharp(Dictionary<string, string> sources, DiagnosticResult[] expectedResults, params FixResult[] fixResults)\n        {\n            var analyzer = GetCSharpDiagnosticAnalyzer();\n            var fix = GetCSharpCodeFixProvider();\n\n            var originalProject = CreateProject(sources);\n\n            var diagnostics = GetDiagnostics(originalProject, analyzer);\n            VerifyDiagnosticResults(diagnostics, analyzer, expectedResults);\n\n            foreach (var fixResult in fixResults)\n            {\n                var project = ApplyFix(originalProject, analyzer, fix, fixResult.Index);\n\n                var expectedSources = fixResult.ExpectedSources;\n\n                if (expectedSources == null || !expectedSources.Any())\n                    return;\n\n                var actualSources = new Dictionary<string, string>();\n\n                foreach (var doc in project.Documents)\n                {\n                    var code = GetStringFromDocument(doc);\n                    actualSources.Add(doc.Name, code);\n                }\n\n                Assert.True(actualSources.Keys.SequenceEqual(expectedSources.Keys));\n\n                foreach (var item in actualSources)\n                {\n                    var actual = item.Value;\n                    var newSource = expectedSources[item.Key];\n                    Assert.Equal(newSource, actual);\n                }\n            }\n        }\n\n        private static Project ApplyFix(Project project, DiagnosticAnalyzer analyzer, CodeFixProvider fix, int fixIndex)\n        {\n            var diagnostics = GetDiagnostics(project, analyzer);\n            var fixableDiagnostics = diagnostics.Where(d => fix.FixableDiagnosticIds.Contains(d.Id)).ToArray();\n\n            var attempts = fixableDiagnostics.Length;\n\n            for (int i = 0; i < attempts; i++)\n            {\n                var diag = fixableDiagnostics.First();\n                var doc = project.Documents.FirstOrDefault(d => d.Name == diag.Location.SourceTree.FilePath);\n\n                if (doc == null)\n                {\n                    fixableDiagnostics = fixableDiagnostics.Skip(1).ToArray();\n                    continue;\n                }\n\n                var actions = new List<CodeAction>();\n                var fixContex = new CodeFixContext(doc, diag, (a, d) => actions.Add(a), CancellationToken.None);\n                fix.RegisterCodeFixesAsync(fixContex).Wait();\n\n                if (!actions.Any())\n                {\n                    break;\n                }\n\n                var codeAction = actions[fixIndex];\n\n                var operations = codeAction.GetOperationsAsync(CancellationToken.None).Result;\n                var solution = operations.OfType<ApplyChangesOperation>().Single().ChangedSolution;\n                project = solution.GetProject(project.Id);\n\n                fixableDiagnostics = GetDiagnostics(project, analyzer)\n                    .Where(d => fix.FixableDiagnosticIds.Contains(d.Id)).ToArray();\n\n                if (!fixableDiagnostics.Any()) break;\n            }\n\n            return project;\n        }\n\n        private static Diagnostic[] GetDiagnostics(Project project, DiagnosticAnalyzer analyzer)\n        {\n            var compilationWithAnalyzers = project.GetCompilationAsync().Result.WithAnalyzers(ImmutableArray.Create(analyzer));\n            var diagnostics = compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync().Result;\n            return diagnostics.OrderBy(d => d.Location.SourceSpan.Start).ToArray();\n        }\n\n        protected virtual IEnumerable<MetadataReference> References\n        {\n            get\n            {\n                yield return MetadataReference.CreateFromFile(typeof(object).Assembly.Location);\n                yield return MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location);\n                yield return MetadataReference.CreateFromFile(typeof(CSharpCompilation).Assembly.Location);\n                yield return MetadataReference.CreateFromFile(typeof(Compilation).Assembly.Location);\n            }\n        }\n\n        protected virtual CSharpCompilationOptions CompilationOptions => new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);\n\n        protected Project CreateProject(Dictionary<string, string> sources)\n        {\n            string fileNamePrefix = DefaultFilePathPrefix;\n            string fileExt = CSharpDefaultFileExt;\n\n            var projectId = ProjectId.CreateNewId(debugName: TestProjectName);\n\n            var solution = new AdhocWorkspace()\n                .CurrentSolution\n                .AddProject(projectId, TestProjectName, TestProjectName, LanguageNames.CSharp);\n\n            foreach (var reference in References)\n            {\n                solution = solution.AddMetadataReference(projectId, reference);\n            }\n\n            int count = 0;\n            foreach (var source in sources)\n            {\n                var newFileName = source.Key;\n                var documentId = DocumentId.CreateNewId(projectId, debugName: newFileName);\n                solution = solution.AddDocument(documentId, newFileName, SourceText.From(source.Value));\n                count++;\n            }\n\n            var project = solution.GetProject(projectId)\n                .WithCompilationOptions(CompilationOptions);\n            return project;\n        }\n\n        #region read expected results from JSON file\n\n        private IEnumerable<DiagnosticResult> GetDiagnosticResult(IEnumerable<Result> results)\n        {\n            var supportedDiagnostics = GetCSharpDiagnosticAnalyzer().SupportedDiagnostics;\n            var analyzers = supportedDiagnostics.ToDictionary(x => x.Id);\n\n            foreach (var r in results)\n            {\n                var diag = analyzers[r.Id];\n                yield return new DiagnosticResult\n                {\n                    Id = r.Id,\n                    Message = r.MessageArgs == null ? diag.MessageFormat.ToString() : string.Format(diag.MessageFormat.ToString(), (object[])r.MessageArgs),\n                    Severity = r.Sevirity,\n                    Locations = new[] { new DiagnosticResultLocation(r.Path ?? \"Source.cs\", r.Line, r.Column) },\n                };\n            }\n        }\n\n        private IEnumerable<Result> ReadResults(string path)\n        {\n            if (!File.Exists(path)) return Array.Empty<Result>();\n\n            try\n            {\n                var result = JsonConvert.DeserializeObject<Result>(File.ReadAllText(path));\n                return new[] { result };\n            }\n            catch\n            {\n            }\n\n            // backward compatibility\n            try\n            {\n                var results = JsonConvert.DeserializeObject<Result[]>(File.ReadAllText(path));\n                return results;\n            }\n            catch\n            {\n            }\n\n            return Array.Empty<Result>();\n        }\n\n        private class Result\n        {\n            [JsonProperty(PropertyName = \"id\")]\n            public string Id { get; set; }\n\n            [JsonProperty(PropertyName = \"sevirity\")]\n            public DiagnosticSeverity Sevirity { get; set; }\n\n            [JsonProperty(PropertyName = \"line\")]\n            public int Line { get; set; }\n\n            [JsonProperty(PropertyName = \"column\")]\n            public int Column { get; set; }\n\n            [JsonProperty(PropertyName = \"path\")]\n            public string Path { get; set; }\n\n            [JsonProperty(PropertyName = \"message-args\")]\n            public string[] MessageArgs { get; set; }\n        }\n\n        #endregion\n    }\n}"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/Verifiers/DiagnosticVerifier.cs",
    "content": "using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.Diagnostics;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing Xunit;\n\nnamespace TestHelper\n{\n    /// <summary>\n    /// Superclass of all Unit Tests for DiagnosticAnalyzers\n    /// </summary>\n    public abstract partial class DiagnosticVerifier\n    {\n        #region To be implemented by Test classes\n        /// <summary>\n        /// Get the CSharp analyzer being tested - to be implemented in non-abstract class\n        /// </summary>\n        protected virtual DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer() => null;\n\n        /// <summary>\n        /// Get the Visual Basic analyzer being tested (C#) - to be implemented in non-abstract class\n        /// </summary>\n        protected virtual DiagnosticAnalyzer GetBasicDiagnosticAnalyzer() => null;\n        #endregion\n\n        #region Verifier wrappers\n\n        /// <summary>\n        /// Called to test a C# DiagnosticAnalyzer when applied on the single inputted string as a source\n        /// Note: input a DiagnosticResult for each Diagnostic expected\n        /// </summary>\n        /// <param name=\"source\">A class in the form of a string to run the analyzer on</param>\n        /// <param name=\"expected\"> DiagnosticResults that should appear after the analyzer is run on the source</param>\n        protected void VerifyCSharpDiagnostic(string source, params DiagnosticResult[] expected)\n        {\n            VerifyDiagnostics(new[] { source }, LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), expected);\n        }\n\n        /// <summary>\n        /// Called to test a VB DiagnosticAnalyzer when applied on the single inputted string as a source\n        /// Note: input a DiagnosticResult for each Diagnostic expected\n        /// </summary>\n        /// <param name=\"source\">A class in the form of a string to run the analyzer on</param>\n        /// <param name=\"expected\">DiagnosticResults that should appear after the analyzer is run on the source</param>\n        protected void VerifyBasicDiagnostic(string source, params DiagnosticResult[] expected)\n        {\n            VerifyDiagnostics(new[] { source }, LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), expected);\n        }\n\n        /// <summary>\n        /// Called to test a C# DiagnosticAnalyzer when applied on the inputted strings as a source\n        /// Note: input a DiagnosticResult for each Diagnostic expected\n        /// </summary>\n        /// <param name=\"sources\">An array of strings to create source documents from to run the analyzers on</param>\n        /// <param name=\"expected\">DiagnosticResults that should appear after the analyzer is run on the sources</param>\n        protected void VerifyCSharpDiagnostic(string[] sources, params DiagnosticResult[] expected)\n        {\n            VerifyDiagnostics(sources, LanguageNames.CSharp, GetCSharpDiagnosticAnalyzer(), expected);\n        }\n\n        /// <summary>\n        /// Called to test a VB DiagnosticAnalyzer when applied on the inputted strings as a source\n        /// Note: input a DiagnosticResult for each Diagnostic expected\n        /// </summary>\n        /// <param name=\"sources\">An array of strings to create source documents from to run the analyzers on</param>\n        /// <param name=\"expected\">DiagnosticResults that should appear after the analyzer is run on the sources</param>\n        protected void VerifyBasicDiagnostic(string[] sources, params DiagnosticResult[] expected)\n        {\n            VerifyDiagnostics(sources, LanguageNames.VisualBasic, GetBasicDiagnosticAnalyzer(), expected);\n        }\n\n        /// <summary>\n        /// General method that gets a collection of actual diagnostics found in the source after the analyzer is run, \n        /// then verifies each of them.\n        /// </summary>\n        /// <param name=\"sources\">An array of strings to create source documents from to run the analyzers on</param>\n        /// <param name=\"language\">The language of the classes represented by the source strings</param>\n        /// <param name=\"analyzer\">The analyzer to be run on the source code</param>\n        /// <param name=\"expected\">DiagnosticResults that should appear after the analyzer is run on the sources</param>\n        private void VerifyDiagnostics(string[] sources, string language, DiagnosticAnalyzer analyzer, params DiagnosticResult[] expected)\n        {\n            var diagnostics = GetSortedDiagnostics(sources, language, analyzer);\n            VerifyDiagnosticResults(diagnostics, analyzer, expected);\n        }\n\n        #endregion\n\n        #region Actual comparisons and verifications\n        /// <summary>\n        /// Checks each of the actual Diagnostics found and compares them with the corresponding DiagnosticResult in the array of expected results.\n        /// Diagnostics are considered equal only if the DiagnosticResultLocation, Id, Severity, and Message of the DiagnosticResult match the actual diagnostic.\n        /// </summary>\n        /// <param name=\"actualResults\">The Diagnostics found by the compiler after running the analyzer on the source code</param>\n        /// <param name=\"analyzer\">The analyzer that was being run on the sources</param>\n        /// <param name=\"expectedResults\">Diagnostic Results that should have appeared in the code</param>\n        protected static void VerifyDiagnosticResults(IEnumerable<Diagnostic> actualResults, DiagnosticAnalyzer analyzer, params DiagnosticResult[] expectedResults)\n        {\n            int expectedCount = expectedResults.Count();\n            int actualCount = actualResults.Count();\n\n            if (expectedCount != actualCount)\n            {\n                string diagnosticsOutput = actualResults.Any() ? FormatDiagnostics(analyzer, actualResults.ToArray()) : \"    NONE.\";\n\n                Assert.True(false,\n                    string.Format(\"Mismatch between number of diagnostics returned, expected \\\"{0}\\\" actual \\\"{1}\\\"\\r\\n\\r\\nDiagnostics:\\r\\n{2}\\r\\n\", expectedCount, actualCount, diagnosticsOutput));\n            }\n\n            for (int i = 0; i < expectedResults.Length; i++)\n            {\n                var actual = actualResults.ElementAt(i);\n                var expected = expectedResults[i];\n\n                if (expected.Line == -1 && expected.Column == -1)\n                {\n                    if (actual.Location != Location.None)\n                    {\n                        Assert.True(false,\n                            string.Format(\"Expected:\\nA project diagnostic with No location\\nActual:\\n{0}\",\n                            FormatDiagnostics(analyzer, actual)));\n                    }\n                }\n                else\n                {\n                    VerifyDiagnosticLocation(analyzer, actual, actual.Location, expected.Locations.First());\n                    var additionalLocations = actual.AdditionalLocations.ToArray();\n\n                    if (additionalLocations.Length != expected.Locations.Length - 1)\n                    {\n                        Assert.True(false,\n                            string.Format(\"Expected {0} additional locations but got {1} for Diagnostic:\\r\\n    {2}\\r\\n\",\n                                expected.Locations.Length - 1, additionalLocations.Length,\n                                FormatDiagnostics(analyzer, actual)));\n                    }\n\n                    for (int j = 0; j < additionalLocations.Length; ++j)\n                    {\n                        VerifyDiagnosticLocation(analyzer, actual, additionalLocations[j], expected.Locations[j + 1]);\n                    }\n                }\n\n                if (actual.Id != expected.Id)\n                {\n                    Assert.True(false,\n                        string.Format(\"Expected diagnostic id to be \\\"{0}\\\" was \\\"{1}\\\"\\r\\n\\r\\nDiagnostic:\\r\\n    {2}\\r\\n\",\n                            expected.Id, actual.Id, FormatDiagnostics(analyzer, actual)));\n                }\n\n                if (actual.Severity != expected.Severity)\n                {\n                    Assert.True(false,\n                        string.Format(\"Expected diagnostic severity to be \\\"{0}\\\" was \\\"{1}\\\"\\r\\n\\r\\nDiagnostic:\\r\\n    {2}\\r\\n\",\n                            expected.Severity, actual.Severity, FormatDiagnostics(analyzer, actual)));\n                }\n\n                if (actual.GetMessage() != expected.Message)\n                {\n                    Assert.True(false,\n                        string.Format(\"Expected diagnostic message to be \\\"{0}\\\" was \\\"{1}\\\"\\r\\n\\r\\nDiagnostic:\\r\\n    {2}\\r\\n\",\n                            expected.Message, actual.GetMessage(), FormatDiagnostics(analyzer, actual)));\n                }\n            }\n        }\n\n        /// <summary>\n        /// Helper method to VerifyDiagnosticResult that checks the location of a diagnostic and compares it with the location in the expected DiagnosticResult.\n        /// </summary>\n        /// <param name=\"analyzer\">The analyzer that was being run on the sources</param>\n        /// <param name=\"diagnostic\">The diagnostic that was found in the code</param>\n        /// <param name=\"actual\">The Location of the Diagnostic found in the code</param>\n        /// <param name=\"expected\">The DiagnosticResultLocation that should have been found</param>\n        private static void VerifyDiagnosticLocation(DiagnosticAnalyzer analyzer, Diagnostic diagnostic, Location actual, DiagnosticResultLocation expected)\n        {\n            var actualSpan = actual.GetLineSpan();\n\n            Assert.True(actualSpan.Path == expected.Path || (actualSpan.Path != null && actualSpan.Path.Contains(\"Test0.\") && expected.Path.Contains(\"Test.\")),\n                string.Format(\"Expected diagnostic to be in file \\\"{0}\\\" was actually in file \\\"{1}\\\"\\r\\n\\r\\nDiagnostic:\\r\\n    {2}\\r\\n\",\n                    expected.Path, actualSpan.Path, FormatDiagnostics(analyzer, diagnostic)));\n\n            var actualLinePosition = actualSpan.StartLinePosition;\n\n            // Only check line position if there is an actual line in the real diagnostic\n            if (actualLinePosition.Line > 0)\n            {\n                if (actualLinePosition.Line + 1 != expected.Line)\n                {\n                    Assert.True(false,\n                        string.Format(\"Expected diagnostic to be on line \\\"{0}\\\" was actually on line \\\"{1}\\\"\\r\\n\\r\\nDiagnostic:\\r\\n    {2}\\r\\n\",\n                            expected.Line, actualLinePosition.Line + 1, FormatDiagnostics(analyzer, diagnostic)));\n                }\n            }\n\n            // Only check column position if there is an actual column position in the real diagnostic\n            if (actualLinePosition.Character > 0)\n            {\n                if (actualLinePosition.Character + 1 != expected.Column)\n                {\n                    Assert.True(false,\n                        string.Format(\"Expected diagnostic to start at column \\\"{0}\\\" was actually at column \\\"{1}\\\"\\r\\n\\r\\nDiagnostic:\\r\\n    {2}\\r\\n\",\n                            expected.Column, actualLinePosition.Character + 1, FormatDiagnostics(analyzer, diagnostic)));\n                }\n            }\n        }\n        #endregion\n\n        #region Formatting Diagnostics\n        /// <summary>\n        /// Helper method to format a Diagnostic into an easily readable string\n        /// </summary>\n        /// <param name=\"analyzer\">The analyzer that this verifier tests</param>\n        /// <param name=\"diagnostics\">The Diagnostics to be formatted</param>\n        /// <returns>The Diagnostics formatted as a string</returns>\n        private static string FormatDiagnostics(DiagnosticAnalyzer analyzer, params Diagnostic[] diagnostics)\n        {\n            var builder = new StringBuilder();\n            for (int i = 0; i < diagnostics.Length; ++i)\n            {\n                builder.AppendLine(\"// \" + diagnostics[i].ToString());\n\n                var analyzerType = analyzer.GetType();\n                var rules = analyzer.SupportedDiagnostics;\n\n                foreach (var rule in rules)\n                {\n                    if (rule != null && rule.Id == diagnostics[i].Id)\n                    {\n                        var location = diagnostics[i].Location;\n                        if (location == Location.None)\n                        {\n                            builder.AppendFormat(\"GetGlobalResult({0}.{1})\", analyzerType.Name, rule.Id);\n                        }\n                        else\n                        {\n                            Assert.True(location.IsInSource,\n                                string.Format(\"Test base does not currently handle diagnostics in metadata locations. Diagnostic in metadata:\\r\\n\", diagnostics[i]));\n\n                            string resultMethodName = diagnostics[i].Location.SourceTree.FilePath.EndsWith(\".cs\") ? \"GetCSharpResultAt\" : \"GetBasicResultAt\";\n                            var linePosition = diagnostics[i].Location.GetLineSpan().StartLinePosition;\n\n                            builder.AppendFormat(\"{0}({1}, {2}, {3}.{4})\",\n                                resultMethodName,\n                                linePosition.Line + 1,\n                                linePosition.Character + 1,\n                                analyzerType.Name,\n                                rule.Id);\n                        }\n\n                        if (i != diagnostics.Length - 1)\n                        {\n                            builder.Append(',');\n                        }\n\n                        builder.AppendLine();\n                        break;\n                    }\n                }\n            }\n            return builder.ToString();\n        }\n        #endregion\n    }\n}"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/Ạṇạḷỵẓẹṛ.Test.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Remove=\"DataSource\\ẠṇạḷỵẓẹṛUnitTests\\EmptySource\\Source\\Class1.csx\" />\n    <None Remove=\"DataSource\\ẠṇạḷỵẓẹṛUnitTests\\LowercaseLetters\\Expected\\Class1.csx\" />\n    <None Remove=\"DataSource\\ẠṇạḷỵẓẹṛUnitTests\\LowercaseLetters\\Source\\Class1.csx\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Include=\"DataSource\\ẠṇạḷỵẓẹṛUnitTests\\EmptySource\\Source\\Class1.csx\" />\n    <Compile Include=\"DataSource\\ẠṇạḷỵẓẹṛUnitTests\\LowercaseLetters\\Expected\\Class1.csx\" />\n    <Compile Include=\"DataSource\\ẠṇạḷỵẓẹṛUnitTests\\LowercaseLetters\\Source\\Class1.csx\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp.Workspaces\" Version=\"4.4.0\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.4.1\" />\n    <PackageReference Include=\"xunit\" Version=\"2.4.2\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.4.5\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Ạṇạḷỵẓẹṛ\\Ạṇạḷỵẓẹṛ.csproj\" />\n  </ItemGroup>\n\n  <ProjectExtensions><VisualStudio><UserProperties DataSource_4ẠṇạḷỵẓẹṛUnitTests_4LowercaseLetters_4Diagnostic_4Results_1json__JSONSchema=\"result-schama-v2\" /></VisualStudio></ProjectExtensions>\n\n</Project>\n"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Test/ẠṇạḷỵẓẹṛUnitTests.cs",
    "content": "﻿using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CodeFixes;\nusing Microsoft.CodeAnalysis.Diagnostics;\nusing System;\nusing TestHelper;\nusing Xunit;\nusing Ạṇạḷỵẓẹṛ;\n\nnamespace Ạṇạḷỵẓẹṛ.Test\n{\n    public class ẠṇạḷỵẓẹṛUnitTests : ConventionCodeFixVerifier\n    {\n        [Fact]\n        public void EmptySource() => VerifyCSharpByConvention();\n\n        [Fact]\n        public void LowercaseLetters() => VerifyCSharpByConvention();\n\n        protected override CodeFixProvider GetCSharpCodeFixProvider() => new ẠṇạḷỵẓẹṛCodeFixProvider();\n\n        protected override DiagnosticAnalyzer GetCSharpDiagnosticAnalyzer() => new ẠṇạḷỵẓẹṛAnalyzer();\n    }\n}\n"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Vsix/source.extension.vsixmanifest",
    "content": "﻿<?xml version=\"1.0\" ?>\n<PackageManifest Version=\"2.0.0\" xmlns=\"http://schemas.microsoft.com/developer/vsx-schema/2011\" xmlns:d=\"http://schemas.microsoft.com/developer/vsx-schema-design/2011\">\n  <Metadata>\n    <Identity Id=\"Ạṇạḷỵẓẹṛ.1dd1f7a7-7947-4aa7-84c7-29edee95a0fa\" Version=\"1.0\" Language=\"en-US\" Publisher=\"xii-h\"/>\n    <DisplayName>Ạṇạḷỵẓẹṛ</DisplayName>\n    <Description xml:space=\"preserve\">This is a sample diagnostic extension for the .NET Compiler Platform (\"Roslyn\").</Description>\n  </Metadata>\n  <Installation>\n    <InstallationTarget Id=\"Microsoft.VisualStudio.Community\" Version=\"[15.0,)\" />\n  </Installation>\n  <Dependencies>\n    <Dependency Id=\"Microsoft.Framework.NDP\" DisplayName=\"Microsoft .NET Framework\" d:Source=\"Manual\" Version=\"[4.5,)\" />\n  </Dependencies>\n  <Assets>\n    <Asset Type=\"Microsoft.VisualStudio.MefComponent\" d:Source=\"Project\" d:ProjectName=\"Ạṇạḷỵẓẹṛ\" Path=\"|Ạṇạḷỵẓẹṛ|\"/>\n    <Asset Type=\"Microsoft.VisualStudio.Analyzer\" d:Source=\"Project\" d:ProjectName=\"Ạṇạḷỵẓẹṛ\" Path=\"|Ạṇạḷỵẓẹṛ|\"/>\n  </Assets>\n  <Prerequisites>\n    <Prerequisite Id=\"Microsoft.VisualStudio.Component.CoreEditor\" Version=\"[15.0,16.0)\" DisplayName=\"Visual Studio core editor\" />\n    <Prerequisite Id=\"Microsoft.VisualStudio.Component.Roslyn.LanguageServices\" Version=\"[15.0,16.0)\" DisplayName=\"Roslyn Language Services\" />\n  </Prerequisites>\n</PackageManifest>"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.Vsix/Ạṇạḷỵẓẹṛ.Vsix.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <Import Sdk=\"Microsoft.NET.Sdk\" Project=\"Sdk.props\" />\n\n  <PropertyGroup>\n    <TargetFramework>net48</TargetFramework>\n    <RootNamespace>Analyzer1.Vsix</RootNamespace>\n    <AssemblyName>Analyzer1.Vsix</AssemblyName>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <GeneratePkgDefFile>false</GeneratePkgDefFile>\n    <IncludeAssemblyInVSIXContainer>false</IncludeAssemblyInVSIXContainer>\n    <IncludeDebugSymbolsInVSIXContainer>false</IncludeDebugSymbolsInVSIXContainer>\n    <IncludeDebugSymbolsInLocalVSIXDeployment>false</IncludeDebugSymbolsInLocalVSIXDeployment>\n    <CopyBuildOutputToOutputDirectory>false</CopyBuildOutputToOutputDirectory>\n    <CopyOutputSymbolsToOutputDirectory>false</CopyOutputSymbolsToOutputDirectory>\n    <VSSDKTargetPlatformRegRootSuffix>Roslyn</VSSDKTargetPlatformRegRootSuffix>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.VSSDK.BuildTools\" Version=\"17.4.2119\" PrivateAssets=\"all\" />\n  </ItemGroup>\n\n  <PropertyGroup>\n    <StartAction>Program</StartAction>\n    <StartProgram>$(DevEnvDir)devenv.exe</StartProgram>\n    <StartArguments>/rootsuffix $(VSSDKTargetPlatformRegRootSuffix)</StartArguments>\n  </PropertyGroup>\n\n  <Import Sdk=\"Microsoft.NET.Sdk\" Project=\"Sdk.targets\" />\n\n  <Import Project=\"$(VSToolsPath)\\VSSDK\\Microsoft.VsSDK.targets\" Condition=\"Exists('$(VSToolsPath)\\VSSDK\\Microsoft.VsSDK.targets')\" />\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Ạṇạḷỵẓẹṛ\\Ạṇạḷỵẓẹṛ.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <!-- https://github.com/dotnet/sdk/issues/433 -->\n    <ProjectReference Update=\"@(ProjectReference)\" AdditionalProperties=\"TargetFramework=netstandard2.0\" />\n\n    <!-- https://github.com/Microsoft/extendvs/issues/57 -->\n    <ProjectReference Update=\"@(ProjectReference)\" Name=\"%(Filename)\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2017/Ạṇạḷỵẓẹṛ/Ạṇạḷỵẓẹṛ.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27130.2003\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Ạṇạḷỵẓẹṛ\", \"Ạṇạḷỵẓẹṛ\\Ạṇạḷỵẓẹṛ\\Ạṇạḷỵẓẹṛ.csproj\", \"{6CF7E706-F0C9-4508-8977-54C3B61269FB}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Ạṇạḷỵẓẹṛ.Test\", \"Ạṇạḷỵẓẹṛ\\Ạṇạḷỵẓẹṛ.Test\\Ạṇạḷỵẓẹṛ.Test.csproj\", \"{0F7DEE7C-C6BE-4348-9C69-2BE5623D57C9}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Ạṇạḷỵẓẹṛ.Vsix\", \"Ạṇạḷỵẓẹṛ\\Ạṇạḷỵẓẹṛ.Vsix\\Ạṇạḷỵẓẹṛ.Vsix.csproj\", \"{82193301-CA7B-41C0-BCEF-01503E0A15EB}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{6CF7E706-F0C9-4508-8977-54C3B61269FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6CF7E706-F0C9-4508-8977-54C3B61269FB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6CF7E706-F0C9-4508-8977-54C3B61269FB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6CF7E706-F0C9-4508-8977-54C3B61269FB}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0F7DEE7C-C6BE-4348-9C69-2BE5623D57C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0F7DEE7C-C6BE-4348-9C69-2BE5623D57C9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0F7DEE7C-C6BE-4348-9C69-2BE5623D57C9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0F7DEE7C-C6BE-4348-9C69-2BE5623D57C9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{82193301-CA7B-41C0-BCEF-01503E0A15EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{82193301-CA7B-41C0-BCEF-01503E0A15EB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{82193301-CA7B-41C0-BCEF-01503E0A15EB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{82193301-CA7B-41C0-BCEF-01503E0A15EB}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {149E4FEE-D6BE-4977-98F8-398709EBD7C5}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/AsyncInternal/AsyncInternal.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/AsyncInternal/AsyncInternal.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27703.2047\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"AsyncInternal\", \"AsyncInternal.csproj\", \"{D309E4FF-FC9C-4E88-8543-02CABD9F6D62}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{D309E4FF-FC9C-4E88-8543-02CABD9F6D62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D309E4FF-FC9C-4E88-8543-02CABD9F6D62}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D309E4FF-FC9C-4E88-8543-02CABD9F6D62}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D309E4FF-FC9C-4E88-8543-02CABD9F6D62}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {9C3B9E51-AE77-475B-BEA5-5E91A7AEC350}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/AsyncInternal/AwaitCodeGeneration.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\nusing System.Threading.Tasks;\n\nnamespace AsyncInternal\n{\n    class AwaitCodeGeneration\n    {\n        // 実際のコード生成に近づける: ラムダ式で代用するのをやめて、型を1個作る\n        public static Task<IEnumerable<string>> GetContents()\n        {\n            GetContentsStateMachine stateMachine = default;\n            stateMachine.builder = AsyncTaskMethodBuilder<IEnumerable<string>>.Create();\n            stateMachine.builder.Start(ref stateMachine);\n            return stateMachine.builder.Task;\n        }\n\n        struct GetContentsStateMachine : IAsyncStateMachine\n        {\n            int state;\n            List<string> contents;\n            IEnumerator<string> e;\n\n            TaskAwaiter<IEnumerable<string>> tIndexes;\n            TaskAwaiter<IEnumerable<string>> tSelectedIndexes;\n            TaskAwaiter<string> tContent;\n\n            public AsyncTaskMethodBuilder<IEnumerable<string>> builder;\n\n            public void MoveNext()\n            {\n                switch (state)\n                {\n                    case 1: goto Case1;\n                    case 2: goto Case2;\n                    case 3: goto Case3;\n                }\n                state = 1;\n                tIndexes = GetIndex().GetAwaiter();\n                if (!tIndexes.IsCompleted)\n                {\n                    builder.AwaitOnCompleted(ref tIndexes, ref this);\n                    return;\n                }\n                Case1:\n                var indexes = tIndexes.GetResult();\n                tIndexes = default;\n\n                state = 2;\n                tSelectedIndexes = SelectIndex(indexes).GetAwaiter();\n                if (!tSelectedIndexes.IsCompleted)\n                {\n                    builder.AwaitOnCompleted(ref tSelectedIndexes, ref this);\n                    return;\n                }\n                Case2:\n                var selectedIndexes = tSelectedIndexes.GetResult();\n                tSelectedIndexes = default;\n\n                contents = new List<string>();\n                e = selectedIndexes.GetEnumerator();\n\n                goto EndLoop;\n                BeginLoop:\n                state = 3;\n                tContent = GetContent(e.Current).GetAwaiter();\n                if (!tContent.IsCompleted)\n                {\n                    builder.AwaitOnCompleted(ref tContent, ref this);\n                    return;\n                }\n                Case3:\n                var content = tContent.GetResult();\n                tContent = default;\n\n                contents.Add(content);\n                EndLoop:\n                if (e.MoveNext()) goto BeginLoop;\n\n                e.Dispose();\n\n                builder.SetResult(contents);\n            }\n\n            public void SetStateMachine(IAsyncStateMachine stateMachine) => builder.SetStateMachine(stateMachine);\n        }\n\n        static async Task<IEnumerable<string>> GetIndex()\n        {\n            await Task.Delay(500);\n            return Data.Indexes;\n        }\n\n        static async Task<IEnumerable<string>> SelectIndex(IEnumerable<string> list)\n        {\n            await Task.Delay(500);\n            return Data.RandomSelect(list);\n        }\n\n        static async Task<string> GetContent(string index)\n        {\n            await Task.Delay(500);\n            return Data.GetContent(index);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/AsyncInternal/AwaitOperator.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace AsyncInternal\n{\n    class AwaitOperator\n    {\n        public static async Task<IEnumerable<string>> GetContents()\n        {\n            // インデックスをどこかから取って来て\n            var indexes = await GetIndex();\n\n            // その中の一部分を選んで\n            var selectedIndexes = await SelectIndex(indexes);\n\n            // 選んだものの中身を取得\n            var contents = new List<string>();\n            foreach (var index in selectedIndexes)\n            {\n                var content = await GetContent(index);\n                contents.Add(content);\n            }\n\n            return contents;\n        }\n\n        static async Task<IEnumerable<string>> GetIndex()\n        {\n            await Task.Delay(500);\n            return Data.Indexes;\n        }\n\n        static async Task<IEnumerable<string>> SelectIndex(IEnumerable<string> list)\n        {\n            await Task.Delay(500);\n            return Data.RandomSelect(list);\n        }\n\n        static async Task<string> GetContent(string index)\n        {\n            await Task.Delay(500);\n            return Data.GetContent(index);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/AsyncInternal/CallbackAsync.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace AsyncInternal\n{\n    /// <summary>\n    /// <see cref=\"Synchronous\"/> と同じことを、コールバック型の非同期でやると…\n    /// </summary>\n    class CallbackAsync\n    {\n        public static void GetContents(Action<IEnumerable<string>> callback)\n        {\n            // インデックスをどこかから取って来て\n            GetIndex(indexes =>\n            {\n                // その中の一部分を選んで\n                SelectIndex(indexes, selectedIndexes =>\n                {\n                    // 選んだものの中身を取得\n                    var contents = new List<string>();\n\n                    var e = selectedIndexes.GetEnumerator();\n                    Action<string> getContentCallback = null;\n\n                    void next()\n                    {\n                        if (e.MoveNext()) GetContent(e.Current, getContentCallback);\n                        else callback(contents);\n                    }\n\n                    getContentCallback  = content =>\n                    {\n                        contents.Add(content);\n                        next();\n                    };\n\n                    next();\n                });\n            });\n        }\n\n        static void GetIndex(Action<IEnumerable<string>> callback)\n        {\n            Task.Delay(500).ContinueWith(_ => callback(Data.Indexes));\n        }\n\n        static void SelectIndex(IEnumerable<string> list, Action<IEnumerable<string>> callback)\n        {\n            Task.Delay(500).ContinueWith(_ => callback(Data.RandomSelect(list)));\n        }\n\n        static void GetContent(string index, Action<string> callback)\n        {\n            Task.Delay(500).ContinueWith(_ => callback(Data.GetContent(index)));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/AsyncInternal/Data.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace AsyncInternal\n{\n    class Data\n    {\n        public static IEnumerable<string> Indexes = new[] { \"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\", \"nine\", \"ten\", \"eleven\", \"twelve\" };\n\n        public static IEnumerable<string> RandomSelect(IEnumerable<string> list)\n        {\n            var r = new Random();\n            return list.Where(_ => r.NextDouble() < 0.5).ToArray();\n        }\n\n        public static string GetContent(string index)\n        {\n            switch (index)\n            {\n                case \"one\": return \"子 🐭🐀🐁\";\n                case \"two\": return \"丑 🐮🐄🐂\";\n                case \"three\": return \"寅 🐯🐅🐆\";\n                case \"four\": return \"卯 🐰🐇🐈🐱😹😸😺😻😼😾😿🙀\";\n                case \"five\": return \"辰 🐉🐊\";\n                case \"six\": return \"巳 🐍\";\n                case \"seven\": return \"午 🐴🐎🏇\";\n                case \"eight\": return \"未 🐑🐏🐐\";\n                case \"nine\": return \"申 🐵🐒\";\n                case \"ten\": return \"酉 🐓🐔🐣🐤🐥🐦🐧\";\n                case \"eleven\": return \"戌 🐶🐕🐩\";\n                case \"twelve\": return \"亥 🐗🐷🐖🐽\";\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/AsyncInternal/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace AsyncInternal\n{\n    class Program\n    {\n        static async Task Main(string[] args)\n        {\n            Write(Synchronous.GetContents());\n\n            var tcs = new TaskCompletionSource<IEnumerable<string>>();\n            CallbackAsync.GetContents(tcs.SetResult);\n            Write(await tcs.Task);\n\n            Write(await AwaitOperator.GetContents());\n\n            Write(await AwaitCodeGeneration.GetContents());\n        }\n\n        static void Write(IEnumerable<string> contents)\n        {\n            foreach (var x in contents)\n            {\n                Console.WriteLine(x);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/AsyncInternal/Synchronous.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace AsyncInternal\n{\n    /// <summary>\n    /// とりあえず同期の時の書き方。\n    /// </summary>\n    class Synchronous\n    {\n        public static IEnumerable<string> GetContents()\n        {\n            // インデックスをどこかから取って来て\n            var indexes = GetIndex();\n\n            // その中の一部分を選んで\n            var selectedIndexes = SelectIndex(indexes);\n\n            // 選んだものの中身を取得\n            var contents = new List<string>();\n            foreach (var index in selectedIndexes)\n            {\n                var content = GetContent(index);\n                contents.Add(content);\n            }\n\n            return contents;\n        }\n\n        /// <summary>\n        /// インデックス取得。\n        /// </summary>\n        /// <remarks>\n        /// デモ用ということで適当な Delay で代用。\n        /// 実際には REST API とかで取ってくるとかそういうのを想定。\n        /// </remarks>\n        static IEnumerable<string> GetIndex() => Data.Indexes;\n\n        /// <summary>\n        /// インデックスから、一部分だけを選択。\n        /// </summary>\n        /// <remarks>\n        /// デモ用ということで、乱数で2分の1の確率で間引く。\n        /// 実際にはダイアログなりなんなりを表示して、ユーザーに選んでもらうとかを想定。\n        /// </remarks>\n        static IEnumerable<string> SelectIndex(IEnumerable<string> list) => Data.RandomSelect(list);\n\n        /// <summary>\n        /// コンテンツを取得。\n        /// </summary>\n        /// <remarks>\n        /// これも Delay で代用。\n        /// 実際にはこれも REST で取ってくるとか、ファイルから読むとかを想定。\n        /// </remarks>\n        static string GetContent(string index) => Data.GetContent(index);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/CachedAsync/CachedAsync/AsyncOperation.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.Runtime.ExceptionServices;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing System.Threading.Tasks.Sources;\n\nnamespace CachedAsync\n{\n    /// <summary>\n    /// <see cref=\"AsyncOperation{TResult}\"/>から使う静的メンバー。\n    /// 全ての型引数に対して共通のインスタンスを使いたいので、分離。\n    /// 元々は protected にして、<see cref=\"AsyncOperation{TResult}\"/> が <see cref=\"AsyncOperation\"/> を継承してた。\n    /// 元は <see cref=\"AsyncOperation{TResult}\"/> の方も internal だったからそれでよかったけど、public にするには不都合なので。\n    /// </summary>\n    internal class AsyncOperation\n    {\n        /// <summary>いわゆる「番兵」。1インスタンスを使いまわす想定なので、「使われてない」を表す状態が必要。continuation にこの Action インスタンスを入れることで表現。</summary>\n        internal static readonly Action<object> s_availableSentinel = new Action<object>(s => Debug.Fail($\"{nameof(AsyncOperation)}.{nameof(s_availableSentinel)} invoked with {s}.\"));\n        /// <summary>こっちは「完了済み」を表す番兵。</summary>\n        internal static readonly Action<object> s_completedSentinel = new Action<object>(s => Debug.Fail($\"{nameof(AsyncOperation)}.{nameof(s_completedSentinel)} invoked with {s}\"));\n\n        internal static void ThrowIncompleteOperationException() =>\n            throw new InvalidOperationException(\"the operation's result was accessed before the operation completed.\");\n\n        internal static void ThrowMultipleContinuations() =>\n            throw new InvalidOperationException(\"multiple continuations can't be set for the same operation.\");\n\n        internal static void ThrowIncorrectCurrentIdException() =>\n            throw new InvalidOperationException(\"the operation was used after it was supposed to be used.\");\n    }\n\n    /// <summary>\n    /// https://github.com/dotnet/corefx/blob/master/src/System.Threading.Channels/src/System/Threading/Channels/AsyncOperation.cs から、\n    /// デモに必要な最低限だけ残して削ったもの。\n    ///\n    /// - 常にプール前提\n    /// - <see cref=\"ExecutionContext\"/>、<see cref=\"SynchronizationContext\"/> を使わない\n    /// - コンストラクターで <see cref=\"CancellationToken\"/> を渡してキャンセルする口をなくした\n    /// - 完了処理のとき、<see cref=\"TaskFactory.StartNew(Action{object}, object)\"/> せずに直呼び\n    /// - 型引数なしの <see cref=\"IValueTaskSource\"/> は削った\n    ///\n    /// あと、コメントの和訳。\n    /// </summary>\n    /// <typeparam name=\"TResult\"></typeparam>\n    public class AsyncOperation<TResult> : IValueTaskSource<TResult>\n    {\n        private TResult _result;\n        private ExceptionDispatchInfo _error;\n        private Action<object> _continuation = AsyncOperation.s_availableSentinel;\n        private object _continuationState;\n\n        /// <summary>現在の非同期操作に紐づいてる値。</summary>\n        /// <remarks>\n        /// <see cref=\"IValueTaskSource{TResult}.GetResult(short)\"/>\n        /// キャッシュしてるインスタンスが想定外の使われ方すると token がずれるはずなので、それの検出用。\n        /// GetResult が呼ばれるたびにインクリメントする。\n        /// </remarks>\n        private short _currentId;\n\n        /// <summary>このインスタンスと現在の token から作った <see cref=\"ValueTask{TResult}\"/> を返す。</summary>\n        public ValueTask<TResult> Task => new ValueTask<TResult>(this, _currentId);\n\n        /// <summary>非同期操作の現在の状態を取得。</summary>\n        /// <param name=\"token\"><see cref=\"_currentId\"/> と一致している必要あり。</param>\n        ValueTaskSourceStatus IValueTaskSource<TResult>.GetStatus(short token)\n        {\n            if (_currentId == token)\n            {\n                return\n                    !IsCompleted ? ValueTaskSourceStatus.Pending :\n                    _error == null ? ValueTaskSourceStatus.Succeeded :\n                    _error.SourceException is OperationCanceledException ? ValueTaskSourceStatus.Canceled :\n                    ValueTaskSourceStatus.Faulted;\n            }\n\n            AsyncOperation.ThrowIncorrectCurrentIdException();\n            return default; //↑ が常に throw してるってのはコンパイラーにはわからないので、追加で return。\n        }\n\n        /// <summary>非同期操作が完了しているかを取得。</summary>\n        internal bool IsCompleted => ReferenceEquals(_continuation, AsyncOperation.s_completedSentinel);\n\n        /// <summary>非同期操作の結果を取得。</summary>\n        /// <param name=\"token\"><see cref=\"_currentId\"/> と一致している必要あり。</param>\n        TResult IValueTaskSource<TResult>.GetResult(short token)\n        {\n            if (_currentId != token)\n            {\n                AsyncOperation.ThrowIncorrectCurrentIdException();\n            }\n\n            if (!IsCompleted)\n            {\n                AsyncOperation.ThrowIncompleteOperationException();\n            }\n\n            ExceptionDispatchInfo error = _error;\n            TResult result = _result;\n            _currentId++;\n\n            Volatile.Write(ref _continuation, AsyncOperation.s_availableSentinel); // result とかの他のデータをフェッチしてから出ないとダメ\n\n            error?.Throw();\n            return result;\n        }\n\n        /// <summary>キャッシュしている値の所有権取得を試みる。</summary>\n        /// <returns>呼び出し元が所有権を取れたら true。この場合、ステートを取得する。取れなかったら false。</returns>\n        public bool TryOwnAndReset()\n        {\n            if (ReferenceEquals(Interlocked.CompareExchange(ref _continuation, null, AsyncOperation.s_availableSentinel), AsyncOperation.s_availableSentinel))\n            {\n                _continuationState = null;\n                _result = default;\n                _error = null;\n                return true;\n            }\n\n            return false;\n        }\n\n        /// <summary>非同期操作の完了時に読んでもらうコールバックを登録する。</summary>\n        /// <remarks>\n        /// すでに完了済みの状態で呼ばれた場合、\n        /// 元々の実装では <see cref=\"TaskFactory.StartNew(Action{object}, object)\"/> してた。\n        /// この実装は単に同期で continuation(state) 呼び出し。\n        /// オーバーヘッドは掛からないけども、スタックが深くなるので注意。\n        /// </remarks>\n        void IValueTaskSource<TResult>.OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags)\n        {\n            if (_currentId != token)\n            {\n                AsyncOperation.ThrowIncorrectCurrentIdException();\n            }\n\n            // CompareExchange 直後に完了している場合に備えて、CompareExchange より前にステートを書き込まないとダメ。\n            // こちらの意図に反して誰かが複数の continuation を間違えてスケジューリングしようとした場合、間違ったステートを使ってしまうことになる。\n            // できる限りはそういう誤用を拾いたい。\n            if (_continuationState != null)\n            {\n                AsyncOperation.ThrowMultipleContinuations();\n            }\n            _continuationState = state;\n\n            // 引数の continuation をフィールド _continuation にセットするのを試みる。\n            // 成功は、非同期操作がまだ未完了ということになる。completer (完了処理の債務を負ってる人)は後々コールバックを呼ぶ責任がある。\n            // 失敗は、非同期操作がすでに完了していることになる。ここで continuation を呼び出す必要がある。\n            //\n            // ただ、ここは awaiter の OnCompleted の中から呼ばれているはずで、スタックが詰まれるのを避けたい。\n            // なので、(元々の実装では)continuation は非同期に読ぶ。\n            Action<object> prevContinuation = Interlocked.CompareExchange(ref _continuation, continuation, null);\n            if (prevContinuation != null)\n            {\n                // ここに入った時点で完了済みのはずだけど、何か誤用があった場合には想定外の状態になってることがあるので確認。\n                Debug.Assert(IsCompleted, $\"Expected IsCompleted\");\n                if (!ReferenceEquals(prevContinuation, AsyncOperation.s_completedSentinel))\n                {\n                    Debug.Assert(prevContinuation != AsyncOperation.s_availableSentinel, \"Continuation was the available sentinel.\");\n                    AsyncOperation.ThrowMultipleContinuations();\n                }\n\n                //// 元の実装だと StartNew してスレッドプールに enqueue。\n                //Task.Factory.StartNew(continuation, state, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);\n                continuation(state);\n            }\n        }\n\n        /// <summary>非同期操作を完了させる(成功時)</summary>\n        /// <returns>この実装だと常に true に。 SetResult に変更してもよかったかも。</returns>\n        public bool TrySetResult(TResult item)\n        {\n            _result = item;\n            SignalCompletion();\n            return true;\n        }\n\n        /// <summary>非同期操作を完了させる(失敗時)</summary>\n        /// <returns>この実装だと常に true に。 SetException に変更してもよかったかも。</returns>\n        public bool TrySetException(Exception exception)\n        {\n            _error = ExceptionDispatchInfo.Capture(exception);\n            SignalCompletion();\n            return true;\n        }\n\n        /// <summary>非同期操作を完了させる(キャンセル時)</summary>\n        /// <returns>この実装だと常に true に。 SetCancel に変更してもよかったかも。</returns>\n        public bool TrySetCanceled(CancellationToken cancellationToken = default)\n        {\n            _error = ExceptionDispatchInfo.Capture(new OperationCanceledException(cancellationToken));\n            SignalCompletion();\n            return true;\n        }\n\n        /// <summary>登録された continuation を呼び出す。</summary>\n        private void SignalCompletion()\n        {\n            if (_continuation != null || Interlocked.CompareExchange(ref _continuation, AsyncOperation.s_completedSentinel, null) != null)\n            {\n                Debug.Assert(_continuation != AsyncOperation.s_completedSentinel, $\"The continuation was the completion sentinel.\");\n                Debug.Assert(_continuation != AsyncOperation.s_availableSentinel, $\"The continuation was the available sentinel.\");\n\n                Action<object> c = _continuation;\n                _continuation = AsyncOperation.s_completedSentinel;\n                c(_continuationState);\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "Demo/2018/CachedAsync/CachedAsync/CachedAsync.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/CachedAsync/CachedAsync/FirstToTaskObserver.cs",
    "content": "﻿using System;\nusing System.Threading;\n\nnamespace CachedAsync\n{\n    /// <summary>\n    /// observable.FirstAsync(predicate).Select(selector).ToTask(ct) 相当の処理をオーバーヘッド少な目で行うために、\n    /// <see cref=\"IObserver{T}\"/> かつ <see cref=\"AsyncOperation{TResult}\"/> な型を用意。\n    /// </summary>\n    /// <remarks>\n    /// ・使い方\n    /// First().ToTask()/ToFirstTask() してたところを、new FirstToTaskObservable(observable, ct) に置き換えればOK。\n    ///\n    /// ・ManualResetValueTaskSource\n    /// 参考: https://github.com/dotnet/corefx/blob/master/src/Common/tests/System/Threading/Tasks/Sources/ManualResetValueTaskSource.cs\n    ///\n    /// <see cref=\"AsyncOperation{TResult}\"/> は↑この型がなかった頃に書いたもので、このクラスも同時期に書いたもの。\n    /// 今から作るなら普通にこの ManualResetValueTaskSource を使うと思う。\n    /// </remarks>\n    public abstract class FirstToTaskOpeartion<TArg, TResult> : AsyncOperation<TResult>, IObserver<TArg>\n    {\n        private IDisposable _subscription;\n        private CancellationTokenRegistration _ctr;\n        private readonly bool _noThrowOnCancel;\n\n        /// <summary>\n        /// </summary>\n        /// <param name=\"observable\">イベント発生元。</param>\n        /// <param name=\"ct\">キャンセル用。</param>\n        /// <param name=\"noThrowOnCancel\">キャンセル時に TrySetCancel (例外誘発)するか、TrySetResult(defalt) するか。</param>\n        public FirstToTaskOpeartion(IObservable<TArg> observable, CancellationToken ct = default, bool noThrowOnCancel = false)\n        {\n            TryOwnAndReset();\n            _subscription = observable.Subscribe(this);\n            _ctr = ct.Register(Cancel);\n            _noThrowOnCancel = noThrowOnCancel;\n        }\n\n        /// <summary>\n        /// キャンセル処理。\n        /// </summary>\n        protected virtual void Cancel()\n        {\n            _subscription.Dispose();\n            _ctr.Dispose();\n\n            if (_noThrowOnCancel) TrySetCanceled();\n            else TrySetResult(default);\n        }\n\n        void IObserver<TArg>.OnCompleted()\n        {\n            Cancel();\n        }\n\n        void IObserver<TArg>.OnError(Exception error)\n        {\n            _subscription.Dispose();\n            _ctr.Dispose();\n            TrySetException(error);\n        }\n\n        void IObserver<TArg>.OnNext(TArg value)\n        {\n            try\n            {\n                if (TryGetResult(value, out var result, out var exception))\n                {\n                    _subscription.Dispose();\n                    _ctr.Dispose();\n\n                    if (exception == null) TrySetResult(result);\n                    else TrySetException(exception);\n                }\n            }\n            catch (Exception ex)\n            {\n                TrySetException(ex);\n            }\n        }\n\n        /// <summary>\n        /// observable.FirstAsync(predicate).Select(selector).ToTask(ct)\n        /// の selector 部分。\n        /// <see cref=\"IObservable{T}\"/> 側の T を <see cref=\"AsyncOperation{TResult}\"/> 側の TResult に変換。\n        /// </summary>\n        /// <returns>\n        /// 戻り値が true の時には <see cref=\"AsyncOperation{TResult}.TrySetResult(TResult)\"/> とかを呼んでタスクを完了する。\n        /// false の時はまだ Subscribe を続ける。\n        /// </returns>\n        protected abstract bool TryGetResult(TArg arg, out TResult result, out Exception exception);\n    }\n\n    /// <summary>\n    /// <see cref=\"FirstToTaskOpeartion{TArg, TResult}\"/>\n    /// 無変換版。\n    /// </summary>\n    public class FirstToTaskOpeartion<TResult> : FirstToTaskOpeartion<TResult, TResult>\n    {\n        /// <summary>\n        /// <see cref=\"FirstToTaskOpeartion{TArg, TResult}\"/>\n        /// </summary>\n        public FirstToTaskOpeartion(IObservable<TResult> observable, CancellationToken ct = default, bool noThrowOnCancel = false)\n            : base(observable, ct, noThrowOnCancel)\n        {\n        }\n\n        /// <summary><see cref=\"FirstToTaskOpeartion{TArg, TResult}\"/></summary>\n        protected override bool TryGetResult(TResult arg, out TResult result, out Exception exception)\n        {\n            result = arg;\n            exception = null;\n            return true;\n        }\n    }\n\n    /// <summary>\n    /// デリゲート実装の <see cref=\"FirstToTaskOpeartion{TArg, TResult}\"/>。\n    /// </summary>\n    /// <remarks>\n    /// <see cref=\"FirstToTaskOpeartion{TArg, TResult}\"/>は、\n    /// デリゲートのインスタンス分のアロケーションも避けたいっていう要求から作ったものなので、\n    /// このクラスは存在自体がちょっと矛盾してるんだけど。\n    /// 一応、手軽さが欲しいとき用に作るだけは作る。\n    /// </remarks>\n    public class DelegateFirstToTaskOpeartion<TArg, TResult> : FirstToTaskOpeartion<TArg, TResult>\n    {\n        private readonly Func<TArg, bool> _predicate;\n        private readonly Func<TArg, TResult> _selector;\n\n        /// <summary><see cref=\"FirstToTaskOpeartion{TArg, TResult}\"/></summary>\n        public DelegateFirstToTaskOpeartion(IObservable<TArg> observable, Func<TArg, bool> predicate, Func<TArg, TResult> selector, CancellationToken ct = default, bool noThrowOnCancel = false)\n            : base(observable, ct, noThrowOnCancel)\n        {\n            _predicate = predicate ?? throw new NullReferenceException(nameof(predicate));\n            _selector = selector ?? throw new NullReferenceException(nameof(selector));\n        }\n\n        /// <summary><see cref=\"FirstToTaskObservable{TArg, TResult}\"/></summary>\n        protected override bool TryGetResult(TArg arg, out TResult result, out Exception exception)\n        {\n            if (_predicate(arg))\n            {\n                try\n                {\n                    result = _selector(arg);\n                    exception = null;\n                }\n                catch (Exception ex)\n                {\n                    result = default;\n                    exception = ex;\n                }\n                return true;\n            }\n            else\n            {\n                exception = null;\n                result = default;\n                return false;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/CachedAsync/CachedAsync/Program.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace CachedAsync\n{\n    class Program\n    {\n        static async Task Main()\n        {\n            var x = new TimerLoop(300);\n            await ReadAsync(x);\n            await x.StopAsync();\n        }\n\n        static async Task ReadAsync(TimerLoop x)\n        {\n            var sw = new Stopwatch();\n            sw.Start();\n            for (int i = 0; i < 10; i++)\n            {\n                var res = await x.XAsync();\n\n                var e = Math.Round(sw.ElapsedMilliseconds / 10.0) / 100;\n                Console.WriteLine((res, e, Thread.CurrentThread.ManagedThreadId));\n            }\n            sw.Stop();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/CachedAsync/CachedAsync/TimerLoop.cs",
    "content": "﻿using System;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace CachedAsync\n{\n    class TimerLoop\n    {\n        private readonly AsyncOperation<int> _cache = new AsyncOperation<int>();\n        private readonly int _intervalMillisecond;\n        private readonly CancellationTokenSource _cts;\n        private readonly Task _loop;\n\n        public TimerLoop(int intervalMillisecond)\n        {\n            _intervalMillisecond = intervalMillisecond;\n            _cts = new CancellationTokenSource();\n            _loop = Loop();\n        }\n\n        private async Task Loop()\n        {\n            var i = 0;\n            while (!_cts.IsCancellationRequested)\n            {\n                await Task.Delay(_intervalMillisecond);\n                _cache.TrySetResult(i);\n                ++i;\n            }\n        }\n\n        public Task StopAsync()\n        {\n            _cts.Cancel();\n            return _loop;\n        }\n\n        void Throw() => throw new InvalidOperationException();\n\n        public ValueTask<int> XAsync()\n        {\n            if (!_cache.TryOwnAndReset()) Throw();\n            return _cache.Task;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/CachedAsync/CachedAsync.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27703.2042\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CachedAsync\", \"CachedAsync\\CachedAsync.csproj\", \"{D790E4F3-3462-4696-933E-5FA9AB0CBCB1}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{D790E4F3-3462-4696-933E-5FA9AB0CBCB1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D790E4F3-3462-4696-933E-5FA9AB0CBCB1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D790E4F3-3462-4696-933E-5FA9AB0CBCB1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D790E4F3-3462-4696-933E-5FA9AB0CBCB1}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {029D3777-277D-4CDC-B48F-21671E1BDF49}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/CachedAsync/readme.md",
    "content": "# IValueTaskSource\n\n[ValueTask](https://www.nuget.org/packages/System.Threading.Tasks.Extensions/)には、バージョン 4.5 (.NET Core 2.1 なら標準対応)から、`IValueTaskSource`/`IValueTaskSource<T>`インターフェイスを受け付けるコンストラクターが増えてる。これまでだと、`Task`/`Task<T>`しか受け付けてなかったけど、もうちょっと特殊な実装をした非同期処理クラスを作って`await`したいという要求に応えたもの。\n\n例えば、[Channels](https://github.com/dotnet/corefx/tree/master/src/System.Threading.Channels)とか[Pipelines](https://github.com/dotnet/corefx/tree/master/src/System.IO.Pipelines)が内部で使ってる。\nこの辺りを眺めてみてる感じ、Channelsの中にある[`AsyncOperation`クラス](https://github.com/dotnet/corefx/blob/master/src/System.Threading.Channels/src/System/Threading/Channels/AsyncOperation.cs)が割とわかりやすそうだった。\n\nということで、その`AsyncOperation`を写経。デモ用に、最低限の機能に削って、コメントを日本語化した。\n\n## 補足\n\n### AsyncOperation\n\nこの`AsyncOperation`クラスは、用途としては`TaskCompletionSource`クラス(`System.Threading.Tasks`名前空間)と同じ(いわゆるPromise)。ただ、\n\n- `Task`じゃなくて`ValueTask`を使う\n  - アロケーションが1回少なくてお得\n- キャッシュ/リセットできる構造になってる\n  - 何回メソッドを呼び出しても、`new` されるインスタンスは1個だけ\n- continuation を1個しか受け付けない作りにして最適化\n  - 要するに、`List<(Action<object> continuation, object state)>`みたいなものを持たなくて済む\n\nとかをやってる。\n\n### continuation が1個だけ\n\n最後の「continuation を1個しか受け付けない作り」って言うのは、要するに、「同時に2カ所で`await`することないでしょ？」という感じ。↓みたいなコードを書くと実行時エラーになる。\n\n```cs\nvar t = MAsync();\nawait t;\nawait t;\n```\n\n`List<T>`が要らなくなるとか、`lock` が要らなくなるとかあり、結構パフォーマンスに寄与しそう。\n"
  },
  {
    "path": "Demo/2018/Cs8InVs2019P1/AsyncStreams.cs",
    "content": "﻿#if false // 今バグってる。Preview 2で治るはず\n\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace Cs8InVs2019P1.AsyncStreams\n{\n    class Program\n    {\n        // 非同期イテレーター … await/yield混在\n        static async IAsyncEnumerable<int> AsyncIterator()\n        {\n            await Task.Delay(1);\n            yield return 1;\n            await Task.Delay(1);\n            yield return 2;\n        }\n\n        // 非同期 foreach … IAsyncEnumerable からの列挙\n        static async Task AsyncForeach(IAsyncEnumerable<int> items)\n        {\n            await foreach (var item in items)\n            {\n                Console.WriteLine(item);\n            }\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Demo/2018/Cs8InVs2019P1/Cs8InVs2019P1.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <LangVersion>8.0</LangVersion>\n    <StartupObject>Cs8InVs2019P1.NRT.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/Cs8InVs2019P1/Cs8InVs2019P1.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28315.86\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Cs8InVs2019P1\", \"Cs8InVs2019P1.csproj\", \"{AACEB075-9006-4730-ACE0-91FB33939BA7}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{AACEB075-9006-4730-ACE0-91FB33939BA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AACEB075-9006-4730-ACE0-91FB33939BA7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AACEB075-9006-4730-ACE0-91FB33939BA7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AACEB075-9006-4730-ACE0-91FB33939BA7}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {4A9B58B8-FA91-4D11-8F9F-5FA8BE221715}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/Cs8InVs2019P1/InterpolatedVerbatimStrings.cs",
    "content": "﻿namespace Cs8InVs2019P1.InterpolatedVerbatimStrings\n{\n    class Program\n    {\n        static void Main()\n        {\n            var x = 1;\n\n            // こっちは C# 6.0 からあるやつ。\n            var s1 = $@\"\\\\\\ {x}\";\n\n            // これまでは $ と @ の順番逆にできなかった。\n            // C# 8.0 から @$ でも OK。\n            var s2 = @$\"\\\\\\ {x}\";\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Cs8InVs2019P1/NRT.cs",
    "content": "﻿namespace Cs8InVs2019P1.NRT\n{\n// 有効にするには #nullable ディレクティブが必要。\n#nullable enable\n\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            Console.WriteLine(LengthSum(\"abc\", \"xyz\"));\n            Console.WriteLine(LengthSum(\"abc\", null));\n        }\n\n        static int LengthSum(string a, string? b)\n        {\n#if false\n            // こう書いてしまうと b. のところで警告。\n            var len0 = a.Length + b.Length;\n\n            // これなら OK。b?. なので、b の null チェック済み。\n            var len1 = a.Length + b?.Length ?? 0;\n#endif\n\n            // こんな感じで if で null チェックしても OK。\n            // チェック済みな個所では b. で大丈夫。\n            var len = a.Length;\n            if(b != null) len += b.Length;\n\n            return len;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Cs8InVs2019P1/NullCoalescingAssignment.cs",
    "content": "﻿namespace Cs8InVs2019P1.NullCoalescingAssignment\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            NullCoalescingAssignment(\"abc\"); // \"abc\" が表示される\n            NullCoalescingAssignment(null);  // \"default string\" が表示される\n        }\n\n        static void NullCoalescingAssignment(string s)\n        {\n            s ??= \"default string\";\n            Console.WriteLine(s);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Cs8InVs2019P1/Range2D.cs",
    "content": "﻿namespace Cs8InVs2019P1.Range2D\n{\n    using System;\n\n    static class Matrix\n    {\n        public static int[,] Slice(this int[,] m,\n            int xMinInclusive, int xMaxExclusive,\n            int yMinInclusive, int yMaxExclusive)\n        {\n            var n = new int[yMaxExclusive - yMinInclusive, xMaxExclusive - xMinInclusive];\n\n            for (int y = yMinInclusive, j = 0; y < yMaxExclusive; y++, j++)\n                for (int x = xMinInclusive, i = 0; x < xMaxExclusive; x++, i++)\n                    n[j, i] = m[y, x];\n\n            return n;\n        }\n    }\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var m = new[,]\n            {\n                { 1, 2, 3, 4 },\n                { 5, 6, 7, 8 },\n                { 9, 10, 11, 12 },\n            };\n\n            // (x, y) が (1, 2) ～ (3, 4) の範囲？\n            // x が 1～2、y が 3～4 の範囲？\n            // 2, 4 は含む？含まない？\n            var n = m.Slice(1, 2, 3, 4);\n\n            foreach (int x in n)\n            {\n                Console.WriteLine(x);\n            }\n\n            var i = 2;\n            var r = i..i - 1;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Cs8InVs2019P1/RangeAndIndex.cs",
    "content": "﻿namespace Cs8InVs2019P1.RangeAndIndex\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            Span<int> data = new[] { 0, 1, 2, 3, 4, 5 };\n\n            // 1～2要素目。2 は exclusive。なので、表示されるのは 1 だけ。\n            Write(data[1..2]);\n\n            // 先頭から1～末尾から1。 1, 2, 3, 4\n            Write(data[1..^1]);\n\n            // 先頭～末尾から1。 0, 1, 2, 3, 4\n            Write(data[..^1]);\n\n            // 先頭から1～末尾。 1, 2, 3, 4, 5\n            Write(data[1..]);\n\n            // 全体。0, 1, 2, 3, 4, 5\n            Write(data[..]);\n        }\n\n        // .NET Core 3.0 には Span<int> に Range 型を受け取るインデクサーが入る予定。\n        // Preview 1 以降なら実装入ってるっぽい。\n        // Preview 1 以前の daily build な .NET Core 3.0 を使ってて、「なぜかまだない」と思ってこのメソッド実装しちゃったけど、不要。\n        static Span<int> Slice(Span<int> data, Range range)\n        {\n#if ForOlderVersion\n            int getIndex(int length, Index i) => i.FromEnd ? length - i.Value : i.Value;\n            var s = getIndex(data.Length, range.Start);\n            var e = getIndex(data.Length, range.End);\n            return data.Slice(s, e - s);\n#else\n            return data[range];\n#endif\n        }\n\n        // 表示確認用。Span の中身を , 区切り表示。\n        static void Write<T>(Span<T> items)\n        {\n            var first = true;\n            foreach (var x in items)\n            {\n                if (first) first = false;\n                else Console.Write(\", \");\n                Console.Write(x);\n            }\n            Console.WriteLine();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Cs8InVs2019P1/ThrowHelper.cs",
    "content": "﻿namespace System\n{\n    internal class ThrowHelper\n    {\n        internal static void ThrowValueArgumentOutOfRange_NeedNonNegNumException() => throw new ArgumentOutOfRangeException(\"need non negative number\");\n    }\n}"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/BackingFieldAttribute/Program.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing static System.Reflection.BindingFlags;\n\nnamespace ConsoleApp1.BackingFieldAttribute\n{\n    [AttributeUsage(AttributeTargets.Field)]\n    class MyAttribute : Attribute { }\n\n    class MyClass\n    {\n        /// <summary>\n        /// プロパティに対して field 指定で属性を付けると、それがバック フィールドに反映されるようになった。\n        /// 今までは、書けたけど反映されず、無視されてた(警告だけは出る)。\n        ///\n        /// C# 7.2 以前、イベント構文の場合はこれが有効だったのに、なぜかプロパティでは反映されないという謎仕様。\n        ///\n        /// たぶん、<see cref=\"NonSerializedAttribute\"/> とかはそれなりに使い道があるはず。\n        /// この属性を付けたいがために自動プロパティにできない(↓みたいに書かないといけない)ことがちらほらあった。\n        /// <code><![CDATA[\n        /// [NonSerialized]\n        /// private int _x;\n        /// public int X { get => _x; set => _x = value; }\n        /// ]]></code>\n        ///\n        /// 一応、破壊的変更ではある。\n        /// 前述の通り今までは単に無視されてて、その場合、「AttributeTargets が Field ではない属性を付けてもエラーにならない」という状態だった。\n        /// それが、正しく適用されるようになったことで、ちゃんと AttributeTargets の判定が入るようになった。\n        /// そういう変なコードを書いてしまっていた人がいた場合、破壊的変更ではある。\n        /// 心配するだけばかばかしいレベルだとは思うものの、一応。\n        /// (ちなみに、この属性の field 指定、「使われることがない C# 機能」ランキングを作ったら5本の指に入るレベルのレア機能。)\n        /// </summary>\n        [field:My]\n        public int X { get; set; }\n    }\n\n    /// <summary>\n    /// <see cref=\"MyClass.X\"/> の属性を確認してみる。\n    /// </summary>\n    class Program\n    {\n        static void Main()\n        {\n            var t = typeof(MyClass);\n            var x = t.GetProperty(\"X\");\n\n            // 何も表示されないはず。\n            Console.WriteLine(\"プロパティに付けた属性\");\n            foreach (var a in x.CustomAttributes)\n            {\n                Console.WriteLine(a.AttributeType.Name);\n            }\n\n            // こっちに My 属性が付いてるはず。\n            // (その他、CompilerGenerated とかが勝手につくけど、これは自動プロパティの仕様)\n            var backingField = t.GetFields(Instance | NonPublic).First();\n            Console.WriteLine(\"そのプロパティのバック フィールドに付けた属性\");\n            foreach (var a in backingField.CustomAttributes)\n            {\n                Console.WriteLine(a.AttributeType.Name);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/ConsoleApp1.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <LangVersion>latest</LangVersion>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <StartupObject>ConsoleApp1.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/Constraints/Point.cs",
    "content": "﻿namespace ConsoleApp1.Constraints.Unmanaged\n{\n    /// <summary>\n    /// プリミティブ型しか含まない構造体。\n    /// unamanaged 型(ポインター化可能)。\n    /// </summary>\n    struct Point\n    {\n        public int X;\n        public int Y;\n        public int Z;\n        public override string ToString() => (X, Y, Z).ToString();\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/Constraints/SystemDelegate.cs",
    "content": "﻿using System;\nusing static System.Linq.Expressions.Expression;\n\nnamespace ConsoleApp1.Constraints.SystemDelegate\n{\n    class Program\n    {\n        // C# 7.3 で、型制約に Delegate を指定できるように。\n        // Enum と同様、この Delegate は System.Delegate クラスのこと。\n        // System.MulticastDelegate の指定も可能。\n        static object DynamicInvoke<T>(T d, params object[] args)\n            where T : Delegate\n        {\n            // 引数の型まで制約に付けれないから結局 DynamicInvoke…\n            // パフォーマンス的には残念。\n            return d.DynamicInvoke(args);\n        }\n\n        // まあ、Expression とかを使った動的コード生成では使い道あるかも。\n        // 例として、任意の引数・戻り値を持つデリゲートを、キャストを挟んで Func<object, object> にする処理。\n        static Func<object, object> CreateDelegate<T>(T @delegate)\n            where T : Delegate\n        {\n            var t = typeof(T);\n            var invoke = t.GetMethod(\"Invoke\"); // Delegate の時点で Invoke を持っていることは確定。\n\n            // とはいえやっぱり、引数まで制約を付けれないので、望まない型を受け付けてしまう可能性あり。\n            // この例でいうと、引数の数を1個に限りたいけど、そこまでは保証できない。\n            if (invoke.GetParameters().Length >= 2) throw new InvalidOperationException();\n\n            var p = invoke.GetParameters()[0].ParameterType;\n            var r = invoke.ReturnType;\n\n            var x = Parameter(typeof(object));\n\n            // (object)invoke((ParameterType)x)\n            var ex = Lambda<Func<object, object>>(\n                Convert(Invoke(Constant(@delegate), Convert(x, p)), typeof(object)),\n                x);\n\n            return ex.Compile();\n        }\n\n        static void Main()\n        {\n            Func<int, int> i = x => x * x;\n            Func<string, int> s = x => x.Length;\n\n            Console.WriteLine(DynamicInvoke(i, 3));\n\n            Func<object, object> f1 = CreateDelegate(i);\n            Func<object, object> f2 = CreateDelegate(s);\n\n            Console.WriteLine(f1(5));\n            Console.WriteLine(f2(\"abcde\"));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/Constraints/SystemEnum.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.Constraints.SystemEnum\n{\n    class Program\n    {\n        // 型制約に Enum を付けれるようになった。\n        // この Enum は System.Enum クラス(C# に Enum キーワードが入ったとかではないし。)\n        // 今のところ、「where T : enum」 (キーワードの enum)とかは書けない。\n        // (ちなみに、struct 制約と同時に付けれる。他に struct と一緒に指定できるのはインターフェイスだけ。)\n        static void EnumConstraint<T>(T x, T y)\n            where T : struct, Enum\n        {\n            // Enum 制約により、HasFlag を使えるように。\n            // HasFlag は、.NET Core 2.0 まではパフォーマンス的な問題もあったけど、2.1 で最適化されるらしい:\n            // https://gist.github.com/ufcpp/79283511d2a10afb34f8c5c837dce1a6\n            Console.WriteLine(x.HasFlag(y));\n\n#if Uncompilable\n            // ちなみに、 == はダメ。Enum クラスに == はない。\n            Console.WriteLine(x == y);\n#endif\n        }\n\n        enum X\n        {\n            A = 1, B = 2, C = 4,\n        }\n\n        enum Y\n        {\n            α = 1, β = 2, γ = 4,\n        }\n\n        static void Main()\n        {\n            EnumConstraint(X.B, X.A);\n            EnumConstraint(X.A | X.B, X.A);\n            EnumConstraint(X.A | X.C, X.B);\n\n            EnumConstraint(Y.β, Y.α);\n            EnumConstraint(Y.α | Y.β, Y.α);\n            EnumConstraint(Y.α | Y.γ, Y.β);\n\n#if Uncompilable\n            // 6 (もちろん int) が Enum 制約違反なのでエラーになる\n            EnumConstraint(6);\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/Constraints/Unmanaged.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.Constraints.Unmanaged\n{\n    /// <summary>\n    /// これまで、ジェネリックな型に対してポインターは作れなかった。\n    ///\n    /// ポインターは、GC 管理下(managed)のオブジェクト(参照型)を1つも含まない型に対してしか使えない。\n    /// この制限がないと、GC の動作を狂わせて、かなり深刻な問題(セキュリティ ホールを含む)を起こすことができてしまう。\n    ///\n    /// その保証のために、元々、C# は、以下のような型だけをポインター化可能:\n    /// - プリミティブ型、enum\n    /// - ポインター型\n    /// - 再帰的に、上記の型しか含まない構造体\n    ///\n    /// (ちなみに、この条件を満たす型を、managed なオブジェクトを含まないという意味で、「unmanaged な型」と呼ぶ。)\n    ///\n    /// この制限はちょっと過剰気味で、ジェネリックな型に対してはポインターを作れなかった。\n    ///\n    /// これに対して C# 7.3 では、ジェネリック型引数に対して unmanaged 制約と言うのを付けることで、\n    ///\n    /// - unmanaged 型(上記条件を満たす型)に対してだけ具象化できる\n    /// - 型引数であってもポインター化できる\n    ///\n    /// というようなジェネリック定義ができるようになった。\n    /// </summary>\n    class Program\n    {\n        static void Main()\n        {\n            var point = new Point { X = 1, Y = 2, Z = 2 };\n#if Uncompilable\n            string s = \"abc\";\n#endif\n\n            unsafe\n            {\n                // ジェネリックでなければ、Point は元からポインター化可能。\n                Point* p = &point;\n\n#if Uncompilable\n                // これはダメ。\n                // 参照型のポインターは作れない。\n                string* ps = &s;\n#endif\n            }\n\n            MemSet0(ref point);\n            Console.WriteLine(point); // (0, 0, 0)\n\n#if Uncompilable\n            // これはダメ。\n            // MemSet0<T> の T に unmanaged  制約が付いてるので、string では呼べない\n            MemSet0(ref s);\n#endif\n\n#if Uncompilable\n            // これもダメ。\n            // unmanaged な型だけを含む構造体なので、原理的にはポインター化しても安全なんだけど。\n            // 再帰的なジェネリック型に対して安全保証するのはメリットの割に大変らしく、断念したとのこと。\n            var kv = new KeyValuePair<int, Point>(1, point);\n            MemSet0(ref kv);\n#endif\n        }\n\n        unsafe static void MemSet0<T>(ref T x)\n            where T : unmanaged // この型制約が C# 7.3 の新機能。\n        {\n            // 今まではこの T* が許されなかった。\n            // たとえ、Point みたいにポインター化可能な型で MemSet0<Point> を呼んだとしてもダメ。\n            // unmanaged  制約のおかげで、ポインター化可能になった。\n            fixed (T* p = &x)\n            {\n                var b = (byte*)p;\n                var size = sizeof(T);\n                for (int i = 0; i < size; i++)\n                {\n                    b[i] = 0;\n                }\n            }\n        }\n\n        static void SafeStackalloc<T>()\n            where T : unmanaged\n        {\n            // C# 7.2 の safe stackalloc 機能も、unmanaged 型に対してしか使えない。\n            // ポインターとまったく同じで、これまではジェネリック不可、C# 7.3 で unmanaged 制約を付ければ可。\n            Span<T> span = stackalloc T[4];\n        }\n\n        // ちなみに、unmanaged 制約は暗黙的に struct 制約にもなってる。\n        // unmanaged な時点で構造体であることが確定。\n        // なので、where T : unmanaged, struct みたいな重複な指定は不可。\n        // where T : unmanaged, class みたいな矛盾した指定も不可。\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/ExpressionVariables/BaseInitializer.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.ExpressionVariables\n{\n    class Base\n    {\n        protected Base(out int x)\n        {\n            x = 999;\n        }\n    }\n\n    class Derived : Base\n    {\n        // ThisInitializer でも触れたとおり、コンストラクター初期化子で out var できるように。\n        // このとき、コンストラクター自体が out で値を返しているのを out var で受け取ることもできるし、\n        // 基底クラスの base 呼び出しでも out var 可能。\n        public Derived()\n            : base(out var x)\n        {\n            // 初期化子中で宣言した変数 x はコンストラクター内でも使える。\n            Console.WriteLine(x);\n        }\n    }\n\n    class BaseInitializer\n    {\n        static void Main()\n        {\n            new Derived(); // Derived のコンストラクター内の WriteLine が呼ばれて、999 と表示される\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/ExpressionVariables/FieldInitializer.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.ExpressionVariables\n{\n    class FieldInitializer\n    {\n        // フィールド初期化子やプロパティ初期化子でも out var が使えるように。\n        public int X = Table.TryGetValue(\"one\", out var x) ? x : 0; // TryGetValue 成功 → 1\n        public int Y { get; } = Table.TryGetValue(\"abc\", out var y) ? y : 0; // TryGetValue 失敗 → 0\n\n#if Uncompilable\n        // フィールド/プロパティ初期化子中で宣言した変数は、その初期化子内でのみ有効。\n        // なので↓これはエラーに。\n        public int X2 = x;\n        public int Y2 = y;\n#endif\n\n        // X の初期化子中の x は初期化子内でだけ有効なわけで、\n        // 別の初期化子で改めて x を使っても平気。\n        public int Z { get; set; } = Table.TryGetValue(\"two\", out var x) ? x : 0; // TryGetValue 成功 → 2\n\n        // ↑これ、「C# スクリプト動作」の時との一貫性はないんだけど。\n        // スクリプト動作の時は、「変数宣言っぽく見えているものは実は見えないクラスのフィールドになってる」みたいな内部挙動なんだけど、\n        // out var で宣言された変数も、フィールドになってて、その後もずっと有効な変数になる。\n        //\n        // とはいえ、そんな内部挙動とかユーザーからすると知ったことではないわけで。\n        // 「X の初期化子で宣言した変数を Y の初期化子やコンストラクター内で使いたい」なんて思う人は少数派だろうし。\n        // どう考えても便利さよりも事故るリスクの方が大きい。\n\n        static void Main()\n        {\n            var x = new FieldInitializer();\n\n            Console.WriteLine(x.X); // 1\n            Console.WriteLine(x.Y); // 0\n            Console.WriteLine(x.Z); // 2\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/ExpressionVariables/QueryExpressions.cs",
    "content": "﻿using System;\nusing System.Linq;\n\nnamespace ConsoleApp1.ExpressionVariables\n{\n    class QueryExpressions\n    {\n        static void Main()\n        {\n            var q =\n                from s in new[] { \"a\", \"123\", \"one\", \"abc\", \"456\", \"two\" }\n\n                // クエリ式中で out var が使えるように。\n                let table = Table.TryGetValue(s, out var x) ? x : 0\n\n                // 宣言した変数は句(where とか select とか)内のみ。\n                // (まあ、句をまたぎたければ let を使えばいいし。)\n                // なので、別の句に入ったら同じ名前の変数を使っても大丈夫。\n                let parsed = int.TryParse(s, out var x) ? x : 0\n#if Uncompilable\n                // 逆に、ここでもはもう x は使えない。\n                where x == 1\n#endif\n                select (table, parsed);\n\n            // ここにも x は残らないので、改めて x を使える\n            foreach (var (x, y) in q)\n            {\n                Console.WriteLine(\"TryGetValue: \" + x);\n                Console.WriteLine(\"int.TryParse: \" + y);\n            }\n\n            // 大半の式の場合、out var で宣言した変数はその式を越えても使える。\n            // どうして「大半」に合わせなかったかと言うと、「クエリ式の各句はラムダ式みたいなもの」だから。\n            //\n            // 以下のように、ラムダ式は数少ない「式の外に変数が漏れない」仕様になってる。\n#if Uncompilable\n            Func<string, int> f = s => int.TryParse(s, out var x) ? x : 0;\n            Console.WriteLine(x); // ここでエラーになる(今までも、これからも)\n#endif\n\n            // クエリ式は、以下のようにラムダ式 + メソッド呼び出しと同じようなコードに展開される。\n            // クエリ式中の変数宣言が句単位なのは、この仕様を意識したもの。\n            var q1 =\n                from s in new[] { \"one\", \"two\", \"three\" }\n                where Table.TryGetValue(s, out var x) && x > 2 // x のスコープは句内\n                select Table.TryGetValue(s, out var x) ? x : 0; // 同上\n\n            var q2 =\n                new[] { \"one\", \"two\", \"three\" }\n                .Where(s => Table.TryGetValue(s, out var x) && x > 2) // x のスコープはラムダ式内\n                .Select(s => Table.TryGetValue(s, out var x) ? x : 0); // 同上\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/ExpressionVariables/Table.cs",
    "content": "﻿namespace ConsoleApp1.ExpressionVariables\n{\n    class Table\n    {\n        // out var のサンプルを書くのに TryGetValue が一番それっぽくなるので。\n        // 内容は適当。\n        public static bool TryGetValue(string key, out int value)\n        {\n            switch (key)\n            {\n                case \"one\":\n                    value = 1;\n                    break;\n                case \"two\":\n                    value = 2;\n                    break;\n                case \"three\":\n                    value = 3;\n                    break;\n                case \"four\":\n                    value = 4;\n                    break;\n                case \"five\":\n                    value = 5;\n                    break;\n                default:\n                    value = -1;\n                    return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/ExpressionVariables/ThisInitializer.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.ExpressionVariables\n{\n    class ThisInitializer\n    {\n        public ThisInitializer(int len) => Console.WriteLine(len);\n\n        // コンストラクター初期化子内の式中で out var が使えるように。\n        public ThisInitializer(string s)\n            : this(Table.TryGetValue(s, out var x) ? x : 0)\n        {\n            // 初期化子内で宣言した変数は、コンストラクター内で有効。\n            Console.WriteLine(x);\n        }\n\n        static void Main()\n        {\n            new ThisInitializer(\"one\"); // TryGetValue 成功(戻り値 true、out 1)。 1, 1\n            new ThisInitializer(\"abc\"); // TryGetValue 失敗(戻り値 false、out -1)。 0, -1\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/Fixed/CustomFixed.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.Fixed.CustomFixed\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var a = new Array<int>(5);\n\n            unsafe\n            {\n                // 任意の型に対して fixed が使える。\n                // fixed (int* p = &a.GetPinnableReference()) に展開される。\n                // 主に Span<T> 用。\n                // これまで、string に対しては特殊対応して fixed ステートメントを使えるようにしてたけど、今後は string に対しても GetPinnableReference を呼ぶようになるかも。\n                fixed (int* p = a)\n                {\n                    for (int i = 0; i < 5; i++)\n                    {\n                        p[i] = i;\n                    }\n                }\n            }\n\n            for (int i = 0; i < 5; i++)\n            {\n                Console.WriteLine(a[i]);\n            }\n        }\n    }\n\n    readonly struct Array<T>\n    {\n        private readonly T[] _array;\n        public Array(int length) => _array = new T[length];\n        public ref T this[int index] => ref _array[index];\n        public int Length => _array.Length;\n        public ref T GetPinnableReference() => ref _array[0];\n\n        // 正確には↓みたいな書き方しないといけないんだけど。\n        // 空配列の場合は null ポインターを返す。\n        // 見ての通り、「null ポインターの参照を返す」っていう黒魔術に Unsafe クラス必須。\n        //public unsafe ref T GetPinnableReference() => ref (_array.Length == 0 ? ref System.Runtime.CompilerServices.Unsafe.AsRef<T>(null) : ref _array[0]);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/Fixed/MovableFixedBuffer.cs",
    "content": "﻿namespace ConsoleApp1.Fixed.MovableFixedBuffer\n{\n    unsafe struct Buffer\n    {\n        public fixed byte A[8];\n\n#if Uncompilable\n        // これは C# 7.3 でもダメ\n        public byte First => A[0];\n#endif\n    }\n\n    class Program\n    {\n        static Buffer _buffer;\n\n        unsafe static void Main()\n        {\n            var buffer = new Buffer();\n            buffer.A[0] = 1; // 元々 OK\n\n            _buffer.A[0] = 2; // C# 7.3 から OK\n\n            RefFixedBuffer(ref buffer);\n\n            System.Console.WriteLine(buffer.A[0]);  // 元々 OK\n            System.Console.WriteLine(_buffer.A[0]); // C# 7.3 から OK\n        }\n\n        unsafe static void RefFixedBuffer(ref Buffer buffer)\n        {\n            buffer.A[1] = 3; // C# 7.3 から OK\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/OverloadResolution/Constraints.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.OverloadResolution.Constraints\n{\n    class Program\n    {\n        // C# 7.2 までは、ジェネリック型制約(where 句の条件)はオーバーロード解決の役に立ってなかった。\n        // なので、以下の M(T, double) と M(T, decimal) の呼び分けが難しい。\n        static void M<T>(T t, double _)\n            where T : struct\n            => Console.WriteLine($\"struct {t}\");\n\n        static void M<T>(T t, decimal _)\n            where T : class\n            => Console.WriteLine($\"class {t}\");\n\n        // インターフェイス制約も同様\n        static void M<T>(T x, string _) where T : IDisposable => Console.WriteLine(\"IDisposable\");\n        static void M<T>(T x, object _) where T : IComparable => Console.WriteLine(\"IComparable\");\n\n        struct Disposable : IDisposable { public void Dispose() { } }\n        struct Comparable : IComparable { public int CompareTo(object obj) => 0; }\n\n        static void Main()\n        {\n            // int → double, int → decimal のどちらを取ればいいのかわからないので、これまではエラーになってた。\n            // C# 7.3 で、第1引数の where 句を見てオーバーロード解決できるようになったので、この呼び分けが可能に。\n            // 動作原理としては、「引数の型変換などを調べるよりも先に、制約を見て候補を絞る」って処理を足したみたい。\n\n            // DateTime → struct 制約を満たすので、M(T, double) の方が呼ばれる\n            M(DateTime.Now, 0);\n\n            // string → class 制約を満たすので、M(T, decimal) の方が呼ばれる\n            M(\"abc\", 0);\n\n            // M(T, string) が呼ばれる。\n            M(new Disposable(), null);\n\n            // M(T, object) の方に行く。\n            M(new Comparable(), null);\n        }\n\n#if Uncompilable\n        // 残念ながら、以下のように、where 句だけが違うオーバーロードは作れない。\n\n        static void M<T>(T t)\n            where T : struct\n            => Console.WriteLine($\"struct {t}\");\n\n        static void M<T>(T t)\n            where T : class\n            => Console.WriteLine($\"class {t}\");\n\n\n        // 上記のような呼び分けができるようになったんだから、C# としてはこのオーバーロードを作れてもいいはずなんだけども。\n        // .NET の型システム的に、where 句だけが違うメソッドは定義できなくなってる。\n        // これを認めるためには .NET ランタイム自体の仕様変更が必要(大変)。\n\n        // ただ、ちょっとしたトリックで問題の回避ができなくはない。\n        // 参考: DummyParameter, Extensions\n        // 実用途例: FirstOrNull\n#endif\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/OverloadResolution/DummyParameter.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.OverloadResolution.Constraints\n{\n    // 呼び分けのためだけの何の意味もない構造体。\n    struct Struct { }\n    struct Class { }\n\n    class DummyParameter\n    {\n        // C# 7.3 的に呼び分けはできるのに、.NET ランタイムの制限で同じシグネチャのメソッドを作れないのであれば、\n        // とりあえずダミーの引数を足して .NET ランタイムをだます。\n        // default 値を与えてあるので、呼ぶ側は M(T) だけで呼べる。\n        static void M<T>(T t, Struct _ = default)\n            where T : struct\n            => Console.WriteLine($\"struct {t}\");\n\n        static void M<T>(T t, Class _ = default)\n            where T : class\n            => Console.WriteLine($\"class {t}\");\n\n        static void Main()\n        {\n            // DateTime → struct 制約を満たすので、M(T, Struct) の方が呼ばれる\n            M(DateTime.Now);\n\n            // string → class 制約を満たすので、M(T, Class) の方が呼ばれる\n            M(\"abc\");\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/OverloadResolution/Extensions.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.OverloadResolution.Constraints\n{\n    // 拡張メソッドであれば、別のクラス中に、同じ型に対する同名の拡張メソッドを定義できる。\n    // これを使って、型制約だけが違う同シグネチャのメソッドを作ってしまう。\n\n    static class ExtensionsForStruct\n    {\n        public static void M<T>(this T t)\n            where T : struct\n            => Console.WriteLine($\"struct {t}\");\n    }\n\n    static class ExtensionsForClass\n    {\n        public static void M<T>(this T t)\n            where T : class\n            => Console.WriteLine($\"class {t}\");\n    }\n\n    class Extensions\n    {\n        static void Main()\n        {\n            // DateTime → struct 制約を満たすので、ExtensionsForStruct.M(T) の方が呼ばれる\n            DateTime.Now.M();\n\n            // string → class 制約を満たすので、ExtensionsForClass.M(T) の方が呼ばれる\n            \"abc\".M();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/OverloadResolution/FirstOrNull.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ConsoleApp1.OverloadResolution.Constraints.FirstOrNull\n{\n    static class ExtensionsForStruct\n    {\n        /// <summary>\n        /// 構造体に対して <see cref=\"Enumerable.FirstOrDefault{TSource}(IEnumerable{TSource}, Func{TSource, bool})\"/> を使うと、\n        /// <paramref name=\"source\"/> が元々 default 値を含んでいるときに困る。\n        /// なので、T じゃなくて T? で null を返したいんだけど…\n        ///\n        /// クラス用と構造体用を同時に定義すると C# 7.2 までは呼び分けができなかった。\n        /// C# 7.3 だと呼び分け可能。\n        ///\n        /// この手の「構造体の時だけ戻り値を T? に変えたい」需要は稀によくある。\n        /// </summary>\n        public static T? FirstOrNull<T>(this IEnumerable<T> source, Func<T, bool> predicate)\n            where T : struct\n        {\n            if (source == null) throw new ArgumentNullException(nameof(source));\n            if (predicate == null) throw new ArgumentNullException(nameof(predicate));\n\n            foreach (var item in source)\n            {\n                if (predicate(item)) return item;\n            }\n\n            return null;\n        }\n    }\n\n    static class ExtensionsForClass\n    {\n        /// <summary>\n        /// クラスの場合は <see cref=\"Enumerable.FirstOrDefault{TSource}(IEnumerable{TSource}, Func{TSource, bool})/> を呼ぶだけ。\n        /// </summary>\n        public static T FirstOrNull<T>(this IEnumerable<T> source, Func<T, bool> predicate)\n            where T : class\n            => source.FirstOrDefault(predicate);\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // ちゃんと呼び分けできているか確認\n\n            // 構造体版が呼ばれてる。\n            // 第3引数は = default が効いてて、呼び出し側では未指定で大丈夫。\n            var a = new[] { 1, 2, 3, 4, 5 };\n            Console.WriteLine(a.FirstOrNull(x => (x % 2) == 0)); // 2\n            Console.WriteLine(a.FirstOrNull(x => x > 10)); // null (何も表示されない)\n\n            // クラス版が呼ばれてる。\n            // 第3引数は = default が効いてて、呼び出し側では未指定で大丈夫。\n            var b = new[] { \"\", \"a\", \"ab\", \"abc\" };\n            Console.WriteLine(b.FirstOrNull(x => x.Length > 2)); // abc\n            Console.WriteLine(b.FirstOrNull(x => x.Length > 5)); // null (何も表示されない)\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/OverloadResolution/MethodReturn.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.OverloadResolution.MethodReturn\n{\n    class Program\n    {\n        // この2つみたいに、戻り値違いのデリゲートを受け取るオーバーロードがあったとき\n        static void M(Func<int, int> f) => Console.WriteLine(\"int => int\");\n        static void M(Func<int, bool> f) => Console.WriteLine(\"int => bool\");\n        static void M<T>(Func<int, T> f) => Console.WriteLine(\"int => generic T\");\n\n        static void Main()\n        {\n            // ラムダ式の型推論は元から賢い。\n            M(x => x); // int => int\n            M(x => true); // int => bool\n            M(x => x.ToString()); // int => generic T\n\n            // メソッド グループを渡すと、これまではオーバーロード解決できなかった。\n            // C# 7.3 ではちゃんと戻り値も見て候補を絞るようになった。\n            M(IntToInt); // int => int\n            M(IntToBool); // int => bool\n            M(IntToStrint); // int => generic T\n\n            // ちなみに、ラムダ式を介せば C# 7.2 以前でも大丈夫だった。面倒だった。\n            M(x => IntToInt(x)); // int => int\n            M(x => IntToBool(x)); // int => bool\n            M(x => IntToStrint(x)); // int => generic T\n        }\n\n        static int IntToInt(int x) => x;\n        static bool IntToBool(int x) => true;\n        static string IntToStrint(int x) => x.ToString();\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/OverloadResolution/Refness.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.OverloadResolution.Refness\n{\n    static class Extensions\n    {\n        // ref あり/なし 違いのオーバーロードはできる\n        // ref を使いたいのは構造体だけなので、struct/class 制約違いのオーバーロード解決との相性はよさそう。\n        public static void M<T>(this ref T t)\n            where T : struct\n            => Console.WriteLine($\"struct {t}\");\n\n        public static void M<T>(this T t)\n            where T : class\n            => Console.WriteLine($\"class {t}\");\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // DateTime → struct 制約を満たすので、M(ref T) の方が呼ばれる\n            var x = DateTime.Now;\n            x.M();\n\n            // ただし、 DateTime.Now.M(); だと呼べない。Now がプロパティなので、ref では呼べない。\n            // 1.M(); でも同様。リテラルに対して ref 拡張メソッドを呼べない。\n            // かといって、this in T では、ジェネリックな拡張メソッドを作れない(拡張メソッドの仕様でそうなってる)。\n\n            // string → class 制約を満たすので、M(T) の方が呼ばれる\n            \"abc\".M();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/OverloadResolution/Static.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.OverloadResolution.Static\n{\n    class Program\n    {\n        // M(0) とか書くとどっちを呼ぶべきかわからなくなるシグネチャ。\n        // 静的か、インスタンスかの差がある。\n        static void M(double x) => Console.WriteLine(\"static\");\n        void M(decimal x) => Console.WriteLine(\"instance\");\n\n        // Constraints.Program の方で説明しているように、完全に同じシグネチャで静的/インスタンス メソッドを定義するのはいまだできない。\n        // ごまかすなら以下のように弁別用のダミー引数などを利用。\n\n        static void M(Static _ = default) => Console.WriteLine(\"static\");\n        void M(Instance _ = default) => Console.WriteLine(\"instance\");\n\n        static void Main()\n        {\n            // C# 7.2 までは、シグネチャで判定 → 静的かインスタンスかが合わなければエラーの順だったので、M(double) と M(decimal) が弁別できない。\n            // C# 7.3 で、先に静的かインスタンスかで候補を絞ってからシグネチャを調べるようになったので、以下のようなコードがコンパイル可能に。\n            Program.M(0); // static\n            new Program().M(0); // instance\n\n            Program.M(); // static\n            new Program().M(); // instance\n\n            // 静的メソッド内から呼んだので static void M の方が呼ばれる\n            M(); // static\n            new Program().InstanceMethod(); // instance\n        }\n\n        void InstanceMethod()\n        {\n#if Uncompilable\n            // これは C# 7.3 でもエラー。\n            // 型名. か this. かが付いてないとどちらか判別できない。\n            M();\n#endif\n\n            // これはいける。this が付いてる時点でインスタンス。\n            this.M();\n        }\n\n        // ちなみに、C# には「Color Color 問題」ってのがある。\n        // C# は、Color Color { get; } みたいなプロパティ(など)を作れる。\n        // 1個目の Color は型名で、2個目の Color はプロパティ名。\n        // このとき、「Color.メンバー名」は静的/インスタンスどちらを呼ぶべきか、呼び分けれるべきかという問題。\n        // C# は呼び分けできるようになってるんだけど、そうすると今度はオーバーロード解決で悩むことがある。\n        // (「Color Color 問題」って呼ばれるのは、単に Color 構造体でよくこんなプロパティが作られるので、代表例として選ばれただけ)\n        static Color Color;\n\n        static void InvokeColor()\n        {\n            // 引数の型を指定すれば弁別できる(元から)。\n            Color.M(default(Static)); // static の方が呼ばれる\n            Color.M(default(Instance)); // instance の方が呼ばれる\n\n#if Uncompilable\n            // でも、これは C# 7.3 でも弁別できない。\n            Color.M();\n#endif\n        }\n    }\n\n    struct Color\n    {\n        public static void M(Static _ = default) => Console.WriteLine(\"Color static\");\n        public void M(Instance _ = default) => Console.WriteLine(\"Color instance\");\n    }\n\n    // 弁別用のダミー型。\n    struct Static { }\n    struct Instance { }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/Program.cs",
    "content": "﻿using System;\n\n/*\ntodo:\n- generic constraints\n  - [x] unmanaged\n  - [x] Enum\n  - [x] Delegate\n- [x] Support == and != for tuples\n- [?] strongname ←署名入りのDLLをRoslynが読めなかったという不具合修正っぽいんだけども。署名したことないからわかんない…\n- [x] Attribute on backing field\n- [x] Ref Reassignment\n- [x] Stackalloc initializers\n- [x] Custom fixed\n- [x] Indexing movable fixed buffers\n- Improved overload candidates\n  - [x] generic constraints\n  - [x] static/instance\n  - [x] method group return type\n- [x] Expression variables\n\ncustom fixed, movable fixed buffers は、Preview 3時点でも未実装だった。\nRoslyn の、dev15.7-preview3 ブランチには入ってなくて、dev15.7.x ブランチには入ってること確認済み。\n */\n\nnamespace ConsoleApp1\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/Ref/Node.cs",
    "content": "﻿namespace ConsoleApp1.Ref\n{\n    struct Node\n    {\n        public int Value;\n        public int NextIndex;\n        public Node(int value, int nextIndex) => (Value, NextIndex) = (value, nextIndex);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/Ref/Program.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.Ref\n{\n    class Program\n    {\n        static void Main()\n        {\n            RefReassignment();\n            RefFor();\n            RefForEach();\n        }\n\n        /// <summary>\n        /// ref ローカル変数に ref reassignment (参照先の再割り当て)ができるように。\n        /// </summary>\n        static void RefReassignment()\n        {\n            var x = 1;\n            var y = 2;\n\n            // r が x を参照中 → x が 10 に。\n            ref var r = ref x;\n            r = 10;\n\n            // r の参照先を y に変更 → y が 20 に。\n            r = ref y;\n            r = 20;\n\n            Console.WriteLine((x, y)); // (10, 20)\n        }\n\n        /// <summary>\n        /// for ステートメントの初期化式で ref ローカル変数を宣言できるように。\n        /// </summary>\n        static void RefFor()\n        {\n            // スタック上に連結リストを構築。\n            Span<Node> list = stackalloc[]\n            {\n                new Node(1, 3),\n                new Node(3, 2),\n                new Node(4, 4),\n                new Node(2, 1),\n                new Node(5, 0),\n            };\n\n            // ↑の Node を参照 for。\n            for (ref var n = ref list[0]; ; n = ref list[n.NextIndex])\n            {\n                Console.WriteLine(n.Value);\n                if (n.NextIndex == 0) break;\n            }\n        }\n\n        /// <summary>\n        /// foreach の反復変数も ref で宣言できるように。\n        /// </summary>\n        static void RefForEach()\n        {\n            var array = new[] { 1, 2, 3, 4, 5 };\n\n            foreach (ref var r in new RefArrayEnumerable<int>(array))\n            {\n                // r は参照なので、これで配列の全要素を 99 に上書き。\n                r = 99;\n\n#if Uncompilable\n                // ちなみに、foreach 変数は reassignment 不可\n                r = ref array[0];\n#endif\n            }\n\n            foreach (var x in array)\n            {\n                Console.WriteLine(x);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/Ref/RefArrayEnumerable.cs",
    "content": "﻿namespace ConsoleApp1.Ref\n{\n    /// <summary>\n    /// 配列を\n    /// foreach (ref var item in array)\n    /// でループするための enumerable。\n    /// </summary>\n    struct RefArrayEnumerable<T>\n    {\n        T[] _array;\n        public RefArrayEnumerable(T[] array) => _array = array;\n        public RefArrayEnumerator<T> GetEnumerator() => new RefArrayEnumerator<T>(_array);\n    }\n\n    struct RefArrayEnumerator<T>\n    {\n        int _index;\n        T[] _array;\n        public RefArrayEnumerator(T[] array) => (_index, _array) = (-1, array);\n        public ref T Current => ref _array[_index];\n        public bool MoveNext() => ++_index < _array.Length;\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/Stackalloc/Program.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.Stackalloc\n{\n    class Program\n    {\n        static void Main()\n        {\n            // C# 7.2 から、Span<T> を使えば safe なコンテキストで stackalloc を呼べるようになった。\n            Span<int> x0 = stackalloc int[3];\n\n            // 加えて、C# 7.3 で、stackalloc に初期化子を付けれるようになった。\n            // 配列初期化子でできることは stackalloc でもできるように。\n\n            // 単に初期化子を追加。\n            Span<int> x1 = stackalloc int[3] { 0xEF, 0xBB, 0xBF };\n\n            // 初期化子があるからサイズは省略。\n            Span<int> x2 = stackalloc int[] { 0xEF, 0xBB, 0xBF };\n\n            // 初期化子から推論できるときは型名も省略可能。\n            Span<int> x3 = stackalloc[] { 0xEF, 0xBB, 0xBF };\n\n            Console.WriteLine(x3.Length); // ちゃんと 3 が取れる\n\n            for (int i = 0; i < x3.Length; i++)\n            {\n                // 書き方が違うだけで x1, x2, x3 の内容は全部一緒。\n                Console.WriteLine((x1[i], x2[i], x3[i]));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/ConsoleApp1/TupleEquality/Program.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApp1.TupleEquality\n{\n    class Program\n    {\n        static void M((int r, (int x, int y) c) t)\n        {\n            // こんな感じで、タプル同士の ==, != が書けるように。\n            // これは、System.ValueTuple のユーザー定義演算子が呼ばれてるわけではなく、「メンバーごとの ==」に展開される。\n            Console.WriteLine(t == (1, (2, 3)));\n\n            // ↑こいつは、↓これと同じ意味。\n            Console.WriteLine(t.r == 1 && t.c.x == 2 && t.c.y == 3);\n\n            // != の方も。\n            Console.WriteLine(t != (1, (2, 3)));\n            Console.WriteLine(t.r != 1 || t.c.x != 2 || t.c.y != 3);\n\n            // 何でこういうコンパイラーによる展開処理が必要かと言うと、暗黙的型変換を許すため。\n            // 例えばこんなの。int と、double, decimal, long は暗黙的型変換が掛かるので、== で比較できる。\n            // ValueTupe 越しだと、ValueTupe<int, ValueTupe<int, int>> と ValueTupe<double, ValueTupe<decimal, long>> になっちゃって、\n            // ユーザー定義演算子だと比較できない。\n            Console.WriteLine(t == (1.0, (2m, 3L)));\n        }\n\n        static void M((MyInt r, (MyInt x, MyInt y) c) t)\n        {\n            // MyInt 同士の == → MyBool になる。\n            // その MyBool の && 扱い。\n            // && の仕様から、!MyBool.false が呼ばれてる。\n            Console.WriteLine(t == (1, (2, 3))); // r, c.x, が一致してたら、MyBool.false が3回表示される。\n\n            // 同、!= の場合は || になって、|| の仕様から、!MyBool.true が3回。\n            Console.WriteLine(t != (1, (2, 3))); // r, c.x, が一致してたら、MyBool.true が3回表示される。\n        }\n\n        static void Main()\n        {\n            M((1, (2, 3)));\n            M((1, (2, 4)));\n\n            M(((MyInt)1, (2, 3)));\n            M(((MyInt)0, (1, 2)));\n        }\n    }\n\n    // ==, != の結果が bool でなくて、ユーザー定義の bool 的な型(operator true, false が定義されてる)の場合のデモ用\n    struct MyBool\n    {\n        public bool Value;\n        public MyBool(bool value) => Value = value;\n\n        // 何が呼ばれてるかがわかるように WriteLine を挟む\n        public static bool operator true(MyBool x) { Console.WriteLine(\"MyBool.true\"); return x.Value; }\n        public static bool operator false(MyBool x) { Console.WriteLine(\"MyBool.false\"); return !x.Value; }\n        public static implicit operator MyBool(bool b) => new MyBool(b);\n    }\n\n    struct MyInt\n    {\n        public int Value;\n        public MyInt(int value) => Value = value;\n        public static MyBool operator ==(MyInt x, MyInt y) => x.Value == y.Value;\n        public static MyBool operator !=(MyInt x, MyInt y) => x.Value != y.Value;\n        public static implicit operator MyInt(int b) => new MyInt(b);\n        public override bool Equals(object obj) => obj is MyInt x && Value == x.Value;\n        public override int GetHashCode() => Value.GetHashCode();\n    }\n}\n"
  },
  {
    "path": "Demo/2018/Csharp7_3-0309/Csharp7_3-0309.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27520.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{89CB7676-406D-435A-A788-C2927A8B3450}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{89CB7676-406D-435A-A788-C2927A8B3450}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{89CB7676-406D-435A-A788-C2927A8B3450}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{89CB7676-406D-435A-A788-C2927A8B3450}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{89CB7676-406D-435A-A788-C2927A8B3450}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {9C3E1139-689D-4185-8C90-A6E1C22D1994}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/.gitignore",
    "content": "sample.zip\nUnzippedFolder"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/DotNetGlobalTools.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27130.2036\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"cszip\", \"cszip\\cszip.csproj\", \"{FF41E10B-3F21-498E-92D8-B0C548A7AC47}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"xstatic\", \"xstatic\\xstatic.csproj\", \"{B34F6379-123F-41A9-AE1B-3640DBDCC787}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"csunzip\", \"csunzip\\csunzip.csproj\", \"{C066C476-1D90-419A-8680-FD736FEBE538}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{FF41E10B-3F21-498E-92D8-B0C548A7AC47}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FF41E10B-3F21-498E-92D8-B0C548A7AC47}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FF41E10B-3F21-498E-92D8-B0C548A7AC47}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FF41E10B-3F21-498E-92D8-B0C548A7AC47}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B34F6379-123F-41A9-AE1B-3640DBDCC787}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B34F6379-123F-41A9-AE1B-3640DBDCC787}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B34F6379-123F-41A9-AE1B-3640DBDCC787}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B34F6379-123F-41A9-AE1B-3640DBDCC787}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C066C476-1D90-419A-8680-FD736FEBE538}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C066C476-1D90-419A-8680-FD736FEBE538}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C066C476-1D90-419A-8680-FD736FEBE538}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C066C476-1D90-419A-8680-FD736FEBE538}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {96595697-2DC4-4524-A5CB-FECD17AA5742}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/csunzip/Program.cs",
    "content": "﻿using System;\nusing System.IO.Compression;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        if(args.Length < 2)\n        {\n            Console.WriteLine(@\"Usage: csunzip [sourceArchiveFileName] [destinationDirectoryName]\");\n            return;\n        }\n\n        var src = args[0];\n        var dst = args[1];\n        ZipFile.ExtractToDirectory(src, dst);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/csunzip/csunzip.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <PackAsTool>true</PackAsTool>\n    <PackageVersion>0.1.1</PackageVersion>\n    <Authors>Nobuyuki Iwanaga</Authors>\n    <Company />\n    <Description>C# implementation of unzip</Description>\n    <Version>0.1.1</Version>\n    <PackageProjectUrl>https://github.com/ufcpp/UfcppSample/tree/master/Demo/2018/DotNetGlobalTools/csunzip</PackageProjectUrl>\n    <PackageLicenseUrl>https://github.com/ufcpp/UfcppSample/blob/master/LICENSE</PackageLicenseUrl>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/cszip/Program.cs",
    "content": "﻿using System;\nusing System.IO.Compression;\nusing System.Text;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        if(args.Length < 2)\n        {\n            Console.WriteLine(@\"Usage: cszip [sourceDirectoryName] [destinationArchiveFileName]\");\n            return;\n        }\n\n        var src = args[0];\n        var dst = args[1];\n        ZipFile.CreateFromDirectory(src, dst, CompressionLevel.Optimal, true, Encoding.UTF8);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/cszip/cszip.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <PackAsTool>true</PackAsTool>\n    <PackageVersion>0.1.1</PackageVersion>\n    <Description>C# implementation of unzip</Description>\n    <Company />\n    <Authors>Nobuyuki Iwanaga</Authors>\n    <Version>0.1.1</Version>\n    <PackageProjectUrl>https://github.com/ufcpp/UfcppSample/tree/master/Demo/2018/DotNetGlobalTools/cszip</PackageProjectUrl>\n    <PackageLicenseUrl>https://github.com/ufcpp/UfcppSample/blob/master/LICENSE</PackageLicenseUrl>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/install.bat",
    "content": "dotnet install tool -g cszip --configfile .\\nuget.config\ndotnet install tool -g csunzip --configfile .\\nuget.config\ndotnet install tool -g xstatic --configfile .\\nuget.config\n"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/nuget.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n    <packageSources>\n        <clear />\n        <add key=\"LocalRepo\" value=\"packages\" />\n    </packageSources>\n</configuration>"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/pack.bat",
    "content": "dotnet pack -c release cszip/cszip.csproj\ndotnet pack -c release csunzip/csunzip.csproj\ndotnet pack -c release xstatic/xstatic.csproj\nmkdir packages\ncopy cszip\\bin\\release\\*.nupkg packages\ncopy csunzip\\bin\\release\\*.nupkg packages\ncopy xstatic\\bin\\release\\*.nupkg packages\n"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/readme.md",
    "content": "# dotnet global tools を試そうのコーナー\n\nhttps://blogs.msdn.microsoft.com/dotnet/2018/02/27/announcing-net-core-2-1-preview-1/\n\n.NET Core 2.1 で、Global Tools ってのを導入するらしい。\n試してみてるのがこのソリューション。\n\n## 試しに作ってみたもの\n\n- cszip: `ZipFile.CreateFromDirectory` を呼んでるだけ\n- csunzip: `ZipFile.ExtractToDirectory` を呼んでるだけ\n- xstatic: .NET 標準ライブラリ中の任意の静的メソッドを呼び出せる\n\n### 作ったものの背景\n\nC# で何かアプリを書いていて、\nPostBuild イベントを拾って何かコマンドを実行したい。\nその時に、Windows だと bat を書いて、Mac とかだと sh を書いて…\nとかがめんどくさい。\n\n高々 zip コマンドを呼ぶだけでも、いろんな環境でビルドしだすと困ったりする。\nせっかく dotnet コマンドがクロスプラットフォームになってるのに、ここで詰まるのは結構つらい。\n\ndotnet でインストールできて、dotnet で実行できるものがあるならそれを使いたい。で、まあ、`ZipFile` のメソッドを呼ぶだけのコマンドがあるとそれなりに使えそうなんじゃないかと。\n\nzip/unzip でコマンド分けるべきか、\n分けるの面倒ではないか、\nというかむしろいっそのこと任意の静的メソッド呼べるようにしてやろうか。\n等々、遊んでみてた結果が xstatic。\n名前は適当。\n\nオーバーロード解決めんどくさい。\n\n## ビルド/パッケージ化\n\nVisual Studio でビルドしてもパッケージは作ってくれないみたい。\n`pack.bat` にパッケージ化のためのコマンド書いてるので、これを実行。\n\n```bat\ndotnet pack -c release cszip/cszip.csproj\ndotnet pack -c release csunzip/csunzip.csproj\ndotnet pack -c release xstatic/xstatic.csproj\n```\n\n## 作った Global Tools のインストール\n\n`install.bat` を実行。\n\n```bat\ndotnet install tool -g cszip --configfile .\\nuget.config\ndotnet install tool -g csunzip --configfile .\\nuget.config\ndotnet install tool -g xstatic --configfile .\\nuget.config\n```\n\n補足:\n\n- `pack.bat` で、作ったパッケージを `packages` フォルダーにコピってある\n- `nuget.config` に、この `packages` フォルダーからパッケージを探す設定を書いてある\n\n## サンプル\n\n`sample.bat` 中で、インストールした Global Tools を呼んでみてる。\n\n```bat\ncszip packages sample.zip\ncsunzip sample.zip UnzippedFolder\nxstatic System.TimeSpan FromSeconds 10000\nxstatic System.IO.Path Combine aa bb cc\n```\n\n1. `pack.bat` の結果としてできる `packages` フォルダーを ZIP 圧縮\n2. 1 で作った ZIP を解凍\n3. `TimeSpan.FromSeconds(10000)` を呼んでみる\n4. `Path.Combine(\"aa\", \"bb\", \"cc\")` を呼んでみる\n"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/sample.bat",
    "content": "cszip packages sample.zip\ncsunzip sample.zip UnzippedFolder\nxstatic System.TimeSpan FromSeconds 10000\nxstatic System.IO.Path Combine aa bb cc\n"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/xstatic/Program.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing static System.Reflection.BindingFlags;\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        if (args.Length < 2)\n        {\n            Console.WriteLine(@\"Invokes a static method in the netstandard.\n\nUsage: xstatic [type name] [static method name] [args]...\");\n            return;\n        }\n\n        var typeName = args[0];\n        var methodName = args[1];\n        var methodArgs = args.Skip(2).ToArray();\n\n        var t = FindType(typeName);\n        var method = FindMethod(t, methodName, methodArgs);\n\n        var result = Invoke(method, methodArgs);\n\n        Console.WriteLine(result);\n    }\n\n    private static object Invoke(MethodInfo method, string[] methodArgs)\n    {\n        var convertedArgs = new object[methodArgs.Length];\n        var parameters = method.GetParameters();\n\n        for (int i = 0; i < methodArgs.Length; i++)\n        {\n            var a = methodArgs[i];\n            var p = parameters[i];\n            convertedArgs[i] = Convert(a, p.ParameterType);\n        }\n\n        var result = method.Invoke(null, convertedArgs);\n        return result;\n    }\n\n    private static object Convert(string arg, Type parameterType)\n    {\n        if (parameterType == typeof(string)) return arg;\n        if (parameterType == typeof(int)) return int.Parse(arg);\n        if (parameterType == typeof(uint)) return uint.Parse(arg);\n        if (parameterType == typeof(double)) return double.Parse(arg);\n        if (parameterType == typeof(float)) return float.Parse(arg);\n        if (parameterType == typeof(long)) return long.Parse(arg);\n        if (parameterType == typeof(ulong)) return ulong.Parse(arg);\n        if (parameterType == typeof(short)) return short.Parse(arg);\n        if (parameterType == typeof(ushort)) return ushort.Parse(arg);\n        if (parameterType == typeof(byte)) return byte.Parse(arg);\n        if (parameterType == typeof(sbyte)) return sbyte.Parse(arg);\n        if (parameterType.IsEnum) return Enum.Parse(parameterType, arg);\n        return arg;\n    }\n\n    private static MethodInfo FindMethod(Type t, string methodName, string[] methodArgs)\n    {\n        foreach (var m in t.GetMethods(Static | Public))\n        {\n            if (m.Name != methodName) continue;\n\n            var parameters = m.GetParameters();\n\n            if (parameters.Length != methodArgs.Length) continue;\n\n            if (!parameters.All(p => IsConvertibleFromString(p.ParameterType))) continue;\n\n            return m;\n        }\n\n        return null;\n    }\n\n    private static bool IsConvertibleFromString(Type t)\n    {\n        if (t.IsPrimitive) return true;\n        if (t.IsEnum) return true;\n        if (t == typeof(string)) return true;\n        return false;\n    }\n\n    private static Type FindType(string typeName)\n    {\n        var sharedPath = Path.GetDirectoryName(typeof(object).Assembly.Location);\n        var netstdPath = Path.Combine(sharedPath, \"netstandard.dll\");\n        var asm = Assembly.LoadFile(netstdPath);\n        var t = asm.GetType(typeName);\n        return t;\n    }\n}\n"
  },
  {
    "path": "Demo/2018/DotNetGlobalTools/xstatic/xstatic.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <PackAsTool>true</PackAsTool>\n    <PackageVersion>0.1.1</PackageVersion>\n    <Version>0.1.1</Version>\n    <Authors>Nobuyuki Iwanaga</Authors>\n    <PackageProjectUrl>https://github.com/ufcpp/UfcppSample/tree/master/Demo/2018/DotNetGlobalTools/xstatic</PackageProjectUrl>\n    <PackageLicenseUrl>https://github.com/ufcpp/UfcppSample/blob/master/LICENSE</PackageLicenseUrl>\n    <Company />\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/EmojiIdentifier/identifier.md",
    "content": "# 識別子に使える文字\n\nunicode.org が、汎用識別子に Unicode を使う場合に推奨するパターンについて仕様を出してる。\n\n[Unicode® Standard Annex #31 - UNICODE IDENTIFIER AND PATTERN SYNTAX](http://unicode.org/reports/tr31/)\n\nC#、Java、Go なんかは概ねこれに沿って識別子に使える文字を規定してるっぽい。\n\n## ZERO WIDTH JOINER\n\nゼロ幅接合子(zero width joiner)を無視するみたいな仕様もこれに沿った結果っぽい。\n\n```cs\nusing System;\n\nclass Program\n{\n    static void Main()\n    {\n        // U+200D = ZWJ\n        var a\\u200Db = 1;\n        ab = 2;\n\n        Console.WriteLine(a\\u200Db); // ab 扱いなので、2に上書きされてる\n        Console.WriteLine(nameof(a\\u200Db)); // これも、表示されるのは「ab」\n    }\n}\n```\n\n## 拡張面文字\n\n拡張面の文字、UTF-16 の場合サロゲートペアになってるやつの扱い。\n\n拡張面の文字にも1文字1文字カテゴリーが設定されているので、「letter は全部識別子として使える」となっている言語なら、拡張面文字でも letter な限り識別子として使えるべき。\n\n実際、Java、Go は使える。\n\nJava:\n\n```java\npublic class HelloWorld\n{\n  public static void main(String[] args)\n  {\n    int 𩸽 = 2;\n    int 𒀀 = 3;\n    int 𓀀 = 5;\n    System.out.print(𩸽 * 𒀀 * 𓀀);\n  }\n}\n```\n\nGo:\n\n```go\npackage main\nimport \"fmt\"\nfunc main() {\n  𩸽 := 2\n  𒀀 := 3\n  𓀀 := 5\n  fmt.Println(𩸽 * 𒀀 * 𓀀)\n}\n```\n\nが、C# コンパイラーは現状(少なくとも Roslyn 2.8/Visual Studio 15.7/C# 7.3時点)ではバグってる。UTF-16で処理していて、サロゲートペアは全部「Surrogateカテゴリー」扱いにしているせい。以下のコードはコンパイルエラーになる。\n\n```cs\nclass Program\n{\n    static void Main()\n    {\n        // Error CS1056 Unexpected character\n        int 𩸽 = 2; // CJK Extension B\n        int 𒀀 = 3; // Cuneiform\n        int 𓀀 = 5; // Egyptian Hieroglyph\n        System.Console.WriteLine(𩸽 * 𒀀 * 𓀀);\n    }\n}\n```\n"
  },
  {
    "path": "Demo/2018/EmojiIdentifier/readme.md",
    "content": "# Unicode 関連\n\n- [絵文字識別子(特にSwift)](swift.md)\n- [識別子として使える文字](identifier.md)\n"
  },
  {
    "path": "Demo/2018/EmojiIdentifier/swift.en.md",
    "content": "# Emoji Identifiers\n\nAbuse of Emoji identifiers in Swift.\n\n## Color ❤\n\n[❤🧡💛💙💚💜🖤](http://ufcppfree.azurewebsites.net/Grapheme?s=%E2%9D%A4%F0%9F%A7%A1%F0%9F%92%9B%F0%9F%92%99%F0%9F%92%9A%F0%9F%92%9C%F0%9F%96%A4)\n\n```swift\nvar 💜 = 2;\nvar 💛 = 3;\nvar 💚 = 5;\nvar 💙 = 7;\nvar 🖤 = 11;\nvar 🧡 = 13;\nprint(💙 * 💚 * 💛 * 💜 * 🖤 * 🧡)\n```\n\nSome editors support color font but some others do not.\n\n![Color Hearts](ColorHearts.png)\n\nThe same is true of skin tones 🧑🏻🧑🏼🧑🏽🧑🏿.\n\n## Sigma\n\n```swift\nprefix operator ∑ // 'N-ARY SUMMATION' (U+2211)\n\nprefix func ∑ (array : [Int]) -> Int {\n    var sum : Int = 0\n    for item in array {\n        sum += item\n    }\n    return sum\n}\n\nlet a = [ 1, 2, 3, 4, 5]\nlet Σa = 0 // 'GREEK CAPITAL LETTER SIGMA' (U+03A3) + a\n\nprint(∑a) // 15\nprint(Σa) // 0\n```\n\nN-ARY Sum can be used for operators. On the other hand, Greek Capital Letter Sigma can be for identifiers.\n\n## Mathematical Alphanumeric Symbols\n\n[𝟎𝟘𝟢𝟬𝟶](http://ufcppfree.azurewebsites.net/Grapheme?s=%F0%9D%9F%8E%F0%9D%9F%98%F0%9D%9F%A2%F0%9D%9F%AC%F0%9D%9F%B6)\n\n```swift\nvar 𝟎 = 2;\nvar 𝟘 = 3;\nvar 𝟢 = 5;\nvar 𝟬 = 7;\nvar 𝟶 = 11;\nprint(𝟎 * 𝟘 * 𝟢 * 𝟬 * 𝟶)\n```\n\nBold, Double-struck, Sans-serif, Sans-serif bold, and Mono-space 0.\n\n## Invisible Operators\n\n[Invisible Operators](http://ufcppfree.azurewebsites.net/Grapheme?s=%E2%81%A1%E2%81%A2%E2%81%A3%E2%81%A4)\n\n```swift\nvar ⁡ = 2\nvar ⁢ = 3\nvar ⁣ = 5\nvar ⁤ = 7\nprint(⁡ * ⁢ * ⁣ * ⁤)\n```\n\nFrom the top\n\n- Function Apply\n- Invisible Times\n- Invisible Separator\n- Invisible Plus\n\nUnicode Code Point: U+2061~2063\n\nSome fonts have visible glyph:\n\n![visible glyph for invisible operators](InvisibleOperators.png)\n"
  },
  {
    "path": "Demo/2018/EmojiIdentifier/swift.md",
    "content": "# Emoji 識別子\n\nSwift が絵文字識別子を使えるようになったって頃にいろいろ試してたやつ。\nそこら中に書き捨ててたけど、最近ロスト気味なので1か所に集めとく。\n\n## 色付き❤\n\n[❤🧡💛💙💚💜🖤](http://ufcppfree.azurewebsites.net/Grapheme?s=%E2%9D%A4%F0%9F%A7%A1%F0%9F%92%9B%F0%9F%92%99%F0%9F%92%9A%F0%9F%92%9C%F0%9F%96%A4)\n\n```swift\nvar 💜 = 2;\nvar 💛 = 3;\nvar 💚 = 5;\nvar 💙 = 7;\nvar 🖤 = 11;\nvar 🧡 = 13;\nprint(💙 * 💚 * 💛 * 💜 * 🖤 * 🧡)\n```\n\nカラーフォントに対応している環境だといいけど、カラー表示できないエディターだと…\n\n![Color Hearts](ColorHearts.png)\n\n人の絵文字の肌色セレクターでも似たようなことできる。\n\n## シグマ\n\n```swift\nprefix operator ∑ // 'N-ARY SUMMATION' (U+2211)\n\nprefix func ∑ (array : [Int]) -> Int {\n    var sum : Int = 0\n    for item in array {\n        sum += item\n    }\n    return sum\n}\n\nlet a = [ 1, 2, 3, 4, 5]\nlet Σa = 0 // 'GREEK CAPITAL LETTER SIGMA' (U+03A3) + a\n\nprint(∑a) // 15\nprint(Σa) // 0\n```\n\nN-ARY Sum は演算子として使えて、ギリシャ文字のΣは識別子として使える。\n∑aは「aの総和」、Σaは「識別子Σa」になる。\n\n## 書式付き数字\n\n[𝟎𝟘𝟢𝟬𝟶](http://ufcppfree.azurewebsites.net/Grapheme?s=%F0%9D%9F%8E%F0%9D%9F%98%F0%9D%9F%A2%F0%9D%9F%AC%F0%9D%9F%B6)\n\n```swift\nvar 𝟎 = 2;\nvar 𝟘 = 3;\nvar 𝟢 = 5;\nvar 𝟬 = 7;\nvar 𝟶 = 11;\nprint(𝟎 * 𝟘 * 𝟢 * 𝟬 * 𝟶)\n```\n\nいわゆる Mathematical Alphanumeric Symbols。\n上から順に、Bold, Double-struck, Sans-serif, Sans-serif bold, Mono-space。\nこの辺りの Unicode カテゴリー、Nd (decimal digits)なんだけど、Swift はサロゲートペアな文字を全部識別子として受け付ける実装なのでこういうことになる。\n\nフォントによってはほんとに 0 と区別がつかないので、0 なのに 0 じゃないみたいなことができる。\n1~9にも同様の文字あり。\n\n## 不可視演算子\n\n[全く見えないけども、文字は入ってる](http://ufcppfree.azurewebsites.net/Grapheme?s=%E2%81%A1%E2%81%A2%E2%81%A3%E2%81%A4)\n\n```swift\nvar ⁡ = 2\nvar ⁢ = 3\nvar ⁣ = 5\nvar ⁤ = 7\nprint(⁡ * ⁢ * ⁣ * ⁤)\n```\n\n上から順に、\n\n- Function Apply … f(x) を fx みたいに書いたりするやつ。あるいは、微分演算子を (d/dx)f みたいに書くやつ。この関数と変数、演算子と関数の関係を表す\n- Invisible Times … xy で「x 掛ける y」を表すこと多い。この「不可視の×」を表す\n- Invisible Separator … a<sub>ij</sub>みたいに書くとき、このijはi×jじゃなくて、単にi, jの意味。この不可視の , を表す\n- Invisible Plus … 帯分数だと、1 (2/3) みたいに書いて 1 + (2 / 3) と考える。この場合の「不可視の+」を表す\n\nUnicode のコードポイント的にはU+2061~2063で、カテゴリーは Cf (Other Format)。なぜか識別子に使える。\n\nちなみに、フォントによっては見える。\n\n![不可視演算子が見えるフォント](InvisibleOperators.png)\n"
  },
  {
    "path": "Demo/2018/GuardedDevirt/GuardedDevirt/A.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Runtime.CompilerServices;\n\n// A 群。\n// M の実装が、インライン展開できない程度のサイズという想定のもの。\n// (今回は NoInlining オプションで代用。)\n//\n// かつ、A1～A4 の発生確率が均等で交互(= 分岐予測が効きにくい)。\nstatic class A\n{\n    public static I[] GetData() => Enumerable.Range(0, 1000).SelectMany(_ => new I[]\n    {\n        new A1(), new A2(), new A3(), new A4(),\n        new A1(), new A2(), new A3(), new A4(),\n        new A1(), new A2(), new A3(), new A4(),\n        new A1(), new A2(), new A3(), new A4(),\n    }).ToArray();\n}\n\nstruct A1 : I\n{\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    public void M()\n#if DEBUG\n        => Console.WriteLine(\"A1\");\n#else\n    { }\n#endif\n}\n\nstruct A2 : I\n{\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    public void M()\n#if DEBUG\n        => Console.WriteLine(\"A2\");\n#else\n    { }\n#endif\n}\n\nstruct A3 : I\n{\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    public void M()\n#if DEBUG\n        => Console.WriteLine(\"A3\");\n#else\n    { }\n#endif\n}\n\nstruct A4 : I\n{\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    public void M()\n#if DEBUG\n        => Console.WriteLine(\"A4\");\n#else\n    { }\n#endif\n}\n"
  },
  {
    "path": "Demo/2018/GuardedDevirt/GuardedDevirt/B.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Runtime.CompilerServices;\n\n// B 群。\n// M の実装が、インライン展開できるサイズという想定のもの。\n//\n// かつ、ほとんどが B1 で、残りの発生確率低め。\nstatic class B\n{\n    public static I[] GetData() => Enumerable.Range(0, 1000).SelectMany(_ => new I[]\n    {\n        new B1(), new B1(), new B3(), new B1(),\n        new B1(), new B2(), new B1(), new B1(),\n        new B1(), new B1(), new B1(), new B1(),\n        new B1(), new B1(), new B1(), new B4(),\n    }).ToArray();\n}\n\nstruct B1 : I\n{\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public void M()\n#if DEBUG\n        => Console.WriteLine(\"B1\");\n#else\n    { }\n#endif\n}\n\nstruct B2 : I\n{\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public void M()\n#if DEBUG\n        => Console.WriteLine(\"B2\");\n#else\n    { }\n#endif\n}\n\nstruct B3 : I\n{\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public void M()\n#if DEBUG\n        => Console.WriteLine(\"B3\");\n#else\n    { }\n#endif\n}\n\nstruct B4 : I\n{\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public void M()\n#if DEBUG\n        => Console.WriteLine(\"B4\");\n#else\n    { }\n#endif\n}\n"
  },
  {
    "path": "Demo/2018/GuardedDevirt/GuardedDevirt/CallBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\nusing System.Runtime.CompilerServices;\n\n/// <summary>\n/// I i = new A1();\n/// i.M();\n///\n/// みたいなやつの呼び出しを\n/// - 素直に仮想呼び出しでやるか\n/// - if (i is A) ((A)i).M(); みたいに分岐コードを書いてやるか\n/// のパフォーマンスを調べる。\n/// </summary>\npublic class CallBenchmark\n{\n    private I[] _dataA;\n    private I[] _dataB;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        _dataA = A.GetData();\n        _dataB = B.GetData();\n    }\n\n    /// <summary>\n    /// 素直に仮想呼び出し。\n    /// </summary>\n    /// <remarks>\n    /// </remarks>\n    private void CallVirt(ReadOnlySpan<I> data)\n    {\n        foreach (var i in data)\n        {\n            i.M();\n        }\n    }\n\n    /// <summary>\n    /// ある程度来る型がわかっている場合、if 文を並べた方が速かったりもする。\n    ///\n    /// 仮想呼び出しはそこそこのコストが掛かる:\n    /// 1. .NET の仮想テーブルは2段構成らしく、間接参照が2回発生\n    /// 2. インライン展開が全く効かなくなる\n    ///\n    /// A 群の M はインライン展開を抑止してるので、1 の方のコスト除けにしかならない。\n    /// それでも、if が4個程度だったら十分速くなるみたい。\n    /// (ほんのちょっとの差なので、こんな最適化をやる意味はあんまりない。)\n    /// </summary>\n    private void BranchesA(ReadOnlySpan<I> data)\n    {\n        foreach (var i in data)\n        {\n            // ここの i.GetType() は毎度 i.GetType() を呼ぶ方が高速。\n            // var t = i.GetType() と変数に受けちゃうと Type 型のインスタンスが作られる。\n            // 直接 typeof との比較をする場合、単なる仮想メソッド テーブル ポインターの比較になるっぽい。\n            if (i.GetType() == typeof(A1)) Unbox<A1>(i).M();\n            else if (i.GetType() == typeof(A2)) Unbox<A2>(i).M();\n            else if (i.GetType() == typeof(A3)) Unbox<A3>(i).M();\n            else if (i.GetType() == typeof(A4)) Unbox<A4>(i).M();\n            else i.M();\n        }\n    }\n\n    /// <summary>\n    /// <see cref=\"BranchesA\"/> と同じ最適化を B 群にも。\n    ///\n    /// B 群の方はインライン展開が掛かるように作ってある。\n    /// インライン展開の有無はほんとにパフォーマンスに大差が付くんで、\n    /// やってることは A 群と同じなのに、こっちは圧倒的に速い。\n    /// (M が空っぽなので、全部のコードがきれいさっぱりなくなってもいい気もするけど、そこまでの最適化は掛かってなさそう。)\n    ///\n    /// あと、B1 の確率が高いので、分岐予測が効きやすいというのもある。\n    /// </summary>\n    /// <param name=\"data\"></param>\n    private void BranchesB(ReadOnlySpan<I> data)\n    {\n        foreach (var i in data)\n        {\n            if (i.GetType() == typeof(B1)) Unbox<B1>(i).M();\n            else if (i.GetType() == typeof(B2)) Unbox<B2>(i).M();\n            else if (i.GetType() == typeof(B3)) Unbox<B3>(i).M();\n            else if (i.GetType() == typeof(B4)) Unbox<B4>(i).M();\n            else i.M();\n        }\n    }\n\n    /* ちなみに、結果の一例:\n    Method |     Mean |     Error |    StdDev |\n---------- |---------:|----------:|----------:|\n CallVirtA | 60.30 us | 0.6552 us | 0.6129 us |\n CallVirtB | 61.44 us | 1.1861 us | 1.1649 us |\n BranchesA | 55.22 us | 0.8354 us | 0.7815 us |\n BranchesB | 18.29 us | 0.3577 us | 0.5130 us |\n     */\n\n    [Benchmark] public void CallVirtA() => CallVirt(_dataA);\n    [Benchmark] public void CallVirtB() => CallVirt(_dataB);\n    [Benchmark] public void BranchesA() => BranchesA(_dataA);\n    [Benchmark] public void BranchesB() => BranchesB(_dataB);\n\n    #region 黒魔術\n\n    // キャストのコスト避けるために邪悪な手段を使って型判定したり unbox したり。\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    private static ref T Unbox<T>(object obj) => ref Unsafe.As<byte, T>(ref Unsafe.As<object, PinningHelper>(ref obj).data);\n\n    class PinningHelper { public byte data; }\n\n    #endregion\n}\n"
  },
  {
    "path": "Demo/2018/GuardedDevirt/GuardedDevirt/GuardedDevirt.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.3\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.5.2\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/GuardedDevirt/GuardedDevirt/I.cs",
    "content": "﻿/// <summary>\n/// とりあえず devirtualization の動作確認用の適当なインターフェイスを1個用意。\n/// </summary>\ninterface I\n{\n    void M();\n}\n"
  },
  {
    "path": "Demo/2018/GuardedDevirt/GuardedDevirt/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\nusing System.Linq;\n\nnamespace GuardedDevirt\n{\n    /// <summary>\n    /// .NET Core 3.0 (向けだと思う。たぶん)で、以下のような最適化が入るみたい。\n    /// https://github.com/dotnet/coreclr/blob/master/Documentation/design-docs/GuardedDevirtualization.md\n    ///\n    /// ある程度来る型がわかっているときに、仮想呼び出しを if 分岐に置き換えて通常のメソッド呼び出し(インライン展開可能)に変える手法。\n    ///\n    /// 以下の状況下では有効:\n    /// - if の数がそんなに増えない\n    /// - 確率に偏りがあって(大体は1つの型しか来なくて、たまに別の型来るだけ)、分岐予測が効きやすい\n    /// - devirtualization が効いたらインライン展開される程度のサイズの関数\n    ///\n    /// これの有効性の確認用に、手作業で似たような if 展開をやってみてベンチマークを取ってみる。\n    /// <see cref=\"CallBenchmark\"/>\n    /// </summary>\n    class Program\n    {\n        static void Main(string[] args)\n        {\n#if DEBUG\n            var b = new X();\n            b.Setup();\n            b.BranchesB();\n#else\n            BenchmarkRunner.Run<CallBenchmark>();\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/GuardedDevirt/GuardedDevirt.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28407.52\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"GuardedDevirt\", \"GuardedDevirt\\GuardedDevirt.csproj\", \"{723BE98D-66D3-41AB-A770-47461D50366C}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{723BE98D-66D3-41AB-A770-47461D50366C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{723BE98D-66D3-41AB-A770-47461D50366C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{723BE98D-66D3-41AB-A770-47461D50366C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{723BE98D-66D3-41AB-A770-47461D50366C}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {84FF8F75-8BDF-48D0-BAF3-0EE2C9A7FF59}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/IOPerformance/App/App.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.1</TargetFrameworks>\n    <LangVersion>Latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Include=\"..\\data\\test.csv\" Link=\"test.csv\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.14\" />\n    <PackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.1\" />\n    <PackageReference Include=\"System.IO.Pipelines\" Version=\"4.5.0-preview2-26406-04\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/IOPerformance/App/DataBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing Newtonsoft.Json;\nusing System;\nusing System.Buffers.Text;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Runtime.CompilerServices;\nusing System.Text;\n\nnamespace App\n{\n    public class DataBenchmark\n    {\n        [Benchmark]\n        public IEnumerable<ResultData> Legacy()\n        {\n            LoadLegacy();\n            return null;\n            var r = Reduce(LoadLegacy());\n            //Serialize(r, \"legacyresult.json\");\n            return r;\n        }\n\n        [Benchmark]\n        public IEnumerable<ResultData> SpanBased()\n        {\n            Load();\n            return null;\n            var r = Reduce(Load());\n            //Serialize(r, \"result.json\");\n            return r;\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        public static IEnumerable<TestData> LoadLegacy()\n        {\n            var list = new List<TestData>();\n            using (var reader = new StreamReader(\"test.csv\"))\n            {\n                reader.ReadLine();\n                while (reader.ReadLine() is string s)\n                {\n                    var columns = s.Split(',');\n                    list.Add(new TestData\n                    {\n                        a = columns[0],\n                        b = columns[1],\n                        x = double.Parse(columns[2]),\n                        y = double.Parse(columns[3])\n                    });\n                }\n            }\n            return list;\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        public static IEnumerable<TestData> Load()\n        {\n            var list = new List<TestData>();\n            using (var f = File.OpenRead(\"test.csv\"))\n            {\n                Span<byte> initialBuffer = stackalloc byte[512];\n                Span<int> indexBuffer = stackalloc int[4];\n                ReadOnlySpan<byte> delimiter = stackalloc[] { (byte)',' };\n\n                var reader = new LineReader(f, initialBuffer);\n\n                var line = reader.ReadLine();\n                while (true)\n                {\n                    line = reader.ReadLine();\n                    if (line.IsEmpty) break;\n\n                    var items = new Splitter(line, indexBuffer, delimiter);\n                    list.Add(new TestData\n                    {\n                        a = GetString(items[0]),\n                        b = GetString(items[1]),\n                        x = GetDouble(items[2]),\n                        y = GetDouble(items[3]),\n                    });\n                }\n            }\n            return list;\n\n            string GetString(ReadOnlySpan<byte> s) => Encoding.UTF8.GetString(s);\n            double GetDouble(ReadOnlySpan<byte> s) => Utf8Parser.TryParse(s, out double value, out _) ? value : 0;\n        }\n\n        private static IEnumerable<ResultData> Reduce(IEnumerable<TestData> testData)\n            => testData\n            .Select(d => (d.a, z: MultiplyToInt(d.x, d.y)))\n            .GroupBy(d => d.a)\n            .Select(g => new ResultData { a = g.Key, sum = g.Sum(x => x.z) });\n\n        private static int MultiplyToInt(double x, double y)\n        {\n            if (x > 0)\n                return (int)(x * y + 0.0000001);\n            return (int)(x * y - 0.0000001);\n        }\n\n        private static void Serialize(IEnumerable<ResultData> data, string path)\n        {\n            using (var file = File.CreateText(path))\n            {\n                var serializer = new JsonSerializer();\n                serializer.Serialize(file, data);\n            }\n        }\n    }\n\n    public struct ResultData\n    {\n        public string a;\n        public int sum;\n    }\n\n    public struct TestData\n    {\n        public string a;\n        public string b;\n        public double x;\n        public double y;\n    }\n}\n"
  },
  {
    "path": "Demo/2018/IOPerformance/App/LineReader.cs",
    "content": "﻿using System;\nusing System.IO;\n\nnamespace App\n{\n    ref struct LineReader\n    {\n        readonly Stream _stream;\n        Span<byte> _buffer;\n        int _previous;\n        int _read;\n        bool _crlf;\n\n        public LineReader(Stream stream, Span<byte> initialBuffer)\n        {\n            _stream = stream;\n            _buffer = initialBuffer;\n            _previous = 0;\n            _read = 0;\n            _crlf = false;\n        }\n\n        public Span<byte> ReadLine()\n        {\n            var buffer = _buffer;\n\n            if (buffer.Length == 0) return default;\n\n            var read = _read;\n            var prev = _previous;\n            var s = _stream;\n\n            // 前回返した分、前に詰める\n            if (read != prev)\n            {\n                buffer.Slice(prev, read - prev).CopyTo(buffer.Slice(0, read - prev));\n                read -= prev;\n            }\n            else read = 0;\n\n            // 読み取りループ\n            while (true)\n            {\n                if (read != 0)\n                {\n                    var (index, crlf) = IndexOfCrLf(buffer.Slice(0, read));\n\n                    // \\r\\n の時、前に \\r までしか読んでなかったらバグる…\n                    // この対処も重たいんだけど、\\r\\n のためにもっと頑張る気にはなれず\n                    if (index == 0 && crlf == 1 && _crlf)\n                    {\n                        buffer.Slice(1, read - 1).CopyTo(buffer.Slice(0, read - 1));\n                        (index, crlf) = IndexOfCrLf(buffer.Slice(0, read));\n                    }\n\n                    // 読んである範囲に改行あり\n                    if (crlf != 0)\n                    {\n                        _read = read;\n                        _previous = index + crlf;\n                        _buffer = buffer;\n                        return buffer.Slice(0, index);\n                    }\n                }\n\n                // 続きを読む\n                if (read == buffer.Length)\n                {\n                    var newBuffer = new byte[buffer.Length * 2];\n                    buffer.CopyTo(newBuffer);\n                    buffer = newBuffer;\n                }\n\n                var next = s.Read(buffer.Slice(read));\n\n                // 末尾\n                if(next == 0)\n                {\n                    _buffer = default;\n                    return buffer.Slice(0, read);\n                }\n\n                read += next;\n            }\n        }\n\n        static readonly byte[] crlf = new byte[] { (byte)'\\r', (byte)'\\n' };\n\n        (int index, int crlf) IndexOfCrLf(Span<byte> buffer)\n        {\n            var i = buffer.IndexOfAny(crlf);\n            if (i < 0) return (buffer.Length, 0);\n\n            if(buffer[i] == '\\r')\n            {\n                if (i + 1 < buffer.Length && buffer[i + 1] == '\\n')\n                {\n                    _crlf = true;\n                    return (i, 2);\n                }\n            }\n            return (i, 1);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/IOPerformance/App/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\nusing BenchmarkDotNet.Configs;\nusing BenchmarkDotNet.Jobs;\nusing BenchmarkDotNet.Toolchains.CsProj;\nusing BenchmarkDotNet.Columns;\nusing BenchmarkDotNet.Diagnosers;\nusing BenchmarkDotNet.Exporters;\nusing BenchmarkDotNet.Loggers;\nusing System.Linq;\nusing System;\nusing System.Collections.Generic;\n\nnamespace App\n{\n    class Program\n    {\n        static void Main()\n        {\n            //var c = DataBenchmark.LoadLegacy();\n            //var d = DataBenchmark.Load();\n\n            //Console.WriteLine(c.Count());\n            //Console.WriteLine(d.Count());\n\n            //foreach (var (x, y) in c.Zip(d, (x, y) => (x, y)))\n            //{\n            //    if(x.x != y.x || x.y != y.y)\n            //        Console.WriteLine((x.x - y.x, x.y - y.y));\n            //}\n            //Console.WriteLine(c.SequenceEqual(d, new TestComp()));\n\n            //var bench = new DataBenchmark();\n            //var a = bench.Legacy();\n            //var b = bench.SpanBased();\n            //Console.WriteLine(a.Count());\n            //Console.WriteLine(b.Count());\n            //Console.WriteLine(a.SequenceEqual(b, new ResultComp()));\n\n            BenchmarkRunner.Run<DataBenchmark>(new MultipleRuntimesConfig());\n        }\n\n        class TestComp : IEqualityComparer<TestData>\n        {\n            public bool Equals(TestData x, TestData y) => x.a == y.a && x.b == y.b && Equals(x.x, y.x) && Equals(x.y, y.y);\n            public int GetHashCode(TestData obj) => obj.GetHashCode();\n            private bool Equals(double x, double y) => Math.Abs(x - y) < 1e-12;\n        }\n\n        class ResultComp : IEqualityComparer<ResultData>\n        {\n            public bool Equals(ResultData x, ResultData y) => x.a == y.a && x.sum == y.sum;\n            public int GetHashCode(ResultData obj) => obj.GetHashCode();\n        }\n    }\n\n    public class MultipleRuntimesConfig : ManualConfig\n    {\n        public MultipleRuntimesConfig()\n        {\n            Add(SetRun(Job.Default.With(CsProjCoreToolchain.NetCoreApp21)));\n\n            Add(DefaultColumnProviders.Instance);\n            Add(MarkdownExporter.GitHub);\n            Add(new ConsoleLogger());\n            Add(new HtmlExporter());\n            Add(MemoryDiagnoser.Default);\n        }\n\n        private static Job SetRun(Job job)\n        {\n            // さすがに重いんで1回限り\n            job.Run.UnrollFactor = 5;\n            job.Run.InvocationCount = 5;\n            job.Run.WarmupCount = 1;\n            job.Run.TargetCount = 1;\n            job.Run.LaunchCount = 1;\n            return job;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/IOPerformance/App/Splitter.cs",
    "content": "﻿using System;\n\nnamespace App\n{\n    readonly ref struct Splitter\n    {\n        readonly Span<byte> _data;\n        readonly Span<int> _indexes;\n\n        public Splitter(Span<byte> data, Span<int> indexBuffer, ReadOnlySpan<byte> delimiter)\n        {\n            _data = data;\n            _indexes = indexBuffer;\n\n            var index = 0;\n            for (int i = 0; i < indexBuffer.Length; i++)\n            {\n                if (index != data.Length)\n                {\n                    var next = data.Slice(index + 1).IndexOf(delimiter);\n                    index = next < 0 ? data.Length : index + 1 + next;\n                }\n                indexBuffer[i] = index;\n            }\n        }\n\n        public Span<byte> this[int index]\n        {\n            get\n            {\n                if ((uint)index >= _indexes.Length) throw new IndexOutOfRangeException();\n                var s = index == 0 ? 0 : _indexes[index - 1] + 1;\n                var e = _indexes[index];\n                if (e <= s) return default;\n                return _data.Slice(s, e - s);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/IOPerformance/Compare20And21/Compare20And21.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.0;netcoreapp2.1</TargetFrameworks>\n    <LangVersion>Latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Include=\"..\\data\\test.csv\" Link=\"test.csv\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.14\" />\n    <PackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/IOPerformance/Compare20And21/DataBenchmark.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing Newtonsoft.Json;\n\nnamespace app\n{\n    public class DataBenchmark\n    {\n        private static IEnumerable<TestData> Load()\n        {\n            var list = new List<TestData>();\n            using (var reader = new StreamReader(\"test.csv\"))\n            {\n                reader.ReadLine();\n                while (reader.ReadLine() is string s)\n                {\n                    var columns = s.Split(',');\n                    list.Add(new TestData\n                    {\n                        a = columns[0],\n                        b = columns[1],\n                        x = double.Parse(columns[2]),\n                        y = double.Parse(columns[3])\n                    });\n                }\n            }\n            return list;\n        }\n\n        private static void Serialize(IEnumerable<ResultData> data)\n        {\n            using (var file = File.CreateText(\"result.json\"))\n            {\n                var serializer = new JsonSerializer();\n                serializer.Serialize(file, data);\n            }\n        }\n\n        [Benchmark]\n        public void Run()\n        {\n            var testData = Load();\n            var results = Reduce(testData);\n            Serialize(results);\n        }\n\n        private static IEnumerable<ResultData> Reduce(IEnumerable<TestData> testData)\n            => testData\n            .Select(d => (d.a, z: MultiplyToInt(d.x, d.y)))\n            .GroupBy(d => d.a)\n            .Select(g => new ResultData { a = g.Key, sum = g.Sum(x => x.z) });\n\n        private static int MultiplyToInt(double x, double y)\n        {\n            if (x > 0)\n                return (int)(x * y + 0.0000001);\n            return (int)(x * y - 0.0000001);\n        }\n    }\n\n    internal struct ResultData\n    {\n        public string a;\n        public int sum;\n    }\n\n    internal struct TestData\n    {\n        public string a;\n        public string b;\n        public double x;\n        public double y;\n        public int z;\n    }\n}\n"
  },
  {
    "path": "Demo/2018/IOPerformance/Compare20And21/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\nusing BenchmarkDotNet.Configs;\nusing BenchmarkDotNet.Jobs;\nusing BenchmarkDotNet.Toolchains.CsProj;\nusing BenchmarkDotNet.Columns;\nusing BenchmarkDotNet.Diagnosers;\nusing BenchmarkDotNet.Exporters;\nusing BenchmarkDotNet.Loggers;\n\nnamespace app\n{\n    class Program\n    {\n        static void Main()\n        {\n            //new DataBenchmark().Run();\n\n            BenchmarkRunner.Run<DataBenchmark>(new MultipleRuntimesConfig());\n        }\n    }\n\n    public class MultipleRuntimesConfig : ManualConfig\n    {\n        public MultipleRuntimesConfig()\n        {\n            Add(SetRun(Job.Default.With(CsProjCoreToolchain.NetCoreApp20)));\n            Add(SetRun(Job.Default.With(CsProjCoreToolchain.NetCoreApp21)));\n\n            Add(DefaultColumnProviders.Instance);\n            Add(MarkdownExporter.GitHub);\n            Add(new ConsoleLogger());\n            Add(new HtmlExporter());\n            Add(MemoryDiagnoser.Default);\n        }\n\n        private static Job SetRun(Job job)\n        {\n            // さすがに重いんで1回限り\n            job.Run.UnrollFactor = 1;\n            job.Run.InvocationCount = 1;\n            job.Run.WarmupCount = 1;\n            job.Run.TargetCount = 1;\n            job.Run.LaunchCount = 1;\n            return job;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/IOPerformance/IOPerformance.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27617.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"App\", \"App\\App.csproj\", \"{C636812B-6D3A-4488-B87D-97810438F579}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Compare20And21\", \"Compare20And21\\Compare20And21.csproj\", \"{BB5F5AF2-0F83-4A0B-9ED3-635530892624}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{C636812B-6D3A-4488-B87D-97810438F579}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C636812B-6D3A-4488-B87D-97810438F579}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C636812B-6D3A-4488-B87D-97810438F579}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C636812B-6D3A-4488-B87D-97810438F579}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{BB5F5AF2-0F83-4A0B-9ED3-635530892624}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BB5F5AF2-0F83-4A0B-9ED3-635530892624}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BB5F5AF2-0F83-4A0B-9ED3-635530892624}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BB5F5AF2-0F83-4A0B-9ED3-635530892624}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {E36EE5DB-E594-4267-83A3-85E4614EA805}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/IOPerformance/data/.gitignore",
    "content": "*.csv\n*.json\n"
  },
  {
    "path": "Demo/2018/IOPerformance/data/data.py",
    "content": "import pandas as pd\nimport numpy as np\n\n# レコード数\nN = 1000000\n\nchars1 = pd.util.testing.rands_array(5, 100)\nchars2 = pd.util.testing.rands_array(5, 10000)\n\ndf = pd.DataFrame({'a': np.random.choice(chars1, size=N),\n                   'b': np.random.choice(chars2, size=N),\n                   'x': np.random.rand(N) * 100,\n                   'y': np.random.rand(N) * 100})\ndf['x'] = df['x'].round(2)\ndf['y'] = df['y'].round(2)\n\ndf.to_csv(\"test.csv\", index=False, float_format='%.2f')\ndf.to_json('test.json', orient='records', double_precision=2)\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace/Devirtualized1/Euclidean.cs",
    "content": "﻿namespace MetricSpace.Devirtualized1\n{\n    interface IArithmetic<T>\n    {\n        T Zero { get; }\n        T Add(T a, T b);\n        T Subtract(T a, T b);\n        T Multiply(T a, T b);\n    }\n\n    class Euclidean<T, TArithmetic>\n        // 構造体にして、型引数で受け取る\n        where TArithmetic : struct, IArithmetic<T>\n    {\n        public static T DistanceSquared(T[] a, T[] b)\n        {\n            // default を使って IArithmetic<T> を作る\n            var arith = default(TArithmetic);\n            // あとは先ほどと同じ\n            var d = arith.Zero;\n            for (int i = 0; i < a.Length; i++)\n            {\n                var dif = arith.Subtract(b[i], a[i]);\n                var sq = arith.Multiply(dif, dif);\n                d = arith.Add(d, sq);\n            }\n            return d;\n        }\n    }\n\n    struct FloatArithmetic : IArithmetic<float>\n    {\n        public float Zero => 0;\n        public float Add(float a, float b) => a + b;\n        public float Multiply(float a, float b) => a - b;\n        public float Subtract(float a, float b) => a * b;\n    }\n\n    // IntArithmetic, DoubleArithmetic, ...\n    // 使いたい型の分だけ同じ IArithmetic<T> を書く\n\n    class Program\n    {\n        static void Main()\n        {\n            // FloatArithmetic の時点で T は float で確定なんだけど、残念ながら型推論はされない\n            // 常にこの2つの型引数をペアで渡さないといけない\n            Euclidean<float, FloatArithmetic>.DistanceSquared(new[] { 1f, 2f }, new[] { 3f, 4f });\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace/Devirtualized2/Array1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace MetricSpace.Devirtualized2\n{\n    struct Array1<T>\n    {\n        public T Item1;\n    }\n\n    struct Array2<T>\n    {\n        public T Item1;\n        public T Item2;\n    }\n\n    struct Array3<T>\n    {\n        public T Item1;\n        public T Item2;\n        public T Item3;\n    }\n\n#if Uncompilable\n    struct Array2<T>\n    {\n        public T Item1;\n        public T Item2;\n\n        // これをジェネリックに使いたければトリックが必要\n        public static int Length => 2;\n\n        // ただでさえ、safe にインデックス アクセスを実現する方法はないんだけど…\n        // そもそも、ref Item1 したものを、ref 戻り値では返せない仕様\n        public ref T this[int index] => ref Unsafe.Add<T>(ref Item1, index);\n    }\n#endif\n}\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace/Devirtualized2/Euclidean.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace MetricSpace.Devirtualized2\n{\n    interface IArithmetic<T>\n    {\n        T Zero { get; }\n        T Add(T a, T b);\n        T Subtract(T a, T b);\n        T Multiply(T a, T b);\n    }\n\n    struct FloatArithmetic : IArithmetic<float>\n    {\n        public float Zero => 0;\n        public float Add(float a, float b) => a + b;\n        public float Multiply(float a, float b) => a - b;\n        public float Subtract(float a, float b) => a * b;\n    }\n\n    // 配列自体用。これは大して意味は持ってない。誤用防止程度\n    public interface IFixedArray<T> { }\n\n    // 値型ジェネリック トリック用\n    public interface IFixedArrayAccessor<T, TArray>\n        where TArray : struct, IFixedArray<T>\n    {\n        TArray New();\n        ref T At(ref TArray array, int i);\n        int Length { get; }\n    }\n\n    public struct Fixed1<T> : IFixedArrayAccessor<T, Fixed1<T>.Array>\n    {\n        public struct Array : IFixedArray<T>\n        {\n            public T Item1;\n            public Array(T item1) => Item1 = item1;\n            public static implicit operator Array(T value) => new Array(value);\n        }\n\n        public Array New() => default;\n        public int Length => 1;\n        public unsafe Span<T> AsSpan(ref Array array) => new Span<T>(Unsafe.AsPointer(ref array.Item1), 1);\n        public ref T At(ref Array array, int i) => ref AsSpan(ref array)[i];\n    }\n\n    public struct Fixed2<T> : IFixedArrayAccessor<T, Fixed2<T>.Array>\n    {\n        public struct Array : IFixedArray<T>\n        {\n            public T Item1; public T Item2;\n            public Array(T item1, T item2) => (Item1, Item2) = (item1, item2);\n            public static implicit operator Array((T, T) value) => new Array(value.Item1, value.Item2);\n        }\n\n        public Array New() => default;\n        public int Length => 2;\n        public unsafe Span<T> AsSpan(ref Array array) => new Span<T>(Unsafe.AsPointer(ref array.Item1), 2);\n        public ref T At(ref Array array, int i) => ref AsSpan(ref array)[i];\n        // 範囲チェックをさぼる(危険でいい)なら以下の書き方でも OK\n        //public ref T At(ref Array array, int i) => ref Unsafe.Add(ref array.Item1, i);\n    }\n\n    public struct Fixed3<T> : IFixedArrayAccessor<T, Fixed3<T>.Array>\n    {\n        public struct Array : IFixedArray<T>\n        {\n            public T Item1; public T Item2; public T Item3;\n            public Array(T item1, T item2, T item3) => (Item1, Item2, Item3) = (item1, item2, item3);\n            public static implicit operator Array((T, T, T) value) => new Array(value.Item1, value.Item2, value.Item3);\n        }\n\n        public Array New() => default;\n        public int Length => 3;\n        public unsafe Span<T> AsSpan(ref Array array) => new Span<T>(Unsafe.AsPointer(ref array.Item1), 3);\n        public ref T At(ref Array array, int i) => ref AsSpan(ref array)[i];\n    }\n\n    public struct Fixed4<T> : IFixedArrayAccessor<T, Fixed4<T>.Array>\n    {\n        public struct Array : IFixedArray<T>\n        {\n            public T Item1; public T Item2; public T Item3; public T Item4;\n            public Array(T item1, T item2, T item3, T item4) => (Item1, Item2, Item3, Item4) = (item1, item2, item3, item4);\n            public static implicit operator Array((T, T, T, T) value) => new Array(value.Item1, value.Item2, value.Item3, value.Item4);\n        }\n\n        public Array New() => default;\n        public int Length => 4;\n        public unsafe Span<T> AsSpan(ref Array array) => new Span<T>(Unsafe.AsPointer(ref array.Item1), 4);\n        public ref T At(ref Array array, int i) => ref AsSpan(ref array)[i];\n    }\n\n    // 以下、必要なだけ FixedN を用意\n\n    class Euclidean<T, TArithmetic, TArray, TArrayAccessor>\n        where TArithmetic : struct, IArithmetic<T>\n        where TArray : struct, IFixedArray<T>\n        where TArrayAccessor : struct, IFixedArrayAccessor<T, TArray>\n    {\n        public static T DistanceSquared(TArray a, TArray b)\n        {\n            var arith = default(TArithmetic);\n            var accessor = default(TArrayAccessor);\n            var d = arith.Zero;\n            for (int i = 0; i < accessor.Length; i++)\n            {\n                var dif = arith.Subtract(accessor.At(ref b, i), accessor.At(ref a, i));\n                var sq = arith.Multiply(dif, dif);\n                d = arith.Add(d, sq);\n            }\n            return d;\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // これも、Fixed2<float> を使う時点で残りの型引数確定なんだけど、残念ながら型推論はされない\n            // 常にこの4つの型引数が必要\n            Euclidean<float, FloatArithmetic, Fixed2<float>.Array, Fixed2<float>>.DistanceSquared((1, 2), (3, 4));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace/Devirtualized3/Arithmetic.cs",
    "content": "﻿namespace MetricSpace.Devirtualized3\n{\n    interface IArithmetic<T>\n    {\n        T Zero { get; }\n        T Add(T a, T b);\n        T Subtract(T a, T b);\n        T Multiply(T a, T b);\n    }\n\n    struct FloatArithmetic : IArithmetic<float>\n    {\n        public float Zero => 0;\n        public float Add(float a, float b) => a + b;\n        public float Multiply(float a, float b) => a - b;\n        public float Subtract(float a, float b) => a * b;\n    }\n\n    struct DoubleArithmetic : IArithmetic<double>\n    {\n        public double Zero => 0;\n        public double Add(double a, double b) => a + b;\n        public double Multiply(double a, double b) => a - b;\n        public double Subtract(double a, double b) => a * b;\n    }\n\n    struct IntArithmetic : IArithmetic<int>\n    {\n        public int Zero => 0;\n        public int Add(int a, int b) => a + b;\n        public int Multiply(int a, int b) => a - b;\n        public int Subtract(int a, int b) => a * b;\n    }\n\n    struct ShortArithmetic : IArithmetic<short>\n    {\n        public short Zero => 0;\n        public short Add(short a, short b) => (short)(a + b);\n        public short Multiply(short a, short b) => (short)(a - b);\n        public short Subtract(short a, short b) => (short)(a * b);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace/Devirtualized3/Chebyshev.cs",
    "content": "﻿using System;\n\nnamespace MetricSpace.Devirtualized3\n{\n    struct ChebyshevMetric<T, TArithmetic, TArray, TArrayAccessor> : IMetric<T, TArray>\n        where T : IComparable<T>\n        where TArithmetic : struct, IArithmetic<T>\n        where TArray : struct, IFixedArray<T>\n        where TArrayAccessor : struct, IFixedArrayAccessor<T, TArray>\n    {\n        public T DistanceSquared(TArray a, TArray b)\n        {\n            var arith = default(TArithmetic);\n            var accessor = default(TArrayAccessor);\n            var d = arith.Zero;\n            for (int i = 0; i < accessor.Length; i++)\n            {\n                var dif = arith.Subtract(accessor.At(ref b, i), accessor.At(ref a, i));\n                d = Max(d, Abs(dif));\n            }\n            return arith.Multiply(d, d);\n        }\n\n        private static T Abs(T x)\n        {\n            var arith = default(TArithmetic);\n            if (x.CompareTo(arith.Zero) < 0) return arith.Subtract(arith.Zero, x);\n            return x;\n        }\n\n        private static T Max(T x, T y) => x.CompareTo(y) >= 0 ? x : y;\n    }\n}\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace/Devirtualized3/Euclidean.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace MetricSpace.Devirtualized3\n{\n    interface IMetric<T, TArray>\n        where TArray : struct, IFixedArray<T>\n    {\n        T DistanceSquared(TArray a, TArray b);\n    }\n\n    struct EuclideanMetric<T, TArithmetic, TArray, TArrayAccessor> : IMetric<T, TArray>\n        where TArithmetic : struct, IArithmetic<T>\n        where TArray : struct, IFixedArray<T>\n        where TArrayAccessor : struct, IFixedArrayAccessor<T, TArray>\n    {\n        public T DistanceSquared(TArray a, TArray b)\n        {\n            var arith = default(TArithmetic);\n            var accessor = default(TArrayAccessor);\n            var d = arith.Zero;\n            for (int i = 0; i < accessor.Length; i++)\n            {\n                var dif = arith.Subtract(accessor.At(ref b, i), accessor.At(ref a, i));\n                var sq = arith.Multiply(dif, dif);\n                d = arith.Add(d, sq);\n            }\n            return d;\n        }\n    }\n\n    // Manhattan とか Chebychev とかも同様に作る\n\n    class Program\n    {\n        // 近い方の点を求める\n        static TArray Nearest<T, TArray, TMetric>(TArray origin, TArray a, TArray b)\n            where T : IComparable<T>\n            where TArray : struct, IFixedArray<T>\n            where TMetric : struct, IMetric<T, TArray>\n        {\n            var metric = default(TMetric);\n\n            var da = metric.DistanceSquared(origin, a);\n            var db = metric.DistanceSquared(origin, b);\n\n            return da.CompareTo(db) <= 0 ? a : b;\n        }\n\n        static void Main()\n        {\n            // 型引数は3つと思いきや、Euclidean がさらに4つ求めるので合計7つ\n            // 常にこの7つの型引数が必要\n            var n = Nearest<float, Fixed2<float>.Array, EuclideanMetric<float, FloatArithmetic, Fixed2<float>.Array, Fixed2<float>>>(\n                (0, 0), (1, 2), (3, 4));\n\n            Console.WriteLine((n.Item1, n.Item2));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace/Devirtualized3/FixedArray.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace MetricSpace.Devirtualized3\n{\n    // 配列自体用。これは大して意味は持ってない。誤用防止程度\n    public interface IFixedArray<T> { }\n\n    // 値型ジェネリック トリック用\n    public interface IFixedArrayAccessor<T, TArray>\n        where TArray : struct, IFixedArray<T>\n    {\n        TArray New();\n        ref T At(ref TArray array, int i);\n        int Length { get; }\n    }\n\n    public struct Fixed1<T> : IFixedArrayAccessor<T, Fixed1<T>.Array>\n    {\n        public struct Array : IFixedArray<T>\n        {\n            public T Item1;\n            public Array(T item1) => Item1 = item1;\n            public static implicit operator Array(T value) => new Array(value);\n        }\n\n        public Array New() => default;\n        public int Length => 1;\n        public unsafe Span<T> AsSpan(ref Array array) => new Span<T>(Unsafe.AsPointer(ref array.Item1), 1);\n        public ref T At(ref Array array, int i) => ref AsSpan(ref array)[i];\n    }\n\n    public struct Fixed2<T> : IFixedArrayAccessor<T, Fixed2<T>.Array>\n    {\n        public struct Array : IFixedArray<T>\n        {\n            public T Item1; public T Item2;\n            public Array(T item1, T item2) => (Item1, Item2) = (item1, item2);\n            public static implicit operator Array((T, T) value) => new Array(value.Item1, value.Item2);\n        }\n\n        public Array New() => default;\n        public int Length => 2;\n        public unsafe Span<T> AsSpan(ref Array array) => new Span<T>(Unsafe.AsPointer(ref array.Item1), 2);\n        public ref T At(ref Array array, int i) => ref AsSpan(ref array)[i];\n        // 範囲チェックをさぼる(危険でいい)なら以下の書き方でも OK\n        //public ref T At(ref Array array, int i) => ref Unsafe.Add(ref array.Item1, i);\n    }\n\n    public struct Fixed3<T> : IFixedArrayAccessor<T, Fixed3<T>.Array>\n    {\n        public struct Array : IFixedArray<T>\n        {\n            public T Item1; public T Item2; public T Item3;\n            public Array(T item1, T item2, T item3) => (Item1, Item2, Item3) = (item1, item2, item3);\n            public static implicit operator Array((T, T, T) value) => new Array(value.Item1, value.Item2, value.Item3);\n        }\n\n        public Array New() => default;\n        public int Length => 3;\n        public unsafe Span<T> AsSpan(ref Array array) => new Span<T>(Unsafe.AsPointer(ref array.Item1), 3);\n        public ref T At(ref Array array, int i) => ref AsSpan(ref array)[i];\n    }\n\n    public struct Fixed4<T> : IFixedArrayAccessor<T, Fixed4<T>.Array>\n    {\n        public struct Array : IFixedArray<T>\n        {\n            public T Item1; public T Item2; public T Item3; public T Item4;\n            public Array(T item1, T item2, T item3, T item4) => (Item1, Item2, Item3, Item4) = (item1, item2, item3, item4);\n            public static implicit operator Array((T, T, T, T) value) => new Array(value.Item1, value.Item2, value.Item3, value.Item4);\n        }\n\n        public Array New() => default;\n        public int Length => 4;\n        public unsafe Span<T> AsSpan(ref Array array) => new Span<T>(Unsafe.AsPointer(ref array.Item1), 4);\n        public ref T At(ref Array array, int i) => ref AsSpan(ref array)[i];\n    }\n\n    // 以下、必要なだけ FixedN を用意\n}\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace/Devirtualized3/Manhattan.cs",
    "content": "﻿using System;\n\nnamespace MetricSpace.Devirtualized3\n{\n    struct ManhattanMetric<T, TArithmetic, TArray, TArrayAccessor> : IMetric<T, TArray>\n        where T : IComparable<T>\n        where TArithmetic : struct, IArithmetic<T>\n        where TArray : struct, IFixedArray<T>\n        where TArrayAccessor : struct, IFixedArrayAccessor<T, TArray>\n    {\n        public T DistanceSquared(TArray a, TArray b)\n        {\n            var arith = default(TArithmetic);\n            var accessor = default(TArrayAccessor);\n            var d = arith.Zero;\n            for (int i = 0; i < accessor.Length; i++)\n            {\n                var dif = arith.Subtract(accessor.At(ref b, i), accessor.At(ref a, i));\n                d = arith.Add(d, Abs(dif));\n            }\n            return arith.Multiply(d, d);\n        }\n\n        private static T Abs(T x)\n        {\n            var arith = default(TArithmetic);\n            if (x.CompareTo(arith.Zero) < 0) return arith.Subtract(arith.Zero, x);\n            return x;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace/Instantiation/Instantiation.cs",
    "content": "﻿using System;\nusing MetricSpace.Devirtualized3;\n\nnamespace MetricSpace.Instantiation\n{\n    // ジェネリックな型を1個用意しておいて、派生で型引数を与えておく\n    // 数値の型\n    class FloatPoint : Point<float, FloatArithmetic> { }\n    class DoublePoint : Point<double, DoubleArithmetic> { }\n    class IntPoint : Point<int, IntArithmetic> { }\n    class ShortPoint : Point<short, ShortArithmetic> { }\n\n    class Point<T, TArithmetic>\n        where T : IComparable<T>\n        where TArithmetic : struct, IArithmetic<T>\n    {\n        // 数値の「組」の型\n        public class _1 : Dimension<Fixed1<T>.Array, Fixed1<T>> { }\n        public class _2 : Dimension<Fixed2<T>.Array, Fixed2<T>> { }\n        public class _3 : Dimension<Fixed3<T>.Array, Fixed3<T>> { }\n        public class _4 : Dimension<Fixed4<T>.Array, Fixed4<T>> { }\n\n        public class Dimension<TArray, TArrayAccessor>\n            where TArray : struct, IFixedArray<T>\n            where TArrayAccessor : struct, IFixedArrayAccessor<T, TArray>\n        {\n            // 距離計算の方法\n            public class Euclidean : Metric<EuclideanMetric<T, TArithmetic, TArray, TArrayAccessor>> { }\n            public class Manhattan : Metric<ManhattanMetric<T, TArithmetic, TArray, TArrayAccessor>> { }\n            public class Chebyshev : Metric<ChebyshevMetric<T, TArithmetic, TArray, TArrayAccessor>> { }\n\n            public class Metric<TMetric>\n                where TMetric : struct, IMetric<T, TArray>\n            {\n                public static TArray Nearest(TArray origin, TArray a, TArray b)\n                {\n                    var metric = default(TMetric);\n\n                    var da = metric.DistanceSquared(origin, a);\n                    var db = metric.DistanceSquared(origin, b);\n\n                    return da.CompareTo(db) <= 0 ? a : b;\n                }\n\n                // その他、距離空間に対するアルゴリズムをこの中に書く\n            }\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // 使う側に関してはだいぶ短く書けた\n            var n = FloatPoint._2.Euclidean.Nearest(\n                (0, 0), (1, 2), (3, 4));\n\n            Console.WriteLine((n.Item1, n.Item2));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace/MetricSpace.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <LangVersion>latest</LangVersion>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <StartupObject>MetricSpace.Devirtualized3.Program</StartupObject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace/NonGeneric/Euclidean.cs",
    "content": "﻿namespace MetricSpace.NonGeneric\n{\n    class Euclidean\n    {\n        // a と b の長さが同じとか、いくつか前提を置いちゃってるけども、最低限のコード\n        // a, b を N 次元空間上の点とみなして、その間の距離の2乗、\n        // 要するに「差の2乗和」を求める。\n        public static float DistanceSquared(float[] a, float[] b)\n        {\n            var d = 0f;\n            for (int i = 0; i < a.Length; i++)\n            {\n                var dif = b[i] - a[i];\n                d += dif * dif;\n            }\n            return d;\n        }\n    }\n\n#if Uncompilable\n    // int や double でも使いたいからと言って、以下のようには書けない。\n    // ジェネリックな型 T には +, -, * が定義されていない。\n    class Euclidean<T>\n    {\n        public static T DistanceSquared(T[] a, T[] b)\n        {\n            T d = 0;\n            for (int i = 0; i < a.Length; i++)\n            {\n                var dif = b[i] - a[i];\n                d += dif * dif;\n            }\n            return d;\n        }\n    }\n#endif\n}\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace/Virtualized/Euclidean.cs",
    "content": "﻿namespace MetricSpace.Virtualized\n{\n    interface IArithmetic<T>\n    {\n        T Zero { get; }\n        T Add(T a, T b);\n        T Subtract(T a, T b);\n        T Multiply(T a, T b);\n    }\n\n    class Euclidean<T>\n    {\n        // 四則演算用のインターフェイスを外からもらう\n        IArithmetic<T> _arithmetic;\n        public Euclidean(IArithmetic<T> arithmetic) => _arithmetic = arithmetic;\n\n\n        // static にするのはあきらめる\n        public T DistanceSquared(T[] a, T[] b)\n        {\n            var arith = _arithmetic;\n            // IArithmetic<T> 越しに 0 をもらったり、四則演算したり\n            var d = arith.Zero;\n            for (int i = 0; i < a.Length; i++)\n            {\n                var dif = arith.Subtract(b[i], a[i]);\n                var sq = arith.Multiply(dif, dif);\n                d = arith.Add(d, sq);\n            }\n            return d;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/MetricSpace/MetricSpace.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27625.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MetricSpace\", \"MetricSpace\\MetricSpace.csproj\", \"{0E6799BC-9CB8-4916-8520-6843489ED912}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{0E6799BC-9CB8-4916-8520-6843489ED912}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0E6799BC-9CB8-4916-8520-6843489ED912}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0E6799BC-9CB8-4916-8520-6843489ED912}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0E6799BC-9CB8-4916-8520-6843489ED912}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {46B58727-CB65-485A-B870-E4E6CBA5164F}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/MetricSpace/readme.md",
    "content": "# Shapes の実用例: 距離空間上のアルゴリズム\n\n- NonGeneric: 初期状態。汎用性なし\n- Virtualized: インターフェイスを切って汎用化した状態。遅い。最終系の4倍くらい遅い\n- Devirtualized1: 四則演算を値型ジェネリック化。これで、仮想呼び出しが消えて(devirtualize)、インライン展開が効くようになって倍は速い\n- Devirtualized2: 配列を固定長に。配列のヒープ確保がなくなって倍は速い\n- Devirtualized3: 距離計算も同様に汎用化。ユークリッド距離以外も使えるように\n- Instantiation: 型引数書くのつらいでござる。ごまかし\n\n詳しい説明: [C# にも型クラス(Shapes)が欲しい… 距離空間上のアルゴリズム実装](http://ufcpp.net/blog/2018/5/metricspace/)\n"
  },
  {
    "path": "Demo/2018/NrtPreview09112018/Closure.cs",
    "content": "﻿class Closure\n{\n    static void X(object ? x)\n    {\n        if (x == null)\n        {\n            x = new object();\n        }\n\n        void a()\n        {\n            object nonNull = x; // CS8600\n        };\n\n        a();\n    }\n}\n"
  },
  {
    "path": "Demo/2018/NrtPreview09112018/CurriedDelegate.cs",
    "content": "using System;\nusing System.Collections.Generic;\n\nstatic class Ex\n{\n    public static void Add<T1, T2>(this List<(T1, T2)> list, T1 x1, T2 x2) => list.Add((x1, x2));\n}\n\nclass CurriedDelegate\n{\n    static void Main()\n    {\n        var list = new List<(int, int)>();\n        Action<(int, int)> ok1 = list.Add;\n        Action<int, int> ok2 = (x, y) => list.Add((x, y));\n\n        Action<int, int> warning = list.Add; // Warning CS8622  Nullability of reference types in type of parameter 'list' of 'void Ex.Add<int, int>(List<(int, int)> list, int x1, int x2)' doesn't match the target delegate 'A<int, int>'.\n    }\n}\n"
  },
  {
    "path": "Demo/2018/NrtPreview09112018/EarlyReturn.cs",
    "content": "class EarlyReturn\n{\n    static string? NoWarning(object? x)\n    {\n        if (x == null) return null;\n        return x.ToString();\n    }\n\n    static string? Warning(object? x)\n    {\n        if (x == null) return null;\n        if (x is string s) return s; // add this line\n        return x.ToString(); // CS8602\n    }\n\n    static string? NoWarningAgain(object? x)\n    {\n        if (x is string s) return s; // add this line\n        if (x == null) return null;\n        return x.ToString(); // no warning\n    }\n}\n"
  },
  {
    "path": "Demo/2018/NrtPreview09112018/ExplicitInterfaceMethod.cs",
    "content": "using System.Collections;\nusing System.Collections.Generic;\n\nstruct Warning1<T> : IEnumerable<T>\n{\n    IEnumerator<T> IEnumerable<T>.GetEnumerator() => null!; // CS8616\n    IEnumerator IEnumerable.GetEnumerator() => null!;\n}\n\nstruct Warning2<T> : IEnumerable<T> where T : class ?\n{\n    IEnumerator<T> IEnumerable<T>.GetEnumerator() => null!; // CS8616\n    IEnumerator IEnumerable.GetEnumerator() => null!;\n}\n\nstruct NoWarning1 : IEnumerable<int>\n{\n    IEnumerator<int> IEnumerable<int>.GetEnumerator() => null!;\n    IEnumerator IEnumerable.GetEnumerator() => null!;\n}\n\nstruct NoWarning2<T> : IEnumerable<T> where T : class\n{\n    IEnumerator<T> IEnumerable<T>.GetEnumerator() => null!;\n    IEnumerator IEnumerable.GetEnumerator() => null!;\n}\n\nstruct NoWarning3<T> : IEnumerable<T> where T : struct\n{\n    IEnumerator<T> IEnumerable<T>.GetEnumerator() => null!;\n    IEnumerator IEnumerable.GetEnumerator() => null!;\n}\n"
  },
  {
    "path": "Demo/2018/NrtPreview09112018/FieldInitializer.cs",
    "content": "class FieldInitializer\n{\n    private static object A(object x) => x;\n\n    private object M1() => null; // CS8603\n    private object M2() => A(null); // CS8625\n\n    private object X1 = null; // No warning\n    private object X2 = A(null); // No warning\n}\n"
  },
  {
    "path": "Demo/2018/NrtPreview09112018/NestedDerivedClass.cs",
    "content": "﻿abstract class Base<T>\n{\n    public virtual T[]? X => null;\n\n    class Inner : Base<T>\n    {\n        public override T[]? X => null; // CS8608\n    }\n}\n\nclass Outer : Base<string>\n{\n    public override string[]? X => null; // No warning\n}\n"
  },
  {
    "path": "Demo/2018/NrtPreview09112018/NonNullWhenNonNull.cs",
    "content": "﻿namespace NrtPreview09112018\n{\n    static class NonNullWhenNonNull\n    {\n        class Base { }\n        class Derived : Base { }\n\n        static void M()\n        {\n            Base[] b = new Derived[] { new Derived() };\n            Derived[] d = b.Convert<Base, Derived>(); // expected non-null bacause b is not null, but CS8600\n        }\n\n        public static TDerived[]? Convert<TBase, TDerived>(this \n            // I want [NonNullWhenNonNull] attribute.\n            TBase[]? array)\n            where TDerived : class, TBase\n        {\n            if (array is TDerived[] x) return x;\n            if (array == null) return null;\n\n            TDerived[] d = new TDerived[array.Length];\n            TBase[] b = d;\n            for (int i = 0; i < d.Length; i++)\n                b[i] = array[i];\n            return d;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/NrtPreview09112018/NrtPreview09112018.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.0</TargetFramework>\n    <LangVersion>8.0</LangVersion>\n    <NullableReferenceTypes>True</NullableReferenceTypes>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/NrtPreview09112018/NrtPreview09112018.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28010.2041\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NrtPreview09112018\", \"NrtPreview09112018.csproj\", \"{783A00DA-FA90-421D-9D1F-9DD143B399DB}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{783A00DA-FA90-421D-9D1F-9DD143B399DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{783A00DA-FA90-421D-9D1F-9DD143B399DB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{783A00DA-FA90-421D-9D1F-9DD143B399DB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{783A00DA-FA90-421D-9D1F-9DD143B399DB}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {31E46500-EF71-443B-B17D-94B2230E62C7}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/NrtPreview09112018/Switch.cs",
    "content": "﻿class Switch\n{\n    static void X(object? x)\n    {\n        switch (x)\n        {\n            case null:\n                return;\n            default:\n                break;\n        }\n\n        object nonNull = x; // CS8600\n    }\n}\n"
  },
  {
    "path": "Demo/2018/NrtPreview09112018/readme.md",
    "content": "# Roslyn_Nullable_References_Preview_09112018\n\nhttps://github.com/dotnet/csharplang/wiki/Nullable-Reference-Types-Preview\n\nC# 8.0 で入る予定の null 許容参照型、2018/9/11 プレビュー版を触ってみてる。\n\n人柱なので怪しい挙動をどんどん見つけてて、そのバグ報告用のプロジェクト。\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/ArrayDowncast/ArrayDowncast.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/ArrayDowncast/ArrayDowncastBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System.Runtime.CompilerServices;\n\npublic class ArrayDowncastBenchmark\n{\n    string[] _stringData = new string[] { \"a\", \"ab\", \"abc\", \"abcd\", \"abcde\", \"abcdef\", \"abcdefg\" };\n    object[] _objectData = new string[] { \"a\", \"ab\", \"abc\", \"abcd\", \"abcde\", \"abcdef\", \"abcdefg\" };\n\n    [Benchmark]\n    public int MemberwiseCast()\n    {\n        // 要素ごとに (string)_data[i] なキャストが掛かる\n        var sum = 0;\n        foreach (string s in _objectData)\n            sum += s.Length;\n        return sum;\n    }\n\n    [Benchmark]\n    public int ArrayCast()\n    {\n        // 最初に1回、配列自体のキャストが掛かる\n        var data = (string[])_objectData;\n        var sum = 0;\n        foreach (var s in data)\n            sum += s.Length;\n        return sum;\n    }\n\n    public struct Wrap<T>\n    {\n        public T Value;\n    }\n\n    [Benchmark]\n    public int UnsafeStructCast()\n    {\n        // 謎の最適化。\n        // string 1個だけのフィールドを持つ構造体に無理やり変換して使う。\n        // これで倍くらい速くなる。\n        var data = Unsafe.As<object[], Wrap<string>[]>(ref _objectData);\n        var sum = 0;\n        foreach (var s in data)\n            sum += s.Value.Length;\n        return sum;\n    }\n\n    [Benchmark(Baseline = true)]\n    public int Static()\n    {\n        // 比較対象として、元から string[] なものを列挙\n        var sum = 0;\n        foreach (var s in _stringData)\n            sum += s.Length;\n        return sum;\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/ArrayDowncast/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\npublic class Program\n{\n    static void Main()\n    {\n        BenchmarkRunner.Run<ArrayDowncastBenchmark>();\n    }\n}"
  },
  {
    "path": "Demo/2018/PerformanceTips/ArrayEnumeration/ArrayEnumeration.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.2</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/ArrayEnumeration/ArrayWrapper.Array.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\n\nnamespace ArrayEnumeration\n{\n    /// <summary>\n    /// <see cref=\"System.Collections.Immutable.ImmutableArray{T}\"/> みたいに、\n    /// 内部的に配列を1個持ってるだけのコレクションから要素を列挙することを考える。\n    /// </summary>\n    public partial struct ArrayWrapper<T>\n    {\n        // 比較のために生列挙をしたいので public (本来は不要)\n        public readonly T[] Array;\n        public ArrayWrapper(T[] array) => Array = array;\n    }\n\n    public partial class ArrayEnumerationBenchmark\n    {\n        public ArrayWrapper<int> _array;\n\n        [GlobalSetup]\n        public void Setup()\n        {\n            var array = new int[1024];\n            for (int i = 0; i < array.Length; i++) array[i] = i;\n            _array = new ArrayWrapper<int>(array);\n        }\n\n        // 比較のための生列挙。\n        [Benchmark(Baseline = true)]\n        public int RawEnumeration()\n        {\n            var sum = 0;\n            foreach (var x in _array.Array) sum += x;\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/ArrayEnumeration/ArrayWrapper.IEnumerable.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace ArrayEnumeration\n{\n    public partial struct ArrayWrapper<T> : IEnumerable<T>\n    {\n        // 具象型の Enumerator を返しているだけでは IEnumerable<T> になれないので、\n        // 別途明示的実装で IEnumerator<T> を返す GetEnumerator を用意。\n        IEnumerator<T> IEnumerable<T>.GetEnumerator() => new EnumeratorObject(Array);\n        IEnumerator IEnumerable.GetEnumerator() => new EnumeratorObject(Array);\n\n        // 構造体の Enumerator と中身は全く同じで、ただクラスになってるだけ。\n        // 構造体をインターフェイス越しに返すとかえって遅くなるので、こんなクラスが別途必要に…\n        public class EnumeratorObject : IEnumerator<T>\n        {\n            private readonly T[] _array;\n            private int _i;\n            internal EnumeratorObject(T[] array) => (_array, _i) = (array, -1);\n\n            public T Current => _array[_i];\n            public bool MoveNext() => ((uint)++_i) < (uint)_array.Length;\n\n            object IEnumerator.Current => Current;\n            public void Dispose() { }\n            public void Reset() => throw new NotImplementedException();\n        }\n    }\n\n    public partial class ArrayEnumerationBenchmark\n    {\n        // インターフェイス越し列挙になるように、IEnumerable<T> にキャストして使ってる。\n        // びっくりするくらい遅い。\n        // StructEnumeration とかに比べて10倍遅い。\n        [Benchmark]\n        public int InterfaceEnumeration()\n        {\n            var sum = 0;\n            foreach (var x in (IEnumerable<int>)_array) sum += x;\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/ArrayEnumeration/ArrayWrapper.ImmutableArray.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System.Collections.Immutable;\n\nnamespace ArrayEnumeration\n{\n    public partial struct ArrayWrapper<T>\n    {\n        // インデクサーも使いたいとき用、その3。\n        // ImmutableArray<T> を介してみる。\n        // 実装を見てる感じ、少なくとも struct Enumerator と同じスピードは出そうなものなのに…\n        // なんかなぜか遅い…\n        public ImmutableArray<T> AsImmurable() => ImmutableArray.Create(Array);\n    }\n\n    public partial class ArrayEnumerationBenchmark\n    {\n        // AsImmurable<T> 列挙。\n        // なんで遅いのかわからない…\n        // (といっても、Interface 列挙や ReadOnlyCollection<T> 列挙よりは速い。)\n        [Benchmark]\n        public int ImmutableArrayEnumeration()\n        {\n            var sum = 0;\n            foreach (var x in _array.AsImmurable()) sum += x;\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/ArrayEnumeration/ArrayWrapper.ReadOnlyCollection.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System.Collections.ObjectModel;\n\nnamespace ArrayEnumeration\n{\n    public partial struct ArrayWrapper<T>\n    {\n        // インデクサーも使いたいとき用、その1。\n        // ReadOnlyCollection<T> を介してみる。\n        // .NET Framework 2.0 時代のクラスなので、パフォーマンスへの考慮がまるでなく、相当遅い。\n        public ReadOnlyCollection<T> AsReadOnlyCollection() => new ReadOnlyCollection<T>(Array);\n    }\n\n    public partial class ArrayEnumerationBenchmark\n    {\n        // ReadOnlyCollection<T> 列挙。\n        // InterfaceEnumeration 以上に遅い。とにかく遅い。\n        // ReadOnlyCollection<T> は内部的に IList<T> 越しに配列アクセスするので、それがほんとに遅い。\n        [Benchmark]\n        public int ReadOnlyCollectionEnumeration()\n        {\n            var sum = 0;\n            foreach (var x in _array.AsReadOnlyCollection()) sum += x;\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/ArrayEnumeration/ArrayWrapper.Span.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\n\nnamespace ArrayEnumeration\n{\n    public partial struct ArrayWrapper<T>\n    {\n        // インデクサーも使いたいとき用、その2。\n        // Span<T> を介してみる。\n        // パフォーマンスに焦点が当たってた .NET Core 2.1 世代の型だけあって、かなり速い。\n        public ReadOnlySpan<T> AsSpan() => Array;\n    }\n\n    public partial class ArrayEnumerationBenchmark\n    {\n        // Span<T> 列挙\n        // こいつも配列生列挙とほぼ同じ性能。速い。\n        [Benchmark]\n        public int SpanEnumeration()\n        {\n            var sum = 0;\n            foreach (var x in _array.AsSpan()) sum += x;\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/ArrayEnumeration/ArrayWrapper.StructEnumerator.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace ArrayEnumeration\n{\n    public partial struct ArrayWrapper<T>\n    {\n        // 「仮想呼び出しは遅い」ということがわかっているわけで、\n        // こんな感じで具象型を返す GetEnumerator を作った方が高速。\n        // 構造体にした方が最適化が効く。\n        public Enumerator GetEnumerator() => new Enumerator(Array);\n\n        public struct Enumerator : IEnumerator<T>\n        {\n            private readonly T[] _array;\n            private int _i;\n            internal Enumerator(T[] array) => (_array, _i) = (array, -1);\n\n            public T Current => _array[_i];\n            public bool MoveNext() => ((uint)++_i) < (uint)_array.Length;\n            // ↑ uint がオーバーフローするまで MoveNext を空呼びされると結果が狂うけど、\n            // だいぶ速度が変わるので、めったにそんなことやる人いない空呼びのことを気にするのは止めておく。\n\n            object IEnumerator.Current => Current;\n            public void Dispose() { }\n            public void Reset() => throw new NotImplementedException();\n        }\n    }\n\n    public partial class ArrayEnumerationBenchmark\n    {\n        // 構造体の Enumerator 越しの列挙\n        // 構造体で返してるとほんとにきっちり最適化が効くみたいで、\n        // ほぼ配列生列挙と同じ速度が出る。\n        [Benchmark]\n        public int StructEnumeration()\n        {\n            var sum = 0;\n            foreach (var x in _array) sum += x;\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/ArrayEnumeration/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace ArrayEnumeration\n{\n    class Program\n    {\n        static void Main()\n        {\n            //var x = new ArrayEnumerationBenchmark();\n            //x.Setup();\n            //System.Console.WriteLine(x.InterfaceEnumeration());\n            //System.Console.WriteLine(x.StructEnumeration());\n            //System.Console.WriteLine(x.SpanEnumeration());\n\n            BenchmarkRunner.Run<ArrayEnumerationBenchmark>();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/DefaultIsNull/DefaultIsNull.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.1;netcoreapp2.0</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/DefaultIsNull/DefaultIsNullBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\n\npublic class DefaultIsNullBenchmark\n{\n    public bool IsValueType1<T>() => typeof(T).IsValueType;\n    public bool IsValueType2<T>() => default(T) != null;\n\n    [Benchmark]\n    public bool TypeIsValueType()\n        => IsValueType1<int>() && IsValueType1<DateTime>() && !IsValueType1<string>();\n\n    [Benchmark]\n    public bool DefaultIsNull()\n        => IsValueType2<int>() && IsValueType2<DateTime>() && !IsValueType2<string>();\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/DefaultIsNull/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nclass Program\n{\n    static void Main()\n    {\n        BenchmarkRunner.Run<DefaultIsNullBenchmark>(new MultipleRuntimesConfig());\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/Directory.Build.props",
    "content": "<Project>\n\n  <PropertyGroup>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../*.cs\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.2\" />\n    <PackageReference Include=\"xunit\" Version=\"2.4.1\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.5.2\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/DiscriminatedUnion/DiscriminatedUnion.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/DiscriminatedUnion/Discriminator.cs",
    "content": "﻿namespace DiscriminatedUnion\n{\n    /// <summary>\n    /// 今回、例としてとりあえず、string or char[] な union を作ることにする。\n    /// </summary>\n    public enum Discriminator\n    {\n        /// <summary>\n        /// 構造体で作ろうと思うんで、default(StringOrCharArray) を null 扱いするために、null にあたる値も用意。\n        /// </summary>\n        Null,\n\n        /// <summary>\n        /// string\n        /// </summary>\n        String,\n\n        /// <summary>\n        /// char[]\n        /// </summary>\n        CharArray,\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/DiscriminatedUnion/DiscriminatorField.cs",
    "content": "﻿using System;\n\nnamespace DiscriminatedUnion.DiscriminatorField\n{\n    /// <summary>\n    /// string or char[]。\n    /// <see cref=\"Span\"/> の実装に普通に is 演算子を避けようと試みてるけど… みたいな実装。\n    /// </summary>\n    /// <remarks>\n    /// <see cref=\"IsMatching.StringOrCharArray\"/> の方で書いている通り、isinst 命令はそこまで遅くもないんだけど。\n    /// 整数値の比較よりは遅いらしく、isinst を避けるために弁別用の enum フィールドを持とうという実装。\n    ///\n    /// ただ、結局 object のフィールドから string、もしくは、char[] を読み出そうとしたときにキャストが必要。\n    /// キャストの方は castclass 命令になるんだけど、内部的に isinst 命令と大差ないみたいで、実行時間もほとんど同じ。\n    ///\n    /// となると、このクラスは実は失敗作で、\n    /// 「せっかく事前に enum 値で型を判定してるのに、castclass 内で改めて型チェックをしてて、単に2重の負担がかかってるだけ」\n    /// になる。\n    /// もちろん、ちょっとだけ <see cref=\"IsMatching.StringOrCharArray\"/> よりも遅くなる。\n    /// </remarks>\n    public readonly struct StringOrCharArray\n    {\n        public Discriminator Type { get; }\n        private readonly object _value;\n\n        public StringOrCharArray(string s) => (Type, _value) = (Discriminator.String, s);\n        public StringOrCharArray(char[] array) => (Type, _value) = (Discriminator.CharArray, array);\n\n        public ReadOnlySpan<char> Span\n        {\n            get\n            {\n                // せっかく Type を見て switch してるのに…\n                switch (Type)\n                {\n                    default: return default;\n                    // この2行のキャストが余計。\n                    case Discriminator.String: return ((string)_value).AsSpan();\n                    case Discriminator.CharArray: return ((char[])_value).AsSpan();\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/DiscriminatedUnion/DiscriminatorFieldUnsafe.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace DiscriminatedUnion.DiscriminatorFieldUnsafe\n{\n    /// <summary>\n    /// string or char[]。\n    /// <see cref=\"Span\"/> の実装に is 演算子を避けて、<see cref=\"Unsafe\"/> を使うことで高速化した実装。\n    /// </summary>\n    /// <remarks>\n    /// <see cref=\"DiscriminatorField.StringOrCharArray\"/> の方で書いている通り、\n    /// enum 値の比較で isinst を避けたのに、結局キャストするのでは意味がない。\n    ///\n    /// そこで、<see cref=\"Unsafe.As{TFrom, TTo}(ref TFrom)\"/> を使って強制型変換してしまう。\n    /// こいつは、型チェックをすっとばしてるので高速。\n    /// 名前通り unsafe ではあるものの、事前に enum 値で型を調べているので問題は起こさない。\n    ///\n    /// これで無事、isinst 命令の負担を避けれるので高速。\n    /// <see cref=\"IsMatching.StringOrCharArray\"/> で書いたように桁違いに速くなったりはしないものの、\n    /// 数割程度は高速。\n    /// </remarks>\n    public readonly struct StringOrCharArray\n    {\n        public Discriminator Type { get; }\n        private readonly object _value;\n\n        public StringOrCharArray(string s) => (Type, _value) = (Discriminator.String, s);\n        public StringOrCharArray(char[] array) => (Type, _value) = (Discriminator.CharArray, array);\n\n        public ReadOnlySpan<char> Span\n        {\n            get\n            {\n                // せっかく Type を見て switch してるんだから\n                switch (Type)\n                {\n                    default: return default;\n                    // キャストを Unsafe.As で置き換えれば高速。\n                    case Discriminator.String: return Unsafe.As<object, string>(ref Unsafe.AsRef(_value)).AsSpan();\n                    case Discriminator.CharArray: return Unsafe.As<object, char[]>(ref Unsafe.AsRef(_value)).AsSpan();\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/DiscriminatedUnion/IsMatching.cs",
    "content": "﻿using System;\n\nnamespace DiscriminatedUnion.IsMatching\n{\n    /// <summary>\n    /// string or char[]。\n    /// <see cref=\"Span\"/> の実装に普通に is 演算子を使う。\n    /// </summary>\n    /// <remarks>\n    /// is によるパターンマッチングは、実際のところ、\n    /// <code><![CDATA[\n    /// var temp = _value as string;\n    /// if (temp != null) ...\n    /// ]]></code>\n    /// みたいなコードと同値。\n    /// で、as 演算子は IL 的には isinst 命令になってる。\n    ///\n    /// isinst 命令は要は実行時型情報を調べる命令。\n    /// 実行時型情報と言っても、動的コード生成をしない(単に型を調べるだけ)ならそこまで高コストではない。\n    /// なので、動的コード生成みたいに「静的なコードに比べて2桁遅い」みたいな事態にはならない。\n    /// </remarks>\n    public readonly struct StringOrCharArray\n    {\n        private readonly object _value;\n\n        public StringOrCharArray(string s) => _value = s;\n        public StringOrCharArray(char[] array) => _value = array;\n\n        public ReadOnlySpan<char> Span\n            => _value is string s ? s.AsSpan() :\n            _value is char[] a ? a.AsSpan() :\n            default;\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/DiscriminatedUnion/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace DiscriminatedUnion\n{\n    class Program\n    {\n        static void Main()\n        {\n            BenchmarkRunner.Run<UnionBenchmark>();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/DiscriminatedUnion/UnionBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\nusing System.Linq;\n\nnamespace DiscriminatedUnion\n{\n    /// <summary>\n    /// <see cref=\"IsMatching.StringOrCharArray\"/>\n    /// <see cref=\"DiscriminatorField.StringOrCharArray\"/>\n    /// <see cref=\"DiscriminatorFieldUnsafe.StringOrCharArray\"/>\n    /// の3つでまったく同じコードを呼んで、それぞれの string or char[] の取り出しの負担を比べる。\n    /// </summary>\n    public class UnionBenchmark\n    {\n        private IsMatching.StringOrCharArray[] _data1;\n        private DiscriminatorField.StringOrCharArray[] _data2;\n        private DiscriminatorFieldUnsafe.StringOrCharArray[] _data3;\n\n        // 最適化で消えないようにだけしたいので、Length の和を取ってる。\n        // 処理内容に意味はなくて、単に繰り返し x.Span を呼びたい。\n        // (x.Span の中で型チェックが起きてる。)\n\n        [Benchmark]\n        public int IsMatching()\n        {\n            var sum = 0;\n            foreach (var x in _data1) sum += x.Span.Length;\n            return sum;\n        }\n\n        [Benchmark]\n        public int DiscriminatorField()\n        {\n            var sum = 0;\n            foreach (var x in _data2) sum += x.Span.Length;\n            return sum;\n        }\n\n        [Benchmark]\n        public int DiscriminatorFieldUnsafe()\n        {\n            var sum = 0;\n            foreach (var x in _data3) sum += x.Span.Length;\n            return sum;\n        }\n\n        [GlobalSetup]\n        public void Setup()\n        {\n            const int N = 100;\n            var r = new Random(1);\n\n            string getRandomString()\n            {\n                var len = r.Next(0, 100);\n                var buf = new char[len];\n                foreach (ref var c in buf.AsSpan())\n                    c = (char)r.Next(1, 0xd7ff);\n                return new string(buf);\n            }\n\n            var strings = new[] { \"\", \"abc\", \"waesrxdtfygujctvygbji\", \"ｓれｄｔｆｙｇんｖｔｙｂｇｐｍこ\", \"TRFYGIJDRFTGYIMJ\" }\n                .Concat(Enumerable.Range(0, 50).Select(_ => getRandomString()))\n                .ToArray();\n\n            _data1 = new IsMatching.StringOrCharArray[N];\n            _data2 = new DiscriminatorField.StringOrCharArray[N];\n            _data3 = new DiscriminatorFieldUnsafe.StringOrCharArray[N];\n\n            for (int i = 0; i < 100; i++)\n            {\n                var s = strings[r.Next(0, strings.Length)];\n\n                if (r.NextDouble() < 0.5)\n                {\n                    _data1[i] = new IsMatching.StringOrCharArray(s);\n                    _data2[i] = new DiscriminatorField.StringOrCharArray(s);\n                    _data3[i] = new DiscriminatorFieldUnsafe.StringOrCharArray(s);\n                }\n                else\n                {\n                    char[] array = s.ToArray();\n                    _data1[i] = new IsMatching.StringOrCharArray(array);\n                    _data2[i] = new DiscriminatorField.StringOrCharArray(array);\n                    _data3[i] = new DiscriminatorFieldUnsafe.StringOrCharArray(array);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/EnumHasFlag/EnumHasFlag.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.1;netcoreapp2.0</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/EnumHasFlag/EnumHasFlagBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\nusing System.Runtime.CompilerServices;\n\nenum A1 : sbyte { X = 1, Y = 2, Z = 4 }\nenum A2 : byte { X = 1, Y = 2, Z = 4 }\nenum B1 : short { X = 1, Y = 2, Z = 4 }\nenum B2 : ushort { X = 1, Y = 2, Z = 4 }\nenum C1 : int { X = 1, Y = 2, Z = 4 }\nenum C2 : uint { X = 1, Y = 2, Z = 4 }\nenum D1 : long { X = 1, Y = 2, Z = 4 }\nenum D2 : ulong { X = 1, Y = 2, Z = 4 }\n\npublic class EnumHasFlagBenchmark\n{\n    /// <summary>\n    /// enum をジェネリックに HasFlag をするために、Unsafe で無理やり整数型に変換して AND 取る関数。\n    /// </summary>\n    /// <remarks>\n    /// sizeof は JIT 時定数になっているので、所望の if 以外のところは完全に消えてくれる。\n    /// なので、ほぼ、非ジェネリックな実装と同程度のコストになってるはず。\n    /// </remarks>\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    static bool UnsafeHasFlag<T>(T x, T y)\n        where T : unmanaged, Enum\n    {\n        if (Unsafe.SizeOf<T>() == 1) return (Unsafe.As<T, byte>(ref x) & Unsafe.As<T, byte>(ref y)) != 0;\n        else if (Unsafe.SizeOf<T>() == 2) return (Unsafe.As<T, ushort>(ref x) & Unsafe.As<T, ushort>(ref y)) != 0;\n        else if (Unsafe.SizeOf<T>() == 4) return (Unsafe.As<T, uint>(ref x) & Unsafe.As<T, uint>(ref y)) != 0;\n        else if (Unsafe.SizeOf<T>() == 8) return (Unsafe.As<T, ulong>(ref x) & Unsafe.As<T, ulong>(ref y)) != 0;\n        else { Throw(); return default; }\n    }\n\n    private static void Throw() => throw new InvalidOperationException();\n\n    /// <summary>\n    /// 比較。\n    /// <see cref=\"Enum.HasFlag(Enum)\"/> を呼ぶだけ。\n    /// </summary>\n    /// <remarks>\n    /// .NET Core 2.1 ではランタイム上の最適化で単なる AND に置き換わる。\n    /// それ以前のランタイムを使うと box 化を起こしてすさまじく遅い。\n    /// </remarks>\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    static bool EnumHasFlag<T>(T x, T y)\n        where T : unmanaged, Enum\n        => x.HasFlag(y);\n\n    // 比較。以下、非ジェネリック実装を全部の型に用意。\n    static bool NonGenericHasFlag(A1 x, A1 y) => (((byte)x) & ((byte)y)) != 0;\n    static bool NonGenericHasFlag(A2 x, A2 y) => (((byte)x) & ((byte)y)) != 0;\n    static bool NonGenericHasFlag(B1 x, B1 y) => (((ushort)x) & ((ushort)y)) != 0;\n    static bool NonGenericHasFlag(B2 x, B2 y) => (((ushort)x) & ((ushort)y)) != 0;\n    static bool NonGenericHasFlag(C1 x, C1 y) => (((uint)x) & ((uint)y)) != 0;\n    static bool NonGenericHasFlag(C2 x, C2 y) => (((uint)x) & ((uint)y)) != 0;\n    static bool NonGenericHasFlag(D1 x, D1 y) => (((ulong)x) & ((ulong)y)) != 0;\n    static bool NonGenericHasFlag(D2 x, D2 y) => (((ulong)x) & ((ulong)y)) != 0;\n\n    A1[] _a1;\n    A2[] _a2;\n    B1[] _b1;\n    B2[] _b2;\n    C1[] _c1;\n    C2[] _c2;\n    D1[] _d1;\n    D2[] _d2;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        _a1 = new A1[8];\n        _a2 = new A2[8];\n        _b1 = new B1[8];\n        _b2 = new B2[8];\n        _c1 = new C1[8];\n        _c2 = new C2[8];\n        _d1 = new D1[8];\n        _d2 = new D2[8];\n\n        for (int i = 0; i < 8; i++)\n        {\n            _a1[i] = (A1)i;\n            _a2[i] = (A2)i;\n            _b1[i] = (B1)i;\n            _b2[i] = (B2)i;\n            _c1[i] = (C1)i;\n            _c2[i] = (C2)i;\n            _d1[i] = (D1)i;\n            _d2[i] = (D2)i;\n        }\n    }\n\n    [Benchmark]\n    public bool WithUnsafe()\n    {\n        bool b = false;\n        foreach (var x in _a1) foreach (var y in _a1) b ^= UnsafeHasFlag(x, y);\n        foreach (var x in _a2) foreach (var y in _a2) b ^= UnsafeHasFlag(x, y);\n        foreach (var x in _b1) foreach (var y in _b1) b ^= UnsafeHasFlag(x, y);\n        foreach (var x in _b2) foreach (var y in _b2) b ^= UnsafeHasFlag(x, y);\n        foreach (var x in _c1) foreach (var y in _c1) b ^= UnsafeHasFlag(x, y);\n        foreach (var x in _c2) foreach (var y in _c2) b ^= UnsafeHasFlag(x, y);\n        foreach (var x in _d1) foreach (var y in _d1) b ^= UnsafeHasFlag(x, y);\n        foreach (var x in _d2) foreach (var y in _d2) b ^= UnsafeHasFlag(x, y);\n        return b;\n    }\n\n    [Benchmark]\n    public bool WithEnum()\n    {\n        bool b = false;\n        foreach (var x in _a1) foreach (var y in _a1) b ^= EnumHasFlag(x, y);\n        foreach (var x in _a2) foreach (var y in _a2) b ^= EnumHasFlag(x, y);\n        foreach (var x in _b1) foreach (var y in _b1) b ^= EnumHasFlag(x, y);\n        foreach (var x in _b2) foreach (var y in _b2) b ^= EnumHasFlag(x, y);\n        foreach (var x in _c1) foreach (var y in _c1) b ^= EnumHasFlag(x, y);\n        foreach (var x in _c2) foreach (var y in _c2) b ^= EnumHasFlag(x, y);\n        foreach (var x in _d1) foreach (var y in _d1) b ^= EnumHasFlag(x, y);\n        foreach (var x in _d2) foreach (var y in _d2) b ^= EnumHasFlag(x, y);\n        return b;\n    }\n\n    [Benchmark]\n    public bool NonGeneric()\n    {\n        bool b = false;\n        foreach (var x in _a1) foreach (var y in _a1) b ^= NonGenericHasFlag(x, y);\n        foreach (var x in _a2) foreach (var y in _a2) b ^= NonGenericHasFlag(x, y);\n        foreach (var x in _b1) foreach (var y in _b1) b ^= NonGenericHasFlag(x, y);\n        foreach (var x in _b2) foreach (var y in _b2) b ^= NonGenericHasFlag(x, y);\n        foreach (var x in _c1) foreach (var y in _c1) b ^= NonGenericHasFlag(x, y);\n        foreach (var x in _c2) foreach (var y in _c2) b ^= NonGenericHasFlag(x, y);\n        foreach (var x in _d1) foreach (var y in _d1) b ^= NonGenericHasFlag(x, y);\n        foreach (var x in _d2) foreach (var y in _d2) b ^= NonGenericHasFlag(x, y);\n        return b;\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/EnumHasFlag/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nclass Program\n{\n\n    static void Main()\n    {\n        BenchmarkRunner.Run<EnumHasFlagBenchmark>(new MultipleRuntimesConfig());\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/Enumeration/Enumeration.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/Enumeration/EnumerationBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System.Linq;\n\nnamespace Enumeration\n{\n    [MemoryDiagnoser]\n    public class EnumerationBenchmark\n    {\n        private ListLike<int> _data;\n\n        [GlobalSetup]\n        public void Setup()\n        {\n            var array = Enumerable.Range(0, 1000).ToArray();\n            _data = new ListLike<int> { Array = array, Length = 500 };\n        }\n\n        [Benchmark] public int SumArray() => Sum.SumArray(_data);\n        [Benchmark] public int SumSpan() => Sum.SumSpan(_data);\n        [Benchmark] public int SumEnumerable() => Sum.SumEnumerable(_data);\n        [Benchmark] public int SumFastEnumerable() => Sum.SumFastEnumerable(_data);\n        [Benchmark] public int SumEnumeratorInterface() => Sum.SumEnumeratorInterface(_data.GetEnumerator());\n        [Benchmark] public int SumFastEnumeratorInterface() => Sum.SumFastEnumeratorInterface(_data.GetFastEnumerator());\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/Enumeration/EnumerationTest.cs",
    "content": "﻿using System.Linq;\nusing Xunit;\n\nnamespace Enumeration\n{\n    public class EnumerationTest\n    {\n        private static ListLike<int> _data;\n        private static readonly int _expected;\n\n        static EnumerationTest()\n        {\n            var array = Enumerable.Range(0, 1000).ToArray();\n            _data = new ListLike<int> { Array = array, Length = 500 };\n\n            _expected = array.Take(500).Sum();\n        }\n\n        [Fact] public void SumArray() => Assert.Equal(_expected, Sum.SumArray(_data));\n        [Fact] public void SumSpan() => Assert.Equal(_expected, Sum.SumSpan(_data));\n        [Fact] public void SumEnumerable() => Assert.Equal(_expected, Sum.SumEnumerable(_data));\n        [Fact] public void SumFastEnumerable() => Assert.Equal(_expected, Sum.SumFastEnumerable(_data));\n        [Fact] public void SumEnumeratorInterface() => Assert.Equal(_expected, Sum.SumEnumeratorInterface(_data.GetEnumerator()));\n        [Fact] public void SumFastEnumeratorInterface() => Assert.Equal(_expected, Sum.SumFastEnumeratorInterface(_data.GetFastEnumerator()));\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/Enumeration/IFastEnumerator.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Enumeration\n{\n    /// <summary>\n    /// IEnumerator が MoveNext/Current の2メソッドに分かれてるのが嫌で、1つにまとめたインターフェイス。\n    /// </summary>\n    /// <remarks>\n    /// .NET の covariance の制限で、以下のようなメソッドにはできない。\n    ///\n    /// <code><![CDATA[\n    /// (bool success, T value) MoveNext(); // タプルが covariant にできない\n    /// bool TryMoveNext(out T value); // out 引数が covariant にできない\n    /// ]]></code>\n    ///\n    /// ちなみに、2メソッドに分かれているというっても、インライン展開される限りには大してコストかからない。\n    /// <see cref=\"List{T}.Enumerator\"/> みたいに具象型(特に構造体)を直接使う分には全然コストにならなくて、\n    /// インターフェイス越しに呼ぶときだけが問題になる。\n    /// </remarks>\n    public interface IFastEnumerator<out T>\n    {\n        T TryMoveNext(out bool success);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/Enumeration/ListLike.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\n\nnamespace Enumeration\n{\n    /// <summary>\n    /// 列挙方式の比較用。\n    /// <see cref=\"List{T}\"/> の中身のうち、列挙に関係する部分だけ抜き出してある。\n    /// 要は、長めの配列を確保して、そのうち先頭から <see cref=\"Length\"/> だけ中身が詰まってるやつ。\n    /// </summary>\n    public class ListLike<T>\n    {\n        // 比較として生配列の列挙もやりたいので public\n        // Add とかは割愛したいので、テストに使うデータも直接これに書き込んでしまうことにする。\n        public T[] Array;\n        public int Length;\n\n        #region 生 Span<T> で列挙\n\n        public Span<T> GetSpan() => Array.AsSpan(0, Length);\n\n        #endregion\n        #region List<T>.GetEnumerator に近い実装\n\n        public struct Enumerator : IEnumerator<T>\n        {\n            private readonly T[] _array;\n            private readonly int _length;\n            private T _current;\n            private int _index;\n\n            public Enumerator(T[] array, int length) => (_array, _length, _current, _index) = (array, length, default, 0);\n\n            public T Current => _current;\n\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public bool MoveNext()\n            {\n                if ((uint)_index < (uint)_length)\n                {\n                    _current = _array[_index];\n                    _index++;\n                    return true;\n                }\n                return false;\n            }\n\n            object IEnumerator.Current => Current;\n            public void Dispose() { }\n            public void Reset() => throw new NotImplementedException();\n        }\n\n        public Enumerator GetEnumerator() => new Enumerator(Array, Length);\n\n        #endregion\n        #region FastEnumerator 実装\n\n        public struct FastEnumerator : IFastEnumerator<T>\n        {\n            private readonly T[] _array;\n            private readonly int _length;\n            private int _index;\n\n            public FastEnumerator(T[] array, int length) => (_array, _length, _index) = (array, length, 0);\n\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            public T TryMoveNext(out bool success)\n            {\n                if ((uint)_index < (uint)_length)\n                {\n                    var current = _array[_index];\n                    _index++;\n                    success = true;\n                    return current;\n                }\n                success = false;\n                return default;\n            }\n        }\n\n        public FastEnumerator GetFastEnumerator() => new FastEnumerator(Array, Length);\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/Enumeration/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace Enumeration\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            BenchmarkRunner.Run<EnumerationBenchmark>();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/Enumeration/Sum.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Enumeration\n{\n    class Sum\n    {\n        public static int SumArray(ListLike<int> list)\n        {\n            var sum = 0;\n            var (array, length) = (list.Array, list.Length);\n            for (int i = 0; i < length; i++)\n                sum += array[i];\n            return sum;\n        }\n\n        public static int SumSpan(ListLike<int> list)\n        {\n            // Fast Span (.NET Core 2.1 以降限定)だけど、foreach で普通に生列挙と同じスピードが出るのが Span のいいところ。\n            var sum = 0;\n            foreach (var x in list.GetSpan())\n                sum += x;\n            return sum;\n        }\n\n        public static int SumEnumerable(ListLike<int> list)\n        {\n            var sum = 0;\n            // foreach (var x in list) で行けるんだけど、比較のために生利用\n            var e = list.GetEnumerator();\n            while (e.MoveNext())\n                sum += e.Current;\n            return sum;\n        }\n\n        public static int SumFastEnumerable(ListLike<int> list)\n        {\n            var sum = 0;\n            var e = list.GetFastEnumerator();\n            var x = e.TryMoveNext(out var success);\n            while (success)\n            {\n                sum += x;\n                x = e.TryMoveNext(out success);\n            }\n            return sum;\n        }\n\n        public static int SumEnumeratorInterface(IEnumerator<int> e)\n        {\n            var sum = 0;\n            while (e.MoveNext())\n                sum += e.Current;\n            return sum;\n        }\n\n        public static int SumFastEnumeratorInterface(IFastEnumerator<int> e)\n        {\n            var sum = 0;\n            var x = e.TryMoveNext(out var success);\n            while (success)\n            {\n                sum += x;\n                x = e.TryMoveNext(out success);\n            }\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/EqualityComparerDefault/EqualityComparerDefault.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.1;netcoreapp2.0</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/EqualityComparerDefault/Program.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System;\nusing System.Collections.Generic;\n\npublic struct Unit : IEquatable<Unit>\n{\n    public bool Equals(Unit other) => true;\n    public override bool Equals(object obj) => obj is Unit;\n    public override int GetHashCode() => 0;\n}\n\npublic class EqualityComparerDefaultBenchmark\n{\n    [Benchmark]\n    public bool IntEquals() => EqualityComparer<int>.Default.Equals(1, 2);\n\n    [Benchmark]\n    public bool StringEquals() => EqualityComparer<string>.Default.Equals(\"abc\", \"def\");\n\n    [Benchmark]\n    public bool UserDefinedEquals() => EqualityComparer<Unit>.Default.Equals(default, default);\n}\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        BenchmarkRunner.Run<EqualityComparerDefaultBenchmark>(new MultipleRuntimesConfig());\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/FastEnumeration/Adapter.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace FastEnumeration\n{\n    struct Adapter<T> : IEnumerator<T>\n    {\n        private IFastEnumerator<T> _enumerator;\n\n        public Adapter(IFastEnumerator<T> enumerator)\n        {\n            _enumerator = enumerator;\n            Current = default;\n        }\n\n        public T Current { get; private set; }\n\n        public bool MoveNext()\n        {\n            Current = _enumerator.TryMoveNext(out var success);\n            return success;\n        }\n\n        object IEnumerator.Current => Current;\n        public void Dispose() { }\n        public void Reset() => throw new NotImplementedException();\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/FastEnumeration/FastEnumeration.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.2</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.2\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/FastEnumeration/FastEnumerator.cs",
    "content": "﻿namespace FastEnumeration\n{\n    /// <summary>\n    /// <see cref=\"NormalEnumerator\"/> と同じことを <see cref=\"IFastEnumerator{T}\"/> で実装。\n    /// </summary>\n    class FastEnumerator : IFastEnumerator<int>\n    {\n        private readonly int[] _data;\n        public FastEnumerator(int[] data) => _data = data;\n\n        private int _i = -1;\n\n        public int TryMoveNext(out bool success)\n        {\n            var i = ++_i;\n            var data = _data;\n            if ((uint)i < (uint)data.Length)\n            {\n                success = true;\n                return data[i];\n            }\n            else\n            {\n                success = false;\n                return default;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/FastEnumeration/ForeachBenchmark.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.CompilerServices;\nusing BenchmarkDotNet.Attributes;\n\nnamespace FastEnumeration\n{\n    /// <summary>\n    /// 配列に対する和の計算を、<see cref=\"NormalEnumerator\"/> と <see cref=\"FastEnumerator\"/> を介するのでどのくらい違うかを試す。\n    /// あと、具象型を渡す(non-virtual なのでインライン化を期待できる)と、インターフェイスを渡す(virtual なのでインライン化されない)でどのくらい差が付くかも試す。\n    ///\n    /// 実行例:\n    ///            Method |     Mean |    Error |   StdDev |\n    /// ----------------- |---------:|---------:|---------:|\n    ///  NonVirtualNormal | 165.8 ns | 2.225 ns | 2.082 ns |\n    ///    NonVirtualFast | 161.2 ns | 2.208 ns | 2.065 ns |\n    ///     VirtualNormal | 449.6 ns | 2.595 ns | 2.300 ns |\n    ///       VirtualFast | 271.3 ns | 2.338 ns | 2.072 ns |\n    ///\n    /// non-virtual な場合(具象型を直接渡す場合)はどの道インライン化で最適化がかかるのでそんなに差が出ない。\n    ///\n    /// 問題は virtual に呼んだ場合(インターフェイスを介して呼んだ)で、4割くらい差が出る。\n    /// 今回の場合、MoveNext/Current/TryMoveNext の呼び出し以外にやってることがほとんどないので、virtual call の負担の差がはっきりと出る(たぶん上限)。\n    /// あと、MoveNext/Current の場合、インデックスの範囲チェック(i &lt; length)とアクセス(data[i])がわかれることで、配列の最適化が効きにくくなってるはず。\n    /// </summary>\n    public class ForeachBenchmark\n    {\n        int[] _data;\n\n        [GlobalSetup]\n        public void Setup()\n        {\n            _data = Enumerable.Range(0, 100).ToArray();\n        }\n\n        [Benchmark]\n        public int NonVirtualNormal() => NonVirtualSum(new NormalEnumerator(_data));\n\n        [Benchmark]\n        public int NonVirtualFast() => NonVirtualSum(new FastEnumerator(_data));\n\n        [Benchmark]\n        public int VirtualNormal() => VirtualSum(new NormalEnumerator(_data));\n\n        [Benchmark]\n        public int VirtualFast() => VirtualSum(new FastEnumerator(_data));\n\n        [Benchmark]\n        public int Adapter() => GenericSum(new Adapter<int>(new FastEnumerator(_data)));\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static int NonVirtualSum(NormalEnumerator e)\n        {\n            var sum = 0;\n            while (e.MoveNext())\n            {\n                var x = e.Current;\n                sum += x;\n            }\n            return sum;\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static int NonVirtualSum(FastEnumerator e)\n        {\n            var sum = 0;\n            while (true)\n            {\n                var x = e.TryMoveNext(out var success);\n                if (!success) break;\n                sum += x;\n            }\n            return sum;\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static int GenericSum<T>(T e)\n            where T : IEnumerator<int>\n        {\n            var sum = 0;\n            while (e.MoveNext())\n            {\n                var x = e.Current;\n                sum += x;\n            }\n            return sum;\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static int VirtualSum(IEnumerator<int> e)\n        {\n            var sum = 0;\n            while (e.MoveNext())\n            {\n                var x = e.Current;\n                sum += x;\n            }\n            return sum;\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        static int VirtualSum(IFastEnumerator<int> e)\n        {\n            var sum = 0;\n            while (true)\n            {\n                var x = e.TryMoveNext(out var success);\n                if (!success) break;\n                sum += x;\n            }\n            return sum;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/FastEnumeration/IFastEnumerator.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace FastEnumeration\n{\n    /// <summary>\n    /// MoveNext/Current で2回 virtual call するのが嫌で、1つにまとめようというもの。\n    ///\n    /// <typeparamref name=\"T\"/> の共変性を確保するために、戻り値が T で out の方が bool になってしまう。\n    /// なので結構使い勝手は悪い。\n    /// out 引数とか、タプルを使った (T, bool) で共変性を担保できないっていう .NET の問題。\n    /// </summary>\n    interface IFastEnumerator<out T>\n    {\n        T TryMoveNext(out bool success);\n    }\n\n    /// <summary>\n    /// <see cref=\"IEnumerable{T}\"/> 同様、<see cref=\"IFastEnumerator{T}\"/> を返すだけのインターフェイスも。\n    /// ただ、今回のベンチマークでは enumerator の方だけパフォーマンスを見るんで、こいつは使ってない。\n    /// </summary>\n    interface IFastEnumerable<out T>\n    {\n        IFastEnumerator<T> GetEnumerator();\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/FastEnumeration/NormalEnumerator.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace FastEnumeration\n{\n    /// <summary>\n    /// <see cref=\"IEnumerator{T}\"/> 実装。\n    /// 単に配列を列挙。\n    /// <see cref=\"Array.GetEnumerator\"/> を呼ぶのでもいいんだけど、比較のために自作。\n    /// パフォーマンス優先でチェックをさぼってる。MoveNext を int がオーバーフローするまで呼ぶと MoveNext が再び true を返すようになるけど、そんな使い方はしないという前提。\n    /// </summary>\n    class NormalEnumerator : IEnumerator<int>\n    {\n        private readonly int[] _data;\n        public NormalEnumerator(int[] data) => _data = data;\n\n        private int _i = -1;\n\n        public int Current => _data[_i];\n        public bool MoveNext() => ++_i < _data.Length;\n\n        object IEnumerator.Current => Current;\n        public void Dispose() { }\n        public void Reset() => throw new NotImplementedException();\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/FastEnumeration/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace FastEnumeration\n{\n    class Program\n    {\n        static void Main()\n        {\n            BenchmarkRunner.Run<ForeachBenchmark>();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/MultipleRuntimesConfig.cs",
    "content": "﻿using BenchmarkDotNet.Columns;\nusing BenchmarkDotNet.Configs;\nusing BenchmarkDotNet.Diagnosers;\nusing BenchmarkDotNet.Exporters;\nusing BenchmarkDotNet.Jobs;\nusing BenchmarkDotNet.Loggers;\nusing BenchmarkDotNet.Toolchains.CsProj;\n\npublic class MultipleRuntimesConfig : ManualConfig\n{\n    public MultipleRuntimesConfig()\n    {\n        Add(Job.Default.With(CsProjCoreToolchain.NetCoreApp20));\n        Add(Job.Default.With(CsProjCoreToolchain.NetCoreApp21));\n\n        Add(DefaultColumnProviders.Instance);\n        Add(MarkdownExporter.GitHub);\n        Add(new ConsoleLogger());\n        Add(new HtmlExporter());\n        Add(MemoryDiagnoser.Default);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/PerformanceTips.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28407.52\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Enumeration\", \"Enumeration\\Enumeration.csproj\", \"{99D4102B-B805-4019-B58C-5EE9F9A48F97}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ArrayDowncast\", \"ArrayDowncast\\ArrayDowncast.csproj\", \"{C812F193-9005-428B-86B5-AF10249E714D}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"VirtualCall\", \"VirtualCall\\VirtualCall.csproj\", \"{C8E27C10-9D43-4EE7-8398-34FE2EF65AD0}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DefaultIsNull\", \"DefaultIsNull\\DefaultIsNull.csproj\", \"{C4CAC103-C8AD-4C85-95F5-894C55E2D4A5}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"EnumHasFlag\", \"EnumHasFlag\\EnumHasFlag.csproj\", \"{4B438495-60A1-4D89-B6A1-323A2126B19B}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"EqualityComparerDefault\", \"EqualityComparerDefault\\EqualityComparerDefault.csproj\", \"{2954ABDF-751C-4D79-BF0C-A28EF0F3C116}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"DiscriminatedUnion\", \"DiscriminatedUnion\\DiscriminatedUnion.csproj\", \"{5BCCBE9E-8321-461D-8C20-81AA68A2727A}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"FastEnumeration\", \"FastEnumeration\\FastEnumeration.csproj\", \"{5F37011A-0AEA-4BAD-BFF1-F08948D1BE2C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ArrayEnumeration\", \"ArrayEnumeration\\ArrayEnumeration.csproj\", \"{1B76FB6D-156F-4B7E-A813-A2BFD7400495}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{99D4102B-B805-4019-B58C-5EE9F9A48F97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{99D4102B-B805-4019-B58C-5EE9F9A48F97}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{99D4102B-B805-4019-B58C-5EE9F9A48F97}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{99D4102B-B805-4019-B58C-5EE9F9A48F97}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C812F193-9005-428B-86B5-AF10249E714D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C812F193-9005-428B-86B5-AF10249E714D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C812F193-9005-428B-86B5-AF10249E714D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C812F193-9005-428B-86B5-AF10249E714D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C8E27C10-9D43-4EE7-8398-34FE2EF65AD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C8E27C10-9D43-4EE7-8398-34FE2EF65AD0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C8E27C10-9D43-4EE7-8398-34FE2EF65AD0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C8E27C10-9D43-4EE7-8398-34FE2EF65AD0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C4CAC103-C8AD-4C85-95F5-894C55E2D4A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C4CAC103-C8AD-4C85-95F5-894C55E2D4A5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C4CAC103-C8AD-4C85-95F5-894C55E2D4A5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C4CAC103-C8AD-4C85-95F5-894C55E2D4A5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4B438495-60A1-4D89-B6A1-323A2126B19B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4B438495-60A1-4D89-B6A1-323A2126B19B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4B438495-60A1-4D89-B6A1-323A2126B19B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4B438495-60A1-4D89-B6A1-323A2126B19B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2954ABDF-751C-4D79-BF0C-A28EF0F3C116}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2954ABDF-751C-4D79-BF0C-A28EF0F3C116}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2954ABDF-751C-4D79-BF0C-A28EF0F3C116}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2954ABDF-751C-4D79-BF0C-A28EF0F3C116}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5BCCBE9E-8321-461D-8C20-81AA68A2727A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5BCCBE9E-8321-461D-8C20-81AA68A2727A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5BCCBE9E-8321-461D-8C20-81AA68A2727A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5BCCBE9E-8321-461D-8C20-81AA68A2727A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5F37011A-0AEA-4BAD-BFF1-F08948D1BE2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5F37011A-0AEA-4BAD-BFF1-F08948D1BE2C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5F37011A-0AEA-4BAD-BFF1-F08948D1BE2C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5F37011A-0AEA-4BAD-BFF1-F08948D1BE2C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1B76FB6D-156F-4B7E-A813-A2BFD7400495}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1B76FB6D-156F-4B7E-A813-A2BFD7400495}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1B76FB6D-156F-4B7E-A813-A2BFD7400495}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1B76FB6D-156F-4B7E-A813-A2BFD7400495}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {25C65733-C3B9-41CA-98A8-1C44FCC72B17}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/VirtualCall/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nclass Program\n{\n    static void Main()\n    {\n        BenchmarkRunner.Run<VirtualCallBanchmark>(new MultipleRuntimesConfig());\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/VirtualCall/VirtualCall.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>netcoreapp2.1;netcoreapp2.0</TargetFrameworks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/PerformanceTips/VirtualCall/VirtualCallBanchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\n\ninterface IValue { int Value { get; } }\nclass Impl : IValue { public int Value => 0; }\n\npublic class VirtualCallBanchmark\n{\n    // インターフェイス越し\n    IValue A { get; } = new Impl();\n\n    // クラスを直公開\n    Impl B { get; } = new Impl();\n\n    [Benchmark]\n    public int Interface() => A.Value;\n\n    [Benchmark]\n    public int Class() => B.Value;\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/CancellationTokenExtensions.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace PipelineSockets\n{\n    public static class CancellationTokenExtensions\n    {\n        public static Task WhenCanceled(this CancellationToken cancellationToken)\n        {\n            var tcs = new TaskCompletionSource<bool>();\n            cancellationToken.Register(s => ((TaskCompletionSource<bool>)s).SetResult(true), tcs);\n            return tcs.Task;\n        }\n\n        public static CancellationTokenAwaiter GetAwaiter(this CancellationToken cancellationToken)\n        {\n            return new CancellationTokenAwaiter(cancellationToken);\n        }\n\n        public struct CancellationTokenAwaiter : INotifyCompletion\n        {\n            private readonly CancellationToken cancellationToken;\n\n            public CancellationTokenAwaiter(CancellationToken cancellationToken)\n            {\n                this.cancellationToken = cancellationToken;\n            }\n\n            public bool IsCompleted => cancellationToken.IsCancellationRequested;\n\n            public void OnCompleted(Action continuation) => cancellationToken.Register(continuation);\n\n            public void GetResult() => cancellationToken.WaitHandle.WaitOne();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/Models/A.cs",
    "content": "﻿using System.Buffers;\n\nnamespace PipelineSockets.Models\n{\n    struct A\n    {\n        public int Id;\n        public string Name;\n\n        public void WriteTo(IBufferWriter<byte> w)\n        {\n            w.Write(Id);\n            w.Write(Name);\n        }\n\n        public bool ReadFrom(ref BufferReader<byte> r)\n            =>\n                r.Read(out Id) &&\n                r.Read(out Name);\n    }\n\n    static partial class Extensions\n    {\n        public static void Write(this IBufferWriter<byte> w, A x) => x.WriteTo(w);\n\n        public static unsafe bool Read(ref this BufferReader<byte> r, out A x)\n        {\n            x = default;\n            return x.ReadFrom(ref r);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/Models/B.cs",
    "content": "﻿using System.Buffers;\n\nnamespace PipelineSockets.Models\n{\n    struct B\n    {\n        int Id;\n        IntVector P;\n        IntVector Q;\n\n        public void WriteTo(IBufferWriter<byte> w)\n        {\n            w.Write(Id);\n            w.Write(P);\n            w.Write(Q);\n        }\n\n        public bool ReadFrom(ref BufferReader<byte> r)\n            =>\n                r.Read(out Id) &&\n                r.Read(out P) &&\n                r.Read(out Q);\n    }\n\n    static partial class Extensions\n    {\n        public static void Write(this IBufferWriter<byte> w, B x) => x.WriteTo(w);\n\n        public static unsafe bool Read(ref this BufferReader<byte> r, out B x)\n        {\n            x = default;\n            return x.ReadFrom(ref r);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/Models/C.cs",
    "content": "﻿using System.Buffers;\n\nnamespace PipelineSockets.Models\n{\n    struct C\n    {\n        Vector U;\n        Vector V;\n\n        public void WriteTo(IBufferWriter<byte> w)\n        {\n            w.Write(U);\n            w.Write(V);\n        }\n\n        public bool ReadFrom(ref BufferReader<byte> r)\n            =>\n                r.Read(out U) &&\n                r.Read(out V);\n    }\n\n    static partial class Extensions\n    {\n        public static void Write(this IBufferWriter<byte> w, C x) => x.WriteTo(w);\n\n        public static unsafe bool Read(ref this BufferReader<byte> r, out C x)\n        {\n            x = default;\n            return x.ReadFrom(ref r);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/Models/IntVector.cs",
    "content": "﻿using System.Buffers;\n\nnamespace PipelineSockets.Models\n{\n    struct IntVector\n    {\n        public int X;\n        public int Y;\n        public int Z;\n\n        public void WriteTo(IBufferWriter<byte> w)\n        {\n            w.Write(X);\n            w.Write(Y);\n            w.Write(Z);\n        }\n\n        public bool ReadFrom(ref BufferReader<byte> r)\n            =>\n                r.Read(out X) &&\n                r.Read(out Y) &&\n                r.Read(out Z);\n    }\n\n    static partial class Extensions\n    {\n        public static void Write(this IBufferWriter<byte> w, IntVector x) => x.WriteTo(w);\n\n        public static unsafe bool Read(ref this BufferReader<byte> r, out IntVector x)\n        {\n            x = default;\n            return x.ReadFrom(ref r);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/Models/StringPipeExtentions.cs",
    "content": "﻿using System;\nusing System.Buffers;\nusing System.Runtime.InteropServices;\n\nnamespace PipelineSockets\n{\n    static class StringPipeExtentions\n    {\n        public static void Write(this IBufferWriter<byte> w, string x)\n        {\n            var span = w.GetSpan(x.Length * sizeof(char) + sizeof(int));\n            w.Write(x.Length);\n            var body = span.Slice(sizeof(int));\n            MemoryMarshal.Cast<char, byte>(x.AsSpan()).CopyTo(body);\n        }\n\n        public static unsafe bool Read(ref this BufferReader<byte> r, out string x)\n        {\n            r.Read(out int len);\n\n            var s = new string('\\0', len);\n            fixed (char* p = s)\n            {\n                var span = new Span<byte>((byte*)p, len * 2);\n                var readCount = r.CoptyTo(span);\n                if (readCount < len * 2)\n                {\n                    x = default;\n                    return false;\n                }\n            }\n\n            x = s;\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/Models/UnmanagedPipeExtentions.cs",
    "content": "﻿using System.Buffers;\nusing System.Runtime.InteropServices;\n\nnamespace PipelineSockets\n{\n    static class UnmanagedPipeExtentions\n    {\n        public static unsafe void Write<T>(this IBufferWriter<byte> w, T x)\n            where T : unmanaged\n        {\n            MemoryMarshal.Cast<byte, T>(w.GetSpan(sizeof(T)))[0] = x;\n            w.Advance(sizeof(T));\n        }\n\n        public static unsafe bool Read<T>(ref this BufferReader<byte> r, out T x)\n            where T : unmanaged\n        {\n            var temp = default(T);\n            var buffer = MemoryMarshal.Cast<T, byte>(MemoryMarshal.CreateSpan(ref temp, 1));\n            var span = r.Peek(buffer);\n            if(span.Length < sizeof(T))\n            {\n                x = default;\n                return false;\n            }\n            x = MemoryMarshal.Cast<byte, T>(span)[0];\n            r.Advance(sizeof(T));\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/Models/Vector.cs",
    "content": "﻿using System.Buffers;\n\nnamespace PipelineSockets.Models\n{\n    struct Vector\n    {\n        public float X;\n        public float Y;\n        public float Z;\n\n        public void WriteTo(IBufferWriter<byte> w)\n        {\n            w.Write(X);\n            w.Write(Y);\n            w.Write(Z);\n        }\n\n        public bool ReadFrom(ref BufferReader<byte> r)\n            =>\n                r.Read(out X) &&\n                r.Read(out Y) &&\n                r.Read(out Z);\n    }\n\n    static partial class Extensions\n    {\n        public static void Write(this IBufferWriter<byte> w, Vector x) => x.WriteTo(w);\n\n        public static unsafe bool Read(ref this BufferReader<byte> r, out Vector x)\n        {\n            x = default;\n            return x.ReadFrom(ref r);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/MyClient.cs",
    "content": "﻿using System;\nusing System.Buffers;\nusing System.IO.Pipelines;\nusing System.Net;\nusing System.Net.Sockets;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Pipelines.Sockets.Unofficial;\n\nnamespace PipelineSockets\n{\n    class MyClient\n    {\n        private readonly IDuplexPipe _pipe;\n        private readonly CancellationTokenSource _cts;\n        private readonly Task _readLoop;\n\n        public int Id { get; }\n\n        public MyClient(int id, IDuplexPipe pipe)\n        {\n            Id = id;\n            _pipe = pipe;\n\n            _cts = new CancellationTokenSource();\n            var ct = _cts.Token;\n\n            _readLoop = ReadLoop(ct);\n        }\n\n        public static async Task<MyClient> CreateAsync(EndPoint endPoint)\n        {\n            var s = new Socket(SocketType.Stream, ProtocolType.Tcp);\n            await s.ConnectAsync(endPoint);\n            var p = SocketConnection.Create(s);\n\n            var i = p.Input;\n            var r = await i.ReadAsync();\n\n            int read(ReadOnlySequence<byte> buffer)\n            {\n                var reader = new BufferReader<byte>(buffer);\n                if (!reader.Read(out int x)) throw new Exception();\n                return x;\n            }\n\n            var id = read(r.Buffer);\n            return new MyClient(id, p);\n        }\n\n        public MyClient(int id)\n        {\n            Id = id;\n        }\n\n        private async Task ReadLoop(CancellationToken ct)\n        {\n            while (!ct.IsCancellationRequested)\n            {\n                var i = _pipe.Input;\n                var result = await i.ReadAsync(ct);\n                var pos = ReadMessage(result);\n                i.AdvanceTo(pos);\n            }\n        }\n\n        private SequencePosition ReadMessage(ReadResult readResult)\n        {\n            var reader = new BufferReader<byte>(readResult.Buffer);\n            reader.Read(out byte opCode);\n            reader.Read(out int len);\n            var payload = new byte[len];\n            reader.CoptyTo(payload);\n            Received?.Invoke(this, opCode, payload);\n            return reader.Position;\n        }\n\n        public async ValueTask SendAsync(byte opCode, byte[] payload)\n        {\n            var o = _pipe.Output;\n            o.Write(opCode);\n            o.Write(payload.Length);\n            o.Write(payload);\n            await o.FlushAsync(_cts.Token);\n        }\n\n        public delegate void ReceivedEventHandler(MyClient sender, byte opCode, byte[] payload);\n        public event ReceivedEventHandler Received;\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/MyConnection.cs",
    "content": "﻿using System;\nusing System.Buffers;\nusing System.IO.Pipelines;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace PipelineSockets\n{\n    class MyConnection\n    {\n        private readonly MyServer _server;\n        private readonly IDuplexPipe _pipe;\n        private readonly CancellationTokenSource _cts;\n        private readonly Task _readLoop;\n\n        public int Id { get; private set; }\n\n        public MyConnection(MyServer server, IDuplexPipe pipe)\n        {\n            _server = server;\n            _pipe = pipe;\n\n            _cts = new CancellationTokenSource();\n            _readLoop = ReadLoop(_cts.Token);\n        }\n\n        private async Task ReadLoop(CancellationToken ct)\n        {\n            while (!ct.IsCancellationRequested)\n            {\n                var i = _pipe.Input;\n                var result = await i.ReadAsync(ct);\n                var pos = ReadMessage(result);\n                i.AdvanceTo(pos);\n            }\n        }\n\n        private SequencePosition ReadMessage(ReadResult readResult)\n        {\n            var reader = new BufferReader<byte>(readResult.Buffer);\n\n            reader.Read(out byte opCode);\n            reader.Read(out int len);\n            var payload = new byte[len];\n            reader.CoptyTo(payload);\n            _server.OnReceived(this, opCode, payload);\n\n            return reader.Position;\n        }\n\n        public async ValueTask SendAsync(byte opCode, byte[] payload)\n        {\n            var o = _pipe.Output;\n            o.Write(opCode);\n            o.Write(payload.Length);\n            o.Write(payload);\n            await o.FlushAsync(_cts.Token);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/MyServer.cs",
    "content": "﻿using System.Collections.Concurrent;\nusing System.IO.Pipelines;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing Pipelines.Sockets.Unofficial;\n\nnamespace PipelineSockets\n{\n    class MyServer : SocketServer\n    {\n        private CancellationTokenSource _cts = new CancellationTokenSource();\n        private int _id;\n\n        public delegate void ReceivedEventHandler(MyConnection sender, byte opCode, byte[] payload);\n        public event ReceivedEventHandler Received;\n        private readonly ConcurrentDictionary<int, MyConnection> _connections = new ConcurrentDictionary<int, MyConnection>();\n\n        internal void OnReceived(MyConnection sender, byte opCode, byte[] payload) => Received?.Invoke(sender, opCode, payload);\n\n        protected override Task OnClientConnectedAsync(in ClientConnection client)\n        {\n            var id = Interlocked.Increment(ref _id);\n            var transport = client.Transport;\n\n            return RunAsync(id, transport);\n        }\n\n        private async Task RunAsync(int id, IDuplexPipe transport)\n        {\n            var o = transport.Output;\n            o.Write(id);\n            await o.FlushAsync();\n            \n            var c = new MyConnection(this, transport);\n            _connections[id] = c;\n\n            // Server からの kick とか Client からの切断機能持たせる？\n            await _cts.Token;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/PipelineSockets.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <LangVersion>latest</LangVersion>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Pipelines.Sockets.Unofficial\" Version=\"1.0.0\" />\n    <PackageReference Include=\"System.IO.Pipelines\" Version=\"4.5.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/Program.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Net;\nusing System.Threading.Tasks;\n\nnamespace PipelineSockets\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            const int NumClients = 1;\n\n            const int Port = 16738;\n            var endPoint = new IPEndPoint(IPAddress.Loopback, Port);\n\n            var s = new MyServer();\n            s.Listen(endPoint);\n\n            s.Received += S_Received;\n\n            async Task runClient()\n            {\n                var c = await MyClient.CreateAsync(endPoint);\n\n                c.Received += C_Received;\n\n                for (int i = 0; i < 10; i++)\n                {\n                    await Task.Delay(10);\n                    await c.SendAsync((byte)i, new byte[i]);\n                }\n            }\n\n            Task.WhenAll(Enumerable.Range(0, NumClients).Select(_ => runClient()));\n\n            Console.ReadLine();\n        }\n\n        private static void C_Received(MyClient sender, byte opCode, byte[] payload)\n        {\n            Console.WriteLine($\"client {sender.Id} {opCode}, {string.Join(\"\", payload.Select(b => b.ToString(\"X2\")))}\");\n        }\n\n        private static void S_Received(MyConnection sender, byte opCode, byte[] payload)\n        {\n            Console.WriteLine($\"server {sender.Id} {opCode}, {string.Join(\"\", payload.Select(b => b.ToString(\"X2\")))}\");\n\n            // とりあえずおうむ返し\n            sender.SendAsync(opCode, payload);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/Ref/BufferReader.cs",
    "content": "﻿// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n// See the LICENSE file in the project root for more information.\n\nusing System.Runtime.CompilerServices;\n\nnamespace System.Buffers\n{\n    public ref partial struct BufferReader<T> where T : unmanaged, IEquatable<T>\n    {\n        private SequencePosition _currentPosition;\n        private SequencePosition _nextPosition;\n        private bool _moreData;\n\n        /// <summary>\n        /// Create a <see cref=\"BufferReader\" over the given <see cref=\"ReadOnlySequence{T}\"/>./>\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public BufferReader(in ReadOnlySequence<T> buffer)\n        {\n            CurrentSpanIndex = 0;\n            Consumed = 0;\n            Sequence = buffer;\n            _currentPosition = Sequence.Start;\n            _nextPosition = _currentPosition;\n\n            if (buffer.TryGet(ref _nextPosition, out ReadOnlyMemory<T> memory, advance: true))\n            {\n                _moreData = true;\n                CurrentSpan = memory.Span;\n                if (CurrentSpan.Length == 0)\n                {\n                    // No space in the first span, move to one with space\n                    GetNextSpan();\n                }\n            }\n            else\n            {\n                // No space in any spans and at end of sequence\n                _moreData = false;\n                CurrentSpan = default;\n            }\n        }\n\n        /// <summary>\n        /// True when there is no more data in the <see cref=\"Sequence\"/>.\n        /// </summary>\n        public bool End => !_moreData;\n\n        /// <summary>\n        /// The underlying <see cref=\"ReadOnlySequence{T}\"/> for the reader.\n        /// </summary>\n        public ReadOnlySequence<T> Sequence { get; }\n\n        /// <summary>\n        /// The current position in the <see cref=\"Sequence\"/>.\n        /// </summary>\n        public SequencePosition Position => Sequence.GetPosition(CurrentSpanIndex, _currentPosition);\n\n        /// <summary>\n        /// The current segment in the <see cref=\"Sequence\"/>.\n        /// </summary>\n        public ReadOnlySpan<T> CurrentSpan { get; private set; }\n\n        /// <summary>\n        /// The index in the <see cref=\"CurrentSpan\"/>.\n        /// </summary>\n        public int CurrentSpanIndex { get; private set; }\n\n        /// <summary>\n        /// The unread portion of the <see cref=\"CurrentSpan\"/>.\n        /// </summary>\n        public ReadOnlySpan<T> UnreadSpan\n        {\n            [MethodImpl(MethodImplOptions.AggressiveInlining)]\n            get => CurrentSpan.Slice(CurrentSpanIndex);\n        }\n\n        /// <summary>\n        /// The total number of {T}s processed by the reader.\n        /// </summary>\n        public long Consumed { get; private set; }\n\n        /// <summary>\n        /// Peeks at the next value without advancing the reader.\n        /// </summary>\n        /// <param name=\"value\">The next value or default if at the end.</param>\n        /// <returns>False if at the end of the reader.</returns>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public bool TryPeek(out T value)\n        {\n            if (_moreData)\n            {\n                value = CurrentSpan[CurrentSpanIndex];\n                return true;\n            }\n            else\n            {\n                value = default;\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Read the next value and advance the reader.\n        /// </summary>\n        /// <param name=\"value\">The next value or default if at the end.</param>\n        /// <returns>False if at the end of the reader.</returns>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public bool TryRead(out T value)\n        {\n            if (End)\n            {\n                value = default;\n                return false;\n            }\n\n            value = CurrentSpan[CurrentSpanIndex];\n            CurrentSpanIndex++;\n            Consumed++;\n\n            if (CurrentSpanIndex >= CurrentSpan.Length)\n            {\n                GetNextSpan();\n            }\n\n            return true;\n        }\n\n        /// <summary>\n        /// Get the next segment with available space, if any.\n        /// </summary>\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        private void GetNextSpan()\n        {\n            if (!Sequence.IsSingleSegment)\n            {\n                SequencePosition previousNextPosition = _nextPosition;\n                while (Sequence.TryGet(ref _nextPosition, out ReadOnlyMemory<T> memory, advance: true))\n                {\n                    _currentPosition = previousNextPosition;\n                    CurrentSpan = memory.Span;\n                    CurrentSpanIndex = 0;\n                    if (CurrentSpan.Length > 0)\n                    {\n                        return;\n                    }\n                }\n            }\n            _moreData = false;\n        }\n\n        /// <summary>\n        /// Move the reader ahead the specified number of positions.\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public void Advance(int count)\n        {\n            if (count < 0)\n            {\n                ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.length);\n            }\n\n            Consumed += count;\n\n            if (CurrentSpanIndex < CurrentSpan.Length - count)\n            {\n                CurrentSpanIndex += count;\n            }\n            else\n            {\n                // Current segment doesn't have enough space, scan forward through segments\n                AdvanceToNextSpan(count);\n            }\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        private void AdvanceToNextSpan(int count)\n        {\n            while (!End && count > 0)\n            {\n                if (CurrentSpanIndex < CurrentSpan.Length - count)\n                {\n                    CurrentSpanIndex += count;\n                    count = 0;\n                    break;\n                }\n\n                int remaining = (CurrentSpan.Length - CurrentSpanIndex);\n\n                CurrentSpanIndex += remaining;\n                count -= remaining;\n\n                GetNextSpan();\n            }\n\n            if (count != 0)\n            {\n                ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.length);\n            }\n        }\n\n        /// <summary>\n        /// Peek forward the number of positions specified by <paramref name=\"count\"/>.\n        /// </summary>\n        /// <returns>Span over the peeked data.</returns>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public ReadOnlySpan<T> Peek(int count)\n        {\n            ReadOnlySpan<T> firstSpan = UnreadSpan;\n            if (firstSpan.Length >= count)\n            {\n                return firstSpan.Slice(0, count);\n            }\n\n            // Not enough contiguous Ts, allocate and copy what we can get\n            return PeekSlow(new T[count]);\n        }\n\n        /// <summary>\n        /// Peek forward the number of positions in <paramref name=\"copyBuffer\"/>, copying into\n        /// <paramref name=\"copyBuffer\"/> if needed.\n        /// </summary>\n        /// <param name=\"copyBuffer\">\n        /// Temporary buffer to copy into if there isn't a contiguous span within the existing data to return.\n        /// Also describes the count of positions to peek.\n        /// </param>\n        /// <returns>Span over the peeked data.</returns>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public ReadOnlySpan<T> Peek(Span<T> copyBuffer)\n        {\n            ReadOnlySpan<T> firstSpan = UnreadSpan;\n            if (firstSpan.Length >= copyBuffer.Length)\n            {\n                return firstSpan.Slice(0, copyBuffer.Length);\n            }\n\n            return PeekSlow(copyBuffer);\n        }\n\n        internal ReadOnlySpan<T> PeekSlow(Span<T> destination)\n        {\n            ReadOnlySpan<T> firstSpan = UnreadSpan;\n            firstSpan.CopyTo(destination);\n            int copied = firstSpan.Length;\n\n            SequencePosition next = _nextPosition;\n            while (Sequence.TryGet(ref next, out ReadOnlyMemory<T> nextSegment, true))\n            {\n                ReadOnlySpan<T> nextSpan = nextSegment.Span;\n                if (nextSpan.Length > 0)\n                {\n                    int toCopy = Math.Min(nextSpan.Length, destination.Length - copied);\n                    nextSpan.Slice(0, toCopy).CopyTo(destination.Slice(copied));\n                    copied += toCopy;\n                    if (copied >= destination.Length)\n                        break;\n                }\n            }\n\n            return destination.Slice(0, copied);\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public int CoptyTo(Span<T> destination)\n        {\n            ReadOnlySpan<T> firstSpan = UnreadSpan;\n            if (firstSpan.Length >= destination.Length)\n            {\n                firstSpan.Slice(0, destination.Length).CopyTo(destination);\n                Advance(destination.Length);\n                return destination.Length;\n            }\n\n            var x = PeekSlow(destination);\n            Advance(x.Length);\n            return x.Length;\n        }\n    }\n}"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets/Ref/ThrowHelper.cs",
    "content": "﻿// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under the MIT license.\n// See the LICENSE file in the project root for more information.\n\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\n\nnamespace System.Buffers\n{\n    internal class ThrowHelper\n    {\n        public static void ThrowArgumentOutOfRangeException(ExceptionArgument argument)\n        {\n            throw GetArgumentOutOfRangeException(argument);\n        }\n\n        [MethodImpl(MethodImplOptions.NoInlining)]\n        private static ArgumentOutOfRangeException GetArgumentOutOfRangeException(ExceptionArgument argument)\n        {\n            return new ArgumentOutOfRangeException(GetArgumentName(argument));\n        }\n\n        private static string GetArgumentName(ExceptionArgument argument)\n        {\n            Debug.Assert(Enum.IsDefined(typeof(ExceptionArgument), argument),\n                \"The enum value is not defined, please check the ExceptionArgument Enum.\");\n\n            return argument.ToString();\n        }\n    }\n\n    internal enum ExceptionArgument\n    {\n\n        length,\n\n    }\n}"
  },
  {
    "path": "Demo/2018/PipelineSockets/PipelineSockets.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28010.2026\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"PipelineSockets\", \"PipelineSockets\\PipelineSockets.csproj\", \"{E3BF4C07-B97F-48F1-80AE-C7CACE84AB44}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{E3BF4C07-B97F-48F1-80AE-C7CACE84AB44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E3BF4C07-B97F-48F1-80AE-C7CACE84AB44}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E3BF4C07-B97F-48F1-80AE-C7CACE84AB44}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E3BF4C07-B97F-48F1-80AE-C7CACE84AB44}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {E50E00A0-84CE-4444-9C2B-1B1BE135C73D}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/MatrixBenchmark/ByRef.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ByRef\n{\n    public struct Matrix\n    {\n        public float M11;\n        public float M21;\n        public float M31;\n        public float M41;\n        public float M12;\n        public float M22;\n        public float M32;\n        public float M42;\n        public float M13;\n        public float M23;\n        public float M33;\n        public float M43;\n        public float M14;\n        public float M24;\n        public float M34;\n        public float M44;\n\n        public Matrix(float m11, float m21, float m31, float m41, float m12, float m22, float m32, float m42, float m13, float m23, float m33, float m43, float m14, float m24, float m34, float m44)\n        {\n            M11 = m11;\n            M21 = m21;\n            M31 = m31;\n            M41 = m41;\n            M12 = m12;\n            M22 = m22;\n            M32 = m32;\n            M42 = m42;\n            M13 = m13;\n            M23 = m23;\n            M33 = m33;\n            M43 = m43;\n            M14 = m14;\n            M24 = m24;\n            M34 = m34;\n            M44 = m44;\n        }\n\n        public static Matrix operator +(in Matrix a, in Matrix b)\n            => new Matrix(\n                a.M11 + b.M11,\n                a.M21 + b.M21,\n                a.M31 + b.M31,\n                a.M41 + b.M41,\n                a.M12 + b.M12,\n                a.M22 + b.M22,\n                a.M32 + b.M32,\n                a.M42 + b.M42,\n                a.M13 + b.M13,\n                a.M23 + b.M23,\n                a.M33 + b.M33,\n                a.M43 + b.M43,\n                a.M14 + b.M14,\n                a.M24 + b.M24,\n                a.M34 + b.M34,\n                a.M44 + b.M44);\n\n        public static Matrix operator *(in Matrix a, in Matrix b)\n        {\n            float m11 = a.M11 * b.M11 + a.M21 * b.M12 + a.M31 * b.M13 + a.M41 * b.M14;\n            float m21 = a.M11 * b.M21 + a.M21 * b.M22 + a.M31 * b.M23 + a.M41 * b.M24;\n            float m31 = a.M11 * b.M31 + a.M21 * b.M32 + a.M31 * b.M33 + a.M41 * b.M34;\n            float m41 = a.M11 * b.M41 + a.M21 * b.M42 + a.M31 * b.M43 + a.M41 * b.M44;\n            float m12 = a.M12 * b.M11 + a.M22 * b.M12 + a.M32 * b.M13 + a.M42 * b.M14;\n            float m22 = a.M12 * b.M21 + a.M22 * b.M22 + a.M32 * b.M23 + a.M42 * b.M24;\n            float m32 = a.M12 * b.M31 + a.M22 * b.M32 + a.M32 * b.M33 + a.M42 * b.M34;\n            float m42 = a.M12 * b.M41 + a.M22 * b.M42 + a.M32 * b.M43 + a.M42 * b.M44;\n            float m13 = a.M13 * b.M11 + a.M23 * b.M12 + a.M33 * b.M13 + a.M43 * b.M14;\n            float m23 = a.M13 * b.M21 + a.M23 * b.M22 + a.M33 * b.M23 + a.M43 * b.M24;\n            float m33 = a.M13 * b.M31 + a.M23 * b.M32 + a.M33 * b.M33 + a.M43 * b.M34;\n            float m43 = a.M13 * b.M41 + a.M23 * b.M42 + a.M33 * b.M43 + a.M43 * b.M44;\n            float m14 = a.M14 * b.M11 + a.M24 * b.M12 + a.M34 * b.M13 + a.M44 * b.M14;\n            float m24 = a.M14 * b.M21 + a.M24 * b.M22 + a.M34 * b.M23 + a.M44 * b.M24;\n            float m34 = a.M14 * b.M31 + a.M24 * b.M32 + a.M34 * b.M33 + a.M44 * b.M34;\n            float m44 = a.M14 * b.M41 + a.M24 * b.M42 + a.M34 * b.M43 + a.M44 * b.M44;\n\n            return new Matrix(\n                m11, m21, m31, m41,\n                m12, m22, m32, m42,\n                m13, m23, m33, m43,\n                m14, m24, m34, m44);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/MatrixBenchmark/ByValue.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace ByValue\n{\n    public struct Matrix\n    {\n        public float M11;\n        public float M21;\n        public float M31;\n        public float M41;\n        public float M12;\n        public float M22;\n        public float M32;\n        public float M42;\n        public float M13;\n        public float M23;\n        public float M33;\n        public float M43;\n        public float M14;\n        public float M24;\n        public float M34;\n        public float M44;\n\n        public Matrix(float m11, float m21, float m31, float m41, float m12, float m22, float m32, float m42, float m13, float m23, float m33, float m43, float m14, float m24, float m34, float m44)\n        {\n            M11 = m11;\n            M21 = m21;\n            M31 = m31;\n            M41 = m41;\n            M12 = m12;\n            M22 = m22;\n            M32 = m32;\n            M42 = m42;\n            M13 = m13;\n            M23 = m23;\n            M33 = m33;\n            M43 = m43;\n            M14 = m14;\n            M24 = m24;\n            M34 = m34;\n            M44 = m44;\n        }\n\n        public static Matrix operator +(Matrix a, Matrix b)\n            => new Matrix(\n                a.M11 + b.M11,\n                a.M21 + b.M21,\n                a.M31 + b.M31,\n                a.M41 + b.M41,\n                a.M12 + b.M12,\n                a.M22 + b.M22,\n                a.M32 + b.M32,\n                a.M42 + b.M42,\n                a.M13 + b.M13,\n                a.M23 + b.M23,\n                a.M33 + b.M33,\n                a.M43 + b.M43,\n                a.M14 + b.M14,\n                a.M24 + b.M24,\n                a.M34 + b.M34,\n                a.M44 + b.M44);\n\n        public static Matrix operator *(Matrix a, Matrix b)\n        {\n            float m11 = a.M11 * b.M11 + a.M21 * b.M12 + a.M31 * b.M13 + a.M41 * b.M14;\n            float m21 = a.M11 * b.M21 + a.M21 * b.M22 + a.M31 * b.M23 + a.M41 * b.M24;\n            float m31 = a.M11 * b.M31 + a.M21 * b.M32 + a.M31 * b.M33 + a.M41 * b.M34;\n            float m41 = a.M11 * b.M41 + a.M21 * b.M42 + a.M31 * b.M43 + a.M41 * b.M44;\n            float m12 = a.M12 * b.M11 + a.M22 * b.M12 + a.M32 * b.M13 + a.M42 * b.M14;\n            float m22 = a.M12 * b.M21 + a.M22 * b.M22 + a.M32 * b.M23 + a.M42 * b.M24;\n            float m32 = a.M12 * b.M31 + a.M22 * b.M32 + a.M32 * b.M33 + a.M42 * b.M34;\n            float m42 = a.M12 * b.M41 + a.M22 * b.M42 + a.M32 * b.M43 + a.M42 * b.M44;\n            float m13 = a.M13 * b.M11 + a.M23 * b.M12 + a.M33 * b.M13 + a.M43 * b.M14;\n            float m23 = a.M13 * b.M21 + a.M23 * b.M22 + a.M33 * b.M23 + a.M43 * b.M24;\n            float m33 = a.M13 * b.M31 + a.M23 * b.M32 + a.M33 * b.M33 + a.M43 * b.M34;\n            float m43 = a.M13 * b.M41 + a.M23 * b.M42 + a.M33 * b.M43 + a.M43 * b.M44;\n            float m14 = a.M14 * b.M11 + a.M24 * b.M12 + a.M34 * b.M13 + a.M44 * b.M14;\n            float m24 = a.M14 * b.M21 + a.M24 * b.M22 + a.M34 * b.M23 + a.M44 * b.M24;\n            float m34 = a.M14 * b.M31 + a.M24 * b.M32 + a.M34 * b.M33 + a.M44 * b.M34;\n            float m44 = a.M14 * b.M41 + a.M24 * b.M42 + a.M34 * b.M43 + a.M44 * b.M44;\n\n            return new Matrix(\n                m11, m21, m31, m41,\n                m12, m22, m32, m42,\n                m13, m23, m33, m43,\n                m14, m24, m34, m44);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/MatrixBenchmark/MatrixBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\n\npublic class MatrixBenchmark\n{\n    const int Loops = 100;\n\n    static readonly float[] _a;\n    static readonly float[] _b;\n    static readonly float[] _id = new float[] { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 };\n\n    static MatrixBenchmark()\n    {\n        var r = new Random(1);\n\n        _a = RandomMatrix(r);\n        _b = RandomMatrix(r);\n    }\n\n    private static float[] RandomMatrix(Random r)\n    {\n        var d = new double[16];\n        for (int i = 0; i < 16; i++)\n        {\n            d[i] = r.NextDouble();\n        }\n\n        for (int i = 0; i < 4; i++)\n        {\n            var len = Math.Sqrt(d[i + 0] * d[i + 0] + d[i + 1] * d[i + 1] + d[i + 2] * d[i + 2] + d[i + 3] * d[i + 3]);\n            d[i + 0] /= len;\n            d[i + 1] /= len;\n            d[i + 2] /= len;\n            d[i + 3] /= len;\n        }\n\n        var a = new float[16];\n        for (int i = 0; i < 16; i++) a[i] = (float)d[i];\n        return a;\n    }\n\n    private static ByValue.Matrix GetByValMatrix(float[] a) => new ByValue.Matrix(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n    private static ByRef.Matrix GetByRefMatrix(float[] a) => new ByRef.Matrix(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n    private static Simd.Matrix GetSimdMatrix(float[] a) => new Simd.Matrix(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]);\n\n    [Benchmark]\n    public ByValue.Matrix ByValue()\n    {\n        var a = GetByValMatrix(_a);\n        var b = GetByValMatrix(_b);\n        var m = GetByValMatrix(_id);\n        for (int i = 1; i < Loops; i++) m = a * m + b;\n        return m;\n    }\n\n    [Benchmark]\n    public ByRef.Matrix ByRef()\n    {\n        var a = GetByRefMatrix(_a);\n        var b = GetByRefMatrix(_b);\n        var m = GetByRefMatrix(_id);\n        for (int i = 1; i < Loops; i++) m = a * m + b;\n        return m;\n    }\n\n    [Benchmark]\n    public Simd.Matrix Simd()\n    {\n        var a = GetSimdMatrix(_a);\n        var b = GetSimdMatrix(_b);\n        var m = GetSimdMatrix(_id);\n        for (int i = 1; i < Loops; i++) m = a * m + b;\n        return m;\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/MatrixBenchmark/MatrixBenchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <LangVersion>latest</LangVersion>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.12\" />\n    <PackageReference Include=\"System.Numerics.Vectors\" Version=\"4.4.0\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n    <None Remove=\"BenchmarkDotNet.Artifacts/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/MatrixBenchmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\nusing System.Runtime.Intrinsics.X86;\n\nclass Program\n{\n    static void Main()\n    {\n        System.Console.WriteLine(Sse.IsSupported);\n\n        var b = new MatrixBenchmark();\n        var x = b.ByValue();\n        var y = b.ByRef();\n        var z = b.Simd();\n\n        unsafe\n        {\n            var px = (float*)&x;\n            var py = (float*)&y;\n            var pz = (float*)&z;\n\n            for (int i = 0; i < 16; i++)\n            {\n                System.Console.WriteLine((px[i] - py[i], px[i] - pz[i], px[i], py[i], pz[i]));\n            }\n        }\n\n        BenchmarkRunner.Run<MatrixBenchmark>();\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/MatrixBenchmark/Simd.cs",
    "content": "﻿using System.Numerics;\nusing System.Runtime.Intrinsics;\nusing System.Runtime.Intrinsics.X86;\n\nnamespace Simd\n{\n    public struct Matrix\n    {\n        public float M11;\n        public float M21;\n        public float M31;\n        public float M41;\n        public float M12;\n        public float M22;\n        public float M32;\n        public float M42;\n        public float M13;\n        public float M23;\n        public float M33;\n        public float M43;\n        public float M14;\n        public float M24;\n        public float M34;\n        public float M44;\n\n        public Matrix(float m11, float m21, float m31, float m41, float m12, float m22, float m32, float m42, float m13, float m23, float m33, float m43, float m14, float m24, float m34, float m44)\n        {\n            M11 = m11;\n            M21 = m21;\n            M31 = m31;\n            M41 = m41;\n            M12 = m12;\n            M22 = m22;\n            M32 = m32;\n            M42 = m42;\n            M13 = m13;\n            M23 = m23;\n            M33 = m33;\n            M43 = m43;\n            M14 = m14;\n            M24 = m24;\n            M34 = m34;\n            M44 = m44;\n        }\n\n        private unsafe struct RowView\n        {\n            private float* _p;\n            public RowView(float* p) => _p = p;\n            public RowView(Matrix* p) => _p = (float*)p;\n\n            public Vector128<float> this[int index]\n            {\n                get => Sse.LoadVector128(_p + (index << 2));\n                set => Sse.Store(_p + (index << 2), value);\n            }\n        }\n\n        public static Matrix operator +(in Matrix a, in Matrix b)\n        {\n            if (Sse.IsSupported)\n            {\n                return SseAdd(a, b);\n            }\n            else\n            {\n                return Add(a, b);\n            }\n        }\n\n        private unsafe static Matrix SseAdd(in Matrix a, in Matrix b)\n        {\n            fixed (float* pa = &a.M11)\n            fixed (float* pb = &b.M11)\n            {\n                var c = default(Matrix);\n                var pc = (float*)&c;\n                Sse.Store(pc, Sse.Add(Sse.LoadVector128(pa), Sse.LoadVector128(pb)));\n                Sse.Store(pc + 4, Sse.Add(Sse.LoadVector128(pa + 4), Sse.LoadVector128(pb + 4)));\n                Sse.Store(pc + 8, Sse.Add(Sse.LoadVector128(pa + 8), Sse.LoadVector128(pb + 8)));\n                Sse.Store(pc + 12, Sse.Add(Sse.LoadVector128(pa + 12), Sse.LoadVector128(pb + 12)));\n                return c;\n            }\n        }\n\n        private static Matrix Add(in Matrix a, in Matrix b)\n            => new Matrix(\n                a.M11 + b.M11,\n                a.M21 + b.M21,\n                a.M31 + b.M31,\n                a.M41 + b.M41,\n                a.M12 + b.M12,\n                a.M22 + b.M22,\n                a.M32 + b.M32,\n                a.M42 + b.M42,\n                a.M13 + b.M13,\n                a.M23 + b.M23,\n                a.M33 + b.M33,\n                a.M43 + b.M43,\n                a.M14 + b.M14,\n                a.M24 + b.M24,\n                a.M34 + b.M34,\n                a.M44 + b.M44);\n\n        // linear combination:\n        // a[0] * B.row[0] + a[1] * B.row[1] + a[2] * B.row[2] + a[3] * B.row[3]\n        private unsafe static Vector128<float> LinearCombination(in Vector128<float> a, float* pb)\n        {\n            Vector128<float> result;\n            result = Sse.Multiply(Sse.Shuffle(a, a, 0x00), Sse.LoadVector128(pb));\n            result = Sse.Add(result, Sse.Multiply(Sse.Shuffle(a, a, 0x55), Sse.LoadVector128(pb + 4)));\n            result = Sse.Add(result, Sse.Multiply(Sse.Shuffle(a, a, 0xaa), Sse.LoadVector128(pb + 8)));\n            result = Sse.Add(result, Sse.Multiply(Sse.Shuffle(a, a, 0xff), Sse.LoadVector128(pb + 12)));\n            return result;\n        }\n\n        public static Matrix operator *(in Matrix a, in Matrix b)\n        {\n            if (Sse.IsSupported)\n            {\n                return SseMultiply(a, b);\n            }\n            else\n            {\n                return Multiply(a, b);\n            }\n        }\n\n        private unsafe static Matrix SseMultiply(in Matrix a, in Matrix b)\n        {\n            fixed (float* pa = &a.M11)\n            fixed (float* pb = &b.M11)\n            {\n                var c = default(Matrix);\n                var pc = (float*)&c;\n\n                Sse.Store(pc, LinearCombination(Sse.LoadVector128(pa), pb));\n                Sse.Store(pc + 4, LinearCombination(Sse.LoadVector128(pa + 4), pb));\n                Sse.Store(pc + 8, LinearCombination(Sse.LoadVector128(pa + 8), pb));\n                Sse.Store(pc + 12, LinearCombination(Sse.LoadVector128(pa + 12), pb));\n\n                return c;\n            }\n        }\n\n        private static Matrix Multiply(in Matrix a, in Matrix b)\n        {\n            float m11 = a.M11 * b.M11 + a.M21 * b.M12 + a.M31 * b.M13 + a.M41 * b.M14;\n            float m21 = a.M11 * b.M21 + a.M21 * b.M22 + a.M31 * b.M23 + a.M41 * b.M24;\n            float m31 = a.M11 * b.M31 + a.M21 * b.M32 + a.M31 * b.M33 + a.M41 * b.M34;\n            float m41 = a.M11 * b.M41 + a.M21 * b.M42 + a.M31 * b.M43 + a.M41 * b.M44;\n            float m12 = a.M12 * b.M11 + a.M22 * b.M12 + a.M32 * b.M13 + a.M42 * b.M14;\n            float m22 = a.M12 * b.M21 + a.M22 * b.M22 + a.M32 * b.M23 + a.M42 * b.M24;\n            float m32 = a.M12 * b.M31 + a.M22 * b.M32 + a.M32 * b.M33 + a.M42 * b.M34;\n            float m42 = a.M12 * b.M41 + a.M22 * b.M42 + a.M32 * b.M43 + a.M42 * b.M44;\n            float m13 = a.M13 * b.M11 + a.M23 * b.M12 + a.M33 * b.M13 + a.M43 * b.M14;\n            float m23 = a.M13 * b.M21 + a.M23 * b.M22 + a.M33 * b.M23 + a.M43 * b.M24;\n            float m33 = a.M13 * b.M31 + a.M23 * b.M32 + a.M33 * b.M33 + a.M43 * b.M34;\n            float m43 = a.M13 * b.M41 + a.M23 * b.M42 + a.M33 * b.M43 + a.M43 * b.M44;\n            float m14 = a.M14 * b.M11 + a.M24 * b.M12 + a.M34 * b.M13 + a.M44 * b.M14;\n            float m24 = a.M14 * b.M21 + a.M24 * b.M22 + a.M34 * b.M23 + a.M44 * b.M24;\n            float m34 = a.M14 * b.M31 + a.M24 * b.M32 + a.M34 * b.M33 + a.M44 * b.M34;\n            float m44 = a.M14 * b.M41 + a.M24 * b.M42 + a.M34 * b.M43 + a.M44 * b.M44;\n\n            return new Matrix(\n                m11, m21, m31, m41,\n                m12, m22, m32, m42,\n                m13, m23, m33, m43,\n                m14, m24, m34, m44);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/SpanPerformance.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27130.2027\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"StringManipulation\", \"StringManipulation\\StringManipulation.csproj\", \"{87DC6DFB-7D38-4AF5-8190-711B33E74773}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"StringManipulation.Test\", \"StringManipulation.Test\\StringManipulation.Test.csproj\", \"{04B55175-BD72-404D-B242-203C45E3CCFE}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"StringManipulation.Benchmark\", \"StringManipulation.Benchmark\\StringManipulation.Benchmark.csproj\", \"{C4EFABB1-11F0-4E8F-AE7B-E1824C7EB620}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SubstringBenchmark\", \"SubstringBenchmark\\SubstringBenchmark.csproj\", \"{52D85A1F-017B-4CEC-A1D4-7DC9F81A78F4}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MatrixBenchmark\", \"MatrixBenchmark\\MatrixBenchmark.csproj\", \"{9E8FD89F-5A33-45D9-ACD2-E9342F33D598}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{87DC6DFB-7D38-4AF5-8190-711B33E74773}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{87DC6DFB-7D38-4AF5-8190-711B33E74773}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{87DC6DFB-7D38-4AF5-8190-711B33E74773}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{87DC6DFB-7D38-4AF5-8190-711B33E74773}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{04B55175-BD72-404D-B242-203C45E3CCFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{04B55175-BD72-404D-B242-203C45E3CCFE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{04B55175-BD72-404D-B242-203C45E3CCFE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{04B55175-BD72-404D-B242-203C45E3CCFE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C4EFABB1-11F0-4E8F-AE7B-E1824C7EB620}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C4EFABB1-11F0-4E8F-AE7B-E1824C7EB620}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C4EFABB1-11F0-4E8F-AE7B-E1824C7EB620}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C4EFABB1-11F0-4E8F-AE7B-E1824C7EB620}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{52D85A1F-017B-4CEC-A1D4-7DC9F81A78F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{52D85A1F-017B-4CEC-A1D4-7DC9F81A78F4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{52D85A1F-017B-4CEC-A1D4-7DC9F81A78F4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{52D85A1F-017B-4CEC-A1D4-7DC9F81A78F4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{9E8FD89F-5A33-45D9-ACD2-E9342F33D598}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9E8FD89F-5A33-45D9-ACD2-E9342F33D598}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9E8FD89F-5A33-45D9-ACD2-E9342F33D598}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9E8FD89F-5A33-45D9-ACD2-E9342F33D598}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {AA476D1C-7E6F-4899-AA16-9586CCA82A6E}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/Classic/StringExtensions.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\n\nnamespace StringManipulation.Classic\n{\n    /// <summary>\n    /// 古き良き実装。\n    /// コードは割とシンプルだけど遅い。\n    /// <see cref=\"string.Substring(int)\"/>とか<see cref=\"string.Split(char[])\"/>とか<see cref=\"string.Join(char, string[])\"/>とかが一時オブジェクトをヒープ確保しまくり。\n    /// </summary>\n    public static class StringExtensions\n    {\n        /// <summary>\n        /// 先頭文字を大文字にする。\n        /// </summary>\n        public static string ToInitialUpper(this string s)\n        {\n            if (s == null) return null;\n            if (string.IsNullOrEmpty(s)) return string.Empty;\n\n            return char.ToUpper(s[0]) + s.Substring(1);\n        }\n\n        /// <summary>\n        /// 先頭文字を小文字にする。\n        /// </summary>\n        public static string ToInitialLower(this string s)\n        {\n            if (s == null) return null;\n            if (string.IsNullOrEmpty(s)) return string.Empty;\n\n            return char.ToLower(s[0]) + s.Substring(1);\n        }\n\n        /// <summary>\n        /// snake_case_string を CamelCaseString にする。\n        /// </summary>\n        public static string SnakeToCamel(this string snake) => string.Join(\"\", snake.Split('_').Select(s => s.ToInitialUpper()));\n\n        /// <summary>\n        /// CamelCaseString を snake_case_string に変換する。\n        /// </summary>\n        public static string CamelToSnake(this string camel) => string.Join(\"_\", SplitByCase(camel).Select(x => x.ToInitialLower()));\n\n        /// <summary>\n        /// CamelCaseString を単語に分割。\n        /// </summary>\n        public static IEnumerable<string> SplitByCase(this string camel)\n        {\n            if (camel.Length == 0) yield break;\n\n            var prev = 0;\n            var i = 0;\n            while (true)\n            {\n                prev = i;\n                while (++i < camel.Length && !char.IsUpper(camel[i])) ;\n                yield return camel.Substring(prev, i - prev);\n\n                if (camel.Length == i) yield break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/FullyTuned/StringExtensions.cs",
    "content": "﻿namespace StringManipulation.FullyTuned\n{\n    /// <summary>\n    /// Split → Join な汎用的な書き方にこだわらず、ToCamel, ToSnake 専用に調整したもの。\n    /// </summary>\n    public static class StringExtensions\n    {\n        /// <summary>\n        /// snake_case_string を CamelCaseString にする。\n        /// </summary>\n        public unsafe static string SnakeToCamel(this string snake)\n        {\n            var buf = stackalloc char[snake.Length];\n            var count = 0;\n            var init = true;\n\n            for (int i = 0; i < snake.Length; i++)\n            {\n                var c = snake[i];\n                if (c == '_')\n                {\n                    init = true;\n                    continue;\n                }\n\n                if (init) buf[count++] = char.ToUpper(c);\n                else buf[count++] = c;\n\n                init = false;\n            }\n\n            return new string(buf, 0, count);\n        }\n\n        /// <summary>\n        /// CamelCaseString を snake_case_string に変換する。\n        /// </summary>\n        public unsafe static string CamelToSnake(this string camel)\n        {\n            // 全部大文字の時がワーストケースで、元の長さの2倍。\n            var buf = stackalloc char[camel.Length * 2];\n            var count = 0;\n\n            for (int i = 0; i < camel.Length; i++)\n            {\n                var c = camel[i];\n\n                if (char.IsUpper(c))\n                {\n                    if (i != 0) buf[count++] = '_';\n                    buf[count++] = char.ToLower(c);\n                }\n                else\n                {\n                    buf[count++] = c;\n                }\n            }\n\n            return new string(buf, 0, count);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/SafeStackalloc/IStringFormatter.cs",
    "content": "﻿using System;\n\nnamespace StringManipulation.SafeStackalloc\n{\n    /// <summary>\n    /// <see cref=\"Unsafe.IStringFormatter\"/>\n    /// </summary>\n    public interface IStringFormatter\n    {\n        /// <summary>\n        /// 1ワード書き込み。\n        /// </summary>\n        /// <param name=\"word\">書き込みたい文字列。</param>\n        /// <param name=\"buffer\">書き込み先。書き込んだ分進めた span で上書き。</param>\n        void Write(ReadOnlySpan<char> word, ref Span<char> buffer);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/SafeStackalloc/IStringSplitter.cs",
    "content": "﻿using System;\n\nnamespace StringManipulation.SafeStackalloc\n{\n    /// <summary>\n    /// <see cref=\"Unsafe.IStringSplitter\"/>\n    /// </summary>\n    public interface IStringSplitter\n    {\n        /// <summary>\n        /// 1ワード切り出し。\n        /// </summary>\n        /// <param name=\"state\">元文字列。切り出した分進めた Span で上書き。</param>\n        /// <param name=\"nextWord\">切り出した部分文字列。</param>\n        /// <returns>切り出せたら true。</returns>\n        bool TryMoveNext(ref ReadOnlySpan<char> state, out ReadOnlySpan<char> nextWord);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/SafeStackalloc/Splitter.cs",
    "content": "﻿using System;\n\nnamespace StringManipulation.SafeStackalloc\n{\n    public struct Splitter : IStringSplitter\n    {\n        private readonly char _delimiter;\n        public Splitter(char delimiter) => _delimiter = delimiter;\n\n        public unsafe bool TryMoveNext(ref ReadOnlySpan<char> state, out ReadOnlySpan<char> word)\n        {\n            var p = state;\n\n            if (p.Length == 0)\n            {\n                word = default;\n                return false;\n            }\n\n            var i = 0;\n            while (++i < p.Length && p[i] != _delimiter) ;\n\n            word = p.Slice(0, i);\n            if (i != p.Length) ++i;\n            state = p.Slice(i);\n\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/SafeStackalloc/StringExtensions.cs",
    "content": "﻿using System;\n\nnamespace StringManipulation.SafeStackalloc\n{\n    /// <summary>\n    /// C# 7.2/.NET Core 2.1 以降ならポインターを撤廃できる。\n    /// 内部が unsafe なのはともかく、引数がポインターだと利用側に fixed ステートメントが必要でとてもじゃないけどやってられない。\n    /// </summary>\n    public static class StringExtensions\n    {\n        /// <summary>\n        /// <paramref name=\"s\"/>を<paramref name=\"splitter\"/>で分割して<paramref name=\"formatter\"/>で結合する。\n        /// </summary>\n        /// <param name=\"s\">元の文字列。</param>\n        /// <param name=\"buffer\">書き込み先。</param>\n        /// <param name=\"splitter\">分割用。</param>\n        /// <param name=\"formatter\">結合用。</param>\n        public static void Join<TSplitter, TFormatter>(this string s, ref Span<char> buffer, TSplitter splitter = default, TFormatter formatter = default)\n            where TSplitter : IStringSplitter\n            where TFormatter : IStringFormatter\n        {\n            ReadOnlySpan<char> span = s;\n\n            while (splitter.TryMoveNext(ref span, out var word))\n            {\n                formatter.Write(word, ref buffer);\n            }\n        }\n\n        static int Offset(Span<char> origin, Span<char> target)\n            => (int)System.Runtime.CompilerServices.Unsafe.ByteOffset(\n                ref System.Runtime.InteropServices.MemoryMarshal.GetReference(origin),\n                ref System.Runtime.InteropServices.MemoryMarshal.GetReference(target))\n            / sizeof(char);\n\n        /// <summary>\n        /// snake_case_string を CamelCaseString にする。\n        /// </summary>\n        public static string SnakeToCamel(this string snake)\n        {\n            Span<char> p = stackalloc char[snake.Length];\n            var buffer = p;\n\n            Join(snake, ref buffer, new Splitter('_'), new ToCamel());\n\n            return new string(p.Slice(0, Offset(p, buffer)));\n        }\n\n        /// <summary>\n        /// CamelCaseString を snake_case_string に変換する。\n        /// </summary>\n        public static string CamelToSnake(this string camel)\n        {\n            // 全部大文字の時がワーストケースで、元の長さの2倍。\n            Span<char> p = stackalloc char[camel.Length * 2];\n            var buffer = p;\n\n            Join(camel, ref buffer, new UpperCaseSplitter(), default(ToSnake));\n\n            return new string(p.Slice(0, Offset(p, buffer)));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/SafeStackalloc/ToCamel.cs",
    "content": "﻿using System;\n\nnamespace StringManipulation.SafeStackalloc\n{\n    /// <summary>\n    /// <see cref=\"Unsafe.ToCamel\"/>\n    /// </summary>\n    public struct ToCamel : IStringFormatter\n    {\n        public unsafe void Write(ReadOnlySpan<char> word, ref Span<char> buffer)\n        {\n            buffer[0] = char.ToUpper(word[0]);\n            word.Slice(1).CopyTo(buffer.Slice(1));\n            buffer = buffer.Slice(word.Length);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/SafeStackalloc/ToSnake.cs",
    "content": "﻿using System;\n\nnamespace StringManipulation.SafeStackalloc\n{\n    /// <summary>\n    /// <see cref=\"Unsafe.ToSnake\"/>\n    /// </summary>\n    public struct ToSnake : IStringFormatter\n    {\n        bool _nonFirst;\n        public unsafe void Write(ReadOnlySpan<char> word, ref Span<char> buffer)\n        {\n            if (_nonFirst)\n            {\n                buffer[0] = '_';\n                buffer = buffer.Slice(1);\n            }\n            else _nonFirst = true;\n\n            buffer[0] = char.ToLower(word[0]);\n            word.Slice(1).CopyTo(buffer.Slice(1));\n            buffer = buffer.Slice(word.Length);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/SafeStackalloc/UpperCaseSplitter.cs",
    "content": "﻿using System;\n\nnamespace StringManipulation.SafeStackalloc\n{\n    /// <summary>\n    /// 文字列を大文字になっている個所で文字列を分割。\n    /// </summary>\n    public struct UpperCaseSplitter : IStringSplitter\n    {\n        public unsafe bool TryMoveNext(ref ReadOnlySpan<char> state, out ReadOnlySpan<char> word)\n        {\n            var p = state;\n\n            if (p.Length == 0)\n            {\n                word = default;\n                return false;\n            }\n\n            var i = 0;\n            while (++i < p.Length && !char.IsUpper(p[i])) ;\n\n            word = p.Slice(0, i);\n            state = p.Slice(i);\n\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/StringManipulation.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <LangVersion>latest</LangVersion>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Memory\" Version=\"4.5.0-preview2-26202-05\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/Unsafe/IStringFormatter.cs",
    "content": "﻿namespace StringManipulation.Unsafe\n{\n    /// <summary>\n    /// <see cref=\"IStringSplitter\"/>の逆。\n    /// 1つの Span に対して文字列を書き込んでいく。\n    /// </summary>\n    public interface IStringFormatter\n    {\n        /// <summary>\n        /// 1ワード書き込み。\n        /// </summary>\n        /// <param name=\"word\">書き込みたい文字列。</param>\n        /// <param name=\"buffer\">書き込み先。書き込んだ分進めた span で上書き。</param>\n        void Write(StringSpan word, ref StringSpan buffer);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/Unsafe/IStringSplitter.cs",
    "content": "﻿namespace StringManipulation.Unsafe\n{\n    /// <summary>\n    /// <see cref=\"string.Split(char[])\"/>みたいに、文字列を分割して文字列の配列を作る処理を no allocation で行うためのインターフェイス。\n    /// </summary>\n    /// <remarks>\n    /// ref struct は直接インターフェイスを実装できないのでちょっと回りくどい手段が必要。\n    ///\n    /// ↓みたいに内部に Span を持ってしまうとインターフェイスを実装できなくなるので、ref 引数で Span を渡してもらう。\n    /// <code><![CDATA[\n    /// ref struct Splitter\n    /// {\n    ///     StringSpan _s;\n    /// }\n    /// ]]></code>\n    /// </remarks>\n    public interface IStringSplitter\n    {\n        /// <summary>\n        /// 1ワード切り出し。\n        /// </summary>\n        /// <param name=\"state\">元文字列。切り出した分進めた Span で上書き。</param>\n        /// <param name=\"nextWord\">切り出した部分文字列。</param>\n        /// <returns>切り出せたら true。</returns>\n        bool TryMoveNext(ref StringSpan state, out StringSpan nextWord);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/Unsafe/Splitter.cs",
    "content": "﻿namespace StringManipulation.Unsafe\n{\n    public struct Splitter : IStringSplitter\n    {\n        private readonly char _delimiter;\n        public Splitter(char delimiter) => _delimiter = delimiter;\n\n        public unsafe bool TryMoveNext(ref StringSpan state, out StringSpan word)\n        {\n            var p = state.Pointer;\n            var end = p + state.Length;\n\n            if (p >= end)\n            {\n                word = default;\n                return false;\n            }\n\n            while (++p < end && *p != _delimiter) ;\n\n            var len = (int)(p - state.Pointer);\n            word = state.Slice(0, len);\n            if (len != state.Length) ++len;\n            state = state.Slice(len);\n\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/Unsafe/StringExtensions.cs",
    "content": "﻿namespace StringManipulation.Unsafe\n{\n    /// <summary>\n    /// <see cref=\"Classic.StringExtensions\"/>だとヒープ確保しまくりなので、unsafe で最適化。\n    /// </summary>\n    public static class StringExtensions\n    {\n        /// <summary>\n        /// <paramref name=\"s\"/>を<paramref name=\"splitter\"/>で分割して<paramref name=\"formatter\"/>で結合する。\n        /// </summary>\n        /// <param name=\"s\">元の文字列。</param>\n        /// <param name=\"buffer\">書き込み先。</param>\n        /// <param name=\"splitter\">分割用。</param>\n        /// <param name=\"formatter\">結合用。</param>\n        public unsafe static void Join<TSplitter, TFormatter>(this string s, ref StringSpan buffer, TSplitter splitter = default, TFormatter formatter = default)\n            where TSplitter : IStringSplitter\n            where TFormatter : IStringFormatter\n        {\n            fixed (char* p = s)\n            {\n                var span = new StringSpan(p, s.Length);\n                while (splitter.TryMoveNext(ref span, out var word))\n                {\n                    formatter.Write(word, ref buffer);\n                }\n            }\n        }\n\n        /// <summary>\n        /// snake_case_string を CamelCaseString にする。\n        /// </summary>\n        public unsafe static string SnakeToCamel(this string snake)\n        {\n            var p = stackalloc char[snake.Length];\n            var buffer = new StringSpan(p, snake.Length);\n\n            Join(snake, ref buffer, new Splitter('_'), new ToCamel());\n\n            var len = (int)(buffer.Pointer - p);\n            return new string(p, 0, len);\n        }\n\n        /// <summary>\n        /// CamelCaseString を snake_case_string に変換する。\n        /// </summary>\n        public unsafe static string CamelToSnake(this string camel)\n        {\n            // 全部大文字の時がワーストケースで、元の長さの2倍。\n            var p = stackalloc char[camel.Length * 2];\n            var buffer = new StringSpan(p, camel.Length);\n\n            Join(camel, ref buffer, new UpperCaseSplitter(), default(ToSnake));\n\n            var len = (int)(buffer.Pointer - p);\n            return new string(p, 0, len);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/Unsafe/StringSpan.cs",
    "content": "﻿namespace StringManipulation.Unsafe\n{\n    /// <summary>\n    /// 文字列中の一定区間。\n    /// </summary>\n    /// <remarks>\n    /// <see cref=\"System.Span{T}\"/> を持っているわけじゃないので ref struct にしなくてもこの型自体のコンパイルはできるんだけども。\n    /// 用途的には Span と同じで、ref struct にしておかないとほんとに unsafe なので。\n    /// </remarks>\n    public unsafe readonly ref struct StringSpan\n    {\n        /// <summary>\n        /// 元の文字列。\n        /// </summary>\n        public readonly char* Pointer;\n\n        /// <summary>\n        /// 区間の長さ。\n        /// </summary>\n        public readonly int Length;\n\n        public StringSpan(char* p, int length)\n        {\n            Pointer = p;\n            Length = length;\n        }\n\n        // せっかく unsafe なんだし範囲チェックさぼる。\n        public ref char this[int index] => ref Pointer[index];\n\n        public StringSpan Slice(int startIndex) => new StringSpan(Pointer + startIndex, Length - startIndex);\n        public StringSpan Slice(int startIndex, int length) => new StringSpan(Pointer + startIndex, length);\n\n        public override string ToString() =>\n            Pointer == null ? null :\n            Length == 0 ? \"\" : \n            new string (Pointer, 0, Length);\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/Unsafe/ToCamel.cs",
    "content": "﻿using System;\n\nnamespace StringManipulation.Unsafe\n{\n    /// <summary>\n    /// 先頭だけ <see cref=\"char.ToUpper(char)\"/>。\n    /// </summary>\n    public struct ToCamel : IStringFormatter\n    {\n        public unsafe void Write(StringSpan word, ref StringSpan buffer)\n        {\n            *buffer.Pointer = char.ToUpper(*word.Pointer);\n            var size = sizeof(char) * (word.Length - 1);\n            Buffer.MemoryCopy(word.Pointer + 1, buffer.Pointer + 1, size, size);\n            buffer = buffer.Slice(word.Length);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/Unsafe/ToSnake.cs",
    "content": "﻿using System;\n\nnamespace StringManipulation.Unsafe\n{\n    /// <summary>\n    /// 先頭だけ <see cref=\"char.ToLower(char)\"/>。\n    /// 最初の1個以外は先頭に _ を付け加える。\n    /// </summary>\n    public struct ToSnake : IStringFormatter\n    {\n        bool _nonFirst;\n        public unsafe void Write(StringSpan word, ref StringSpan buffer)\n        {\n            var len = word.Length;\n            var buf = buffer.Pointer;\n            if (_nonFirst)\n            {\n                *buf++ = '_';\n                ++len;\n            }\n            else _nonFirst = true;\n\n            var p = word.Pointer;\n            *buf++ = char.ToLower(*p);\n            var size = sizeof(char) * (word.Length - 1);\n            Buffer.MemoryCopy(p + 1, buf, size, size);\n            buffer = buffer.Slice(len);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation/Unsafe/UpperCaseSplitter.cs",
    "content": "﻿namespace StringManipulation.Unsafe\n{\n    /// <summary>\n    /// 文字列を大文字になっている個所で文字列を分割。\n    /// </summary>\n    public struct UpperCaseSplitter : IStringSplitter\n    {\n        public unsafe bool TryMoveNext(ref StringSpan state, out StringSpan word)\n        {\n            var p = state.Pointer;\n            var end = p + state.Length;\n\n            if (p >= end)\n            {\n                word = default;\n                return false;\n            }\n\n            while (++p < end && !char.IsUpper(*p)) ;\n\n            var len = (int)(p - state.Pointer);\n            word = state.Slice(0, len);\n            state = state.Slice(len);\n\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation.Benchmark/Benchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\n\nnamespace StringManipulation.Benchmark\n{\n    public class StringManipulationBenchmark\n    {\n        string[] _data = new[]\n        {\n            \"a\",\n            \"ab\",\n            \"abc\",\n            \"a_b_c\",\n            \"A\",\n            \"AB\",\n            \"ABC\",\n            \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\n            \"DeriveRestrictedAppContainerSidFromAppContainerSidAndRestrictedName\",\n            \"InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState\",\n            \"abcdefghijklmnopqrstuvwxyz\",\n            \"a_b_c_d_e_f_g_h_i_j_k_l_m_n_o_p_q_r_s_t_u_v_w_x_y_z\",\n            \"ensure_name_not_reserved\",\n        };\n\n        [Benchmark] public void Classic() => Run<Classic.Manipulater>();\n        [Benchmark] public void Unsafe() => Run<Unsafe.Manipulater>();\n        [Benchmark] public void SafeStackalloc() => Run<SafeStackalloc.Manipulater>();\n        [Benchmark] public void FullyTuned() => Run<FullyTuned.Manipulater>();\n\n        void Run<M>()\n            where M : struct, IStringManipulater\n        {\n            foreach (var x in _data)\n            {\n                var s = default(M).CamelToSnake(x);\n                var c = default(M).SnakeToCamel(x);\n                var s1 = default(M).CamelToSnake(c);\n                var c1 = default(M).SnakeToCamel(s);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation.Benchmark/IStringManipulater.cs",
    "content": "﻿namespace StringManipulation\n{\n    /// <summary>\n    /// テスト用。\n    /// <see cref=\"Classic.StringExtensions\"/>\n    /// <see cref=\"Unsafe.StringExtensions\"/>\n    /// <see cref=\"SafeStackalloc.StringExtensions\"/>\n    /// の静的メソッドを多態化するために使う。\n    /// </summary>\n    interface IStringManipulater\n    {\n        string SnakeToCamel(string s);\n        string CamelToSnake(string s);\n    }\n\n    namespace Classic\n    {\n        struct Manipulater : IStringManipulater\n        {\n            public string CamelToSnake(string s) => s.CamelToSnake();\n            public string SnakeToCamel(string s) => s.SnakeToCamel();\n        }\n    }\n\n    namespace Unsafe\n    {\n        struct Manipulater : IStringManipulater\n        {\n            public string CamelToSnake(string s) => s.CamelToSnake();\n            public string SnakeToCamel(string s) => s.SnakeToCamel();\n        }\n    }\n\n    namespace SafeStackalloc\n    {\n        struct Manipulater : IStringManipulater\n        {\n            public string CamelToSnake(string s) => s.CamelToSnake();\n            public string SnakeToCamel(string s) => s.SnakeToCamel();\n        }\n    }\n\n    namespace FullyTuned\n    {\n        struct Manipulater : IStringManipulater\n        {\n            public string CamelToSnake(string s) => s.CamelToSnake();\n            public string SnakeToCamel(string s) => s.SnakeToCamel();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation.Benchmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Columns;\nusing BenchmarkDotNet.Configs;\nusing BenchmarkDotNet.Diagnosers;\nusing BenchmarkDotNet.Exporters;\nusing BenchmarkDotNet.Jobs;\nusing BenchmarkDotNet.Loggers;\nusing BenchmarkDotNet.Running;\nusing BenchmarkDotNet.Toolchains.CsProj;\nusing BenchmarkDotNet.Toolchains.DotNetCli;\nusing System.Diagnostics;\n\nnamespace StringManipulation.Benchmark\n{\n    class Program\n    {\n        static void Main()\n        {\n            // ReadOnlySpan NonPortableCast が「Generate Exception: Method not found」とか言って怒られて実行できない。\n            // Span 絡みの API 変更入りまくってるから完全にバージョンが一致してないとたぶんこの手のエラーで死ぬ。\n            // 2・3時間悩んで解決できなかったんで Span のシグネチャが安定するまでしばらく塩漬け…\n            //BenchmarkRunner.Run<StringManipulationBenchmark>(new MyConfig());\n\n            // 仕方なく Stopwatch 運用…\n            const int N = 5000;\n            var benchmark = new StringManipulationBenchmark();\n\n            var sw = new Stopwatch();\n\n            sw.Start();\n            for (int i = 0; i < N; i++)\n            {\n                benchmark.Classic();\n            }\n            sw.Stop();\n            System.Console.WriteLine(sw.Elapsed);\n            sw.Reset();\n\n            sw.Start();\n            for (int i = 0; i < N; i++)\n            {\n                benchmark.Unsafe();\n            }\n            sw.Stop();\n            System.Console.WriteLine(sw.Elapsed);\n            sw.Reset();\n\n            sw.Start();\n            for (int i = 0; i < N; i++)\n            {\n                benchmark.SafeStackalloc();\n            }\n            sw.Stop();\n            System.Console.WriteLine(sw.Elapsed);\n            sw.Reset();\n\n            sw.Start();\n            for (int i = 0; i < N; i++)\n            {\n                benchmark.FullyTuned();\n            }\n            sw.Stop();\n            System.Console.WriteLine(sw.Elapsed);\n            sw.Reset();\n        }\n    }\n\n    public class MyConfig : ManualConfig\n    {\n        public MyConfig()\n        {\n            Add(Job.Default.With(\n                CsProjCoreToolchain.From(\n                    new NetCoreAppSettings(\n                        targetFrameworkMoniker: \"netcoreapp2.1\",\n                        runtimeFrameworkVersion: \"2.1.0-preview2-26130-06\",\n                        name: \".NET Core 2.1\"))));\n\n            Add(DefaultColumnProviders.Instance);\n            Add(MarkdownExporter.GitHub);\n            Add(MemoryDiagnoser.Default);\n            Add(new ConsoleLogger());\n            Add(new HtmlExporter());\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation.Benchmark/StringManipulation.Benchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\StringManipulation\\StringManipulation.csproj\" />\n    <PackageReference Include=\"System.Memory\" Version=\"4.5.0-preview2-26202-05\" />\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.4.0\" />\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.12\" />\n    <None Remove=\"BenchmarkDotNet.Artifacts/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation.Test/IStringManipulater.cs",
    "content": "﻿namespace StringManipulation\n{\n    /// <summary>\n    /// テスト用。\n    /// <see cref=\"Classic.StringExtensions\"/>\n    /// <see cref=\"Unsafe.StringExtensions\"/>\n    /// <see cref=\"SafeStackalloc.StringExtensions\"/>\n    /// の静的メソッドを多態化するために使う。\n    /// </summary>\n    interface IStringManipulater\n    {\n        string SnakeToCamel(string s);\n        string CamelToSnake(string s);\n    }\n\n    namespace Classic\n    {\n        struct Manipulater : IStringManipulater\n        {\n            public string CamelToSnake(string s) => s.CamelToSnake();\n            public string SnakeToCamel(string s) => s.SnakeToCamel();\n        }\n    }\n\n    namespace Unsafe\n    {\n        struct Manipulater : IStringManipulater\n        {\n            public string CamelToSnake(string s) => s.CamelToSnake();\n            public string SnakeToCamel(string s) => s.SnakeToCamel();\n        }\n    }\n\n    namespace SafeStackalloc\n    {\n        struct Manipulater : IStringManipulater\n        {\n            public string CamelToSnake(string s) => s.CamelToSnake();\n            public string SnakeToCamel(string s) => s.SnakeToCamel();\n        }\n    }\n\n    namespace FullyTuned\n    {\n        struct Manipulater : IStringManipulater\n        {\n            public string CamelToSnake(string s) => s.CamelToSnake();\n            public string SnakeToCamel(string s) => s.SnakeToCamel();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation.Test/StringManipulation.Test.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\StringManipulation\\StringManipulation.csproj\" />\n    <PackageReference Include=\"xunit\" Version=\"2.3.1\" />\n    <DotNetCliToolReference Include=\"dotnet-xunit\" Version=\"2.3.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/StringManipulation.Test/Test.cs",
    "content": "﻿using Xunit;\n\nnamespace StringManipulation\n{\n    public class StringManipulationTest\n    {\n        IStringManipulater[] targets = new IStringManipulater[]\n        {\n            new Classic.Manipulater(),\n            new Unsafe.Manipulater(),\n            new SafeStackalloc.Manipulater(),\n            new FullyTuned.Manipulater(),\n        };\n\n        [Theory]\n        [InlineData(\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\")]\n        [InlineData(\"DeriveRestrictedAppContainerSidFromAppContainerSidAndRestrictedName\")]\n        [InlineData(\"InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState\")]\n        public void CamelToSnakeToCamel(string s)\n        {\n            foreach (var t in targets) AssertCamelToSnakeToCamel(s, t);\n        }\n\n        void AssertCamelToSnakeToCamel(string s, IStringManipulater m)\n        {\n            var snake = m.CamelToSnake(s);\n            var camel = m.SnakeToCamel(snake);\n            Assert.Equal(s, camel);\n        }\n\n        [Theory]\n        [InlineData(\"abcdefghijklmnopqrstuvwxyz\")]\n        [InlineData(\"a_b_c_d_e_f_g_h_i_j_k_l_m_n_o_p_q_r_s_t_u_v_w_x_y_z\")]\n        [InlineData(\"ensure_name_not_reserved\")]\n        public void SnakeToCamelToSnake(string s)\n        {\n            foreach (var t in targets) AssertSnakeToCamelToSnake(s, t);\n        }\n\n        void AssertSnakeToCamelToSnake(string s, IStringManipulater m)\n        {\n            var camel = m.SnakeToCamel(s);\n            var snake = m.CamelToSnake(camel);\n            Assert.Equal(s, snake);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/SubstringBenchmark/AbstractString.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\n/// <summary>\n/// .NET の <see cref=\"string.Substring(int, int)\"/> はなんで常に新しい別の string インスタンスを new するの？\n/// インデクサーとか GetEnumerator とかを virtual にして、元の文字列 + 開始インデックス + 文字数 で持つ方がアロケーションが減って速いんじゃないの？\n/// とか言う人がごくまれにいるんだけども。\n///\n/// 実際には、gen0 GC よりも virtual の方が負担高め。\n///\n/// と言うのを示すために、インデクサーが virtual な string 型を作ったもの。\n/// </summary>\nabstract class AbstractString : IEnumerable<char>\n{\n    public abstract char this[int index] { get; }\n    public abstract int Length { get; }\n    public abstract AbstractString Substring(int start, int count);\n    public AbstractString Substring(int start) => Substring(start, Length - start);\n    public abstract IEnumerator<char> GetEnumerator();\n    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n}\n\n/// <summary>\n/// 通常の文字列。\n/// 長さ分の配列を確保してる。\n/// </summary>\nclass FullString : AbstractString\n{\n    private char[] _buffer;\n\n    public FullString(char[] buffer) => _buffer = buffer;\n    public FullString(string s)\n    {\n        var buffer = new char[s.Length];\n        for (int i = 0; i < buffer.Length; i++)\n        {\n            buffer[i] = s[i];\n        }\n        _buffer = buffer;\n    }\n\n    public override char this[int index] => _buffer[index];\n    public override int Length => _buffer.Length;\n    public override AbstractString Substring(int start, int count) => new StringSpan(_buffer, start, count);\n    public override IEnumerator<char> GetEnumerator() => ((IEnumerable<char>)_buffer).GetEnumerator();\n}\n\n/// <summary>\n/// Substring 用の文字列。\n/// 配列 + 開始インデックス + 長さ。\n/// </summary>\nclass StringSpan : AbstractString\n{\n    private char[] _buffer;\n    private int _start;\n    private int _count;\n\n    public StringSpan(char[] buffer, int start, int count)\n    {\n        if (start + count >= buffer.Length) throw new IndexOutOfRangeException();\n        _buffer = buffer;\n        _start = start;\n        _count = count;\n    }\n\n    public override char this[int index] => index < _count ? _buffer[_start + index] : throw new IndexOutOfRangeException();\n    public override int Length => _count;\n    public override AbstractString Substring(int start, int count) => new StringSpan(_buffer, start + start, count);\n    public override IEnumerator<char> GetEnumerator()\n    {\n        var a = _buffer;\n        var end = _start + _count;\n        for (int i = _start; i < end; i++)\n        {\n            yield return a[i];\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/SubstringBenchmark/Program.cs",
    "content": "﻿using System;\nusing System.Text;\nusing BenchmarkDotNet.Running;\n\nclass Program\n{\n    static readonly Encoding utf8 = Encoding.UTF8;\n\n    static void Main()\n    {\n#if true\n        var benchmark = new SubstringBenchmark();\n\n        var x = benchmark.StandardString();\n        var y = benchmark.AbstractString();\n        var z = benchmark.SpanChar();\n        for (int i = 0; i < 128; i++)\n        {\n            if (x[i] != y[i]) throw new Exception();\n            if (x[i] != z[i]) throw new Exception();\n        }\n#endif\n        BenchmarkRunner.Run<SubstringBenchmark>();\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/SubstringBenchmark/SubstringBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\n\n/// <summary>\n/// 文字列から Substring で部分文字列を抜き出して、\n/// その部分文字列に対して foreach で文字を取り出すと言うのを繰り返すベンチマーク。\n///\n/// - <see cref=\"StandardString\"/>\n/// .NET 標準の string / <see cref=\"string.Substring(int, int)\"/> を利用\n///\n/// - <see cref=\"AbstractString\"/>\n/// <see cref=\"global::AbstractString\"/> を利用\n///\n/// - <see cref=\"SpanChar\"/>\n/// .NET 標準の string / <see cref=\"ReadOnlySpan{char}.Slice(int, int)\"/> を利用\n///\n/// の3種類を対象にする。\n///\n/// 結果の例:\n///          Method |      Mean |     Error |    StdDev |     Gen 0 | Allocated |\n/// --------------- |----------:|----------:|----------:|----------:|----------:|\n///  StandardString |  3.061 ms | 0.0206 ms | 0.0172 ms | 1242.1875 | 5218312 B |\n///  AbstractString | 16.034 ms | 0.2279 ms | 0.2132 ms |  187.5000 |  802600 B |\n///        SpanChar |  5.584 ms | 0.0472 ms | 0.0442 ms |         - |     560 B |\n///\n/// Allocated の列(メモリ確保量)を見ての通り、<see cref=\"string.Substring(int, int)\"/> は1回1回文字列を new するので、ものすごいメモリを食う。\n/// が、Gen 0 GC な限りものすごい高速。\n/// (Gen 1/Gen 2 の GC 発生頻度が高い状況だともっと遅いはず。)\n///\n/// <see cref=\"global::AbstractString\"/> はメモリ確保が6~7分の1に減ってるけども、実行速度的には5倍以上遅い。\n/// 自作クラスなせいで遅い(.NET の string は JIT 時に条件が合えば範囲チェックを消したりとかいう最適化が掛かる)と言うのはもちろんあるものの。\n/// そこを差し引いても <see cref=\"StandardString\"/> より速くなることはないと思う。\n/// virtual は最適化をかなり阻害する(インライン展開ができなくなったり)。\n///\n/// <see cref=\"ReadOnlySpan{T}\"/> を使ったものは、メモリ確保量が激減する。\n/// 今のところそれでもメモリ確保しまくりな <see cref=\"string.Substring(int, int)\"/> の方が速い。\n/// 前述の「JIT 時に範囲チェックを消す」最適化の差。\n/// ただ、<see cref=\"Span{T}\"/>/<see cref=\"ReadOnlySpan{T}\"/>の最終目標は配列/stringと同程度の速度を達成することで、\n/// Span に対しても「JIT 時に範囲チェックを消す」最適化を書ける作業をやってる最中らしく、将来的には速くなるはず。\n/// </summary>\n[MemoryDiagnoser]\npublic class SubstringBenchmark\n{\n    private static string Data = @\"She speaks.\nO, speak again, bright angel! For thou art\nAs glorious to this night, being o'er my head,\nAs is a winged messenger of heaven\nUnto the white, upturned, wondering eyes\nOf mortals that fall back to gaze on him\nWhen he bestrides the lazy-puffing clouds\nAnd sails upon the bosom of the air.\nO Romeo, Romeo! Wherefore art thou Romeo?\nDeny thy father and refuse thy name.\nOr, if thou wilt not, be but sworn my love,\nAnd I'll no longer be a Capulet.\nShall I hear more, or shall I speak at this?\n'Tis but thy name that is my enemy.\nThou art thyself, though not a Montague.\nWhat's Montague? It is nor hand, nor foot,\nNor arm, nor face, nor any other part\nBelonging to a man. O, be some other name!\nWhat's in a name? That which we call a rose\nBy any other word would smell as sweet.\nSo Romeo would, were he not Romeo called,\nRetain that dear perfection which he owes\nWithout that title. Romeo, doff thy name,\nAnd for that name, which is no part of thee\nTake all myself.\n\";\n\n    private const int Loops = 10000;\n    private const int RandomSeed = 1;\n\n    [Benchmark]\n    public char[] StandardString()\n    {\n        var histogram = new char[128];\n\n        var data = Data;\n        var len = data.Length;\n        var r = new Random(RandomSeed);\n\n        for (int i = 0; i < Loops; i++)\n        {\n            var start = r.Next(len);\n            var count = r.Next(len - start);\n\n            var sub = data.Substring(start, count);\n\n            foreach (var c in sub)\n            {\n                ref var h = ref histogram[c];\n                ++h;\n            }\n        }\n\n        return histogram;\n    }\n\n    [Benchmark]\n    public char[] AbstractString()\n    {\n        var histogram = new char[128];\n\n        var data = new FullString(Data); // 違うのはこの行だけ\n        var len = data.Length;\n        var r = new Random(RandomSeed);\n\n        for (int i = 0; i < Loops; i++)\n        {\n            var start = r.Next(len);\n            var count = r.Next(len - start);\n\n            var sub = data.Substring(start, count);\n\n            foreach (var c in sub)\n            {\n                ref var h = ref histogram[c];\n                ++h;\n            }\n        }\n\n        return histogram;\n    }\n\n    [Benchmark]\n    public char[] SpanChar()\n    {\n        var histogram = new char[128];\n\n        var data = Data;\n        var len = data.Length;\n        var r = new Random(RandomSeed);\n\n        for (int i = 0; i < Loops; i++)\n        {\n            var start = r.Next(len);\n            var count = r.Next(len - start);\n\n            var sub = data.AsReadOnlySpan().Slice(start, count); // 違うのはこの行だけ\n\n            foreach (var c in sub)\n            {\n                ref var h = ref histogram[c];\n                ++h;\n            }\n        }\n\n        return histogram;\n    }\n}\n"
  },
  {
    "path": "Demo/2018/SpanPerformance/SubstringBenchmark/SubstringBenchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.12\" />\n    <None Remove=\"BenchmarkDotNet.Artifacts/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/TableMath/TableMath/SinCosTable.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing M = System.Math;\nusing T = System.Double;\n\nnamespace TableMath\n{\n    /// <summary>\n    /// 極まってくると sin/cos はテーブルで持っておきたいというやつ。\n    /// </summary>\n    /// <remarks>\n    /// sin/cos の角度の解像度は 256/1周。\n    /// 剰余演算を (x &amp; 0xff) で代用したいので、360度/1周 とかにはしない。\n    /// sin/cos の値の精度的には、一番ずれてるところで1.3%以下くらいっぽい。\n    /// </remarks>\n    public static class SinCosTable\n    {\n        private const T PI = M.PI;\n        private const T CosTableFactor = 128 / PI; // 2π で 256\n        private const T AtanTableFactor = 255; // y/x == 1 で 255\n        private const T invCosTableFactor = 1 / CosTableFactor;\n        private const T invAtanTableFactor = 1 / AtanTableFactor;\n        private static readonly T[] _cosTable;\n        private static readonly T[] _atanTable;\n\n        static SinCosTable()\n        {\n            var ct = new T[256];\n            var att = new T[256];\n            for (int i = 0; i < ct.Length; i++)\n            {\n                ct[i] = M.Cos(invCosTableFactor * i);\n                att[i] = M.Atan(invAtanTableFactor * i);\n            }\n            _cosTable = ct;\n            _atanTable = att;\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        private static int Round(T x) => (int)M.Round(x);\n        //=> (int)Floor(x + 0.5); // Round と大して変わらなかった。Round (偶数丸め)十分速い\n\n        /// <summary>\n        /// cos。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static T Cos(T theta)\n        {\n            var i = Round(theta * CosTableFactor);\n            return _cosTable[i & 0xff];\n        }\n\n        /// <summary>\n        /// sin。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static T Sin(T theta)\n        {\n            var i = Round(theta * CosTableFactor);\n            return _cosTable[(i - 64) & 0xff];\n        }\n\n        /// <summary>\n        /// sin/cos を同時計算。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static (T sin, T cos) SinCos(T theta)\n        {\n            var i = Round(theta * CosTableFactor);\n            var t = _cosTable;\n            return (t[(i - 64) & 0xff], t[i & 0xff]);\n        }\n\n        /// <summary>\n        /// sin/cos を同時計算。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static void SinCos(T theta, out T sin, out T cos)\n        {\n            var i = Round(theta * CosTableFactor);\n            var t = _cosTable;\n            (sin, cos) = (t[(i - 64) & 0xff], t[i & 0xff]);\n        }\n\n        /// <summary>\n        /// atan(y / x)。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static T Atan2(T y, T x)\n        {\n            var negX = x < 0;\n            if (negX) x = -x;\n\n            var negY = y < 0;\n            if (negY) y = -y;\n\n            if (x == 0)\n            {\n                if (y == 0) return 0;\n                else return negY ? -PI / 2 : PI / 2;\n            }\n            else if (y == 0) return negX ? PI : 0;\n\n            var t = _atanTable;\n            var atan = x > y ?\n                t[Round(y / x * AtanTableFactor)] :\n                PI / 2 - t[Round(x / y * AtanTableFactor)];\n\n            if (negX) atan = PI - atan;\n            if (negY) atan = -atan;\n\n            return atan;\n        }\n\n        public readonly struct Angle : IEquatable<Angle>\n        {\n            internal readonly byte _index;\n            public Angle(byte index) => _index = index;\n\n            public T ToRadian() => _index * invCosTableFactor;\n            public static Angle FromRadian(T angle) => new Angle(unchecked((byte)Round(angle * CosTableFactor)));\n            public static Angle FromDegree(T angle) => new Angle(unchecked((byte)Round(angle * 256 / 360)));\n            public static explicit operator Angle(T angle) => FromRadian(angle);\n\n            public bool Equals(Angle other) => _index == other._index;\n            public override bool Equals(object obj) => obj is Angle other && Equals(other);\n            public override int GetHashCode() => _index;\n            public static bool operator ==(Angle x, Angle y) => x._index == y._index;\n            public static bool operator !=(Angle x, Angle y) => x._index != y._index;\n        }\n\n        /// <summary>\n        /// cos。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static T Cos(Angle angle)\n        {\n            var i = angle._index;\n            return _cosTable[i];\n        }\n\n        /// <summary>\n        /// sin。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static T Sin(Angle angle)\n        {\n            var i = angle._index;\n            return _cosTable[(i - 64) & 0xff];\n        }\n\n        /// <summary>\n        /// sin/cos を同時計算。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static void SinCos(Angle angle, out T sin, out T cos)\n        {\n            var i = angle._index;\n            var t = _cosTable;\n            (sin, cos) = (t[(i - 64) & 0xff], t[i]);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/TableMath/TableMath/SinCosTableF.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\n// この2行以外 double 版と全く同じ。\nusing M = System.MathF;\nusing T = System.Single;\n\nnamespace TableMath\n{\n    /// <summary>\n    /// float 版。\n    /// <see cref=\"SinCosTable\"/>\n    /// </summary>\n    public static class SinCosTableF\n    {\n        private const T PI = M.PI;\n        private const T CosTableFactor = 128 / PI; // 2π で 256\n        private const T AtanTableFactor = 255; // y/x == 1 で 255\n        private const T invCosTableFactor = 1 / CosTableFactor;\n        private const T invAtanTableFactor = 1 / AtanTableFactor;\n        private static readonly T[] _cosTable;\n        private static readonly T[] _atanTable;\n\n        static SinCosTableF()\n        {\n            var ct = new T[256];\n            var att = new T[256];\n            for (int i = 0; i < ct.Length; i++)\n            {\n                ct[i] = M.Cos(invCosTableFactor * i);\n                att[i] = M.Atan(invAtanTableFactor * i);\n            }\n            _cosTable = ct;\n            _atanTable = att;\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        private static int Round(T x) => (int)M.Round(x);\n        //=> (int)Floor(x + 0.5); // Round と大して変わらなかった。Round (偶数丸め)十分速い\n\n        /// <summary>\n        /// cos。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static T Cos(T theta)\n        {\n            var i = Round(theta * CosTableFactor);\n            return _cosTable[i & 0xff];\n        }\n\n        /// <summary>\n        /// sin。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static T Sin(T theta)\n        {\n            var i = Round(theta * CosTableFactor);\n            return _cosTable[(i - 64) & 0xff];\n        }\n\n        /// <summary>\n        /// sin/cos を同時計算。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static (T sin, T cos) SinCos(T theta)\n        {\n            var i = Round(theta * CosTableFactor);\n            var t = _cosTable;\n            return (t[(i - 64) & 0xff], t[i & 0xff]);\n        }\n\n        /// <summary>\n        /// sin/cos を同時計算。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static void SinCos(T theta, out T sin, out T cos)\n        {\n            var i = Round(theta * CosTableFactor);\n            var t = _cosTable;\n            (sin, cos) = (t[(i - 64) & 0xff], t[i & 0xff]);\n        }\n\n        /// <summary>\n        /// atan(y / x)。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static T Atan2(T y, T x)\n        {\n            var negX = x < 0;\n            if (negX) x = -x;\n\n            var negY = y < 0;\n            if (negY) y = -y;\n\n            if (x == 0)\n            {\n                if (y == 0) return 0;\n                else return negY ? -PI / 2 : PI / 2;\n            }\n            else if (y == 0) return negX ? PI : 0;\n\n            var t = _atanTable;\n            var atan = x > y ?\n                t[Round(y / x * AtanTableFactor)] :\n                PI / 2 - t[Round(x / y * AtanTableFactor)];\n\n            if (negX) atan = PI - atan;\n            if (negY) atan = -atan;\n\n            return atan;\n        }\n\n        public readonly struct Angle : IEquatable<Angle>\n        {\n            internal readonly byte _index;\n            public Angle(byte index) => _index = index;\n\n            public T ToRadian() => _index * invCosTableFactor;\n            public static Angle FromRadian(T angle) => new Angle(unchecked((byte)Round(angle * CosTableFactor)));\n            public static Angle FromDegree(T angle) => new Angle(unchecked((byte)Round(angle * 256 / 360)));\n            public static explicit operator Angle(T angle) => FromRadian(angle);\n\n            public bool Equals(Angle other) => _index == other._index;\n            public override bool Equals(object obj) => obj is Angle other && Equals(other);\n            public override int GetHashCode() => _index;\n            public static bool operator ==(Angle x, Angle y) => x._index == y._index;\n            public static bool operator !=(Angle x, Angle y) => x._index != y._index;\n        }\n\n        /// <summary>\n        /// cos。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static T Cos(Angle angle)\n        {\n            var i = angle._index;\n            return _cosTable[i];\n        }\n\n        /// <summary>\n        /// sin。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static T Sin(Angle angle)\n        {\n            var i = angle._index;\n            return _cosTable[(i - 64) & 0xff];\n        }\n\n        /// <summary>\n        /// sin/cos を同時計算。\n        /// </summary>\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static void SinCos(Angle angle, out T sin, out T cos)\n        {\n            var i = angle._index;\n            var t = _cosTable;\n            (sin, cos) = (t[(i - 64) & 0xff], t[i]);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/TableMath/TableMath/TableMath.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/TableMath/TableMath.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28010.2046\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TableMath\", \"TableMath\\TableMath.csproj\", \"{DBCE95E8-298C-4D3A-A142-10A2D06E5452}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TableMathBenchmark\", \"TableMathBenchmark\\TableMathBenchmark.csproj\", \"{346111C2-6367-4596-A2E8-0C192764A008}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TableMathTest\", \"TableMathTest\\TableMathTest.csproj\", \"{8A2FF13A-7FEE-44B8-B8F0-6F44569F44B4}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{DBCE95E8-298C-4D3A-A142-10A2D06E5452}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{DBCE95E8-298C-4D3A-A142-10A2D06E5452}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{DBCE95E8-298C-4D3A-A142-10A2D06E5452}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{DBCE95E8-298C-4D3A-A142-10A2D06E5452}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{346111C2-6367-4596-A2E8-0C192764A008}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{346111C2-6367-4596-A2E8-0C192764A008}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{346111C2-6367-4596-A2E8-0C192764A008}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{346111C2-6367-4596-A2E8-0C192764A008}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8A2FF13A-7FEE-44B8-B8F0-6F44569F44B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8A2FF13A-7FEE-44B8-B8F0-6F44569F44B4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8A2FF13A-7FEE-44B8-B8F0-6F44569F44B4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8A2FF13A-7FEE-44B8-B8F0-6F44569F44B4}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {0F908463-81A8-4FE4-B07D-FCF53B2557E8}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/TableMath/TableMathBenchmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace TableMathBenchmark\n{\n    static class Program\n    {\n        static void Main()\n        {\n            BenchmarkRunner.Run<TableBenchmark>();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/TableMath/TableMathBenchmark/SinCosTableUnsafeF.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace TableMath\n{\n    /// <summary>\n    /// unsafe で配列の range check さぼって速くできないかとやってみたやつ。\n    /// そんなに速くならなかった。\n    /// </summary>\n    public unsafe static class SinCosTableUnsafeF\n    {\n        private const float Factor = 128 / MathF.PI;\n        private static readonly float* _cosTable;\n\n        static SinCosTableUnsafeF()\n        {\n            var t = (float*)System.Runtime.InteropServices.Marshal.AllocHGlobal(256 * sizeof(float));\n            for (int i = 0; i < 256; i++)\n                t[i] = MathF.Cos(MathF.PI / 128 * i);\n            _cosTable = t;\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        private static int Round(float x) => (int)MathF.Round(x);\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static float Cos(float theta)\n        {\n            var i = Round(theta * Factor);\n            return _cosTable[i & 0xff];\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static float Sin(float theta)\n        {\n            var i = Round(theta * Factor);\n            return _cosTable[(i - 64) & 0xff];\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static (float sin, float cos) SinCos(float theta)\n        {\n            var i = Round(theta * Factor);\n            var t = _cosTable;\n            return (t[(i - 64) & 0xff], t[i & 0xff]);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/TableMath/TableMathBenchmark/TableBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System;\nusing System.Linq;\nusing TableMath;\n\nnamespace TableMathBenchmark\n{\n    /// <summary>\n    /// 大まかな結果、手元のPCで、\n    ///\n    /// Math.Sin/Cos … 11μs\n    /// Math.Atan2 … 20μs\n    /// MathF.Sin/Cos … 11μs\n    /// MathF.Atan2 … 15μs\n    ///\n    /// SinCosTable.Sin/Cos … 3μs\n    /// SinCosTableF.Sin/Cos … 2μs\n    /// SinCosTable/SinCosTableF.Atan2 … 5μs\n    ///\n    /// くらい。\n    /// 精度2桁程度になるわりに、4倍程度の高速化と言うのを速いとみるかどうか…\n    ///\n    /// unsafe にするのはそんなに効果なし(せいぜい、2.2μs → 2.0μs)。\n    ///\n    /// ## タプル戻り値\n    /// あと、(T sin, T cos) SinCos(T) が、なぜか float 版の時に遅い。\n    /// (double 版だとタプル (double sin, double cos) で返しても十分速いんだけど。)\n    /// タプル構築の最適化が double の方が掛かりやすいっぽい？なので、out 引数で返すバージョンを用意してる。\n    /// out 引数の方は想定通りの速度(Sin, Cos 単体と遜色ない速度)出てた。\n    /// </summary>\n    public class TableBenchmark\n    {\n        private float[] _longData;\n        private float[] _shortData;\n\n        [GlobalSetup]\n        public void Setup()\n        {\n            var r = new Random(1);\n            _longData = Enumerable.Range(0, 1000).Select(_ => (float)r.NextDouble() * 1000 - 500).ToArray();\n            _shortData = Enumerable.Range(0, 30).Select(_ => (float)r.NextDouble() * 1000 - 500).ToArray();\n        }\n\n        // 和を取って返してるのはインライン化で消えないように\n        [Benchmark] public double MathSin() { var sum = 0.0; foreach (var x in _longData) sum += Math.Sin(x); return sum; }\n        [Benchmark] public double MathCos() { var sum = 0.0; foreach (var x in _longData) sum += Math.Cos(x); return sum; }\n        [Benchmark] public double TableSin() { var sum = 0.0; foreach (var x in _longData) sum += SinCosTable.Sin(x); return sum; }\n        [Benchmark] public double TableCos() { var sum = 0.0; foreach (var x in _longData) sum += SinCosTable.Cos(x); return sum; }\n        [Benchmark] public double TableSinCos() { var sum = 0.0; foreach (var x in _longData) { var (s, c) = SinCosTable.SinCos(x); sum += s; } return sum; }\n        [Benchmark] public float MathFSin() { var sum = 0.0f; foreach (var x in _longData) sum += MathF.Sin(x); return sum; }\n        [Benchmark] public float MathFCos() { var sum = 0.0f; foreach (var x in _longData) sum += MathF.Cos(x); return sum; }\n        [Benchmark] public float TableFSin() { var sum = 0.0f; foreach (var x in _longData) sum += SinCosTableF.Sin(x); return sum; }\n        [Benchmark] public float TableFCos() { var sum = 0.0f; foreach (var x in _longData) sum += SinCosTableF.Cos(x); return sum; }\n        [Benchmark] public float TableFSinCos() { var sum = 0.0f; foreach (var x in _longData) { var (s, c) = SinCosTableF.SinCos(x); sum += s; } return sum; }\n        [Benchmark] public float TableFSinCosOut() { var sum = 0.0f; foreach (var x in _longData) { SinCosTableF.SinCos(x, out var s, out _); sum += s; } return sum; }\n        [Benchmark] public float UnsafeTableFSin() { var sum = 0.0f; foreach (var x in _longData) sum += SinCosTableUnsafeF.Sin(x); return sum; }\n        [Benchmark] public float UnsafeTableFCos() { var sum = 0.0f; foreach (var x in _longData) sum += SinCosTableUnsafeF.Cos(x); return sum; }\n        [Benchmark] public float UnsafeTableFSinCos() { var sum = 0.0f; foreach (var x in _longData) { var (s, c) = SinCosTableUnsafeF.SinCos(x); sum += s; } return sum; }\n        [Benchmark] public double MathAtan2() { var sum = 0.0; foreach (var x in _shortData) foreach (var y in _shortData) sum += Math.Atan2(x, y); return sum; }\n        [Benchmark] public float MathFAtan2() { var sum = 0.0f; foreach (var x in _shortData) foreach (var y in _shortData) sum += MathF.Atan2(x, y); return sum; }\n        [Benchmark] public double TableAtan2() { var sum = 0.0; foreach (var x in _shortData) foreach (var y in _shortData) sum += SinCosTable.Atan2(x, y); return sum; }\n        [Benchmark] public float TableFAtan2() { var sum = 0.0f; foreach (var x in _shortData) foreach (var y in _shortData) sum += SinCosTableF.Atan2(x, y); return sum; }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/TableMath/TableMathBenchmark/TableMathBenchmark.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n\n    <!-- SinCosTableUnsafeF(比較のために作っただけ)のための unsafe -->\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.10.14\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Remove=\"BenchmarkDotNet.Artifacts/**\" />\n    <None Remove=\"out/**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\TableMath\\TableMath.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/TableMath/TableMathTest/SinCosTableFTest.cs",
    "content": "﻿using System;\nusing Xunit;\nusing Table = TableMath.SinCosTableF;\nusing M = System.MathF;\nusing T = System.Single;\n\nnamespace TableMathTest\n{\n    public class SinCosTableTestF\n    {\n        private static readonly T[] _cornerCase = new[]\n        {\n            0,\n            M.PI / 2,\n            M.PI,\n            3 * M.PI / 2,\n            2 * M.PI,\n            -M.PI / 2,\n            -M.PI,\n            -3 * M.PI / 2,\n            -2 * M.PI,\n        };\n\n        [Fact]\n        public void SinCosの戻り値はSinとCosと一致()\n        {\n            void assert(T theta)\n            {\n                var s1 = Table.Sin(theta);\n                var c1 = Table.Cos(theta);\n                var (s2, c2) = Table.SinCos(theta);\n\n                Assert.Equal(s1, s2);\n                Assert.Equal(c1, c2);\n            }\n\n            var r = new Random();\n            for (int i = 0; i < 1000; i++)\n            {\n                var theta = (float)r.NextDouble() * 1000 - 500;\n                assert(theta);\n            }\n\n            foreach (var theta in _cornerCase)\n            {\n                assert(theta);\n            }\n        }\n\n        [Fact]\n        public void テーブル上にある値は6桁精度で取れる()\n        {\n            void assert(T theta)\n            {\n                var s1 = Table.Sin(theta);\n                var c1 = Table.Cos(theta);\n                var s2 = M.Sin(theta);\n                var c2 = M.Cos(theta);\n\n                Assert.True(M.Abs(s1 - s2) < 1e-6f);\n                Assert.True(M.Abs(c1 - c2) < 1e-6f);\n            }\n\n            for (int i = -256; i <= 256; i++)\n            {\n                var theta = 2 * M.PI / 256 * i;\n                assert(theta);\n            }\n\n            foreach (var theta in _cornerCase)\n            {\n                assert(theta);\n            }\n        }\n\n        [Fact]\n        public void 精度が悪いところでも誤差2パーセント程度の精度で取れる()\n        {\n            void assert(T theta)\n            {\n                var s1 = Table.Sin(theta);\n                var c1 = Table.Cos(theta);\n                var s2 = M.Sin(theta);\n                var c2 = M.Cos(theta);\n\n                Assert.True(M.Abs(s1 - s2) < 1.3e-2f);\n                Assert.True(M.Abs(c1 - c2) < 1.3e-2f);\n            }\n\n            for (int i = -256; i <= 256; i++)\n            {\n                var theta = 2 * M.PI / 256 * (i + 0.5f);\n                assert(theta);\n            }\n\n            foreach (var theta in _cornerCase)\n            {\n                assert(theta);\n            }\n        }\n\n        [Fact]\n        public void Atan2誤差1パーセント以下の精度で計算できる()\n        {\n            void assertYX(T y, T x)\n            {\n                var t1 = Table.Atan2(y, x);\n                var t2 = M.Atan2(y, x);\n\n                Assert.True(M.Abs(t1 - t2) < 2e-3);\n            }\n\n            void assert(T theta)\n            {\n                var (y, x) = (M.Cos(theta), M.Sin(theta));\n                assertYX(y, x);\n            }\n\n            var r = new Random();\n            for (int i = 0; i < 1000; i++)\n            {\n                var theta = (float)r.NextDouble() * 1000 - 500;\n                assert(theta);\n            }\n            for (int i = 0; i < 1000; i++)\n            {\n                var y = (float)r.NextDouble() * 1000 - 500;\n                var x = (float)r.NextDouble() * 1000 - 500;\n                assertYX(y, x);\n            }\n\n            foreach (var theta in _cornerCase)\n            {\n                assert(theta);\n            }\n\n            for (int x = -1; x <= 1; x++)\n                for (int y = -1; y <= 1; y++)\n                    assertYX(x, y);\n        }\n\n        [Fact]\n        public void Angleでの値は6桁精度で取れる()\n        {\n            void assert(Table.Angle angle)\n            {\n                var s1 = Table.Sin(angle);\n                var c1 = Table.Cos(angle);\n                var theta = angle.ToRadian();\n                var s2 = M.Sin(theta);\n                var c2 = M.Cos(theta);\n\n                Assert.True(M.Abs(s1 - s2) < 1e-6f);\n                Assert.True(M.Abs(c1 - c2) < 1e-6f);\n            }\n\n            for (int i = 0; i < 256; i++)\n            {\n                assert(new Table.Angle((byte)i));\n            }\n        }\n\n        [Fact]\n        public void SinCosからAtan2で元のAngleを復元()\n        {\n            void assert(Table.Angle angle)\n            {\n                var s1 = Table.Sin(angle);\n                var c1 = Table.Cos(angle);\n                var atan = Table.Atan2(s1, c1);\n                var a1 = Table.Angle.FromRadian(atan);\n\n                Assert.Equal(angle, a1);\n            }\n\n            for (int i = 0; i < 256; i++)\n            {\n                assert(new Table.Angle((byte)i));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/TableMath/TableMathTest/SinCosTableTest.cs",
    "content": "﻿using System;\nusing Xunit;\nusing Table = TableMath.SinCosTable;\nusing M = System.Math;\nusing T = System.Double;\n\nnamespace TableMathTest\n{\n    public class SinCosTableTest\n    {\n        private static readonly T[] _cornerCase = new[]\n        {\n            0,\n            M.PI / 2,\n            M.PI,\n            3 * M.PI / 2,\n            2 * M.PI,\n            -M.PI / 2,\n            -M.PI,\n            -3 * M.PI / 2,\n            -2 * M.PI,\n        };\n\n        [Fact]\n        public void SinCosの戻り値はSinとCosと一致()\n        {\n            void assert(T theta)\n            {\n                var s1 = Table.Sin(theta);\n                var c1 = Table.Cos(theta);\n                var (s2, c2) = Table.SinCos(theta);\n\n                Assert.Equal(s1, s2);\n                Assert.Equal(c1, c2);\n            }\n\n            var r = new Random();\n            for (int i = 0; i < 1000; i++)\n            {\n                var theta = r.NextDouble() * 1000 - 500;\n                assert(theta);\n            }\n\n            foreach (var theta in _cornerCase)\n            {\n                assert(theta);\n            }\n        }\n\n        [Fact]\n        public void テーブル上にある値は15桁精度で取れる()\n        {\n            void assert(T theta)\n            {\n                var s1 = Table.Sin(theta);\n                var c1 = Table.Cos(theta);\n                var s2 = M.Sin(theta);\n                var c2 = M.Cos(theta);\n\n                Assert.True(M.Abs(s1 - s2) < 1e-15);\n                Assert.True(M.Abs(c1 - c2) < 1e-15);\n            }\n\n            for (int i = -256; i <= 256; i++)\n            {\n                var theta = 2 * M.PI / 256 * i;\n                assert(theta);\n            }\n\n            foreach (var theta in _cornerCase)\n            {\n                assert(theta);\n            }\n        }\n\n        [Fact]\n        public void 精度が悪いところでも誤差2パーセント程度の精度で取れる()\n        {\n            void assert(T theta)\n            {\n                var s1 = Table.Sin(theta);\n                var c1 = Table.Cos(theta);\n                var s2 = M.Sin(theta);\n                var c2 = M.Cos(theta);\n\n                Assert.True(M.Abs(s1 - s2) < 1.3e-2);\n                Assert.True(M.Abs(c1 - c2) < 1.3e-2);\n            }\n\n            for (int i = -256; i <= 256; i++)\n            {\n                var theta = 2 * M.PI / 256 * (i + 0.5);\n                assert(theta);\n            }\n\n            foreach (var theta in _cornerCase)\n            {\n                assert(theta);\n            }\n        }\n\n        [Fact]\n        public void Atan2誤差1パーセント以下の精度で計算できる()\n        {\n            void assertYX(T y, T x)\n            {\n                var t1 = Table.Atan2(y, x);\n                var t2 = M.Atan2(y, x);\n\n                Assert.True(M.Abs(t1 - t2) < 2e-3);\n            }\n\n            void assert(T theta)\n            {\n                var (y, x) = (M.Cos(theta), M.Sin(theta));\n                assertYX(y, x);\n            }\n\n            var r = new Random();\n            for (int i = 0; i < 1000; i++)\n            {\n                var theta = r.NextDouble() * 1000 - 500;\n                assert(theta);\n            }\n            for (int i = 0; i < 1000; i++)\n            {\n                var y = r.NextDouble() * 1000 - 500;\n                var x = r.NextDouble() * 1000 - 500;\n                assertYX(y, x);\n            }\n\n            foreach (var theta in _cornerCase)\n            {\n                assert(theta);\n            }\n\n            for (int x = -1; x <= 1; x++)\n                for (int y = -1; y <= 1; y++)\n                    assertYX(x, y);\n        }\n\n        [Fact]\n        public void Angleでの値は15桁精度で取れる()\n        {\n            void assert(Table.Angle angle)\n            {\n                var s1 = Table.Sin(angle);\n                var c1 = Table.Cos(angle);\n                var theta = angle.ToRadian();\n                var s2 = M.Sin(theta);\n                var c2 = M.Cos(theta);\n\n                Assert.True(M.Abs(s1 - s2) < 1e-15);\n                Assert.True(M.Abs(c1 - c2) < 1e-15);\n            }\n\n            for (int i = 0; i < 256; i++)\n            {\n                assert(new Table.Angle((byte)i));\n            }\n        }\n\n        [Fact]\n        public void SinCosからAtan2で元のAngleを復元()\n        {\n            void assert(Table.Angle angle)\n            {\n                var s1 = Table.Sin(angle);\n                var c1 = Table.Cos(angle);\n                var atan = Table.Atan2(s1, c1);\n                var a1 = Table.Angle.FromRadian(atan);\n\n                Assert.Equal(angle, a1);\n            }\n\n            for (int i = 0; i < 256; i++)\n            {\n                assert(new Table.Angle((byte)i));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/TableMath/TableMathTest/TableMathTest.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"15.9.0\" />\n    <PackageReference Include=\"xunit\" Version=\"2.4.0\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.4.0\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\TableMath\\TableMath.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2018/TableMath/readme.md",
    "content": "# 三角関数テーブル化\n\n極まってくると、`Math.Sin`の負荷を避けたく、三角関数の値をテーブル化してしまいたくなるやつ。\n角度の解像度がそんなに要らない時用。とりあえず、1周256分割の解像度で実装。\n256分割だと、一番ずれているところで誤差1.3%以下くらい。"
  },
  {
    "path": "Demo/2018/TemplateSelector/App.xaml",
    "content": "﻿<Application x:Class=\"WpfApp2.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:WpfApp2\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Demo/2018/TemplateSelector/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace WpfApp2\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2018/TemplateSelector/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"WpfApp2.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:WpfApp2\"\n        mc:Ignorable=\"d\"\n        Title=\"MainWindow\" Height=\"350\" Width=\"525\">\n    <Window.Resources>\n        <local:MySelector x:Key=\"MySelector\" />\n\n        <Style TargetType=\"{x:Type ContentControl}\">\n            <Setter Property=\"ContentTemplateSelector\" Value=\"{StaticResource MySelector}\" />\n        </Style>\n\n        <Style TargetType=\"{x:Type ItemsControl}\">\n            <Setter Property=\"ItemTemplateSelector\" Value=\"{StaticResource MySelector}\" />\n        </Style>\n    </Window.Resources>\n    <StackPanel>\n        <StackPanel local:MySelector.Mode=\"Detail\">\n            <ContentControl Content=\"{Binding A}\" />\n            <ContentControl Content=\"{Binding B}\" />\n            <ItemsControl ItemsSource=\"{Binding C}\" />\n            <ContentControl Content=\"{Binding α}\" />\n            <ContentControl Content=\"{Binding β}\" />\n            <ContentControl Content=\"{Binding γ}\" />\n        </StackPanel>\n        <StackPanel local:MySelector.Mode=\"Summary\">\n            <ContentControl Content=\"{Binding A}\" />\n            <ContentControl Content=\"{Binding B}\" />\n            <ItemsControl ItemsSource=\"{Binding C}\" />\n            <ContentControl Content=\"{Binding α}\" />\n            <ContentControl Content=\"{Binding β}\" />\n            <ContentControl Content=\"{Binding γ}\" />\n        </StackPanel>\n    </StackPanel>\n</Window>\n"
  },
  {
    "path": "Demo/2018/TemplateSelector/MainWindow.xaml.cs",
    "content": "﻿using System.Windows;\n\nnamespace WpfApp2\n{\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n\n            DataContext = new\n            {\n                A = \"abc\",\n                B = \"cde\",\n                C = new[]\n                {\n                    1,2,3,4,5\n                },\n                α = new Sample.Alpha { Id = 1, Name = \"アルファ\" },\n                β = new Sample.Beta { Id = 2, Name = \"ベータ\" },\n                γ = new Sample.Gamma { Id = 3, Name = \"ガンマ\" },\n            };\n        }\n    }\n\n    namespace Sample\n    {\n        public class Alpha\n        {\n            public int Id { get; set; }\n            public string Name { get; set; }\n        }\n\n        public class Beta\n        {\n            public int Id { get; set; }\n            public string Name { get; set; }\n        }\n\n        public class Gamma\n        {\n            public int Id { get; set; }\n            public string Name { get; set; }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/TemplateSelector/MySelector.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Windows;\nusing System.Windows.Controls;\n\nnamespace WpfApp2\n{\n    public enum SelectorMode\n    {\n        Summary,\n        Detail,\n    }\n\n    public class MySelector : DataTemplateSelector\n    {\n        class Pair\n        {\n            public DataTemplate Summary { get; }\n            public DataTemplate Detail { get; }\n            public Pair(DataTemplate summary, DataTemplate detail) => (Summary, Detail) = (summary, detail);\n        }\n\n        Dictionary<Type, Pair> _templates = new Dictionary<Type, Pair>();\n        Pair _intTemplate;\n        Pair _stringTemplate;\n\n        Pair GetPair(object item)\n        {\n            switch (item)\n            {\n                case byte _:\n                case sbyte _:\n                case short _:\n                case ushort _:\n                case int _:\n                case uint _:\n                case long _:\n                case ulong _:\n                    if (_intTemplate == null) _intTemplate = Load(new Uri(\"/WpfApp2;component/Templates/Integer.xaml\", UriKind.Relative));\n                    return _intTemplate;\n                case string _:\n                    if (_stringTemplate == null) _stringTemplate = Load(new Uri(\"/WpfApp2;component/Templates/String.xaml\", UriKind.Relative));\n                    return _stringTemplate;\n                case null: return null;\n            }\n\n            var t = item.GetType();\n\n            //todo: enum\n            //todo: ObservableCollection の分岐もこれでやる？\n\n            if (!_templates.TryGetValue(t, out var p))\n            {\n                //todo: assembly name は外から受け取る\n                var path = \"/WpfApp2;component/Templates/\" + string.Join(\"/\", t.Namespace.Split('.')) + \"/\" + t.Name + \".xaml\";\n                p = Load(new Uri(path, UriKind.Relative));\n                //todo: なかった場合\n                _templates[t] = p;\n            }\n\n            return p;\n        }\n\n        private static Pair Load(Uri uri)\n        {\n            var dic = (ResourceDictionary)Application.LoadComponent(uri);\n            var pair = new Pair(dic[\"Summary\"] as DataTemplate, dic[\"Detail\"] as DataTemplate);\n            return pair;\n        }\n\n        public override DataTemplate SelectTemplate(object item, DependencyObject container)\n        {\n            if (item == null) return base.SelectTemplate(item, container);\n\n            var pair = GetPair(item);\n\n            switch (container.GetValue(ModeProperty))\n            {\n                default:\n                case SelectorMode.Detail: return pair.Detail;\n                case SelectorMode.Summary: return pair.Summary;\n            }\n        }\n\n        public static void SetMode(Control obj, SelectorMode value) => obj.SetValue(ModeProperty, value);\n        public static SelectorMode GetMode(Control obj) => (SelectorMode)obj.GetValue(ModeProperty);\n\n        public static readonly DependencyProperty ModeProperty = DependencyProperty.RegisterAttached(\n            \"Mode\",\n            typeof(SelectorMode),\n            typeof(MySelector),\n            new FrameworkPropertyMetadata(SelectorMode.Detail) { Inherits = true });\n    }\n}\n"
  },
  {
    "path": "Demo/2018/TemplateSelector/TemplateSelector.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27205.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WpfApp2\", \"WpfApp2.csproj\", \"{47045931-6D3C-48C9-BABC-14F97B5F33BA}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{47045931-6D3C-48C9-BABC-14F97B5F33BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{47045931-6D3C-48C9-BABC-14F97B5F33BA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{47045931-6D3C-48C9-BABC-14F97B5F33BA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{47045931-6D3C-48C9-BABC-14F97B5F33BA}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {059E36C2-B9C3-44B7-8606-C2989735F9ED}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/TemplateSelector/Templates/Integer.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n                    xmlns:local=\"clr-namespace:WpfApp2.Templates\">\n\n    <DataTemplate x:Key=\"Summary\">\n        <TextBlock Text=\"{Binding}\" Foreground=\"Red\" />\n    </DataTemplate>\n\n    <DataTemplate x:Key=\"Detail\">\n        <StackPanel Orientation=\"Horizontal\">\n            <TextBlock Text=\"int: \" />\n            <TextBox Text=\"{Binding Mode=OneWay}\" IsReadOnly=\"True\" />\n        </StackPanel>\n    </DataTemplate>\n</ResourceDictionary>"
  },
  {
    "path": "Demo/2018/TemplateSelector/Templates/String.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n                    xmlns:local=\"clr-namespace:WpfApp2.Templates.System\">\n\n    <DataTemplate x:Key=\"Summary\">\n        <TextBlock Text=\"{Binding}\" Foreground=\"Blue\" />\n    </DataTemplate>\n\n    <DataTemplate x:Key=\"Detail\">\n        <StackPanel Orientation=\"Horizontal\">\n            <TextBlock Text=\"string: \" />\n            <TextBox Text=\"{Binding Mode=OneWay}\" IsReadOnly=\"True\" />\n        </StackPanel>\n    </DataTemplate>\n\n</ResourceDictionary>"
  },
  {
    "path": "Demo/2018/TemplateSelector/Templates/WpfApp2/Sample/Alpha.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n                    xmlns:local=\"clr-namespace:WpfApp2.Templates.System\">\n\n    <DataTemplate x:Key=\"Summary\">\n        <StackPanel Orientation=\"Horizontal\">\n            <TextBlock Text=\"α id: \" />\n            <TextBlock Text=\"{Binding Id}\" Foreground=\"Red\" />\n            <TextBlock Text=\", name: \" />\n            <TextBlock Text=\"{Binding}\" Foreground=\"Red\" />\n        </StackPanel>\n    </DataTemplate>\n\n    <DataTemplate x:Key=\"Detail\">\n        <Grid>\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"auto\" />\n                <RowDefinition Height=\"auto\" />\n                <RowDefinition Height=\"auto\" />\n            </Grid.RowDefinitions>\n            <Grid.ColumnDefinitions>\n                <ColumnDefinition Width=\"auto\" />\n                <ColumnDefinition Width=\"auto\" />\n            </Grid.ColumnDefinitions>\n\n            <TextBlock Text=\"α\" Grid.Row=\"0\" Grid.ColumnSpan=\"2\" Foreground=\"Red\"/>\n\n            <TextBlock Text=\"Id\" Grid.Row=\"1\" Grid.Column=\"0\"/>\n            <TextBlock Text=\"{Binding Id}\" Grid.Row=\"1\" Grid.Column=\"1\"/>\n\n            <TextBlock Text=\"Id\" Grid.Row=\"2\" Grid.Column=\"0\"/>\n            <TextBlock Text=\"{Binding Name}\" Grid.Row=\"2\" Grid.Column=\"1\"/>\n        </Grid>\n    </DataTemplate>\n\n</ResourceDictionary>"
  },
  {
    "path": "Demo/2018/TemplateSelector/Templates/WpfApp2/Sample/Beta.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n                    xmlns:local=\"clr-namespace:WpfApp2.Templates.System\">\n\n    <DataTemplate x:Key=\"Summary\">\n        <StackPanel Orientation=\"Horizontal\">\n            <TextBlock Text=\"β id: \" />\n            <TextBlock Text=\"{Binding Id}\" Foreground=\"Blue\" />\n            <TextBlock Text=\", name: \" />\n            <TextBlock Text=\"{Binding}\" Foreground=\"Blue\" />\n        </StackPanel>\n    </DataTemplate>\n\n    <DataTemplate x:Key=\"Detail\">\n        <Grid>\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"auto\" />\n                <RowDefinition Height=\"auto\" />\n                <RowDefinition Height=\"auto\" />\n            </Grid.RowDefinitions>\n            <Grid.ColumnDefinitions>\n                <ColumnDefinition Width=\"auto\" />\n                <ColumnDefinition Width=\"auto\" />\n            </Grid.ColumnDefinitions>\n\n            <TextBlock Text=\"β\" Grid.Row=\"0\" Grid.ColumnSpan=\"2\" Foreground=\"Blue\"/>\n\n            <TextBlock Text=\"Id\" Grid.Row=\"1\" Grid.Column=\"0\"/>\n            <TextBlock Text=\"{Binding Id}\" Grid.Row=\"1\" Grid.Column=\"1\"/>\n\n            <TextBlock Text=\"Id\" Grid.Row=\"2\" Grid.Column=\"0\"/>\n            <TextBlock Text=\"{Binding Name}\" Grid.Row=\"2\" Grid.Column=\"1\"/>\n        </Grid>\n    </DataTemplate>\n\n</ResourceDictionary>"
  },
  {
    "path": "Demo/2018/TemplateSelector/Templates/WpfApp2/Sample/Gamma.xaml",
    "content": "﻿<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n                    xmlns:local=\"clr-namespace:WpfApp2.Templates.System\">\n\n    <DataTemplate x:Key=\"Summary\">\n        <StackPanel Orientation=\"Horizontal\">\n            <TextBlock Text=\"γ id: \" />\n            <TextBlock Text=\"{Binding Id}\" Foreground=\"Green\" />\n            <TextBlock Text=\", name: \" />\n            <TextBlock Text=\"{Binding}\" Foreground=\"Green\" />\n        </StackPanel>\n    </DataTemplate>\n\n    <DataTemplate x:Key=\"Detail\">\n        <Grid>\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"auto\" />\n                <RowDefinition Height=\"auto\" />\n                <RowDefinition Height=\"auto\" />\n            </Grid.RowDefinitions>\n            <Grid.ColumnDefinitions>\n                <ColumnDefinition Width=\"auto\" />\n                <ColumnDefinition Width=\"auto\" />\n            </Grid.ColumnDefinitions>\n\n            <TextBlock Text=\"γ\" Grid.Row=\"0\" Grid.ColumnSpan=\"2\" Foreground=\"Green\"/>\n\n            <TextBlock Text=\"Id\" Grid.Row=\"1\" Grid.Column=\"0\"/>\n            <TextBlock Text=\"{Binding Id}\" Grid.Row=\"1\" Grid.Column=\"1\"/>\n\n            <TextBlock Text=\"Id\" Grid.Row=\"2\" Grid.Column=\"0\"/>\n            <TextBlock Text=\"{Binding Name}\" Grid.Row=\"2\" Grid.Column=\"1\"/>\n        </Grid>\n    </DataTemplate>\n\n</ResourceDictionary>"
  },
  {
    "path": "Demo/2018/TemplateSelector/WpfApp2.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <LanguageTargets Condition=\"Exists('$(MSBuildProjectDirectory)\\$(AssemblyName).csproj')\">$(MSBuildToolsPath)\\Microsoft.CSharp.targets</LanguageTargets>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>net472</TargetFramework>\n    <StartupObject>WpfApp2.App</StartupObject>\n    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <!-- App.xaml -->\n    <ApplicationDefinition Include=\"App.xaml\" SubType=\"Designer\" Generator=\"MSBuild:XamlIntelliSenseFileGenerator\" />\n    <!-- XAML elements -->\n    <Page Include=\"**\\*.xaml\" SubType=\"Designer\" Generator=\"MSBuild:Compile\" Exclude=\"App.xaml\" />\n    <Compile Update=\"**\\*.xaml.cs\" SubType=\"Designer\" DependentUpon=\"%(Filename)\" />\n    <Compile Update=\"$(IntermediateOutputPath)**\\*.g.cs\" Visible=\"false\" />\n  </ItemGroup>\n\n</Project>"
  },
  {
    "path": "Demo/2018/WpfNewCsproj1/WpfNewCsproj1/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.7.1\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/2018/WpfNewCsproj1/WpfNewCsproj1/App.xaml",
    "content": "﻿<Application x:Class=\"WpfNewCsproj1.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:WpfNewCsproj1\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Demo/2018/WpfNewCsproj1/WpfNewCsproj1/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing System.Windows;\n\nnamespace WpfNewCsproj1\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2018/WpfNewCsproj1/WpfNewCsproj1/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"WpfNewCsproj1.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:WpfNewCsproj1\"\n        mc:Ignorable=\"d\"\n        Title=\"MainWindow\" Height=\"450\" Width=\"800\">\n    <Grid>\n        \n    </Grid>\n</Window>\n"
  },
  {
    "path": "Demo/2018/WpfNewCsproj1/WpfNewCsproj1/MainWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\n\nnamespace WpfNewCsproj1\n{\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/WpfNewCsproj1/WpfNewCsproj1/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace WpfNewCsproj1.Properties\n{\n\n\n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources\n    {\n\n        private static global::System.Resources.ResourceManager resourceMan;\n\n        private static global::System.Globalization.CultureInfo resourceCulture;\n\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources()\n        {\n        }\n\n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager\n        {\n            get\n            {\n                if ((resourceMan == null))\n                {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"WpfNewCsproj1.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n\n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture\n        {\n            get\n            {\n                return resourceCulture;\n            }\n            set\n            {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/WpfNewCsproj1/WpfNewCsproj1/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Demo/2018/WpfNewCsproj1/WpfNewCsproj1/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace WpfNewCsproj1.Properties\n{\n\n\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"11.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase\n    {\n\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n\n        public static Settings Default\n        {\n            get\n            {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2018/WpfNewCsproj1/WpfNewCsproj1/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "Demo/2018/WpfNewCsproj1/WpfNewCsproj1/WpfNewCsproj1.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\" ToolsVersion=\"15.0\">\n  <PropertyGroup>\n    <LanguageTargets Condition=\"Exists('$(MSBuildProjectDirectory)\\$(AssemblyName).csproj')\">$(MSBuildToolsPath)\\Microsoft.CSharp.targets</LanguageTargets>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>net471</TargetFramework>\n    <StartupObject>WpfNewCsproj1.App</StartupObject>\n    <AssemblyName>WpfNewCsproj1</AssemblyName>\n    <RootNamespace>WpfNewCsproj1</RootNamespace>\n    <Version>1.0.0</Version>\n    <TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"WindowsBase\" />\n    <!-- App.xaml -->\n    <ApplicationDefinition Include=\"App.xaml\" SubType=\"Designer\" Generator=\"MSBuild:XamlIntelliSenseFileGenerator\" />\n    <!-- XAML elements -->\n    <Page Include=\"**\\*.xaml\" SubType=\"Designer\" Generator=\"MSBuild:Compile\" Exclude=\"App.xaml\" />\n    <Compile Update=\"**\\*.xaml.cs\" SubType=\"Designer\" DependentUpon=\"%(Filename)\" />\n    <Compile Update=\"$(IntermediateOutputPath)**\\*.g.cs\" Visible=\"false\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "Demo/2018/WpfNewCsproj1/WpfNewCsproj1.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28010.2003\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WpfNewCsproj1\", \"WpfNewCsproj1\\WpfNewCsproj1.csproj\", \"{204EDA34-1F71-486B-982F-2C338A35F3D5}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{204EDA34-1F71-486B-982F-2C338A35F3D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{204EDA34-1F71-486B-982F-2C338A35F3D5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{204EDA34-1F71-486B-982F-2C338A35F3D5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{204EDA34-1F71-486B-982F-2C338A35F3D5}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {E2214538-40EB-4A70-920F-E24230F4F9B3}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2018/WpfNewCsproj1/readme.md",
    "content": "# SDK-based WPF apps\n\n今年に入って、WPF プロジェクトでも SDK-based な csproj 満足に使えるようになってそう。\n\n参考:\n\n- https://github.com/dotnet/project-system/issues/1467#issuecomment-362963386\n\n(2月くらいのコメントなので、たぶん、VS 15.7 から。)\n\nこのフォルダー以下にあるのは、\n\n- テンプレ通りに WPF プロジェクトを作成\n- 上記 URL の内容に沿って csproj を書き換え\n- AssemblyInfo.cs を削除\n\nってやったもの。\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/BoolExhaustiveness.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.28307.329\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"BoolOtherThan01\", \"BoolOtherThan01\\BoolOtherThan01.csproj\", \"{799A1846-0937-439F-9DF4-3F4F71CB43C5}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"BoolMarshaling\", \"BoolMarshaling\\BoolMarshaling.csproj\", \"{746B4991-9D80-45B7-B3B7-59B7CD0E01B0}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Csharp8\", \"Csharp8\\Csharp8.csproj\", \"{BF867795-8301-4E34-B2BC-44571816601F}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{799A1846-0937-439F-9DF4-3F4F71CB43C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{799A1846-0937-439F-9DF4-3F4F71CB43C5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{799A1846-0937-439F-9DF4-3F4F71CB43C5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{799A1846-0937-439F-9DF4-3F4F71CB43C5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{746B4991-9D80-45B7-B3B7-59B7CD0E01B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{746B4991-9D80-45B7-B3B7-59B7CD0E01B0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{746B4991-9D80-45B7-B3B7-59B7CD0E01B0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{746B4991-9D80-45B7-B3B7-59B7CD0E01B0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{BF867795-8301-4E34-B2BC-44571816601F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BF867795-8301-4E34-B2BC-44571816601F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BF867795-8301-4E34-B2BC-44571816601F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BF867795-8301-4E34-B2BC-44571816601F}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {A9365F72-89CF-4EA9-A78F-0653D74C162E}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/BoolMarshaling/BoolMarshaling.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.2</TargetFramework>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Update=\"rust\\target\\debug\\lib.dll\">\n      <Link>lib.dll</Link>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n\n  <Target Name=\"PreBuild\" BeforeTargets=\"PreBuildEvent\">\n    <Exec Command=\"pushd rust&#xD;&#xA;cargo build&#xD;&#xA;popd\" />\n  </Target>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/BoolMarshaling/Program.cs",
    "content": "﻿namespace BoolMarshaling\n{\n    using System;\n    using System.Runtime.InteropServices;\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            // 素通し。当然、2。\n            byte a = Id(2);\n            Console.WriteLine(a);\n\n            // 素通しじゃなくて、bool で値を受け取り。true。\n            bool b = ToBool(2);\n            Console.WriteLine(b);\n\n            unsafe\n            {\n                // 内部表現を見てみると、1 になってる。\n                byte b1 = *(byte*)&b;\n                Console.WriteLine(b1);\n            }\n        }\n\n        /// <summary>\n        /// rust 側の id 関数は i8 を素通しするだけ。\n        /// それを DllImport で呼んでるので、このメソッドも素通し。\n        /// </summary>\n        [DllImport(\"lib.dll\", EntryPoint = \"id\")]\n        private static extern byte Id(byte x);\n\n        /// <summary>\n        /// マーシャリングで、byte な戻り値を bool で受け取ることができる。\n        /// ただ、この場合、素通しではなくて、ちゃんと 戻り値 != 0 で bool に変換されているみたい。\n        /// </summary>\n        [DllImport(\"lib.dll\", EntryPoint = \"id\")]\n        private static extern bool ToBool(byte x);\n    }\n}\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/BoolMarshaling/rust/Cargo.toml",
    "content": "[package]\nname = \"convert\"\nversion = \"0.1.0\"\nauthors = [\"ufcpp\"]\n\n[lib]\nname=\"lib\"\ncrate-type = [\"dylib\"]\n\n[dependencies]\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/BoolMarshaling/rust/src/lib.rs",
    "content": "#[no_mangle]\npub extern fn id(x: i8) -> i8 { x }\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/BoolMarshaling/rust/target/.rustc_info.json",
    "content": "{\"rustc_fingerprint\":13395020344006600436,\"outputs\":{\"1464629490410732173\":[\"___.exe\\nlib___.rlib\\n___.dll\\n___.dll\\n___.lib\\n___.dll\\nC:\\\\Users\\\\xii-h\\\\.rustup\\\\toolchains\\\\stable-x86_64-pc-windows-msvc\\ndebug_assertions\\nproc_macro\\ntarget_arch=\\\"x86_64\\\"\\ntarget_endian=\\\"little\\\"\\ntarget_env=\\\"msvc\\\"\\ntarget_family=\\\"windows\\\"\\ntarget_feature=\\\"fxsr\\\"\\ntarget_feature=\\\"sse\\\"\\ntarget_feature=\\\"sse2\\\"\\ntarget_os=\\\"windows\\\"\\ntarget_pointer_width=\\\"64\\\"\\nwindows\\n\",\"\"],\"1164083562126845933\":[\"rustc 1.32.0 (9fda7c223 2019-01-16)\\nbinary: rustc\\ncommit-hash: 9fda7c2237db910e41d6a712e9a2139b352e558b\\ncommit-date: 2019-01-16\\nhost: x86_64-pc-windows-msvc\\nrelease: 1.32.0\\nLLVM version: 8.0\\n\",\"\"],\"1617349019360157463\":[\"___.exe\\nlib___.rlib\\n___.dll\\n___.dll\\n___.lib\\n___.dll\\nC:\\\\Users\\\\xii-h\\\\.rustup\\\\toolchains\\\\stable-x86_64-pc-windows-msvc\\ndebug_assertions\\nproc_macro\\ntarget_arch=\\\"x86_64\\\"\\ntarget_endian=\\\"little\\\"\\ntarget_env=\\\"msvc\\\"\\ntarget_family=\\\"windows\\\"\\ntarget_feature=\\\"fxsr\\\"\\ntarget_feature=\\\"sse\\\"\\ntarget_feature=\\\"sse2\\\"\\ntarget_os=\\\"windows\\\"\\ntarget_pointer_width=\\\"64\\\"\\nwindows\\n\",\"\"]},\"successes\":{}}"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/BoolOtherThan01/BoolOtherThan01.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.2</TargetFramework>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <StartupObject>BoolOtherThan01.TypeSwitch</StartupObject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.5.2\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/BoolOtherThan01/Pointer.cs",
    "content": "﻿namespace BoolOtherThan01\n{\n    using System;\n\n    class Pointer\n    {\n        static void Main()\n        {\n            unsafe bool toBool(byte b) => *((bool*)&b);\n\n            Branch(false);     // if (false)\n            Branch(true);      // if (true)\n            Branch(toBool(2)); // if (true)\n        }\n\n        static void Branch(bool b)\n        {\n            if (b) Console.WriteLine(\"if (true)\");\n            else Console.WriteLine(\"if (false)\");\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/BoolOtherThan01/Program.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\nnamespace BoolOtherThan01\n{\n    class Program\n    {\n        static void Main()\n        {\n            // 0 → false\n            // 1 → true\n            // それ以外 → if (b) は通るんだけど、switch (b) { case true: } は通らない(C# 7.3 までは)変な値になる。\n            for (byte i = 0; i < 3; i++)\n            {\n                Console.WriteLine($\"value = {i}\");\n                Branch(Pointer(i));\n                Branch(UnsafeAs(i));\n                Branch(UnionStruct(i));\n            }\n        }\n\n        /// <summary>\n        /// false (0) の時は何も表示されない。\n        /// true (1) の時は if(b) switch(b) の両方が表示される。\n        /// 「それ以外の値」を作って渡すと、if(b) だけが表示される。\n        /// </summary>\n        static void Branch(bool b)\n        {\n            if (b) Console.WriteLine(\"    if(b)\");\n            switch (b) { case true: Console.WriteLine(\"    switch(b)\"); break; }\n        }\n\n        private unsafe static bool Pointer(byte b) => *((bool*)&b);\n\n        private static bool UnsafeAs(byte b) => Unsafe.As<byte, bool>(ref b);\n\n        private static bool UnionStruct(byte b)\n        {\n            Union u = default;\n            u.Byte = b;\n            return u.Boolean;\n        }\n\n        [StructLayout(LayoutKind.Explicit)]\n        private struct Union\n        {\n            [FieldOffset(0)]\n            public byte Byte;\n            [FieldOffset(0)]\n            public bool Boolean;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/BoolOtherThan01/StructUnion.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace BoolOtherThan01\n{\n    class StructUnion\n    {\n        static void Main()\n        {\n            bool toBool(byte b)\n            {\n                Union u = default;\n                u.Byte = b;\n                return u.Boolean;\n            }\n\n            Console.WriteLine(toBool(2));\n        }\n\n        [StructLayout(LayoutKind.Explicit)]\n        private struct Union\n        {\n            [FieldOffset(0)]\n            public byte Byte;\n            [FieldOffset(0)]\n            public bool Boolean;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/BoolOtherThan01/TypeSwitch.cs",
    "content": "﻿namespace BoolOtherThan01\n{\n    using System;\n\n    class TypeSwitch\n    {\n        static void Main()\n        {\n            Branch(0);\n            Branch(1);\n            Branch(2);\n        }\n\n        static unsafe void Branch(byte x)\n        {\n            var b = *((bool*)&x);\n\n            Console.WriteLine($\"value = {x}\");\n            Console.Write(\"    traditional switch: \");\n            switch (b)\n            {\n                case false:\n                    Console.WriteLine(\"false\");\n                    break;\n                case true:\n                    Console.WriteLine(\"true\");\n                    break;\n                default:\n                    // 0でも1でもないbool値の時にここに来る\n                    Console.WriteLine(\"other\");\n                    break;\n            }\n\n            Console.Write(\"    type switch: \");\n            switch (b)\n            {\n                case false when true:\n                    Console.WriteLine(\"false\");\n                    break;\n                case true:\n                    Console.WriteLine(\"true\");\n                    break;\n                default:\n                    // 絶対ここは通らない\n                    Console.WriteLine(\"other\");\n                    break;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/BoolOtherThan01/UnsafeClass.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace BoolOtherThan01\n{\n    class UnsafeClass\n    {\n        static void Main()\n        {\n            bool toBool(byte b) => Unsafe.As<byte, bool>(ref b);\n            Console.WriteLine(toBool(2));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/Csharp8/Csharp8.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.2</TargetFramework>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/BoolExhaustiveness/Csharp8/Program.cs",
    "content": "﻿using System;\n\nclass Program\n{\n    static void Main()\n    {\n        Console.WriteLine(X(false)); // -1\n        Console.WriteLine(X(true)); // 1\n\n        unsafe\n        {\n            byte x = 2;\n            bool y = *(bool*)&x;\n            Console.WriteLine(X(y)); // C# 7.0 までは 0 だった。C# 8.0 で 1 になるように。\n        }\n    }\n\n    static int X(bool b)\n    {\n        switch (b)\n        {\n            case false: return -1;\n            case true: return 1;\n            default: return 0;     // C# 7.0 までは何も言われなかった。C# 8.0 で「到達できないコード」警告出るように。\n        }\n    }\n}"
  },
  {
    "path": "Demo/2019/Csharp80/Csharp80.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28516.95\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Preview1\", \"Preview1\\Preview1.csproj\", \"{D57DE3BD-28BD-43D9-987F-C893CC7DA059}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Preview2\", \"Preview2\\Preview2.csproj\", \"{61296D7F-CDE3-4F82-990E-933F9CED99C8}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Preview3\", \"Preview3\\Preview3.csproj\", \"{5FB47155-BBDD-44C1-9010-993D3E7F49FA}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"VS16_1_p1\", \"VS16_1_p1\\VS16_1_p1.csproj\", \"{1A7C75CA-9B40-4EFA-828A-8639806286AC}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"VS16_1_p2\", \"VS16_1_p2\\VS16_1_p2.csproj\", \"{ECB2A894-A11A-4E0C-AC3F-967F3CCCE11B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{D57DE3BD-28BD-43D9-987F-C893CC7DA059}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D57DE3BD-28BD-43D9-987F-C893CC7DA059}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D57DE3BD-28BD-43D9-987F-C893CC7DA059}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D57DE3BD-28BD-43D9-987F-C893CC7DA059}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{61296D7F-CDE3-4F82-990E-933F9CED99C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{61296D7F-CDE3-4F82-990E-933F9CED99C8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{61296D7F-CDE3-4F82-990E-933F9CED99C8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{61296D7F-CDE3-4F82-990E-933F9CED99C8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5FB47155-BBDD-44C1-9010-993D3E7F49FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5FB47155-BBDD-44C1-9010-993D3E7F49FA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5FB47155-BBDD-44C1-9010-993D3E7F49FA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5FB47155-BBDD-44C1-9010-993D3E7F49FA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1A7C75CA-9B40-4EFA-828A-8639806286AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1A7C75CA-9B40-4EFA-828A-8639806286AC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1A7C75CA-9B40-4EFA-828A-8639806286AC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1A7C75CA-9B40-4EFA-828A-8639806286AC}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{ECB2A894-A11A-4E0C-AC3F-967F3CCCE11B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{ECB2A894-A11A-4E0C-AC3F-967F3CCCE11B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{ECB2A894-A11A-4E0C-AC3F-967F3CCCE11B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{ECB2A894-A11A-4E0C-AC3F-967F3CCCE11B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {AA2E4851-C690-4E3F-8A4A-5064BDAD39F6}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview1/AsyncStreams.cs",
    "content": "﻿#if false // 今バグってる。Preview 2で治るはず\n// 原因は、Roslyn の方と corefx の方で違うブランチでリリースしちゃったから。\n// AsyncIterator に求められる型の名前とかがずれてる。\n\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace Cs8InVs2019P1.AsyncStreams\n{\n    class Program\n    {\n        // 非同期イテレーター … await/yield混在\n        static async IAsyncEnumerable<int> AsyncIterator()\n        {\n            await Task.Delay(1);\n            yield return 1;\n            await Task.Delay(1);\n            yield return 2;\n        }\n\n        // 非同期 foreach … IAsyncEnumerable からの列挙\n        static async Task AsyncForeach(IAsyncEnumerable<int> items)\n        {\n            await foreach (var item in items)\n            {\n                Console.WriteLine(item);\n            }\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview1/InterpolatedVerbatimStrings.cs",
    "content": "﻿namespace Cs8InVs2019P1.InterpolatedVerbatimStrings\n{\n    class Program\n    {\n        static void Main()\n        {\n            var x = 1;\n\n            // こっちは C# 6.0 からあるやつ。\n            var s1 = $@\"\\\\\\ {x}\";\n\n            // これまでは $ と @ の順番逆にできなかった。\n            // C# 8.0 から @$ でも OK。\n            var s2 = @$\"\\\\\\ {x}\";\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview1/NRT.cs",
    "content": "﻿namespace Cs8InVs2019P1.NRT\n{\n// 有効にするには #nullable ディレクティブが必要。\n#nullable enable\n\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            Console.WriteLine(LengthSum(\"abc\", \"xyz\"));\n            Console.WriteLine(LengthSum(\"abc\", null));\n        }\n\n        static int LengthSum(string a, string? b)\n        {\n#if false\n            // こう書いてしまうと b. のところで警告。\n            var len0 = a.Length + b.Length;\n\n            // これなら OK。b?. なので、b の null チェック済み。\n            var len1 = a.Length + b?.Length ?? 0;\n#endif\n\n            // こんな感じで if で null チェックしても OK。\n            // チェック済みな個所では b. で大丈夫。\n            var len = a.Length;\n            if(b != null) len += b.Length;\n\n            return len;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview1/NullCoalescingAssignment.cs",
    "content": "﻿namespace Cs8InVs2019P1.NullCoalescingAssignment\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            NullCoalescingAssignment(\"abc\"); // \"abc\" が表示される\n            NullCoalescingAssignment(null);  // \"default string\" が表示される\n        }\n\n        static void NullCoalescingAssignment(string s)\n        {\n            s ??= \"default string\";\n            Console.WriteLine(s);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview1/Preview1.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <LangVersion>8.0</LangVersion>\n    <StartupObject>Cs8InVs2019P1.InterpolatedVerbatimStrings.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview1/Range2D.cs",
    "content": "﻿namespace Cs8InVs2019P1.Range2D\n{\n    using System;\n\n    static class Matrix\n    {\n        public static int[,] Slice(this int[,] m,\n            int xMinInclusive, int xMaxExclusive,\n            int yMinInclusive, int yMaxExclusive)\n        {\n            var n = new int[yMaxExclusive - yMinInclusive, xMaxExclusive - xMinInclusive];\n\n            for (int y = yMinInclusive, j = 0; y < yMaxExclusive; y++, j++)\n                for (int x = xMinInclusive, i = 0; x < xMaxExclusive; x++, i++)\n                    n[j, i] = m[y, x];\n\n            return n;\n        }\n    }\n\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var m = new[,]\n            {\n                { 1, 2, 3, 4 },\n                { 5, 6, 7, 8 },\n                { 9, 10, 11, 12 },\n            };\n\n            // (x, y) が (1, 2) ～ (3, 4) の範囲？\n            // x が 1～2、y が 3～4 の範囲？\n            // 2, 4 は含む？含まない？\n            var n = m.Slice(1, 2, 3, 4);\n\n            foreach (int x in n)\n            {\n                Console.WriteLine(x);\n            }\n\n            var i = 2;\n            var r = i..i - 1;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview1/RangeAndIndex.cs",
    "content": "﻿namespace Cs8InVs2019P1.RangeAndIndex\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            Span<int> data = new[] { 0, 1, 2, 3, 4, 5 };\n\n            // 1～2要素目。2 は exclusive。なので、表示されるのは 1 だけ。\n            Write(data[1..2]);\n\n            // 先頭から1～末尾から1。 1, 2, 3, 4\n            Write(data[1..^1]);\n\n            // 先頭～末尾から1。 0, 1, 2, 3, 4\n            Write(data[..^1]);\n\n            // 先頭から1～末尾。 1, 2, 3, 4, 5\n            Write(data[1..]);\n\n            // 全体。0, 1, 2, 3, 4, 5\n            Write(data[..]);\n        }\n\n        // .NET Core 3.0 には Span<int> に Range 型を受け取るインデクサーが入る予定。\n        // Preview 1 以降なら実装入ってるっぽい。\n        // Preview 1 以前の daily build な .NET Core 3.0 を使ってて、「なぜかまだない」と思ってこのメソッド実装しちゃったけど、不要。\n        static Span<int> Slice(Span<int> data, Range range)\n        {\n#if ForOlderVersion\n            int getIndex(int length, Index i) => i.FromEnd ? length - i.Value : i.Value;\n            var s = getIndex(data.Length, range.Start);\n            var e = getIndex(data.Length, range.End);\n            return data.Slice(s, e - s);\n#else\n            return data[range];\n#endif\n        }\n\n        // 表示確認用。Span の中身を , 区切り表示。\n        static void Write<T>(Span<T> items)\n        {\n            var first = true;\n            foreach (var x in items)\n            {\n                if (first) first = false;\n                else Console.Write(\", \");\n                Console.Write(x);\n            }\n            Console.WriteLine();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview1/ThrowHelper.cs",
    "content": "﻿namespace System\n{\n    internal class ThrowHelper\n    {\n        internal static void ThrowValueArgumentOutOfRange_NeedNonNegNumException() => throw new ArgumentOutOfRangeException(\"need non negative number\");\n    }\n}"
  },
  {
    "path": "Demo/2019/Csharp80/Preview2/AsyncStreams.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace Cs8InVs2019P1.AsyncStreams\n{\n    class Program\n    {\n        static async Task Main()\n        {\n            await AsyncForeach(AsyncIterator());\n        }\n\n        // 非同期イテレーター … await/yield混在\n        static async IAsyncEnumerable<int> AsyncIterator()\n        {\n            await Task.Delay(1);\n            yield return 1;\n            await Task.Delay(1);\n            yield return 2;\n        }\n\n        // 非同期 foreach … IAsyncEnumerable からの列挙\n        static async Task AsyncForeach(IAsyncEnumerable<int> items)\n        {\n            await foreach (var item in items)\n            {\n                Console.WriteLine(item);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview2/AsyncStreamsOptionalParamater.cs",
    "content": "﻿namespace Preview2.AsyncStreamsOptionalParamater\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Threading;\n    using System.Threading.Tasks;\n\n    // awai foreach はデフォルト引数と params 引数がついてる GetAsyncEnumerator を選んでくれる。\n    // インターフェイスの明示的実装よりも優先度は上。\n    //\n    // 拡張メソッドは相変わらず await foreach でもダメ。インターフェイスよりも優先度を低くするなら拡張メソッドも対応させてもいいかもしれないけど、\n    // 他の機能(クエリ式(Select, Where, ...)、await (GetAwaiter)、分解(Deconstruct)、コレクション初期化子(Add) との整合性が取れないので悩ましいらしい。\n    //\n    // 元々あった foreach は結局、破壊的変更になるから仕様を変えれなかったらしい。\n    // デフォルト引数、params 引数は受け付けないまま。\n\n    public struct DummyAsyncEnemerator : IAsyncEnumerator<int>\n    {\n        public DummyAsyncEnemerator(string message) => Console.WriteLine(message);\n        public int Current => 0;\n        public ValueTask<bool> MoveNextAsync() => new ValueTask<bool>(false);\n        public ValueTask DisposeAsync() => default;\n    }\n\n    // インターフェイスの実装は要らない。パターンベース。\n    struct A\n    {\n        public DummyAsyncEnemerator GetAsyncEnumerator(CancellationToken cancellationToken = default) => new DummyAsyncEnemerator(\"A instance\"); // 1個しかないので当然これが呼ばれる\n    }\n\n    // インスタンスメソッドとインターフェイス明示的実装がある場合、インスタンスメソッド優先\n    struct B : IAsyncEnumerable<int>\n    {\n        public DummyAsyncEnemerator GetAsyncEnumerator(CancellationToken cancellationToken = default) => new DummyAsyncEnemerator(\"B instance\"); // こっちが呼ばれる\n        IAsyncEnumerator<int> IAsyncEnumerable<int>.GetAsyncEnumerator(CancellationToken cancellationToken) => new DummyAsyncEnemerator(\"B explicit interface\");\n    }\n\n    // 同期版の foreach と違って、await foreach はデフォルト引数/paramsを見てくれる。\n    // しかも、インターフェイス明示的実装よりも優先度高い。\n    struct C : IAsyncEnumerable<int>\n    {\n        public DummyAsyncEnemerator GetAsyncEnumerator(CancellationToken cancellationToken = default, int dummy = 0) => new DummyAsyncEnemerator(\"C instance\"); // こっちが呼ばれる\n        IAsyncEnumerator<int> IAsyncEnumerable<int>.GetAsyncEnumerator(CancellationToken cancellationToken) => new DummyAsyncEnemerator(\"C explicit interface\");\n    }\n\n    // C 参照。 params 版。\n    struct D : IAsyncEnumerable<int>\n    {\n        public DummyAsyncEnemerator GetAsyncEnumerator(CancellationToken cancellationToken = default, params int[] dummy) => new DummyAsyncEnemerator(\"D instance\"); // こっちが呼ばれる\n        IAsyncEnumerator<int> IAsyncEnumerable<int>.GetAsyncEnumerator(CancellationToken cancellationToken) => new DummyAsyncEnemerator(\"D explicit interface\");\n    }\n\n    // 拡張メソッドは見てくれない。\n    // これは foreach で使おうとするとコンパイル時にエラー\n    struct E\n    {\n    }\n\n    static class Ex\n    {\n        public static DummyAsyncEnemerator GetAsyncEnumerator(this E x, CancellationToken cancellationToken = default) => new DummyAsyncEnemerator(\"E extension\");\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            M();\n        }\n\n        private static async ValueTask M()\n        {\n            await foreach (var x in new A()) { }\n            await foreach (var x in new B()) { }\n            await foreach (var x in new C()) { }\n            await foreach (var x in new D()) { }\n            //await foreach (var x in new E()) { } コメントを外すとエラーに\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview2/BoolExhaustiveness.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace Preview2.BoolExhaustiveness\n{\n    class Program\n    {\n        static void Main()\n        {\n            Console.WriteLine(BoolToInt(false)); // 0\n            Console.WriteLine(BoolToInt(true)); // 1\n            Console.WriteLine(BoolToInt(GetBool(2))); // C# 7.3 までは -1、C# 8.0 では 1\n        }\n\n        static int BoolToInt(bool b)\n        {\n            // C# 8.0 から、この switch が if (b) return 1; else return 0; に最適化されるようになった。\n            // 要は、「0 でなければ true」という扱い。\n            //\n            // その代わり、case に false/true が並んでれば「全パターンを網羅」判定を受けるようになった。\n            // (「確実な代入」ルールとか、switch 式の網羅性チェックで便利。)\n            switch (b)\n            {\n                case false: return 0;\n                case true: return 1;\n\n                // unsafe コードとかを使えば false でも true でもない値を作れる。\n                // C# 7.3 までは、そういう「false でも true でもない値」を渡すとここに来てた。\n                // C# 8.0 では case true の方に行くようになったので、このコードは「到達不能なコードがある」警告が出るようになった。\n                default: return -1;\n            }\n        }\n\n        static bool GetBool(byte b)\n        {\n            var u = new Union();\n            u.Byte = b;\n            return u.Boolean;\n        }\n\n        [StructLayout(LayoutKind.Explicit)]\n        struct Union\n        {\n            [FieldOffset(0)]\n            public byte Byte;\n            [FieldOffset(0)]\n            public bool Boolean;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview2/EnhancedUsing.cs",
    "content": "﻿namespace Preview2.EnhancedUsing\n{\n    using System;\n\n    readonly ref struct DeferredMessage\n    {\n        private readonly string _message;\n        public DeferredMessage(string message) => _message = message;\n\n        // using で使うのに、IDisposable インターフェイス実装が要らない。\n        // ただ、既存コードを壊さないようにするためには、ref struct の場合限定らしい。\n        // 普通のクラス・構造体の場合、IDisposable インターフェイス実装が必須。\n        public void Dispose() => Console.WriteLine(_message);\n\n        // ちなみに、int x = 0 とか params int[] x とか、オプション引数があっても OK。ちゃんと using で使えて、 Dispose が呼ばれる。\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // using var で、変数のスコープに紐づいた using になる。\n            // スコープを抜けるときに Dispose が呼ばれる。\n            using var a = new DeferredMessage(\"a\");\n            using var b = new DeferredMessage(\"b\");\n\n            Console.WriteLine(\"c\");\n\n            // c, b, a の順でメッセージが表示される\n        }\n\n        // Preview 2 ではまだみたいだけど、\n        // C# 8.0 リリース版までには、foreach も pattern-based なものが認められるようになるはず。\n        // foreach は最後に Dispose を呼ぶ仕様になってるけども、それも、pattern-based に。\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview2/PatternBasedAsyncUsing.cs",
    "content": "﻿namespace Preview2.PatternBasedAsyncUsing\n{\n    using System;\n    using System.Runtime.CompilerServices;\n    using System.Threading.Tasks;\n\n    // 非同期 using は別に IAsyncDisposable インターフェイスの実装を求めない。\n    class AsyncDisposable\n    {\n        // ちゃんと await using のブロックの最後で呼ばれる。\n        // 戻り値の型が Task や ValueTask である必要もない。\n        public MyAwaitable DisposeAsync()\n        {\n            Console.WriteLine(\"disposed async\");\n            return default;\n        }\n    }\n\n    struct MyAwaitable<T> { public ValueTaskAwaiter<T> GetAwaiter() => default; }\n    struct MyAwaitable { public ValueTaskAwaiter GetAwaiter() => default; }\n\n    class Program\n    {\n        static async Task Main()\n        {\n            await using(new AsyncDisposable())\n            {\n                Console.WriteLine(\"iside using\");\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview2/PatternBasedUsing.cs",
    "content": "﻿namespace Preview2.PatternBasedUsing\n{\n    using System;\n\n    // これまで通り、using で使える型。\n    struct Disposable : IDisposable\n    {\n        public void Dispose() { }\n    }\n\n    // 残念ながら IDisposable を実装していないと using で使えない。\n    struct NonDisposable\n    {\n        public void Dispose() { }\n    }\n\n    // となると、インターフェイスを実装できない ref struct で困っていた。\n    // ref struct の場合、IDisposable なしでも Dispose メソッドさえあれば using で使えるようになった。\n    ref struct RefDisposable\n    {\n        public void Dispose() { }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // この行は元々 OK。\n            using (new Disposable()) { }\n\n#if false\n            // 残念ながら今でもコンパイル エラーに。\n            using (new NonDisposable()) { }\n#endif\n\n            // C# 8.0 で、これは OK になった。\n            using (new RefDisposable()) { }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview2/PatternBasedUsingForeach.cs",
    "content": "﻿namespace Preview2.PatternBasedUsingForeach\n{\n    using System;\n\n    // GetEnumerator/MoveNext/Current は元々パターン ベース。\n    // ただ、Dispose の呼び出しだけは IDisposable の実装が必須だった。\n    // C# 8.0 で、ref struct の場合はパターン ベースで Dispose メソッドを呼んでもらえるように。\n    ref struct RefEnumerable\n    {\n        public RefEnumerable GetEnumerator() => this;\n        public int Current => 0;\n        public bool MoveNext() => false;\n        public void Dispose() => Console.WriteLine(\"ref disposed\");\n    }\n\n    // RefEnumerable と比べて、 ref を取っただけ。\n    struct BrokenEnumerable\n    {\n        public BrokenEnumerable GetEnumerator() => this;\n        public int Current => 0;\n        public bool MoveNext() => false;\n\n        // この Dispose は呼ばれない。\n        // ref struct でない場合、IDisposable インターフェイスの実装が必須。\n        public void Dispose() => Console.WriteLine(\"broken disposed\");\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            // ref disposed は表示される。\n            foreach (var _ in new RefEnumerable()) ;\n\n            // broken disposed は表示されない。\n            // コンパイル エラーにはならないので特に注意。\n            foreach (var _ in new BrokenEnumerable()) ;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview2/Preview2.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <LangVersion>8.0</LangVersion>\n    <NullableContextOptions>Enable</NullableContextOptions>\n    <StartupObject>Preview2.PatternBasedUsingForeach.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview2/RecursivePattern.cs",
    "content": "﻿namespace Preview2.RecursivePattern\n{\n    using System;\n\n    public class Program\n    {\n        static void Main()\n        {\n            var x = Node.X;\n            Console.WriteLine(x * x + 1);\n            Console.WriteLine(((1 * x + 0 * x) * 1).Simplify());\n            Console.WriteLine(((x + 2) * (x + 3)).Calculate(1));\n        }\n    }\n\n    public static class NodeExtensions\n    {\n        public static int Calculate(this Node n, int x)\n            => n switch\n        {\n            Var _ => x,\n            Const c => c.Value,\n            Add (var l, var r) => l.Calculate(x) + r.Calculate(x),\n            Mul (var l, var r) => l.Calculate(x) * r.Calculate(x),\n            _ => throw new InvalidOperationException()\n        };\n\n        public static Node Simplify(this Node n)\n            => n switch\n        {\n            Add (var l, var r) => (l.Simplify(), r.Simplify()) switch\n            {\n                (Const (0), var r1) => r1,\n                (var l1, Const (0)) => l1,\n                (var l1, var r1) => new Add(l1, r1)\n            },\n            Mul (var l, var r) => (l.Simplify(), r.Simplify()) switch\n            {\n                (Const (0) c, _) => c,\n                (_, Const (0) c) => c,\n                (Const (1), var r1) => r1,\n                (var l1, Const (1)) => l1,\n                (var l1, var r1) => new Mul(l1, r1)\n            },\n            _ => n\n        };\n    }\n\n    public abstract class Node\n    {\n        public static readonly Node X = new Var();\n        public static implicit operator Node(int value) => new Const(value);\n        public static Node operator +(Node left, Node right) => new Add(left, right);\n        public static Node operator *(Node left, Node right) => new Mul(left, right);\n    }\n\n    public class Var : Node { public override string ToString() => \"x\"; }\n\n    public class Const : Node\n    {\n        public int Value { get; }\n        public Const(int value) { Value = value; }\n        public void Deconstruct(out int value) => value = Value;\n        public override string ToString() => Value.ToString();\n    }\n\n    public class Add : Node\n    {\n        public Node Left { get; }\n        public Node Right { get; }\n        public Add(Node left, Node right) => (Left, Right) = (left, right);\n        public void Deconstruct(out Node left, out Node right) => (left, right) = (Left, Right);\n        public override string ToString() => $\"({Left.ToString()} + {Right.ToString()})\";\n    }\n\n    public class Mul : Node\n    {\n        public Node Left { get; }\n        public Node Right { get; }\n        public Mul(Node left, Node right) => (Left, Right) = (left, right);\n        public void Deconstruct(out Node left, out Node right) => (left, right) = (Left, Right);\n        public override string ToString() => $\"{Left.ToString()} * {Right.ToString()}\";\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview2/Shadowing.cs",
    "content": "﻿namespace Preview2.Shadowing\n{\n    class Program\n    {\n        static void Main()\n        {\n            // ローカル関数内の引数・変数、その上位スコープと同じ名前を付けれるようになったみたい。\n            // (上位スコープのやつを隠しちゃうので、shadowing って言う。)\n            var (x, y) = (1, 2);\n\n            // C# 7.3 までは、この引数とか変数の x, y でエラーになってた\n            int a(int x, int y) => x + y;\n\n            // キャプチャした変数なのかシャドーイングした変数なのかで紛らわしいので、\n            // 使うなら static ローカル関数(キャプチャできない)とセットで使うべきかも。\n            static int b() { int x = 0; return x; }\n\n            a(x, y);\n            b();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview2/StaticLocalFunction.cs",
    "content": "﻿namespace Preview2.StaticLocalFunction\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            NormalLocalFunction();\n            StaticLocalFunction();\n        }\n\n        static void NormalLocalFunction()\n        {\n            int n = 0;\n\n            // 通常、ローカル関数はこんな感じで外のローカル変数を拾える。\n            // けどもうかつにそれをやってしまうと結構パフォーマンス的にはペナルティ食らうので、\n            // 「ローカル変数を拾いたくない」という意図を表明できる文法が求められてた。\n            int a(int x) => n * x;\n\n            n = 2;\n            Console.WriteLine(a(3)); //6\n        }\n\n        static void StaticLocalFunction()\n        {\n            // ローカル関数に static を付けると、ローカル変数をキャプチャできなくなる。\n            static int a(int x) => 2 * x;\n\n#if false\n            // 以下のコードは2行目の n のところでエラーに。\n            int n = 0;\n            static int a(int x) => n * x;\n#endif\n\n            Console.WriteLine(a(3)); //6\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview3/PatternBasedForeach.cs",
    "content": "﻿namespace Preview2.PatternBasedAsyncForeach\n{\n    // Preview 3 はほぼバグ修正程度の変更しかされてなさそう。\n    // とりあえず、\n    // - pattern-based で foreach 後の Dispose が呼ばれるようになった\n    // - DisposeAsync の戻り値が ValueTask である必要がなくなった\n\n    using System;\n    using System.Runtime.CompilerServices;\n    using System.Threading.Tasks;\n\n    // 非同期 foreach/非同期 using\n    // MoveNextAsync, DisposeAsync の戻り値は ValueTask じゃなくてもいい。\n    // Async 版の場合は無条件に pattern-based に DisposeAsync を呼んでもらえる。\n    class MyAsyncEnumerable\n    {\n        public MyAsyncEnumerable GetAsyncEnumerator() => this;\n        public int Current => 0;\n\n        // ValueTask<bool> ではなく任意の awaitable が使える。\n        public MyAwaitable<bool> MoveNextAsync() => default;\n\n        // 同上。任意の awaitable が使える。\n        public MyAwaitable DisposeAsync()\n        {\n            Console.WriteLine(\"disposed async\");\n            return default;\n        }\n    }\n\n    struct MyAwaitable<T> { public ValueTaskAwaiter<T> GetAwaiter() => default; }\n    struct MyAwaitable { public ValueTaskAwaiter GetAwaiter() => default; }\n\n    class Program\n    {\n        static async Task Main()\n        {\n            await foreach (var x in new MyAsyncEnumerable()) { }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview3/PatternTrailingComma.cs",
    "content": "﻿namespace Preview3.PatternTrailingComma\n{\n    class Program\n    {\n        static bool M((int a, int b) t)\n            => t is\n        {\n            a: 1,\n            b: 2, // この、最後の1個の , が OK になった。\n        };\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview3/Preview3.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <LangVersion>8.0</LangVersion>\n    <NullableContextOptions>Enable</NullableContextOptions>\n    <StartupObject>Preview3.PatternBasedForeach.Program</StartupObject>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/Csharp80/Preview3/SwitchTrailingComma.cs",
    "content": "﻿namespace Preview3.SwitchTrailingComma\n{\n    // switch 式で、最後の1個の , が OK になった。\n    // ただ、Preview 3 ではなんかバグがあるみたいで、switch 式を入力してると IntelliSense が狂るって最終的には Visual Studio が落ちる。\n\n    class Program\n    {\n        static int M(int i) => i switch\n        {\n            0 => 1,\n            1 => 2,\n            2 => 0,\n            _ => -1, // この、最後の1個の , が OK になった。\n        };\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/VS16_1_p1/Program.cs",
    "content": "﻿using System;\n\nnamespace VS16_1_p1\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Console.WriteLine(\"Hello World!\");\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/VS16_1_p1/UnmanagedGenericStruct.cs",
    "content": "﻿namespace VS16_1_p1.UnmanagedGenericStruct\n{\n    using System;\n    using System.Collections.Generic;\n\n    class Program\n    {\n        static void SafeStackalloc<T>()\n            where T : unmanaged\n        {\n            Span<T> span = stackalloc T[4];\n        }\n\n        static void Main()\n        {\n            // 以前から OK\n            SafeStackalloc<int>(); // 値型\n            SafeStackalloc<DateTime>(); // 値型だけを含む構造体\n\n#if false\n            // 以下はNG\n            SafeStackalloc<string>(); // 参照型\n#endif\n\n            // C# 8.0 で OK になった (ジェネリックな型、入れ子も OK)\n            SafeStackalloc<KeyValuePair<int, int>>();\n            SafeStackalloc<Wrap<int>>();\n            SafeStackalloc<KeyValuePair<(float, bool), Wrap<int>>>();\n        }\n\n        struct Wrap<T>\n            where T : unmanaged\n        {\n            public T Value;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/VS16_1_p1/VS16_1_p1.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <LangVersion>preview</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/Csharp80/VS16_1_p2/InterfaceDefault.cs",
    "content": "﻿namespace VS16_1_p2.InterfaceDefault\n{\n    using System;\n\n    interface IA\n    {\n        void M() => Console.WriteLine(\"A.M\");\n        void N() => Console.WriteLine(\"A.N\");\n\n        struct Inner { }\n    }\n\n    interface IB : IA\n    {\n        new void M() => Console.WriteLine(\"B.M\");\n        void IA.N() => Console.WriteLine(\"B.N\");\n\n\n        static IA.Inner x;\n    }\n\n    interface IC : IA\n    {\n        new void M() => Console.WriteLine(\"C.M\");\n        void IA.N() => Console.WriteLine(\"C.N\");\n    }\n\n    interface ID : IB, IC\n    {\n        void IA.N() => base(IB).N();\n    }\n\n    class X : IB { }\n    class Y : ID { }\n    class Z : IB\n    {\n        public void N() => Console.WriteLine(\"Z.N\");\n    }\n\n    class A\n    {\n        public virtual void M() => Console.WriteLine(\"A\");\n    }\n\n    class B : A\n    {\n        public override void M() => Console.WriteLine(\"B\");\n    }\n\n    class C : B\n    {\n        public override void M() => base(A).M();\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            Console.WriteLine(\"- X\");\n            var x = new X();\n            M((IA)x); // A.M\n            M((IB)x); // B.M\n            N((IA)x); // B.N\n            N((IB)x); // B.N\n\n            Console.WriteLine(\"- Y\");\n            var y = new Y();\n            M((IA)y); // A.M\n            M((IB)y); // B.M\n            M((IC)y); // C.M\n            N((IA)y); // B.N\n            N((IB)y); // B.N\n            N((IC)y); // B.N\n            N((ID)y); // B.N\n\n            Console.WriteLine(\"- Z\");\n            var z = new Z();\n            M((IA)z); // A.M\n            M((IB)z); // B.M\n            N((IA)z); // Z.N\n            N((IB)z); // Z.N\n        }\n\n        static bool X(int? x) => x is {} v;\n\n        static void M(IA a) => a.M();\n        static void M(IB a) => a.M();\n        static void M(IC a) => a.M();\n        //static void X(ID a) => a.Y(); // コンパイルエラー: IB, IC で不明瞭\n\n        static void N(IA a) => a.N();\n        static void N(IB a) => a.N();\n        static void N(IC a) => a.N();\n        static void N(ID a) => a.N();\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/VS16_1_p2/NestedStackalloc.cs",
    "content": "﻿// この手の、式の中に stackalloc 埋め込みをさして「nested contexts」って言ってるみたい。\n// 16.2 Preview 1 でコンパイルできるようになってた。でも、IntelliSense 効いてない。\n\nnamespace VS16_1_p2.NestedStackalloc\n{\n    using System;\n    using System.Threading.Tasks;\n\n    class Program\n    {\n        // Span を受け取る適当なメソッドを用意。\n        static int M(Span<byte> buf) => 0;\n\n        static void M(int len)\n        {\n            // if の条件式中\n            if (stackalloc byte[1] == stackalloc byte[1]) ;\n            M(stackalloc byte[1]);\n\n            // でもこれが今まではダメだった。\n            // C# 8.0 ではコンパイルできる。\n            M(len > 512 ? new byte[len] : stackalloc byte[len]);\n\n            // こういう書き方は C# 7.3 時代からできてた。条件演算子だけ特別扱いしてたらしい。\n            Span<byte> buf = len > 512 ? new byte[len] : stackalloc byte[len];\n        }\n\n        // フィールド初期化子の中でも書ける。\n        int a = M(stackalloc byte[8]);\n\n        static async Task MAsync()\n        {\n            // こういう入れ子の stackalloc の場合、非同期メソッド中でも書ける。\n            M(stackalloc byte[1]);\n\n            await Task.Yield();\n\n            {\n                // これは C# 8.0 でもダメ。\n                // { } でくくってて(await をまたがない状態)もダメ。\n                Span<byte> buf = stackalloc byte[1];\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/VS16_1_p2/ReadOnlyMember.cs",
    "content": "﻿namespace VS16_1_p2.ReadOnlyMember\n{\n    // 構造体自体は readonly にしない。\n    // フィールドは書き換えたい\n    struct NonReadOnly\n    {\n        public float X;\n        public float Y;\n\n        // でも、このプロパティ内ではフィールドを書き換えない\n        public float LengthSquared => X * X + Y * Y;\n    }\n\n    // NonReadOnly との差は LengthSquared の readonly の有無だけ\n    struct ReadOnly\n    {\n        public float X;\n        public float Y;\n\n        // readonly 修飾でフィールドを書き換えないことを明示\n        public readonly float LengthSquared => X * X + Y * Y;\n    }\n\n    class Program\n    {\n        // こっちは、LengthSquared 内での X, Y の書き換えを恐れて隠れたコピーが発生する。\n        static float M(in NonReadOnly x) => x.LengthSquared;\n\n        // こっちは、LengthSquared に readonly が付いているのでコピー発生しない。\n        static float M(in ReadOnly x) => x.LengthSquared;\n\n        static void Main(string[] args)\n        {\n            M(new NonReadOnly { X = 1, Y = 2 });\n            M(new ReadOnly { X = 1, Y = 2 });\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/VS16_1_p2/ReadOnlyRef.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace VS16_1_p2.ReadOnlyRef\n{\n    struct S\n    {\n        public int[] _value;\n\n        // これは、読み取り専用参照を返すという意味。\n        // _value 配列の中身が書き換わってもらっては困る。\n        public ref readonly int X => ref _value[0];\n\n        // これは、S 内のフィールド(この場合 _value) を書き換えないという意味。\n        // _value 配列の中身が書き換わろうと知ったことではない。\n        public readonly ref int Y => ref _value[0];\n\n        // これは、上記2つの両方の意味。\n        // _value 自体も書き換わらないし、_value の中身を書き換えてもらっても困るとき用。\n        public readonly ref readonly int Z => ref _value[0];\n    }\n\n    class Program\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2019/Csharp80/VS16_1_p2/VS16_1_p2.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <LangVersion>preview</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Connection.cs",
    "content": "﻿using DataAccessSample.Models;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Internal;\n\nnamespace DataAccessSample\n{\n    class Connection\n    {\n#if MYSQL\n        private const string ConnectionString = @\"Server=localhost;Port=3306;Database=Northwind;Uid=root;Pwd=mypassword;Max Pool Size=200;\";\n        private static readonly DbContextOptions<NorthwindContext> Options = new DbContextOptionsBuilder<NorthwindContext>().UseMySQL(ConnectionString).Options;\n#else\n        private const string ConnectionString = @\"Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Northwind;Integrated Security=True;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False;Max Pool Size=200\";\n        private static readonly DbContextOptions<NorthwindContext> Options = new DbContextOptionsBuilder<NorthwindContext>().UseSqlServer(ConnectionString).Options;\n#endif\n\n        private static readonly DbContextPool<NorthwindContext> _pool = new DbContextPool<NorthwindContext>(Options);\n\n        public static DbContextPool<NorthwindContext>.Lease Rent() => new DbContextPool<NorthwindContext>.Lease(_pool);\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/DataAccess/DapperRepository.cs",
    "content": "﻿using Dapper;\nusing DataAccessSample.Models;\nusing Microsoft.EntityFrameworkCore;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace DataAccessSample\n{\n    public struct DapperRepository : IDataSource\n    {\n        public Products[] GetAllProductsByCategory(NorthwindContext db, string categoryName)\n        {\n            var connection = db.Database.GetDbConnection();\n            return connection.Query<Products>(@\"SELECT * From Products as b\nLEFT JOIN Categories as c ON c.CategoryID = b.CategoryID\nWHERE c.CategoryName = @CategoryName\nORDER BY b.ProductName\n\", new { CategoryName = categoryName })\n.ToArray();\n        }\n\n        public Task<Products[]> GetAllProductsByCategoryAsync(NorthwindContext db, string categoryName)\n        {\n            var connection = db.Database.GetDbConnection();\n            return connection.QueryAsync<Products>(@\"SELECT * From Products as b\nLEFT JOIN Categories as c ON c.CategoryID = b.CategoryID\nWHERE c.CategoryName = @CategoryName\nORDER BY b.ProductName\n\", new { CategoryName = categoryName })\n.ContinueWith(t => t.Result.ToArray(), TaskContinuationOptions.ExecuteSynchronously);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/DataAccess/EFCompiledQueryRepository.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing DataAccessSample.Models;\nusing Microsoft.EntityFrameworkCore;\nusing Microsoft.EntityFrameworkCore.Query;\n\nnamespace DataAccessSample\n{\n    public struct EFCompiledQueryRepository : IDataSource\n    {\n        private static readonly Func<NorthwindContext, string, IEnumerable<Products>> _createQuery =\n            EF.CompileQuery<NorthwindContext, string, IEnumerable<Products>>((db, categoryName)\n                => db.Products\n                .Where(b => b.Category.CategoryName == categoryName)\n                .OrderBy(b => b.ProductName)\n                .Select(x => x)\n                );\n\n        public Products[] GetAllProductsByCategory(NorthwindContext db, string categoryName)\n        {\n            return _createQuery(db, categoryName)\n                .ToArray();\n        }\n\n        private static readonly Func<NorthwindContext, string, AsyncEnumerable<Products>> _createAsyncQuery =\n        EF.CompileAsyncQuery<NorthwindContext, string, Products>((db, categoryName)\n            => db.Products\n            .Where(b => b.Category.CategoryName == categoryName)\n            .OrderBy(b => b.ProductName)\n            .Select(x => x)\n            );\n\n        public Task<Products[]> GetAllProductsByCategoryAsync(NorthwindContext db, string categoryName)\n        {\n            return _createAsyncQuery(db, categoryName)\n                .ToArrayAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/DataAccess/EFCoreRepository.cs",
    "content": "﻿using System.Linq;\nusing System.Threading.Tasks;\nusing DataAccessSample.Models;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace DataAccessSample\n{\n    public struct EFCoreRepository : IDataSource\n    {\n        public Products[] GetAllProductsByCategory(NorthwindContext db, string categoryName)\n        {\n            return db.Products\n                .Where(b => b.Category.CategoryName == categoryName)\n                .OrderBy(b => b.ProductName)\n                .ToArray();\n        }\n\n        public Task<Products[]> GetAllProductsByCategoryAsync(NorthwindContext db, string categoryName)\n        {\n            return db.Products\n                .Where(b => b.Category.CategoryName == categoryName)\n                .OrderBy(b => b.ProductName)\n                .ToArrayAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/DataAccess/EFFromSqlRepository.cs",
    "content": "﻿using System.Linq;\nusing System.Threading.Tasks;\nusing DataAccessSample.Models;\nusing Microsoft.EntityFrameworkCore;\n\nnamespace DataAccessSample\n{\n    public struct EFFromSqlRepository : IDataSource\n    {\n        public Products[] GetAllProductsByCategory(NorthwindContext db, string categoryName)\n        {\n            return db.Products.FromSql($@\"SELECT b.ProductID, b.CategoryID, b.Discontinued, b.ProductName, b.QuantityPerUnit, b.ReorderLevel, b.SupplierID, b.UnitPrice, b.UnitsInStock, b.UnitsOnOrder\nFrom Products as b\nLEFT JOIN Categories as c ON c.CategoryID = b.CategoryID\nWHERE c.CategoryName = {categoryName}\nORDER BY b.ProductName\n\").ToArray();\n        }\n\n        public Task<Products[]> GetAllProductsByCategoryAsync(NorthwindContext db, string categoryName)\n        {\n            return db.Products.FromSql($@\"SELECT b.ProductID, b.CategoryID, b.Discontinued, b.ProductName, b.QuantityPerUnit, b.ReorderLevel, b.SupplierID, b.UnitPrice, b.UnitsInStock, b.UnitsOnOrder\nFrom Products as b\nLEFT JOIN Categories as c ON c.CategoryID = b.CategoryID\nWHERE c.CategoryName = {categoryName}\nORDER BY b.ProductName\n\").ToArrayAsync();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/DataAccess/IDataSource.cs",
    "content": "﻿using DataAccessSample.Models;\nusing System.Threading.Tasks;\n\nnamespace DataAccessSample\n{\n    public interface IDataSource\n    {\n        Products[] GetAllProductsByCategory(NorthwindContext db, string categoryName);\n        Task<Products[]> GetAllProductsByCategoryAsync(NorthwindContext db, string categoryName);\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/DataAccessBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace DataAccessSample\n{\n    [MemoryDiagnoser]\n    public class DataAccessBenchmark\n    {\n        const int Parallelism = 50;\n        const int LoopCount = 100;\n\n        [GlobalSetup]\n        public void Setup()\n        {\n            ThreadPool.SetMinThreads(Parallelism, Parallelism);\n        }\n\n        private void GetProducts<T>()\n            where T : struct, IDataSource\n        {\n            Parallel.For(0, LoopCount, new ParallelOptions { MaxDegreeOfParallelism = Parallelism },\n                _ =>\n                {\n                    using (var lease = Connection.Rent())\n                    {\n                        var db = lease.Context;\n                        default(T).GetAllProductsByCategory(db, \"Confections\");\n                        default(T).GetAllProductsByCategory(db, \"Beverages\");\n                        default(T).GetAllProductsByCategory(db, \"Produce\");\n                        default(T).GetAllProductsByCategory(db, \"Seafood\");\n                    }\n                });\n        }\n\n        [Benchmark] public void EFCore() => GetProducts<EFCoreRepository>();\n        [Benchmark] public void EFCompiledQuery() => GetProducts<EFCompiledQueryRepository>();\n        [Benchmark] public void EFFromSql() => GetProducts<EFFromSqlRepository>();\n        [Benchmark] public void Dapper() => GetProducts<DapperRepository>();\n\n        private async Task GetProductsAsync<T>()\n        where T : struct, IDataSource\n        {\n            await Task.WhenAll(Enumerable.Range(0, LoopCount)\n                .Select(async _ =>\n                {\n                    using (var lease = Connection.Rent())\n                    {\n                        var db = lease.Context;\n                        return new[]\n                        {\n                            await default(T).GetAllProductsByCategoryAsync(db, \"Confections\"),\n                            await default(T).GetAllProductsByCategoryAsync(db, \"Beverages\"),\n                            await default(T).GetAllProductsByCategoryAsync(db, \"Produce\"),\n                            await default(T).GetAllProductsByCategoryAsync(db, \"Seafood\"),\n                        };\n                    }\n                }));\n        }\n\n        [Benchmark] public Task EFCoreAsync() => GetProductsAsync<EFCoreRepository>();\n        [Benchmark] public Task EFCompiledQueryAsync() => GetProductsAsync<EFCompiledQueryRepository>();\n        [Benchmark] public Task EFFromSqlAsync() => GetProductsAsync<EFFromSqlRepository>();\n        [Benchmark] public Task DapperAsync() => GetProductsAsync<DapperRepository>();\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/DataAccessSample.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <DefineConstants>$(DefineConstants);MYSQL</DefineConstants>\n  </PropertyGroup>\n  \n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.11.4\" />\n    <PackageReference Include=\"Dapper\" Version=\"1.50.7\" />\n    <PackageReference Include=\"Microsoft.EntityFrameworkCore.Tools\" Version=\"2.2.2\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup Condition=\"!$(DefineConstants.Contains(';MYSQL'))\">\n    <PackageReference Include=\"Dapper.Microsoft.Sql\" Version=\"0.0.5\" />\n    <PackageReference Include=\"Microsoft.EntityFrameworkCore.SqlServer\" Version=\"2.2.2\" />\n  </ItemGroup>\n\n  <ItemGroup Condition=\"$(DefineConstants.Contains(';MYSQL'))\">\n    <PackageReference Include=\"MySql.Data.EntityFrameworkCore\" Version=\"8.0.15\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/IQueryableExtensions.cs",
    "content": "﻿using Microsoft.EntityFrameworkCore.Query;\nusing Microsoft.EntityFrameworkCore.Query.Internal;\nusing Microsoft.EntityFrameworkCore.Storage;\nusing System.Linq;\nusing System.Reflection;\n\nnamespace DataAccessSample\n{\n    public static class IQueryableExtensions\n    {\n        private static readonly TypeInfo QueryCompilerTypeInfo = typeof(QueryCompiler).GetTypeInfo();\n\n        private static readonly FieldInfo QueryCompilerField = typeof(EntityQueryProvider).GetTypeInfo().DeclaredFields.First(x => x.Name == \"_queryCompiler\");\n\n        private static readonly FieldInfo QueryModelGeneratorField = QueryCompilerTypeInfo.DeclaredFields.First(x => x.Name == \"_queryModelGenerator\");\n\n        private static readonly FieldInfo DataBaseField = QueryCompilerTypeInfo.DeclaredFields.Single(x => x.Name == \"_database\");\n\n        private static readonly PropertyInfo DatabaseDependenciesField = typeof(Database).GetTypeInfo().DeclaredProperties.Single(x => x.Name == \"Dependencies\");\n\n        public static string ToSql<TEntity>(this IQueryable<TEntity> query) where TEntity : class\n        {\n            var queryCompiler = (QueryCompiler)QueryCompilerField.GetValue(query.Provider);\n            var modelGenerator = (QueryModelGenerator)QueryModelGeneratorField.GetValue(queryCompiler);\n            var queryModel = modelGenerator.ParseQuery(query.Expression);\n            var database = (IDatabase)DataBaseField.GetValue(queryCompiler);\n            var databaseDependencies = (DatabaseDependencies)DatabaseDependenciesField.GetValue(database);\n            var queryCompilationContext = databaseDependencies.QueryCompilationContextFactory.Create(false);\n            var modelVisitor = (RelationalQueryModelVisitor)queryCompilationContext.CreateQueryModelVisitor();\n            modelVisitor.CreateQueryExecutor<TEntity>(queryModel);\n            var sql = modelVisitor.Queries.First().ToString();\n\n            return sql;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/Categories.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class Categories\n    {\n        public Categories()\n        {\n            Products = new HashSet<Products>();\n        }\n\n        public int CategoryId { get; set; }\n        public string CategoryName { get; set; }\n        public string Description { get; set; }\n        public byte[] Picture { get; set; }\n\n        public virtual ICollection<Products> Products { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/CustomerCustomerDemo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class CustomerCustomerDemo\n    {\n        public string CustomerId { get; set; }\n        public string CustomerTypeId { get; set; }\n\n        public virtual Customers Customer { get; set; }\n        public virtual CustomerDemographics CustomerType { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/CustomerDemographics.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class CustomerDemographics\n    {\n        public CustomerDemographics()\n        {\n            CustomerCustomerDemo = new HashSet<CustomerCustomerDemo>();\n        }\n\n        public string CustomerTypeId { get; set; }\n        public string CustomerDesc { get; set; }\n\n        public virtual ICollection<CustomerCustomerDemo> CustomerCustomerDemo { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/Customers.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class Customers\n    {\n        public Customers()\n        {\n            CustomerCustomerDemo = new HashSet<CustomerCustomerDemo>();\n            Orders = new HashSet<Orders>();\n        }\n\n        public string CustomerId { get; set; }\n        public string CompanyName { get; set; }\n        public string ContactName { get; set; }\n        public string ContactTitle { get; set; }\n        public string Address { get; set; }\n        public string City { get; set; }\n        public string Region { get; set; }\n        public string PostalCode { get; set; }\n        public string Country { get; set; }\n        public string Phone { get; set; }\n        public string Fax { get; set; }\n\n        public virtual ICollection<CustomerCustomerDemo> CustomerCustomerDemo { get; set; }\n        public virtual ICollection<Orders> Orders { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/EmployeeTerritories.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class EmployeeTerritories\n    {\n        public int EmployeeId { get; set; }\n        public string TerritoryId { get; set; }\n\n        public virtual Employees Employee { get; set; }\n        public virtual Territories Territory { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/Employees.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class Employees\n    {\n        public Employees()\n        {\n            EmployeeTerritories = new HashSet<EmployeeTerritories>();\n            InverseReportsToNavigation = new HashSet<Employees>();\n            Orders = new HashSet<Orders>();\n        }\n\n        public int EmployeeId { get; set; }\n        public string LastName { get; set; }\n        public string FirstName { get; set; }\n        public string Title { get; set; }\n        public string TitleOfCourtesy { get; set; }\n        public DateTime? BirthDate { get; set; }\n        public DateTime? HireDate { get; set; }\n        public string Address { get; set; }\n        public string City { get; set; }\n        public string Region { get; set; }\n        public string PostalCode { get; set; }\n        public string Country { get; set; }\n        public string HomePhone { get; set; }\n        public string Extension { get; set; }\n        public byte[] Photo { get; set; }\n        public string Notes { get; set; }\n        public int? ReportsTo { get; set; }\n        public string PhotoPath { get; set; }\n\n        public virtual Employees ReportsToNavigation { get; set; }\n        public virtual ICollection<EmployeeTerritories> EmployeeTerritories { get; set; }\n        public virtual ICollection<Employees> InverseReportsToNavigation { get; set; }\n        public virtual ICollection<Orders> Orders { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/NorthwindContext.cs",
    "content": "﻿using Microsoft.EntityFrameworkCore;\n\nnamespace DataAccessSample.Models\n{\n    public partial class NorthwindContext : DbContext\n    {\n        public NorthwindContext(DbContextOptions<NorthwindContext> options) : base(options) { }\n\n        public virtual DbSet<Categories> Categories { get; set; }\n        public virtual DbSet<CustomerCustomerDemo> CustomerCustomerDemo { get; set; }\n        public virtual DbSet<CustomerDemographics> CustomerDemographics { get; set; }\n        public virtual DbSet<Customers> Customers { get; set; }\n        public virtual DbSet<EmployeeTerritories> EmployeeTerritories { get; set; }\n        public virtual DbSet<Employees> Employees { get; set; }\n        public virtual DbSet<OrderDetails> OrderDetails { get; set; }\n        public virtual DbSet<Orders> Orders { get; set; }\n        public virtual DbSet<Products> Products { get; set; }\n        public virtual DbSet<Region> Region { get; set; }\n        public virtual DbSet<Shippers> Shippers { get; set; }\n        public virtual DbSet<Suppliers> Suppliers { get; set; }\n        public virtual DbSet<Territories> Territories { get; set; }\n\n#if MYSQL\n        protected override void OnModelCreating(ModelBuilder modelBuilder)\n        {\n            modelBuilder.HasAnnotation(\"ProductVersion\", \"2.2.2-servicing-10034\");\n\n            modelBuilder.Entity<Categories>(entity =>\n            {\n                entity.HasKey(e => e.CategoryId);\n\n                entity.ToTable(\"categories\", \"northwind\");\n\n                entity.HasIndex(e => e.CategoryName)\n                    .HasName(\"CategoryName\");\n\n                entity.Property(e => e.CategoryId)\n                    .HasColumnName(\"CategoryID\")\n                    .HasColumnType(\"int(11)\")\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.CategoryName)\n                    .IsRequired()\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Description).HasColumnType(\"longtext\");\n\n                entity.Property(e => e.Picture).HasColumnType(\"longblob\");\n            });\n\n            modelBuilder.Entity<CustomerCustomerDemo>(entity =>\n            {\n                entity.HasKey(e => new { e.CustomerId, e.CustomerTypeId });\n\n                entity.ToTable(\"customercustomerdemo\", \"northwind\");\n\n                entity.HasIndex(e => e.CustomerTypeId)\n                    .HasName(\"FK_CustomerCustomerDemo\");\n\n                entity.Property(e => e.CustomerId)\n                    .HasColumnName(\"CustomerID\")\n                    .HasColumnType(\"char(5)\");\n\n                entity.Property(e => e.CustomerTypeId)\n                    .HasColumnName(\"CustomerTypeID\")\n                    .HasColumnType(\"char(10)\");\n\n                entity.HasOne(d => d.Customer)\n                    .WithMany(p => p.CustomerCustomerDemo)\n                    .HasForeignKey(d => d.CustomerId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_CustomerCustomerDemo_Customers\");\n\n                entity.HasOne(d => d.CustomerType)\n                    .WithMany(p => p.CustomerCustomerDemo)\n                    .HasForeignKey(d => d.CustomerTypeId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_CustomerCustomerDemo\");\n            });\n\n            modelBuilder.Entity<CustomerDemographics>(entity =>\n            {\n                entity.HasKey(e => e.CustomerTypeId);\n\n                entity.ToTable(\"customerdemographics\", \"northwind\");\n\n                entity.Property(e => e.CustomerTypeId)\n                    .HasColumnName(\"CustomerTypeID\")\n                    .HasColumnType(\"char(10)\")\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.CustomerDesc).HasColumnType(\"longtext\");\n            });\n\n            modelBuilder.Entity<Customers>(entity =>\n            {\n                entity.HasKey(e => e.CustomerId);\n\n                entity.ToTable(\"customers\", \"northwind\");\n\n                entity.HasIndex(e => e.City)\n                    .HasName(\"City\");\n\n                entity.HasIndex(e => e.CompanyName)\n                    .HasName(\"CompanyName\");\n\n                entity.HasIndex(e => e.PostalCode)\n                    .HasName(\"PostalCode\");\n\n                entity.HasIndex(e => e.Region)\n                    .HasName(\"Region\");\n\n                entity.Property(e => e.CustomerId)\n                    .HasColumnName(\"CustomerID\")\n                    .HasColumnType(\"char(5)\")\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.Address)\n                    .HasMaxLength(60)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.City)\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.CompanyName)\n                    .IsRequired()\n                    .HasMaxLength(40)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.ContactName)\n                    .HasMaxLength(30)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.ContactTitle)\n                    .HasMaxLength(30)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Country)\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Fax)\n                    .HasMaxLength(24)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Phone)\n                    .HasMaxLength(24)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.PostalCode)\n                    .HasMaxLength(10)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Region)\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n            });\n\n            modelBuilder.Entity<Employees>(entity =>\n            {\n                entity.HasKey(e => e.EmployeeId);\n\n                entity.ToTable(\"employees\", \"northwind\");\n\n                entity.HasIndex(e => e.LastName)\n                    .HasName(\"LastName\");\n\n                entity.HasIndex(e => e.PostalCode)\n                    .HasName(\"PostalCode\");\n\n                entity.HasIndex(e => e.ReportsTo)\n                    .HasName(\"FK_Employees_Employees\");\n\n                entity.Property(e => e.EmployeeId)\n                    .HasColumnName(\"EmployeeID\")\n                    .HasColumnType(\"int(11)\")\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.Address)\n                    .HasMaxLength(60)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.BirthDate).HasColumnType(\"datetime(6)\");\n\n                entity.Property(e => e.City)\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Country)\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Extension)\n                    .HasMaxLength(4)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.FirstName)\n                    .IsRequired()\n                    .HasMaxLength(10)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.HireDate).HasColumnType(\"datetime(6)\");\n\n                entity.Property(e => e.HomePhone)\n                    .HasMaxLength(24)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.LastName)\n                    .IsRequired()\n                    .HasMaxLength(20)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Notes).HasColumnType(\"longtext\");\n\n                entity.Property(e => e.Photo).HasColumnType(\"longblob\");\n\n                entity.Property(e => e.PhotoPath)\n                    .HasMaxLength(255)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.PostalCode)\n                    .HasMaxLength(10)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Region)\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.ReportsTo).HasColumnType(\"int(11)\");\n\n                entity.Property(e => e.Title)\n                    .HasMaxLength(30)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.TitleOfCourtesy)\n                    .HasMaxLength(25)\n                    .IsUnicode(false);\n\n                entity.HasOne(d => d.ReportsToNavigation)\n                    .WithMany(p => p.InverseReportsToNavigation)\n                    .HasForeignKey(d => d.ReportsTo)\n                    .HasConstraintName(\"FK_Employees_Employees\");\n            });\n\n            modelBuilder.Entity<EmployeeTerritories>(entity =>\n            {\n                entity.HasKey(e => new { e.EmployeeId, e.TerritoryId });\n\n                entity.ToTable(\"employeeterritories\", \"northwind\");\n\n                entity.HasIndex(e => e.TerritoryId)\n                    .HasName(\"FK_EmployeeTerritories_Territories\");\n\n                entity.Property(e => e.EmployeeId)\n                    .HasColumnName(\"EmployeeID\")\n                    .HasColumnType(\"int(11)\");\n\n                entity.Property(e => e.TerritoryId)\n                    .HasColumnName(\"TerritoryID\")\n                    .HasMaxLength(20)\n                    .IsUnicode(false);\n\n                entity.HasOne(d => d.Employee)\n                    .WithMany(p => p.EmployeeTerritories)\n                    .HasForeignKey(d => d.EmployeeId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_EmployeeTerritories_Employees\");\n\n                entity.HasOne(d => d.Territory)\n                    .WithMany(p => p.EmployeeTerritories)\n                    .HasForeignKey(d => d.TerritoryId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_EmployeeTerritories_Territories\");\n            });\n\n            modelBuilder.Entity<OrderDetails>(entity =>\n            {\n                entity.HasKey(e => new { e.OrderId, e.ProductId });\n\n                entity.ToTable(\"order details\", \"northwind\");\n\n                entity.HasIndex(e => e.OrderId)\n                    .HasName(\"OrdersOrder_Details\");\n\n                entity.HasIndex(e => e.ProductId)\n                    .HasName(\"ProductsOrder_Details\");\n\n                entity.Property(e => e.OrderId)\n                    .HasColumnName(\"OrderID\")\n                    .HasColumnType(\"int(11)\");\n\n                entity.Property(e => e.ProductId)\n                    .HasColumnName(\"ProductID\")\n                    .HasColumnType(\"int(11)\");\n\n                entity.Property(e => e.Discount)\n                    .HasColumnType(\"float(24,0)\")\n                    .HasDefaultValueSql(\"0\");\n\n                entity.Property(e => e.Quantity)\n                    .HasColumnType(\"smallint(6)\")\n                    .HasDefaultValueSql(\"1\");\n\n                entity.Property(e => e.UnitPrice)\n                    .HasColumnType(\"decimal(19,4)\")\n                    .HasDefaultValueSql(\"0.0000\");\n\n                entity.HasOne(d => d.Order)\n                    .WithMany(p => p.OrderDetails)\n                    .HasForeignKey(d => d.OrderId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_Order_Details_Orders\");\n\n                entity.HasOne(d => d.Product)\n                    .WithMany(p => p.OrderDetails)\n                    .HasForeignKey(d => d.ProductId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_Order_Details_Products\");\n            });\n\n            modelBuilder.Entity<Orders>(entity =>\n            {\n                entity.HasKey(e => e.OrderId);\n\n                entity.ToTable(\"orders\", \"northwind\");\n\n                entity.HasIndex(e => e.CustomerId)\n                    .HasName(\"CustomersOrders\");\n\n                entity.HasIndex(e => e.EmployeeId)\n                    .HasName(\"EmployeesOrders\");\n\n                entity.HasIndex(e => e.OrderDate)\n                    .HasName(\"OrderDate\");\n\n                entity.HasIndex(e => e.ShipPostalCode)\n                    .HasName(\"ShipPostalCode\");\n\n                entity.HasIndex(e => e.ShipVia)\n                    .HasName(\"ShippersOrders\");\n\n                entity.HasIndex(e => e.ShippedDate)\n                    .HasName(\"ShippedDate\");\n\n                entity.Property(e => e.OrderId)\n                    .HasColumnName(\"OrderID\")\n                    .HasColumnType(\"int(11)\")\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.CustomerId)\n                    .HasColumnName(\"CustomerID\")\n                    .HasColumnType(\"char(5)\");\n\n                entity.Property(e => e.EmployeeId)\n                    .HasColumnName(\"EmployeeID\")\n                    .HasColumnType(\"int(11)\");\n\n                entity.Property(e => e.Freight)\n                    .HasColumnType(\"decimal(19,4)\")\n                    .HasDefaultValueSql(\"0.0000\");\n\n                entity.Property(e => e.OrderDate).HasColumnType(\"datetime(6)\");\n\n                entity.Property(e => e.RequiredDate).HasColumnType(\"datetime(6)\");\n\n                entity.Property(e => e.ShipAddress)\n                    .HasMaxLength(60)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.ShipCity)\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.ShipCountry)\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.ShipName)\n                    .HasMaxLength(40)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.ShipPostalCode)\n                    .HasMaxLength(10)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.ShipRegion)\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.ShipVia).HasColumnType(\"int(11)\");\n\n                entity.Property(e => e.ShippedDate).HasColumnType(\"datetime(6)\");\n\n                entity.HasOne(d => d.Customer)\n                    .WithMany(p => p.Orders)\n                    .HasForeignKey(d => d.CustomerId)\n                    .HasConstraintName(\"FK_Orders_Customers\");\n\n                entity.HasOne(d => d.Employee)\n                    .WithMany(p => p.Orders)\n                    .HasForeignKey(d => d.EmployeeId)\n                    .HasConstraintName(\"FK_Orders_Employees\");\n\n                entity.HasOne(d => d.ShipViaNavigation)\n                    .WithMany(p => p.Orders)\n                    .HasForeignKey(d => d.ShipVia)\n                    .HasConstraintName(\"FK_Orders_Shippers\");\n            });\n\n            modelBuilder.Entity<Products>(entity =>\n            {\n                entity.HasKey(e => e.ProductId);\n\n                entity.ToTable(\"products\", \"northwind\");\n\n                entity.HasIndex(e => e.CategoryId)\n                    .HasName(\"CategoryID\");\n\n                entity.HasIndex(e => e.ProductName)\n                    .HasName(\"ProductName\");\n\n                entity.HasIndex(e => e.SupplierId)\n                    .HasName(\"SuppliersProducts\");\n\n                entity.Property(e => e.ProductId)\n                    .HasColumnName(\"ProductID\")\n                    .HasColumnType(\"int(11)\")\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.CategoryId)\n                    .HasColumnName(\"CategoryID\")\n                    .HasColumnType(\"int(11)\");\n\n                entity.Property(e => e.Discontinued)\n                    .HasColumnType(\"tinyint(1)\")\n                    .HasDefaultValueSql(\"0\");\n\n                entity.Property(e => e.ProductName)\n                    .IsRequired()\n                    .HasMaxLength(40)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.QuantityPerUnit)\n                    .HasMaxLength(20)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.ReorderLevel)\n                    .HasColumnType(\"smallint(6)\")\n                    .HasDefaultValueSql(\"0\");\n\n                entity.Property(e => e.SupplierId)\n                    .HasColumnName(\"SupplierID\")\n                    .HasColumnType(\"int(11)\");\n\n                entity.Property(e => e.UnitPrice)\n                    .HasColumnType(\"decimal(19,4)\")\n                    .HasDefaultValueSql(\"0.0000\");\n\n                entity.Property(e => e.UnitsInStock)\n                    .HasColumnType(\"smallint(6)\")\n                    .HasDefaultValueSql(\"0\");\n\n                entity.Property(e => e.UnitsOnOrder)\n                    .HasColumnType(\"smallint(6)\")\n                    .HasDefaultValueSql(\"0\");\n\n                entity.HasOne(d => d.Category)\n                    .WithMany(p => p.Products)\n                    .HasForeignKey(d => d.CategoryId)\n                    .HasConstraintName(\"FK_Products_Categories\");\n\n                entity.HasOne(d => d.Supplier)\n                    .WithMany(p => p.Products)\n                    .HasForeignKey(d => d.SupplierId)\n                    .HasConstraintName(\"FK_Products_Suppliers\");\n            });\n\n            modelBuilder.Entity<Region>(entity =>\n            {\n                entity.ToTable(\"region\", \"northwind\");\n\n                entity.Property(e => e.RegionId)\n                    .HasColumnName(\"RegionID\")\n                    .HasColumnType(\"int(11)\")\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.RegionDescription)\n                    .IsRequired()\n                    .HasColumnType(\"char(50)\");\n            });\n\n            modelBuilder.Entity<Shippers>(entity =>\n            {\n                entity.HasKey(e => e.ShipperId);\n\n                entity.ToTable(\"shippers\", \"northwind\");\n\n                entity.Property(e => e.ShipperId)\n                    .HasColumnName(\"ShipperID\")\n                    .HasColumnType(\"int(11)\")\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.CompanyName)\n                    .IsRequired()\n                    .HasMaxLength(40)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Phone)\n                    .HasMaxLength(24)\n                    .IsUnicode(false);\n            });\n\n            modelBuilder.Entity<Suppliers>(entity =>\n            {\n                entity.HasKey(e => e.SupplierId);\n\n                entity.ToTable(\"suppliers\", \"northwind\");\n\n                entity.HasIndex(e => e.CompanyName)\n                    .HasName(\"CompanyName\");\n\n                entity.HasIndex(e => e.PostalCode)\n                    .HasName(\"PostalCode\");\n\n                entity.Property(e => e.SupplierId)\n                    .HasColumnName(\"SupplierID\")\n                    .HasColumnType(\"int(11)\")\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.Address)\n                    .HasMaxLength(60)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.City)\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.CompanyName)\n                    .IsRequired()\n                    .HasMaxLength(40)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.ContactName)\n                    .HasMaxLength(30)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.ContactTitle)\n                    .HasMaxLength(30)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Country)\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Fax)\n                    .HasMaxLength(24)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.HomePage).HasColumnType(\"longtext\");\n\n                entity.Property(e => e.Phone)\n                    .HasMaxLength(24)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.PostalCode)\n                    .HasMaxLength(10)\n                    .IsUnicode(false);\n\n                entity.Property(e => e.Region)\n                    .HasMaxLength(15)\n                    .IsUnicode(false);\n            });\n\n            modelBuilder.Entity<Territories>(entity =>\n            {\n                entity.HasKey(e => e.TerritoryId);\n\n                entity.ToTable(\"territories\", \"northwind\");\n\n                entity.HasIndex(e => e.RegionId)\n                    .HasName(\"FK_Territories_Region\");\n\n                entity.Property(e => e.TerritoryId)\n                    .HasColumnName(\"TerritoryID\")\n                    .HasMaxLength(20)\n                    .IsUnicode(false)\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.RegionId)\n                    .HasColumnName(\"RegionID\")\n                    .HasColumnType(\"int(11)\");\n\n                entity.Property(e => e.TerritoryDescription)\n                    .IsRequired()\n                    .HasColumnType(\"char(50)\");\n\n                entity.HasOne(d => d.Region)\n                    .WithMany(p => p.Territories)\n                    .HasForeignKey(d => d.RegionId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_Territories_Region\");\n            });\n        }\n#else\n        protected override void OnModelCreating(ModelBuilder modelBuilder)\n        {\n            modelBuilder.HasAnnotation(\"ProductVersion\", \"2.2.1-servicing-10028\");\n\n            modelBuilder.Entity<Categories>(entity =>\n            {\n                entity.HasKey(e => e.CategoryId);\n\n                entity.HasIndex(e => e.CategoryName)\n                    .HasName(\"CategoryName\");\n\n                entity.Property(e => e.CategoryId).HasColumnName(\"CategoryID\");\n\n                entity.Property(e => e.CategoryName)\n                    .IsRequired()\n                    .HasMaxLength(15);\n\n                entity.Property(e => e.Description).HasColumnType(\"ntext\");\n\n                entity.Property(e => e.Picture).HasColumnType(\"image\");\n            });\n\n            modelBuilder.Entity<CustomerCustomerDemo>(entity =>\n            {\n                entity.HasKey(e => new { e.CustomerId, e.CustomerTypeId })\n                    .ForSqlServerIsClustered(false);\n\n                entity.Property(e => e.CustomerId)\n                    .HasColumnName(\"CustomerID\")\n                    .HasMaxLength(5);\n\n                entity.Property(e => e.CustomerTypeId)\n                    .HasColumnName(\"CustomerTypeID\")\n                    .HasMaxLength(10);\n\n                entity.HasOne(d => d.Customer)\n                    .WithMany(p => p.CustomerCustomerDemo)\n                    .HasForeignKey(d => d.CustomerId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_CustomerCustomerDemo_Customers\");\n\n                entity.HasOne(d => d.CustomerType)\n                    .WithMany(p => p.CustomerCustomerDemo)\n                    .HasForeignKey(d => d.CustomerTypeId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_CustomerCustomerDemo\");\n            });\n\n            modelBuilder.Entity<CustomerDemographics>(entity =>\n            {\n                entity.HasKey(e => e.CustomerTypeId)\n                    .ForSqlServerIsClustered(false);\n\n                entity.Property(e => e.CustomerTypeId)\n                    .HasColumnName(\"CustomerTypeID\")\n                    .HasMaxLength(10)\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.CustomerDesc).HasColumnType(\"ntext\");\n            });\n\n            modelBuilder.Entity<Customers>(entity =>\n            {\n                entity.HasKey(e => e.CustomerId);\n\n                entity.HasIndex(e => e.City)\n                    .HasName(\"City\");\n\n                entity.HasIndex(e => e.CompanyName)\n                    .HasName(\"CompanyName\");\n\n                entity.HasIndex(e => e.PostalCode)\n                    .HasName(\"PostalCode\");\n\n                entity.HasIndex(e => e.Region)\n                    .HasName(\"Region\");\n\n                entity.Property(e => e.CustomerId)\n                    .HasColumnName(\"CustomerID\")\n                    .HasMaxLength(5)\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.Address).HasMaxLength(60);\n\n                entity.Property(e => e.City).HasMaxLength(15);\n\n                entity.Property(e => e.CompanyName)\n                    .IsRequired()\n                    .HasMaxLength(40);\n\n                entity.Property(e => e.ContactName).HasMaxLength(30);\n\n                entity.Property(e => e.ContactTitle).HasMaxLength(30);\n\n                entity.Property(e => e.Country).HasMaxLength(15);\n\n                entity.Property(e => e.Fax).HasMaxLength(24);\n\n                entity.Property(e => e.Phone).HasMaxLength(24);\n\n                entity.Property(e => e.PostalCode).HasMaxLength(10);\n\n                entity.Property(e => e.Region).HasMaxLength(15);\n            });\n\n            modelBuilder.Entity<EmployeeTerritories>(entity =>\n            {\n                entity.HasKey(e => new { e.EmployeeId, e.TerritoryId })\n                    .ForSqlServerIsClustered(false);\n\n                entity.Property(e => e.EmployeeId).HasColumnName(\"EmployeeID\");\n\n                entity.Property(e => e.TerritoryId)\n                    .HasColumnName(\"TerritoryID\")\n                    .HasMaxLength(20);\n\n                entity.HasOne(d => d.Employee)\n                    .WithMany(p => p.EmployeeTerritories)\n                    .HasForeignKey(d => d.EmployeeId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_EmployeeTerritories_Employees\");\n\n                entity.HasOne(d => d.Territory)\n                    .WithMany(p => p.EmployeeTerritories)\n                    .HasForeignKey(d => d.TerritoryId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_EmployeeTerritories_Territories\");\n            });\n\n            modelBuilder.Entity<Employees>(entity =>\n            {\n                entity.HasKey(e => e.EmployeeId);\n\n                entity.HasIndex(e => e.LastName)\n                    .HasName(\"LastName\");\n\n                entity.HasIndex(e => e.PostalCode)\n                    .HasName(\"PostalCode\");\n\n                entity.Property(e => e.EmployeeId).HasColumnName(\"EmployeeID\");\n\n                entity.Property(e => e.Address).HasMaxLength(60);\n\n                entity.Property(e => e.BirthDate).HasColumnType(\"datetime\");\n\n                entity.Property(e => e.City).HasMaxLength(15);\n\n                entity.Property(e => e.Country).HasMaxLength(15);\n\n                entity.Property(e => e.Extension).HasMaxLength(4);\n\n                entity.Property(e => e.FirstName)\n                    .IsRequired()\n                    .HasMaxLength(10);\n\n                entity.Property(e => e.HireDate).HasColumnType(\"datetime\");\n\n                entity.Property(e => e.HomePhone).HasMaxLength(24);\n\n                entity.Property(e => e.LastName)\n                    .IsRequired()\n                    .HasMaxLength(20);\n\n                entity.Property(e => e.Notes).HasColumnType(\"ntext\");\n\n                entity.Property(e => e.Photo).HasColumnType(\"image\");\n\n                entity.Property(e => e.PhotoPath).HasMaxLength(255);\n\n                entity.Property(e => e.PostalCode).HasMaxLength(10);\n\n                entity.Property(e => e.Region).HasMaxLength(15);\n\n                entity.Property(e => e.Title).HasMaxLength(30);\n\n                entity.Property(e => e.TitleOfCourtesy).HasMaxLength(25);\n\n                entity.HasOne(d => d.ReportsToNavigation)\n                    .WithMany(p => p.InverseReportsToNavigation)\n                    .HasForeignKey(d => d.ReportsTo)\n                    .HasConstraintName(\"FK_Employees_Employees\");\n            });\n\n            modelBuilder.Entity<OrderDetails>(entity =>\n            {\n                entity.HasKey(e => new { e.OrderId, e.ProductId })\n                    .HasName(\"PK_Order_Details\");\n\n                entity.ToTable(\"Order Details\");\n\n                entity.HasIndex(e => e.OrderId)\n                    .HasName(\"OrdersOrder_Details\");\n\n                entity.HasIndex(e => e.ProductId)\n                    .HasName(\"ProductsOrder_Details\");\n\n                entity.Property(e => e.OrderId).HasColumnName(\"OrderID\");\n\n                entity.Property(e => e.ProductId).HasColumnName(\"ProductID\");\n\n                entity.Property(e => e.Quantity).HasDefaultValueSql(\"((1))\");\n\n                entity.Property(e => e.UnitPrice).HasColumnType(\"money\");\n\n                entity.HasOne(d => d.Order)\n                    .WithMany(p => p.OrderDetails)\n                    .HasForeignKey(d => d.OrderId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_Order_Details_Orders\");\n\n                entity.HasOne(d => d.Product)\n                    .WithMany(p => p.OrderDetails)\n                    .HasForeignKey(d => d.ProductId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_Order_Details_Products\");\n            });\n\n            modelBuilder.Entity<Orders>(entity =>\n            {\n                entity.HasKey(e => e.OrderId);\n\n                entity.HasIndex(e => e.CustomerId)\n                    .HasName(\"CustomersOrders\");\n\n                entity.HasIndex(e => e.EmployeeId)\n                    .HasName(\"EmployeesOrders\");\n\n                entity.HasIndex(e => e.OrderDate)\n                    .HasName(\"OrderDate\");\n\n                entity.HasIndex(e => e.ShipPostalCode)\n                    .HasName(\"ShipPostalCode\");\n\n                entity.HasIndex(e => e.ShipVia)\n                    .HasName(\"ShippersOrders\");\n\n                entity.HasIndex(e => e.ShippedDate)\n                    .HasName(\"ShippedDate\");\n\n                entity.Property(e => e.OrderId).HasColumnName(\"OrderID\");\n\n                entity.Property(e => e.CustomerId)\n                    .HasColumnName(\"CustomerID\")\n                    .HasMaxLength(5);\n\n                entity.Property(e => e.EmployeeId).HasColumnName(\"EmployeeID\");\n\n                entity.Property(e => e.Freight)\n                    .HasColumnType(\"money\")\n                    .HasDefaultValueSql(\"((0))\");\n\n                entity.Property(e => e.OrderDate).HasColumnType(\"datetime\");\n\n                entity.Property(e => e.RequiredDate).HasColumnType(\"datetime\");\n\n                entity.Property(e => e.ShipAddress).HasMaxLength(60);\n\n                entity.Property(e => e.ShipCity).HasMaxLength(15);\n\n                entity.Property(e => e.ShipCountry).HasMaxLength(15);\n\n                entity.Property(e => e.ShipName).HasMaxLength(40);\n\n                entity.Property(e => e.ShipPostalCode).HasMaxLength(10);\n\n                entity.Property(e => e.ShipRegion).HasMaxLength(15);\n\n                entity.Property(e => e.ShippedDate).HasColumnType(\"datetime\");\n\n                entity.HasOne(d => d.Customer)\n                    .WithMany(p => p.Orders)\n                    .HasForeignKey(d => d.CustomerId)\n                    .HasConstraintName(\"FK_Orders_Customers\");\n\n                entity.HasOne(d => d.Employee)\n                    .WithMany(p => p.Orders)\n                    .HasForeignKey(d => d.EmployeeId)\n                    .HasConstraintName(\"FK_Orders_Employees\");\n\n                entity.HasOne(d => d.ShipViaNavigation)\n                    .WithMany(p => p.Orders)\n                    .HasForeignKey(d => d.ShipVia)\n                    .HasConstraintName(\"FK_Orders_Shippers\");\n            });\n\n            modelBuilder.Entity<Products>(entity =>\n            {\n                entity.HasKey(e => e.ProductId);\n\n                entity.HasIndex(e => e.CategoryId)\n                    .HasName(\"CategoryID\");\n\n                entity.HasIndex(e => e.ProductName)\n                    .HasName(\"ProductName\");\n\n                entity.HasIndex(e => e.SupplierId)\n                    .HasName(\"SuppliersProducts\");\n\n                entity.Property(e => e.ProductId).HasColumnName(\"ProductID\");\n\n                entity.Property(e => e.CategoryId).HasColumnName(\"CategoryID\");\n\n                entity.Property(e => e.ProductName)\n                    .IsRequired()\n                    .HasMaxLength(40);\n\n                entity.Property(e => e.QuantityPerUnit).HasMaxLength(20);\n\n                entity.Property(e => e.ReorderLevel).HasDefaultValueSql(\"((0))\");\n\n                entity.Property(e => e.SupplierId).HasColumnName(\"SupplierID\");\n\n                entity.Property(e => e.UnitPrice)\n                    .HasColumnType(\"money\")\n                    .HasDefaultValueSql(\"((0))\");\n\n                entity.Property(e => e.UnitsInStock).HasDefaultValueSql(\"((0))\");\n\n                entity.Property(e => e.UnitsOnOrder).HasDefaultValueSql(\"((0))\");\n\n                entity.HasOne(d => d.Category)\n                    .WithMany(p => p.Products)\n                    .HasForeignKey(d => d.CategoryId)\n                    .HasConstraintName(\"FK_Products_Categories\");\n\n                entity.HasOne(d => d.Supplier)\n                    .WithMany(p => p.Products)\n                    .HasForeignKey(d => d.SupplierId)\n                    .HasConstraintName(\"FK_Products_Suppliers\");\n            });\n\n            modelBuilder.Entity<Region>(entity =>\n            {\n                entity.HasKey(e => e.RegionId)\n                    .ForSqlServerIsClustered(false);\n\n                entity.Property(e => e.RegionId)\n                    .HasColumnName(\"RegionID\")\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.RegionDescription)\n                    .IsRequired()\n                    .HasMaxLength(50);\n            });\n\n            modelBuilder.Entity<Shippers>(entity =>\n            {\n                entity.HasKey(e => e.ShipperId);\n\n                entity.Property(e => e.ShipperId).HasColumnName(\"ShipperID\");\n\n                entity.Property(e => e.CompanyName)\n                    .IsRequired()\n                    .HasMaxLength(40);\n\n                entity.Property(e => e.Phone).HasMaxLength(24);\n            });\n\n            modelBuilder.Entity<Suppliers>(entity =>\n            {\n                entity.HasKey(e => e.SupplierId);\n\n                entity.HasIndex(e => e.CompanyName)\n                    .HasName(\"CompanyName\");\n\n                entity.HasIndex(e => e.PostalCode)\n                    .HasName(\"PostalCode\");\n\n                entity.Property(e => e.SupplierId).HasColumnName(\"SupplierID\");\n\n                entity.Property(e => e.Address).HasMaxLength(60);\n\n                entity.Property(e => e.City).HasMaxLength(15);\n\n                entity.Property(e => e.CompanyName)\n                    .IsRequired()\n                    .HasMaxLength(40);\n\n                entity.Property(e => e.ContactName).HasMaxLength(30);\n\n                entity.Property(e => e.ContactTitle).HasMaxLength(30);\n\n                entity.Property(e => e.Country).HasMaxLength(15);\n\n                entity.Property(e => e.Fax).HasMaxLength(24);\n\n                entity.Property(e => e.HomePage).HasColumnType(\"ntext\");\n\n                entity.Property(e => e.Phone).HasMaxLength(24);\n\n                entity.Property(e => e.PostalCode).HasMaxLength(10);\n\n                entity.Property(e => e.Region).HasMaxLength(15);\n            });\n\n            modelBuilder.Entity<Territories>(entity =>\n            {\n                entity.HasKey(e => e.TerritoryId)\n                    .ForSqlServerIsClustered(false);\n\n                entity.Property(e => e.TerritoryId)\n                    .HasColumnName(\"TerritoryID\")\n                    .HasMaxLength(20)\n                    .ValueGeneratedNever();\n\n                entity.Property(e => e.RegionId).HasColumnName(\"RegionID\");\n\n                entity.Property(e => e.TerritoryDescription)\n                    .IsRequired()\n                    .HasMaxLength(50);\n\n                entity.HasOne(d => d.Region)\n                    .WithMany(p => p.Territories)\n                    .HasForeignKey(d => d.RegionId)\n                    .OnDelete(DeleteBehavior.ClientSetNull)\n                    .HasConstraintName(\"FK_Territories_Region\");\n            });\n        }\n#endif\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/OrderDetails.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class OrderDetails\n    {\n        public int OrderId { get; set; }\n        public int ProductId { get; set; }\n        public decimal UnitPrice { get; set; }\n        public short Quantity { get; set; }\n        public float Discount { get; set; }\n\n        public virtual Orders Order { get; set; }\n        public virtual Products Product { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/Orders.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class Orders\n    {\n        public Orders()\n        {\n            OrderDetails = new HashSet<OrderDetails>();\n        }\n\n        public int OrderId { get; set; }\n        public string CustomerId { get; set; }\n        public int? EmployeeId { get; set; }\n        public DateTime? OrderDate { get; set; }\n        public DateTime? RequiredDate { get; set; }\n        public DateTime? ShippedDate { get; set; }\n        public int? ShipVia { get; set; }\n        public decimal? Freight { get; set; }\n        public string ShipName { get; set; }\n        public string ShipAddress { get; set; }\n        public string ShipCity { get; set; }\n        public string ShipRegion { get; set; }\n        public string ShipPostalCode { get; set; }\n        public string ShipCountry { get; set; }\n\n        public virtual Customers Customer { get; set; }\n        public virtual Employees Employee { get; set; }\n        public virtual Shippers ShipViaNavigation { get; set; }\n        public virtual ICollection<OrderDetails> OrderDetails { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/Products.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class Products\n    {\n        public Products()\n        {\n            OrderDetails = new HashSet<OrderDetails>();\n        }\n\n        public int ProductId { get; set; }\n        public string ProductName { get; set; }\n        public int? SupplierId { get; set; }\n        public int? CategoryId { get; set; }\n        public string QuantityPerUnit { get; set; }\n        public decimal? UnitPrice { get; set; }\n        public short? UnitsInStock { get; set; }\n        public short? UnitsOnOrder { get; set; }\n        public short? ReorderLevel { get; set; }\n        public bool Discontinued { get; set; }\n\n        public virtual Categories Category { get; set; }\n        public virtual Suppliers Supplier { get; set; }\n        public virtual ICollection<OrderDetails> OrderDetails { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/Region.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class Region\n    {\n        public Region()\n        {\n            Territories = new HashSet<Territories>();\n        }\n\n        public int RegionId { get; set; }\n        public string RegionDescription { get; set; }\n\n        public virtual ICollection<Territories> Territories { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/Shippers.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class Shippers\n    {\n        public Shippers()\n        {\n            Orders = new HashSet<Orders>();\n        }\n\n        public int ShipperId { get; set; }\n        public string CompanyName { get; set; }\n        public string Phone { get; set; }\n\n        public virtual ICollection<Orders> Orders { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/Suppliers.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class Suppliers\n    {\n        public Suppliers()\n        {\n            Products = new HashSet<Products>();\n        }\n\n        public int SupplierId { get; set; }\n        public string CompanyName { get; set; }\n        public string ContactName { get; set; }\n        public string ContactTitle { get; set; }\n        public string Address { get; set; }\n        public string City { get; set; }\n        public string Region { get; set; }\n        public string PostalCode { get; set; }\n        public string Country { get; set; }\n        public string Phone { get; set; }\n        public string Fax { get; set; }\n        public string HomePage { get; set; }\n\n        public virtual ICollection<Products> Products { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Models/Territories.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace DataAccessSample.Models\n{\n    public partial class Territories\n    {\n        public Territories()\n        {\n            EmployeeTerritories = new HashSet<EmployeeTerritories>();\n        }\n\n        public string TerritoryId { get; set; }\n        public string TerritoryDescription { get; set; }\n        public int RegionId { get; set; }\n\n        public virtual Region Region { get; set; }\n        public virtual ICollection<EmployeeTerritories> EmployeeTerritories { get; set; }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample/Program.cs",
    "content": "﻿using DataAccessSample.Models;\nusing Microsoft.EntityFrameworkCore;\nusing System;\nusing System.Linq;\n\nnamespace DataAccessSample\n{\n    class Program\n    {\n        static void Main()\n        {\n#if DEBUG\n            Test();\n#else\n            BenchmarkDotNet.Running.BenchmarkRunner.Run<DataAccessBenchmark>();\n#endif\n        }\n\n        private static void Test()\n        {\n            using (var lease = Connection.Rent())\n            {\n                var db = lease.Context;\n                var products = db.Products\n                    .Where(b => b.CategoryId == 1)\n                    .OrderBy(b => b.ProductId)\n                    .Include(p => p.Category);\n                Console.WriteLine(products.ToSql());\n\n                WriteProducts<EFCoreRepository>(db);\n                WriteProducts<EFCompiledQueryRepository>(db);\n                WriteProducts<EFFromSqlRepository>(db);\n                WriteProducts<DapperRepository>(db);\n            }\n        }\n\n        private static void WriteProducts<T>(NorthwindContext db)\n            where T : struct, IDataSource\n        {\n            Console.WriteLine(typeof(T).Name);\n\n            foreach (var p in default(T).GetAllProductsByCategory(db, \"Confections\"))\n            {\n                Console.Write(\"    \");\n                Console.WriteLine(p.ProductName);\n            }\n\n            foreach (var p in default(T).GetAllProductsByCategoryAsync(db, \"Confections\").Result)\n            {\n                Console.Write(\"    \");\n                Console.WriteLine(p.ProductName);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/DataAccessSample.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28531.58\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"DataAccessSample\", \"DataAccessSample\\DataAccessSample.csproj\", \"{99F6B821-E6B6-4319-87A4-73D1075FBB7D}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{99F6B821-E6B6-4319-87A4-73D1075FBB7D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{99F6B821-E6B6-4319-87A4-73D1075FBB7D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{99F6B821-E6B6-4319-87A4-73D1075FBB7D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{99F6B821-E6B6-4319-87A4-73D1075FBB7D}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {FFED3B7D-84A2-4F12-84B5-EFFA591CB30E}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2019/DataAccessSample/readme.md",
    "content": "# EFCore のベンチマーク\n\n## データ\n\nデータは [Northwind](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/northwind-pubs)を使ってる。\n[instnwnd.sql](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/northwind-pubs)を実行した状態そのままでクエリ掛けてる。\n\nMySQL は、MySQL Workbench の「Database → Migration Wizard」で上記 SQL Server から MySQL にデータを移植。\n\n## Scaffolding\n\nEF は、DB First で、以下のコマンドで C# クラスを生成。\n\n```PowerShell\nScaffold-DbContext \"Data Source=[Database Name];Initial Catalog=Northwind;Integrated Security=True;Connect Timeout=60;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False\" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models\n```\n\nSQL Server からと、MySQL からで、Scaffolding した時の `OnModelCreating` の中身(`HasColumnType` とかの制約の内容)が違うので、そこだけ `#if MYSQL` で条件コンパイルするように手書きで修正。\n\n## データベース プロバイダー\n\nMicrosoft SQL Server と MySQL で動作確認済み。\n\n単一バイナリで両方に接続するのは上記の `OnModelCreating` の `#if` 分岐のせいで断念。\n`#if` 分岐が掛かってるのは以下の3点\n\n- 参照している NuGet パッケージ(`Microsoft.EntityFrameworkCore.SqlServer`/`MySql.Data.EntityFrameworkCore`)\n- 接続文字列と `DbContextOptions` を作ってるところ(`UseSqlServer`/`UseMySQL`)\n- `DbContext.OnModelCreating` の中身(`HasColumnType` とかの制約が違う)\n\n## クエリ\n\n以下のクエリを実行。\n\n```cs\ndb.Products\n    .Where(b => b.Category.CategoryName == categoryName)\n    .OrderBy(b => b.ProductName)\n    .ToArray();\n```\n\nこれと同じ結果を得るために、以下の4通りの方法を比較。\n\n- Entity Framework Core を利用\n  - EFCore: 普通に `IQueryable` の `Where`, `OrderBy` を使って O/R マップ\n  - EFCompiledQuery: `EF.CompileQuery` を使う\n  - EFFromSql: `FromSql(FromattableString)` を使う\n- Dapper: Dapper を利用\n\n同期版と非同期版があって、4×2 = 8通り。\n\n## ベンチマーク\n\nNorthwind に入ってるデータは、\nProducts が77件、Categories が8件。\nベンチマークでは `categoryName` に Confections, Beverages, Produce, Seafood の4つを渡して実行。\n\n`Parallel.For` とか `Task.WhenAll` で50回同じクエリを実行。\n\n## 結果\n\nローカルで動いてる SqlServer, MySQL に対して実行した場合のベンチマーク結果の一例は以下の通り。\n\nSqlServer\n\n|               Method |     Mean |    Error |   StdDev | Gen 0/1k Op | Gen 1/1k Op | Gen 2/1k Op | Allocated Memory/Op |\n|--------------------- |---------:|---------:|---------:|------------:|------------:|------------:|--------------------:|\n|               EFCore | 803.8 ms | 15.63 ms | 19.19 ms |   2000.0000 |   1000.0000 |           - |           271.37 KB |\n|      EFCompiledQuery | 810.1 ms | 13.18 ms | 12.33 ms |   2000.0000 |   1000.0000 |           - |           217.59 KB |\n|            EFFromSql | 841.0 ms | 16.33 ms | 16.77 ms |   2000.0000 |   1000.0000 |           - |           232.45 KB |\n|               Dapper | 825.8 ms | 16.44 ms | 23.04 ms |   1000.0000 |           - |           - |           126.81 KB |\n|          EFCoreAsync | 822.8 ms | 11.10 ms | 10.38 ms |   3000.0000 |   1000.0000 |           - |          3000.42 KB |\n| EFCompiledQueryAsync | 853.6 ms | 25.88 ms | 39.52 ms |   3000.0000 |   1000.0000 |           - |          2242.38 KB |\n|       EFFromSqlAsync | 842.3 ms | 16.54 ms | 19.69 ms |   3000.0000 |   1000.0000 |           - |          2717.88 KB |\n|          DapperAsync | 844.2 ms | 16.67 ms | 36.59 ms |  11000.0000 |   2000.0000 |           - |          1658.16 KB |\n\nMySQL\n\n|               Method |      Mean |    Error |    StdDev |    Median | Gen 0/1k Op | Gen 1/1k Op | Gen 2/1k Op | Allocated Memory/Op |\n|--------------------- |----------:|---------:|----------:|----------:|------------:|------------:|------------:|--------------------:|\n|               EFCore |  84.10 ms | 2.200 ms |  5.985 ms |  82.19 ms |   4000.0000 |   1000.0000 |           - |           425.83 KB |\n|      EFCompiledQuery |  79.58 ms | 1.582 ms |  3.789 ms |  79.24 ms |   4000.0000 |   1000.0000 |           - |           373.68 KB |\n|            EFFromSql |  74.17 ms | 1.483 ms |  4.010 ms |  73.86 ms |   3000.0000 |   1000.0000 |           - |           366.09 KB |\n|               Dapper | 135.87 ms | 2.717 ms |  5.364 ms | 135.44 ms |   2000.0000 |   1000.0000 |           - |           233.57 KB |\n|          EFCoreAsync | 312.32 ms | 6.198 ms | 14.487 ms | 307.14 ms |   4000.0000 |   1000.0000 |           - |         22976.13 KB |\n| EFCompiledQueryAsync | 278.02 ms | 5.557 ms | 14.640 ms | 274.81 ms |   3000.0000 |   1000.0000 |           - |         20132.05 KB |\n|       EFFromSqlAsync | 287.32 ms | 7.173 ms |  7.675 ms | 287.14 ms |   3000.0000 |   1000.0000 |           - |         19776.27 KB |\n|          DapperAsync | 343.05 ms | 6.811 ms | 15.787 ms | 342.32 ms |   2000.0000 |   1000.0000 |           - |         11550.02 KB |\n"
  },
  {
    "path": "Demo/2019/NetCoreGrpc/ConsoleApp1/ConsoleApp1.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Google.Protobuf\" Version=\"3.9.1\" />\n    <PackageReference Include=\"Grpc.Net.ClientFactory\" Version=\"2.23.2\" />\n    <PackageReference Include=\"Grpc.Tools\" Version=\"2.23.0\">\n      <PrivateAssets>all</PrivateAssets>\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <Protobuf Include=\"..\\GrpcService1\\Protos\\greet.proto\" GrpcServices=\"Client\">\n      <Link>Protos\\greet.proto</Link>\n    </Protobuf>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/NetCoreGrpc/ConsoleApp1/Program.cs",
    "content": "﻿using Grpc.Core;\nusing Grpc.Net.Client;\nusing GrpcService1;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing static GrpcService1.Sample;\n\nnamespace ConsoleApp1\n{\n    class Program\n    {\n        static async Task Main()\n        {\n            Console.WriteLine(\"press enter to start\");\n            Console.ReadLine();\n\n            using var channel = GrpcChannel.ForAddress(\"https://localhost:5001\");\n            await Sample(channel);\n\n            Console.WriteLine(\"press enter to exit\");\n            Console.ReadLine();\n        }\n\n        private static async Task Sample(GrpcChannel channel)\n        {\n            var client = new SampleClient(channel);\n            var call = client.GetValues();\n\n            async Task sender()\n            {\n                for (int i = 1; i < 32; i++)\n                {\n                    await call.RequestStream.WriteAsync(new SampleRequest { Bits = i, Length = i });\n                    await Task.Delay(500);\n                }\n                await call.RequestStream.CompleteAsync();\n            }\n\n            async IAsyncEnumerable<int> receiver()\n            {\n                await foreach (var res in call.ResponseStream.ReadAllAsync())\n                {\n                    foreach (var value in res.Values)\n                    {\n                        yield return value;\n                    }\n                }\n            }\n\n            _ = sender();\n\n            await foreach (var value in receiver())\n            {\n                Console.WriteLine(value);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/NetCoreGrpc/GrpcService1/GrpcService1.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Protobuf Include=\"Protos\\greet.proto\" GrpcServices=\"Server\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Grpc.AspNetCore\" Version=\"2.23.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/NetCoreGrpc/GrpcService1/Program.cs",
    "content": "using Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Hosting;\n\nnamespace GrpcService1\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            CreateHostBuilder(args).Build().Run();\n        }\n\n        // Additional configuration is required to successfully run gRPC on macOS.\n        // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682\n        public static IHostBuilder CreateHostBuilder(string[] args) =>\n            Host.CreateDefaultBuilder(args)\n                .ConfigureWebHostDefaults(webBuilder =>\n                {\n                    webBuilder.UseStartup<Startup>();\n                });\n    }\n}\n"
  },
  {
    "path": "Demo/2019/NetCoreGrpc/GrpcService1/Properties/launchSettings.json",
    "content": "﻿{\n  \"profiles\": {\n    \"GrpcService1\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": false,\n      \"applicationUrl\": \"https://localhost:5001\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2019/NetCoreGrpc/GrpcService1/Protos/greet.proto",
    "content": "syntax = \"proto3\";\n\noption csharp_namespace = \"GrpcService1\";\n\npackage Sample;\n\nservice Sample {\n  rpc GetValues(stream SampleRequest) returns (stream SampleResponse);\n}\n\nmessage SampleRequest {\n  int32 bits = 1;\n  int32 length = 2;\n}\n\nmessage SampleResponse {\n  repeated int32 values = 1;\n}\n"
  },
  {
    "path": "Demo/2019/NetCoreGrpc/GrpcService1/Services/SampleService.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing Grpc.Core;\n\nnamespace GrpcService1\n{\n    public class SampleService : Sample.SampleBase\n    {\n        public override async Task GetValues(IAsyncStreamReader<SampleRequest> requestStream, IServerStreamWriter<SampleResponse> responseStream, ServerCallContext context)\n        {\n            var rand = new Random();\n\n            await foreach (var req in requestStream.ReadAllAsync())\n            {\n                var mask = (1 << req.Bits) - 1;\n                var len = req.Length;\n\n                var res = new SampleResponse();\n\n                for (int i = 0; i < len; i++)\n                {\n                    res.Values.Add(rand.Next() & mask);\n                }\n\n                await responseStream.WriteAsync(res);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/NetCoreGrpc/GrpcService1/Startup.cs",
    "content": "﻿using Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\n\nnamespace GrpcService1\n{\n    public class Startup\n    {\n        // This method gets called by the runtime. Use this method to add services to the container.\n        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddGrpc();\n        }\n\n        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\n        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n        {\n            if (env.IsDevelopment())\n            {\n                app.UseDeveloperExceptionPage();\n            }\n\n            app.UseRouting();\n\n            app.UseEndpoints(endpoints =>\n            {\n                endpoints.MapGrpcService<SampleService>();\n\n                endpoints.MapGet(\"/\", async context =>\n                {\n                    await context.Response.WriteAsync(\"Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909\");\n                });\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/NetCoreGrpc/GrpcService1/appsettings.Development.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Debug\",\n      \"System\": \"Information\",\n      \"Grpc\": \"Information\",\n      \"Microsoft\": \"Information\"\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2019/NetCoreGrpc/GrpcService1/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Warning\",\n      \"Microsoft.Hosting.Lifetime\": \"Information\"\n    }\n  },\n  \"AllowedHosts\": \"*\",\n  \"Kestrel\": {\n    \"EndpointDefaults\": {\n      \"Protocols\": \"Http2\"\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2019/NetCoreGrpc/NetCoreGrpc.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.29326.143\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"GrpcService1\", \"GrpcService1\\GrpcService1.csproj\", \"{93DC3300-D9F3-4A2C-9B50-10CF926D9932}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{6FCC56B5-D6D2-4154-B0D7-8A5C968AF42A}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{93DC3300-D9F3-4A2C-9B50-10CF926D9932}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{93DC3300-D9F3-4A2C-9B50-10CF926D9932}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{93DC3300-D9F3-4A2C-9B50-10CF926D9932}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{93DC3300-D9F3-4A2C-9B50-10CF926D9932}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{6FCC56B5-D6D2-4154-B0D7-8A5C968AF42A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6FCC56B5-D6D2-4154-B0D7-8A5C968AF42A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6FCC56B5-D6D2-4154-B0D7-8A5C968AF42A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6FCC56B5-D6D2-4154-B0D7-8A5C968AF42A}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {B58DD3EC-05EB-436E-82C3-88BBDE3D17FE}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2019/PathMap/PathMap/PathMap.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <PathMap>$(MSBuildProjectDirectory)=.</PathMap>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/PathMap/PathMap/Program.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace PathMap\n{\n    class Program\n    {\n        static void Main()\n        {\n            // CallerFilePath で、このファイルのパスがコンソール出力される。\n            // 通常ならフルパス。\n            // 今回は csproj に $(MSBuildProjectDirectory)=. と PathMap 設定を入れているので、\n            // .\\Program.cs\n            // と表示される。\n            M();\n\n            // スタックトレースにも影響。\n            try\n            {\n                Throw();\n            }\n            catch (Exception ex)\n            {\n                // これも、フルパスだったものが短いスタックトレースに変わる:\n                //.\\Program.cs\n                //   at PathMap.Program.Throw() in .\\Program.cs:line 33\n                //   at PathMap.Program.Main(String[] args) in .\\Program.cs:line 20\n                Console.WriteLine(ex.StackTrace);\n            }\n        }\n\n        static void M([CallerFilePath] string path = null) => Console.WriteLine(path);\n        static void Throw() => throw new Exception();\n    }\n}\n"
  },
  {
    "path": "Demo/2019/PathMap/PathMap.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28917.182\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"PathMap\", \"PathMap\\PathMap.csproj\", \"{BB837752-7B29-44F0-B123-0B866103A382}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{BB837752-7B29-44F0-B123-0B866103A382}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BB837752-7B29-44F0-B123-0B866103A382}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BB837752-7B29-44F0-B123-0B866103A382}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BB837752-7B29-44F0-B123-0B866103A382}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {A8D0DC90-5EAE-4F57-9020-8F38B2D92193}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2019/SearchDocx/SearchDocx/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.IO.Packaging;\nusing System.Text;\n\nnamespace SearchDocx\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            if (args.Length < 2)\n            {\n                Console.WriteLine(@\"[usage]\nSerachDocx [root path] [keywords]\n\n指定したフォルダー以下にある txt, docx の中から指定したキーワードを含むものを検索する。\n\nroot path … 検索対象のフォルダー。\nkeywords  … 検索したいキーワード。スペース区切り。\n\");\n            }\n\n            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);\n\n            var root = args[0];\n            var keywords = args.AsSpan().Slice(1);\n            Span<bool> found = stackalloc bool[keywords.Length];\n\n            foreach (var (name, content) in ReadAllDocs(root))\n            {\n                var any = false;\n                for (int i = 0; i < keywords.Length; i++)\n                {\n                    any |= found[i] = content.Contains(keywords[i]);\n                }\n\n                if (any)\n                {\n                    Console.Write(name);\n                    Console.Write(\" / \");\n\n                    for (int i = 0; i < keywords.Length; i++)\n                    {\n                        if (found[i])\n                        {\n                            Console.Write(keywords[i]);\n                            Console.Write(\" \");\n                        }\n                    }\n\n                    Console.WriteLine();\n                }\n            }\n        }\n\n        private static IEnumerable<(string name, string content)> ReadAllDocs(string root)\n        {\n            foreach (var file in Directory.GetFiles(root, \"*.txt\", SearchOption.AllDirectories))\n            {\n                yield return (file.Replace(root, \"\"), ReadText(file));\n            }\n\n            foreach (var file in Directory.GetFiles(root, \"*.docx\", SearchOption.AllDirectories))\n            {\n                yield return (file.Replace(root, \"\"), ReadDocx(file));\n            }\n        }\n\n        private static string ReadDocx(string path)\n        {\n            var package = Package.Open(path, FileMode.Open);\n            var doc = package.GetPart(new Uri(\"/word/document.xml\", UriKind.Relative));\n            using var s = new StreamReader(doc.GetStream());\n            return s.ReadToEnd();\n        }\n\n        private static string ReadText(string path)\n        {\n            using var s = new StreamReader(path, Encoding.GetEncoding(\"Shift_JIS\"));\n            return s.ReadToEnd();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/SearchDocx/SearchDocx/Properties/launchSettings.json",
    "content": "{\n  \"profiles\": {\n    \"SearchDocx\": {\n      \"commandName\": \"Project\"\n    }\n  }\n}"
  },
  {
    "path": "Demo/2019/SearchDocx/SearchDocx/SearchDocx.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <LangVersion>8.0</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.IO.Packaging\" Version=\"4.5.0\" />\n    <PackageReference Include=\"System.Text.Encoding.CodePages\" Version=\"4.5.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/SearchDocx/SearchDocx.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28527.54\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SearchDocx\", \"SearchDocx\\SearchDocx.csproj\", \"{7CEA2170-7157-4F29-AEDD-AC28A301C0CF}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{7CEA2170-7157-4F29-AEDD-AC28A301C0CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7CEA2170-7157-4F29-AEDD-AC28A301C0CF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7CEA2170-7157-4F29-AEDD-AC28A301C0CF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7CEA2170-7157-4F29-AEDD-AC28A301C0CF}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {A7DAA97F-0B7B-4F2C-B355-658DD4510680}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2019/SwitchStatementToExpression/SwitchStatementToExpression/Program.cs",
    "content": "﻿using System;\n\nnamespace SwitchStatementToExpression\n{\n    class Program\n    {\n        static void Main()\n        {\n            Console.WriteLine(M(true));\n            Console.WriteLine(M(false));\n        }\n\n        static int M(bool x)\n            => x switch\n            {\n                true => 1,\n                false => 0,\n            };\n    }\n}\n"
  },
  {
    "path": "Demo/2019/SwitchStatementToExpression/SwitchStatementToExpression/SwitchStatementToExpression.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n    <LangVersion>preview</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/SwitchStatementToExpression/SwitchStatementToExpression.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.28917.182\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SwitchStatementToExpression\", \"SwitchStatementToExpression\\SwitchStatementToExpression.csproj\", \"{7D15F96C-DB5D-424A-96DE-D42CBAAA2145}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{7D15F96C-DB5D-424A-96DE-D42CBAAA2145}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7D15F96C-DB5D-424A-96DE-D42CBAAA2145}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7D15F96C-DB5D-424A-96DE-D42CBAAA2145}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7D15F96C-DB5D-424A-96DE-D42CBAAA2145}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {044EDB45-FD3F-4EFA-8A1F-8A5947CE3632}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/BlockingSynchronizationContext.cs",
    "content": "﻿using System;\nusing System.Collections.Concurrent;\nusing System.Threading;\n\nnamespace ThreadPost\n{\n    public class BlockingSynchronizationContext : SynchronizationContext, IDisposable\n    {\n        private readonly Thread _t;\n        private CancellationTokenSource _cts = new CancellationTokenSource();\n\n        public BlockingSynchronizationContext()\n        {\n            var t = _t = new Thread(Process);\n            t.Start();\n        }\n\n        public override void Post(SendOrPostCallback d, object state) => _queue.Add(new SynchronizationContextPostItem(d, state));\n\n        private BlockingCollection<SynchronizationContextPostItem> _queue = new BlockingCollection<SynchronizationContextPostItem>();\n\n        private void Process()\n        {\n            SetSynchronizationContext(this);\n\n            while (!_cts.IsCancellationRequested)\n            {\n                try\n                {\n                    if (_queue.TryTake(out var t, 1000, _cts.Token))\n                    {\n                        t.Invoke(UnhandledException);\n                    }\n                }\n                catch (OperationCanceledException) { }\n            }\n        }\n\n        public void Dispose()\n        {\n            _cts.Cancel();\n            _t.Join();\n        }\n\n        public event UnhandledExceptionEventHandler UnhandledException;\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/IUpdatable.cs",
    "content": "﻿using System.Threading;\n\nnamespace ThreadPost\n{\n    public interface IUpdatable\n    {\n        void Initialize();\n        void Upadte(CancellationToken cancellationToken);\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/IntervalUpdateThread.cs",
    "content": "﻿using System;\nusing System.Threading;\n\nnamespace ThreadPost\n{\n    public class IntervalUpdateThread : IDisposable\n    {\n        private IUpdatable _updatable;\n        private readonly Thread _t;\n        private readonly CancellationTokenSource _cts = new CancellationTokenSource();\n        private readonly long _intervalTicks;\n\n        public IntervalUpdateThread(TimeSpan interval, IUpdatable updatable)\n        {\n            _updatable = updatable;\n            _intervalTicks = interval.Ticks;\n            var t = _t = new Thread(Process);\n            t.Start();\n        }\n\n        private void Process()\n        {\n            _updatable.Initialize();\n\n            var last = DateTime.UtcNow.Ticks;\n\n            while (!_cts.IsCancellationRequested)\n            {\n                _updatable.Upadte(_cts.Token);\n\n                var current = DateTime.UtcNow.Ticks;\n\n                var next = last + _intervalTicks;\n                var ticksToNext = next - current;\n\n                if (ticksToNext > 0)\n                {\n                    Thread.Sleep(TimeSpan.FromTicks(ticksToNext));\n                }\n\n                last = DateTime.UtcNow.Ticks;\n            }\n        }\n\n        public void Dispose()\n        {\n            _cts.Cancel();\n            _t.Join();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/ManualResetValueTaskSource.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks.Sources;\n\nnamespace ThreadPost\n{\n    public class ManualResetValueTaskSource<T> : IValueTaskSource<T>, IValueTaskSource\n    {\n        private ManualResetValueTaskSourceCore<T> _core;\n\n        public bool RunContinuationsAsynchronously { get => _core.RunContinuationsAsynchronously; set => _core.RunContinuationsAsynchronously = value; }\n        public short Version => _core.Version;\n        public void Reset() => _core.Reset();\n        public void SetResult(T result) => _core.SetResult(result);\n        public void SetException(Exception error) => _core.SetException(error);\n        public virtual T GetResult(short token) => _core.GetResult(token);\n\n        void IValueTaskSource.GetResult(short token) => _core.GetResult(token);\n        public ValueTaskSourceStatus GetStatus(short token) => _core.GetStatus(token);\n        public void OnCompleted(Action<object> continuation, object state, short token, ValueTaskSourceOnCompletedFlags flags) => _core.OnCompleted(continuation, state, token, flags);\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/ObjectPool.cs",
    "content": "﻿using System;\nusing System.Collections.Concurrent;\n\nnamespace ThreadPost\n{\n    public class ObjectPool<T>\n    {\n        private readonly Func<T> _generator;\n        private readonly ConcurrentQueue<T> _queue = new ConcurrentQueue<T>();\n\n        public ObjectPool(Func<T> generator) => _generator = generator;\n\n        public T Rent() => _queue.TryDequeue(out var value) ? value : _generator();\n        public void Return(T value) => _queue.Enqueue(value);\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace ThreadPost\n{\n    class A\n    {\n        private ManualResetValueTaskSource<int> _source = new ManualResetValueTaskSource<int>();\n        private short _lastToken;\n\n        public async IAsyncEnumerable<int> GetStream()\n        {\n            while (true)\n            {\n                _source.Reset();\n                _lastToken = _source.Version;\n                yield return await new ValueTask<int>(_source, _source.Version);\n            }\n        }\n\n        public bool TrySet(int value)\n        {\n            if (_lastToken != _source.Version) return false;\n            if (_source.GetStatus(_source.Version) != System.Threading.Tasks.Sources.ValueTaskSourceStatus.Pending) return false;\n            _source.SetResult(value);\n            return true;\n        }\n\n        private TaskCompletionSource<object> _tcs = new TaskCompletionSource<object>();\n        public Task Task => _tcs.Task;\n\n        public void Complete() => _tcs.TrySetResult(null);\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            const double IntervalSeconds = 0.01;\n            const int N = 1000;\n\n            var result = new (int id1, int id2, int i, int j)[N];\n            var a = new A();\n            var t1 = new UpdatableSynchronizationContext();\n            using var u = new IntervalUpdateThread(TimeSpan.FromSeconds(IntervalSeconds), t1);\n            using var t2 = new BlockingSynchronizationContext();\n\n            t1.Post(async _ =>\n            {\n                for (int i = 0; i < N; i++)\n                {\n                    while (!a.TrySet(i)) await Task.Delay(1);\n\n                    var j = await t2.PostAsync(i => i * Thread.CurrentThread.ManagedThreadId, (long)i);\n\n                    result[i].id1 = Thread.CurrentThread.ManagedThreadId;\n                    result[i].j = (int)j;\n                }\n            }, null);\n\n            t2.Post(async _ =>\n            {\n                await foreach (var i in a.GetStream())\n                {\n                    result[i].id2 = Thread.CurrentThread.ManagedThreadId;\n                    result[i].i = i;\n\n                    if (i == N - 1) break;\n                }\n\n                a.Complete();\n            }, null);\n\n            Console.WriteLine(\"waiting\");\n            a.Task.Wait();\n            Console.WriteLine(\"done\");\n\n            foreach (var (id1, id2, i, j) in result)\n            {\n                Console.WriteLine((id1, id2, (j + id2) / (i + 1) - id2));\n            }\n\n            Console.WriteLine(SynchronizationContextAsyncExtensions.GetFuncDiagCount<long, long>());\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/SynchronizationContextAsyncExtensions.Action0.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace ThreadPost\n{\n    public static partial class SynchronizationContextAsyncExtensions\n    {\n        public static ValueTask PostAsync(this SynchronizationContext context, Action func)\n        {\n            var t = ActionValueTaskSource.Rent(func);\n            context.Post(x => Unsafe.As<object, ActionValueTaskSource>(ref x).Invoke(), t);\n            return new ValueTask(t, t.Version);\n        }\n\n        private class ActionValueTaskSource : ManualResetValueTaskSource<object>\n        {\n            private ObjectPool<ActionValueTaskSource> Pool;\n            private Action State;\n\n            public override object GetResult(short token)\n            {\n                var r = base.GetResult(token);\n                Pool.Return(this);\n                Pool = null;\n                return r;\n            }\n\n            public void Invoke()\n            {\n                var func = State;\n                State = default;\n\n                try\n                {\n                    func();\n                    SetResult(null);\n                }\n                catch (Exception ex)\n                {\n                    SetException(ex);\n                }\n            }\n\n            private static readonly ObjectPool<ActionValueTaskSource> _pool = new ObjectPool<ActionValueTaskSource>(() => new ActionValueTaskSource());\n\n            public static ActionValueTaskSource Rent(Action func)\n            {\n                var r = _pool.Rent();\n                r.Pool = _pool;\n                r.State = func;\n                r.Reset();\n                return r;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/SynchronizationContextAsyncExtensions.Action1.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace ThreadPost\n{\n    public static partial class SynchronizationContextAsyncExtensions\n    {\n        public static ValueTask PostAsync<TState>(this SynchronizationContext context, Action<TState> func, TState state)\n        {\n            var t = StateActionValueTaskSource<TState>.Rent(func, state);\n            context.Post(x => Unsafe.As<object, StateActionValueTaskSource<TState>>(ref x).Invoke(), t);\n            return new ValueTask(t, t.Version);\n        }\n\n        private class StateActionValueTaskSource<TState> : ManualResetValueTaskSource<object>\n        {\n            private ObjectPool<StateActionValueTaskSource<TState>> Pool;\n            private (Action<TState> func, TState state) State;\n\n            public override object GetResult(short token)\n            {\n                var r = base.GetResult(token);\n                Pool.Return(this);\n                Pool = null;\n                return r;\n            }\n\n            public void Invoke()\n            {\n                var (func, state) = State;\n                State = default;\n\n                try\n                {\n                    func(state);\n                    SetResult(null);\n                }\n                catch (Exception ex)\n                {\n                    SetException(ex);\n                }\n            }\n\n            private static readonly ObjectPool<StateActionValueTaskSource<TState>> _pool = new ObjectPool<StateActionValueTaskSource<TState>>(() => new StateActionValueTaskSource<TState>());\n\n            public static StateActionValueTaskSource<TState> Rent(Action<TState> func, TState state)\n            {\n                var r = _pool.Rent();\n                r.Pool = _pool;\n                r.State = (func, state);\n                r.Reset();\n                return r;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/SynchronizationContextAsyncExtensions.Diagnostics.cs",
    "content": "﻿using System.Collections.Concurrent;\n\nnamespace ThreadPost\n{\n    public static partial class SynchronizationContextAsyncExtensions\n    {\n        public static int GetFuncDiagCount<TState, TResult>() => GetDiagCount<StateFuncValueTaskSource<TState, TResult>>();\n        public static int GetFuncDiagCount<TResult>() => GetDiagCount<FuncValueTaskSource<TResult>>();\n        public static int GetActionDiagCount<TState>() => GetDiagCount<StateActionValueTaskSource<TState>>();\n        public static int GetActionDiagCount() => GetDiagCount<ActionValueTaskSource>();\n\n        public static int GetDiagCount<T>()\n        {\n            var p = typeof(T).GetField(\"_pool\", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);\n            var q = typeof(ObjectPool<T>).GetField(\"_queue\", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);\n            var c = typeof(ConcurrentQueue<T>).GetProperty(\"Count\", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);\n            return (int)c.GetValue(q.GetValue(p.GetValue(null)));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/SynchronizationContextAsyncExtensions.Func1.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace ThreadPost\n{\n    public static partial class SynchronizationContextAsyncExtensions\n    {\n        public static ValueTask<TResult> PostAsync<TResult>(this SynchronizationContext context, Func<TResult> func)\n        {\n            var t = FuncValueTaskSource<TResult>.Rent(func);\n            context.Post(x => Unsafe.As<object, FuncValueTaskSource<TResult>>(ref x).Invoke(), t);\n            return new ValueTask<TResult>(t, t.Version);\n        }\n\n        private class FuncValueTaskSource<TResult> : ManualResetValueTaskSource<TResult>\n        {\n            private ObjectPool<FuncValueTaskSource<TResult>> Pool;\n            private Func<TResult> State;\n\n            public override TResult GetResult(short token)\n            {\n                var r = base.GetResult(token);\n                Pool.Return(this);\n                Pool = null;\n                return r;\n            }\n\n            public void Invoke()\n            {\n                var func = State;\n                State = default;\n\n                try\n                {\n                    var r = func();\n                    SetResult(r);\n                }\n                catch (Exception ex)\n                {\n                    SetException(ex);\n                }\n            }\n\n            private static readonly ObjectPool<FuncValueTaskSource<TResult>> _pool = new ObjectPool<FuncValueTaskSource<TResult>>(() => new FuncValueTaskSource<TResult>());\n\n            public static FuncValueTaskSource<TResult> Rent(Func<TResult> func)\n            {\n                var r = _pool.Rent();\n                r.Pool = _pool;\n                r.State = func;\n                r.Reset();\n                return r;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/SynchronizationContextAsyncExtensions.Func2.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace ThreadPost\n{\n    public static partial class SynchronizationContextAsyncExtensions\n    {\n        public static ValueTask<TResult> PostAsync<TState, TResult>(this SynchronizationContext context, Func<TState, TResult> func, TState state)\n        {\n            var t = StateFuncValueTaskSource<TState, TResult>.Rent(func, state);\n            context.Post(x => Unsafe.As<object, StateFuncValueTaskSource<TState, TResult>>(ref x).Invoke(), t);\n            return new ValueTask<TResult>(t, t.Version);\n        }\n\n        private class StateFuncValueTaskSource<TState, TResult> : ManualResetValueTaskSource<TResult>\n        {\n            private ObjectPool<StateFuncValueTaskSource<TState, TResult>> Pool;\n            private (Func<TState, TResult> func, TState state) State;\n\n            public override TResult GetResult(short token)\n            {\n                var r = base.GetResult(token);\n                Pool.Return(this);\n                Pool = null;\n                return r;\n            }\n\n            public void Invoke()\n            {\n                var (func, state) = State;\n                State = default;\n\n                try\n                {\n                    var r = func(state);\n                    SetResult(r);\n                }\n                catch (Exception ex)\n                {\n                    SetException(ex);\n                }\n            }\n\n            private static readonly ObjectPool<StateFuncValueTaskSource<TState, TResult>> _pool = new ObjectPool<StateFuncValueTaskSource<TState, TResult>>(() => new StateFuncValueTaskSource<TState, TResult>());\n\n            public static StateFuncValueTaskSource<TState, TResult> Rent(Func<TState, TResult> func, TState state)\n            {\n                var r = _pool.Rent();\n                r.Pool = _pool;\n                r.State = (func, state);\n                r.Reset();\n                return r;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/SynchronizationContextPostItem.cs",
    "content": "﻿using System;\nusing System.Threading;\n\nnamespace ThreadPost\n{\n    internal readonly struct SynchronizationContextPostItem\n    {\n        private readonly SendOrPostCallback _callback;\n        private readonly object _state;\n\n        public SynchronizationContextPostItem(SendOrPostCallback callback, object state)\n        {\n            _callback = callback;\n            _state = state;\n        }\n\n        public void Invoke(UnhandledExceptionEventHandler exceptionHandler)\n        {\n            try\n            {\n                _callback(_state);\n            }\n            catch (Exception ex)\n            {\n                exceptionHandler?.Invoke(this, new UnhandledExceptionEventArgs(ex, false));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/ThreadPost.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp3.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.IO.Pipelines\" Version=\"4.5.3\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost/UpdatableSynchronizationContext.cs",
    "content": "﻿using System;\nusing System.Collections.Concurrent;\nusing System.Threading;\n\nnamespace ThreadPost\n{\n    public class UpdatableSynchronizationContext : SynchronizationContext, IUpdatable\n    {\n        public override void Post(SendOrPostCallback d, object state) => _queue.Enqueue(new SynchronizationContextPostItem(d, state));\n\n        private ConcurrentQueue<SynchronizationContextPostItem> _queue = new ConcurrentQueue<SynchronizationContextPostItem>();\n\n        public void Initialize() => SetSynchronizationContext(this);\n        public void Upadte(CancellationToken cancellationToken)\n        {\n            while (!_queue.IsEmpty && !cancellationToken.IsCancellationRequested)\n            {\n                if (_queue.TryDequeue(out var t))\n                {\n                    t.Invoke(UnhandledException);\n                }\n            }\n        }\n\n        public event UnhandledExceptionEventHandler UnhandledException;\n    }\n}\n"
  },
  {
    "path": "Demo/2019/ThreadPost/ThreadPost.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.29209.152\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ThreadPost\", \"ThreadPost\\ThreadPost.csproj\", \"{D6482DF6-7850-41F7-A870-2EC8606D30E0}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{D6482DF6-7850-41F7-A870-2EC8606D30E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D6482DF6-7850-41F7-A870-2EC8606D30E0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D6482DF6-7850-41F7-A870-2EC8606D30E0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D6482DF6-7850-41F7-A870-2EC8606D30E0}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {88A215EF-9A72-413B-883C-BBF839FB9503}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/Csharp9_0.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.31004.235\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"TopLevelProgram\", \"TopLevelProgram\\TopLevelProgram.csproj\", \"{52D88EEF-F6A3-4019-B47F-FD2BDE69670E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ModuleInitializer\", \"ModuleInitializer\\ModuleInitializer.csproj\", \"{D680BC95-75F3-4AA4-99BF-D008C45FC7D5}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NullableReferenceType9\", \"NullableReferenceType9\\NullableReferenceType9.csproj\", \"{95AE8617-61EE-4D82-A8FF-B634E3BFBC08}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{52D88EEF-F6A3-4019-B47F-FD2BDE69670E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{52D88EEF-F6A3-4019-B47F-FD2BDE69670E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{52D88EEF-F6A3-4019-B47F-FD2BDE69670E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{52D88EEF-F6A3-4019-B47F-FD2BDE69670E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D680BC95-75F3-4AA4-99BF-D008C45FC7D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D680BC95-75F3-4AA4-99BF-D008C45FC7D5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D680BC95-75F3-4AA4-99BF-D008C45FC7D5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D680BC95-75F3-4AA4-99BF-D008C45FC7D5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{95AE8617-61EE-4D82-A8FF-B634E3BFBC08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{95AE8617-61EE-4D82-A8FF-B634E3BFBC08}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{95AE8617-61EE-4D82-A8FF-B634E3BFBC08}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{95AE8617-61EE-4D82-A8FF-B634E3BFBC08}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {03C69979-6F1E-492D-811F-AAE18CDDB5D1}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/ModuleInitializer/ModuleInitializer.cs",
    "content": "﻿#if true\n\n// 方式3: モジュール初期化子で登録\n\nusing System;\nusing System.Runtime.CompilerServices;\n\n// モジュール初期化子の場合、その型を含むモジュール(dll とか exe とか)がロードされた直後に必ず呼ばれる。\n// 静的コンストラクターの「型に触れた瞬間」よりは確実に呼ばれる保証あり。\nConsole.WriteLine(TypeRepository.CreateInstance(\"A\")); // A\nConsole.WriteLine(TypeRepository.CreateInstance(\"B\")); // B\n\n// 静的コンストラクターだと呼ばれるタイミングが不定で問題があったけど、モジュール初期化子なら大丈夫。\nclass A\n{\n    [ModuleInitializer]\n    public static void Init() => TypeRepository.Register(nameof(A), () => new A());\n}\n\nclass B\n{\n    [ModuleInitializer]\n    public static void Init() => TypeRepository.Register(nameof(B), () => new B());\n}\n\n// ただ、ジェネリックな型に対して同じことをしようとすると…\nclass Generic<T>\n{\n}\n\n// 非ジェネリックなものを1個用意して、\nclass Generic\n{\n    [ModuleInitializer]\n    public static void Init()\n    {\n        TypeRepository.Register(typeof(Generic<>) + \"<int>\", () => new Generic<int>());\n        TypeRepository.Register(typeof(Generic<>) + \"<string>\", () => new Generic<string>());\n        // 以下、使うことがわかっている限りの具象型を並べる必要がある。\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/ModuleInitializer/ModuleInitializer.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net5.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/ModuleInitializer/Reflection.cs",
    "content": "﻿#if false\n\n// 方式1: リフレクション\n\nusing System;\nusing System.Reflection;\n\n// リフレクションを使えば文字列からその名前の型のインスタンスを作れる。\n// ただ、パフォーマンスはあんまりよくない。\nobject? CreateInstance(string typeName)\n{\n    if (Assembly.GetExecutingAssembly().GetType(typeName) is { } t) return Activator.CreateInstance(t);\n    else return null;\n}\n\n// ただ、 \"A\", \"B\" という文字列が型名を指しているかどうかはコンパイラーが関知することではなく、\n// 「クラス A, B は誰も使っていない」誤判定を受けることがある。\n// AOT (事前ネイティブコード化)実行環境だと A, B が消し去られて、上記 GetType に失敗しうる。\nConsole.WriteLine(CreateInstance(\"A\"));\nConsole.WriteLine(CreateInstance(\"B\"));\n\nclass A\n{\n}\n\nclass B\n{\n}\n\n#endif\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/ModuleInitializer/Sample.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nclass Sample\n{\n    [ModuleInitializer]\n    public static void Init()\n    {\n        Console.WriteLine(\"必ず1回だけ呼ばれる\");\n    }\n\n    public class C1\n    {\n        [ModuleInitializer]\n        public static void Init1() { }\n\n        [ModuleInitializer]\n        public static void Init2() { }\n    }\n\n    public class C2\n    {\n        [ModuleInitializer]\n        public static void Init1() { }\n    }\n\n#if ERROR\n    public class Generic<T>\n    {\n        // これはコンパイル エラー。\n        // 静的コンストラクターなら、 Generic<int> みたいな具象化した型ごとに呼ばれるけど、\n        // モジュール初期化のタイミングでは何の型で具象化されるかわからなくて呼びようがない。\n        [ModuleInitializer]\n        public static void Init1() { }\n    }\n#endif\n}\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/ModuleInitializer/StaticConstructor.cs",
    "content": "﻿#if false\n\n// 方式2: 静的コンストラクターで登録\n\nusing System;\nusing System.Collections.Generic;\n\n// 後述するように、静的コンストラクターはこの用途だと呼ばれない。\n// なので、Register が呼ばれてなくて、CreateInstance が null を返す。\nConsole.WriteLine(TypeRepository.CreateInstance(\"A\")); // null\nConsole.WriteLine(TypeRepository.CreateInstance(\"B\")); // null\n\n// これが例えば、どこでもいいから1度 A のメンバーを空呼びすると上記コードがちゃんと new A(), new B() を返すようになる。\n// 静的コンストラクターが呼ばれるタイミングは「その型のメンバーを最初に使った直後」\n_ = new A(); // このタイミングで A の静的コンストラクターが呼ばれる\n_ = new B(); // このタイミングで B の静的コンストラクターが呼ばれる\nConsole.WriteLine(TypeRepository.CreateInstance(\"A\")); // A\nConsole.WriteLine(TypeRepository.CreateInstance(\"B\")); // B\n\n// あまり手書きはしたくないものの、Source Generator がある今、\n// 必要な型に対して以下のようなコード生成をするのは十分現実的。\n// ただ、静的コンストラクターは呼ばれるタイミングに問題があって…\nclass A\n{\n    static A() => TypeRepository.Register(nameof(A), () => new A());\n}\n\nclass B\n{\n    static B() => TypeRepository.Register(nameof(B), () => new B());\n}\n\n#endif\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/ModuleInitializer/TypeRepository.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\n// どこか必ず1回呼ばれる保証のあるものを使って、事前に string → Func<object> な辞書を作っておくという発想。\nstatic class TypeRepository\n{\n    private static readonly Dictionary<string, Func<object>> _factories = new();\n\n    // 型名からインスタンスを作る。Register がどこかで呼ばれる前提。\n    public static object? CreateInstance(string typeName) => _factories.TryGetValue(typeName, out var f) ? f() : null;\n\n    // 型名 → インスタンス生成デリゲートを登録。\n    // 静的コンストラクターで呼んでもらう想定だと破綻気味だったけど、モジュール初期化子なら割と成立する。\n    public static void Register(string typeName, Func<object> factory) => _factories.Add(typeName, factory);\n}\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/NullableReferenceType9/DefaultConstraint.cs",
    "content": "﻿#nullable disable\n\n// さかのぼること、null 許容参照型導入前にから以下のような書き方ができた。\nclass Csharp7\n{\n    // これは Nullable<T> の意味に。\n    public T? M<T>(T? x) where T : struct => null;\n\n    // T と Nullable<T> は別の型扱いなのでオーバーロード可能。\n    public T M<T>(T x) => default;\n}\n\n#nullable enable\n\n// ここで、null 許容参照型を有効化。\n// 特に、C# 9.0 では制約なし型引数に対して T? と書けるようになったので…\nclass Base\n{\n    // これは Nullable<T> の意味に。\n    public virtual T? M<T>(T? t) where T : struct => null;\n\n    // これは C# 9.0 の制約なし型引数に対する null 許容(正確には default 許容)アノテーション。\n    // T と Nullable<T> 違いのオーバーロードという扱いになる。\n    public virtual T? M<T>(T? t) => default;\n}\n\n// さらに紛らわしいのが↑を override したときで…\nclass Derived : Base\n{\n    // これ、実は Nullable<T> の意味。\n    // 親クラス側の where T : struct 制約を自動的に引き継いでしまう。\n    // こうしないと C# 8.0 以前との整合性が取れないとのこと。\n    public override T? M<T>(T? t) => null;\n\n    // ということで、制約なし T? の方を参照するために別の制約が必要になったという経緯があり。\n    // override 時に限り、where T : struct じゃない方に、逆に where T : default という制約を書く必要がある。\n    public override T? M<T>(T? t) where T : default => default;\n}\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/NullableReferenceType9/MemberNotNull.cs",
    "content": "﻿#nullable enable\n\nusing System.Diagnostics.CodeAnalysis;\n\nnamespace NullableReferenceType9.MemberNotNull\n{\n    class Sample\n    {\n        /// <summary>\n        /// string (? が付いていないので非 null)なプロパティは、#nullable enable コンテキスト下では初期化が必須。\n        /// 初期化しないと警告あり。\n        /// </summary>\n        public string Text { get; private set; }\n\n#if false\n        // こう書くなら警告が消える\n        public Sample(string text)\n        {\n            Text = text;\n        }\n#endif\n\n#if false\n        public Sample()\n        {\n            // InitText の中で Text プロパティを非 null 初期化してるので認めてほしいものの…\n            // この状態だとその判定ができなくて警告が消えない。\n            InitText();\n        }\n\n        private void InitText()\n        {\n            Text = \"non-null string\";\n        }\n#endif\n\n        public Sample()\n        {\n            // これなら警告が消える。\n            InitText();\n        }\n\n        // MemberNotNull 属性を付けることで、このメソッド内で Text プロパティを初期化している保証が付く。\n        [MemberNotNull(nameof(Text))]\n        private void InitText()\n        {\n            Text = \"non-null string\";\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/NullableReferenceType9/NullableReferenceType9.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/NullableReferenceType9/Program.cs",
    "content": "﻿#nullable enable\n\nusing System;\n\n// この2つに関しては default == null なので変なことにはならない。\nConsole.WriteLine(M<string?>()); // null\nConsole.WriteLine(M<string>()); // null\nConsole.WriteLine(M<int?>()); // null\n\n// 問題が非 null 値型で、この場合 default != null なのでちょっと変。\nConsole.WriteLine(M<int>()); // 0\n\n// ジェネリックな T? は nullable じゃなくて defaultable。\n// default を渡しても警告にならない。 \nstatic T? M<T>() => default;\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/NullableReferenceType9/UnconstrainedGenericParameter.cs",
    "content": "﻿#nullable enable\n\n/// <summary>\n/// 制約なし(where T : class とか where T : struct とか付いてない)ジェネリック型引数に対する T? の話。\n/// </summary>\n/// <typeparam name=\"T\"></typeparam>\nclass Generic<T>\n{\n    // C# 9.0 では一応 T? と書ける。\n    public T? M() => default;\n}\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/TopLevelProgram/Program.cs",
    "content": "﻿using System;\n\nConsole.WriteLine(\"Hello World!\");\n"
  },
  {
    "path": "Demo/2020/Csharp9_0/TopLevelProgram/TopLevelProgram.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net5.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/AddDuplicateBehavior.cs",
    "content": "﻿namespace MetricSpace\n{\n    public enum AddDuplicateBehavior\n    {\n        Skip,\n        Error,\n        Update\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/DuplicateNodeError.cs",
    "content": "﻿using System;\n\nnamespace MetricSpace\n{\n    public class DuplicateNodeError : Exception\n    {\n        public DuplicateNodeError()\n            : base(\"Cannot Add Node With Duplicate Coordinates\")\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/KdTree.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace MetricSpace\n{\n    public partial class Point<T, TArithmetic>\n    {\n        public partial class Dimension<TArray, TArrayAccessor>\n        {\n            public partial class Metric<TMetric>\n            {\n                [Serializable]\n                public partial class KdTree<TValue> : IEnumerable<(TArray Point, TValue Value)>\n                {\n                    public TMetric Metric;\n\n                    private static readonly int Dimension = _accessor.Length;\n                    private static bool Equals(TArray a, TArray b) => FixedArray<T, TArray, TArrayAccessor>.Equals(a, b);\n                    private static int Compare(T a, T b) => a.CompareTo(b);\n\n                    public KdTree()\n                    {\n                        Count = 0;\n                    }\n\n                    public KdTree(AddDuplicateBehavior addDuplicateBehavior)\n                    {\n                        AddDuplicateBehavior = addDuplicateBehavior;\n                    }\n\n                    private Node? root = null;\n\n                    public AddDuplicateBehavior AddDuplicateBehavior { get; private set; }\n\n                    private int Increment(int value)\n                    {\n                        value++;\n                        if (value >= Dimension) return 0;\n                        return value;\n                    }\n\n                    public bool Add(TArray point, TValue value)\n                    {\n                        var accessor = default(TArrayAccessor);\n                        var nodeToAdd = new Node(point, value);\n\n                        if (root == null)\n                        {\n                            root = new Node(point, value);\n                        }\n                        else\n                        {\n                            int dimension = -1;\n                            Node parent = root;\n\n                            do\n                            {\n                                // Increment the dimension we're searching in\n                                dimension = Increment(dimension);\n\n                                // Does the node we're adding have the same hyperpoint as this node?\n                                if (Equals(point, parent.Point))\n                                {\n                                    switch (AddDuplicateBehavior)\n                                    {\n                                        case AddDuplicateBehavior.Skip:\n                                            return false;\n\n                                        case AddDuplicateBehavior.Error:\n                                            throw new DuplicateNodeError();\n\n                                        case AddDuplicateBehavior.Update:\n                                            parent.Value = value;\n                                            break;\n\n                                        default:\n                                            // Should never happen\n                                            throw new Exception(\"Unexpected AddDuplicateBehavior\");\n                                    }\n                                }\n\n                                // Which side does this node sit under in relation to it's parent at this level?\n                                int compare = Compare(accessor.At(ref point, dimension), accessor.At(ref parent.Point, dimension));\n\n                                var x = parent[compare];\n                                if (x != null)\n                                {\n                                    parent = x;\n                                }\n                                else\n                                {\n                                    parent[compare] = nodeToAdd;\n                                    break;\n                                }\n                            }\n                            while (true);\n                        }\n\n                        Count++;\n                        return true;\n                    }\n\n                    private void ReaddChildNodes(Node removedNode)\n                    {\n                        if (removedNode.IsLeaf)\n                            return;\n\n                        // The folllowing code might seem a little redundant but we're using \n                        // 2 queues so we can add the child nodes back in, in (more or less) \n                        // the same order they were added in the first place\n                        var nodesToReadd = new Queue<Node>();\n\n                        var nodesToReaddQueue = new Queue<Node>();\n\n                        if (removedNode.LeftChild != null)\n                            nodesToReaddQueue.Enqueue(removedNode.LeftChild);\n\n                        if (removedNode.RightChild != null)\n                            nodesToReaddQueue.Enqueue(removedNode.RightChild);\n\n                        while (nodesToReaddQueue.Count > 0)\n                        {\n                            var nodeToReadd = nodesToReaddQueue.Dequeue();\n\n                            nodesToReadd.Enqueue(nodeToReadd);\n\n                            for (int side = -1; side <= 1; side += 2)\n                            {\n                                if (nodeToReadd[side] is Node nonNull)\n                                {\n                                    nodesToReaddQueue.Enqueue(nonNull);\n\n                                    nodeToReadd[side] = null;\n                                }\n                            }\n                        }\n\n                        while (nodesToReadd.Count > 0)\n                        {\n                            var nodeToReadd = nodesToReadd.Dequeue();\n\n                            Count--;\n                            Add(nodeToReadd.Point, nodeToReadd.Value);\n                        }\n                    }\n\n                    public void RemoveAt(TArray point)\n                    {\n                        // Is tree empty?\n                        if (root == null)\n                            return;\n\n                        Node node;\n\n                        if (Equals(point, root.Point))\n                        {\n                            node = root;\n                            root = null;\n                            Count--;\n                            ReaddChildNodes(node);\n                            return;\n                        }\n\n                        node = root;\n\n                        int dimension = -1;\n                        do\n                        {\n                            dimension = Increment(dimension);\n\n                            int compare = Compare(_accessor.At(ref point, dimension), _accessor.At(ref node.Point, dimension));\n\n                            var n = node[compare];\n                            if (n == null)\n                                // Can't find node\n                                return;\n\n                            if (Equals(point, n.Point))\n                            {\n                                var nodeToRemove = n;\n                                node[compare] = null;\n                                Count--;\n\n                                ReaddChildNodes(nodeToRemove);\n                            }\n                            else\n                                node = n;\n                        }\n                        while (node != null);\n                    }\n\n                    public void GetNearestNeighbours(TArray point, NearestNeighbourList<(TArray Key, TValue Value), T>.INearestNeighbourList results)\n                    {\n                        var rect = Rect.Infinite;\n                        AddNearestNeighbours(root, point, rect, 0, results, _arithmetic.MaxValue);\n                    }\n\n                    public (TArray Key, TValue Value)[] GetNearestNeighbours(TArray point, int count = int.MaxValue)\n                    {\n                        if (count > Count)\n                            count = Count;\n\n                        if (count < 0)\n                        {\n                            throw new ArgumentException(\"Number of neighbors cannot be negative\");\n                        }\n\n                        if (count == 0)\n                            return Array.Empty<(TArray Key, TValue Value)>();\n\n                        var nearestNeighbours = CreateNearestNeighbourList(count);\n\n                        var rect = Rect.Infinite;\n\n                        AddNearestNeighbours(root, point, rect, 0, nearestNeighbours, _arithmetic.MaxValue);\n\n                        return nearestNeighbours.GetSortedArray();\n                    }\n\n                    /*\n\t\t\t\t\t * 1. Search for the target\n\t\t\t\t\t * \n\t\t\t\t\t *   1.1 Start by splitting the specified hyper rect\n\t\t\t\t\t *       on the specified node's point along the current\n\t\t\t\t\t *       dimension so that we end up with 2 sub hyper rects\n\t\t\t\t\t *       (current dimension = depth % dimensions)\n\t\t\t\t\t *   \n\t\t\t\t\t *\t 1.2 Check what sub rectangle the the target point resides in\n\t\t\t\t\t *\t     under the current dimension\n\t\t\t\t\t *\t     \n\t\t\t\t\t *   1.3 Set that rect to the nearer rect and also the corresponding \n\t\t\t\t\t *       child node to the nearest rect and node and the other rect \n\t\t\t\t\t *       and child node to the further rect and child node (for use later)\n\t\t\t\t\t *       \n\t\t\t\t\t *   1.4 Travel into the nearer rect and node by calling function\n\t\t\t\t\t *       recursively with nearer rect and node and incrementing \n\t\t\t\t\t *       the depth\n\t\t\t\t\t * \n\t\t\t\t\t * 2. Add leaf to list of nearest neighbours\n\t\t\t\t\t * \n\t\t\t\t\t * 3. Walk back up tree and at each level:\n\t\t\t\t\t * \n\t\t\t\t\t *    3.1 Add node to nearest neighbours if\n\t\t\t\t\t *        we haven't filled our nearest neighbour\n\t\t\t\t\t *        list yet or if it has a distance to target less\n\t\t\t\t\t *        than any of the distances in our current nearest \n\t\t\t\t\t *        neighbours.\n\t\t\t\t\t *        \n\t\t\t\t\t *    3.2 If there is any point in the further rectangle that is closer to\n\t\t\t\t\t *        the target than our furtherest nearest neighbour then travel into\n\t\t\t\t\t *        that rect and node\n\t\t\t\t\t * \n\t\t\t\t\t *  That's it, when it finally finishes traversing the branches \n\t\t\t\t\t *  it needs to we'll have our list!\n\t\t\t\t\t */\n\n                    private void AddNearestNeighbours(\n                        Node? node,\n                        TArray target,\n                        Rect rect,\n                        int depth,\n                        NearestNeighbourList<(TArray Key, TValue Value), T>.INearestNeighbourList nearestNeighbours,\n                        T maxSearchRadiusSquared)\n                    {\n                        if (node == null)\n                            return;\n\n                        // Work out the current dimension\n                        int dimension = depth % Dimension;\n\n                        var nodeKey = _accessor.At(ref node.Point, dimension);\n\n                        // Split our hyper-rect into 2 sub rects along the current \n                        // node's point on the current dimension\n                        var leftRect = rect;\n                        _accessor.At(ref leftRect.MaxPoint, dimension) = nodeKey;\n\n                        var rightRect = rect;\n                        _accessor.At(ref rightRect.MinPoint, dimension) = nodeKey;\n\n                        // Which side does the target reside in?\n                        int compare = Compare(_accessor.At(ref target, dimension), nodeKey);\n\n                        var nearerRect = compare <= 0 ? leftRect : rightRect;\n                        var furtherRect = compare <= 0 ? rightRect : leftRect;\n\n                        var nearerNode = compare <= 0 ? node.LeftChild : node.RightChild;\n                        var furtherNode = compare <= 0 ? node.RightChild : node.LeftChild;\n\n                        // Let's walk down into the nearer branch\n                        if (nearerNode != null)\n                        {\n                            AddNearestNeighbours(\n                                nearerNode,\n                                target,\n                                nearerRect,\n                                depth + 1,\n                                nearestNeighbours,\n                                maxSearchRadiusSquared);\n                        }\n\n                        var metric = Metric;\n\n                        // Walk down into the further branch but only if our capacity hasn't been reached \n                        // OR if there's a region in the further rect that's closer to the target than our\n                        // current furtherest nearest neighbour\n                        TArray closestPointInFurtherRect = furtherRect.GetClosestPoint(target);\n                        var distanceSquaredToTarget = metric.DistanceSquared(closestPointInFurtherRect, target);\n\n                        if (Compare(distanceSquaredToTarget, maxSearchRadiusSquared) <= 0)\n                        {\n                            if (!nearestNeighbours.IsFull || Compare(distanceSquaredToTarget, nearestNeighbours.FurtherestDistance) < 0)\n                            {\n                                AddNearestNeighbours(\n                                    furtherNode,\n                                    target,\n                                    furtherRect,\n                                    depth + 1,\n                                    nearestNeighbours,\n                                    maxSearchRadiusSquared);\n                            }\n                        }\n\n                        // Try to add the current node to our nearest neighbours list\n                        distanceSquaredToTarget = metric.DistanceSquared(node.Point, target);\n\n                        if (Compare(distanceSquaredToTarget, maxSearchRadiusSquared) <= 0)\n                            nearestNeighbours.Add((node.Point, node.Value), distanceSquaredToTarget);\n                    }\n\n                    /// <summary>\n                    /// Performs a radial search up to a maximum count.\n                    /// </summary>\n                    /// <param name=\"center\">Center point</param>\n                    /// <param name=\"radius\">Radius to find neighbours within</param>\n                    /// <param name=\"count\">Maximum number of neighbours</param>\n                    public (TArray Key, TValue Value)[] RadialSearch(TArray center, T radius, int maxCapacity = int.MaxValue)\n                    {\n                        var results = CreateNearestNeighbourList(maxCapacity);\n                        RadialSearch(center, radius, results);\n                        return results.GetSortedArray();\n                    }\n\n                    public void RadialSearch(TArray center, T radius, NearestNeighbourList<(TArray Key, TValue Value), T>.INearestNeighbourList results)\n                    {\n                        AddNearestNeighbours(\n                            root,\n                            center,\n                            Rect.Infinite,\n                            0,\n                            results,\n                            _arithmetic.Multiply(radius, radius));\n                    }\n\n                    public int Count { get; private set; }\n\n                    public bool TryFindValueAt(TArray point, out TValue value)\n                    {\n                        var parent = root;\n                        int dimension = -1;\n                        do\n                        {\n                            if (parent == null)\n                            {\n                                value = default!;\n                                return false;\n                            }\n                            else if (Equals(point, parent.Point))\n                            {\n                                value = parent.Value;\n                                return true;\n                            }\n\n                            // Keep searching\n                            dimension = Increment(dimension);\n                            int compare = Compare(_accessor.At(ref point, dimension), _accessor.At(ref parent.Point, dimension));\n                            parent = parent[compare];\n                        }\n                        while (true);\n                    }\n\n                    public TValue FindValueAt(TArray point)\n                    {\n                        if (TryFindValueAt(point, out TValue value))\n                            return value;\n                        else\n                            return default!;\n                    }\n\n                    public bool TryFindValue(TValue value, out TArray point)\n                    {\n                        if (root == null)\n                        {\n                            point = default;\n                            return false;\n                        }\n\n                        // First-in, First-out list of nodes to search\n                        var nodesToSearch = new Queue<Node>();\n\n                        nodesToSearch.Enqueue(root);\n\n                        while (nodesToSearch.Count > 0)\n                        {\n                            var nodeToSearch = nodesToSearch.Dequeue();\n\n                            if (nodeToSearch.Value!.Equals(value))\n                            {\n                                point = nodeToSearch.Point;\n                                return true;\n                            }\n                            else\n                            {\n                                for (int side = -1; side <= 1; side += 2)\n                                {\n                                    var childNode = nodeToSearch[side];\n\n                                    if (childNode != null)\n                                        nodesToSearch.Enqueue(childNode);\n                                }\n                            }\n                        }\n\n                        point = default;\n                        return false;\n                    }\n\n                    public TArray FindValue(TValue value)\n                    {\n                        if (TryFindValue(value, out TArray point))\n                            return point;\n                        else\n                            return default;\n                    }\n\n                    private void AddNodeToStringBuilder(Node node, StringBuilder sb, int depth)\n                    {\n                        sb.AppendLine(node.ToString());\n\n                        for (var side = -1; side <= 1; side += 2)\n                        {\n                            for (var index = 0; index <= depth; index++)\n                                sb.Append(\"\\t\");\n\n                            sb.Append(side == -1 ? \"L \" : \"R \");\n\n                            if (node[side] is Node nonNull)\n                                AddNodeToStringBuilder(nonNull, sb, depth + 1);\n                            else\n                                sb.AppendLine(\"\");\n                        }\n                    }\n\n                    public override string ToString()\n                    {\n                        if (root == null)\n                            return \"\";\n\n                        var sb = new StringBuilder();\n                        AddNodeToStringBuilder(root, sb, 0);\n                        return sb.ToString();\n                    }\n\n                    private void AddNodesToList(Node node, List<Node> nodes)\n                    {\n                        if (node == null)\n                            return;\n\n                        nodes.Add(node);\n\n                        for (var side = -1; side <= 1; side += 2)\n                        {\n                            if (node[side] is Node nonNull)\n                            {\n                                AddNodesToList(nonNull, nodes);\n                                node[side] = null;\n                            }\n                        }\n                    }\n\n                    private void SortNodesArray(Node?[] nodes, int byDimension, int fromIndex, int toIndex)\n                    {\n                        for (var index = fromIndex + 1; index <= toIndex; index++)\n                        {\n                            var newIndex = index;\n\n                            while (true)\n                            {\n                                var a = nodes[newIndex - 1];\n                                var b = nodes[newIndex];\n                                if (Compare(_accessor.At(ref b!.Point, byDimension), _accessor.At(ref a!.Point, byDimension)) < 0)\n                                {\n                                    nodes[newIndex - 1] = b;\n                                    nodes[newIndex] = a;\n                                }\n                                else\n                                    break;\n                            }\n                        }\n                    }\n\n                    private void AddNodesBalanced(Node?[] nodes, int byDimension, int fromIndex, int toIndex)\n                    {\n                        if (fromIndex == toIndex)\n                        {\n                            Add(nodes[fromIndex]!.Point, nodes[fromIndex]!.Value);\n                            nodes[fromIndex] = null;\n                            return;\n                        }\n\n                        // Sort the array from the fromIndex to the toIndex\n                        SortNodesArray(nodes, byDimension, fromIndex, toIndex);\n\n                        // Find the splitting point\n                        int midIndex = fromIndex + (int)System.Math.Round((toIndex + 1 - fromIndex) / 2f) - 1;\n\n                        // Add the splitting point\n                        Add(nodes[midIndex]!.Point, nodes[midIndex]!.Value);\n                        nodes[midIndex] = null;\n\n                        // Recurse\n                        int nextDimension = Increment(byDimension);\n\n                        if (fromIndex < midIndex)\n                            AddNodesBalanced(nodes, nextDimension, fromIndex, midIndex - 1);\n\n                        if (toIndex > midIndex)\n                            AddNodesBalanced(nodes, nextDimension, midIndex + 1, toIndex);\n                    }\n\n                    public void Balance()\n                    {\n                        var nodeList = new List<Node>();\n                        AddNodesToList(root!, nodeList);\n\n                        Clear();\n\n                        AddNodesBalanced(nodeList.ToArray(), 0, 0, nodeList.Count - 1);\n                    }\n\n                    private void RemoveChildNodes(Node node)\n                    {\n                        for (var side = -1; side <= 1; side += 2)\n                        {\n                            if (node[side] is Node nonNull)\n                            {\n                                RemoveChildNodes(nonNull);\n                                node[side] = null;\n                            }\n                        }\n                    }\n\n                    public void Clear()\n                    {\n                        if (root != null)\n                            RemoveChildNodes(root);\n                    }\n\n                    public IEnumerator<(TArray Point, TValue Value)> GetEnumerator()\n                    {\n                        var left = new Stack<Node>();\n                        var right = new Stack<Node>();\n\n                        void addLeft(Node node)\n                        {\n                            if (node.LeftChild != null)\n                            {\n                                left.Push(node.LeftChild);\n                            }\n                        }\n\n                        void addRight(Node node)\n                        {\n                            if (node.RightChild != null)\n                            {\n                                right.Push(node.RightChild);\n                            }\n                        }\n\n                        if (root != null)\n                        {\n                            yield return (root.Point, root.Value);\n\n                            addLeft(root);\n                            addRight(root);\n\n                            while (true)\n                            {\n                                if (left.Any())\n                                {\n                                    var item = left.Pop();\n\n                                    addLeft(item);\n                                    addRight(item);\n\n                                    yield return (item.Point, item.Value);\n                                }\n                                else if (right.Any())\n                                {\n                                    var item = right.Pop();\n\n                                    addLeft(item);\n                                    addRight(item);\n\n                                    yield return (item.Point, item.Value);\n                                }\n                                else\n                                {\n                                    break;\n                                }\n                            }\n                        }\n                    }\n\n                    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n\n                    public static NearestNeighbourList<(TArray Key, TValue Value), T>.List CreateNearestNeighbourList()\n                        => new NearestNeighbourList<(TArray Key, TValue Value), T>.List();\n\n                    public static NearestNeighbourList<(TArray Key, TValue Value), T>.List CreateNearestNeighbourList(int maxCount)\n                        => new NearestNeighbourList<(TArray Key, TValue Value), T>.List(maxCount);\n\n                    public static NearestNeighbourList<(TArray Key, TValue Value), T>.List CreateNearestNeighbourList(int maxCount, int capacity)\n                        => new NearestNeighbourList<(TArray Key, TValue Value), T>.List(maxCount, capacity);\n\n                    public static NearestNeighbourList<(TArray Key, TValue Value), T>.UnlimitedList CreateUnlimitedList()\n                        => new NearestNeighbourList<(TArray Key, TValue Value), T>.UnlimitedList();\n\n                    public static NearestNeighbourList<(TArray Key, TValue Value), T>.UnlimitedList CreateUnlimitedList(int capacity)\n                        => new NearestNeighbourList<(TArray Key, TValue Value), T>.UnlimitedList(capacity);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/KdTreeNode.cs",
    "content": "﻿using System;\nusing System.Text;\n\nnamespace MetricSpace\n{\n    public partial class Point<T, TArithmetic>\n    {\n        public partial class Dimension<TArray, TArrayAccessor>\n        {\n            public partial class Metric<TMetric>\n            {\n                public partial class KdTree<TValue>\n                {\n                    [Serializable]\n                    public class Node\n                    {\n                        public Node(TArray point, TValue value)\n                        {\n                            Point = point;\n                            Value = value;\n                        }\n\n                        public TArray Point;\n                        public TValue Value;\n\n                        internal Node? LeftChild = null;\n                        internal Node? RightChild = null;\n\n                        internal ref Node? this[int compare]\n                        {\n                            get\n                            {\n                                if (compare <= 0)\n                                    return ref LeftChild;\n                                else\n                                    return ref RightChild;\n                            }\n                        }\n\n                        public bool IsLeaf\n                        {\n                            get\n                            {\n                                return (LeftChild == null) && (RightChild == null);\n                            }\n                        }\n\n                        public override string ToString()\n                        {\n                            var sb = new StringBuilder();\n\n                            var accessor = default(TArrayAccessor);\n                            var dim = accessor.Length;\n                            var p = Point;\n                            for (var i = 0; i < dim; i++)\n                            {\n                                sb.Append(accessor.At(ref p, i).ToString() + \"\\t\");\n                            }\n\n                            sb.Append(Value?.ToString() ?? \"null\");\n\n                            return sb.ToString();\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/MetricSpace.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.1</TargetFramework>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Runtime.CompilerServices.Unsafe\" Version=\"4.7.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/NearestNeighbourList.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace MetricSpace\n{\n    public partial class NearestNeighbourList<TItem, TDistance>\n        where TDistance : IComparable<TDistance>\n    {\n        private const int DefaultCapacity = 32;\n\n        public interface INearestNeighbourList\n        {\n            bool Add(TItem item, TDistance distance);\n            TDistance FurtherestDistance { get; }\n            bool IsFull { get; }\n        }\n\n        public class UnlimitedList : INearestNeighbourList\n        {\n            private readonly List<(TItem, TDistance)> _items;\n\n            public UnlimitedList() : this(DefaultCapacity) { }\n            public UnlimitedList(int capacity) => _items = new List<(TItem, TDistance)>(capacity);\n\n            public TDistance FurtherestDistance => default!;\n\n            public bool IsFull => false;\n\n            public bool Add(TItem item, TDistance distance)\n            {\n                _items.Add((item, distance));\n                return true;\n            }\n\n            public TItem[] GetSortedArray() => _items.OrderBy(x => x.Item2).Select(x => x.Item1).ToArray();\n\n            public void Clear() => _items.Clear();\n        }\n\n        public class List : INearestNeighbourList\n        {\n            public List(int maxCount, int capacity)\n            {\n                MaxCount = maxCount;\n                queue = new PriorityQueue<TItem, TDistance>(capacity);\n            }\n\n            public List(int maxCount) : this(maxCount, DefaultCapacity) { }\n            public List() : this(int.MaxValue, DefaultCapacity) { }\n\n            private readonly PriorityQueue<TItem, TDistance> queue;\n            public int MaxCount { get; }\n\n            public int Count { get { return queue.Count; } }\n\n            public bool Add(TItem item, TDistance distance)\n            {\n                if (queue.Count >= MaxCount)\n                {\n                    // If the distance of this item is less than the distance of the last item\n                    // in our neighbour list then pop that neighbour off and push this one on\n                    // otherwise don't even bother adding this item\n                    if (distance.CompareTo(queue.GetHighestPriority()) < 0)\n                    {\n                        queue.Dequeue();\n                        queue.Enqueue(item, distance);\n                        return true;\n                    }\n                    else\n                        return false;\n                }\n                else\n                {\n                    queue.Enqueue(item, distance);\n                    return true;\n                }\n            }\n\n            public TDistance FurtherestDistance => queue.GetHighestPriority();\n            public bool IsFull => Count == MaxCount;\n\n            public TItem RemoveFurtherest()\n            {\n                return queue.Dequeue();\n            }\n\n            public TItem[] GetSortedArray()\n            {\n                var count = Count;\n                var neighbourArray = new TItem[count];\n\n                for (var index = 0; index < count; index++)\n                {\n                    var n = RemoveFurtherest();\n                    neighbourArray[count - index - 1] = n;\n                }\n\n                return neighbourArray;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/PriorityQueue.cs",
    "content": "﻿using System;\n\nnamespace MetricSpace\n{\n    public class PriorityQueue<TItem, TPriority>\n        where TPriority : IComparable<TPriority>\n    {\n        struct ItemPriority\n        {\n            public TItem Item;\n            public TPriority Priority;\n            public ItemPriority(TItem item, TPriority priority) => (Item, Priority) = (item, priority);\n        }\n\n        private ItemPriority[] _items;\n\n        public PriorityQueue()\n            : this(4)\n        {\n        }\n\n        public PriorityQueue(int capacity)\n        {\n            _items = new ItemPriority[capacity];\n            Count = 0;\n        }\n\n        private bool IsHigherPriority(int left, int right)\n        {\n            return _items[left].Priority.CompareTo(_items[right].Priority) > 0;\n        }\n\n        private void Percolate(int index)\n        {\n            if (index >= Count || index < 0)\n                return;\n            var parent = (index - 1) / 2;\n            if (parent < 0 || parent == index)\n                return;\n\n            if (IsHigherPriority(index, parent))\n            {\n                var temp = _items[index];\n                _items[index] = _items[parent];\n                _items[parent] = temp;\n                Percolate(parent);\n            }\n        }\n\n        private void Heapify()\n        {\n            Heapify(0);\n        }\n\n        private void Heapify(int index)\n        {\n            if (index >= Count || index < 0)\n                return;\n\n            var left = 2 * index + 1;\n            var right = 2 * index + 2;\n            var first = index;\n\n            if (left < Count && IsHigherPriority(left, first))\n                first = left;\n            if (right < Count && IsHigherPriority(right, first))\n                first = right;\n            if (first != index)\n            {\n                var temp = _items[index];\n                _items[index] = _items[first];\n                _items[first] = temp;\n                Heapify(first);\n            }\n        }\n\n        public int Count { get; private set; }\n\n        public TItem Peek()\n        {\n            if (Count == 0)\n                throw new InvalidOperationException(\"HEAP is Empty\");\n\n            return _items[0].Item;\n        }\n\n        private void RemoveAt(int index)\n        {\n            _items[index] = _items[--Count];\n            _items[Count] = default;\n            Heapify();\n            if (Count < _items.Length / 4)\n            {\n                var temp = _items;\n                _items = new ItemPriority[_items.Length / 2];\n                Array.Copy(temp, 0, _items, 0, Count);\n            }\n        }\n\n        public TItem Dequeue()\n        {\n            var result = Peek();\n            RemoveAt(0);\n            return result;\n        }\n\n        public void Enqueue(TItem item, TPriority priority)\n        {\n            if (Count >= _items.Length)\n            {\n                var temp = _items;\n                _items = new ItemPriority[_items.Length * 2];\n                Array.Copy(temp, _items, temp.Length);\n            }\n\n            var index = Count++;\n            _items[index] = new ItemPriority(item, priority);\n            Percolate(index);\n        }\n\n        public TItem GetHighest()\n        {\n            if (Count == 0)\n                throw new Exception(\"Queue is empty\");\n            else\n                return _items[0].Item;\n        }\n\n        public TPriority GetHighestPriority()\n        {\n            if (Count == 0)\n                throw new Exception(\"Queue is empty\");\n            else\n                return _items[0].Priority;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Rect.cs",
    "content": "﻿namespace MetricSpace\n{\n    public partial class Point<T, TArithmetic>\n    {\n        public partial class Dimension<TArray, TArrayAccessor>\n        {\n            public struct Rect\n            {\n                public TArray MinPoint;\n                public TArray MaxPoint;\n\n                public Rect(TArray minPoint, TArray maxPoint) => (MinPoint, MaxPoint) = (minPoint, maxPoint);\n\n                private static readonly int Dimension = default(TArrayAccessor).Length;\n\n                static Rect()\n                {\n                    var accessor = default(TArrayAccessor);\n                    var arithmetic = default(TArithmetic);\n                    var dim = Dimension;\n\n                    var rect = new Rect();\n\n                    for (int i = 0; i < dim; i++)\n                    {\n                        accessor.At(ref rect.MinPoint, i) = arithmetic.NegativeInfinity;\n                        accessor.At(ref rect.MaxPoint, i) = arithmetic.PositiveInfinity;\n                    }\n\n                    Infinite = rect;\n                }\n\n                public static readonly Rect Infinite;\n\n                public TArray GetClosestPoint(TArray toPoint)\n                {\n                    var accessor = default(TArrayAccessor);\n                    var dim = Dimension;\n                    TArray closest = default;\n\n                    for (var dimension = 0; dimension < dim; dimension++)\n                    {\n                        var min = accessor.At(ref MinPoint, dimension);\n                        var max = accessor.At(ref MaxPoint, dimension);\n                        var to = accessor.At(ref toPoint, dimension);\n                        ref var c = ref accessor.At(ref closest, dimension);\n\n                        if (min.CompareTo(to) > 0)\n                        {\n                            c = min;\n                        }\n                        else if (max.CompareTo(to) < 0)\n                        {\n                            c = max;\n                        }\n                        else\n                            // Point is within rectangle, at least on this dimension\n                            c = to;\n                    }\n\n                    return closest;\n                }\n\n                public void Intersect(Rect rect)\n                {\n                    var accessor = default(TArrayAccessor);\n                    var dim = Dimension;\n\n                    for (var dimension = 0; dimension < dim; dimension++)\n                    {\n                        ref var min = ref accessor.At(ref MinPoint, dimension);\n                        var rMin = accessor.At(ref rect.MinPoint, dimension);\n                        if (min.CompareTo(rMin) < 0) min = rMin;\n\n                        ref var max = ref accessor.At(ref MaxPoint, dimension);\n                        var rMax = accessor.At(ref rect.MaxPoint, dimension);\n                        if (max.CompareTo(rMax) > 0) max = rMax;\n                    }\n                }\n\n                public bool Intersects(Rect rect)\n                {\n                    var accessor = default(TArrayAccessor);\n                    var dim = Dimension;\n\n                    for (var dimension = 0; dimension < dim; dimension++)\n                    {\n                        if (accessor.At(ref MaxPoint, dimension).CompareTo(accessor.At(ref rect.MinPoint, dimension)) < 0) return false;\n                        if (accessor.At(ref rect.MaxPoint, dimension).CompareTo(accessor.At(ref MinPoint, dimension)) < 0) return false;\n                    }\n\n                    return true;\n                }\n\n                public bool Contains(TArray point)\n                {\n                    var accessor = default(TArrayAccessor);\n                    var dim = Dimension;\n\n                    for (var dimension = 0; dimension < dim; dimension++)\n                    {\n                        if (accessor.At(ref MinPoint, dimension).CompareTo(accessor.At(ref point, dimension)) > 0) return false;\n                        if (accessor.At(ref MaxPoint, dimension).CompareTo(accessor.At(ref point, dimension)) < 0) return false;\n                    }\n\n                    return true;\n                }\n\n                public override string ToString() => $\"{MinPoint}-{MaxPoint}\";\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Traits/Arithmetics/DoubleArithmetic.cs",
    "content": "﻿namespace MetricSpace\n{\n    public struct DoubleArithmetic : IArithmetic<double>\n    {\n        public double MinValue => double.MinValue;\n        public double MaxValue => double.MaxValue;\n        public double Zero => 0;\n        public double NegativeInfinity => double.NegativeInfinity;\n        public double PositiveInfinity => double.PositiveInfinity;\n        public double Add(double a, double b) => a + b;\n        public double Subtract(double a, double b) => a - b;\n        public double Multiply(double a, double b) => a * b;\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Traits/Arithmetics/FloatArithmetic.cs",
    "content": "﻿namespace MetricSpace\n{\n    public struct FloatArithmetic : IArithmetic<float>\n    {\n        public float MinValue => float.MinValue;\n        public float MaxValue => float.MaxValue;\n        public float Zero => 0;\n        public float NegativeInfinity => float.NegativeInfinity;\n        public float PositiveInfinity => float.PositiveInfinity;\n        public float Add(float a, float b) => a + b;\n        public float Subtract(float a, float b) => a - b;\n        public float Multiply(float a, float b) => a * b;\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Traits/Arithmetics/IArithmetic.cs",
    "content": "﻿namespace MetricSpace\n{\n    public interface IArithmetic<T>\n    {\n        T MinValue { get; }\n        T MaxValue { get; }\n        T Add(T a, T b);\n        T Subtract(T a, T b);\n        T Multiply(T a, T b);\n        T Zero { get; }\n        T NegativeInfinity { get; }\n        T PositiveInfinity { get; }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Traits/Arithmetics/IntArithmetic.cs",
    "content": "﻿namespace MetricSpace\n{\n    public struct IntArithmetic : IArithmetic<int>\n    {\n        public int MinValue => int.MinValue;\n        public int MaxValue => int.MaxValue;\n        public int Zero => 0;\n        public int NegativeInfinity => int.MinValue;\n        public int PositiveInfinity => int.MaxValue;\n        public int Add(int a, int b) => a + b;\n        public int Subtract(int a, int b) => a - b;\n        public int Multiply(int a, int b) => a * b;\n    }\n\n    public struct ShortArithmetic : IArithmetic<short>\n    {\n        public short MinValue => short.MinValue;\n        public short MaxValue => short.MaxValue;\n        public short Zero => 0;\n        public short NegativeInfinity => short.MinValue;\n        public short PositiveInfinity => short.MaxValue;\n        public short Add(short a, short b) => (short)(a + b);\n        public short Subtract(short a, short b) => (short)(a - b);\n        public short Multiply(short a, short b) => (short)(a * b);\n    }\n\n    public struct LongArithmetic : IArithmetic<long>\n    {\n        public long MinValue => long.MinValue;\n        public long MaxValue => long.MaxValue;\n        public long Zero => 0;\n        public long NegativeInfinity => long.MinValue;\n        public long PositiveInfinity => long.MaxValue;\n        public long Add(long a, long b) => a + b;\n        public long Subtract(long a, long b) => a - b;\n        public long Multiply(long a, long b) => a * b;\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Traits/Array/FixedArray.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace MetricSpace\n{\n    // consider using T4 template if you want higher dimensions.\n\n    public struct Fixed1<T> : IFixedArrayAccessor<T, Fixed1<T>.Array>\n    {\n        public struct Array : IFixedArray<T>\n        {\n            public T Item1;\n            public Array(T item1) => Item1 = item1;\n            public static implicit operator Array(T value) => new Array(value);\n            public override string ToString() => $\"({Item1})\";\n        }\n\n        public Array New() => default;\n        public int Length => 1;\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public unsafe Span<T> AsSpan(ref Array array) => new Span<T>(Unsafe.AsPointer(ref Unsafe.As<Array, T>(ref array)), 1);\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public ref T At(ref Array array, int i) => ref AsSpan(ref array)[i];\n    }\n\n    public struct Fixed2<T> : IFixedArrayAccessor<T, Fixed2<T>.Array>\n    {\n        public struct Array : IFixedArray<T>\n        {\n            public T Item1; public T Item2;\n            public Array(T item1, T item2) => (Item1, Item2) = (item1, item2);\n            public static implicit operator Array((T, T) value) => new Array(value.Item1, value.Item2);\n            public override string ToString() => $\"({Item1}, {Item2})\";\n        }\n\n        public Array New() => default;\n        public int Length => 2;\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public unsafe Span<T> AsSpan(ref Array array) => new Span<T>(Unsafe.AsPointer(ref Unsafe.As<Array, T>(ref array)), 2);\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public ref T At(ref Array array, int i) => ref AsSpan(ref array)[i];\n    }\n\n    public struct Fixed3<T> : IFixedArrayAccessor<T, Fixed3<T>.Array>\n    {\n        public struct Array : IFixedArray<T>\n        {\n            public T Item1; public T Item2; public T Item3;\n            public Array(T item1, T item2, T item3) => (Item1, Item2, Item3) = (item1, item2, item3);\n            public static implicit operator Array((T, T, T) value) => new Array(value.Item1, value.Item2, value.Item3);\n            public override string ToString() => $\"({Item1}, {Item2}, {Item3})\";\n        }\n\n        public Array New() => default;\n        public int Length => 3;\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public unsafe Span<T> AsSpan(ref Array array) => new Span<T>(Unsafe.AsPointer(ref Unsafe.As<Array, T>(ref array)), 3);\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public ref T At(ref Array array, int i) => ref AsSpan(ref array)[i];\n    }\n\n    public struct Fixed4<T> : IFixedArrayAccessor<T, Fixed4<T>.Array>\n    {\n        public struct Array : IFixedArray<T>\n        {\n            public T Item1; public T Item2; public T Item3; public T Item4;\n            public Array(T item1, T item2, T item3, T item4) => (Item1, Item2, Item3, Item4) = (item1, item2, item3, item4);\n            public static implicit operator Array((T, T, T, T) value) => new Array(value.Item1, value.Item2, value.Item3, value.Item4);\n            public override string ToString() => $\"({Item1}, {Item2}, {Item3}, {Item4})\";\n        }\n\n        public Array New() => default;\n        public int Length => 4;\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public unsafe Span<T> AsSpan(ref Array array) => new Span<T>(Unsafe.AsPointer(ref Unsafe.As<Array, T>(ref array)), 4);\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public ref T At(ref Array array, int i) => ref AsSpan(ref array)[i];\n    }\n\n    public static class FixedArray<T, TArray, TArrayAccessor>\n        where T : IEquatable<T>\n        where TArray : struct, IFixedArray<T>\n        where TArrayAccessor : struct, IFixedArrayAccessor<T, TArray>\n    {\n        private static readonly TArrayAccessor Accessor = default;\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        public static bool Equals(TArray x, TArray y)\n        {\n            if (Accessor.Length == 2) return Equals2(x, y);\n            if (Accessor.Length == 1) return Equals1(x, y);\n            return EqualsMore(ref x, ref y);\n        }\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        private static bool Equals1(TArray x, TArray y)\n            => Accessor.At(ref x, 0).Equals(Accessor.At(ref y, 0));\n\n        [MethodImpl(MethodImplOptions.AggressiveInlining)]\n        private static bool Equals2(TArray x, TArray y)\n            => Accessor.At(ref x, 0).Equals(Accessor.At(ref y, 0))\n            && Accessor.At(ref x, 1).Equals(Accessor.At(ref y, 1));\n\n        private static bool EqualsMore(ref TArray x, ref TArray y)\n        {\n            for (int i = 0; i < Accessor.Length; i++)\n            {\n                if (!Accessor.At(ref x, i).Equals(Accessor.At(ref y, i))) return false;\n            }\n\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Traits/Array/IFixedArray.cs",
    "content": "﻿namespace MetricSpace\n{\n    public interface IFixedArray<T> { }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Traits/Array/IFixedArrayAccessor.cs",
    "content": "﻿using System;\n\nnamespace MetricSpace\n{\n    public interface IFixedArrayAccessor<T, TArray>\n        where TArray : struct, IFixedArray<T>\n    {\n        TArray New();\n        Span<T> AsSpan(ref TArray array);\n        ref T At(ref TArray array, int i);\n        int Length { get; }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Traits/Instantiation.cs",
    "content": "﻿using System;\n\nnamespace MetricSpace\n{\n    public partial class Point<T, TArithmetic>\n        where T : IComparable<T>, IEquatable<T>\n        where TArithmetic : struct, IArithmetic<T>\n    {\n        private static readonly TArithmetic _arithmetic = default;\n\n        public partial class Dimension<TArray, TArrayAccessor>\n            where TArray : struct, IFixedArray<T>\n            where TArrayAccessor : struct, IFixedArrayAccessor<T, TArray>\n        {\n            private static readonly TArrayAccessor _accessor = default;\n\n            public partial class Metric<TMetric>\n                where TMetric : struct, IMetric<T, TArray>\n            {\n            }\n\n            public class Euclidean : Metric<EuclideanMetric<T, TArray, TArrayAccessor, TArithmetic>> { }\n            public class Manhattan : Metric<ManhattanMetric<T, TArray, TArrayAccessor, TArithmetic>> { }\n            public class Chebyshev : Metric<ChebyshevMetric<T, TArray, TArrayAccessor, TArithmetic>> { }\n        }\n\n        public class _1 : Dimension<Fixed1<T>.Array, Fixed1<T>> { }\n        public class _2 : Dimension<Fixed2<T>.Array, Fixed2<T>> { }\n        public class _3 : Dimension<Fixed3<T>.Array, Fixed3<T>> { }\n        public class _4 : Dimension<Fixed4<T>.Array, Fixed4<T>> { }\n    }\n\n    public class Int : Point<int, IntArithmetic> { }\n    public class Short : Point<short, ShortArithmetic> { }\n    public class Long : Point<long, LongArithmetic> { }\n    public class Float : Point<float, FloatArithmetic> { }\n    public class Double : Point<double, DoubleArithmetic> { }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Traits/Metrics/ChebyshevMetric.cs",
    "content": "﻿using System;\n\nnamespace MetricSpace\n{\n    public struct ChebyshevMetric<T, TArray, TArrayAccessor, TArithmetic> : IMetric<T, TArray>\n        where T : IComparable<T>\n        where TArray : struct, IFixedArray<T>\n        where TArrayAccessor : struct, IFixedArrayAccessor<T, TArray>\n        where TArithmetic : struct, IArithmetic<T>\n    {\n        public T DistanceSquared(TArray a, TArray b)\n        {\n            var accessor = default(TArrayAccessor);\n            var arithmetic = default(TArithmetic);\n\n            T distance = arithmetic.Zero;\n            var dim = accessor.Length;\n\n            for (var i = 0; i < dim; i++)\n            {\n                T distOnThisAxis = arithmetic.Subtract(accessor.At(ref a, i), accessor.At(ref b, i));\n                distance = Max(distance, Abs(distOnThisAxis));\n            }\n\n            return arithmetic.Multiply(distance, distance);\n        }\n\n        private static T Abs(T x)\n        {\n            var arithmetic = default(TArithmetic);\n            if (x.CompareTo(arithmetic.Zero) < 0) return arithmetic.Subtract(arithmetic.Zero, x);\n            return x;\n        }\n\n        private static T Max(T x, T y) => x.CompareTo(y) >= 0 ? x : y;\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Traits/Metrics/EuclideanMetric.cs",
    "content": "﻿namespace MetricSpace\n{\n    public struct EuclideanMetric<T, TArray, TArrayAccessor, TArithmetic> : IMetric<T, TArray>\n        where TArray : struct, IFixedArray<T>\n        where TArrayAccessor : struct, IFixedArrayAccessor<T, TArray>\n        where TArithmetic : struct, IArithmetic<T>\n    {\n        public T DistanceSquared(TArray a, TArray b)\n        {\n            var accessor = default(TArrayAccessor);\n            var arithmetic = default(TArithmetic);\n\n            T distance = arithmetic.Zero;\n            var dim = accessor.Length;\n\n            for (var i = 0; i < dim; i++)\n            {\n                T distOnThisAxis = arithmetic.Subtract(accessor.At(ref a, i), accessor.At(ref b, i));\n                T distOnThisAxisSquared = arithmetic.Multiply(distOnThisAxis, distOnThisAxis);\n                distance = arithmetic.Add(distance, distOnThisAxisSquared);\n            }\n\n            return distance;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Traits/Metrics/IMetric.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace MetricSpace\n{\n    public interface IMetric<T, TArray>\n        where TArray : IFixedArray<T>\n    {\n        T DistanceSquared(TArray a, TArray b);\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace/Traits/Metrics/ManhattanMetric.cs",
    "content": "﻿using System;\n\nnamespace MetricSpace\n{\n    public struct ManhattanMetric<T, TArray, TArrayAccessor, TArithmetic> : IMetric<T, TArray>\n        where T : IComparable<T>\n        where TArray : struct, IFixedArray<T>\n        where TArrayAccessor : struct, IFixedArrayAccessor<T, TArray>\n        where TArithmetic : struct, IArithmetic<T>\n    {\n        public T DistanceSquared(TArray a, TArray b)\n        {\n            var accessor = default(TArrayAccessor);\n            var arithmetic = default(TArithmetic);\n\n            T distance = arithmetic.Zero;\n            var dim = accessor.Length;\n\n            for (var i = 0; i < dim; i++)\n            {\n                T distOnThisAxis = arithmetic.Subtract(accessor.At(ref a, i), accessor.At(ref b, i));\n                distance = arithmetic.Add(distance, Abs(distOnThisAxis));\n            }\n\n            return arithmetic.Multiply(distance, distance);\n        }\n\n        private static T Abs(T x)\n        {\n            var arithmetic = default(TArithmetic);\n            if (x.CompareTo(arithmetic.Zero) < 0) return arithmetic.Subtract(arithmetic.Zero, x);\n            return x;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/MetricSpace.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30626.31\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MetricSpace\", \"MetricSpace\\MetricSpace.csproj\", \"{027F98C6-818E-42BE-AE5C-5CACBA7973C9}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"XUnitTestMetricSpace\", \"XUnitTestMetricSpace\\XUnitTestMetricSpace.csproj\", \"{8FF8FD78-79E2-4D3F-9EC5-86714CC4394A}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{027F98C6-818E-42BE-AE5C-5CACBA7973C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{027F98C6-818E-42BE-AE5C-5CACBA7973C9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{027F98C6-818E-42BE-AE5C-5CACBA7973C9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{027F98C6-818E-42BE-AE5C-5CACBA7973C9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8FF8FD78-79E2-4D3F-9EC5-86714CC4394A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8FF8FD78-79E2-4D3F-9EC5-86714CC4394A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8FF8FD78-79E2-4D3F-9EC5-86714CC4394A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8FF8FD78-79E2-4D3F-9EC5-86714CC4394A}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {ACE9FCC9-D8B0-46A3-A22E-7AC20A53CBF8}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2020/MetricSpace/XUnitTestMetricSpace/UnitTest1.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Tree = MetricSpace.Float._2.Euclidean.KdTree<string>;\nusing Node = MetricSpace.Float._2.Euclidean.KdTree<string>.Node;\nusing Xunit;\nusing MetricSpace;\n\nnamespace XUnitTestMetricSpace\n{\n    struct City\n    {\n        public string Address;\n        public float Lat;\n        public float Long;\n        public float DistanceFromToowoomba;\n    }\n\n    public class KdTreeTests\n    {\n        private Tree tree;\n\n        public KdTreeTests()\n        {\n            tree = new Tree();\n\n            testNodes = new List<Node>();\n            testNodes.AddRange(new Node[]\n            {\n                new Node((5, 5), \"Root\"),\n\n                new Node((2.5f, 2.5f), \"Root-Left\"),\n                new Node((7.5f, 7.5f), \"Root-Right\"),\n                new Node((1, 10), \"Root-Left-Left\"),\n                new Node((10, 10), \"Root-Right-Right\")\n            });\n        }\n\n        private readonly List<Node> testNodes;\n\n        private void AddTestNodes()\n        {\n            foreach (var node in testNodes)\n                if (!tree.Add(node.Point, node.Value))\n                    throw new Exception(\"Failed to add node to tree\");\n        }\n\n        [Fact]\n        public void TestAdd()\n        {\n            // Add nodes to tree\n            AddTestNodes();\n\n            // Check count of nodes is right\n            Assert.Equal(testNodes.Count, tree.Count);\n        }\n\n        [Fact]\n        public void TestAddDuplicateInSkipMode()\n        {\n            tree = new Tree();\n\n            Assert.Equal(AddDuplicateBehavior.Skip, tree.AddDuplicateBehavior);\n\n            AddTestNodes();\n\n            var count = tree.Count;\n\n            var added = tree.Add(testNodes[0].Point, \"Some other value\");\n\n            Assert.False(added);\n            Assert.Equal(count, tree.Count);\n        }\n\n        [Fact]\n        public void TestAddDuplicateInErrorMode()\n        {\n            tree = new Tree(AddDuplicateBehavior.Error);\n\n            AddTestNodes();\n\n            var count = tree.Count;\n            Exception? error = null;\n\n            try\n            {\n                tree.Add(testNodes[0].Point, \"Some other value\");\n            }\n            catch (Exception e)\n            {\n                error = e;\n            }\n\n            Assert.Equal(count, tree.Count);\n            Assert.NotNull(error);\n            Assert.True(error is DuplicateNodeError);\n        }\n\n        [Fact]\n        public void TestAddDuplicateInUpdateMode()\n        {\n            tree = new Tree(AddDuplicateBehavior.Update);\n\n            AddTestNodes();\n\n            var newValue = \"I love chicken, I love liver, Meow Mix Meow Mix please deliver\";\n\n            tree.Add(testNodes[0].Point, newValue);\n\n            var actualValue = tree.FindValueAt(testNodes[0].Point);\n\n            Assert.Equal(newValue, actualValue);\n        }\n\n        [Fact]\n        public void TestTryFindValueAt()\n        {\n            AddTestNodes();\n\n            string actualValue;\n\n            foreach (var node in testNodes)\n            {\n                if (tree.TryFindValueAt(node.Point, out actualValue))\n                    Assert.Equal(node.Value, actualValue);\n                else\n                    throw new Exception(\"Could not find test node\");\n            }\n\n            if (!tree.TryFindValueAt((3.14f, 5), out actualValue))\n                Assert.Null(actualValue);\n            else\n                throw new Exception(\"Reportedly found node it shouldn't have\");\n        }\n\n        [Fact]\n        public void TestFindValueAt()\n        {\n            AddTestNodes();\n\n            string actualValue;\n\n            foreach (var node in testNodes)\n            {\n                actualValue = tree.FindValueAt(node.Point);\n\n                Assert.Equal(node.Value, actualValue);\n            }\n\n            actualValue = tree.FindValueAt((3.15f, 5));\n\n            Assert.Null(actualValue);\n        }\n\n        [Fact]\n        public void TestFindValue()\n        {\n            AddTestNodes();\n\n            Fixed2<float>.Array actualPoint;\n\n            foreach (var node in testNodes)\n            {\n                actualPoint = tree.FindValue(node.Value);\n                Assert.Equal(node.Point, actualPoint);\n            }\n\n            var success = tree.TryFindValue(\"Your Mumma\", out _);\n            Assert.False(success);\n        }\n\n        [Fact]\n        public void TestRemoveAt()\n        {\n            AddTestNodes();\n\n            var nodesToRemove = new Node[] {\n                testNodes[1], // Root-Left\n\t\t\t\ttestNodes[0] // Root\n\t\t\t};\n\n            foreach (var nodeToRemove in nodesToRemove)\n            {\n                tree.RemoveAt(nodeToRemove.Point);\n                testNodes.Remove(nodeToRemove);\n\n                Assert.False(tree.TryFindValue(nodeToRemove.Value, out _));\n                Assert.False(tree.TryFindValueAt(nodeToRemove.Point, out _));\n\n                foreach (var testNode in testNodes)\n                {\n                    Assert.Equal(testNode.Value, tree.FindValueAt(testNode.Point));\n                    Assert.Equal(testNode.Point, tree.FindValue(testNode.Value));\n                }\n\n                Assert.Equal(testNodes.Count, tree.Count);\n            }\n        }\n\n        [Fact]\n        public void TestGetNearestNeighbours()\n        {\n            var toowoomba = new City()\n            {\n                Address = \"Toowoomba, QLD, Australia\",\n                Lat = -27.5829487f,\n                Long = 151.8643252f,\n                DistanceFromToowoomba = 0\n            };\n\n            City[] cities = new City[]\n            {\n                toowoomba,\n                new City()\n                {\n                    Address = \"Brisbane, QLD, Australia\",\n                    Lat = -27.4710107f,\n                    Long = 153.0234489f,\n                    DistanceFromToowoomba = 1.16451615177537f\n                },\n                new City()\n                {\n                    Address = \"Goldcoast, QLD, Australia\",\n                    Lat = -28.0172605f,\n                    Long = 153.4256987f,\n                    DistanceFromToowoomba = 1.6206523211724f\n                },\n                new City()\n                {\n                    Address = \"Sunshine, QLD, Australia\",\n                    Lat = -27.3748288f,\n                    Long = 153.0554193f,\n                    DistanceFromToowoomba = 1.20913979664506f\n                },\n                new City()\n                {\n                    Address = \"Melbourne, VIC, Australia\",\n                    Lat = -37.814107f,\n                    Long = 144.96328f,\n                    DistanceFromToowoomba = 12.3410301438779f\n                },\n                new City()\n                {\n                    Address = \"Sydney, NSW, Australia\",\n                    Lat = -33.8674869f,\n                    Long = 151.2069902f,\n                    DistanceFromToowoomba = 6.31882185929341f\n                },\n                new City()\n                {\n                    Address = \"Perth, WA, Australia\",\n                    Lat = -31.9530044f,\n                    Long = 115.8574693f,\n                    DistanceFromToowoomba = 36.2710774395312f\n                },\n                new City()\n                {\n                    Address = \"Darwin, NT, Australia\",\n                    Lat = -12.4628198f,\n                    Long = 130.8417694f,\n                    DistanceFromToowoomba = 25.895292049265f\n                }\n\t\t\t\t/*,\n\t\t\t\tnew City()\n\t\t\t\t{\n\t\t\t\t\tAddress = \"London, England\",\n\t\t\t\t\tLat = 51.5112139f,\n\t\t\t\t\tLong = -0.1198244f,\n\t\t\t\t\tDistanceFromToowoomba = 171.33320836029f\n\t\t\t\t\t\n\t\t\t\t}*/\n\t\t\t};\n\n            foreach (var city in cities)\n            {\n                tree.Add((city.Long, -city.Lat), city.Address);\n            }\n\n            /*\n\t\t\tvar sb = new System.Text.StringBuilder();\n\t\t\tsb.AppendLine(\"Before Balance:\");\n\t\t\tsb.AppendLine(tree.ToString());\n\t\t\tsb.AppendLine(\"\");\n\t\t\tsb.AppendLine(\"\");\n\t\t\ttree.Balance();\n\t\t\tsb.AppendLine(\"After Balance:\");\n\t\t\tsb.AppendLine(tree.ToString());\n\t\t\tSystem.Windows.Forms.Clipboard.SetText(sb.ToString());\n\t\t\t*/\n\n            for (var findLimit = 0; findLimit <= cities.Length; findLimit++)\n            {\n                var actualNeighbours = tree.GetNearestNeighbours(\n                    (toowoomba.Long, -toowoomba.Lat),\n                    findLimit);\n\n                var expectedNeighbours = cities\n                    .OrderBy(p => p.DistanceFromToowoomba)\n                    .Take(findLimit)\n                    .ToArray();\n\n                Assert.Equal(findLimit, actualNeighbours.Length);\n                Assert.Equal(findLimit, expectedNeighbours.Length);\n\n                for (var index = 0; index < actualNeighbours.Length; index++)\n                {\n                    Assert.Equal(expectedNeighbours[index].Address, actualNeighbours[index].Value);\n                }\n            }\n        }\n\n        [Fact]\n        public void TestRadialSearch()\n        {\n            var toowoomba = new City()\n            {\n                Address = \"Toowoomba, QLD, Australia\",\n                Lat = -27.5829487f,\n                Long = 151.8643252f,\n                DistanceFromToowoomba = 0\n            };\n\n            City[] cities = new City[]\n            {\n                toowoomba,\n                new City()\n                {\n                    Address = \"Brisbane, QLD, Australia\",\n                    Lat = -27.4710107f,\n                    Long = 153.0234489f,\n                    DistanceFromToowoomba = 1.16451615177537f\n                },\n                new City()\n                {\n                    Address = \"Goldcoast, QLD, Australia\",\n                    Lat = -28.0172605f,\n                    Long = 153.4256987f,\n                    DistanceFromToowoomba = 1.6206523211724f\n                },\n                new City()\n                {\n                    Address = \"Sunshine, QLD, Australia\",\n                    Lat = -27.3748288f,\n                    Long = 153.0554193f,\n                    DistanceFromToowoomba = 1.20913979664506f\n                },\n                new City()\n                {\n                    Address = \"Melbourne, VIC, Australia\",\n                    Lat = -37.814107f,\n                    Long = 144.96328f,\n                    DistanceFromToowoomba = 12.3410301438779f\n                },\n                new City()\n                {\n                    Address = \"Sydney, NSW, Australia\",\n                    Lat = -33.8674869f,\n                    Long = 151.2069902f,\n                    DistanceFromToowoomba = 6.31882185929341f\n                },\n                new City()\n                {\n                    Address = \"Perth, WA, Australia\",\n                    Lat = -31.9530044f,\n                    Long = 115.8574693f,\n                    DistanceFromToowoomba = 36.2710774395312f\n                },\n                new City()\n                {\n                    Address = \"Darwin, NT, Australia\",\n                    Lat = -12.4628198f,\n                    Long = 130.8417694f,\n                    DistanceFromToowoomba = 25.895292049265f\n                }\n            };\n\n            foreach (var city in cities)\n            {\n                tree.Add((city.Long, -city.Lat), city.Address);\n            }\n            var expectedNeighbours = cities\n                .OrderBy(p => p.DistanceFromToowoomba).ToList();\n\n            for (var i = 1; i < 100; i *= 2)\n            {\n                var actualNeighbours = tree.RadialSearch((toowoomba.Long, -toowoomba.Lat), i);\n\n                var list = Tree.CreateUnlimitedList();\n                tree.RadialSearch((toowoomba.Long, -toowoomba.Lat), i, list);\n                var sorted = list.GetSortedArray();\n\n                for (var index = 0; index < actualNeighbours.Length; index++)\n                {\n                    Assert.Equal(expectedNeighbours[index].Address, actualNeighbours[index].Value);\n                    Assert.Equal(expectedNeighbours[index].Address, sorted[index].Value);\n                }\n            }\n        }\n\n        [Fact]\n        public void TestEnumerable()\n        {\n            AddTestNodes();\n\n            foreach (var node in tree)\n            {\n                var testNode = testNodes.FirstOrDefault(n => n.Point.Item1 == node.Point.Item1 && n.Point.Item2 == node.Point.Item2 && n.Value == node.Value);\n\n                Assert.NotNull(testNode);\n\n                testNodes.Remove(testNode);\n            }\n\n            Assert.Empty(testNodes);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/MetricSpace/XUnitTestMetricSpace/XUnitTestMetricSpace.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp3.1</TargetFramework>\n\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"16.5.0\" />\n    <PackageReference Include=\"xunit\" Version=\"2.4.0\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.4.0\" />\n    <PackageReference Include=\"coverlet.collector\" Version=\"1.2.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\MetricSpace\\MetricSpace.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2020/ReadModReq/.gitignore",
    "content": "ref\n"
  },
  {
    "path": "Demo/2020/ReadModReq/Csharp7.0/Csharp7.0.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net5.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <!-- C# 7.0 -->\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp\" Version=\"2.0.0\" />\n    <Compile Include=\"../ReadModReq/**/*.cs\" Exclude=\"../ReadModReq/obj/**/*.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2020/ReadModReq/Csharp7.2/Csharp7.2.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net5.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <!-- 確か C# 7.2 のとき、Roslyn は 2.6.0 -->\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp\" Version=\"2.6.0\" />\n    <Compile Include=\"../ReadModReq/**/*.cs\" Exclude=\"../ReadModReq/obj/**/*.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2020/ReadModReq/Csharp8.0/Csharp8.0.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net5.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <!-- 確か Roslyn 3.0 の頃 preview で C# 8.0 が追加されて、latest が C# 8.0 になったのが 3.3 の頃 -->\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp\" Version=\"3.3.1\" />\n    <Compile Include=\"../ReadModReq/**/*.cs\" Exclude=\"../ReadModReq/obj/**/*.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2020/ReadModReq/LibModReq/Class1.cs",
    "content": "﻿using System;\n\nnamespace LibModReq\n{\n    public class Class1\n    {\n        public void UnamanagedConstraint<T>() where T : unmanaged { }\n        public virtual void InParameter(in int x) { }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/ReadModReq/LibModReq/LibModReq.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.0</TargetFramework>\n    <ProduceOnlyReferenceAssembly>true</ProduceOnlyReferenceAssembly>\n    <DebugType>None</DebugType>\n    <OutDir>$(SolutionDir)/ref</OutDir>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2020/ReadModReq/ReadModReq/Program.cs",
    "content": "﻿using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing System;\nusing System.IO;\n\nnamespace ReadModReq\n{\n    class Program\n    {\n        static void Main()\n        {\n            const string refPath = \"../../../../ref/LibModReq.dll\";\n            var source = File.ReadAllText(\"../../../../UseModReq.cs\");\n\n            var compilation = Compile(refPath, source);\n\n            foreach (var diag in compilation.GetDiagnostics())\n            {\n                Console.WriteLine(diag);\n            }\n        }\n\n        private static CSharpCompilation Compile(string refPath, string source)\n        {\n            var dotnetCoreDirectory = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory();\n            var compilation = CSharpCompilation.Create(\"test\",\n                syntaxTrees: new[] { SyntaxFactory.ParseSyntaxTree(source) },\n                references: new[]\n                {\n                    AssemblyMetadata.CreateFromFile(typeof(object).Assembly.Location).GetReference(),\n                    MetadataReference.CreateFromFile(Path.Combine(dotnetCoreDirectory, \"netstandard.dll\")),\n                    MetadataReference.CreateFromFile(Path.Combine(dotnetCoreDirectory, \"System.Runtime.dll\")),\n                    MetadataReference.CreateFromFile(refPath),\n                });\n            return compilation;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2020/ReadModReq/ReadModReq/ReadModReq.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net5.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp\" Version=\"3.5.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2020/ReadModReq/ReadModReq.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30001.183\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ReadModReq\", \"ReadModReq\\ReadModReq.csproj\", \"{7DDBEE94-6FDD-4DC7-B429-1941B88EA444}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"LibModReq\", \"LibModReq\\LibModReq.csproj\", \"{4466395B-BEC7-45FF-B090-AFE6A5F3A752}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Csharp7.0\", \"Csharp7.0\\Csharp7.0.csproj\", \"{9EDE6890-18DB-401D-87FA-F8745FEDFAA3}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Csharp7.2\", \"Csharp7.2\\Csharp7.2.csproj\", \"{3B62541F-B7E9-426E-9360-7E772D2ED7AD}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Csharp8.0\", \"Csharp8.0\\Csharp8.0.csproj\", \"{B6CCBDDC-F55B-4B8F-BAC5-77BC465A2496}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"CompilerVersions\", \"CompilerVersions\", \"{9FAC221E-E723-4852-80A2-19EA33987DB1}\"\n\tProjectSection(SolutionItems) = preProject\n\t\treadme.md = readme.md\n\tEndProjectSection\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{7DDBEE94-6FDD-4DC7-B429-1941B88EA444}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7DDBEE94-6FDD-4DC7-B429-1941B88EA444}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7DDBEE94-6FDD-4DC7-B429-1941B88EA444}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7DDBEE94-6FDD-4DC7-B429-1941B88EA444}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4466395B-BEC7-45FF-B090-AFE6A5F3A752}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4466395B-BEC7-45FF-B090-AFE6A5F3A752}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4466395B-BEC7-45FF-B090-AFE6A5F3A752}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4466395B-BEC7-45FF-B090-AFE6A5F3A752}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{9EDE6890-18DB-401D-87FA-F8745FEDFAA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9EDE6890-18DB-401D-87FA-F8745FEDFAA3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9EDE6890-18DB-401D-87FA-F8745FEDFAA3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9EDE6890-18DB-401D-87FA-F8745FEDFAA3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3B62541F-B7E9-426E-9360-7E772D2ED7AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3B62541F-B7E9-426E-9360-7E772D2ED7AD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3B62541F-B7E9-426E-9360-7E772D2ED7AD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3B62541F-B7E9-426E-9360-7E772D2ED7AD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B6CCBDDC-F55B-4B8F-BAC5-77BC465A2496}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B6CCBDDC-F55B-4B8F-BAC5-77BC465A2496}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B6CCBDDC-F55B-4B8F-BAC5-77BC465A2496}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B6CCBDDC-F55B-4B8F-BAC5-77BC465A2496}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{9EDE6890-18DB-401D-87FA-F8745FEDFAA3} = {9FAC221E-E723-4852-80A2-19EA33987DB1}\n\t\t{3B62541F-B7E9-426E-9360-7E772D2ED7AD} = {9FAC221E-E723-4852-80A2-19EA33987DB1}\n\t\t{B6CCBDDC-F55B-4B8F-BAC5-77BC465A2496} = {9FAC221E-E723-4852-80A2-19EA33987DB1}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {770F556E-8974-4D17-B50C-16DCFEABCB3F}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2020/ReadModReq/UseModReq.cs",
    "content": "using LibModReq;\n\nclass Program\n{\n    static void Main()\n    {\n        var c = new Class1();\n        c.UnamanagedConstraint<int>();\n        c.InParameter(1);\n    }\n}\n"
  },
  {
    "path": "Demo/2020/ReadModReq/readme.md",
    "content": "# modreq の動作確認\n\n`modreq` の説明自体はまた改めて別の機会に。\nここでは、`modreq` を使って古いコンパイラーからの参照を拒絶してる様子だけをデモ。\n\n## modreq を使っている機能\n\n- `in` 引数 (C# 7.2 移行)\n  - ただし、`abstract` か `virtual` の時だけ `modreq` が付く\n- ジェネリック型引数の `unmanaged` 制約 (C# 8.0 移行)\n\n要するに、正しい解釈ができないバージョンのコンパイラーから下手に触られると困る機能に `modreq` を付けてる。\n\n## フォルダー構成\n\n- `LibModReq`\n  - `modreq` が付与される機能(`in` 引数と `unmanaged` 制約)を使ってるライブラリを用意\n- `ReadModReq`\n  - `LibModReq` を `Microsoft.CodeAnalysis.CSharp` を使って参照しているコード\n- `CompilerVersions` ソリューション フォルダー以下 (`Csharp7.0`, `Csharp7.2`, `Csharp8.0`)\n  - `ReadModReq` と同じソースコードで、`Microsoft.CodeAnalysis.CSharp` のバージョンだけが違うもの\n\n対応するバージョンの .NET SDK をインストールしなくても動作確認できるように、`Microsoft.CodeAnalysis.CSharp` を使ってコンパイルして、`Microsoft.CodeAnalysis.CSharp` のバージョン違いで C# バージョンを選んでる。\n(正確には、`GetDiagnostics` で診断だけ取ってる。`Emit` とかはしてない。)\n\n## 実行結果\n\n`Csharp7.0`, `Csharp7.2`, `Csharp8.0` を実行すると、\n\n- `Csharp7.0`: `in` 引数と `unmanaged` 制約の行でエラー\n- `Csharp7.2`: `unmanaged` 制約の行でエラー\n- `Csharp8.0`: 何も表示されない(エラーがない)\n\nになる。\n未対応の個所では「not supported by the language」みたいなメッセージが出る\n(これが `modreq` の効果)。\n"
  },
  {
    "path": "Demo/2021/AnalyzerPackageReference/AnalyzerPackageReference/AnalyzerPackageReference.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net5.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"NonCopyableAnalyzer\" Version=\"0.6.0\" />\n    <PackageReference Include=\"StringLiteralGenerator\" Version=\"1.0.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/AnalyzerPackageReference/AnalyzerPackageReference/NonCopyableAttribute.cs",
    "content": "﻿using System;\n\n[AttributeUsage(AttributeTargets.Struct)]\ninternal class NonCopyableAttribute : Attribute { }\n"
  },
  {
    "path": "Demo/2021/AnalyzerPackageReference/AnalyzerPackageReference/Program.cs",
    "content": "﻿using StringLiteral;\nusing System;\n\n// NonCopyableAnalyzer の機能:\nS s1 = new();\nS s2 = s1; // 構造体の代入(コピー)を禁止する\n\n[NonCopyable]\nstruct S { }\n\n// StringLiteralGenerator の機能:\npartial class Literal\n{\n    [Utf8(\"aあ😀\")]\n    public static partial ReadOnlySpan<byte> M();\n}\n"
  },
  {
    "path": "Demo/2021/AnalyzerPackageReference/AnalyzerPackageReference.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30914.41\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"AnalyzerPackageReference\", \"AnalyzerPackageReference\\AnalyzerPackageReference.csproj\", \"{1C0E45C1-2C6E-4C22-A3E9-04D6515ACFB0}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{1C0E45C1-2C6E-4C22-A3E9-04D6515ACFB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1C0E45C1-2C6E-4C22-A3E9-04D6515ACFB0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1C0E45C1-2C6E-4C22-A3E9-04D6515ACFB0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1C0E45C1-2C6E-4C22-A3E9-04D6515ACFB0}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {7BA20AAC-93AA-43B2-91DC-1DDE2DF4349A}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/A/A.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/B/B.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/C/C.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/A.cs",
    "content": "record A;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/B.cs",
    "content": "record B;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/C.cs",
    "content": "record C;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/ClassLibrary1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/D.cs",
    "content": "record D;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/E.cs",
    "content": "record E;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/F.cs",
    "content": "record F;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/G.cs",
    "content": "record G;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/H.cs",
    "content": "record H;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/I.cs",
    "content": "record I;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/J.cs",
    "content": "record J;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/K.cs",
    "content": "record K;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/L.cs",
    "content": "record L;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/M.cs",
    "content": "record M;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/N.cs",
    "content": "record N;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/O.cs",
    "content": "record O;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/P.cs",
    "content": "record P;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/Q.cs",
    "content": "record Q;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/R.cs",
    "content": "record R;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/S.cs",
    "content": "record S;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/T.cs",
    "content": "record T;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/U.cs",
    "content": "record U;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/V.cs",
    "content": "record V;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/W.cs",
    "content": "record W;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/X.cs",
    "content": "record X;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/Y.cs",
    "content": "record Y;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ClassLibrary1/Z.cs",
    "content": "record Z;"
  },
  {
    "path": "Demo/2021/ColorizeByProject/ColorizeByProject.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.1.31911.260\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"A\", \"A\\A.csproj\", \"{33F4962A-6768-4350-96F3-16FBB0C540A4}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"B\", \"B\\B.csproj\", \"{808ECB2F-FEB3-485C-923B-57A232370340}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"C\", \"C\\C.csproj\", \"{FD971E01-90C5-48BD-9788-C4CE5376A100}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"D\", \"D\\D.csproj\", \"{1CAAD24A-EEC1-402D-8A1A-E0300B1EE2A9}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"E\", \"E\\E.csproj\", \"{65427218-FB6C-485B-BD3F-8C1E2B951894}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"F\", \"F\\F.csproj\", \"{45F4A1AC-9DEF-421D-8F84-7E4A2FE14BA8}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"G\", \"G\\G.csproj\", \"{CBF1F478-9C6E-4C20-9945-AA75C26A0DFD}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"H\", \"H\\H.csproj\", \"{5885C5D3-6B6B-44F3-A1F4-2C561315AE5C}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"I\", \"I\\I.csproj\", \"{832DB30D-B161-430B-8D57-09326CBED917}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"J\", \"J\\J.csproj\", \"{39D52823-CA24-4AC6-B958-45E908EFEE69}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"K\", \"K\\K.csproj\", \"{7609293B-F5DF-43B7-A9AD-8936B1985464}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"L\", \"L\\L.csproj\", \"{A464AE55-FF7B-47C0-966B-11EBD5A6E139}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"M\", \"M\\M.csproj\", \"{08D2713A-2F9B-4265-A451-32EBD17B3902}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"N\", \"N\\N.csproj\", \"{2E9689C9-DE7C-4E7C-9A55-9AB41D445D43}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"O\", \"O\\O.csproj\", \"{8A9443B1-1125-4043-819C-A1807242F1A3}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"P\", \"P\\P.csproj\", \"{EB4EE958-EBDA-4D6B-BED0-83EA94AD03A4}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Q\", \"Q\\Q.csproj\", \"{1C9B31FB-B177-4310-80EA-CD06A0F14DBF}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"R\", \"R\\R.csproj\", \"{1E8C15FA-BF3E-4340-8086-C9861944B6E5}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"S\", \"S\\S.csproj\", \"{4FF87E46-A8AF-4E2C-99D3-EDA7F662197A}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"T\", \"T\\T.csproj\", \"{11ABB4EF-46E4-471B-BAF4-916200F1EE0D}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"U\", \"U\\U.csproj\", \"{1A08AE46-F6EB-4193-8540-07B20BF335D0}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"V\", \"V\\V.csproj\", \"{92DD62B6-675A-4695-ABEF-0A89839AC917}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"W\", \"W\\W.csproj\", \"{653F6476-583A-4C8E-857F-16CC526F89A6}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"X\", \"X\\X.csproj\", \"{98EAB731-4633-4FE9-B66D-802C06C2ADCC}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Y\", \"Y\\Y.csproj\", \"{C14EB5BF-711C-4AF9-A74D-A6C91C24F32B}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Z\", \"Z\\Z.csproj\", \"{D071CC5E-32DC-4352-86A4-E7919B9FA3A8}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{33F4962A-6768-4350-96F3-16FBB0C540A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{33F4962A-6768-4350-96F3-16FBB0C540A4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{33F4962A-6768-4350-96F3-16FBB0C540A4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{33F4962A-6768-4350-96F3-16FBB0C540A4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{808ECB2F-FEB3-485C-923B-57A232370340}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{808ECB2F-FEB3-485C-923B-57A232370340}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{808ECB2F-FEB3-485C-923B-57A232370340}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{808ECB2F-FEB3-485C-923B-57A232370340}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FD971E01-90C5-48BD-9788-C4CE5376A100}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FD971E01-90C5-48BD-9788-C4CE5376A100}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FD971E01-90C5-48BD-9788-C4CE5376A100}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FD971E01-90C5-48BD-9788-C4CE5376A100}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1CAAD24A-EEC1-402D-8A1A-E0300B1EE2A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1CAAD24A-EEC1-402D-8A1A-E0300B1EE2A9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1CAAD24A-EEC1-402D-8A1A-E0300B1EE2A9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1CAAD24A-EEC1-402D-8A1A-E0300B1EE2A9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{65427218-FB6C-485B-BD3F-8C1E2B951894}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{65427218-FB6C-485B-BD3F-8C1E2B951894}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{65427218-FB6C-485B-BD3F-8C1E2B951894}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{65427218-FB6C-485B-BD3F-8C1E2B951894}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{45F4A1AC-9DEF-421D-8F84-7E4A2FE14BA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{45F4A1AC-9DEF-421D-8F84-7E4A2FE14BA8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{45F4A1AC-9DEF-421D-8F84-7E4A2FE14BA8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{45F4A1AC-9DEF-421D-8F84-7E4A2FE14BA8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CBF1F478-9C6E-4C20-9945-AA75C26A0DFD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CBF1F478-9C6E-4C20-9945-AA75C26A0DFD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CBF1F478-9C6E-4C20-9945-AA75C26A0DFD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CBF1F478-9C6E-4C20-9945-AA75C26A0DFD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5885C5D3-6B6B-44F3-A1F4-2C561315AE5C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5885C5D3-6B6B-44F3-A1F4-2C561315AE5C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5885C5D3-6B6B-44F3-A1F4-2C561315AE5C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5885C5D3-6B6B-44F3-A1F4-2C561315AE5C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{832DB30D-B161-430B-8D57-09326CBED917}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{832DB30D-B161-430B-8D57-09326CBED917}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{832DB30D-B161-430B-8D57-09326CBED917}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{832DB30D-B161-430B-8D57-09326CBED917}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{39D52823-CA24-4AC6-B958-45E908EFEE69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{39D52823-CA24-4AC6-B958-45E908EFEE69}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{39D52823-CA24-4AC6-B958-45E908EFEE69}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{39D52823-CA24-4AC6-B958-45E908EFEE69}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7609293B-F5DF-43B7-A9AD-8936B1985464}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7609293B-F5DF-43B7-A9AD-8936B1985464}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7609293B-F5DF-43B7-A9AD-8936B1985464}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7609293B-F5DF-43B7-A9AD-8936B1985464}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A464AE55-FF7B-47C0-966B-11EBD5A6E139}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A464AE55-FF7B-47C0-966B-11EBD5A6E139}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A464AE55-FF7B-47C0-966B-11EBD5A6E139}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A464AE55-FF7B-47C0-966B-11EBD5A6E139}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{08D2713A-2F9B-4265-A451-32EBD17B3902}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{08D2713A-2F9B-4265-A451-32EBD17B3902}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{08D2713A-2F9B-4265-A451-32EBD17B3902}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{08D2713A-2F9B-4265-A451-32EBD17B3902}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2E9689C9-DE7C-4E7C-9A55-9AB41D445D43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2E9689C9-DE7C-4E7C-9A55-9AB41D445D43}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2E9689C9-DE7C-4E7C-9A55-9AB41D445D43}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2E9689C9-DE7C-4E7C-9A55-9AB41D445D43}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8A9443B1-1125-4043-819C-A1807242F1A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8A9443B1-1125-4043-819C-A1807242F1A3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8A9443B1-1125-4043-819C-A1807242F1A3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8A9443B1-1125-4043-819C-A1807242F1A3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{EB4EE958-EBDA-4D6B-BED0-83EA94AD03A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EB4EE958-EBDA-4D6B-BED0-83EA94AD03A4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EB4EE958-EBDA-4D6B-BED0-83EA94AD03A4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EB4EE958-EBDA-4D6B-BED0-83EA94AD03A4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1C9B31FB-B177-4310-80EA-CD06A0F14DBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1C9B31FB-B177-4310-80EA-CD06A0F14DBF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1C9B31FB-B177-4310-80EA-CD06A0F14DBF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1C9B31FB-B177-4310-80EA-CD06A0F14DBF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1E8C15FA-BF3E-4340-8086-C9861944B6E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1E8C15FA-BF3E-4340-8086-C9861944B6E5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1E8C15FA-BF3E-4340-8086-C9861944B6E5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1E8C15FA-BF3E-4340-8086-C9861944B6E5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4FF87E46-A8AF-4E2C-99D3-EDA7F662197A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4FF87E46-A8AF-4E2C-99D3-EDA7F662197A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4FF87E46-A8AF-4E2C-99D3-EDA7F662197A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4FF87E46-A8AF-4E2C-99D3-EDA7F662197A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{11ABB4EF-46E4-471B-BAF4-916200F1EE0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{11ABB4EF-46E4-471B-BAF4-916200F1EE0D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{11ABB4EF-46E4-471B-BAF4-916200F1EE0D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{11ABB4EF-46E4-471B-BAF4-916200F1EE0D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1A08AE46-F6EB-4193-8540-07B20BF335D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1A08AE46-F6EB-4193-8540-07B20BF335D0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1A08AE46-F6EB-4193-8540-07B20BF335D0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1A08AE46-F6EB-4193-8540-07B20BF335D0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{92DD62B6-675A-4695-ABEF-0A89839AC917}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{92DD62B6-675A-4695-ABEF-0A89839AC917}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{92DD62B6-675A-4695-ABEF-0A89839AC917}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{92DD62B6-675A-4695-ABEF-0A89839AC917}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{653F6476-583A-4C8E-857F-16CC526F89A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{653F6476-583A-4C8E-857F-16CC526F89A6}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{653F6476-583A-4C8E-857F-16CC526F89A6}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{653F6476-583A-4C8E-857F-16CC526F89A6}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{98EAB731-4633-4FE9-B66D-802C06C2ADCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{98EAB731-4633-4FE9-B66D-802C06C2ADCC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{98EAB731-4633-4FE9-B66D-802C06C2ADCC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{98EAB731-4633-4FE9-B66D-802C06C2ADCC}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C14EB5BF-711C-4AF9-A74D-A6C91C24F32B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C14EB5BF-711C-4AF9-A74D-A6C91C24F32B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C14EB5BF-711C-4AF9-A74D-A6C91C24F32B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C14EB5BF-711C-4AF9-A74D-A6C91C24F32B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D071CC5E-32DC-4352-86A4-E7919B9FA3A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D071CC5E-32DC-4352-86A4-E7919B9FA3A8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D071CC5E-32DC-4352-86A4-E7919B9FA3A8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D071CC5E-32DC-4352-86A4-E7919B9FA3A8}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {4B5C1718-91D3-4D7F-86C1-ADD22CDC909B}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/D/D.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/E/E.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/F/F.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/G/G.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/H/H.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/I/I.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/J/J.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/K/K.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/L/L.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/M/M.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/N/N.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/O/O.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/P/P.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/Q/Q.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/R/R.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/S/S.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/T/T.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/U/U.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/V/V.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/W/W.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/X/X.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/Y/Y.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ColorizeByProject/Z/Z.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Include=\"../ClassLibrary1/**/*.cs\" Exclude=\"../ClassLibrary1/obj/**/*\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/CallerArgument/AllCallerInfo/AllCallerInfo.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/CallerArgument/AllCallerInfo/Program.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nm(2 * 3 * 5);\n\nstatic void m(\n    int x,\n    [CallerLineNumber] int line = 0,\n    [CallerFilePath] string? file = null,\n    [CallerMemberName] string? member = null,\n    [CallerArgumentExpression(\"x\")] string? arg = null)\n{\n    Console.WriteLine($@\"{file} の {line} 行目\n{member} から呼ばれていて\n{arg} という式を引数に渡している\n(実際の値は {x})\n\");\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/CallerArgument/CallerArgument/CallerArgument.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/CallerArgument/CallerArgument/Program.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nm(2 * 3 * 5);\n\nstatic void m(\n    int x,\n    [CallerArgumentExpression(\"x\")] string? expression = null)\n{\n    Console.WriteLine($\"{expression} = {x}\");\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/CallerArgument/ThrowIfNull/Program.cs",
    "content": "﻿m(null);\n\nstatic void m(string? myArgument)\n{\n    ArgumentNullException.ThrowIfNull(myArgument);\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/CallerArgument/ThrowIfNull/ThrowIfNull.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/Csharp10.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.31606.5\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"CreateInstanceBenchmark\", \"ParameterlessConstructors\\CreateInstanceBenchmark\\CreateInstanceBenchmark.csproj\", \"{7F81FCEF-2742-4413-AD6A-6F97BF1172EC}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ActivatorBug\", \"ParameterlessConstructors\\ActivatorBug\\ActivatorBug.csproj\", \"{806C5608-127E-4908-B1D4-D2BB189863B0}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"StaticAbstract\", \"StaticAbstract\", \"{945AFC5C-90AF-4397-AA98-51AE8924686A}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"GenericMath\", \"StaticAbstract\\GenericMath\\GenericMath.csproj\", \"{EB2F440E-F4A8-4077-8F63-50626FACEEA7}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"ParameterlessConstructors\", \"ParameterlessConstructors\", \"{003DCAB6-4EAE-437C-A279-566A6E47A348}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Zeroed\", \"ParameterlessConstructors\\Zeroed\\Zeroed.csproj\", \"{1E21A756-5CC6-4254-BE8C-263F0058CCA9}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"RecordStruct\", \"ParameterlessConstructors\\RecordStruct\\RecordStruct.csproj\", \"{A5F430E8-2025-4EAF-84ED-93B894EA04FD}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"FieldInitializer\", \"ParameterlessConstructors\\FieldInitializer\\FieldInitializer.csproj\", \"{BE020173-1FD8-44D8-A3A3-590E4A36F561}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"GenericNew\", \"ParameterlessConstructors\\GenericNew\\GenericNew.csproj\", \"{11292117-6D15-4937-8FE3-B991F8769CD5}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"NewOrDefault\", \"ParameterlessConstructors\\NewOrDefault\\NewOrDefault.csproj\", \"{CCFE3BE4-0668-43A3-8FBC-264CAFA0F076}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"NonPublicConstructor\", \"ParameterlessConstructors\\NonPublicConstructor\\NonPublicConstructor.csproj\", \"{5CA37315-7DEE-4F66-B011-8F02D7E8FF6E}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ImmutableArray\", \"ParameterlessConstructors\\ImmutableArray\\ImmutableArray.csproj\", \"{738FB3E5-7F2F-44C4-AEB8-3F99F1244D61}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"RecordStruct\", \"RecordStruct\", \"{593AE9AD-F21B-4063-AEF7-D2F2A61F63BB}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RecordStruct\", \"RecordStruct\\RecordStruct\\RecordStruct.csproj\", \"{21CDCD25-C900-4742-8B4D-A62EF8FB729E}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"InterpolatedStrings\", \"InterpolatedStrings\", \"{A73FA307-E8C2-45BE-87C3-488C4E90E153}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Benchmark\", \"InterpolatedStrings\\Benchmark\\Benchmark.csproj\", \"{67355A52-DF8C-40F4-95BC-2F1D80267DA2}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ParamsDictionary\", \"InterpolatedStrings\\ParamsDictionary\\ParamsDictionary.csproj\", \"{3F5FAC7F-5A7C-4F6A-97DA-941255FE9B5D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ImprovedInterpolatedStrings\", \"InterpolatedStrings\\ImprovedInterpolatedStrings\\ImprovedInterpolatedStrings.csproj\", \"{D524F574-482D-4AF3-BBF3-74DF47646ACF}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"InvariantGlobalization\", \"InterpolatedStrings\\InvariantGlobalization\\InvariantGlobalization.csproj\", \"{8F740CFB-BA24-4F1E-8531-852255B587CB}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Metadata\", \"RecordStruct\\Metadata\\Metadata.csproj\", \"{D24AA5E5-7261-4D49-9286-B3E41EDE1708}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"With\", \"RecordStruct\\With\\With.csproj\", \"{8C54A9FF-38A2-4513-8FA8-DA17DD73F9DA}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"VsClass\", \"RecordStruct\\VsClass\\VsClass.csproj\", \"{56654A8E-9A78-4CDE-8EB7-41EBEE5E2FA2}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"VsNormalStruct\", \"RecordStruct\\VsNormalStruct\\VsNormalStruct.csproj\", \"{458915AC-A140-49E5-A66B-5895C42150A3}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"HidingField\", \"RecordStruct\\HidingField\\HidingField.csproj\", \"{B5092AEF-FF02-4C85-B5B1-5A3869387AD3}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"OverloadResolution\", \"InterpolatedStrings\\OverloadResolution\\OverloadResolution.csproj\", \"{04FE5AFF-8EED-46A6-818B-28D186808647}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"CallerArgument\", \"CallerArgument\", \"{19C68341-AF83-4B59-BE32-9C8910E182A4}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ThrowIfNull\", \"CallerArgument\\ThrowIfNull\\ThrowIfNull.csproj\", \"{12E1DE5D-053E-4407-9F44-F9500C0F2EBE}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"AllCallerInfo\", \"CallerArgument\\AllCallerInfo\\AllCallerInfo.csproj\", \"{1A05D602-AA8E-49AB-824A-BFBF8210A283}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CallerArgument\", \"CallerArgument\\CallerArgument\\CallerArgument.csproj\", \"{86FCA59A-56C1-4EA4-A505-A1EA5FC23696}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"DefaultParameter\", \"ParameterlessConstructors\\DefaultParameter\\DefaultParameter.csproj\", \"{8191031B-E0D0-4F50-9826-945F0FBB4AFF}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConstString\", \"InterpolatedStrings\\ConstString\\ConstString.csproj\", \"{D7D9B42E-87C0-460F-90B1-61FDDEA5487B}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Others\", \"Others\", \"{8D2F0151-62AE-4A3E-A98A-AA323D4FC7D6}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ExtendedPropertyPetterns\", \"Others\\ExtendedPropertyPetterns\\ExtendedPropertyPetterns.csproj\", \"{99AC893B-5A0B-4083-85E7-406F6B02CF31}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MixedDeconstruction\", \"Others\\MixedDeconstruction\\MixedDeconstruction.csproj\", \"{125BD8F3-35B1-42F9-9F3B-CBC81DA50659}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MinimalHandler\", \"InterpolatedStrings\\MinimalHandler\\MinimalHandler.csproj\", \"{D638C55C-590E-40DE-BB88-4794227C3090}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"DefaultInterpolatedStringHandler\", \"InterpolatedStrings\\DefaultInterpolatedStringHandler\\DefaultInterpolatedStringHandler.csproj\", \"{CA53194E-4104-47C5-9C0F-A51452348890}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"FormattingHandler\", \"InterpolatedStrings\\FormattingHandler\\FormattingHandler.csproj\", \"{8A6B2611-E41C-4F6A-8124-641870883D30}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"AppendFormattedOverload\", \"InterpolatedStrings\\AppendFormattedOverload\\AppendFormattedOverload.csproj\", \"{6EDE3406-A6D7-4DD0-A1CE-3275C8485E43}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"BoolReturn\", \"InterpolatedStrings\\BoolReturn\\BoolReturn.csproj\", \"{7AB361FC-D756-4698-95DD-44D219E924E5}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"InterpolatedStringHandlerArgument\", \"InterpolatedStrings\\InterpolatedStringHandlerArgument\\InterpolatedStringHandlerArgument.csproj\", \"{B0C17640-B43D-4EA4-A0D9-B175406A432A}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Lambda\", \"Lambda\", \"{7E3DC008-65AB-4935-9F25-84AAD4D4E446}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NaturalType\", \"Lambda\\NaturalType\\NaturalType.csproj\", \"{85F94565-A2F4-4678-9B4A-4BD3EF697E71}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SimpleWeb\", \"Lambda\\SimpleWeb\\SimpleWeb.csproj\", \"{FA2AD8DF-D70F-488E-AB75-31919DD7270C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"AttributeAndReturn\", \"Lambda\\AttributeAndReturn\\AttributeAndReturn.csproj\", \"{7B8FDE09-A11A-45CA-BF0F-F833F53F35B5}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SimpleReturn\", \"Lambda\\SimpleReturn\\SimpleReturn.csproj\", \"{8676F0A9-B371-40F5-8925-C55AFC68DE0D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TargetTypedReturn\", \"Lambda\\TargetTypedReturn\\TargetTypedReturn.csproj\", \"{86742393-3F64-43CF-A1B1-E5951691F849}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"AttributeWeb\", \"Lambda\\AttributeWeb\\AttributeWeb.csproj\", \"{A076E5EA-93EF-4162-8324-26B9316B6F5A}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{7F81FCEF-2742-4413-AD6A-6F97BF1172EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7F81FCEF-2742-4413-AD6A-6F97BF1172EC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7F81FCEF-2742-4413-AD6A-6F97BF1172EC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7F81FCEF-2742-4413-AD6A-6F97BF1172EC}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{806C5608-127E-4908-B1D4-D2BB189863B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{806C5608-127E-4908-B1D4-D2BB189863B0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{806C5608-127E-4908-B1D4-D2BB189863B0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{806C5608-127E-4908-B1D4-D2BB189863B0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{EB2F440E-F4A8-4077-8F63-50626FACEEA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EB2F440E-F4A8-4077-8F63-50626FACEEA7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EB2F440E-F4A8-4077-8F63-50626FACEEA7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EB2F440E-F4A8-4077-8F63-50626FACEEA7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1E21A756-5CC6-4254-BE8C-263F0058CCA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1E21A756-5CC6-4254-BE8C-263F0058CCA9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1E21A756-5CC6-4254-BE8C-263F0058CCA9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1E21A756-5CC6-4254-BE8C-263F0058CCA9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A5F430E8-2025-4EAF-84ED-93B894EA04FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A5F430E8-2025-4EAF-84ED-93B894EA04FD}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A5F430E8-2025-4EAF-84ED-93B894EA04FD}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A5F430E8-2025-4EAF-84ED-93B894EA04FD}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{BE020173-1FD8-44D8-A3A3-590E4A36F561}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{BE020173-1FD8-44D8-A3A3-590E4A36F561}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{BE020173-1FD8-44D8-A3A3-590E4A36F561}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{BE020173-1FD8-44D8-A3A3-590E4A36F561}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{11292117-6D15-4937-8FE3-B991F8769CD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{11292117-6D15-4937-8FE3-B991F8769CD5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{11292117-6D15-4937-8FE3-B991F8769CD5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{11292117-6D15-4937-8FE3-B991F8769CD5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CCFE3BE4-0668-43A3-8FBC-264CAFA0F076}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CCFE3BE4-0668-43A3-8FBC-264CAFA0F076}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CCFE3BE4-0668-43A3-8FBC-264CAFA0F076}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CCFE3BE4-0668-43A3-8FBC-264CAFA0F076}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5CA37315-7DEE-4F66-B011-8F02D7E8FF6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5CA37315-7DEE-4F66-B011-8F02D7E8FF6E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5CA37315-7DEE-4F66-B011-8F02D7E8FF6E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5CA37315-7DEE-4F66-B011-8F02D7E8FF6E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{738FB3E5-7F2F-44C4-AEB8-3F99F1244D61}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{738FB3E5-7F2F-44C4-AEB8-3F99F1244D61}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{738FB3E5-7F2F-44C4-AEB8-3F99F1244D61}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{738FB3E5-7F2F-44C4-AEB8-3F99F1244D61}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{21CDCD25-C900-4742-8B4D-A62EF8FB729E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{21CDCD25-C900-4742-8B4D-A62EF8FB729E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{21CDCD25-C900-4742-8B4D-A62EF8FB729E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{21CDCD25-C900-4742-8B4D-A62EF8FB729E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{67355A52-DF8C-40F4-95BC-2F1D80267DA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{67355A52-DF8C-40F4-95BC-2F1D80267DA2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{67355A52-DF8C-40F4-95BC-2F1D80267DA2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{67355A52-DF8C-40F4-95BC-2F1D80267DA2}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3F5FAC7F-5A7C-4F6A-97DA-941255FE9B5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3F5FAC7F-5A7C-4F6A-97DA-941255FE9B5D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3F5FAC7F-5A7C-4F6A-97DA-941255FE9B5D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3F5FAC7F-5A7C-4F6A-97DA-941255FE9B5D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D524F574-482D-4AF3-BBF3-74DF47646ACF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D524F574-482D-4AF3-BBF3-74DF47646ACF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D524F574-482D-4AF3-BBF3-74DF47646ACF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D524F574-482D-4AF3-BBF3-74DF47646ACF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8F740CFB-BA24-4F1E-8531-852255B587CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8F740CFB-BA24-4F1E-8531-852255B587CB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8F740CFB-BA24-4F1E-8531-852255B587CB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8F740CFB-BA24-4F1E-8531-852255B587CB}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D24AA5E5-7261-4D49-9286-B3E41EDE1708}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D24AA5E5-7261-4D49-9286-B3E41EDE1708}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D24AA5E5-7261-4D49-9286-B3E41EDE1708}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D24AA5E5-7261-4D49-9286-B3E41EDE1708}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8C54A9FF-38A2-4513-8FA8-DA17DD73F9DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8C54A9FF-38A2-4513-8FA8-DA17DD73F9DA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8C54A9FF-38A2-4513-8FA8-DA17DD73F9DA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8C54A9FF-38A2-4513-8FA8-DA17DD73F9DA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{56654A8E-9A78-4CDE-8EB7-41EBEE5E2FA2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{56654A8E-9A78-4CDE-8EB7-41EBEE5E2FA2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{56654A8E-9A78-4CDE-8EB7-41EBEE5E2FA2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{56654A8E-9A78-4CDE-8EB7-41EBEE5E2FA2}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{458915AC-A140-49E5-A66B-5895C42150A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{458915AC-A140-49E5-A66B-5895C42150A3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{458915AC-A140-49E5-A66B-5895C42150A3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{458915AC-A140-49E5-A66B-5895C42150A3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B5092AEF-FF02-4C85-B5B1-5A3869387AD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B5092AEF-FF02-4C85-B5B1-5A3869387AD3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B5092AEF-FF02-4C85-B5B1-5A3869387AD3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B5092AEF-FF02-4C85-B5B1-5A3869387AD3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{04FE5AFF-8EED-46A6-818B-28D186808647}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{04FE5AFF-8EED-46A6-818B-28D186808647}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{04FE5AFF-8EED-46A6-818B-28D186808647}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{04FE5AFF-8EED-46A6-818B-28D186808647}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{12E1DE5D-053E-4407-9F44-F9500C0F2EBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{12E1DE5D-053E-4407-9F44-F9500C0F2EBE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{12E1DE5D-053E-4407-9F44-F9500C0F2EBE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{12E1DE5D-053E-4407-9F44-F9500C0F2EBE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1A05D602-AA8E-49AB-824A-BFBF8210A283}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1A05D602-AA8E-49AB-824A-BFBF8210A283}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1A05D602-AA8E-49AB-824A-BFBF8210A283}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1A05D602-AA8E-49AB-824A-BFBF8210A283}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{86FCA59A-56C1-4EA4-A505-A1EA5FC23696}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{86FCA59A-56C1-4EA4-A505-A1EA5FC23696}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{86FCA59A-56C1-4EA4-A505-A1EA5FC23696}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{86FCA59A-56C1-4EA4-A505-A1EA5FC23696}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8191031B-E0D0-4F50-9826-945F0FBB4AFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8191031B-E0D0-4F50-9826-945F0FBB4AFF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8191031B-E0D0-4F50-9826-945F0FBB4AFF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8191031B-E0D0-4F50-9826-945F0FBB4AFF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D7D9B42E-87C0-460F-90B1-61FDDEA5487B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D7D9B42E-87C0-460F-90B1-61FDDEA5487B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D7D9B42E-87C0-460F-90B1-61FDDEA5487B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D7D9B42E-87C0-460F-90B1-61FDDEA5487B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{99AC893B-5A0B-4083-85E7-406F6B02CF31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{99AC893B-5A0B-4083-85E7-406F6B02CF31}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{99AC893B-5A0B-4083-85E7-406F6B02CF31}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{99AC893B-5A0B-4083-85E7-406F6B02CF31}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{125BD8F3-35B1-42F9-9F3B-CBC81DA50659}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{125BD8F3-35B1-42F9-9F3B-CBC81DA50659}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{125BD8F3-35B1-42F9-9F3B-CBC81DA50659}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{125BD8F3-35B1-42F9-9F3B-CBC81DA50659}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D638C55C-590E-40DE-BB88-4794227C3090}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D638C55C-590E-40DE-BB88-4794227C3090}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D638C55C-590E-40DE-BB88-4794227C3090}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D638C55C-590E-40DE-BB88-4794227C3090}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CA53194E-4104-47C5-9C0F-A51452348890}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CA53194E-4104-47C5-9C0F-A51452348890}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CA53194E-4104-47C5-9C0F-A51452348890}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CA53194E-4104-47C5-9C0F-A51452348890}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8A6B2611-E41C-4F6A-8124-641870883D30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8A6B2611-E41C-4F6A-8124-641870883D30}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8A6B2611-E41C-4F6A-8124-641870883D30}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8A6B2611-E41C-4F6A-8124-641870883D30}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{6EDE3406-A6D7-4DD0-A1CE-3275C8485E43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6EDE3406-A6D7-4DD0-A1CE-3275C8485E43}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6EDE3406-A6D7-4DD0-A1CE-3275C8485E43}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6EDE3406-A6D7-4DD0-A1CE-3275C8485E43}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7AB361FC-D756-4698-95DD-44D219E924E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7AB361FC-D756-4698-95DD-44D219E924E5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7AB361FC-D756-4698-95DD-44D219E924E5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7AB361FC-D756-4698-95DD-44D219E924E5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B0C17640-B43D-4EA4-A0D9-B175406A432A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B0C17640-B43D-4EA4-A0D9-B175406A432A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B0C17640-B43D-4EA4-A0D9-B175406A432A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B0C17640-B43D-4EA4-A0D9-B175406A432A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{85F94565-A2F4-4678-9B4A-4BD3EF697E71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{85F94565-A2F4-4678-9B4A-4BD3EF697E71}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{85F94565-A2F4-4678-9B4A-4BD3EF697E71}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{85F94565-A2F4-4678-9B4A-4BD3EF697E71}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FA2AD8DF-D70F-488E-AB75-31919DD7270C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FA2AD8DF-D70F-488E-AB75-31919DD7270C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FA2AD8DF-D70F-488E-AB75-31919DD7270C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FA2AD8DF-D70F-488E-AB75-31919DD7270C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7B8FDE09-A11A-45CA-BF0F-F833F53F35B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7B8FDE09-A11A-45CA-BF0F-F833F53F35B5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7B8FDE09-A11A-45CA-BF0F-F833F53F35B5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7B8FDE09-A11A-45CA-BF0F-F833F53F35B5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8676F0A9-B371-40F5-8925-C55AFC68DE0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8676F0A9-B371-40F5-8925-C55AFC68DE0D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8676F0A9-B371-40F5-8925-C55AFC68DE0D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8676F0A9-B371-40F5-8925-C55AFC68DE0D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{86742393-3F64-43CF-A1B1-E5951691F849}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{86742393-3F64-43CF-A1B1-E5951691F849}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{86742393-3F64-43CF-A1B1-E5951691F849}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{86742393-3F64-43CF-A1B1-E5951691F849}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A076E5EA-93EF-4162-8324-26B9316B6F5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A076E5EA-93EF-4162-8324-26B9316B6F5A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A076E5EA-93EF-4162-8324-26B9316B6F5A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A076E5EA-93EF-4162-8324-26B9316B6F5A}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{7F81FCEF-2742-4413-AD6A-6F97BF1172EC} = {003DCAB6-4EAE-437C-A279-566A6E47A348}\n\t\t{806C5608-127E-4908-B1D4-D2BB189863B0} = {003DCAB6-4EAE-437C-A279-566A6E47A348}\n\t\t{EB2F440E-F4A8-4077-8F63-50626FACEEA7} = {945AFC5C-90AF-4397-AA98-51AE8924686A}\n\t\t{1E21A756-5CC6-4254-BE8C-263F0058CCA9} = {003DCAB6-4EAE-437C-A279-566A6E47A348}\n\t\t{A5F430E8-2025-4EAF-84ED-93B894EA04FD} = {003DCAB6-4EAE-437C-A279-566A6E47A348}\n\t\t{BE020173-1FD8-44D8-A3A3-590E4A36F561} = {003DCAB6-4EAE-437C-A279-566A6E47A348}\n\t\t{11292117-6D15-4937-8FE3-B991F8769CD5} = {003DCAB6-4EAE-437C-A279-566A6E47A348}\n\t\t{CCFE3BE4-0668-43A3-8FBC-264CAFA0F076} = {003DCAB6-4EAE-437C-A279-566A6E47A348}\n\t\t{5CA37315-7DEE-4F66-B011-8F02D7E8FF6E} = {003DCAB6-4EAE-437C-A279-566A6E47A348}\n\t\t{738FB3E5-7F2F-44C4-AEB8-3F99F1244D61} = {003DCAB6-4EAE-437C-A279-566A6E47A348}\n\t\t{21CDCD25-C900-4742-8B4D-A62EF8FB729E} = {593AE9AD-F21B-4063-AEF7-D2F2A61F63BB}\n\t\t{67355A52-DF8C-40F4-95BC-2F1D80267DA2} = {A73FA307-E8C2-45BE-87C3-488C4E90E153}\n\t\t{3F5FAC7F-5A7C-4F6A-97DA-941255FE9B5D} = {A73FA307-E8C2-45BE-87C3-488C4E90E153}\n\t\t{D524F574-482D-4AF3-BBF3-74DF47646ACF} = {A73FA307-E8C2-45BE-87C3-488C4E90E153}\n\t\t{8F740CFB-BA24-4F1E-8531-852255B587CB} = {A73FA307-E8C2-45BE-87C3-488C4E90E153}\n\t\t{D24AA5E5-7261-4D49-9286-B3E41EDE1708} = {593AE9AD-F21B-4063-AEF7-D2F2A61F63BB}\n\t\t{8C54A9FF-38A2-4513-8FA8-DA17DD73F9DA} = {593AE9AD-F21B-4063-AEF7-D2F2A61F63BB}\n\t\t{56654A8E-9A78-4CDE-8EB7-41EBEE5E2FA2} = {593AE9AD-F21B-4063-AEF7-D2F2A61F63BB}\n\t\t{458915AC-A140-49E5-A66B-5895C42150A3} = {593AE9AD-F21B-4063-AEF7-D2F2A61F63BB}\n\t\t{B5092AEF-FF02-4C85-B5B1-5A3869387AD3} = {593AE9AD-F21B-4063-AEF7-D2F2A61F63BB}\n\t\t{04FE5AFF-8EED-46A6-818B-28D186808647} = {A73FA307-E8C2-45BE-87C3-488C4E90E153}\n\t\t{12E1DE5D-053E-4407-9F44-F9500C0F2EBE} = {19C68341-AF83-4B59-BE32-9C8910E182A4}\n\t\t{1A05D602-AA8E-49AB-824A-BFBF8210A283} = {19C68341-AF83-4B59-BE32-9C8910E182A4}\n\t\t{86FCA59A-56C1-4EA4-A505-A1EA5FC23696} = {19C68341-AF83-4B59-BE32-9C8910E182A4}\n\t\t{8191031B-E0D0-4F50-9826-945F0FBB4AFF} = {003DCAB6-4EAE-437C-A279-566A6E47A348}\n\t\t{D7D9B42E-87C0-460F-90B1-61FDDEA5487B} = {A73FA307-E8C2-45BE-87C3-488C4E90E153}\n\t\t{99AC893B-5A0B-4083-85E7-406F6B02CF31} = {8D2F0151-62AE-4A3E-A98A-AA323D4FC7D6}\n\t\t{125BD8F3-35B1-42F9-9F3B-CBC81DA50659} = {8D2F0151-62AE-4A3E-A98A-AA323D4FC7D6}\n\t\t{D638C55C-590E-40DE-BB88-4794227C3090} = {A73FA307-E8C2-45BE-87C3-488C4E90E153}\n\t\t{CA53194E-4104-47C5-9C0F-A51452348890} = {A73FA307-E8C2-45BE-87C3-488C4E90E153}\n\t\t{8A6B2611-E41C-4F6A-8124-641870883D30} = {A73FA307-E8C2-45BE-87C3-488C4E90E153}\n\t\t{6EDE3406-A6D7-4DD0-A1CE-3275C8485E43} = {A73FA307-E8C2-45BE-87C3-488C4E90E153}\n\t\t{7AB361FC-D756-4698-95DD-44D219E924E5} = {A73FA307-E8C2-45BE-87C3-488C4E90E153}\n\t\t{B0C17640-B43D-4EA4-A0D9-B175406A432A} = {A73FA307-E8C2-45BE-87C3-488C4E90E153}\n\t\t{85F94565-A2F4-4678-9B4A-4BD3EF697E71} = {7E3DC008-65AB-4935-9F25-84AAD4D4E446}\n\t\t{FA2AD8DF-D70F-488E-AB75-31919DD7270C} = {7E3DC008-65AB-4935-9F25-84AAD4D4E446}\n\t\t{7B8FDE09-A11A-45CA-BF0F-F833F53F35B5} = {7E3DC008-65AB-4935-9F25-84AAD4D4E446}\n\t\t{8676F0A9-B371-40F5-8925-C55AFC68DE0D} = {7E3DC008-65AB-4935-9F25-84AAD4D4E446}\n\t\t{86742393-3F64-43CF-A1B1-E5951691F849} = {7E3DC008-65AB-4935-9F25-84AAD4D4E446}\n\t\t{A076E5EA-93EF-4162-8324-26B9316B6F5A} = {7E3DC008-65AB-4935-9F25-84AAD4D4E446}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {14B6A0CC-5203-434F-A0F8-1F7B1A66DE48}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/AppendFormattedOverload/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CS8321.severity = silent\ndotnet_diagnostic.CA1050.severity = silent\ndotnet_diagnostic.CA1822.severity = silent\ndotnet_diagnostic.IDE0060.severity = silent\ndotnet_diagnostic.IDE0062.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/AppendFormattedOverload/AppendFormattedOverload.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/AppendFormattedOverload/Program.cs",
    "content": "﻿DummyHandler h = $\"{123}, {\"abc\"}, {stackalloc char[1]}\";\n\n[System.Runtime.CompilerServices.InterpolatedStringHandler]\npublic struct DummyHandler\n{\n    public DummyHandler(int literalLength, int formattedCount) { }\n    public void AppendLiteral(string s) => Console.WriteLine(\"(literal)\");\n    public void AppendFormatted<T>(T x) => Console.WriteLine(\"ジェネリック版\");\n    public void AppendFormatted(string x) => Console.WriteLine(\"string 版\");\n    public void AppendFormatted(ReadOnlySpan<char> x) => Console.WriteLine(\"ReadOnlySpan 版\");\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/Benchmark/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CA1050.severity = silent\ndotnet_diagnostic.CA1822.severity = silent\ndotnet_diagnostic.IDE0060.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/Benchmark/Benchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.13.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/Benchmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing System.Globalization;\nusing System.Runtime.CompilerServices;\n\nBenchmarkRunner.Run<StringInterpolationBenchmark>();\n\n[MemoryDiagnoser]\npublic class StringInterpolationBenchmark\n{\n    private const int N = 10;\n    private const int InitialBufferSize = 32;\n\n    [Benchmark]\n    public void OldStyle()\n    {\n        for (int a = 0; a < N; a++)\n            for (int b = 0; b < N; b++)\n                for (int c = 0; c < N; c++)\n                    for (int d = 0; d < N; d++)\n                        m(a, b, c, d);\n\n        // 昔の $\"{a}.{b}.{c}.{d}\" は string.Format に展開されてた。\n        // C# 10.0 以降でも、DefaultInterpolatedStringHandler がない(TargetFramework が .NET 5 以下とか)だとこれになる。\n        static string m(int a, int b, int c, int d) => string.Format(\"{0}.{1}.{2}.{3}\", a, b, c, d);\n    }\n\n    [Benchmark]\n    public void Improved()\n    {\n        for (int a = 0; a < N; a++)\n            for (int b = 0; b < N; b++)\n                for (int c = 0; c < N; c++)\n                    for (int d = 0; d < N; d++)\n                        m(a, b, c, d);\n\n        static string m(int a, int b, int c, int d) => $\"{a}.{b}.{c}.{d}\";\n    }\n\n    private static readonly CultureInfo _currentCulture = CultureInfo.CurrentCulture;\n    private static readonly CultureInfo _invariantCulture = CultureInfo.InvariantCulture;\n\n    [Benchmark]\n    public void InvariantCulture()\n    {\n        for (int a = 0; a < N; a++)\n            for (int b = 0; b < N; b++)\n                for (int c = 0; c < N; c++)\n                    for (int d = 0; d < N; d++)\n                        m(a, b, c, d);\n\n        static string m(int a, int b, int c, int d) => string.Create(_invariantCulture, $\"{a}.{b}.{c}.{d}\");\n    }\n\n    [Benchmark]\n    public void InitialBuffer()\n    {\n        for (int a = 0; a < N; a++)\n            for (int b = 0; b < N; b++)\n                for (int c = 0; c < N; c++)\n                    for (int d = 0; d < N; d++)\n                        m(a, b, c, d);\n\n        static string m(int a, int b, int c, int d) => string.Create(_currentCulture, stackalloc char[InitialBufferSize], $\"{a}.{b}.{c}.{d}\");\n    }\n\n    [Benchmark]\n    public void InitialBufferInvariantCulture()\n    {\n        for (int a = 0; a < N; a++)\n            for (int b = 0; b < N; b++)\n                for (int c = 0; c < N; c++)\n                    for (int d = 0; d < N; d++)\n                        m(a, b, c, d);\n\n        static string m(int a, int b, int c, int d) => string.Create(_invariantCulture, stackalloc char[InitialBufferSize], $\"{a}.{b}.{c}.{d}\");\n    }\n\n    [Benchmark]\n    public void InitialBufferSkipLocalsInitInvariantCulture()\n    {\n        for (int a = 0; a < N; a++)\n            for (int b = 0; b < N; b++)\n                for (int c = 0; c < N; c++)\n                    for (int d = 0; d < N; d++)\n                        m(a, b, c, d);\n\n        [SkipLocalsInit]\n        static string m(int a, int b, int c, int d) => string.Create(_invariantCulture, stackalloc char[InitialBufferSize], $\"{a}.{b}.{c}.{d}\");\n    }\n\n    [Benchmark]\n    [SkipLocalsInit]\n    public void InitialSingleBufferInvariantCulture()\n    {\n        Span<char> buffer = stackalloc char[InitialBufferSize];\n\n        for (int a = 0; a < N; a++)\n            for (int b = 0; b < N; b++)\n                for (int c = 0; c < N; c++)\n                    for (int d = 0; d < N; d++)\n                        m(a, b, c, d, buffer);\n\n        static string m(int a, int b, int c, int d, Span<char> buffer) => string.Create(_invariantCulture, buffer, $\"{a}.{b}.{c}.{d}\");\n    }\n}"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/BoolReturn/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CS8321.severity = silent\ndotnet_diagnostic.CA1050.severity = silent\ndotnet_diagnostic.CA1822.severity = silent\ndotnet_diagnostic.IDE0060.severity = silent\ndotnet_diagnostic.IDE0062.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/BoolReturn/BoolReturn.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/BoolReturn/Program.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nConsole.WriteLine(m(0x12345678, 0xABCD, 123, 1));\n\nDummyHandler m(int a, int b, int c, int d) => $\"{a}.{b}.{c}.{d}\";\n\n// m の展開結果\nDummyHandler m1(int a, int b, int c, int d)\n{\n    DummyHandler h = new DummyHandler(3, 4, out var result);\n    if (result\n        && h.AppendFormatted(a)\n        && h.AppendLiteral(\".\")\n        && h.AppendFormatted(b)\n        && h.AppendLiteral(\".\")\n        && h.AppendFormatted(c)\n        && h.AppendLiteral(\".\"))\n        h.AppendFormatted(d);\n    return h;\n}\n\n[InterpolatedStringHandler]\npublic struct DummyHandler\n{\n    public DummyHandler(int literalLength, int formattedCount, out bool result) => result = true;\n    public bool AppendLiteral(string s) => true;\n    public bool AppendFormatted<T>(T x) => true;\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/ConstString/ConstString.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/ConstString/Program.cs",
    "content": "﻿// {} 内に文字列以外の const を指定できない理由の1つが、ToString のカルチャー依存:\n\nusing System.Globalization;\n\n// 東南アジアの多くの国は . を小数点に使う。\nThread.CurrentThread.CurrentCulture = new CultureInfo(\"ja-jp\");\nConsole.WriteLine(1.234);\n\n// 大陸ヨーロッパの多くの国は , を小数点に使う。\nThread.CurrentThread.CurrentCulture = new CultureInfo(\"fr-fr\");\nConsole.WriteLine(1.234);\n\nclass Valid\n{\n    const string A = \"Abc\";\n    const string B = \"Xyz\";\n    public const string C = $\"{nameof(A)}: {A}, {nameof(B)}: {B}\"; // \"A: Abc, B: Xyz\"\n}\n\n#if Error\nclass Invalid\n{\n    const int A = 1;\n    const string C = $\"{A}\"; // A が文字列じゃないので $\"\" の結果を const にできない。}\n}\n#endif\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/DefaultInterpolatedStringHandler/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CA1050.severity = silent\ndotnet_diagnostic.CA1822.severity = silent\ndotnet_diagnostic.IDE0060.severity = silent\ndotnet_diagnostic.IDE0062.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/DefaultInterpolatedStringHandler/DefaultInterpolatedStringHandler.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/DefaultInterpolatedStringHandler/Program.cs",
    "content": "﻿Console.WriteLine(m(1, 2));\nConsole.WriteLine(m1(1, 2));\nConsole.WriteLine(await m2(Task.Delay(1).ContinueWith(_ => 1)));\n\nstring m(int a, int b) => $\"{a} / {b}\";\n\n// m の展開結果\nstring m1(int a, int b)\n{\n    System.Runtime.CompilerServices.DefaultInterpolatedStringHandler h = new(3, 2);\n    h.AppendFormatted(a);\n    h.AppendLiteral(\" / \");\n    h.AppendFormatted(b);\n    return h.ToStringAndClear();\n}\n\n// DefaultInterpolatedStringHandler に展開できない例 (await と併用が無理)\nasync Task<string> m2(Task<int> a) => $\"result: {await a}\";\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/FormattingHandler/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CS8321.severity = silent\ndotnet_diagnostic.CA1050.severity = silent\ndotnet_diagnostic.CA1822.severity = silent\ndotnet_diagnostic.IDE0060.severity = silent\ndotnet_diagnostic.IDE0062.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/FormattingHandler/FormattingHandler.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/FormattingHandler/Program.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nConsole.WriteLine(m(0x123456, 0xABC, 12));\nConsole.WriteLine(m1(0x123456, 0xABC, 12));\n\nstring m(int a, int b, int c) => $\"({a, 8:X}) ({b:X}) ({c,4})\";\n\n// m の展開結果\nstring m1(int a, int b, int c)\n{\n    DefaultInterpolatedStringHandler h = new(8, 3);\n    h.AppendLiteral(\"(\");\n    h.AppendFormatted(a, 8, \"X\");\n    h.AppendLiteral(\") (\");\n    h.AppendFormatted(b, \"X\");\n    h.AppendLiteral(\") (\");\n    h.AppendFormatted(c, 4);\n    h.AppendLiteral(\")\");\n    return h.ToStringAndClear();\n}\n\nDummyHandler m2(int a, int b, int c, int d) => $\"({a,8:X}) ({b:X}) ({c,4}) ({d})\";\n\n[InterpolatedStringHandler]\npublic struct DummyHandler\n{\n    public DummyHandler(int literalLength, int formattedCount) { }\n    public void AppendLiteral(string s) { }\n\n    public void AppendFormatted<T>(T x) { }\n    public void AppendFormatted<T>(T x, int alignment) { }\n    public void AppendFormatted<T>(T x, string format) { }\n    public void AppendFormatted<T>(T x, int alignment, string format) { }\n\n    public void AppendFormatted<T>(T x, int? alignment = null, string? format = null) { }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/ImprovedInterpolatedStrings/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CA1050.severity = silent\ndotnet_diagnostic.CA1822.severity = silent\ndotnet_diagnostic.IDE0060.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/ImprovedInterpolatedStrings/ImprovedInterpolatedStrings.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/ImprovedInterpolatedStrings/Program.cs",
    "content": "﻿using System.Globalization;\n\nvar x = 1234;\nvar y = 1.234;\nvar z = new DateOnly(2001, 2, 3);\n\n// 既存の構文のまま、コンパイル結果が変わるみたい。\n// - DefaultInterpolatedStringHandler 型があるかどうかで分岐してそう\n//   - この場合、コンパイル結果は後述の DefaultInterpolatedStringHandler への代入 → ToStringAndClear と一緒。\n// - 再コンパイル必須(再コンパイルしないと string.Format 呼び出しのまま)\n// - ちなみに、CurrentCulture を参照\nstring s = $\"{x} / {y} / {z}\";\nConsole.WriteLine(s);\n\n// DefaultInterpolatedStringHandler などを始めとする\n// 所定のパターン (AppendLiteral, AppendFormatted メソッドを持ってる) を満たす型への代入すると、\n// AppendLiteral, AppendFormatted メソッド呼び出しに展開される。\nSystem.Runtime.CompilerServices.DefaultInterpolatedStringHandler h = $\"{x} / {y} / {z}\";\nConsole.WriteLine(h.ToStringAndClear());\n\n// 上記コードは以下のようなコードとほぼ一緒。\nh = new();\nh.AppendFormatted(x);\nh.AppendLiteral(\" / \");\nh.AppendFormatted(y);\nh.AppendLiteral(\" / \");\nh.AppendFormatted(z);\nConsole.WriteLine(h.ToStringAndClear());\n\n// ちなみに、 DefaultInterpolatedStringHandler は ArrayPool から配列を借り出してるので、\n// 最後に ToStringAndClear を呼ばないと Pool への変換処理が掛からなくてまずい。\n// この罠(マジでメモリリーク)があるので、DefaultInterpolatedStringHandler はあんまり直接触られたくはなさそう。\n// ほとんどの場合、string s = $\"\" で事足りるし、細かいカスタマイズも下記の string.Create でできるはず。\n\n// カルチャー指定。\n// string.Create(IFormatProvider, DefaultInterpolatedStringHandler) が呼ばれてる。\nvar culture = new CultureInfo(\"fr-fr\");\ns = string.Create(culture, $\"{x} / {y} / {z}\");\nConsole.WriteLine(s);\n\n// 初期バッファー渡す。\n// string.Create(IFormatProvider, Span<char>, DefaultInterpolatedStringHandler) が呼ばれてる。\n// 最速を目指すならその string.Create 多用することになるはず。\n// (InvariantCulture と CurrentCulture でもパフォーマンス変わるかも？)\nculture = CultureInfo.InvariantCulture;\ns = string.Create(culture, stackalloc char[512], $\"{x} / {y} / {z}\");\nConsole.WriteLine(s);\n\n// ↑の例で、IFormatProvider, Span<char> が DefaultInterpolatedStringHandler に渡すのに、\n// InterpolatedStringHandlerArgument 属性が使われてる。\n\n// DummyHandler の方が呼ばれる。\nC.M($\"{x} / {y} / {z}\");\n\n// これが string の方になるのはいいとして…\n// (M(string) がないとコンパイル エラー。)\nC.M(\"\");\n\n// この2つも string の方になる。\n// 評価結果が const string になっちゃう $\"\" はただの string 扱い。\n// (ただし、M(string) がないと M(DummyHandler) の方に行く。)\nC.M($\"\");\nC.M($\"{\"abc\"}\");\n\nclass C\n{\n    public static void M(string _) => Console.WriteLine(\"string\");\n    public static void M(DummyHandler _) => Console.WriteLine(\"DummyHandler\");\n}\n\n// これが $\"\" を受け取れる最低ラインのパターン。\n[System.Runtime.CompilerServices.InterpolatedStringHandler]\npublic struct DummyHandler\n{\n    public DummyHandler(int literalLength, int formattedCount) { }\n    // 追加で、任意の引数を足して、InterpolatedStringHandlerArgument 属性を介して受け取れる。\n    // あと、末尾に out bool 引数を足せば「以降の AppendLiteral/AppendFormatted は一切呼ばない」みたいな分岐もできる。\n\n    public void AppendLiteral(string s) { }\n    public void AppendFormatted<T>(T x, int alignment = 0, string? format = null) { }\n    // alignment, format 引数はなくてもいい。\n    // これらの引数がない場合、単に $\"{value: X, 4}\" みたいなのがコンパイル エラーになるだけ。\n    // 戻り値を bool にして、false を返すとそれ以降の Append は呼ばないみたいな分岐もできる。\n}"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/InterpolatedStringHandlerArgument/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CS8321.severity = silent\ndotnet_diagnostic.CA1050.severity = silent\ndotnet_diagnostic.CA1822.severity = silent\ndotnet_diagnostic.IDE0060.severity = silent\ndotnet_diagnostic.IDE0062.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/InterpolatedStringHandlerArgument/InterpolatedStringHandlerArgument.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/InterpolatedStringHandlerArgument/Program.cs",
    "content": "﻿using System.Globalization;\nusing System.Runtime.CompilerServices;\n\n// Format(DummyHandler) を呼んでて、\n// new DummyHandler(5, 2) が作られる。\nFormatter.Format($\"abc {1} {2}\");\n\n// Format(IFormatProvider, DummyHandler) を呼んでて、\n// new DummyHandler(5, 2, CultureInfo.InvariantCulture) が作られる。\nFormatter.Format(CultureInfo.InvariantCulture, $\"abc {1} {2}\");\n\n// Format(IFormatProvider, Span<char>, DummyHandler) を呼んでて、\n// new DummyHandler(5, 2, CultureInfo.InvariantCulture, stackalloc char[128]) が作られる。\nFormatter.Format(CultureInfo.InvariantCulture, stackalloc char[128], $\"abc {1} {2}\");\n\n[InterpolatedStringHandler]\npublic ref struct DummyHandler\n{\n    public int LiteralLength { get; }\n    public int FormattedCount { get; }\n    public IFormatProvider? Provider {  get; }\n    public Span<char> InitialBuffer { get; }\n\n    public DummyHandler(int literalLength, int formattedCount) : this(literalLength, formattedCount, null, default) { }\n\n    // 追加の引数持ち\n    public DummyHandler(int literalLength, int formattedCount, IFormatProvider? provider)\n        : this(literalLength, formattedCount, provider, default) { }\n\n    public DummyHandler(int literalLength, int formattedCount, IFormatProvider? provider, Span<char> initialBuffer)\n    {\n        LiteralLength = literalLength;\n        FormattedCount = formattedCount;\n        Provider = provider;\n        InitialBuffer = initialBuffer;\n    }\n\n    public void AppendLiteral(string s) { }\n    public void AppendFormatted<T>(T x) { }\n}\n\npublic class Formatter\n{\n    // 追加の引数なし。\n    public static void Format(DummyHandler handler)\n        => Console.WriteLine($@\"----\n{handler.LiteralLength}\n{handler.FormattedCount}\n{(handler.Provider as CultureInfo)?.DisplayName ?? \"(null)\"}\n{handler.InitialBuffer.Length}\n\");\n\n    // provider を追加。\n    public static void Format(\n        IFormatProvider provider,\n        [InterpolatedStringHandlerArgument(\"provider\")] DummyHandler handler)\n        => Format(handler); // 処理自体は追加引数なしのやつに丸投げ。\n\n    // provider と initialBuffer を追加。\n    public static void Format(\n        IFormatProvider provider, Span<char> initialBuffer,\n        [InterpolatedStringHandlerArgument(\"provider\", \"initialBuffer\")] DummyHandler handler)\n        => Format(handler); // 処理自体は追加引数なしのやつに丸投げ。\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/InvariantGlobalization/Invariant.cs",
    "content": "﻿using System.Globalization;\nusing System.Runtime.CompilerServices;\n\nnamespace InvariantGlobalization;\n\n/// <summary>\n/// Pass always <see cref=\"CultureInfo.InvariantCulture\"/> to <see cref=\"DefaultInterpolatedStringHandler\"/>.\n/// </summary>\npublic static class Invariant\n{\n    public static string Format(InterpolatedStringHandler handler) => handler.ToStringAndClear();\n    public static string Format(Span<char> initialBuffer, [InterpolatedStringHandlerArgument(\"initialBuffer\")] InterpolatedStringHandler handler) => handler.ToStringAndClear();\n\n    [InterpolatedStringHandler]\n    public ref struct InterpolatedStringHandler\n    {\n        private DefaultInterpolatedStringHandler _inner;\n\n        public InterpolatedStringHandler(int literalLength, int formattedCount) => _inner = new(literalLength, formattedCount, CultureInfo.InvariantCulture);\n        public InterpolatedStringHandler(int literalLength, int formattedCount, Span<char> initialBuffer) => _inner = new(literalLength, formattedCount, CultureInfo.InvariantCulture, initialBuffer);\n\n        public void AppendLiteral(string value) => _inner.AppendLiteral(value);\n        public void AppendFormatted(ReadOnlySpan<char> value) => _inner.AppendFormatted(value);\n        public void AppendFormatted(ReadOnlySpan<char> value, int alignment = 0, string? format = null) => _inner.AppendFormatted(value, alignment, format);\n        public void AppendFormatted<T>(T value) => _inner.AppendFormatted(value);\n        public void AppendFormatted<T>(T value, string? format) => _inner.AppendFormatted(value, format);\n        public void AppendFormatted<T>(T value, int alignment) => _inner.AppendFormatted(value, alignment);\n        public void AppendFormatted<T>(T value, int alignment, string? format) => _inner.AppendFormatted(value, alignment, format);\n        public void AppendFormatted(object? value, int alignment = 0, string? format = null) => _inner.AppendFormatted(value, alignment, format);\n        public void AppendFormatted(string? value) => _inner.AppendFormatted(value);\n        public void AppendFormatted(string? value, int alignment = 0, string? format = null) => _inner.AppendFormatted(value, alignment, format);\n        public string ToStringAndClear() => _inner.ToStringAndClear();\n    }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/InvariantGlobalization/InvariantGlobalization.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/InvariantGlobalization/Iso8601.cs",
    "content": "﻿using System.Globalization;\nusing System.Runtime.CompilerServices;\n\nnamespace InvariantGlobalization;\n\n/// <summary>\n/// In addition to <see cref=\"Invariant\"/>, use ISO 8601 date format.\n/// </summary>\n/// <remarks>\n/// <see cref=\"CultureInfo.InvariantCulture\"/> uses USA format which is very unique.\n///\n/// see:\n/// <a href=\"https://en.wikipedia.org/wiki/Calendar_date#Usage_map\">Calendar date: Usage map</a>,\n/// <a href=\"https://www.quora.com/Why-do-some-English-speakers-format-their-dates-as-M-D-Y-while-most-of-the-world-uses-either-D-M-Y-or-Y-M-D\">Why do some English speakers format their dates as M/D/Y?</a>\n/// </remarks>\npublic static class Iso8601\n{\n    public static string Format(InterpolatedStringHandler handler) => handler.ToStringAndClear();\n    public static string Format(Span<char> initialBuffer, [InterpolatedStringHandlerArgument(\"initialBuffer\")] InterpolatedStringHandler handler) => handler.ToStringAndClear();\n\n    [InterpolatedStringHandler]\n    public ref struct InterpolatedStringHandler\n    {\n        private DefaultInterpolatedStringHandler _inner;\n\n        public InterpolatedStringHandler(int literalLength, int formattedCount) => _inner = new(literalLength, formattedCount, CultureInfo.InvariantCulture);\n        public InterpolatedStringHandler(int literalLength, int formattedCount, Span<char> initialBuffer) => _inner = new(literalLength, formattedCount, CultureInfo.InvariantCulture, initialBuffer);\n\n        public void AppendLiteral(string value) => _inner.AppendLiteral(value);\n        public void AppendFormatted(ReadOnlySpan<char> value) => _inner.AppendFormatted(value);\n        public void AppendFormatted(ReadOnlySpan<char> value, int alignment = 0, string? format = null) => _inner.AppendFormatted(value, alignment, format);\n        public void AppendFormatted<T>(T value) => _inner.AppendFormatted(value);\n        public void AppendFormatted<T>(T value, string? format) => _inner.AppendFormatted(value, format);\n        public void AppendFormatted<T>(T value, int alignment) => _inner.AppendFormatted(value, alignment);\n        public void AppendFormatted<T>(T value, int alignment, string? format) => _inner.AppendFormatted(value, alignment, format);\n        public void AppendFormatted(object? value, int alignment = 0, string? format = null) => _inner.AppendFormatted(value, alignment, format);\n        public void AppendFormatted(string? value) => _inner.AppendFormatted(value);\n        public void AppendFormatted(string? value, int alignment = 0, string? format = null) => _inner.AppendFormatted(value, alignment, format);\n\n        public void AppendFormatted(TimeOnly value) => _inner.AppendFormatted(value, \"O\");\n        public void AppendFormatted(TimeOnly value, string? format) => _inner.AppendFormatted(value, format ?? \"O\");\n        public void AppendFormatted(TimeOnly value, int alignment) => _inner.AppendFormatted(value, alignment, \"O\");\n        public void AppendFormatted(TimeOnly value, int alignment, string? format) => _inner.AppendFormatted(value, alignment, format ?? \"O\");\n\n        public void AppendFormatted(DateOnly value) => _inner.AppendFormatted(value, \"O\");\n        public void AppendFormatted(DateOnly value, string? format) => _inner.AppendFormatted(value, format ?? \"O\");\n        public void AppendFormatted(DateOnly value, int alignment) => _inner.AppendFormatted(value, alignment, \"O\");\n        public void AppendFormatted(DateOnly value, int alignment, string? format) => _inner.AppendFormatted(value, alignment, format ?? \"O\");\n\n        public void AppendFormatted(DateTime value) => _inner.AppendFormatted(value, \"O\");\n        public void AppendFormatted(DateTime value, string? format) => _inner.AppendFormatted(value, format ?? \"O\");\n        public void AppendFormatted(DateTime value, int alignment) => _inner.AppendFormatted(value, alignment, \"O\");\n        public void AppendFormatted(DateTime value, int alignment, string? format) => _inner.AppendFormatted(value, alignment, format ?? \"O\");\n\n        public void AppendFormatted(DateTimeOffset value) => _inner.AppendFormatted(value, \"O\");\n        public void AppendFormatted(DateTimeOffset value, string? format) => _inner.AppendFormatted(value, format ?? \"O\");\n        public void AppendFormatted(DateTimeOffset value, int alignment) => _inner.AppendFormatted(value, alignment, \"O\");\n        public void AppendFormatted(DateTimeOffset value, int alignment, string? format) => _inner.AppendFormatted(value, alignment, format ?? \"O\");\n\n        public string ToStringAndClear() => _inner.ToStringAndClear();\n    }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/InvariantGlobalization/Program.cs",
    "content": "﻿using InvariantGlobalization;\nusing System.Globalization;\n\n// CurrentCulture をあえてフランスに。\n// 大陸ヨーロッパは小数点が , な事が多く。\nThread.CurrentThread.CurrentCulture = new CultureInfo(\"fr-fr\");\n\n// 12,345 になるわ、\n// dd/MM/yyyy になるわ。\nConsole.WriteLine($@\"{12.345}\n{DateTimeOffset.Now}\n{new DateOnly(2000, 1, 2)}\n{new TimeOnly(11, 5, 30)}\n\");\n\n// というか、CurrentCulture 取得はそれなりにコスト(ThreadStatic アクセスあり)かかるし、\n// そもそも実行環境によって Format/Parse 結果が違うのが怖い。\n// なので InvariantCulture にすると…\n// 北米フォーマットになる。\n// (IT 分野あるあるの「デフォルトは北米」。)\n//\n// MM/dd/yyyy とかちょっと…\n// (英語圏でも Why do Americans? とか言われてるし、他のアメリカ大陸国からは It's only USA って言われてる。\n// 元々英語の語順は変だし、イギリスも古くは MM/dd/yyyy だったけど周辺国の影響で更生されてそう。\n// 元植民地が宗主国よりも変化に対して保守的になるのは結構あるあるらしい。)\nConsole.WriteLine(string.Create(CultureInfo.InvariantCulture, $@\"{12.345}\n{DateTimeOffset.Now}\n{new DateOnly(2000, 1, 2)}\n{new TimeOnly(11, 5, 30)}\n\"));\n\n// まあとりあえず、常時 InvariantCulture を指定するオーバーロードを作る。\nConsole.WriteLine(Invariant.Format($@\"{12.345}\n{DateTimeOffset.Now}\n{new DateOnly(2000, 1, 2)}\n{new TimeOnly(11, 5, 30)}\n\"));\n\n// で、さらに、日付フォーマットのデフォルトを O (ISO 8601 準拠)に変更。\n// yyyy-MM-ddThh:mm:ss.fffffffK 相当。\nConsole.WriteLine(Iso8601.Format($@\"{12.345}\n{DateTimeOffset.Now}\n{new DateOnly(2000, 1, 2)}\n{new TimeOnly(11, 5, 30)}\n\"));\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/MinimalHandler/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CA1050.severity = silent\ndotnet_diagnostic.CA1822.severity = silent\ndotnet_diagnostic.IDE0060.severity = silent\ndotnet_diagnostic.IDE0062.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/MinimalHandler/MinimalHandler.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/MinimalHandler/Program.cs",
    "content": "﻿m(1, 2);\nm1(1, 2);\n\nvoid m(int a, int b)\n{\n    DummyHandler h = $\"{a} / {b}\";\n}\n\n// m の展開結果\nvoid m1(int a, int b)\n{\n    DummyHandler temp = new(3, 2);\n    temp.AppendFormatted(a);\n    temp.AppendLiteral(\" / \");\n    temp.AppendFormatted(b);\n    DummyHandler h = temp;\n}\n\n[System.Runtime.CompilerServices.InterpolatedStringHandler]\npublic struct DummyHandler\n{\n    public DummyHandler(int literalLength, int formattedCount) { }\n    public void AppendLiteral(string s) { }\n    public void AppendFormatted<T>(T x) { }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/OverloadResolution/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CS8321.severity = silent\ndotnet_diagnostic.CA1050.severity = silent\ndotnet_diagnostic.CA1822.severity = silent\ndotnet_diagnostic.IDE0060.severity = silent\ndotnet_diagnostic.IDE0062.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/OverloadResolution/C1.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nnamespace OverloadResolution;\n\ninternal class C1\n{\n    public static void Caller()\n    {\n        // ハンドラー型最優先。\n        M($\"{1}\"); // handler\n\n        // ただの文字列の場合は string に行く。\n        M(\"abc\"); // string\n\n        // ちょっと混乱しそうなのが、const になる場合に限り、 $ がついてても string 行き。\n        M($\"\"); // string\n        M($\"abc {\"abc\"} abc\"); // string\n\n        // もちろん、キャストしてしまえば任意に呼び分け可能。\n        M($\"{1}\"); // handler\n        M((string)$\"{1}\"); // string\n        M((IFormattable)$\"{1}\"); // formattable\n    }\n\n    // この状態だとハンドラー型優先。\n    // DefaultInterpolatedStringHandler だけ特別とかはなく、ハンドラー パターンを満たす型は一律この優先順位。\n    public static void M(DefaultInterpolatedStringHandler _) => Console.WriteLine(\"handler\");\n    public static void M(string _) => Console.WriteLine(\"string\");\n    public static void M(IFormattable _) => Console.WriteLine(\"formattable\");\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/OverloadResolution/C2.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nnamespace OverloadResolution;\n\ninternal class C2\n{\n    public static void Caller()\n    {\n        // 優先度は付かないので不明瞭エラーを起こす。\n#if ERROR\n        M($\"\");\n#endif\n\n        // 明示的にキャストすれば呼び分け可能。\n        M((Handler1)$\"\");\n        M((Handler2)$\"\");\n    }\n\n    public static void M(Handler1 _) => Console.WriteLine(\"Handler1\");\n    public static void M(Handler2 _) => Console.WriteLine(\"Handler2\");\n}\n\n[InterpolatedStringHandler]\npublic struct Handler1\n{\n    public Handler1(int literalLength, int formattedCount) { }\n    public void AppendLiteral(string s) { }\n    public void AppendFormatted<T>(T x) { }\n}\n\n[InterpolatedStringHandler]\npublic struct Handler2\n{\n    public Handler2(int literalLength, int formattedCount) { }\n    public void AppendLiteral(string s) { }\n    public void AppendFormatted<T>(T x) { }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/OverloadResolution/OverloadResolution.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/OverloadResolution/Program.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\n// 普通(?)\n// (C# にしては珍しいけど、「InterpolatedStringHandler は string より優先する」という仕様にした。)\n// (IFormattable の時の反省。)\n\nnew Instance().M(\"\"); // string\nnew Instance().M($\"{1}\"); // handler\n\nnew StringIsExtension().M(\"\"); // string\nnew StringIsExtension().M($\"{1}\"); // handler\n\nnew BothExtension().M(\"\"); // string\nnew BothExtension().M($\"{1}\"); // handler\n\nnew DerivedFromBaseString().M(\"\"); // string\nnew DerivedFromBaseString().M($\"{1}\"); // handler\n\n// 特殊。\n// (InterpolatedStringHandler を優先できない状況。)\n\n// インスタンスメソッドを優先。\nnew HandlerIsExtension().M(\"\"); // string\nnew HandlerIsExtension().M($\"{1}\"); // string これは特殊\n\n// 派生クラスのメソッドを優先。\nnew DerivedFromBaseHandler().M(\"\"); // string\nnew DerivedFromBaseHandler().M($\"{1}\"); // string これは特殊\n\nclass Instance\n{\n    public void M(string _) => Console.WriteLine(\"string\");\n    public void M(DefaultInterpolatedStringHandler _) => Console.WriteLine(\"handler\");\n}\n\nclass HandlerIsExtension\n{\n    // 特殊。拡張メソッドの M(DefaultInterpolatedStringHandler _) より優先。\n    public void M(string _) => Console.WriteLine(\"string\");\n}\n\nclass StringIsExtension\n{\n    public void M(DefaultInterpolatedStringHandler _) => Console.WriteLine(\"handler\");\n}\n\nclass BothExtension { }\n\nclass BaseString\n{\n    public void M(string _) => Console.WriteLine(\"string\");\n}\nclass DerivedFromBaseString : BaseString\n{\n    public void M(DefaultInterpolatedStringHandler _) => Console.WriteLine(\"handler\");\n}\n\nclass BaseHandler\n{\n    public void M(DefaultInterpolatedStringHandler _) => Console.WriteLine(\"handler\");\n}\nclass DerivedFromBaseHandler : BaseHandler\n{\n    // 特殊。基底クラスの M(DefaultInterpolatedStringHandler _) より優先。\n    public void M(string _) => Console.WriteLine(\"string\");\n}\n\nstatic class Extensions\n{\n    public static void M(this HandlerIsExtension _, DefaultInterpolatedStringHandler _1) => Console.WriteLine(\"handler\");\n    public static void M(this StringIsExtension _, string _1) => Console.WriteLine(\"string\");\n    public static void M(this BothExtension _, DefaultInterpolatedStringHandler _1) => Console.WriteLine(\"handler\");\n    public static void M(this BothExtension _, string _1) => Console.WriteLine(\"string\");\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/ParamsDictionary/ParamsDictionary.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/InterpolatedStrings/ParamsDictionary/Program.cs",
    "content": "﻿// InterpolatedStringHandler の悪用気味コード。\n\nusing System.Runtime.CompilerServices;\n\nvar a = 1;\nvar b = false;\nvar c = 1.2;\nvar d = \"abc\";\n\n// これで\n// a: 1\n// b: False\n// c: 1.2\n// d: abc\n// になる。\n// 濫用気味なトリックとして params Dictionary<string, T> 代わりにも使えたり。\n// (ORM の類でなら実用できるかも。)\nwrite<object>($\"{a}{b}{c}{d}\");\n\n// リテラル直渡ししたときが微妙な挙動だけども…\n// 1: 1\n// 2: 2\n// a: 1\nwrite<int>($\"{1}{2}{a}\");\n\nstatic void write<TValue>(ParamsDictionaryHandler<TValue> handler)\n{\n    var dic = handler.Dictionary;\n    foreach (var (key, value) in dic)\n    {\n        Console.WriteLine($\"{key}: {value}\");\n    }\n}\n\n[InterpolatedStringHandler]\npublic struct ParamsDictionaryHandler<T>\n{\n    internal readonly Dictionary<string, T> Dictionary;\n    public ParamsDictionaryHandler(int _, int formattedCount) => Dictionary = new(formattedCount);\n    public void AppendFormatted(T value, [CallerArgumentExpression(\"value\")] string? ex = null)\n    {\n        if (ex is null) return;\n        Dictionary[ex] = value;\n    }\n}"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/AttributeAndReturn/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CA1018.severity = silent\ndotnet_diagnostic.IDE0059.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/AttributeAndReturn/AttributeAndReturn.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/AttributeAndReturn/Program.cs",
    "content": "﻿Func<int, int, int> f =\n    [A]\n    int (int x, int y)\n    => x + y;\n\nclass AAttribute : Attribute { }\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/AttributeWeb/AttributeWeb.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/AttributeWeb/Program.cs",
    "content": "using Microsoft.AspNetCore.Mvc;\n\nvar builder = WebApplication.CreateBuilder(args);\n\n// ev1sǉBDI pB\nbuilder.Services.AddSingleton<Counter>();\n\nvar app = builder.Build();\n\n// ev1sB DI Ŏ󂯎ANG񂩂󂯎B\n// counter: y[W[h邽т +1B\n// value: NGŐlwB\n// 2̒l牽炩̌vZĕԂB\napp.MapGet(\"/\", ([FromServices] Counter counter, [FromQuery] int? value) => counter.Count * (value ?? 1));\n\napp.Run();\n\n// ev1NXǉBL DI œnfp̌^B\nclass Counter\n{\n    private int _count;\n    public int Count { get => _count++; }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/AttributeWeb/Properties/launchSettings.json",
    "content": "﻿{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:37572\",\n      \"sslPort\": 44344\n    }\n  },\n  \"profiles\": {\n    \"AttributeWeb\": {\n      \"commandName\": \"Project\",\n      \"dotnetRunMessages\": true,\n      \"launchBrowser\": true,\n      \"applicationUrl\": \"https://localhost:7238;http://localhost:5031\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/AttributeWeb/appsettings.Development.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/AttributeWeb/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/NaturalType/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CS8974.severity = silent\ndotnet_diagnostic.IDE0062.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/NaturalType/NaturalType.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/NaturalType/Program.cs",
    "content": "﻿// C# 9.0 までは\n// Func<string, int> f = m;\n// みたいに書かないとダメだった(ターゲット型推論)。\nvar f = m;\nDelegate d = m;\nMulticastDelegate md = m;\n\n// Delegate は ICloneable を実装しているので一応これも OK。\n// (ただし、ICloneable インターフェイス自体今どき使わない。)\nICloneable c = m;\n\n// これも一応できるけど、そんなに使い道がないというかたまにミスの原因になるので警告。\n// object obj = m(); の () 付け忘れをたまにやるので…\nobject obj = m;\n\nint m(string s) => s.Length;\n\n// System.Action とかになるやつ:\nvar a1 = (int a) => { };\nvar a4 = (int a, int b, int c, int d) => { };\nvar a16 = (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, int n, int o, int p) => { };\nvar f1 = (int a) => a.ToString();\nvar f4 = (int a, int b, int c, int d) => $\"{a}.{b}.{c}.{d}\";\n\n// コンパイラー生成の独自デリゲートになるやつ:\n// ref 系\nvar i1 = (in int a) => { };\nvar r1 = (ref int a) => { };\nvar o1 = (out int a) => a = 0;\n// 引数の数オーバー\nvar a17 = (int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l, int m, int n, int o, int p, int q) => { };\n\n#if ERROR\n// Func<int, bool> になる。\nvar a = (int x) => true;\n\n// 左辺に型を明示してあると Action/Func 以外の型になる。\nPredicate<int> p = (int x) => true;\n\n// p に直接 (int x) => true を代入するのは行けるのに、\n// var 変数宣言を挟むとダメ。\n// (Func<int, bool> から Predicate<int> への変換が許されていない。)\np = a;\n#endif\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/SimpleReturn/Program.cs",
    "content": "﻿// 新文法。\n// ラムダ式に戻り値の型を明示。\n// (引数も明示。)\nFunc<int, int> f1 = int (int x) => x;\n\n// 元々の文法。\n// 引数の型の方を明示。\nvar f2 = (int x) => x;\n\n// 新文法。\n// 戻り値の型だけ明示。 () が必要。\nFunc<int, int> f3 = int (x) => x;\n\n// これはエラーになる。\n// int が引数に掛かっているのか戻り値に掛かっているのか不明瞭。\n#if ERROR\nFunc<int, int> f4 = int x => x;\n#endif\n\n// 戻り値の型を各場所は static の後ろ。\nvar f5 = static int (int x) => x;\n\n// 戻り値の型から引数の型の推論はできない。\n// 結果的に、Func<T, int> への代入はできても、自然な型決定(var などへの代入)はできない。\n#if ERROR\nvar f6 = int (x) => x;\n#endif\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/SimpleReturn/SimpleReturn.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/SimpleWeb/Program.cs",
    "content": "var builder = WebApplication.CreateBuilder(args);\nvar app = builder.Build();\n\napp.MapGet(\"/\", () => \"Hello World!\");\n\napp.Run();\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/SimpleWeb/Properties/launchSettings.json",
    "content": "﻿{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:54507\",\n      \"sslPort\": 44385\n    }\n  },\n  \"profiles\": {\n    \"SimpleWeb\": {\n      \"commandName\": \"Project\",\n      \"dotnetRunMessages\": true,\n      \"launchBrowser\": true,\n      \"applicationUrl\": \"https://localhost:7162;http://localhost:5270\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/SimpleWeb/SimpleWeb.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/SimpleWeb/appsettings.Development.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/SimpleWeb/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/TargetTypedReturn/Program.cs",
    "content": "﻿// 引数の int から、戻り値の型が int に決定する。\n// その後、ラムダ式の型は Func<int, int> として決定できる。\nvar f = (int x) => x;\n\n// 条件演算子だけでは int と null の共通型が決定できなくて、戻り値の型が決まらない。\n// (条件演算子の後方互換性のために掛かってる制限。)\n#if ERROR\nvar f1 = (bool x, int y) => x ? y : null;\n#endif\n\n// 一方で、これなら、戻り値の型からのターゲット型推論で条件演算子を書ける。\n// f2 の自然な型決定もできるようになる (Func<bool, int, int?> になる)。\nvar f2 = int? (bool x, int y) => x ? y : null;\n"
  },
  {
    "path": "Demo/2021/Csharp10/Lambda/TargetTypedReturn/TargetTypedReturn.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/Others/ExtendedPropertyPetterns/ExtendedPropertyPetterns.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/Others/ExtendedPropertyPetterns/Program.cs",
    "content": "﻿m(null);\nm(new X { Name = \"\" });\nm(new X { Name = \"a\" });\nm(new X { Name = \"abc\" });\n\nstatic void m(X? x)\n{\n    if (x is { Name.Length: 1 })\n    {\n        Console.WriteLine(\"single-char Name\");\n    }\n\n#if false\n    // これと同じ意味。\n    if (x is { Name: { Length: 1 } })\n    {\n        Console.WriteLine(\"single-char Name\");\n    }\n#endif\n\n    // さらに言うとこれとほぼ同じ意味。\n    if (x is not null)\n    {\n        var name = x.Name;\n        if (name is not null)\n        {\n            var length = name.Length;\n            if (length == 1)\n            {\n                Console.WriteLine(\"single-char Name\");\n            }\n        }\n    }\n}\n\nclass X\n{\n    public string? Name { get; set; }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/Others/MixedDeconstruction/MixedDeconstruction.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/Others/MixedDeconstruction/Program.cs",
    "content": "﻿int x;\n(x, var u) = (1, 2);\n\nConsole.WriteLine(x);\nConsole.WriteLine(u);\n\n#if ERROR\nvoid m()\n{\n    // 式の途中に分解宣言 (var 付きの宣言) が来るのは C# 10.0 でもダメ。\n    int x, y;\n    (x, var u) = (var v, y) = (1, 2);\n}\n#endif\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/ActivatorBug/ActivatorBug.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFrameworks>net6.0;net48</TargetFrameworks>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/ActivatorBug/Program.cs",
    "content": "﻿// このコード、 .NET Core で実行すると全部1が表示されるけど、\n// .NET Framework で実行すると1つだけ1、2つ目以降は0が表示される。\n// net48 (一応最新の .NET Framework) ですらバグ挙動。\n\nusing System;\n\nConsole.WriteLine(Activator.CreateInstance<T>().Value);\nConsole.WriteLine(Activator.CreateInstance<T>().Value);\nConsole.WriteLine(New<T>().Value);\nConsole.WriteLine(New<T>().Value);\n\nstatic T New<T>() where T : new() => new();\n\nstruct T\n{\n    public int Value;\n    public T() => Value = 1;\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/CreateInstanceBenchmark/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CA1050.severity = silent\ndotnet_diagnostic.CA1822.severity = silent\ndotnet_diagnostic.IDE0060.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/CreateInstanceBenchmark/CreateInstanceBenchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <LangVersion>preview</LangVersion>\n    <EnablePreviewFeatures>True</EnablePreviewFeatures>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.13.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/CreateInstanceBenchmark/Program.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\n\n#if DEBUG\n\nvar b = new GenericNewBenchmark();\nConsole.WriteLine(b.NonGenericNew());\nConsole.WriteLine(b.GenericNew());\nConsole.WriteLine(b.CreateInstance());\nConsole.WriteLine(b.StaticAbstractNew());\n\n#else\n\nusing BenchmarkDotNet.Running;\n\nBenchmarkRunner.Run<GenericNewBenchmark>();\n\n#endif\n\n/// <summary>\n/// new() をジェネリックにやろうとするとどの程度遅くなるかを計測。\n/// </summary>\n/// <remarks>\n/// 以下のようなテンプレコードで計測。\n///\n/// <code><![CDATA[\n/// var sum = 0;\n/// for (int i = 0; i < N; i++) sum += /* この分を差し替えて計測 */.Value;\n/// return sum;\n/// ]]></code>\n/// </remarks>\n[MemoryDiagnoser]\npublic class GenericNewBenchmark\n{\n    private const int N = 10000;\n    private static T New<T>() where T : new() => new();\n    private static T StaticAbstractNew<T>() where T : INew<T> => T.New();\n\n    // 速い。というかインライン展開されて完全に消えてそうなベンチマーク結果。\n    [Benchmark]\n    public int NonGenericNew()\n    {\n        var sum = 0;\n        for (int i = 0; i < N; i++) sum += new S().Value;\n        return sum;\n    }\n\n    // 急に遅くなる。static abstract が速くできてこれが遅い理由もないんでそのうち最適化はされるかも…\n    [Benchmark]\n    public int GenericNew()\n    {\n        var sum = 0;\n        for (int i = 0; i < N; i++) sum += New<S>().Value;\n        return sum;\n    }\n\n    // 一番遅いけども、 New<S>() とそこまで差がない。\n    // where T : new() => new() は結局 Activator.CreateInstance と同じ処理をしてるらしい。\n    [Benchmark]\n    public int CreateInstance()\n    {\n        var sum = 0;\n        for (int i = 0; i < N; i++) sum += Activator.CreateInstance<S>().Value;\n        return sum;\n    }\n\n    // Preview 機能を使えば…\n    // 速い。 new() と同様インライン展開されて消えてそう。\n    [Benchmark]\n    public int StaticAbstractNew()\n    {\n        var sum = 0;\n        for (int i = 0; i < N; i++) sum += StaticAbstractNew<S>().Value;\n        return sum;\n    }\n}\n\npublic struct S : INew<S>\n{\n    public int Value;\n    public S() => Value = 1;\n\n    public static S New() => new();\n}\n\n// (C# 10 時点では Preview 必須)\npublic interface INew<T>\n{\n    public static abstract T New();\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/DefaultParameter/DefaultParameter.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/DefaultParameter/Program.cs",
    "content": "﻿Console.WriteLine(new Ctor());\n\n#if Error\nvoid m(\n    NoCtor n1 = new(),\n    NoCtor n2 = default,\n    Ctor c1 = new(), // この行だけコンパイル エラー\n    Ctor c2 = default\n    )\n{ }\n#endif\n\nstruct NoCtor { }\nstruct Ctor { public Ctor() { } }\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/FieldInitializer/FieldInitializer.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/FieldInitializer/Program.cs",
    "content": "﻿var f = new FieldInitializer();\nConsole.WriteLine(f.X); // 1\nConsole.WriteLine(f.Y); // 2\n\n// これまではフィールド初期化子も書けなかった。\n// (フィールド初期化子には暗黙的に引数なしコンストラクターが必要だった。)\nstruct FieldInitializer\n{\n    public int X = 1;\n    public int Y = 2;\n}\n\n#if false\n\n// 初期化子を持つなら全部のメンバーに初期化子を持たせないと警告が出る。\nstruct BadFieldInitializer\n{\n    public int X = 1;\n    public int Y; // 警告だけなんだ…\n}\n\n// 参考・比較: コンストラクター内で未初期化フィールドがあるとコンパイルエラー。\nstruct NotFullyAssigned\n{\n    public int X;\n    public int Y;\n\n    public NotFullyAssigned()\n    {\n        X = 1;\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/GenericNew/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CS0649.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/GenericNew/GenericNew.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/GenericNew/Program.cs",
    "content": "﻿static T New<T>() where T : new() => new();\n\nConsole.WriteLine(New<Class>().X); // 0\nConsole.WriteLine(New<A>().X); // 0\nConsole.WriteLine(New<B>().X); // 1\n\n// クラスの場合、何も書かないとき、暗黙的に引数なしコンストラクターが作られてる。\nclass Class\n{\n    public int X;\n}\n\n// 構造体の場合、何も書かないとき、「コンストラクターはない」という扱い。\n// new T() は default(T) (0 初期化)と同じ意味。\nstruct A\n{\n    public int X;\n}\n\n// C# 10.0 で引数なしコンストラクターを書けるようになって…\n// new T() と書くと引数なしコンストラクターが呼ばれる。\nstruct B\n{\n    public int X;\n    public B() => X = 1;\n}\n\nclass StructConstraint\n{\n    // struct 制約は暗黙的に new() 制約を含む。\n    // 昔は new T() と default(T) が同じ意味だったけど、今は違う意味になる。\n    static T New<T>() where T : struct => new(); // 引数なしコンストラクターがあればそれが呼ばれる。\n    static T Default<T>() where T : struct => default; // 常に 0 初期化。\n\n    public static void M()\n    {\n        Console.WriteLine(New<A>().X); // 0\n        Console.WriteLine(New<B>().X); // 1\n        Console.WriteLine(Default<A>().X); // 0\n        Console.WriteLine(Default<B>().X); // 0\n    }\n\n    struct A\n    {\n        public int X;\n    }\n\n    struct B\n    {\n        public int X;\n        public B() => X = 1;\n    }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/ImmutableArray/ImmutableArray.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/ImmutableArray/Program.cs",
    "content": "﻿// これまでだと _array?.Length ?? 0 みたいな分岐が必要だったものの、\n// 今なら「引数なしコンストラクターで非 null に初期化されてるはず」みたいな前提のコードが書けはする。\nvar a1 = new ImmutableArray<int>();\nConsole.WriteLine(a1.Length);\n\n// ただし…\n// default を使うといまだ「コンストラクターを呼ばずに 0 初期化」になるので、\na1 = default;\nConsole.WriteLine(a1.Length); // ここでぬるぽ。\n\n// 構造体に対する default は参照型に対する null と同程度に厄介者に。\n\nstruct ImmutableArray<T>\n{\n    private readonly T[] _array;\n\n    // 引数なしコンストラクターから : this(...) で別のコンストラクターを呼び出すことも可能。\n    // これで必ず _array = new T[length] されるかと言うと…\n    public ImmutableArray() : this(0) { }\n    public ImmutableArray(int length) => _array = new T[length];\n\n    public T this[int index] => _array[index];\n    public int Length => _array.Length;\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/NewOrDefault/NewOrDefault.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/NewOrDefault/Program.cs",
    "content": "﻿Console.WriteLine(new A().X); // コンストラクターが呼ばれて、X == 1 になってる。\nConsole.WriteLine(default(A).X); // コンストラクターも呼ばれず 0 初期化で、X == 0 になってる。\n\n// まだ default(A) は「明示的に default (債務不履行) してる」からいいものの…\n\n// 配列の要素は暗黙的に default…\nConsole.WriteLine((new A[1])[0].X); // default(A) と同じ扱いで、X == 0 になってる。\n\nA a = new();\nConsole.WriteLine(a.X); // 1\n\na = default;\nConsole.WriteLine(a.X); // 0\n\nConsole.WriteLine(New<A>().X); // 1\nConsole.WriteLine(Default<A>().X); // 0\n\nstatic T New<T>() where T : new() => new();\nstatic T? Default<T>() => default;\n\nstruct A\n{\n    public int X;\n    public A() => X = 1;\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/NonPublicConstructor/NonPublicConstructor.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/NonPublicConstructor/Program.cs",
    "content": "﻿namespace ParameterlessConstructors.NonPublicConstructor;\n\n#if false\n\n// 引数なしコンストラクターは public でないとダメ。\n// Activator.CreateInstance(typeof(A)) が new A() を返すのか default(A) を返すのかわからなくなるから避けたらしい。\nstruct A\n{\n    public int X;\n    private A() => X = 0; // エラー\n}\n\nstruct B\n{\n    public int X;\n    internal B() => X = 0; // エラー\n}\n\n#endif\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/RecordStruct/Program.cs",
    "content": "﻿// record (class) で以下のような書き方できるんだし、record struct でも書けるようにしたい。\n// そのためには引数なしコンストラクターが必要だった。\n\nrecord struct A();\n\nreadonly record struct B\n{\n    private static int _id;\n    private static int GetId() => Interlocked.Increment(ref _id);\n\n    public int Id { get; } = GetId();\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/RecordStruct/RecordStruct.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/Zeroed/.editorconfig",
    "content": "﻿[*.cs]\n\n# CA1822: Mark members as static\ndotnet_diagnostic.CS0649.severity = silent\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/Zeroed/Program.cs",
    "content": "﻿Console.WriteLine(new Zeroed1(1).Y);\nConsole.WriteLine(new Zeroed2(1).Y);\n\n// これは今までも書けた記法:\nstruct Zeroed1\n{\n    public int X;\n    public int Y; // 警告は出る。\n\n    public Zeroed1(int x) : this() // : this() を付けることで、「X も Y も 0 初期化」の意味があった。\n    {\n        X = x;\n        // Y は 0 になってる。\n    }\n}\n\n// C# 10.0 から:\nstruct Zeroed2\n{\n    public int X;\n    public int Y;\n\n    public Zeroed2(int x) : this() // この : this() は引数なしコンストラクター呼び出しの意味に。\n    {\n        X = x;\n        // Y は 2 になってる。\n    }\n\n    public Zeroed2()\n    {\n        X = 1;\n        Y = 2;\n    }\n}\n\n// C# 10.0 から:\nstruct Zeroed3\n{\n    public int X;\n    public int Y;\n\n    public Zeroed3(int x)\n    {\n        this = default; // これまでの : this() と一番近い挙動をするのはこれ。\n        X = x;\n        // Y は 0 になってる。\n    }\n\n    public Zeroed3()\n    {\n        X = 1;\n        Y = 2;\n    }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/ParameterlessConstructors/Zeroed/Zeroed.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/RecordStruct/HidingField/HidingField.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/RecordStruct/HidingField/Program.cs",
    "content": "﻿// コンパイラー生成物はプロパティ。\nConsole.WriteLine(typeof(Point0).GetProperty(\"X\") != null); // true\nConsole.WriteLine(typeof(Point0).GetField(\"X\") != null); // false\n\n// それをフィールドの手書きで抑止してる版。\nConsole.WriteLine(typeof(Point1).GetProperty(\"X\") != null); // false\nConsole.WriteLine(typeof(Point1).GetField(\"X\") != null); // true\n\n// record struct のプライマリ コンストラクター引数から生成するもの、\n// record class に合わせてプロパティにした。\n\n// こう書くと、\n// public int X { get; set; }\n// public int Y { get; set; }\n// が生成される。\nrecord struct Point0(int X, int Y);\n\n// 一方で、「フィールドにしたい」という要件はあるだろうから、\n// 「フィールドでも手書きしておけばコンパイラー生成を抑止して優先的に使う」という仕様が入った。\n// (C# 9.0 時点ではこれができるのはプロパティだけ。)\nrecord struct Point1(int X, int Y)\n{\n    // 手書きで X, Y フィールドがあるので、\n    // コンストラクター引数からのプロパティ X, Y 生成はされない。\n    // この手書き X, Y が使われる。\n    public int X = X;\n    public int Y = Y;\n}\n\n// record struct のために入った仕様とはいえ、\n// record calss に対して禁止する理由もないので、\n// C# 10.0 からは同様の「フィールド手書き」が record class でもできるようになった。\nrecord class Point2(int X, int Y)\n{\n    // C# 9.0 ではダメだった。\n    public int X = X;\n    public int Y = Y;\n\n    // ↓なら C# 9.0 の頃でも OK だった。\n    //public int X { get; set; } = X;\n    //public int Y { get; set; } = Y;\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/RecordStruct/Metadata/Metadata.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/RecordStruct/Metadata/Program.cs",
    "content": "﻿using System.Reflection;\n\n// 定義してる型は RecordStruct.csproj と一緒。\n// リフレクションで中身の確認。\n\n// record class には必ず EqualityContract と <Clone>$ がある。\nvar typeofClass = typeof(ClassPoint);\n\nConsole.WriteLine(typeofClass.GetMethod(\"<Clone>$\"));\nConsole.WriteLine(typeofClass.GetProperty(\"EqualityContract\", BindingFlags.NonPublic | BindingFlags.Instance));\n\n// Point が X, Y プロパティを持ってる(get; set;)\nvar typeofStruct = typeof(Point);\n\nforeach (var p in typeofStruct.GetProperties())\n{\n    var isInitOnly = p.GetSetMethod()?.ReturnParameter.GetRequiredCustomModifiers().Any(x => x.Name == \"IsExternalInit\");\n    Console.WriteLine((p.Name, isInitOnly));\n}\n\n// readonly が付いていない record struct でも、プロパティの get メソッドとかには readonly が付く。\n\nstatic bool isReadOnly(MethodInfo? method)\n    => method?.CustomAttributes.Any(a => a.AttributeType.Name == \"IsReadOnlyAttribute\") == true;\n\nConsole.WriteLine(isReadOnly(typeofStruct.GetProperty(\"X\")?.GetGetMethod()));\n\n// PrintMembers、GetHashCode とかにも付くはず(.NET 6 Preview 7 時点ではまだっぽい？)\n//Console.WriteLine(isReadOnly(t.GetMethod(\"PrintMembers\", BindingFlags.NonPublic | BindingFlags.Instance)));\n//Console.WriteLine(isReadOnly(t.GetMethod(\"GetHashCode\")));\n\n// record struct には EqualityContract と <Clone>$ はない。\nConsole.WriteLine(typeofStruct.GetMethod(\"<Clone>$\"));\nConsole.WriteLine(typeofStruct.GetProperty(\"EqualityContract\", BindingFlags.NonPublic | BindingFlags.Instance));\n\n// ReadOnlyPoint も X, Y プロパティを持ってるけど、get; init;\nforeach (var p in typeof(ReadOnlyPoint).GetProperties())\n{\n    var isInitOnly = p.GetSetMethod()?.ReturnParameter.GetRequiredCustomModifiers().Any(x => x.Name == \"IsExternalInit\");\n    Console.WriteLine((p.Name, isInitOnly));\n}\n\n// 以下、RecordStruct.csproj と一緒。\nrecord struct Point(int X, int Y);\nreadonly record struct ReadOnlyPoint(int X, int Y);\nrecord class ClassPoint(int X, int Y);\n"
  },
  {
    "path": "Demo/2021/Csharp10/RecordStruct/RecordStruct/Program.cs",
    "content": "﻿// Point が X, Y プロパティを持ってる(get; set;)\n\nvar p1 = new Point(1, 2);\np1.X = 3; // 普通に書き換え可能。\nConsole.WriteLine(p1); // ToString とかは record class と一緒。\n\n// ReadOnlyPoint も X, Y プロパティを持ってるけど、get; init;\nvar p2 = new ReadOnlyPoint(1, 2)\n{\n    X = 3, // init-only なのでこれは OK。\n};\n//p2.X = 3; // これはダメ。\nConsole.WriteLine(p2);\n\n// ほぼ (classs の) record と一緒。\n// X, Y に対応するプロパティが生成される。\n// ただ、普通の record struct で書くと get; set; なプロパティが生成される。\n// (readonly/init-only にならない。タプルと一緒。構造体は immutable である必要性がクラスよりは低い。)\nrecord struct Point(int X, int Y);\n\n// readonly record struct にすると get; init; なプロパティが生成される。\nreadonly record struct ReadOnlyPoint(int X, int Y);\n\n// record class って書けるようになった。\n// record struct との対称性のために足しただけで、C# 9.0 の \"record\" と全く一緒。\nrecord class ClassPoint(int X, int Y);\n"
  },
  {
    "path": "Demo/2021/Csharp10/RecordStruct/RecordStruct/RecordStruct.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/RecordStruct/VsClass/Program.cs",
    "content": "﻿// record (record class) と record struct の使い分け、概ね通常の class と struct の関係と一緒。\n\n// 1. ヒープ アロケーション\n\nint N = 1000;\n\nfor (int i = 0; i < N; i++)\n{\n    // クラスの場合、\n    // こういうループの内側で使い捨てインスタンスを new しまくるのはあんまりよろしくない。\n    // GC 誘発。\n    var c = new RecordClass(1, 2);\n}\n\nfor (int i = 0; i < N; i++)\n{\n    // 同じようなことをやってても、構造体ならそこまでの負担はない。\n    var x = new RecordStruct(1, 2);\n\n    // なんだったら、.NET 6 ではこの手のコードのインライン展開が掛かって、\n    // 完全に new RecordStruct() と Abs 呼び出しが消滅したりする。\n    // (C# コンパイル時最適化じゃなくて、.NET ランタイム JIT 時最適化で。)\n    var absx = Math.Abs(x.X);\n}\n\n// 2. デフォルト値(配列の要素とか)\n\n// クラスの場合、null 初期化。\nvar a1 = new RecordClass[N];\n\n// この状態はぬるぽ。\n//Console.WriteLine(a1[0].X);\n\n// なので null チェックが必要。\n// (プロパティ パターン {} は null チェックを含んでる。)\nif (a1[0] is { X: var a0x }) Console.WriteLine(a0x);\n\n// 構造体の場合、0 初期化。\nvar a2 = new RecordStruct[N];\n\n// なのでこれは 0 が表示される。\nConsole.WriteLine(a2[0].X);\n\n// 3. 参照型か値型か以外の差\n\n// C# 7.0/7.2 で ref 戻り値、in 引数が増えて以来、「構造体は mutable にしてもよい」という風潮。\n// なので、(readonly を付けてない) record struct は get; set; でプロパティ生成されてる。\n// 匿名型 new { X = 1, ... } とタプル (X: 1, ...) の差に近い。\n\nvar rc = new RecordStruct(1, 2);\nrc.X = 3; // これは OK。\n\nvar rs = new RecordClass(1, 2);\n//rs.X = 3; // これはコンパイル エラー。\n\n// タプルは構造体 = record struct に扱いが近い。\nvar tuple = (X: 1, Y: 2);\ntuple.X = 3; // これは OK。\n\n// 匿名型は参照型(クラス)として生成されてる = record class に扱いが近い。\nvar anonymous = new { X = 1, Y = 2 };\n//anonymous.X = 3; // これはコンパイル エラー。\n\n// 型定義\nrecord struct RecordStruct(int X, int Y);\nrecord class RecordClass(int X, int Y);\n"
  },
  {
    "path": "Demo/2021/Csharp10/RecordStruct/VsClass/VsClass.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/RecordStruct/VsNormalStruct/Program.cs",
    "content": "﻿// C# 9.0 で追加されたレコード型は思想的には「構造体的な扱いができる参照型」だったり。\n// C# 10.0 で record struct (構造体もレコードにできる)と言うのが入って、「構造体的な扱いができる構造体？」みたいになってる。\n// 「通常の struct に record と同程度の機能性を持たせるかどうか」みたいな議論もあったものの、\n// 結局、「元々の struct と、record (record class) の差を埋めるために record struct を新設」という流れに。\n//\n// ということで、record struct と(元からある通常の) struct の差を紹介。\n\n// 1. プライマリ コンストラクターを持てるのは record struct だけ。\n// 正確に言うと、(将来計画として)通常のクラス/構造体にもプライマリ コンストラクターを認めるかもしれないものの、\n// その場合でも「プライマリ コンストラクターの引数からプロパティをコンパイラー生成」するのは record を付けた時だけ。\n\nvar r = new RecordStruct(1, 2);\nConsole.WriteLine(r.X); // コンストラクター引数からプロパティが生成されてる。\n\n// 2. ↑の一環として、Deconstruct も生成されてる。\nvar (x, _) = r;\nConsole.WriteLine(x);\n\n// 3. IEquatable<T> が実装されてる。\n// 通常の構造体は Equals(object? obj) は持ってるけど、Equals(T other) は持ってない。\n// これも正確に言うと通常の構造体の Equals(object? obj) は object.Equals をそのまま使ってる(override はしてない)。\n// object.Equals の中で構造体の特殊扱いが働いていて、「全メンバーのビット列が一致してるときに true」になってる。\n//\n// 一方で、record struct のコンパイラー生成の Equals はメンバーごとに EqualityComparer<T>.Default.Equals を呼んでる。\n// object.Equals よりも速いらしい。\nConsole.WriteLine(r.Equals(new RecordStruct(2, 3))); // RecordStruct.Equals(RecordStruct) が呼ばれてる。\n\nConsole.WriteLine(r == new RecordStruct(1, 2)); // ちなみに、== と != も生成されてる。\n\n// 4. ↑の余波で、IEquatable<T> 実装、EqualityComparer<T> 使用と両立しない機能は使えない。\n//ref record struct RefStruct; // ref struct がインターフェイス実装と両立しないのでダメ。\n//record struct Pointer(int* X); // ポインターが EqualityComparer<T> と両立しないのでダメ。\n\n// 型定義\nrecord struct RecordStruct(int X, int Y);\n"
  },
  {
    "path": "Demo/2021/Csharp10/RecordStruct/VsNormalStruct/VsNormalStruct.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/RecordStruct/With/Program.cs",
    "content": "﻿// with 式の話。\n\n// クラスの場合は通常の class には with 式を使えず、record でだけ使える。\n// 通常のクラスには標準的なクローン手法がないので。\n// (with 式 = クローン + 部分書き換え)\n// (将来的にはパターン ベースで通常のクラスにも with 式を使える手段を提供したいみたいな話もあるけど、少なくとも C# 9, 10 時点ではない。)\n\n//var nc = new NormalClass { X = 1 };\n//Console.WriteLine(nc with { X = 2 }); // コンパイルエラー\n\nvar rc = new RecordClass(1, 2);\nConsole.WriteLine(rc with { X = 3 });\n\n// 一方で、構造体の場合は通常の struct でも record struct でもどっちでも with 式を使える。\n// (C# 10.0 から。)\n// 構造体は元からクローン手段を持ってる(他の変数に代入するだけでコピーが発生してる)。\n\nvar ns = new NormalStruct { X = 1, Y = 2 };\nConsole.WriteLine(ns with { X = 3 });\n\nvar rs = new RecordStruct(1, 2);\nConsole.WriteLine(rs with { X = 3 });\n\n// おまけで、匿名型(C# 3.0 からある参照型のやつ)に対しても、C# 10.0 で with 式が使えるようになった。\n// (元から予定はあった。record struct と同じく、スケジュール上 C# 9.0 から外れてただけ。)\nvar anonymous = new { X = 1, Y = 2 };\nConsole.WriteLine(anonymous with { X = 3 });\n\n// ちなみに、タプルに対しても with 式が使えるようになってるけども、\n// これは理屈としては「構造体は無条件に with 式を使える」の一種。\nvar tuple = (X: 1, Y: 2);\nConsole.WriteLine(tuple with { X = 3 });\n\nclass NormalClass\n{\n    public int X { get; init; }\n    public int Y { get; init; }\n    public override string ToString() => $\"NormalClass {{ X = {X}, Y = {Y} }}\";\n}\n\nrecord RecordClass(int X, int Y);\n\nstruct NormalStruct\n{\n    public int X { get; init; }\n    public int Y { get; init; }\n    public override string ToString() => $\"NormalStruct {{ X = {X}, Y = {Y} }}\";\n}\n\nrecord struct RecordStruct(int X, int Y);\n\n// おまけ:\n// 「通常の構造体でも、元々あるクローン機構を使って with 式に対応」という判断とセットで、\n// 「手書きで Clone を書いてもそれは呼ばない」ということになり、\n// 「呼ばれそうに見えるけど呼ばれない」と言うのが怖いので、「record struct に Clone メソッドは書けない」という縛りを入れたみたい。\n#if false\nrecord struct R\n{\n    public R Clone() => new R(); // コンパイル エラーになる。\n}\n#endif\n"
  },
  {
    "path": "Demo/2021/Csharp10/RecordStruct/With/With.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/StaticAbstract/GenericMath/Algebra/GaloisField.cs",
    "content": "﻿namespace GenericMath.Algebra;\n\npublic readonly struct GaloisField<N> : IField<GaloisField<N>>\n    where N : IConstant<int>\n{\n    private readonly int _value;\n\n    public GaloisField(int value) => _value = Mod(value);\n    public override string ToString() => _value.ToString();\n\n    public static explicit operator int(GaloisField<N> value) => value._value;\n    public static implicit operator GaloisField<N>(int value) => new(value);\n\n    public bool Equals(GaloisField<N> other) => _value == other._value;\n    public override bool Equals(object? obj) => obj is GaloisField<N> other && Equals(other);\n    public override int GetHashCode() => _value.GetHashCode();\n    public static bool operator ==(GaloisField<N> x, GaloisField<N> y) => x.Equals(y);\n    public static bool operator !=(GaloisField<N> x, GaloisField<N> y) => !x.Equals(y);\n\n    public static GaloisField<N> AdditiveIdentity => 0;\n    public static GaloisField<N> MultiplicativeIdentity => 1;\n\n    public GaloisField<N> Inverse() => new(Egcd(_value, N.Value).x);\n    public static GaloisField<N> operator +(GaloisField<N> x) => x;\n    public static GaloisField<N> operator -(GaloisField<N> x) => new(-x._value);\n\n    public static GaloisField<N> operator +(GaloisField<N> x, GaloisField<N> y) => new(x._value + y._value);\n    public static GaloisField<N> operator -(GaloisField<N> x, GaloisField<N> y) => new(x._value - y._value);\n    public static GaloisField<N> operator *(GaloisField<N> x, GaloisField<N> y) => new(x._value * y._value);\n    public static GaloisField<N> operator /(GaloisField<N> x, GaloisField<N> y) => x * y.Inverse();\n\n    public static GaloisField<N> operator --(GaloisField<N> value) => new(value._value - 1);\n    public static GaloisField<N> operator ++(GaloisField<N> value) => new(value._value + 1);\n\n    /// <summary>\n    /// Extended Euclidean Algorithm.\n    /// </summary>\n    static (int x, int y) Egcd(int a, int b)\n    {\n        if (b == 0) return (1, 0);\n        else\n        {\n            var (y, x) = Egcd(b, a % b);\n            y -= (a / b) * x;\n            return (x, y);\n        }\n    }\n\n    /// <summary>\n    /// <paramref name=\"i\"/> mod N.\n    /// </summary>\n    private static int Mod(int i)\n    {\n        i %= N.Value;\n        if (i < 0) i += N.Value;\n        return i;\n    }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/StaticAbstract/GenericMath/Algebra/IConstant.cs",
    "content": "﻿namespace GenericMath.Algebra;\n\npublic interface IConstant<T>\n{\n    static abstract T Value { get; }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/StaticAbstract/GenericMath/Algebra/IField.cs",
    "content": "﻿namespace GenericMath.Algebra;\n\npublic interface IField<TSelf>\n    : IAdditionOperators<TSelf, TSelf, TSelf>,\n    IAdditiveIdentity<TSelf, TSelf>,\n    IEqualityOperators<TSelf, TSelf>,\n    IEquatable<TSelf>,\n    IDecrementOperators<TSelf>,\n    IDivisionOperators<TSelf, TSelf, TSelf>,\n    IIncrementOperators<TSelf>,\n    IMultiplicativeIdentity<TSelf, TSelf>,\n    IMultiplyOperators<TSelf, TSelf, TSelf>,\n    //IFormattable,\n    //ISpanFormattable,\n    //IParseable<TSelf>,\n    //ISpanParseable<TSelf>,\n    ISubtractionOperators<TSelf, TSelf, TSelf>,\n    IUnaryNegationOperators<TSelf, TSelf>,\n    IUnaryPlusOperators<TSelf, TSelf>\n    where TSelf : IField<TSelf>\n{\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/StaticAbstract/GenericMath/Algebra/Natural.cs",
    "content": "﻿namespace GenericMath.Algebra;\n\npublic static class Natural\n{\n    public struct _0 : IConstant<int> { public static int Value => 0; }\n    public struct _1 : IConstant<int> { public static int Value => 1; }\n    public struct _2 : IConstant<int> { public static int Value => 2; }\n    public struct _3 : IConstant<int> { public static int Value => 3; }\n    public struct _4 : IConstant<int> { public static int Value => 4; }\n    public struct _5 : IConstant<int> { public static int Value => 5; }\n    public struct _6 : IConstant<int> { public static int Value => 6; }\n    public struct _7 : IConstant<int> { public static int Value => 7; }\n    public struct _8 : IConstant<int> { public static int Value => 8; }\n    public struct _9 : IConstant<int> { public static int Value => 9; }\n    public struct _10 : IConstant<int> { public static int Value => 10; }\n    public struct _11 : IConstant<int> { public static int Value => 11; }\n    public struct _12 : IConstant<int> { public static int Value => 12; }\n    public struct _13 : IConstant<int> { public static int Value => 13; }\n    public struct _14 : IConstant<int> { public static int Value => 14; }\n    public struct _15 : IConstant<int> { public static int Value => 15; }\n    public struct _16 : IConstant<int> { public static int Value => 16; }\n    public struct _17 : IConstant<int> { public static int Value => 17; }\n    public struct _18 : IConstant<int> { public static int Value => 18; }\n    public struct _19 : IConstant<int> { public static int Value => 19; }\n    public struct _20 : IConstant<int> { public static int Value => 20; }\n    public struct _21 : IConstant<int> { public static int Value => 21; }\n    public struct _22 : IConstant<int> { public static int Value => 22; }\n    public struct _23 : IConstant<int> { public static int Value => 23; }\n    public struct _24 : IConstant<int> { public static int Value => 24; }\n    public struct _25 : IConstant<int> { public static int Value => 25; }\n    public struct _26 : IConstant<int> { public static int Value => 26; }\n    public struct _27 : IConstant<int> { public static int Value => 27; }\n    public struct _28 : IConstant<int> { public static int Value => 28; }\n    public struct _29 : IConstant<int> { public static int Value => 29; }\n    public struct _30 : IConstant<int> { public static int Value => 30; }\n    public struct _31 : IConstant<int> { public static int Value => 31; }\n    public struct _32 : IConstant<int> { public static int Value => 32; }\n    public struct _33 : IConstant<int> { public static int Value => 33; }\n    public struct _34 : IConstant<int> { public static int Value => 34; }\n    public struct _35 : IConstant<int> { public static int Value => 35; }\n    public struct _36 : IConstant<int> { public static int Value => 36; }\n    public struct _37 : IConstant<int> { public static int Value => 37; }\n    public struct _38 : IConstant<int> { public static int Value => 38; }\n    public struct _39 : IConstant<int> { public static int Value => 39; }\n    public struct _40 : IConstant<int> { public static int Value => 40; }\n    public struct _41 : IConstant<int> { public static int Value => 41; }\n    public struct _42 : IConstant<int> { public static int Value => 42; }\n    public struct _43 : IConstant<int> { public static int Value => 43; }\n    public struct _44 : IConstant<int> { public static int Value => 44; }\n    public struct _45 : IConstant<int> { public static int Value => 45; }\n    public struct _46 : IConstant<int> { public static int Value => 46; }\n    public struct _47 : IConstant<int> { public static int Value => 47; }\n    public struct _48 : IConstant<int> { public static int Value => 48; }\n    public struct _49 : IConstant<int> { public static int Value => 49; }\n    public struct _50 : IConstant<int> { public static int Value => 50; }\n    public struct _51 : IConstant<int> { public static int Value => 51; }\n    public struct _52 : IConstant<int> { public static int Value => 52; }\n    public struct _53 : IConstant<int> { public static int Value => 53; }\n    public struct _54 : IConstant<int> { public static int Value => 54; }\n    public struct _55 : IConstant<int> { public static int Value => 55; }\n    public struct _56 : IConstant<int> { public static int Value => 56; }\n    public struct _57 : IConstant<int> { public static int Value => 57; }\n    public struct _58 : IConstant<int> { public static int Value => 58; }\n    public struct _59 : IConstant<int> { public static int Value => 59; }\n    public struct _60 : IConstant<int> { public static int Value => 60; }\n    public struct _61 : IConstant<int> { public static int Value => 61; }\n    public struct _62 : IConstant<int> { public static int Value => 62; }\n    public struct _63 : IConstant<int> { public static int Value => 63; }\n    public struct _64 : IConstant<int> { public static int Value => 64; }\n    public struct _65 : IConstant<int> { public static int Value => 65; }\n    public struct _66 : IConstant<int> { public static int Value => 66; }\n    public struct _67 : IConstant<int> { public static int Value => 67; }\n    public struct _68 : IConstant<int> { public static int Value => 68; }\n    public struct _69 : IConstant<int> { public static int Value => 69; }\n    public struct _70 : IConstant<int> { public static int Value => 70; }\n    public struct _71 : IConstant<int> { public static int Value => 71; }\n    public struct _72 : IConstant<int> { public static int Value => 72; }\n    public struct _73 : IConstant<int> { public static int Value => 73; }\n    public struct _74 : IConstant<int> { public static int Value => 74; }\n    public struct _75 : IConstant<int> { public static int Value => 75; }\n    public struct _76 : IConstant<int> { public static int Value => 76; }\n    public struct _77 : IConstant<int> { public static int Value => 77; }\n    public struct _78 : IConstant<int> { public static int Value => 78; }\n    public struct _79 : IConstant<int> { public static int Value => 79; }\n    public struct _80 : IConstant<int> { public static int Value => 80; }\n    public struct _81 : IConstant<int> { public static int Value => 81; }\n    public struct _82 : IConstant<int> { public static int Value => 82; }\n    public struct _83 : IConstant<int> { public static int Value => 83; }\n    public struct _84 : IConstant<int> { public static int Value => 84; }\n    public struct _85 : IConstant<int> { public static int Value => 85; }\n    public struct _86 : IConstant<int> { public static int Value => 86; }\n    public struct _87 : IConstant<int> { public static int Value => 87; }\n    public struct _88 : IConstant<int> { public static int Value => 88; }\n    public struct _89 : IConstant<int> { public static int Value => 89; }\n    public struct _90 : IConstant<int> { public static int Value => 90; }\n    public struct _91 : IConstant<int> { public static int Value => 91; }\n    public struct _92 : IConstant<int> { public static int Value => 92; }\n    public struct _93 : IConstant<int> { public static int Value => 93; }\n    public struct _94 : IConstant<int> { public static int Value => 94; }\n    public struct _95 : IConstant<int> { public static int Value => 95; }\n    public struct _96 : IConstant<int> { public static int Value => 96; }\n    public struct _97 : IConstant<int> { public static int Value => 97; }\n    public struct _98 : IConstant<int> { public static int Value => 98; }\n    public struct _99 : IConstant<int> { public static int Value => 99; }\n}\n"
  },
  {
    "path": "Demo/2021/Csharp10/StaticAbstract/GenericMath/GenericMath.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <LangVersion>preview</LangVersion>\n    <EnablePreviewFeatures>True</EnablePreviewFeatures>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.Runtime.Experimental\" Version=\"6.0.0-preview.7.21377.19\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp10/StaticAbstract/GenericMath/Program.cs",
    "content": "﻿// See https://aka.ms/new-console-template for more information\n\nConsole.WriteLine(\"Hello, World!\");\n"
  },
  {
    "path": "Demo/2021/Csharp10/readme.md",
    "content": "# ++C++; の C# 10.0 記事用サンプル\n\nhttps://github.com/ufcpp/UfcppSample/issues/342\n\nせっかくプロジェクト テンプレートが簡素になったんだし、極力細かく csproj を区切ってある。\n"
  },
  {
    "path": "Demo/2021/Csharp9/Csharp9.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30114.105\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Record\", \"Record\", \"{504DCEF9-E855-4D44-BAB3-700C41F8C27F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"InParams\", \"Record\\InParams\\InParams.csproj\", \"{8D7554AE-74A1-4910-B6BE-EED1E432188B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{8D7554AE-74A1-4910-B6BE-EED1E432188B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8D7554AE-74A1-4910-B6BE-EED1E432188B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8D7554AE-74A1-4910-B6BE-EED1E432188B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8D7554AE-74A1-4910-B6BE-EED1E432188B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{8D7554AE-74A1-4910-B6BE-EED1E432188B} = {504DCEF9-E855-4D44-BAB3-700C41F8C27F}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2021/Csharp9/Record/InParams/InParams.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net5.0</TargetFramework>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/Csharp9/Record/InParams/Program.cs",
    "content": "﻿using System;\n\nvar r = new Record(1, 2, 3, 4);\n\nConsole.WriteLine(r.X); // 1\n\nforeach (var item in r.Y)\n{\n    Console.WriteLine(item); // 2, 3, 4\n}\n\n// レコード型のプライマリ コンストラクター引数(からのプロパティ生成)、\n// in と params は受け付けるらしい。\npublic record Record(in int X, params int[] Y);\n\n// ちなみに、 ref と out はダメ。\n//public record Record2(ref int X, out int Y);\n"
  },
  {
    "path": "Demo/2021/Csharp9/readme.md",
    "content": "# ++C++; の C# 9.0 記事用サンプル\n\nhttps://github.com/ufcpp/UfcppSample/issues/297\n\n9.0 の記事を書くとき、この手のソリューションを作らなかったので後付け([Csharp10](../Csharp10)] の方より後に作成＆作成年度が合ってない＆全機能網羅してない)。\n"
  },
  {
    "path": "Demo/2021/EmojiData/readme.md",
    "content": "## emoji-data 読み\n\n移転先: [ufcpp/emoji](https://github.com/ufcpp/emoji)\n"
  },
  {
    "path": "Demo/2021/GenericMath/GenericMath/FixedArray.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace GenericMath\n{\n    class FixedArraySample\n    {\n        public static void M()\n        {\n            // 「generic math」以外でまず真っ先に「固定長配列」をやりたかったんだけど…\n\n            var array = new FiexedArray2<string>();\n\n            // これが型引数の推論効かないの残念…\n            //var s = array.AsSpan();\n\n            // これなら書けるけどあんまり書きたくない。\n            // 一応、型引数の推論を賢くしたいという話はずっとある。(ずっとある…)\n            var s = array.AsSpan<FiexedArray2<string>, string>();\n\n            s[0] = \"abc\";\n            s[1] = \"xyz\";\n\n            Console.WriteLine(array);\n        }\n    }\n\n    interface IArray<TArray, TElement>\n        where TArray : IArray<TArray, TElement>\n    {\n        public static abstract int Length { get; }\n\n        // 構造体は return ref this できないので、static に return ref parameter できないか試す。\n        public static abstract ref TElement GetFirstElementRef(ref TArray array);\n    }\n\n    static class ArrayExtensions\n    {\n        // AsSpan も ref this 拡張メソッドとして実装。\n        public static Span<TElement> AsSpan<TArray, TElement>(ref this TArray array)\n            where TArray : struct, IArray<TArray, TElement>\n            => MemoryMarshal.CreateSpan(ref TArray.GetFirstElementRef(ref array), TArray.Length);\n    }\n\n    // これの要素数違いは構造が機械的なのでテンプレート生成可能。\n    public struct FiexedArray2<T> : IArray<FiexedArray2<T>, T>\n    {\n        private T _0;\n        private T _1;\n\n        public static int Length => 2;\n        public static ref T GetFirstElementRef(ref FiexedArray2<T> array) => ref array._0;\n\n        public override string ToString() => $\"[ {_0}, {_1} ]\";\n    }\n}\n"
  },
  {
    "path": "Demo/2021/GenericMath/GenericMath/GenericMath.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <LangVersion>preview</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/GenericMath/GenericMath/MathInterfaces.cs",
    "content": "﻿// https://github.com/tannergooding/runtime/blob/6778b79a819aef37fb886ec8bc2e74e65ff95a25/src/libraries/System.Private.CoreLib/src/System/IAdditionOperators.cs\n// とかからのコピー品。\n// .NET 6 Preview 7 とか RC とかに入るはずだけど、 Preview 6 にはマージされてなさそう。\n// いったん手作業コピー。\n\nusing System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing System.Runtime.Versioning;\n\nnamespace System\n{\n    [RequiresPreviewFeatures]\n    public interface IAdditionOperators<TSelf, TOther, TResult>\n        where TSelf : IAdditionOperators<TSelf, TOther, TResult>\n    {\n        static abstract TResult operator +(TSelf left, TOther right);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IAdditiveIdentity<TSelf, TResult>\n        where TSelf : IAdditiveIdentity<TSelf, TResult>\n    {\n        static abstract TResult AdditiveIdentity { get; }\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IBitwiseOperators<TSelf, TOther, TResult>\n        where TSelf : IBitwiseOperators<TSelf, TOther, TResult>\n    {\n        static abstract TResult operator &(TSelf left, TOther right);\n        static abstract TResult operator |(TSelf left, TOther right);\n        static abstract TResult operator ^(TSelf left, TOther right);\n        static abstract TResult operator ~(TSelf value);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IComparisonOperators<TSelf, TOther>\n        : IComparable,\n          IComparable<TOther>,\n          IEqualityOperators<TSelf, TOther>\n        where TSelf : IComparisonOperators<TSelf, TOther>\n    {\n        static abstract bool operator <(TSelf left, TOther right);\n        static abstract bool operator <=(TSelf left, TOther right);\n        static abstract bool operator >(TSelf left, TOther right);\n        static abstract bool operator >=(TSelf left, TOther right);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IDecrementOperators<TSelf>\n        where TSelf : IDecrementOperators<TSelf>\n    {\n        static abstract TSelf operator --(TSelf value);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IDivisionOperators<TSelf, TOther, TResult>\n        where TSelf : IDivisionOperators<TSelf, TOther, TResult>\n    {\n        static abstract TResult operator /(TSelf left, TOther right);\n        // static abstract checked TResult operator /(TSelf left, TOther right);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IEqualityOperators<TSelf, TOther> : IEquatable<TOther>\n        where TSelf : IEqualityOperators<TSelf, TOther>\n    {\n        static abstract bool operator ==(TSelf left, TOther right);\n        static abstract bool operator !=(TSelf left, TOther right);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IFloatingPoint<TSelf>\n        : ISignedNumber<TSelf>\n        where TSelf : IFloatingPoint<TSelf>\n    {\n        static abstract TSelf E { get; }\n        static abstract TSelf Epsilon { get; }\n        static abstract TSelf NaN { get; }\n        static abstract TSelf NegativeInfinity { get; }\n        static abstract TSelf NegativeZero { get; }\n        static abstract TSelf Pi { get; }\n        static abstract TSelf PositiveInfinity { get; }\n        static abstract TSelf Tau { get; }\n        static abstract TSelf Acos(TSelf x);\n        static abstract TSelf Acosh(TSelf x);\n        static abstract TSelf Asin(TSelf x);\n        static abstract TSelf Asinh(TSelf x);\n        static abstract TSelf Atan(TSelf x);\n        static abstract TSelf Atan2(TSelf y, TSelf x);\n        static abstract TSelf Atanh(TSelf x);\n        static abstract TSelf BitDecrement(TSelf x);\n        static abstract TSelf BitIncrement(TSelf x);\n        static abstract TSelf Cbrt(TSelf x);\n        static abstract TSelf Ceiling(TSelf x);\n        static abstract TSelf CopySign(TSelf x, TSelf y);\n        static abstract TSelf Cos(TSelf x);\n        static abstract TSelf Cosh(TSelf x);\n        static abstract TSelf Exp(TSelf x);\n        static abstract TSelf Floor(TSelf x);\n        static abstract TSelf FusedMultiplyAdd(TSelf left, TSelf right, TSelf addend);\n        static abstract TSelf IEEERemainder(TSelf left, TSelf right);\n        static abstract TInteger ILogB<TInteger>(TSelf x)\n            where TInteger : IBinaryInteger<TInteger>;\n        static abstract bool IsFinite(TSelf value);\n        static abstract bool IsInfinity(TSelf value);\n        static abstract bool IsNaN(TSelf value);\n        static abstract bool IsNegative(TSelf value);\n        static abstract bool IsNegativeInfinity(TSelf value);\n        static abstract bool IsNormal(TSelf value);\n        static abstract bool IsPositiveInfinity(TSelf value);\n        static abstract bool IsSubnormal(TSelf value);\n        static abstract TSelf Log(TSelf x);\n        static abstract TSelf Log(TSelf x, TSelf newBase);\n        static abstract TSelf Log2(TSelf x);\n        static abstract TSelf Log10(TSelf x);\n        static abstract TSelf MaxMagnitude(TSelf x, TSelf y);\n        static abstract TSelf MinMagnitude(TSelf x, TSelf y);\n        static abstract TSelf Pow(TSelf x, TSelf y);\n        static abstract TSelf Round(TSelf x);\n        static abstract TSelf Round<TInteger>(TSelf x, TInteger digits)\n            where TInteger : IBinaryInteger<TInteger>;\n        static abstract TSelf Round(TSelf x, MidpointRounding mode);\n        static abstract TSelf Round<TInteger>(TSelf x, TInteger digits, MidpointRounding mode)\n            where TInteger : IBinaryInteger<TInteger>;\n        static abstract TSelf ScaleB<TInteger>(TSelf x, TInteger n)\n            where TInteger : IBinaryInteger<TInteger>;\n        static abstract TSelf Sin(TSelf x);\n        static abstract TSelf Sinh(TSelf x);\n        static abstract TSelf Sqrt(TSelf x);\n        static abstract TSelf Tan(TSelf x);\n        static abstract TSelf Tanh(TSelf x);\n        static abstract TSelf Truncate(TSelf x);\n\n        // static abstract TSelf AcosPi(TSelf x);\n        // static abstract TSelf AsinPi(TSelf x);\n        // static abstract TSelf AtanPi(TSelf x);\n        // static abstract TSelf Atan2Pi(TSelf y, TSelf x);\n        // static abstract TSelf Compound(TSelf x, TSelf n);\n        // static abstract TSelf CosPi(TSelf x);\n        // static abstract TSelf ExpM1(TSelf x);\n        // static abstract TSelf Exp2(TSelf x);\n        // static abstract TSelf Exp2M1(TSelf x);\n        // static abstract TSelf Exp10(TSelf x);\n        // static abstract TSelf Exp10M1(TSelf x);\n        // static abstract TSelf Hypot(TSelf x, TSelf y);\n        // static abstract TSelf LogP1(TSelf x);\n        // static abstract TSelf Log2P1(TSelf x);\n        // static abstract TSelf Log10P1(TSelf x);\n        // static abstract TSelf MaxMagnitudeNumber(TSelf x, TSelf y);\n        // static abstract TSelf MaxNumber(TSelf x, TSelf y);\n        // static abstract TSelf MinMagnitudeNumber(TSelf x, TSelf y);\n        // static abstract TSelf MinNumber(TSelf x, TSelf y);\n        // static abstract TSelf Root(TSelf x, TSelf n);\n        // static abstract TSelf SinPi(TSelf x);\n        // static abstract TSelf TanPi(TSelf x);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IBinaryFloatingPoint<TSelf>\n        : IBinaryNumber<TSelf>,\n          IFloatingPoint<TSelf>\n        where TSelf : IBinaryFloatingPoint<TSelf>\n    {\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IIncrementOperators<TSelf>\n        where TSelf : IIncrementOperators<TSelf>\n    {\n        static abstract TSelf operator ++(TSelf value);\n        // static abstract checked TSelf operator ++(TSelf value);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IBinaryInteger<TSelf>\n        : IBinaryNumber<TSelf>,\n          IShiftOperators<TSelf, TSelf>\n        where TSelf : IBinaryInteger<TSelf>\n    {\n        static abstract TSelf LeadingZeroCount(TSelf value);\n        static abstract TSelf PopCount(TSelf value);\n        static abstract TSelf RotateLeft(TSelf value, TSelf rotateAmount);\n        static abstract TSelf RotateRight(TSelf value, TSelf rotateAmount);\n        static abstract TSelf TrailingZeroCount(TSelf value);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IMinMaxValue<TSelf>\n        where TSelf : IMinMaxValue<TSelf>\n    {\n        static abstract TSelf MinValue { get; }\n        static abstract TSelf MaxValue { get; }\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IModulusOperators<TSelf, TOther, TResult>\n        where TSelf : IModulusOperators<TSelf, TOther, TResult>\n    {\n        static abstract TResult operator %(TSelf left, TOther right);\n        // static abstract checked TResult operator %(TSelf left, TOther right);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IMultiplicativeIdentity<TSelf, TResult>\n        where TSelf : IMultiplicativeIdentity<TSelf, TResult>\n    {\n        static abstract TResult MultiplicativeIdentity { get; }\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IMultiplyOperators<TSelf, TOther, TResult>\n        where TSelf : IMultiplyOperators<TSelf, TOther, TResult>\n    {\n        static abstract TResult operator *(TSelf left, TOther right);\n        // static abstract checked TResult operator *(TSelf left, TOther right);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface INumber<TSelf>\n        : IAdditionOperators<TSelf, TSelf, TSelf>,\n          IAdditiveIdentity<TSelf, TSelf>,\n          IComparisonOperators<TSelf, TSelf>,   // implies IEquatableOperators<TSelf, TSelf>\n          IDecrementOperators<TSelf>,\n          IDivisionOperators<TSelf, TSelf, TSelf>,\n          IIncrementOperators<TSelf>,\n          IModulusOperators<TSelf, TSelf, TSelf>,\n          IMultiplicativeIdentity<TSelf, TSelf>,\n          IMultiplyOperators<TSelf, TSelf, TSelf>,\n          ISpanFormattable,                     // implies IFormattable\n          ISpanParseable<TSelf>,                // implies IParseable<TSelf>\n          ISubtractionOperators<TSelf, TSelf, TSelf>,\n          IUnaryNegationOperators<TSelf, TSelf>,\n          IUnaryPlusOperators<TSelf, TSelf>\n        where TSelf : INumber<TSelf>\n    {\n        static abstract TSelf One { get; }\n        static abstract TSelf Zero { get; }\n        static abstract TSelf Abs(TSelf value);\n        static abstract TSelf Clamp(TSelf value, TSelf min, TSelf max);\n        static abstract TSelf Create<TOther>(TOther value)\n            where TOther : INumber<TOther>;\n        static abstract TSelf CreateSaturating<TOther>(TOther value)\n            where TOther : INumber<TOther>;\n        static abstract TSelf CreateTruncating<TOther>(TOther value)\n            where TOther : INumber<TOther>;\n        static abstract (TSelf Quotient, TSelf Remainder) DivRem(TSelf left, TSelf right);\n        static abstract TSelf Max(TSelf x, TSelf y);\n        static abstract TSelf Min(TSelf x, TSelf y);\n        static abstract TSelf Parse(string s, NumberStyles style, IFormatProvider? provider);\n        static abstract TSelf Parse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider? provider);\n        static abstract TSelf Sign(TSelf value);\n        static abstract bool TryCreate<TOther>(TOther value, out TSelf result)\n            where TOther : INumber<TOther>;\n        static abstract bool TryParse([NotNullWhen(true)] string? s, NumberStyles style, IFormatProvider? provider, out TSelf result);\n        static abstract bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider? provider, out TSelf result);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IBinaryNumber<TSelf>\n        : IBitwiseOperators<TSelf, TSelf, TSelf>,\n          INumber<TSelf>\n        where TSelf : IBinaryNumber<TSelf>\n    {\n        static abstract bool IsPow2(TSelf value);\n        static abstract TSelf Log2(TSelf value);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface ISignedNumber<TSelf>\n        : INumber<TSelf>\n        where TSelf : ISignedNumber<TSelf>\n    {\n        static abstract TSelf NegativeOne { get; }\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IUnsignedNumber<TSelf>\n        : INumber<TSelf>\n        where TSelf : IUnsignedNumber<TSelf>\n    {\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IParseable<TSelf>\n        where TSelf : IParseable<TSelf>\n    {\n        static abstract TSelf Parse(string s, IFormatProvider? provider);\n        static abstract bool TryParse([NotNullWhen(true)] string? s, IFormatProvider? provider, out TSelf result);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IShiftOperators<TSelf, TResult>\n        where TSelf : IShiftOperators<TSelf, TResult>\n    {\n        static abstract TResult operator <<(TSelf value, int shiftAmount); // TODO_GENERIC_MATH: shiftAmount should be TOther\n        static abstract TResult operator >>(TSelf value, int shiftAmount); // TODO_GENERIC_MATH: shiftAmount should be TOther\n        // static abstract TResult operator >>>(TSelf value, int shiftAmount); // TODO_GENERIC_MATH: shiftAmount should be TOther\n    }\n\n    [RequiresPreviewFeatures]\n    public interface ISpanParseable<TSelf> : IParseable<TSelf>\n        where TSelf : ISpanParseable<TSelf>\n    {\n        static abstract TSelf Parse(ReadOnlySpan<char> s, IFormatProvider? provider);\n        static abstract bool TryParse(ReadOnlySpan<char> s, IFormatProvider? provider, out TSelf result);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface ISubtractionOperators<TSelf, TOther, TResult>\n        where TSelf : ISubtractionOperators<TSelf, TOther, TResult>\n    {\n        static abstract TResult operator -(TSelf left, TOther right);\n        // static abstract checked TResult operator -(TSelf left, TOther right);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IUnaryNegationOperators<TSelf, TResult>\n        where TSelf : IUnaryNegationOperators<TSelf, TResult>\n    {\n        static abstract TResult operator -(TSelf value);\n        // static abstract checked TResult operator -(TSelf value);\n    }\n\n    [RequiresPreviewFeatures]\n    public interface IUnaryPlusOperators<TSelf, TResult>\n        where TSelf : IUnaryPlusOperators<TSelf, TResult>\n    {\n        static abstract TResult operator +(TSelf value);\n        // static abstract checked TResult operator +(TSelf value);\n    }\n}\n"
  },
  {
    "path": "Demo/2021/GenericMath/GenericMath/Program.cs",
    "content": "﻿\nreturn;\n\ninterface IConstant<T>\n{\n    public static abstract T? Value { get; }\n}\n\nstruct _0 : IConstant<int> { public static int Value => 0; }\nstruct _1 : IConstant<int> { public static int Value => 1; }\nstruct _2 : IConstant<int> { public static int Value => 2; }\nstruct _3 : IConstant<int> { public static int Value => 3; }\nstruct _4 : IConstant<int> { public static int Value => 4; }\nstruct _5 : IConstant<int> { public static int Value => 5; }\nstruct _6 : IConstant<int> { public static int Value => 6; }\nstruct _7 : IConstant<int> { public static int Value => 7; }\nstruct _8 : IConstant<int> { public static int Value => 8; }\nstruct _9 : IConstant<int> { public static int Value => 9; }\n"
  },
  {
    "path": "Demo/2021/GenericMath/GenericMath.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.31512.422\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"GenericMath\", \"GenericMath\\GenericMath.csproj\", \"{5D851466-1F53-470E-8518-086B867CCE7F}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{5D851466-1F53-470E-8518-086B867CCE7F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5D851466-1F53-470E-8518-086B867CCE7F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5D851466-1F53-470E-8518-086B867CCE7F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5D851466-1F53-470E-8518-086B867CCE7F}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {AF6B4E67-A564-4954-BDA7-2C53AE73BA78}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/ConsoleApp1/ConsoleApp1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/ConsoleApp1/Program.cs",
    "content": "﻿{ }\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/ConsoleAppDesktop/ConsoleAppDesktop.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0-windows</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/ConsoleAppDesktop/Program.cs",
    "content": "﻿{ }\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/ConsoleAppUseWinForms/ConsoleAppUseWinForms.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0-windows</TargetFramework>\n    <UseWindowsForms>true</UseWindowsForms>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/ConsoleAppUseWinForms/Program.cs",
    "content": "﻿{ }\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/ConsoleAppUseWpf/ConsoleAppUseWpf.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0-windows</TargetFramework>\n    <UseWPF>true</UseWPF>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/ConsoleAppUseWpf/Program.cs",
    "content": "﻿{ }\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/Directory.Build.props",
    "content": "<Project>\n\n  <PropertyGroup>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/ImplicitUsings.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.1.31903.286\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{72D9DA70-4614-42E1-8E76-2C99F442A093}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleAppDesktop\", \"ConsoleAppDesktop\\ConsoleAppDesktop.csproj\", \"{DB433B20-FC84-4753-A2A2-AFE927932CD1}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleAppUseWpf\", \"ConsoleAppUseWpf\\ConsoleAppUseWpf.csproj\", \"{D6496E07-A4DA-4022-98E2-8500CF3F38A4}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleAppUseWinForms\", \"ConsoleAppUseWinForms\\ConsoleAppUseWinForms.csproj\", \"{618A9585-875A-48D6-94A5-337A564E4123}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WebApplication1\", \"WebApplication1\\WebApplication1.csproj\", \"{8C282E36-5448-4DE0-8C9F-75CBDBAE2B77}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{72D9DA70-4614-42E1-8E76-2C99F442A093}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{72D9DA70-4614-42E1-8E76-2C99F442A093}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{72D9DA70-4614-42E1-8E76-2C99F442A093}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{72D9DA70-4614-42E1-8E76-2C99F442A093}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{DB433B20-FC84-4753-A2A2-AFE927932CD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{DB433B20-FC84-4753-A2A2-AFE927932CD1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{DB433B20-FC84-4753-A2A2-AFE927932CD1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{DB433B20-FC84-4753-A2A2-AFE927932CD1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D6496E07-A4DA-4022-98E2-8500CF3F38A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D6496E07-A4DA-4022-98E2-8500CF3F38A4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D6496E07-A4DA-4022-98E2-8500CF3F38A4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D6496E07-A4DA-4022-98E2-8500CF3F38A4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{618A9585-875A-48D6-94A5-337A564E4123}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{618A9585-875A-48D6-94A5-337A564E4123}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{618A9585-875A-48D6-94A5-337A564E4123}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{618A9585-875A-48D6-94A5-337A564E4123}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{8C282E36-5448-4DE0-8C9F-75CBDBAE2B77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8C282E36-5448-4DE0-8C9F-75CBDBAE2B77}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8C282E36-5448-4DE0-8C9F-75CBDBAE2B77}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8C282E36-5448-4DE0-8C9F-75CBDBAE2B77}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {C6B60414-21A8-4597-897E-FFB7B716ED55}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Pages/Error.cshtml",
    "content": "﻿@page\n@model ErrorModel\n@{\n    ViewData[\"Title\"] = \"Error\";\n}\n\n<h1 class=\"text-danger\">Error.</h1>\n<h2 class=\"text-danger\">An error occurred while processing your request.</h2>\n\n@if (Model.ShowRequestId)\n{\n    <p>\n        <strong>Request ID:</strong> <code>@Model.RequestId</code>\n    </p>\n}\n\n<h3>Development Mode</h3>\n<p>\n    Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.\n</p>\n<p>\n    <strong>The Development environment shouldn't be enabled for deployed applications.</strong>\n    It can result in displaying sensitive information from exceptions to end users.\n    For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>\n    and restarting the app.\n</p>\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Pages/Error.cshtml.cs",
    "content": "using Microsoft.AspNetCore.Mvc;\nusing Microsoft.AspNetCore.Mvc.RazorPages;\nusing System.Diagnostics;\n\nnamespace WebApplication1.Pages\n{\n    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]\n    [IgnoreAntiforgeryToken]\n    public class ErrorModel : PageModel\n    {\n        public string? RequestId { get; set; }\n\n        public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);\n\n        private readonly ILogger<ErrorModel> _logger;\n\n        public ErrorModel(ILogger<ErrorModel> logger)\n        {\n            _logger = logger;\n        }\n\n        public void OnGet()\n        {\n            RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;\n        }\n    }\n}"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Pages/Index.cshtml",
    "content": "﻿@page\n@model IndexModel\n@{\n    ViewData[\"Title\"] = \"Home page\";\n}\n\n<div class=\"text-center\">\n    <h1 class=\"display-4\">Welcome</h1>\n    <p>Learn about <a href=\"https://docs.microsoft.com/aspnet/core\">building Web apps with ASP.NET Core</a>.</p>\n</div>\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Pages/Index.cshtml.cs",
    "content": "﻿using Microsoft.AspNetCore.Mvc;\nusing Microsoft.AspNetCore.Mvc.RazorPages;\n\nnamespace WebApplication1.Pages\n{\n    public class IndexModel : PageModel\n    {\n        private readonly ILogger<IndexModel> _logger;\n\n        public IndexModel(ILogger<IndexModel> logger)\n        {\n            _logger = logger;\n        }\n\n        public void OnGet()\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Pages/Privacy.cshtml",
    "content": "﻿@page\n@model PrivacyModel\n@{\n    ViewData[\"Title\"] = \"Privacy Policy\";\n}\n<h1>@ViewData[\"Title\"]</h1>\n\n<p>Use this page to detail your site's privacy policy.</p>\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Pages/Privacy.cshtml.cs",
    "content": "﻿using Microsoft.AspNetCore.Mvc;\nusing Microsoft.AspNetCore.Mvc.RazorPages;\n\nnamespace WebApplication1.Pages\n{\n    public class PrivacyModel : PageModel\n    {\n        private readonly ILogger<PrivacyModel> _logger;\n\n        public PrivacyModel(ILogger<PrivacyModel> logger)\n        {\n            _logger = logger;\n        }\n\n        public void OnGet()\n        {\n        }\n    }\n}"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Pages/Shared/_Layout.cshtml",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>@ViewData[\"Title\"] - WebApplication1</title>\n    <link rel=\"stylesheet\" href=\"~/lib/bootstrap/dist/css/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"~/css/site.css\" asp-append-version=\"true\" />\n    <link rel=\"stylesheet\" href=\"~/WebApplication1.styles.css\" asp-append-version=\"true\" />\n</head>\n<body>\n    <header>\n        <nav class=\"navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3\">\n            <div class=\"container\">\n                <a class=\"navbar-brand\" asp-area=\"\" asp-page=\"/Index\">WebApplication1</a>\n                <button class=\"navbar-toggler\" type=\"button\" data-bs-toggle=\"collapse\" data-bs-target=\".navbar-collapse\" aria-controls=\"navbarSupportedContent\"\n                        aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                    <span class=\"navbar-toggler-icon\"></span>\n                </button>\n                <div class=\"navbar-collapse collapse d-sm-inline-flex justify-content-between\">\n                    <ul class=\"navbar-nav flex-grow-1\">\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link text-dark\" asp-area=\"\" asp-page=\"/Index\">Home</a>\n                        </li>\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link text-dark\" asp-area=\"\" asp-page=\"/Privacy\">Privacy</a>\n                        </li>\n                    </ul>\n                </div>\n            </div>\n        </nav>\n    </header>\n    <div class=\"container\">\n        <main role=\"main\" class=\"pb-3\">\n            @RenderBody()\n        </main>\n    </div>\n\n    <footer class=\"border-top footer text-muted\">\n        <div class=\"container\">\n            &copy; 2021 - WebApplication1 - <a asp-area=\"\" asp-page=\"/Privacy\">Privacy</a>\n        </div>\n    </footer>\n\n    <script src=\"~/lib/jquery/dist/jquery.min.js\"></script>\n    <script src=\"~/lib/bootstrap/dist/js/bootstrap.bundle.min.js\"></script>\n    <script src=\"~/js/site.js\" asp-append-version=\"true\"></script>\n\n    @await RenderSectionAsync(\"Scripts\", required: false)\n</body>\n</html>"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Pages/Shared/_Layout.cshtml.css",
    "content": "﻿/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\nfor details on configuring this project to bundle and minify static web assets. */\n\na.navbar-brand {\n  white-space: normal;\n  text-align: center;\n  word-break: break-all;\n}\n\na {\n  color: #0077cc;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #1b6ec2;\n  border-color: #1861ac;\n}\n\n.nav-pills .nav-link.active, .nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #1b6ec2;\n  border-color: #1861ac;\n}\n\n.border-top {\n  border-top: 1px solid #e5e5e5;\n}\n.border-bottom {\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.box-shadow {\n  box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);\n}\n\nbutton.accept-policy {\n  font-size: 1rem;\n  line-height: inherit;\n}\n\n.footer {\n  position: absolute;\n  bottom: 0;\n  width: 100%;\n  white-space: nowrap;\n  line-height: 60px;\n}\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Pages/Shared/_ValidationScriptsPartial.cshtml",
    "content": "﻿<script src=\"~/lib/jquery-validation/dist/jquery.validate.min.js\"></script>\n<script src=\"~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js\"></script>\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Pages/_ViewImports.cshtml",
    "content": "﻿@using WebApplication1\n@namespace WebApplication1.Pages\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Pages/_ViewStart.cshtml",
    "content": "﻿@{\n    Layout = \"_Layout\";\n}\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Program.cs",
    "content": "var builder = WebApplication.CreateBuilder(args);\n\n// Add services to the container.\nbuilder.Services.AddRazorPages();\n\nvar app = builder.Build();\n\n// Configure the HTTP request pipeline.\nif (!app.Environment.IsDevelopment())\n{\n    app.UseExceptionHandler(\"/Error\");\n    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.\n    app.UseHsts();\n}\n\napp.UseHttpsRedirection();\napp.UseStaticFiles();\n\napp.UseRouting();\n\napp.UseAuthorization();\n\napp.MapRazorPages();\n\napp.Run();\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/Properties/launchSettings.json",
    "content": "﻿{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:12944\",\n      \"sslPort\": 44318\n    }\n  },\n  \"profiles\": {\n    \"WebApplication1\": {\n      \"commandName\": \"Project\",\n      \"dotnetRunMessages\": true,\n      \"launchBrowser\": true,\n      \"applicationUrl\": \"https://localhost:7055;http://localhost:5055\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/WebApplication1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/appsettings.Development.json",
    "content": "{\n  \"DetailedErrors\": true,\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/css/site.css",
    "content": "html {\n  font-size: 14px;\n}\n\n@media (min-width: 768px) {\n  html {\n    font-size: 16px;\n  }\n}\n\nhtml {\n  position: relative;\n  min-height: 100%;\n}\n\nbody {\n  margin-bottom: 60px;\n}"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/js/site.js",
    "content": "﻿// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\n// for details on configuring this project to bundle and minify static web assets.\n\n// Write your JavaScript code.\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/bootstrap/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2011-2021 Twitter, Inc.\nCopyright (c) 2011-2021 The Bootstrap Authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css",
    "content": "/*!\n * Bootstrap Grid v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n  width: 100%;\n  padding-right: var(--bs-gutter-x, 0.75rem);\n  padding-left: var(--bs-gutter-x, 0.75rem);\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container-sm, .container {\n    max-width: 540px;\n  }\n}\n@media (min-width: 768px) {\n  .container-md, .container-sm, .container {\n    max-width: 720px;\n  }\n}\n@media (min-width: 992px) {\n  .container-lg, .container-md, .container-sm, .container {\n    max-width: 960px;\n  }\n}\n@media (min-width: 1200px) {\n  .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1140px;\n  }\n}\n@media (min-width: 1400px) {\n  .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1320px;\n  }\n}\n.row {\n  --bs-gutter-x: 1.5rem;\n  --bs-gutter-y: 0;\n  display: flex;\n  flex-wrap: wrap;\n  margin-top: calc(var(--bs-gutter-y) * -1);\n  margin-right: calc(var(--bs-gutter-x) * -.5);\n  margin-left: calc(var(--bs-gutter-x) * -.5);\n}\n.row > * {\n  box-sizing: border-box;\n  flex-shrink: 0;\n  width: 100%;\n  max-width: 100%;\n  padding-right: calc(var(--bs-gutter-x) * .5);\n  padding-left: calc(var(--bs-gutter-x) * .5);\n  margin-top: var(--bs-gutter-y);\n}\n\n.col {\n  flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.row-cols-1 > * {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.row-cols-2 > * {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.row-cols-3 > * {\n  flex: 0 0 auto;\n  width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.row-cols-5 > * {\n  flex: 0 0 auto;\n  width: 20%;\n}\n\n.row-cols-6 > * {\n  flex: 0 0 auto;\n  width: 16.6666666667%;\n}\n\n.col-auto {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.col-1 {\n  flex: 0 0 auto;\n  width: 8.33333333%;\n}\n\n.col-2 {\n  flex: 0 0 auto;\n  width: 16.66666667%;\n}\n\n.col-3 {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.col-4 {\n  flex: 0 0 auto;\n  width: 33.33333333%;\n}\n\n.col-5 {\n  flex: 0 0 auto;\n  width: 41.66666667%;\n}\n\n.col-6 {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.col-7 {\n  flex: 0 0 auto;\n  width: 58.33333333%;\n}\n\n.col-8 {\n  flex: 0 0 auto;\n  width: 66.66666667%;\n}\n\n.col-9 {\n  flex: 0 0 auto;\n  width: 75%;\n}\n\n.col-10 {\n  flex: 0 0 auto;\n  width: 83.33333333%;\n}\n\n.col-11 {\n  flex: 0 0 auto;\n  width: 91.66666667%;\n}\n\n.col-12 {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.offset-1 {\n  margin-left: 8.33333333%;\n}\n\n.offset-2 {\n  margin-left: 16.66666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.33333333%;\n}\n\n.offset-5 {\n  margin-left: 41.66666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.33333333%;\n}\n\n.offset-8 {\n  margin-left: 66.66666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.33333333%;\n}\n\n.offset-11 {\n  margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n  --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n  --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n  --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n  --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n  --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n  --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n  --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n  --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n  --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n  --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n  --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n  --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-sm-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-sm-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-sm-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-sm-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-sm-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-sm-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-sm-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-sm-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-sm-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-sm-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-sm-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-sm-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-sm-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-sm-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-sm-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-sm-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-sm-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-sm-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-sm-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-sm-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n\n  .offset-sm-1 {\n    margin-left: 8.33333333%;\n  }\n\n  .offset-sm-2 {\n    margin-left: 16.66666667%;\n  }\n\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n\n  .offset-sm-4 {\n    margin-left: 33.33333333%;\n  }\n\n  .offset-sm-5 {\n    margin-left: 41.66666667%;\n  }\n\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n\n  .offset-sm-7 {\n    margin-left: 58.33333333%;\n  }\n\n  .offset-sm-8 {\n    margin-left: 66.66666667%;\n  }\n\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n\n  .offset-sm-10 {\n    margin-left: 83.33333333%;\n  }\n\n  .offset-sm-11 {\n    margin-left: 91.66666667%;\n  }\n\n  .g-sm-0,\n.gx-sm-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-sm-0,\n.gy-sm-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-sm-1,\n.gx-sm-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-sm-1,\n.gy-sm-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-sm-2,\n.gx-sm-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-sm-2,\n.gy-sm-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-sm-3,\n.gx-sm-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-sm-3,\n.gy-sm-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-sm-4,\n.gx-sm-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-sm-4,\n.gy-sm-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-sm-5,\n.gx-sm-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-sm-5,\n.gy-sm-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 768px) {\n  .col-md {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-md-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-md-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-md-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-md-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-md-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-md-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-md-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-md-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-md-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-md-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-md-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-md-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-md-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-md-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-md-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-md-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-md-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-md-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-md-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-md-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-md-0 {\n    margin-left: 0;\n  }\n\n  .offset-md-1 {\n    margin-left: 8.33333333%;\n  }\n\n  .offset-md-2 {\n    margin-left: 16.66666667%;\n  }\n\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n\n  .offset-md-4 {\n    margin-left: 33.33333333%;\n  }\n\n  .offset-md-5 {\n    margin-left: 41.66666667%;\n  }\n\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n\n  .offset-md-7 {\n    margin-left: 58.33333333%;\n  }\n\n  .offset-md-8 {\n    margin-left: 66.66666667%;\n  }\n\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n\n  .offset-md-10 {\n    margin-left: 83.33333333%;\n  }\n\n  .offset-md-11 {\n    margin-left: 91.66666667%;\n  }\n\n  .g-md-0,\n.gx-md-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-md-0,\n.gy-md-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-md-1,\n.gx-md-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-md-1,\n.gy-md-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-md-2,\n.gx-md-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-md-2,\n.gy-md-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-md-3,\n.gx-md-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-md-3,\n.gy-md-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-md-4,\n.gx-md-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-md-4,\n.gy-md-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-md-5,\n.gx-md-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-md-5,\n.gy-md-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 992px) {\n  .col-lg {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-lg-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-lg-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-lg-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-lg-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-lg-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-lg-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-lg-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-lg-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-lg-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-lg-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-lg-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-lg-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-lg-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-lg-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-lg-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-lg-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-lg-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-lg-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-lg-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-lg-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n\n  .offset-lg-1 {\n    margin-left: 8.33333333%;\n  }\n\n  .offset-lg-2 {\n    margin-left: 16.66666667%;\n  }\n\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n\n  .offset-lg-4 {\n    margin-left: 33.33333333%;\n  }\n\n  .offset-lg-5 {\n    margin-left: 41.66666667%;\n  }\n\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n\n  .offset-lg-7 {\n    margin-left: 58.33333333%;\n  }\n\n  .offset-lg-8 {\n    margin-left: 66.66666667%;\n  }\n\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n\n  .offset-lg-10 {\n    margin-left: 83.33333333%;\n  }\n\n  .offset-lg-11 {\n    margin-left: 91.66666667%;\n  }\n\n  .g-lg-0,\n.gx-lg-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-lg-0,\n.gy-lg-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-lg-1,\n.gx-lg-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-lg-1,\n.gy-lg-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-lg-2,\n.gx-lg-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-lg-2,\n.gy-lg-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-lg-3,\n.gx-lg-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-lg-3,\n.gy-lg-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-lg-4,\n.gx-lg-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-lg-4,\n.gy-lg-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-lg-5,\n.gx-lg-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-lg-5,\n.gy-lg-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1200px) {\n  .col-xl {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-xl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-xl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-xl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-xl-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-xl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-xl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-xl-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-xl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-xl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-xl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-xl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-xl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-xl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-xl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-xl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-xl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-xl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-xl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-xl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-xl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n\n  .offset-xl-1 {\n    margin-left: 8.33333333%;\n  }\n\n  .offset-xl-2 {\n    margin-left: 16.66666667%;\n  }\n\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n\n  .offset-xl-4 {\n    margin-left: 33.33333333%;\n  }\n\n  .offset-xl-5 {\n    margin-left: 41.66666667%;\n  }\n\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n\n  .offset-xl-7 {\n    margin-left: 58.33333333%;\n  }\n\n  .offset-xl-8 {\n    margin-left: 66.66666667%;\n  }\n\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n\n  .offset-xl-10 {\n    margin-left: 83.33333333%;\n  }\n\n  .offset-xl-11 {\n    margin-left: 91.66666667%;\n  }\n\n  .g-xl-0,\n.gx-xl-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-xl-0,\n.gy-xl-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-xl-1,\n.gx-xl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-xl-1,\n.gy-xl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-xl-2,\n.gx-xl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-xl-2,\n.gy-xl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-xl-3,\n.gx-xl-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-xl-3,\n.gy-xl-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-xl-4,\n.gx-xl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-xl-4,\n.gy-xl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-xl-5,\n.gx-xl-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-xl-5,\n.gy-xl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1400px) {\n  .col-xxl {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-xxl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-xxl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-xxl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-xxl-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-xxl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-xxl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-xxl-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-xxl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-xxl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-xxl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-xxl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-xxl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-xxl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-xxl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-xxl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-xxl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-xxl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-xxl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-xxl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-xxl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-xxl-0 {\n    margin-left: 0;\n  }\n\n  .offset-xxl-1 {\n    margin-left: 8.33333333%;\n  }\n\n  .offset-xxl-2 {\n    margin-left: 16.66666667%;\n  }\n\n  .offset-xxl-3 {\n    margin-left: 25%;\n  }\n\n  .offset-xxl-4 {\n    margin-left: 33.33333333%;\n  }\n\n  .offset-xxl-5 {\n    margin-left: 41.66666667%;\n  }\n\n  .offset-xxl-6 {\n    margin-left: 50%;\n  }\n\n  .offset-xxl-7 {\n    margin-left: 58.33333333%;\n  }\n\n  .offset-xxl-8 {\n    margin-left: 66.66666667%;\n  }\n\n  .offset-xxl-9 {\n    margin-left: 75%;\n  }\n\n  .offset-xxl-10 {\n    margin-left: 83.33333333%;\n  }\n\n  .offset-xxl-11 {\n    margin-left: 91.66666667%;\n  }\n\n  .g-xxl-0,\n.gx-xxl-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-xxl-0,\n.gy-xxl-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-xxl-1,\n.gx-xxl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-xxl-1,\n.gy-xxl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-xxl-2,\n.gx-xxl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-xxl-2,\n.gy-xxl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-xxl-3,\n.gx-xxl-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-xxl-3,\n.gy-xxl-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-xxl-4,\n.gx-xxl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-xxl-4,\n.gy-xxl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-xxl-5,\n.gx-xxl-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-xxl-5,\n.gy-xxl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-grid {\n  display: grid !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n.d-none {\n  display: none !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n  justify-content: space-evenly !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n.order-first {\n  order: -1 !important;\n}\n\n.order-0 {\n  order: 0 !important;\n}\n\n.order-1 {\n  order: 1 !important;\n}\n\n.order-2 {\n  order: 2 !important;\n}\n\n.order-3 {\n  order: 3 !important;\n}\n\n.order-4 {\n  order: 4 !important;\n}\n\n.order-5 {\n  order: 5 !important;\n}\n\n.order-last {\n  order: 6 !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mx-0 {\n  margin-right: 0 !important;\n  margin-left: 0 !important;\n}\n\n.mx-1 {\n  margin-right: 0.25rem !important;\n  margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n  margin-right: 0.5rem !important;\n  margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n  margin-right: 1rem !important;\n  margin-left: 1rem !important;\n}\n\n.mx-4 {\n  margin-right: 1.5rem !important;\n  margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n  margin-right: 3rem !important;\n  margin-left: 3rem !important;\n}\n\n.mx-auto {\n  margin-right: auto !important;\n  margin-left: auto !important;\n}\n\n.my-0 {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n.my-1 {\n  margin-top: 0.25rem !important;\n  margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n  margin-top: 0.5rem !important;\n  margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n  margin-top: 1rem !important;\n  margin-bottom: 1rem !important;\n}\n\n.my-4 {\n  margin-top: 1.5rem !important;\n  margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n  margin-top: 3rem !important;\n  margin-bottom: 3rem !important;\n}\n\n.my-auto {\n  margin-top: auto !important;\n  margin-bottom: auto !important;\n}\n\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.mt-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n  margin-top: 1rem !important;\n}\n\n.mt-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n  margin-top: 3rem !important;\n}\n\n.mt-auto {\n  margin-top: auto !important;\n}\n\n.me-0 {\n  margin-right: 0 !important;\n}\n\n.me-1 {\n  margin-right: 0.25rem !important;\n}\n\n.me-2 {\n  margin-right: 0.5rem !important;\n}\n\n.me-3 {\n  margin-right: 1rem !important;\n}\n\n.me-4 {\n  margin-right: 1.5rem !important;\n}\n\n.me-5 {\n  margin-right: 3rem !important;\n}\n\n.me-auto {\n  margin-right: auto !important;\n}\n\n.mb-0 {\n  margin-bottom: 0 !important;\n}\n\n.mb-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n  margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n  margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n  margin-bottom: auto !important;\n}\n\n.ms-0 {\n  margin-left: 0 !important;\n}\n\n.ms-1 {\n  margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n  margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n  margin-left: 1rem !important;\n}\n\n.ms-4 {\n  margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n  margin-left: 3rem !important;\n}\n\n.ms-auto {\n  margin-left: auto !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.px-0 {\n  padding-right: 0 !important;\n  padding-left: 0 !important;\n}\n\n.px-1 {\n  padding-right: 0.25rem !important;\n  padding-left: 0.25rem !important;\n}\n\n.px-2 {\n  padding-right: 0.5rem !important;\n  padding-left: 0.5rem !important;\n}\n\n.px-3 {\n  padding-right: 1rem !important;\n  padding-left: 1rem !important;\n}\n\n.px-4 {\n  padding-right: 1.5rem !important;\n  padding-left: 1.5rem !important;\n}\n\n.px-5 {\n  padding-right: 3rem !important;\n  padding-left: 3rem !important;\n}\n\n.py-0 {\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n.py-1 {\n  padding-top: 0.25rem !important;\n  padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n  padding-top: 0.5rem !important;\n  padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n  padding-top: 1rem !important;\n  padding-bottom: 1rem !important;\n}\n\n.py-4 {\n  padding-top: 1.5rem !important;\n  padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n  padding-top: 3rem !important;\n  padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n  padding-top: 0 !important;\n}\n\n.pt-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n  padding-top: 1rem !important;\n}\n\n.pt-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n  padding-top: 3rem !important;\n}\n\n.pe-0 {\n  padding-right: 0 !important;\n}\n\n.pe-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n  padding-right: 1rem !important;\n}\n\n.pe-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-0 {\n  padding-bottom: 0 !important;\n}\n\n.pb-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n  padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n  padding-left: 0 !important;\n}\n\n.ps-1 {\n  padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n  padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n  padding-left: 1rem !important;\n}\n\n.ps-4 {\n  padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n  padding-left: 3rem !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-inline {\n    display: inline !important;\n  }\n\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-sm-block {\n    display: block !important;\n  }\n\n  .d-sm-grid {\n    display: grid !important;\n  }\n\n  .d-sm-table {\n    display: table !important;\n  }\n\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-sm-flex {\n    display: flex !important;\n  }\n\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-sm-none {\n    display: none !important;\n  }\n\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-sm-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-sm-first {\n    order: -1 !important;\n  }\n\n  .order-sm-0 {\n    order: 0 !important;\n  }\n\n  .order-sm-1 {\n    order: 1 !important;\n  }\n\n  .order-sm-2 {\n    order: 2 !important;\n  }\n\n  .order-sm-3 {\n    order: 3 !important;\n  }\n\n  .order-sm-4 {\n    order: 4 !important;\n  }\n\n  .order-sm-5 {\n    order: 5 !important;\n  }\n\n  .order-sm-last {\n    order: 6 !important;\n  }\n\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n\n  .m-sm-auto {\n    margin: auto !important;\n  }\n\n  .mx-sm-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-sm-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-sm-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-sm-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-sm-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-sm-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-sm-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-sm-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-sm-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-sm-auto {\n    margin-top: auto !important;\n  }\n\n  .me-sm-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-sm-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-sm-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-sm-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-sm-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-sm-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-sm-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-sm-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-sm-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-sm-auto {\n    margin-left: auto !important;\n  }\n\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n\n  .px-sm-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-sm-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-sm-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-sm-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-sm-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-sm-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-sm-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-sm-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-sm-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-sm-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-sm-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-sm-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-sm-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-sm-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-sm-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-sm-5 {\n    padding-left: 3rem !important;\n  }\n}\n@media (min-width: 768px) {\n  .d-md-inline {\n    display: inline !important;\n  }\n\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-md-block {\n    display: block !important;\n  }\n\n  .d-md-grid {\n    display: grid !important;\n  }\n\n  .d-md-table {\n    display: table !important;\n  }\n\n  .d-md-table-row {\n    display: table-row !important;\n  }\n\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-md-flex {\n    display: flex !important;\n  }\n\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-md-none {\n    display: none !important;\n  }\n\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-md-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-md-center {\n    align-items: center !important;\n  }\n\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-md-center {\n    align-content: center !important;\n  }\n\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-md-center {\n    align-self: center !important;\n  }\n\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-md-first {\n    order: -1 !important;\n  }\n\n  .order-md-0 {\n    order: 0 !important;\n  }\n\n  .order-md-1 {\n    order: 1 !important;\n  }\n\n  .order-md-2 {\n    order: 2 !important;\n  }\n\n  .order-md-3 {\n    order: 3 !important;\n  }\n\n  .order-md-4 {\n    order: 4 !important;\n  }\n\n  .order-md-5 {\n    order: 5 !important;\n  }\n\n  .order-md-last {\n    order: 6 !important;\n  }\n\n  .m-md-0 {\n    margin: 0 !important;\n  }\n\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n\n  .m-md-auto {\n    margin: auto !important;\n  }\n\n  .mx-md-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-md-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-md-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-md-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-md-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-md-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-md-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-md-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-md-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-md-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-md-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-md-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-md-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-md-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-md-auto {\n    margin-top: auto !important;\n  }\n\n  .me-md-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-md-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-md-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-md-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-md-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-md-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-md-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-md-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-md-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-md-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-md-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-md-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-md-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-md-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-md-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-md-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-md-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-md-auto {\n    margin-left: auto !important;\n  }\n\n  .p-md-0 {\n    padding: 0 !important;\n  }\n\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n\n  .px-md-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-md-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-md-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-md-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-md-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-md-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-md-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-md-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-md-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-md-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-md-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-md-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-md-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-md-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-md-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-md-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-md-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-md-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-md-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-md-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-md-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-md-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-md-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-md-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-md-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-md-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-md-5 {\n    padding-left: 3rem !important;\n  }\n}\n@media (min-width: 992px) {\n  .d-lg-inline {\n    display: inline !important;\n  }\n\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-lg-block {\n    display: block !important;\n  }\n\n  .d-lg-grid {\n    display: grid !important;\n  }\n\n  .d-lg-table {\n    display: table !important;\n  }\n\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-lg-flex {\n    display: flex !important;\n  }\n\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-lg-none {\n    display: none !important;\n  }\n\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-lg-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-lg-first {\n    order: -1 !important;\n  }\n\n  .order-lg-0 {\n    order: 0 !important;\n  }\n\n  .order-lg-1 {\n    order: 1 !important;\n  }\n\n  .order-lg-2 {\n    order: 2 !important;\n  }\n\n  .order-lg-3 {\n    order: 3 !important;\n  }\n\n  .order-lg-4 {\n    order: 4 !important;\n  }\n\n  .order-lg-5 {\n    order: 5 !important;\n  }\n\n  .order-lg-last {\n    order: 6 !important;\n  }\n\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n\n  .m-lg-auto {\n    margin: auto !important;\n  }\n\n  .mx-lg-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-lg-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-lg-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-lg-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-lg-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-lg-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-lg-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-lg-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-lg-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-lg-auto {\n    margin-top: auto !important;\n  }\n\n  .me-lg-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-lg-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-lg-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-lg-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-lg-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-lg-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-lg-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-lg-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-lg-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-lg-auto {\n    margin-left: auto !important;\n  }\n\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n\n  .px-lg-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-lg-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-lg-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-lg-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-lg-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-lg-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-lg-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-lg-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-lg-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-lg-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-lg-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-lg-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-lg-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-lg-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-lg-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-lg-5 {\n    padding-left: 3rem !important;\n  }\n}\n@media (min-width: 1200px) {\n  .d-xl-inline {\n    display: inline !important;\n  }\n\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-xl-block {\n    display: block !important;\n  }\n\n  .d-xl-grid {\n    display: grid !important;\n  }\n\n  .d-xl-table {\n    display: table !important;\n  }\n\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-xl-flex {\n    display: flex !important;\n  }\n\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-xl-none {\n    display: none !important;\n  }\n\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-xl-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-xl-first {\n    order: -1 !important;\n  }\n\n  .order-xl-0 {\n    order: 0 !important;\n  }\n\n  .order-xl-1 {\n    order: 1 !important;\n  }\n\n  .order-xl-2 {\n    order: 2 !important;\n  }\n\n  .order-xl-3 {\n    order: 3 !important;\n  }\n\n  .order-xl-4 {\n    order: 4 !important;\n  }\n\n  .order-xl-5 {\n    order: 5 !important;\n  }\n\n  .order-xl-last {\n    order: 6 !important;\n  }\n\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n\n  .m-xl-auto {\n    margin: auto !important;\n  }\n\n  .mx-xl-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-xl-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-xl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-xl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-xl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-xl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-xl-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-xl-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-xl-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-xl-auto {\n    margin-top: auto !important;\n  }\n\n  .me-xl-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-xl-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-xl-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-xl-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-xl-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-xl-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-xl-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-xl-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-xl-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-xl-auto {\n    margin-left: auto !important;\n  }\n\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n\n  .px-xl-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-xl-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-xl-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-xl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-xl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-xl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-xl-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-xl-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-xl-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-xl-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-xl-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-xl-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-xl-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-xl-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-xl-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-xl-5 {\n    padding-left: 3rem !important;\n  }\n}\n@media (min-width: 1400px) {\n  .d-xxl-inline {\n    display: inline !important;\n  }\n\n  .d-xxl-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-xxl-block {\n    display: block !important;\n  }\n\n  .d-xxl-grid {\n    display: grid !important;\n  }\n\n  .d-xxl-table {\n    display: table !important;\n  }\n\n  .d-xxl-table-row {\n    display: table-row !important;\n  }\n\n  .d-xxl-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-xxl-flex {\n    display: flex !important;\n  }\n\n  .d-xxl-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-xxl-none {\n    display: none !important;\n  }\n\n  .flex-xxl-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-xxl-row {\n    flex-direction: row !important;\n  }\n\n  .flex-xxl-column {\n    flex-direction: column !important;\n  }\n\n  .flex-xxl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-xxl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-xxl-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-xxl-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-xxl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-xxl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-xxl-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-xxl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-xxl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .justify-content-xxl-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-xxl-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-xxl-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-xxl-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-xxl-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-xxl-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-xxl-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-xxl-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-xxl-center {\n    align-items: center !important;\n  }\n\n  .align-items-xxl-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-xxl-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-xxl-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-xxl-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-xxl-center {\n    align-content: center !important;\n  }\n\n  .align-content-xxl-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-xxl-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-xxl-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-xxl-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-xxl-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-xxl-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-xxl-center {\n    align-self: center !important;\n  }\n\n  .align-self-xxl-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-xxl-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-xxl-first {\n    order: -1 !important;\n  }\n\n  .order-xxl-0 {\n    order: 0 !important;\n  }\n\n  .order-xxl-1 {\n    order: 1 !important;\n  }\n\n  .order-xxl-2 {\n    order: 2 !important;\n  }\n\n  .order-xxl-3 {\n    order: 3 !important;\n  }\n\n  .order-xxl-4 {\n    order: 4 !important;\n  }\n\n  .order-xxl-5 {\n    order: 5 !important;\n  }\n\n  .order-xxl-last {\n    order: 6 !important;\n  }\n\n  .m-xxl-0 {\n    margin: 0 !important;\n  }\n\n  .m-xxl-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-xxl-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-xxl-3 {\n    margin: 1rem !important;\n  }\n\n  .m-xxl-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-xxl-5 {\n    margin: 3rem !important;\n  }\n\n  .m-xxl-auto {\n    margin: auto !important;\n  }\n\n  .mx-xxl-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-xxl-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-xxl-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-xxl-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-xxl-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-xxl-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-xxl-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-xxl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-xxl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-xxl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-xxl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-xxl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-xxl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-xxl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-xxl-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-xxl-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-xxl-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-xxl-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-xxl-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-xxl-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-xxl-auto {\n    margin-top: auto !important;\n  }\n\n  .me-xxl-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-xxl-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-xxl-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-xxl-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-xxl-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-xxl-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-xxl-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-xxl-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-xxl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-xxl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-xxl-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-xxl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-xxl-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-xxl-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-xxl-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-xxl-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-xxl-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-xxl-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-xxl-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-xxl-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-xxl-auto {\n    margin-left: auto !important;\n  }\n\n  .p-xxl-0 {\n    padding: 0 !important;\n  }\n\n  .p-xxl-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-xxl-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-xxl-3 {\n    padding: 1rem !important;\n  }\n\n  .p-xxl-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-xxl-5 {\n    padding: 3rem !important;\n  }\n\n  .px-xxl-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-xxl-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-xxl-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-xxl-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-xxl-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-xxl-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-xxl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-xxl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-xxl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-xxl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-xxl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-xxl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-xxl-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-xxl-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-xxl-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-xxl-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-xxl-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-xxl-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-xxl-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-xxl-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-xxl-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-xxl-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-xxl-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-xxl-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-xxl-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-xxl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-xxl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-xxl-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-xxl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-xxl-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-xxl-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-xxl-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-xxl-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-xxl-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-xxl-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-xxl-5 {\n    padding-left: 3rem !important;\n  }\n}\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-print-block {\n    display: block !important;\n  }\n\n  .d-print-grid {\n    display: grid !important;\n  }\n\n  .d-print-table {\n    display: table !important;\n  }\n\n  .d-print-table-row {\n    display: table-row !important;\n  }\n\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-print-flex {\n    display: flex !important;\n  }\n\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-print-none {\n    display: none !important;\n  }\n}\n\n/*# sourceMappingURL=bootstrap-grid.css.map */"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.rtl.css",
    "content": "/*!\n * Bootstrap Grid v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n  width: 100%;\n  padding-left: var(--bs-gutter-x, 0.75rem);\n  padding-right: var(--bs-gutter-x, 0.75rem);\n  margin-left: auto;\n  margin-right: auto;\n}\n\n@media (min-width: 576px) {\n  .container-sm, .container {\n    max-width: 540px;\n  }\n}\n@media (min-width: 768px) {\n  .container-md, .container-sm, .container {\n    max-width: 720px;\n  }\n}\n@media (min-width: 992px) {\n  .container-lg, .container-md, .container-sm, .container {\n    max-width: 960px;\n  }\n}\n@media (min-width: 1200px) {\n  .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1140px;\n  }\n}\n@media (min-width: 1400px) {\n  .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1320px;\n  }\n}\n.row {\n  --bs-gutter-x: 1.5rem;\n  --bs-gutter-y: 0;\n  display: flex;\n  flex-wrap: wrap;\n  margin-top: calc(var(--bs-gutter-y) * -1);\n  margin-left: calc(var(--bs-gutter-x) * -.5);\n  margin-right: calc(var(--bs-gutter-x) * -.5);\n}\n.row > * {\n  box-sizing: border-box;\n  flex-shrink: 0;\n  width: 100%;\n  max-width: 100%;\n  padding-left: calc(var(--bs-gutter-x) * .5);\n  padding-right: calc(var(--bs-gutter-x) * .5);\n  margin-top: var(--bs-gutter-y);\n}\n\n.col {\n  flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.row-cols-1 > * {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.row-cols-2 > * {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.row-cols-3 > * {\n  flex: 0 0 auto;\n  width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.row-cols-5 > * {\n  flex: 0 0 auto;\n  width: 20%;\n}\n\n.row-cols-6 > * {\n  flex: 0 0 auto;\n  width: 16.6666666667%;\n}\n\n.col-auto {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.col-1 {\n  flex: 0 0 auto;\n  width: 8.33333333%;\n}\n\n.col-2 {\n  flex: 0 0 auto;\n  width: 16.66666667%;\n}\n\n.col-3 {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.col-4 {\n  flex: 0 0 auto;\n  width: 33.33333333%;\n}\n\n.col-5 {\n  flex: 0 0 auto;\n  width: 41.66666667%;\n}\n\n.col-6 {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.col-7 {\n  flex: 0 0 auto;\n  width: 58.33333333%;\n}\n\n.col-8 {\n  flex: 0 0 auto;\n  width: 66.66666667%;\n}\n\n.col-9 {\n  flex: 0 0 auto;\n  width: 75%;\n}\n\n.col-10 {\n  flex: 0 0 auto;\n  width: 83.33333333%;\n}\n\n.col-11 {\n  flex: 0 0 auto;\n  width: 91.66666667%;\n}\n\n.col-12 {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.offset-1 {\n  margin-right: 8.33333333%;\n}\n\n.offset-2 {\n  margin-right: 16.66666667%;\n}\n\n.offset-3 {\n  margin-right: 25%;\n}\n\n.offset-4 {\n  margin-right: 33.33333333%;\n}\n\n.offset-5 {\n  margin-right: 41.66666667%;\n}\n\n.offset-6 {\n  margin-right: 50%;\n}\n\n.offset-7 {\n  margin-right: 58.33333333%;\n}\n\n.offset-8 {\n  margin-right: 66.66666667%;\n}\n\n.offset-9 {\n  margin-right: 75%;\n}\n\n.offset-10 {\n  margin-right: 83.33333333%;\n}\n\n.offset-11 {\n  margin-right: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n  --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n  --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n  --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n  --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n  --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n  --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n  --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n  --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n  --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n  --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n  --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n  --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-sm-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-sm-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-sm-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-sm-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-sm-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-sm-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-sm-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-sm-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-sm-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-sm-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-sm-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-sm-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-sm-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-sm-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-sm-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-sm-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-sm-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-sm-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-sm-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-sm-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-sm-0 {\n    margin-right: 0;\n  }\n\n  .offset-sm-1 {\n    margin-right: 8.33333333%;\n  }\n\n  .offset-sm-2 {\n    margin-right: 16.66666667%;\n  }\n\n  .offset-sm-3 {\n    margin-right: 25%;\n  }\n\n  .offset-sm-4 {\n    margin-right: 33.33333333%;\n  }\n\n  .offset-sm-5 {\n    margin-right: 41.66666667%;\n  }\n\n  .offset-sm-6 {\n    margin-right: 50%;\n  }\n\n  .offset-sm-7 {\n    margin-right: 58.33333333%;\n  }\n\n  .offset-sm-8 {\n    margin-right: 66.66666667%;\n  }\n\n  .offset-sm-9 {\n    margin-right: 75%;\n  }\n\n  .offset-sm-10 {\n    margin-right: 83.33333333%;\n  }\n\n  .offset-sm-11 {\n    margin-right: 91.66666667%;\n  }\n\n  .g-sm-0,\n.gx-sm-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-sm-0,\n.gy-sm-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-sm-1,\n.gx-sm-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-sm-1,\n.gy-sm-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-sm-2,\n.gx-sm-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-sm-2,\n.gy-sm-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-sm-3,\n.gx-sm-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-sm-3,\n.gy-sm-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-sm-4,\n.gx-sm-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-sm-4,\n.gy-sm-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-sm-5,\n.gx-sm-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-sm-5,\n.gy-sm-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 768px) {\n  .col-md {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-md-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-md-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-md-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-md-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-md-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-md-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-md-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-md-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-md-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-md-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-md-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-md-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-md-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-md-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-md-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-md-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-md-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-md-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-md-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-md-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-md-0 {\n    margin-right: 0;\n  }\n\n  .offset-md-1 {\n    margin-right: 8.33333333%;\n  }\n\n  .offset-md-2 {\n    margin-right: 16.66666667%;\n  }\n\n  .offset-md-3 {\n    margin-right: 25%;\n  }\n\n  .offset-md-4 {\n    margin-right: 33.33333333%;\n  }\n\n  .offset-md-5 {\n    margin-right: 41.66666667%;\n  }\n\n  .offset-md-6 {\n    margin-right: 50%;\n  }\n\n  .offset-md-7 {\n    margin-right: 58.33333333%;\n  }\n\n  .offset-md-8 {\n    margin-right: 66.66666667%;\n  }\n\n  .offset-md-9 {\n    margin-right: 75%;\n  }\n\n  .offset-md-10 {\n    margin-right: 83.33333333%;\n  }\n\n  .offset-md-11 {\n    margin-right: 91.66666667%;\n  }\n\n  .g-md-0,\n.gx-md-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-md-0,\n.gy-md-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-md-1,\n.gx-md-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-md-1,\n.gy-md-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-md-2,\n.gx-md-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-md-2,\n.gy-md-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-md-3,\n.gx-md-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-md-3,\n.gy-md-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-md-4,\n.gx-md-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-md-4,\n.gy-md-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-md-5,\n.gx-md-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-md-5,\n.gy-md-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 992px) {\n  .col-lg {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-lg-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-lg-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-lg-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-lg-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-lg-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-lg-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-lg-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-lg-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-lg-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-lg-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-lg-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-lg-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-lg-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-lg-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-lg-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-lg-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-lg-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-lg-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-lg-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-lg-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-lg-0 {\n    margin-right: 0;\n  }\n\n  .offset-lg-1 {\n    margin-right: 8.33333333%;\n  }\n\n  .offset-lg-2 {\n    margin-right: 16.66666667%;\n  }\n\n  .offset-lg-3 {\n    margin-right: 25%;\n  }\n\n  .offset-lg-4 {\n    margin-right: 33.33333333%;\n  }\n\n  .offset-lg-5 {\n    margin-right: 41.66666667%;\n  }\n\n  .offset-lg-6 {\n    margin-right: 50%;\n  }\n\n  .offset-lg-7 {\n    margin-right: 58.33333333%;\n  }\n\n  .offset-lg-8 {\n    margin-right: 66.66666667%;\n  }\n\n  .offset-lg-9 {\n    margin-right: 75%;\n  }\n\n  .offset-lg-10 {\n    margin-right: 83.33333333%;\n  }\n\n  .offset-lg-11 {\n    margin-right: 91.66666667%;\n  }\n\n  .g-lg-0,\n.gx-lg-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-lg-0,\n.gy-lg-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-lg-1,\n.gx-lg-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-lg-1,\n.gy-lg-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-lg-2,\n.gx-lg-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-lg-2,\n.gy-lg-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-lg-3,\n.gx-lg-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-lg-3,\n.gy-lg-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-lg-4,\n.gx-lg-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-lg-4,\n.gy-lg-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-lg-5,\n.gx-lg-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-lg-5,\n.gy-lg-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1200px) {\n  .col-xl {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-xl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-xl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-xl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-xl-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-xl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-xl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-xl-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-xl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-xl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-xl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-xl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-xl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-xl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-xl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-xl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-xl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-xl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-xl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-xl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-xl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-xl-0 {\n    margin-right: 0;\n  }\n\n  .offset-xl-1 {\n    margin-right: 8.33333333%;\n  }\n\n  .offset-xl-2 {\n    margin-right: 16.66666667%;\n  }\n\n  .offset-xl-3 {\n    margin-right: 25%;\n  }\n\n  .offset-xl-4 {\n    margin-right: 33.33333333%;\n  }\n\n  .offset-xl-5 {\n    margin-right: 41.66666667%;\n  }\n\n  .offset-xl-6 {\n    margin-right: 50%;\n  }\n\n  .offset-xl-7 {\n    margin-right: 58.33333333%;\n  }\n\n  .offset-xl-8 {\n    margin-right: 66.66666667%;\n  }\n\n  .offset-xl-9 {\n    margin-right: 75%;\n  }\n\n  .offset-xl-10 {\n    margin-right: 83.33333333%;\n  }\n\n  .offset-xl-11 {\n    margin-right: 91.66666667%;\n  }\n\n  .g-xl-0,\n.gx-xl-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-xl-0,\n.gy-xl-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-xl-1,\n.gx-xl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-xl-1,\n.gy-xl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-xl-2,\n.gx-xl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-xl-2,\n.gy-xl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-xl-3,\n.gx-xl-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-xl-3,\n.gy-xl-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-xl-4,\n.gx-xl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-xl-4,\n.gy-xl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-xl-5,\n.gx-xl-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-xl-5,\n.gy-xl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1400px) {\n  .col-xxl {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-xxl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-xxl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-xxl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-xxl-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-xxl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-xxl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-xxl-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-xxl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-xxl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-xxl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-xxl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-xxl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-xxl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-xxl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-xxl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-xxl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-xxl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-xxl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-xxl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-xxl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-xxl-0 {\n    margin-right: 0;\n  }\n\n  .offset-xxl-1 {\n    margin-right: 8.33333333%;\n  }\n\n  .offset-xxl-2 {\n    margin-right: 16.66666667%;\n  }\n\n  .offset-xxl-3 {\n    margin-right: 25%;\n  }\n\n  .offset-xxl-4 {\n    margin-right: 33.33333333%;\n  }\n\n  .offset-xxl-5 {\n    margin-right: 41.66666667%;\n  }\n\n  .offset-xxl-6 {\n    margin-right: 50%;\n  }\n\n  .offset-xxl-7 {\n    margin-right: 58.33333333%;\n  }\n\n  .offset-xxl-8 {\n    margin-right: 66.66666667%;\n  }\n\n  .offset-xxl-9 {\n    margin-right: 75%;\n  }\n\n  .offset-xxl-10 {\n    margin-right: 83.33333333%;\n  }\n\n  .offset-xxl-11 {\n    margin-right: 91.66666667%;\n  }\n\n  .g-xxl-0,\n.gx-xxl-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-xxl-0,\n.gy-xxl-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-xxl-1,\n.gx-xxl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-xxl-1,\n.gy-xxl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-xxl-2,\n.gx-xxl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-xxl-2,\n.gy-xxl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-xxl-3,\n.gx-xxl-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-xxl-3,\n.gy-xxl-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-xxl-4,\n.gx-xxl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-xxl-4,\n.gy-xxl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-xxl-5,\n.gx-xxl-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-xxl-5,\n.gy-xxl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-grid {\n  display: grid !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n.d-none {\n  display: none !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n  justify-content: space-evenly !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n.order-first {\n  order: -1 !important;\n}\n\n.order-0 {\n  order: 0 !important;\n}\n\n.order-1 {\n  order: 1 !important;\n}\n\n.order-2 {\n  order: 2 !important;\n}\n\n.order-3 {\n  order: 3 !important;\n}\n\n.order-4 {\n  order: 4 !important;\n}\n\n.order-5 {\n  order: 5 !important;\n}\n\n.order-last {\n  order: 6 !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mx-0 {\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n}\n\n.mx-1 {\n  margin-left: 0.25rem !important;\n  margin-right: 0.25rem !important;\n}\n\n.mx-2 {\n  margin-left: 0.5rem !important;\n  margin-right: 0.5rem !important;\n}\n\n.mx-3 {\n  margin-left: 1rem !important;\n  margin-right: 1rem !important;\n}\n\n.mx-4 {\n  margin-left: 1.5rem !important;\n  margin-right: 1.5rem !important;\n}\n\n.mx-5 {\n  margin-left: 3rem !important;\n  margin-right: 3rem !important;\n}\n\n.mx-auto {\n  margin-left: auto !important;\n  margin-right: auto !important;\n}\n\n.my-0 {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n.my-1 {\n  margin-top: 0.25rem !important;\n  margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n  margin-top: 0.5rem !important;\n  margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n  margin-top: 1rem !important;\n  margin-bottom: 1rem !important;\n}\n\n.my-4 {\n  margin-top: 1.5rem !important;\n  margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n  margin-top: 3rem !important;\n  margin-bottom: 3rem !important;\n}\n\n.my-auto {\n  margin-top: auto !important;\n  margin-bottom: auto !important;\n}\n\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.mt-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n  margin-top: 1rem !important;\n}\n\n.mt-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n  margin-top: 3rem !important;\n}\n\n.mt-auto {\n  margin-top: auto !important;\n}\n\n.me-0 {\n  margin-left: 0 !important;\n}\n\n.me-1 {\n  margin-left: 0.25rem !important;\n}\n\n.me-2 {\n  margin-left: 0.5rem !important;\n}\n\n.me-3 {\n  margin-left: 1rem !important;\n}\n\n.me-4 {\n  margin-left: 1.5rem !important;\n}\n\n.me-5 {\n  margin-left: 3rem !important;\n}\n\n.me-auto {\n  margin-left: auto !important;\n}\n\n.mb-0 {\n  margin-bottom: 0 !important;\n}\n\n.mb-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n  margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n  margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n  margin-bottom: auto !important;\n}\n\n.ms-0 {\n  margin-right: 0 !important;\n}\n\n.ms-1 {\n  margin-right: 0.25rem !important;\n}\n\n.ms-2 {\n  margin-right: 0.5rem !important;\n}\n\n.ms-3 {\n  margin-right: 1rem !important;\n}\n\n.ms-4 {\n  margin-right: 1.5rem !important;\n}\n\n.ms-5 {\n  margin-right: 3rem !important;\n}\n\n.ms-auto {\n  margin-right: auto !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.px-0 {\n  padding-left: 0 !important;\n  padding-right: 0 !important;\n}\n\n.px-1 {\n  padding-left: 0.25rem !important;\n  padding-right: 0.25rem !important;\n}\n\n.px-2 {\n  padding-left: 0.5rem !important;\n  padding-right: 0.5rem !important;\n}\n\n.px-3 {\n  padding-left: 1rem !important;\n  padding-right: 1rem !important;\n}\n\n.px-4 {\n  padding-left: 1.5rem !important;\n  padding-right: 1.5rem !important;\n}\n\n.px-5 {\n  padding-left: 3rem !important;\n  padding-right: 3rem !important;\n}\n\n.py-0 {\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n.py-1 {\n  padding-top: 0.25rem !important;\n  padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n  padding-top: 0.5rem !important;\n  padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n  padding-top: 1rem !important;\n  padding-bottom: 1rem !important;\n}\n\n.py-4 {\n  padding-top: 1.5rem !important;\n  padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n  padding-top: 3rem !important;\n  padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n  padding-top: 0 !important;\n}\n\n.pt-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n  padding-top: 1rem !important;\n}\n\n.pt-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n  padding-top: 3rem !important;\n}\n\n.pe-0 {\n  padding-left: 0 !important;\n}\n\n.pe-1 {\n  padding-left: 0.25rem !important;\n}\n\n.pe-2 {\n  padding-left: 0.5rem !important;\n}\n\n.pe-3 {\n  padding-left: 1rem !important;\n}\n\n.pe-4 {\n  padding-left: 1.5rem !important;\n}\n\n.pe-5 {\n  padding-left: 3rem !important;\n}\n\n.pb-0 {\n  padding-bottom: 0 !important;\n}\n\n.pb-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n  padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n  padding-right: 0 !important;\n}\n\n.ps-1 {\n  padding-right: 0.25rem !important;\n}\n\n.ps-2 {\n  padding-right: 0.5rem !important;\n}\n\n.ps-3 {\n  padding-right: 1rem !important;\n}\n\n.ps-4 {\n  padding-right: 1.5rem !important;\n}\n\n.ps-5 {\n  padding-right: 3rem !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-inline {\n    display: inline !important;\n  }\n\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-sm-block {\n    display: block !important;\n  }\n\n  .d-sm-grid {\n    display: grid !important;\n  }\n\n  .d-sm-table {\n    display: table !important;\n  }\n\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-sm-flex {\n    display: flex !important;\n  }\n\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-sm-none {\n    display: none !important;\n  }\n\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-sm-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-sm-first {\n    order: -1 !important;\n  }\n\n  .order-sm-0 {\n    order: 0 !important;\n  }\n\n  .order-sm-1 {\n    order: 1 !important;\n  }\n\n  .order-sm-2 {\n    order: 2 !important;\n  }\n\n  .order-sm-3 {\n    order: 3 !important;\n  }\n\n  .order-sm-4 {\n    order: 4 !important;\n  }\n\n  .order-sm-5 {\n    order: 5 !important;\n  }\n\n  .order-sm-last {\n    order: 6 !important;\n  }\n\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n\n  .m-sm-auto {\n    margin: auto !important;\n  }\n\n  .mx-sm-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-sm-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-sm-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-sm-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-sm-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-sm-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-sm-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-sm-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-sm-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-sm-auto {\n    margin-top: auto !important;\n  }\n\n  .me-sm-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-sm-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-sm-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-sm-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-sm-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-sm-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-sm-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-sm-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-sm-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-sm-auto {\n    margin-right: auto !important;\n  }\n\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n\n  .px-sm-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-sm-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-sm-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-sm-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-sm-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-sm-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-sm-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-sm-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-sm-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-sm-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-sm-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-sm-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-sm-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-sm-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-sm-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-sm-5 {\n    padding-right: 3rem !important;\n  }\n}\n@media (min-width: 768px) {\n  .d-md-inline {\n    display: inline !important;\n  }\n\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-md-block {\n    display: block !important;\n  }\n\n  .d-md-grid {\n    display: grid !important;\n  }\n\n  .d-md-table {\n    display: table !important;\n  }\n\n  .d-md-table-row {\n    display: table-row !important;\n  }\n\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-md-flex {\n    display: flex !important;\n  }\n\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-md-none {\n    display: none !important;\n  }\n\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-md-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-md-center {\n    align-items: center !important;\n  }\n\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-md-center {\n    align-content: center !important;\n  }\n\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-md-center {\n    align-self: center !important;\n  }\n\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-md-first {\n    order: -1 !important;\n  }\n\n  .order-md-0 {\n    order: 0 !important;\n  }\n\n  .order-md-1 {\n    order: 1 !important;\n  }\n\n  .order-md-2 {\n    order: 2 !important;\n  }\n\n  .order-md-3 {\n    order: 3 !important;\n  }\n\n  .order-md-4 {\n    order: 4 !important;\n  }\n\n  .order-md-5 {\n    order: 5 !important;\n  }\n\n  .order-md-last {\n    order: 6 !important;\n  }\n\n  .m-md-0 {\n    margin: 0 !important;\n  }\n\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n\n  .m-md-auto {\n    margin: auto !important;\n  }\n\n  .mx-md-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-md-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-md-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-md-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-md-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-md-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-md-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-md-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-md-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-md-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-md-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-md-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-md-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-md-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-md-auto {\n    margin-top: auto !important;\n  }\n\n  .me-md-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-md-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-md-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-md-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-md-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-md-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-md-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-md-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-md-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-md-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-md-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-md-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-md-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-md-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-md-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-md-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-md-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-md-auto {\n    margin-right: auto !important;\n  }\n\n  .p-md-0 {\n    padding: 0 !important;\n  }\n\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n\n  .px-md-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-md-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-md-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-md-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-md-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-md-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-md-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-md-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-md-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-md-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-md-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-md-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-md-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-md-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-md-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-md-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-md-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-md-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-md-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-md-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-md-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-md-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-md-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-md-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-md-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-md-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-md-5 {\n    padding-right: 3rem !important;\n  }\n}\n@media (min-width: 992px) {\n  .d-lg-inline {\n    display: inline !important;\n  }\n\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-lg-block {\n    display: block !important;\n  }\n\n  .d-lg-grid {\n    display: grid !important;\n  }\n\n  .d-lg-table {\n    display: table !important;\n  }\n\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-lg-flex {\n    display: flex !important;\n  }\n\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-lg-none {\n    display: none !important;\n  }\n\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-lg-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-lg-first {\n    order: -1 !important;\n  }\n\n  .order-lg-0 {\n    order: 0 !important;\n  }\n\n  .order-lg-1 {\n    order: 1 !important;\n  }\n\n  .order-lg-2 {\n    order: 2 !important;\n  }\n\n  .order-lg-3 {\n    order: 3 !important;\n  }\n\n  .order-lg-4 {\n    order: 4 !important;\n  }\n\n  .order-lg-5 {\n    order: 5 !important;\n  }\n\n  .order-lg-last {\n    order: 6 !important;\n  }\n\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n\n  .m-lg-auto {\n    margin: auto !important;\n  }\n\n  .mx-lg-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-lg-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-lg-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-lg-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-lg-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-lg-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-lg-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-lg-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-lg-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-lg-auto {\n    margin-top: auto !important;\n  }\n\n  .me-lg-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-lg-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-lg-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-lg-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-lg-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-lg-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-lg-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-lg-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-lg-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-lg-auto {\n    margin-right: auto !important;\n  }\n\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n\n  .px-lg-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-lg-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-lg-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-lg-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-lg-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-lg-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-lg-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-lg-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-lg-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-lg-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-lg-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-lg-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-lg-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-lg-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-lg-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-lg-5 {\n    padding-right: 3rem !important;\n  }\n}\n@media (min-width: 1200px) {\n  .d-xl-inline {\n    display: inline !important;\n  }\n\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-xl-block {\n    display: block !important;\n  }\n\n  .d-xl-grid {\n    display: grid !important;\n  }\n\n  .d-xl-table {\n    display: table !important;\n  }\n\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-xl-flex {\n    display: flex !important;\n  }\n\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-xl-none {\n    display: none !important;\n  }\n\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-xl-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-xl-first {\n    order: -1 !important;\n  }\n\n  .order-xl-0 {\n    order: 0 !important;\n  }\n\n  .order-xl-1 {\n    order: 1 !important;\n  }\n\n  .order-xl-2 {\n    order: 2 !important;\n  }\n\n  .order-xl-3 {\n    order: 3 !important;\n  }\n\n  .order-xl-4 {\n    order: 4 !important;\n  }\n\n  .order-xl-5 {\n    order: 5 !important;\n  }\n\n  .order-xl-last {\n    order: 6 !important;\n  }\n\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n\n  .m-xl-auto {\n    margin: auto !important;\n  }\n\n  .mx-xl-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-xl-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-xl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-xl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-xl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-xl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-xl-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-xl-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-xl-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-xl-auto {\n    margin-top: auto !important;\n  }\n\n  .me-xl-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-xl-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-xl-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-xl-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-xl-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-xl-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-xl-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-xl-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-xl-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-xl-auto {\n    margin-right: auto !important;\n  }\n\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n\n  .px-xl-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-xl-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-xl-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-xl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-xl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-xl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-xl-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-xl-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-xl-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-xl-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-xl-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-xl-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-xl-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-xl-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-xl-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-xl-5 {\n    padding-right: 3rem !important;\n  }\n}\n@media (min-width: 1400px) {\n  .d-xxl-inline {\n    display: inline !important;\n  }\n\n  .d-xxl-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-xxl-block {\n    display: block !important;\n  }\n\n  .d-xxl-grid {\n    display: grid !important;\n  }\n\n  .d-xxl-table {\n    display: table !important;\n  }\n\n  .d-xxl-table-row {\n    display: table-row !important;\n  }\n\n  .d-xxl-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-xxl-flex {\n    display: flex !important;\n  }\n\n  .d-xxl-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-xxl-none {\n    display: none !important;\n  }\n\n  .flex-xxl-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-xxl-row {\n    flex-direction: row !important;\n  }\n\n  .flex-xxl-column {\n    flex-direction: column !important;\n  }\n\n  .flex-xxl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-xxl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-xxl-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-xxl-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-xxl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-xxl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-xxl-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-xxl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-xxl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .justify-content-xxl-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-xxl-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-xxl-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-xxl-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-xxl-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-xxl-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-xxl-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-xxl-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-xxl-center {\n    align-items: center !important;\n  }\n\n  .align-items-xxl-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-xxl-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-xxl-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-xxl-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-xxl-center {\n    align-content: center !important;\n  }\n\n  .align-content-xxl-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-xxl-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-xxl-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-xxl-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-xxl-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-xxl-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-xxl-center {\n    align-self: center !important;\n  }\n\n  .align-self-xxl-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-xxl-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-xxl-first {\n    order: -1 !important;\n  }\n\n  .order-xxl-0 {\n    order: 0 !important;\n  }\n\n  .order-xxl-1 {\n    order: 1 !important;\n  }\n\n  .order-xxl-2 {\n    order: 2 !important;\n  }\n\n  .order-xxl-3 {\n    order: 3 !important;\n  }\n\n  .order-xxl-4 {\n    order: 4 !important;\n  }\n\n  .order-xxl-5 {\n    order: 5 !important;\n  }\n\n  .order-xxl-last {\n    order: 6 !important;\n  }\n\n  .m-xxl-0 {\n    margin: 0 !important;\n  }\n\n  .m-xxl-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-xxl-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-xxl-3 {\n    margin: 1rem !important;\n  }\n\n  .m-xxl-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-xxl-5 {\n    margin: 3rem !important;\n  }\n\n  .m-xxl-auto {\n    margin: auto !important;\n  }\n\n  .mx-xxl-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-xxl-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-xxl-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-xxl-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-xxl-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-xxl-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-xxl-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-xxl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-xxl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-xxl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-xxl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-xxl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-xxl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-xxl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-xxl-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-xxl-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-xxl-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-xxl-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-xxl-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-xxl-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-xxl-auto {\n    margin-top: auto !important;\n  }\n\n  .me-xxl-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-xxl-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-xxl-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-xxl-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-xxl-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-xxl-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-xxl-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-xxl-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-xxl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-xxl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-xxl-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-xxl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-xxl-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-xxl-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-xxl-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-xxl-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-xxl-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-xxl-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-xxl-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-xxl-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-xxl-auto {\n    margin-right: auto !important;\n  }\n\n  .p-xxl-0 {\n    padding: 0 !important;\n  }\n\n  .p-xxl-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-xxl-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-xxl-3 {\n    padding: 1rem !important;\n  }\n\n  .p-xxl-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-xxl-5 {\n    padding: 3rem !important;\n  }\n\n  .px-xxl-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-xxl-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-xxl-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-xxl-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-xxl-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-xxl-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-xxl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-xxl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-xxl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-xxl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-xxl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-xxl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-xxl-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-xxl-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-xxl-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-xxl-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-xxl-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-xxl-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-xxl-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-xxl-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-xxl-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-xxl-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-xxl-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-xxl-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-xxl-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-xxl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-xxl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-xxl-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-xxl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-xxl-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-xxl-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-xxl-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-xxl-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-xxl-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-xxl-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-xxl-5 {\n    padding-right: 3rem !important;\n  }\n}\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-print-block {\n    display: block !important;\n  }\n\n  .d-print-grid {\n    display: grid !important;\n  }\n\n  .d-print-table {\n    display: table !important;\n  }\n\n  .d-print-table-row {\n    display: table-row !important;\n  }\n\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-print-flex {\n    display: flex !important;\n  }\n\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-print-none {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap-grid.rtl.css.map */"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css",
    "content": "/*!\n * Bootstrap Reboot v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  :root {\n    scroll-behavior: smooth;\n  }\n}\n\nbody {\n  margin: 0;\n  font-family: var(--bs-body-font-family);\n  font-size: var(--bs-body-font-size);\n  font-weight: var(--bs-body-font-weight);\n  line-height: var(--bs-body-line-height);\n  color: var(--bs-body-color);\n  text-align: var(--bs-body-text-align);\n  background-color: var(--bs-body-bg);\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n  margin: 1rem 0;\n  color: inherit;\n  background-color: currentColor;\n  border: 0;\n  opacity: 0.25;\n}\n\nhr:not([size]) {\n  height: 1px;\n}\n\nh6, h5, h4, h3, h2, h1 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n  font-weight: 500;\n  line-height: 1.2;\n}\n\nh1 {\n  font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n  h1 {\n    font-size: 2.5rem;\n  }\n}\n\nh2 {\n  font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n  h2 {\n    font-size: 2rem;\n  }\n}\n\nh3 {\n  font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n  h3 {\n    font-size: 1.75rem;\n  }\n}\n\nh4 {\n  font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n  h4 {\n    font-size: 1.5rem;\n  }\n}\n\nh5 {\n  font-size: 1.25rem;\n}\n\nh6 {\n  font-size: 1rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-bs-original-title] {\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul {\n  padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: 0.5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 0.875em;\n}\n\nmark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 0.75em;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\na {\n  color: #0d6efd;\n  text-decoration: underline;\n}\na:hover {\n  color: #0a58ca;\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n  color: inherit;\n  text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n  direction: ltr /* rtl:ignore */;\n  unicode-bidi: bidi-override;\n}\n\npre {\n  display: block;\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  font-size: 0.875em;\n}\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\ncode {\n  font-size: 0.875em;\n  color: #d63384;\n  word-wrap: break-word;\n}\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 0.875em;\n  color: #fff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n}\nkbd kbd {\n  padding: 0;\n  font-size: 1em;\n  font-weight: 700;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n  vertical-align: middle;\n}\n\ntable {\n  caption-side: bottom;\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  color: #6c757d;\n  text-align: left;\n}\n\nth {\n  text-align: inherit;\n  text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n}\n\nlabel {\n  display: inline-block;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n  outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n[role=button] {\n  cursor: pointer;\n}\n\nselect {\n  word-wrap: normal;\n}\nselect:disabled {\n  opacity: 1;\n}\n\n[list]::-webkit-calendar-picker-indicator {\n  display: none;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n  -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n  cursor: pointer;\n}\n\n::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ntextarea {\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  float: left;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 0.5rem;\n  font-size: calc(1.275rem + 0.3vw);\n  line-height: inherit;\n}\n@media (min-width: 1200px) {\n  legend {\n    font-size: 1.5rem;\n  }\n}\nlegend + * {\n  clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n  padding: 0;\n}\n\n::-webkit-inner-spin-button {\n  height: auto;\n}\n\n[type=search] {\n  outline-offset: -2px;\n  -webkit-appearance: textfield;\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n  direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n  padding: 0;\n}\n\n::file-selector-button {\n  font: inherit;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\niframe {\n  border: 0;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[hidden] {\n  display: none !important;\n}\n\n/*# sourceMappingURL=bootstrap-reboot.css.map */"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.rtl.css",
    "content": "/*!\n * Bootstrap Reboot v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  :root {\n    scroll-behavior: smooth;\n  }\n}\n\nbody {\n  margin: 0;\n  font-family: var(--bs-body-font-family);\n  font-size: var(--bs-body-font-size);\n  font-weight: var(--bs-body-font-weight);\n  line-height: var(--bs-body-line-height);\n  color: var(--bs-body-color);\n  text-align: var(--bs-body-text-align);\n  background-color: var(--bs-body-bg);\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n  margin: 1rem 0;\n  color: inherit;\n  background-color: currentColor;\n  border: 0;\n  opacity: 0.25;\n}\n\nhr:not([size]) {\n  height: 1px;\n}\n\nh6, h5, h4, h3, h2, h1 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n  font-weight: 500;\n  line-height: 1.2;\n}\n\nh1 {\n  font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n  h1 {\n    font-size: 2.5rem;\n  }\n}\n\nh2 {\n  font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n  h2 {\n    font-size: 2rem;\n  }\n}\n\nh3 {\n  font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n  h3 {\n    font-size: 1.75rem;\n  }\n}\n\nh4 {\n  font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n  h4 {\n    font-size: 1.5rem;\n  }\n}\n\nh5 {\n  font-size: 1.25rem;\n}\n\nh6 {\n  font-size: 1rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-bs-original-title] {\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul {\n  padding-right: 2rem;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: 0.5rem;\n  margin-right: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 0.875em;\n}\n\nmark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 0.75em;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\na {\n  color: #0d6efd;\n  text-decoration: underline;\n}\na:hover {\n  color: #0a58ca;\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n  color: inherit;\n  text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n  direction: ltr ;\n  unicode-bidi: bidi-override;\n}\n\npre {\n  display: block;\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  font-size: 0.875em;\n}\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\ncode {\n  font-size: 0.875em;\n  color: #d63384;\n  word-wrap: break-word;\n}\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 0.875em;\n  color: #fff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n}\nkbd kbd {\n  padding: 0;\n  font-size: 1em;\n  font-weight: 700;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n  vertical-align: middle;\n}\n\ntable {\n  caption-side: bottom;\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  color: #6c757d;\n  text-align: right;\n}\n\nth {\n  text-align: inherit;\n  text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n}\n\nlabel {\n  display: inline-block;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n  outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n[role=button] {\n  cursor: pointer;\n}\n\nselect {\n  word-wrap: normal;\n}\nselect:disabled {\n  opacity: 1;\n}\n\n[list]::-webkit-calendar-picker-indicator {\n  display: none;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n  -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n  cursor: pointer;\n}\n\n::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ntextarea {\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  float: right;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 0.5rem;\n  font-size: calc(1.275rem + 0.3vw);\n  line-height: inherit;\n}\n@media (min-width: 1200px) {\n  legend {\n    font-size: 1.5rem;\n  }\n}\nlegend + * {\n  clear: right;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n  padding: 0;\n}\n\n::-webkit-inner-spin-button {\n  height: auto;\n}\n\n[type=search] {\n  outline-offset: -2px;\n  -webkit-appearance: textfield;\n}\n\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n  direction: ltr;\n}\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n  padding: 0;\n}\n\n::file-selector-button {\n  font: inherit;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\niframe {\n  border: 0;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[hidden] {\n  display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.css",
    "content": "/*!\n * Bootstrap Utilities v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.link-primary {\n  color: #0d6efd;\n}\n.link-primary:hover, .link-primary:focus {\n  color: #0a58ca;\n}\n\n.link-secondary {\n  color: #6c757d;\n}\n.link-secondary:hover, .link-secondary:focus {\n  color: #565e64;\n}\n\n.link-success {\n  color: #198754;\n}\n.link-success:hover, .link-success:focus {\n  color: #146c43;\n}\n\n.link-info {\n  color: #0dcaf0;\n}\n.link-info:hover, .link-info:focus {\n  color: #3dd5f3;\n}\n\n.link-warning {\n  color: #ffc107;\n}\n.link-warning:hover, .link-warning:focus {\n  color: #ffcd39;\n}\n\n.link-danger {\n  color: #dc3545;\n}\n.link-danger:hover, .link-danger:focus {\n  color: #b02a37;\n}\n\n.link-light {\n  color: #f8f9fa;\n}\n.link-light:hover, .link-light:focus {\n  color: #f9fafb;\n}\n\n.link-dark {\n  color: #212529;\n}\n.link-dark:hover, .link-dark:focus {\n  color: #1a1e21;\n}\n\n.ratio {\n  position: relative;\n  width: 100%;\n}\n.ratio::before {\n  display: block;\n  padding-top: var(--bs-aspect-ratio);\n  content: \"\";\n}\n.ratio > * {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.ratio-1x1 {\n  --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n  --bs-aspect-ratio: calc(3 / 4 * 100%);\n}\n\n.ratio-16x9 {\n  --bs-aspect-ratio: calc(9 / 16 * 100%);\n}\n\n.ratio-21x9 {\n  --bs-aspect-ratio: calc(9 / 21 * 100%);\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.sticky-top {\n  position: -webkit-sticky;\n  position: sticky;\n  top: 0;\n  z-index: 1020;\n}\n\n@media (min-width: 576px) {\n  .sticky-sm-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 768px) {\n  .sticky-md-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 992px) {\n  .sticky-lg-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1200px) {\n  .sticky-xl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1400px) {\n  .sticky-xxl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n.hstack {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  align-self: stretch;\n}\n\n.vstack {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n  position: absolute !important;\n  width: 1px !important;\n  height: 1px !important;\n  padding: 0 !important;\n  margin: -1px !important;\n  overflow: hidden !important;\n  clip: rect(0, 0, 0, 0) !important;\n  white-space: nowrap !important;\n  border: 0 !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  content: \"\";\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.vr {\n  display: inline-block;\n  align-self: stretch;\n  width: 1px;\n  min-height: 1em;\n  background-color: currentColor;\n  opacity: 0.25;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.float-start {\n  float: left !important;\n}\n\n.float-end {\n  float: right !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n.opacity-0 {\n  opacity: 0 !important;\n}\n\n.opacity-25 {\n  opacity: 0.25 !important;\n}\n\n.opacity-50 {\n  opacity: 0.5 !important;\n}\n\n.opacity-75 {\n  opacity: 0.75 !important;\n}\n\n.opacity-100 {\n  opacity: 1 !important;\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.overflow-visible {\n  overflow: visible !important;\n}\n\n.overflow-scroll {\n  overflow: scroll !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-grid {\n  display: grid !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n.d-none {\n  display: none !important;\n}\n\n.shadow {\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-sm {\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow-lg {\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.top-0 {\n  top: 0 !important;\n}\n\n.top-50 {\n  top: 50% !important;\n}\n\n.top-100 {\n  top: 100% !important;\n}\n\n.bottom-0 {\n  bottom: 0 !important;\n}\n\n.bottom-50 {\n  bottom: 50% !important;\n}\n\n.bottom-100 {\n  bottom: 100% !important;\n}\n\n.start-0 {\n  left: 0 !important;\n}\n\n.start-50 {\n  left: 50% !important;\n}\n\n.start-100 {\n  left: 100% !important;\n}\n\n.end-0 {\n  right: 0 !important;\n}\n\n.end-50 {\n  right: 50% !important;\n}\n\n.end-100 {\n  right: 100% !important;\n}\n\n.translate-middle {\n  transform: translate(-50%, -50%) !important;\n}\n\n.translate-middle-x {\n  transform: translateX(-50%) !important;\n}\n\n.translate-middle-y {\n  transform: translateY(-50%) !important;\n}\n\n.border {\n  border: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top {\n  border-top: 1px solid #dee2e6 !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-end {\n  border-right: 1px solid #dee2e6 !important;\n}\n\n.border-end-0 {\n  border-right: 0 !important;\n}\n\n.border-bottom {\n  border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-start {\n  border-left: 1px solid #dee2e6 !important;\n}\n\n.border-start-0 {\n  border-left: 0 !important;\n}\n\n.border-primary {\n  border-color: #0d6efd !important;\n}\n\n.border-secondary {\n  border-color: #6c757d !important;\n}\n\n.border-success {\n  border-color: #198754 !important;\n}\n\n.border-info {\n  border-color: #0dcaf0 !important;\n}\n\n.border-warning {\n  border-color: #ffc107 !important;\n}\n\n.border-danger {\n  border-color: #dc3545 !important;\n}\n\n.border-light {\n  border-color: #f8f9fa !important;\n}\n\n.border-dark {\n  border-color: #212529 !important;\n}\n\n.border-white {\n  border-color: #fff !important;\n}\n\n.border-1 {\n  border-width: 1px !important;\n}\n\n.border-2 {\n  border-width: 2px !important;\n}\n\n.border-3 {\n  border-width: 3px !important;\n}\n\n.border-4 {\n  border-width: 4px !important;\n}\n\n.border-5 {\n  border-width: 5px !important;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.gap-0 {\n  gap: 0 !important;\n}\n\n.gap-1 {\n  gap: 0.25rem !important;\n}\n\n.gap-2 {\n  gap: 0.5rem !important;\n}\n\n.gap-3 {\n  gap: 1rem !important;\n}\n\n.gap-4 {\n  gap: 1.5rem !important;\n}\n\n.gap-5 {\n  gap: 3rem !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n  justify-content: space-evenly !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n.order-first {\n  order: -1 !important;\n}\n\n.order-0 {\n  order: 0 !important;\n}\n\n.order-1 {\n  order: 1 !important;\n}\n\n.order-2 {\n  order: 2 !important;\n}\n\n.order-3 {\n  order: 3 !important;\n}\n\n.order-4 {\n  order: 4 !important;\n}\n\n.order-5 {\n  order: 5 !important;\n}\n\n.order-last {\n  order: 6 !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mx-0 {\n  margin-right: 0 !important;\n  margin-left: 0 !important;\n}\n\n.mx-1 {\n  margin-right: 0.25rem !important;\n  margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n  margin-right: 0.5rem !important;\n  margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n  margin-right: 1rem !important;\n  margin-left: 1rem !important;\n}\n\n.mx-4 {\n  margin-right: 1.5rem !important;\n  margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n  margin-right: 3rem !important;\n  margin-left: 3rem !important;\n}\n\n.mx-auto {\n  margin-right: auto !important;\n  margin-left: auto !important;\n}\n\n.my-0 {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n.my-1 {\n  margin-top: 0.25rem !important;\n  margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n  margin-top: 0.5rem !important;\n  margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n  margin-top: 1rem !important;\n  margin-bottom: 1rem !important;\n}\n\n.my-4 {\n  margin-top: 1.5rem !important;\n  margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n  margin-top: 3rem !important;\n  margin-bottom: 3rem !important;\n}\n\n.my-auto {\n  margin-top: auto !important;\n  margin-bottom: auto !important;\n}\n\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.mt-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n  margin-top: 1rem !important;\n}\n\n.mt-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n  margin-top: 3rem !important;\n}\n\n.mt-auto {\n  margin-top: auto !important;\n}\n\n.me-0 {\n  margin-right: 0 !important;\n}\n\n.me-1 {\n  margin-right: 0.25rem !important;\n}\n\n.me-2 {\n  margin-right: 0.5rem !important;\n}\n\n.me-3 {\n  margin-right: 1rem !important;\n}\n\n.me-4 {\n  margin-right: 1.5rem !important;\n}\n\n.me-5 {\n  margin-right: 3rem !important;\n}\n\n.me-auto {\n  margin-right: auto !important;\n}\n\n.mb-0 {\n  margin-bottom: 0 !important;\n}\n\n.mb-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n  margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n  margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n  margin-bottom: auto !important;\n}\n\n.ms-0 {\n  margin-left: 0 !important;\n}\n\n.ms-1 {\n  margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n  margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n  margin-left: 1rem !important;\n}\n\n.ms-4 {\n  margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n  margin-left: 3rem !important;\n}\n\n.ms-auto {\n  margin-left: auto !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.px-0 {\n  padding-right: 0 !important;\n  padding-left: 0 !important;\n}\n\n.px-1 {\n  padding-right: 0.25rem !important;\n  padding-left: 0.25rem !important;\n}\n\n.px-2 {\n  padding-right: 0.5rem !important;\n  padding-left: 0.5rem !important;\n}\n\n.px-3 {\n  padding-right: 1rem !important;\n  padding-left: 1rem !important;\n}\n\n.px-4 {\n  padding-right: 1.5rem !important;\n  padding-left: 1.5rem !important;\n}\n\n.px-5 {\n  padding-right: 3rem !important;\n  padding-left: 3rem !important;\n}\n\n.py-0 {\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n.py-1 {\n  padding-top: 0.25rem !important;\n  padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n  padding-top: 0.5rem !important;\n  padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n  padding-top: 1rem !important;\n  padding-bottom: 1rem !important;\n}\n\n.py-4 {\n  padding-top: 1.5rem !important;\n  padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n  padding-top: 3rem !important;\n  padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n  padding-top: 0 !important;\n}\n\n.pt-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n  padding-top: 1rem !important;\n}\n\n.pt-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n  padding-top: 3rem !important;\n}\n\n.pe-0 {\n  padding-right: 0 !important;\n}\n\n.pe-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n  padding-right: 1rem !important;\n}\n\n.pe-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-0 {\n  padding-bottom: 0 !important;\n}\n\n.pb-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n  padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n  padding-left: 0 !important;\n}\n\n.ps-1 {\n  padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n  padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n  padding-left: 1rem !important;\n}\n\n.ps-4 {\n  padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n  padding-left: 3rem !important;\n}\n\n.font-monospace {\n  font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n  font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n  font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n  font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n  font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n  font-size: 1.25rem !important;\n}\n\n.fs-6 {\n  font-size: 1rem !important;\n}\n\n.fst-italic {\n  font-style: italic !important;\n}\n\n.fst-normal {\n  font-style: normal !important;\n}\n\n.fw-light {\n  font-weight: 300 !important;\n}\n\n.fw-lighter {\n  font-weight: lighter !important;\n}\n\n.fw-normal {\n  font-weight: 400 !important;\n}\n\n.fw-bold {\n  font-weight: 700 !important;\n}\n\n.fw-bolder {\n  font-weight: bolder !important;\n}\n\n.lh-1 {\n  line-height: 1 !important;\n}\n\n.lh-sm {\n  line-height: 1.25 !important;\n}\n\n.lh-base {\n  line-height: 1.5 !important;\n}\n\n.lh-lg {\n  line-height: 2 !important;\n}\n\n.text-start {\n  text-align: left !important;\n}\n\n.text-end {\n  text-align: right !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-decoration-underline {\n  text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n  text-decoration: line-through !important;\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n\n/* rtl:begin:remove */\n.text-break {\n  word-wrap: break-word !important;\n  word-break: break-word !important;\n}\n\n/* rtl:end:remove */\n.text-primary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-body-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n  --bs-text-opacity: 1;\n  color: #6c757d !important;\n}\n\n.text-black-50 {\n  --bs-text-opacity: 1;\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  --bs-text-opacity: 1;\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-reset {\n  --bs-text-opacity: 1;\n  color: inherit !important;\n}\n\n.text-opacity-25 {\n  --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n  --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n  --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n  --bs-text-opacity: 1;\n}\n\n.bg-primary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-body-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n  --bs-bg-opacity: 1;\n  background-color: transparent !important;\n}\n\n.bg-opacity-10 {\n  --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n  --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n  --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n  --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n  --bs-bg-opacity: 1;\n}\n\n.bg-gradient {\n  background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n  -webkit-user-select: all !important;\n  -moz-user-select: all !important;\n  user-select: all !important;\n}\n\n.user-select-auto {\n  -webkit-user-select: auto !important;\n  -moz-user-select: auto !important;\n  user-select: auto !important;\n}\n\n.user-select-none {\n  -webkit-user-select: none !important;\n  -moz-user-select: none !important;\n  user-select: none !important;\n}\n\n.pe-none {\n  pointer-events: none !important;\n}\n\n.pe-auto {\n  pointer-events: auto !important;\n}\n\n.rounded {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.rounded-1 {\n  border-radius: 0.2rem !important;\n}\n\n.rounded-2 {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-3 {\n  border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: 50rem !important;\n}\n\n.rounded-top {\n  border-top-left-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-end {\n  border-top-right-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-start {\n  border-bottom-left-radius: 0.25rem !important;\n  border-top-left-radius: 0.25rem !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-start {\n    float: left !important;\n  }\n\n  .float-sm-end {\n    float: right !important;\n  }\n\n  .float-sm-none {\n    float: none !important;\n  }\n\n  .d-sm-inline {\n    display: inline !important;\n  }\n\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-sm-block {\n    display: block !important;\n  }\n\n  .d-sm-grid {\n    display: grid !important;\n  }\n\n  .d-sm-table {\n    display: table !important;\n  }\n\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-sm-flex {\n    display: flex !important;\n  }\n\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-sm-none {\n    display: none !important;\n  }\n\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-sm-0 {\n    gap: 0 !important;\n  }\n\n  .gap-sm-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-sm-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-sm-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-sm-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-sm-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-sm-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-sm-first {\n    order: -1 !important;\n  }\n\n  .order-sm-0 {\n    order: 0 !important;\n  }\n\n  .order-sm-1 {\n    order: 1 !important;\n  }\n\n  .order-sm-2 {\n    order: 2 !important;\n  }\n\n  .order-sm-3 {\n    order: 3 !important;\n  }\n\n  .order-sm-4 {\n    order: 4 !important;\n  }\n\n  .order-sm-5 {\n    order: 5 !important;\n  }\n\n  .order-sm-last {\n    order: 6 !important;\n  }\n\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n\n  .m-sm-auto {\n    margin: auto !important;\n  }\n\n  .mx-sm-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-sm-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-sm-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-sm-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-sm-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-sm-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-sm-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-sm-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-sm-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-sm-auto {\n    margin-top: auto !important;\n  }\n\n  .me-sm-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-sm-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-sm-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-sm-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-sm-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-sm-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-sm-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-sm-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-sm-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-sm-auto {\n    margin-left: auto !important;\n  }\n\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n\n  .px-sm-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-sm-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-sm-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-sm-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-sm-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-sm-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-sm-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-sm-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-sm-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-sm-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-sm-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-sm-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-sm-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-sm-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-sm-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-sm-5 {\n    padding-left: 3rem !important;\n  }\n\n  .text-sm-start {\n    text-align: left !important;\n  }\n\n  .text-sm-end {\n    text-align: right !important;\n  }\n\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 768px) {\n  .float-md-start {\n    float: left !important;\n  }\n\n  .float-md-end {\n    float: right !important;\n  }\n\n  .float-md-none {\n    float: none !important;\n  }\n\n  .d-md-inline {\n    display: inline !important;\n  }\n\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-md-block {\n    display: block !important;\n  }\n\n  .d-md-grid {\n    display: grid !important;\n  }\n\n  .d-md-table {\n    display: table !important;\n  }\n\n  .d-md-table-row {\n    display: table-row !important;\n  }\n\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-md-flex {\n    display: flex !important;\n  }\n\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-md-none {\n    display: none !important;\n  }\n\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-md-0 {\n    gap: 0 !important;\n  }\n\n  .gap-md-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-md-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-md-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-md-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-md-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-md-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-md-center {\n    align-items: center !important;\n  }\n\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-md-center {\n    align-content: center !important;\n  }\n\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-md-center {\n    align-self: center !important;\n  }\n\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-md-first {\n    order: -1 !important;\n  }\n\n  .order-md-0 {\n    order: 0 !important;\n  }\n\n  .order-md-1 {\n    order: 1 !important;\n  }\n\n  .order-md-2 {\n    order: 2 !important;\n  }\n\n  .order-md-3 {\n    order: 3 !important;\n  }\n\n  .order-md-4 {\n    order: 4 !important;\n  }\n\n  .order-md-5 {\n    order: 5 !important;\n  }\n\n  .order-md-last {\n    order: 6 !important;\n  }\n\n  .m-md-0 {\n    margin: 0 !important;\n  }\n\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n\n  .m-md-auto {\n    margin: auto !important;\n  }\n\n  .mx-md-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-md-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-md-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-md-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-md-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-md-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-md-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-md-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-md-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-md-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-md-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-md-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-md-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-md-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-md-auto {\n    margin-top: auto !important;\n  }\n\n  .me-md-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-md-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-md-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-md-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-md-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-md-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-md-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-md-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-md-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-md-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-md-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-md-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-md-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-md-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-md-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-md-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-md-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-md-auto {\n    margin-left: auto !important;\n  }\n\n  .p-md-0 {\n    padding: 0 !important;\n  }\n\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n\n  .px-md-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-md-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-md-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-md-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-md-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-md-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-md-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-md-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-md-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-md-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-md-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-md-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-md-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-md-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-md-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-md-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-md-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-md-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-md-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-md-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-md-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-md-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-md-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-md-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-md-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-md-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-md-5 {\n    padding-left: 3rem !important;\n  }\n\n  .text-md-start {\n    text-align: left !important;\n  }\n\n  .text-md-end {\n    text-align: right !important;\n  }\n\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 992px) {\n  .float-lg-start {\n    float: left !important;\n  }\n\n  .float-lg-end {\n    float: right !important;\n  }\n\n  .float-lg-none {\n    float: none !important;\n  }\n\n  .d-lg-inline {\n    display: inline !important;\n  }\n\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-lg-block {\n    display: block !important;\n  }\n\n  .d-lg-grid {\n    display: grid !important;\n  }\n\n  .d-lg-table {\n    display: table !important;\n  }\n\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-lg-flex {\n    display: flex !important;\n  }\n\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-lg-none {\n    display: none !important;\n  }\n\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-lg-0 {\n    gap: 0 !important;\n  }\n\n  .gap-lg-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-lg-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-lg-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-lg-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-lg-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-lg-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-lg-first {\n    order: -1 !important;\n  }\n\n  .order-lg-0 {\n    order: 0 !important;\n  }\n\n  .order-lg-1 {\n    order: 1 !important;\n  }\n\n  .order-lg-2 {\n    order: 2 !important;\n  }\n\n  .order-lg-3 {\n    order: 3 !important;\n  }\n\n  .order-lg-4 {\n    order: 4 !important;\n  }\n\n  .order-lg-5 {\n    order: 5 !important;\n  }\n\n  .order-lg-last {\n    order: 6 !important;\n  }\n\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n\n  .m-lg-auto {\n    margin: auto !important;\n  }\n\n  .mx-lg-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-lg-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-lg-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-lg-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-lg-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-lg-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-lg-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-lg-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-lg-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-lg-auto {\n    margin-top: auto !important;\n  }\n\n  .me-lg-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-lg-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-lg-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-lg-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-lg-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-lg-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-lg-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-lg-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-lg-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-lg-auto {\n    margin-left: auto !important;\n  }\n\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n\n  .px-lg-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-lg-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-lg-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-lg-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-lg-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-lg-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-lg-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-lg-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-lg-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-lg-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-lg-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-lg-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-lg-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-lg-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-lg-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-lg-5 {\n    padding-left: 3rem !important;\n  }\n\n  .text-lg-start {\n    text-align: left !important;\n  }\n\n  .text-lg-end {\n    text-align: right !important;\n  }\n\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .float-xl-start {\n    float: left !important;\n  }\n\n  .float-xl-end {\n    float: right !important;\n  }\n\n  .float-xl-none {\n    float: none !important;\n  }\n\n  .d-xl-inline {\n    display: inline !important;\n  }\n\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-xl-block {\n    display: block !important;\n  }\n\n  .d-xl-grid {\n    display: grid !important;\n  }\n\n  .d-xl-table {\n    display: table !important;\n  }\n\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-xl-flex {\n    display: flex !important;\n  }\n\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-xl-none {\n    display: none !important;\n  }\n\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-xl-0 {\n    gap: 0 !important;\n  }\n\n  .gap-xl-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-xl-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-xl-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-xl-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-xl-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-xl-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-xl-first {\n    order: -1 !important;\n  }\n\n  .order-xl-0 {\n    order: 0 !important;\n  }\n\n  .order-xl-1 {\n    order: 1 !important;\n  }\n\n  .order-xl-2 {\n    order: 2 !important;\n  }\n\n  .order-xl-3 {\n    order: 3 !important;\n  }\n\n  .order-xl-4 {\n    order: 4 !important;\n  }\n\n  .order-xl-5 {\n    order: 5 !important;\n  }\n\n  .order-xl-last {\n    order: 6 !important;\n  }\n\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n\n  .m-xl-auto {\n    margin: auto !important;\n  }\n\n  .mx-xl-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-xl-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-xl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-xl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-xl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-xl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-xl-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-xl-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-xl-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-xl-auto {\n    margin-top: auto !important;\n  }\n\n  .me-xl-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-xl-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-xl-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-xl-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-xl-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-xl-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-xl-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-xl-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-xl-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-xl-auto {\n    margin-left: auto !important;\n  }\n\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n\n  .px-xl-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-xl-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-xl-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-xl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-xl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-xl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-xl-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-xl-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-xl-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-xl-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-xl-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-xl-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-xl-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-xl-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-xl-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-xl-5 {\n    padding-left: 3rem !important;\n  }\n\n  .text-xl-start {\n    text-align: left !important;\n  }\n\n  .text-xl-end {\n    text-align: right !important;\n  }\n\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1400px) {\n  .float-xxl-start {\n    float: left !important;\n  }\n\n  .float-xxl-end {\n    float: right !important;\n  }\n\n  .float-xxl-none {\n    float: none !important;\n  }\n\n  .d-xxl-inline {\n    display: inline !important;\n  }\n\n  .d-xxl-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-xxl-block {\n    display: block !important;\n  }\n\n  .d-xxl-grid {\n    display: grid !important;\n  }\n\n  .d-xxl-table {\n    display: table !important;\n  }\n\n  .d-xxl-table-row {\n    display: table-row !important;\n  }\n\n  .d-xxl-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-xxl-flex {\n    display: flex !important;\n  }\n\n  .d-xxl-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-xxl-none {\n    display: none !important;\n  }\n\n  .flex-xxl-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-xxl-row {\n    flex-direction: row !important;\n  }\n\n  .flex-xxl-column {\n    flex-direction: column !important;\n  }\n\n  .flex-xxl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-xxl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-xxl-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-xxl-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-xxl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-xxl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-xxl-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-xxl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-xxl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-xxl-0 {\n    gap: 0 !important;\n  }\n\n  .gap-xxl-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-xxl-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-xxl-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-xxl-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-xxl-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-xxl-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-xxl-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-xxl-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-xxl-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-xxl-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-xxl-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-xxl-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-xxl-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-xxl-center {\n    align-items: center !important;\n  }\n\n  .align-items-xxl-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-xxl-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-xxl-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-xxl-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-xxl-center {\n    align-content: center !important;\n  }\n\n  .align-content-xxl-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-xxl-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-xxl-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-xxl-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-xxl-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-xxl-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-xxl-center {\n    align-self: center !important;\n  }\n\n  .align-self-xxl-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-xxl-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-xxl-first {\n    order: -1 !important;\n  }\n\n  .order-xxl-0 {\n    order: 0 !important;\n  }\n\n  .order-xxl-1 {\n    order: 1 !important;\n  }\n\n  .order-xxl-2 {\n    order: 2 !important;\n  }\n\n  .order-xxl-3 {\n    order: 3 !important;\n  }\n\n  .order-xxl-4 {\n    order: 4 !important;\n  }\n\n  .order-xxl-5 {\n    order: 5 !important;\n  }\n\n  .order-xxl-last {\n    order: 6 !important;\n  }\n\n  .m-xxl-0 {\n    margin: 0 !important;\n  }\n\n  .m-xxl-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-xxl-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-xxl-3 {\n    margin: 1rem !important;\n  }\n\n  .m-xxl-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-xxl-5 {\n    margin: 3rem !important;\n  }\n\n  .m-xxl-auto {\n    margin: auto !important;\n  }\n\n  .mx-xxl-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-xxl-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-xxl-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-xxl-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-xxl-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-xxl-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-xxl-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-xxl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-xxl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-xxl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-xxl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-xxl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-xxl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-xxl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-xxl-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-xxl-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-xxl-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-xxl-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-xxl-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-xxl-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-xxl-auto {\n    margin-top: auto !important;\n  }\n\n  .me-xxl-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-xxl-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-xxl-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-xxl-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-xxl-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-xxl-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-xxl-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-xxl-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-xxl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-xxl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-xxl-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-xxl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-xxl-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-xxl-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-xxl-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-xxl-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-xxl-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-xxl-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-xxl-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-xxl-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-xxl-auto {\n    margin-left: auto !important;\n  }\n\n  .p-xxl-0 {\n    padding: 0 !important;\n  }\n\n  .p-xxl-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-xxl-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-xxl-3 {\n    padding: 1rem !important;\n  }\n\n  .p-xxl-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-xxl-5 {\n    padding: 3rem !important;\n  }\n\n  .px-xxl-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-xxl-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-xxl-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-xxl-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-xxl-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-xxl-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-xxl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-xxl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-xxl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-xxl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-xxl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-xxl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-xxl-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-xxl-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-xxl-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-xxl-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-xxl-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-xxl-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-xxl-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-xxl-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-xxl-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-xxl-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-xxl-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-xxl-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-xxl-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-xxl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-xxl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-xxl-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-xxl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-xxl-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-xxl-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-xxl-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-xxl-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-xxl-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-xxl-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-xxl-5 {\n    padding-left: 3rem !important;\n  }\n\n  .text-xxl-start {\n    text-align: left !important;\n  }\n\n  .text-xxl-end {\n    text-align: right !important;\n  }\n\n  .text-xxl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .fs-1 {\n    font-size: 2.5rem !important;\n  }\n\n  .fs-2 {\n    font-size: 2rem !important;\n  }\n\n  .fs-3 {\n    font-size: 1.75rem !important;\n  }\n\n  .fs-4 {\n    font-size: 1.5rem !important;\n  }\n}\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-print-block {\n    display: block !important;\n  }\n\n  .d-print-grid {\n    display: grid !important;\n  }\n\n  .d-print-table {\n    display: table !important;\n  }\n\n  .d-print-table-row {\n    display: table-row !important;\n  }\n\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-print-flex {\n    display: flex !important;\n  }\n\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-print-none {\n    display: none !important;\n  }\n}\n\n/*# sourceMappingURL=bootstrap-utilities.css.map */"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/bootstrap/dist/css/bootstrap-utilities.rtl.css",
    "content": "/*!\n * Bootstrap Utilities v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.link-primary {\n  color: #0d6efd;\n}\n.link-primary:hover, .link-primary:focus {\n  color: #0a58ca;\n}\n\n.link-secondary {\n  color: #6c757d;\n}\n.link-secondary:hover, .link-secondary:focus {\n  color: #565e64;\n}\n\n.link-success {\n  color: #198754;\n}\n.link-success:hover, .link-success:focus {\n  color: #146c43;\n}\n\n.link-info {\n  color: #0dcaf0;\n}\n.link-info:hover, .link-info:focus {\n  color: #3dd5f3;\n}\n\n.link-warning {\n  color: #ffc107;\n}\n.link-warning:hover, .link-warning:focus {\n  color: #ffcd39;\n}\n\n.link-danger {\n  color: #dc3545;\n}\n.link-danger:hover, .link-danger:focus {\n  color: #b02a37;\n}\n\n.link-light {\n  color: #f8f9fa;\n}\n.link-light:hover, .link-light:focus {\n  color: #f9fafb;\n}\n\n.link-dark {\n  color: #212529;\n}\n.link-dark:hover, .link-dark:focus {\n  color: #1a1e21;\n}\n\n.ratio {\n  position: relative;\n  width: 100%;\n}\n.ratio::before {\n  display: block;\n  padding-top: var(--bs-aspect-ratio);\n  content: \"\";\n}\n.ratio > * {\n  position: absolute;\n  top: 0;\n  right: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.ratio-1x1 {\n  --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n  --bs-aspect-ratio: calc(3 / 4 * 100%);\n}\n\n.ratio-16x9 {\n  --bs-aspect-ratio: calc(9 / 16 * 100%);\n}\n\n.ratio-21x9 {\n  --bs-aspect-ratio: calc(9 / 21 * 100%);\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  z-index: 1030;\n}\n\n.sticky-top {\n  position: -webkit-sticky;\n  position: sticky;\n  top: 0;\n  z-index: 1020;\n}\n\n@media (min-width: 576px) {\n  .sticky-sm-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 768px) {\n  .sticky-md-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 992px) {\n  .sticky-lg-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1200px) {\n  .sticky-xl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1400px) {\n  .sticky-xxl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n.hstack {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  align-self: stretch;\n}\n\n.vstack {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n  position: absolute !important;\n  width: 1px !important;\n  height: 1px !important;\n  padding: 0 !important;\n  margin: -1px !important;\n  overflow: hidden !important;\n  clip: rect(0, 0, 0, 0) !important;\n  white-space: nowrap !important;\n  border: 0 !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  z-index: 1;\n  content: \"\";\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.vr {\n  display: inline-block;\n  align-self: stretch;\n  width: 1px;\n  min-height: 1em;\n  background-color: currentColor;\n  opacity: 0.25;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.float-start {\n  float: right !important;\n}\n\n.float-end {\n  float: left !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n.opacity-0 {\n  opacity: 0 !important;\n}\n\n.opacity-25 {\n  opacity: 0.25 !important;\n}\n\n.opacity-50 {\n  opacity: 0.5 !important;\n}\n\n.opacity-75 {\n  opacity: 0.75 !important;\n}\n\n.opacity-100 {\n  opacity: 1 !important;\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.overflow-visible {\n  overflow: visible !important;\n}\n\n.overflow-scroll {\n  overflow: scroll !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-grid {\n  display: grid !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n.d-none {\n  display: none !important;\n}\n\n.shadow {\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-sm {\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow-lg {\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.top-0 {\n  top: 0 !important;\n}\n\n.top-50 {\n  top: 50% !important;\n}\n\n.top-100 {\n  top: 100% !important;\n}\n\n.bottom-0 {\n  bottom: 0 !important;\n}\n\n.bottom-50 {\n  bottom: 50% !important;\n}\n\n.bottom-100 {\n  bottom: 100% !important;\n}\n\n.start-0 {\n  right: 0 !important;\n}\n\n.start-50 {\n  right: 50% !important;\n}\n\n.start-100 {\n  right: 100% !important;\n}\n\n.end-0 {\n  left: 0 !important;\n}\n\n.end-50 {\n  left: 50% !important;\n}\n\n.end-100 {\n  left: 100% !important;\n}\n\n.translate-middle {\n  transform: translate(50%, -50%) !important;\n}\n\n.translate-middle-x {\n  transform: translateX(50%) !important;\n}\n\n.translate-middle-y {\n  transform: translateY(-50%) !important;\n}\n\n.border {\n  border: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top {\n  border-top: 1px solid #dee2e6 !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-end {\n  border-left: 1px solid #dee2e6 !important;\n}\n\n.border-end-0 {\n  border-left: 0 !important;\n}\n\n.border-bottom {\n  border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-start {\n  border-right: 1px solid #dee2e6 !important;\n}\n\n.border-start-0 {\n  border-right: 0 !important;\n}\n\n.border-primary {\n  border-color: #0d6efd !important;\n}\n\n.border-secondary {\n  border-color: #6c757d !important;\n}\n\n.border-success {\n  border-color: #198754 !important;\n}\n\n.border-info {\n  border-color: #0dcaf0 !important;\n}\n\n.border-warning {\n  border-color: #ffc107 !important;\n}\n\n.border-danger {\n  border-color: #dc3545 !important;\n}\n\n.border-light {\n  border-color: #f8f9fa !important;\n}\n\n.border-dark {\n  border-color: #212529 !important;\n}\n\n.border-white {\n  border-color: #fff !important;\n}\n\n.border-1 {\n  border-width: 1px !important;\n}\n\n.border-2 {\n  border-width: 2px !important;\n}\n\n.border-3 {\n  border-width: 3px !important;\n}\n\n.border-4 {\n  border-width: 4px !important;\n}\n\n.border-5 {\n  border-width: 5px !important;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.gap-0 {\n  gap: 0 !important;\n}\n\n.gap-1 {\n  gap: 0.25rem !important;\n}\n\n.gap-2 {\n  gap: 0.5rem !important;\n}\n\n.gap-3 {\n  gap: 1rem !important;\n}\n\n.gap-4 {\n  gap: 1.5rem !important;\n}\n\n.gap-5 {\n  gap: 3rem !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n  justify-content: space-evenly !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n.order-first {\n  order: -1 !important;\n}\n\n.order-0 {\n  order: 0 !important;\n}\n\n.order-1 {\n  order: 1 !important;\n}\n\n.order-2 {\n  order: 2 !important;\n}\n\n.order-3 {\n  order: 3 !important;\n}\n\n.order-4 {\n  order: 4 !important;\n}\n\n.order-5 {\n  order: 5 !important;\n}\n\n.order-last {\n  order: 6 !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mx-0 {\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n}\n\n.mx-1 {\n  margin-left: 0.25rem !important;\n  margin-right: 0.25rem !important;\n}\n\n.mx-2 {\n  margin-left: 0.5rem !important;\n  margin-right: 0.5rem !important;\n}\n\n.mx-3 {\n  margin-left: 1rem !important;\n  margin-right: 1rem !important;\n}\n\n.mx-4 {\n  margin-left: 1.5rem !important;\n  margin-right: 1.5rem !important;\n}\n\n.mx-5 {\n  margin-left: 3rem !important;\n  margin-right: 3rem !important;\n}\n\n.mx-auto {\n  margin-left: auto !important;\n  margin-right: auto !important;\n}\n\n.my-0 {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n.my-1 {\n  margin-top: 0.25rem !important;\n  margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n  margin-top: 0.5rem !important;\n  margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n  margin-top: 1rem !important;\n  margin-bottom: 1rem !important;\n}\n\n.my-4 {\n  margin-top: 1.5rem !important;\n  margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n  margin-top: 3rem !important;\n  margin-bottom: 3rem !important;\n}\n\n.my-auto {\n  margin-top: auto !important;\n  margin-bottom: auto !important;\n}\n\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.mt-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n  margin-top: 1rem !important;\n}\n\n.mt-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n  margin-top: 3rem !important;\n}\n\n.mt-auto {\n  margin-top: auto !important;\n}\n\n.me-0 {\n  margin-left: 0 !important;\n}\n\n.me-1 {\n  margin-left: 0.25rem !important;\n}\n\n.me-2 {\n  margin-left: 0.5rem !important;\n}\n\n.me-3 {\n  margin-left: 1rem !important;\n}\n\n.me-4 {\n  margin-left: 1.5rem !important;\n}\n\n.me-5 {\n  margin-left: 3rem !important;\n}\n\n.me-auto {\n  margin-left: auto !important;\n}\n\n.mb-0 {\n  margin-bottom: 0 !important;\n}\n\n.mb-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n  margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n  margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n  margin-bottom: auto !important;\n}\n\n.ms-0 {\n  margin-right: 0 !important;\n}\n\n.ms-1 {\n  margin-right: 0.25rem !important;\n}\n\n.ms-2 {\n  margin-right: 0.5rem !important;\n}\n\n.ms-3 {\n  margin-right: 1rem !important;\n}\n\n.ms-4 {\n  margin-right: 1.5rem !important;\n}\n\n.ms-5 {\n  margin-right: 3rem !important;\n}\n\n.ms-auto {\n  margin-right: auto !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.px-0 {\n  padding-left: 0 !important;\n  padding-right: 0 !important;\n}\n\n.px-1 {\n  padding-left: 0.25rem !important;\n  padding-right: 0.25rem !important;\n}\n\n.px-2 {\n  padding-left: 0.5rem !important;\n  padding-right: 0.5rem !important;\n}\n\n.px-3 {\n  padding-left: 1rem !important;\n  padding-right: 1rem !important;\n}\n\n.px-4 {\n  padding-left: 1.5rem !important;\n  padding-right: 1.5rem !important;\n}\n\n.px-5 {\n  padding-left: 3rem !important;\n  padding-right: 3rem !important;\n}\n\n.py-0 {\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n.py-1 {\n  padding-top: 0.25rem !important;\n  padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n  padding-top: 0.5rem !important;\n  padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n  padding-top: 1rem !important;\n  padding-bottom: 1rem !important;\n}\n\n.py-4 {\n  padding-top: 1.5rem !important;\n  padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n  padding-top: 3rem !important;\n  padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n  padding-top: 0 !important;\n}\n\n.pt-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n  padding-top: 1rem !important;\n}\n\n.pt-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n  padding-top: 3rem !important;\n}\n\n.pe-0 {\n  padding-left: 0 !important;\n}\n\n.pe-1 {\n  padding-left: 0.25rem !important;\n}\n\n.pe-2 {\n  padding-left: 0.5rem !important;\n}\n\n.pe-3 {\n  padding-left: 1rem !important;\n}\n\n.pe-4 {\n  padding-left: 1.5rem !important;\n}\n\n.pe-5 {\n  padding-left: 3rem !important;\n}\n\n.pb-0 {\n  padding-bottom: 0 !important;\n}\n\n.pb-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n  padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n  padding-right: 0 !important;\n}\n\n.ps-1 {\n  padding-right: 0.25rem !important;\n}\n\n.ps-2 {\n  padding-right: 0.5rem !important;\n}\n\n.ps-3 {\n  padding-right: 1rem !important;\n}\n\n.ps-4 {\n  padding-right: 1.5rem !important;\n}\n\n.ps-5 {\n  padding-right: 3rem !important;\n}\n\n.font-monospace {\n  font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n  font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n  font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n  font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n  font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n  font-size: 1.25rem !important;\n}\n\n.fs-6 {\n  font-size: 1rem !important;\n}\n\n.fst-italic {\n  font-style: italic !important;\n}\n\n.fst-normal {\n  font-style: normal !important;\n}\n\n.fw-light {\n  font-weight: 300 !important;\n}\n\n.fw-lighter {\n  font-weight: lighter !important;\n}\n\n.fw-normal {\n  font-weight: 400 !important;\n}\n\n.fw-bold {\n  font-weight: 700 !important;\n}\n\n.fw-bolder {\n  font-weight: bolder !important;\n}\n\n.lh-1 {\n  line-height: 1 !important;\n}\n\n.lh-sm {\n  line-height: 1.25 !important;\n}\n\n.lh-base {\n  line-height: 1.5 !important;\n}\n\n.lh-lg {\n  line-height: 2 !important;\n}\n\n.text-start {\n  text-align: right !important;\n}\n\n.text-end {\n  text-align: left !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-decoration-underline {\n  text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n  text-decoration: line-through !important;\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n.text-primary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-body-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n  --bs-text-opacity: 1;\n  color: #6c757d !important;\n}\n\n.text-black-50 {\n  --bs-text-opacity: 1;\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  --bs-text-opacity: 1;\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-reset {\n  --bs-text-opacity: 1;\n  color: inherit !important;\n}\n\n.text-opacity-25 {\n  --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n  --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n  --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n  --bs-text-opacity: 1;\n}\n\n.bg-primary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-body-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n  --bs-bg-opacity: 1;\n  background-color: transparent !important;\n}\n\n.bg-opacity-10 {\n  --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n  --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n  --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n  --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n  --bs-bg-opacity: 1;\n}\n\n.bg-gradient {\n  background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n  -webkit-user-select: all !important;\n  -moz-user-select: all !important;\n  user-select: all !important;\n}\n\n.user-select-auto {\n  -webkit-user-select: auto !important;\n  -moz-user-select: auto !important;\n  user-select: auto !important;\n}\n\n.user-select-none {\n  -webkit-user-select: none !important;\n  -moz-user-select: none !important;\n  user-select: none !important;\n}\n\n.pe-none {\n  pointer-events: none !important;\n}\n\n.pe-auto {\n  pointer-events: auto !important;\n}\n\n.rounded {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.rounded-1 {\n  border-radius: 0.2rem !important;\n}\n\n.rounded-2 {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-3 {\n  border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: 50rem !important;\n}\n\n.rounded-top {\n  border-top-right-radius: 0.25rem !important;\n  border-top-left-radius: 0.25rem !important;\n}\n\n.rounded-end {\n  border-top-left-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n  border-bottom-left-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-start {\n  border-bottom-right-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-start {\n    float: right !important;\n  }\n\n  .float-sm-end {\n    float: left !important;\n  }\n\n  .float-sm-none {\n    float: none !important;\n  }\n\n  .d-sm-inline {\n    display: inline !important;\n  }\n\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-sm-block {\n    display: block !important;\n  }\n\n  .d-sm-grid {\n    display: grid !important;\n  }\n\n  .d-sm-table {\n    display: table !important;\n  }\n\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-sm-flex {\n    display: flex !important;\n  }\n\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-sm-none {\n    display: none !important;\n  }\n\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-sm-0 {\n    gap: 0 !important;\n  }\n\n  .gap-sm-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-sm-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-sm-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-sm-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-sm-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-sm-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-sm-first {\n    order: -1 !important;\n  }\n\n  .order-sm-0 {\n    order: 0 !important;\n  }\n\n  .order-sm-1 {\n    order: 1 !important;\n  }\n\n  .order-sm-2 {\n    order: 2 !important;\n  }\n\n  .order-sm-3 {\n    order: 3 !important;\n  }\n\n  .order-sm-4 {\n    order: 4 !important;\n  }\n\n  .order-sm-5 {\n    order: 5 !important;\n  }\n\n  .order-sm-last {\n    order: 6 !important;\n  }\n\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n\n  .m-sm-auto {\n    margin: auto !important;\n  }\n\n  .mx-sm-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-sm-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-sm-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-sm-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-sm-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-sm-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-sm-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-sm-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-sm-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-sm-auto {\n    margin-top: auto !important;\n  }\n\n  .me-sm-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-sm-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-sm-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-sm-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-sm-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-sm-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-sm-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-sm-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-sm-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-sm-auto {\n    margin-right: auto !important;\n  }\n\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n\n  .px-sm-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-sm-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-sm-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-sm-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-sm-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-sm-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-sm-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-sm-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-sm-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-sm-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-sm-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-sm-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-sm-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-sm-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-sm-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-sm-5 {\n    padding-right: 3rem !important;\n  }\n\n  .text-sm-start {\n    text-align: right !important;\n  }\n\n  .text-sm-end {\n    text-align: left !important;\n  }\n\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 768px) {\n  .float-md-start {\n    float: right !important;\n  }\n\n  .float-md-end {\n    float: left !important;\n  }\n\n  .float-md-none {\n    float: none !important;\n  }\n\n  .d-md-inline {\n    display: inline !important;\n  }\n\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-md-block {\n    display: block !important;\n  }\n\n  .d-md-grid {\n    display: grid !important;\n  }\n\n  .d-md-table {\n    display: table !important;\n  }\n\n  .d-md-table-row {\n    display: table-row !important;\n  }\n\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-md-flex {\n    display: flex !important;\n  }\n\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-md-none {\n    display: none !important;\n  }\n\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-md-0 {\n    gap: 0 !important;\n  }\n\n  .gap-md-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-md-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-md-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-md-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-md-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-md-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-md-center {\n    align-items: center !important;\n  }\n\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-md-center {\n    align-content: center !important;\n  }\n\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-md-center {\n    align-self: center !important;\n  }\n\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-md-first {\n    order: -1 !important;\n  }\n\n  .order-md-0 {\n    order: 0 !important;\n  }\n\n  .order-md-1 {\n    order: 1 !important;\n  }\n\n  .order-md-2 {\n    order: 2 !important;\n  }\n\n  .order-md-3 {\n    order: 3 !important;\n  }\n\n  .order-md-4 {\n    order: 4 !important;\n  }\n\n  .order-md-5 {\n    order: 5 !important;\n  }\n\n  .order-md-last {\n    order: 6 !important;\n  }\n\n  .m-md-0 {\n    margin: 0 !important;\n  }\n\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n\n  .m-md-auto {\n    margin: auto !important;\n  }\n\n  .mx-md-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-md-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-md-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-md-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-md-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-md-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-md-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-md-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-md-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-md-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-md-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-md-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-md-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-md-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-md-auto {\n    margin-top: auto !important;\n  }\n\n  .me-md-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-md-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-md-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-md-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-md-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-md-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-md-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-md-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-md-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-md-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-md-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-md-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-md-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-md-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-md-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-md-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-md-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-md-auto {\n    margin-right: auto !important;\n  }\n\n  .p-md-0 {\n    padding: 0 !important;\n  }\n\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n\n  .px-md-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-md-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-md-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-md-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-md-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-md-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-md-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-md-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-md-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-md-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-md-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-md-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-md-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-md-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-md-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-md-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-md-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-md-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-md-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-md-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-md-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-md-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-md-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-md-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-md-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-md-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-md-5 {\n    padding-right: 3rem !important;\n  }\n\n  .text-md-start {\n    text-align: right !important;\n  }\n\n  .text-md-end {\n    text-align: left !important;\n  }\n\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 992px) {\n  .float-lg-start {\n    float: right !important;\n  }\n\n  .float-lg-end {\n    float: left !important;\n  }\n\n  .float-lg-none {\n    float: none !important;\n  }\n\n  .d-lg-inline {\n    display: inline !important;\n  }\n\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-lg-block {\n    display: block !important;\n  }\n\n  .d-lg-grid {\n    display: grid !important;\n  }\n\n  .d-lg-table {\n    display: table !important;\n  }\n\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-lg-flex {\n    display: flex !important;\n  }\n\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-lg-none {\n    display: none !important;\n  }\n\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-lg-0 {\n    gap: 0 !important;\n  }\n\n  .gap-lg-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-lg-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-lg-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-lg-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-lg-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-lg-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-lg-first {\n    order: -1 !important;\n  }\n\n  .order-lg-0 {\n    order: 0 !important;\n  }\n\n  .order-lg-1 {\n    order: 1 !important;\n  }\n\n  .order-lg-2 {\n    order: 2 !important;\n  }\n\n  .order-lg-3 {\n    order: 3 !important;\n  }\n\n  .order-lg-4 {\n    order: 4 !important;\n  }\n\n  .order-lg-5 {\n    order: 5 !important;\n  }\n\n  .order-lg-last {\n    order: 6 !important;\n  }\n\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n\n  .m-lg-auto {\n    margin: auto !important;\n  }\n\n  .mx-lg-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-lg-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-lg-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-lg-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-lg-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-lg-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-lg-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-lg-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-lg-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-lg-auto {\n    margin-top: auto !important;\n  }\n\n  .me-lg-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-lg-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-lg-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-lg-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-lg-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-lg-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-lg-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-lg-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-lg-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-lg-auto {\n    margin-right: auto !important;\n  }\n\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n\n  .px-lg-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-lg-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-lg-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-lg-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-lg-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-lg-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-lg-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-lg-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-lg-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-lg-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-lg-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-lg-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-lg-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-lg-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-lg-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-lg-5 {\n    padding-right: 3rem !important;\n  }\n\n  .text-lg-start {\n    text-align: right !important;\n  }\n\n  .text-lg-end {\n    text-align: left !important;\n  }\n\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .float-xl-start {\n    float: right !important;\n  }\n\n  .float-xl-end {\n    float: left !important;\n  }\n\n  .float-xl-none {\n    float: none !important;\n  }\n\n  .d-xl-inline {\n    display: inline !important;\n  }\n\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-xl-block {\n    display: block !important;\n  }\n\n  .d-xl-grid {\n    display: grid !important;\n  }\n\n  .d-xl-table {\n    display: table !important;\n  }\n\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-xl-flex {\n    display: flex !important;\n  }\n\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-xl-none {\n    display: none !important;\n  }\n\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-xl-0 {\n    gap: 0 !important;\n  }\n\n  .gap-xl-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-xl-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-xl-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-xl-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-xl-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-xl-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-xl-first {\n    order: -1 !important;\n  }\n\n  .order-xl-0 {\n    order: 0 !important;\n  }\n\n  .order-xl-1 {\n    order: 1 !important;\n  }\n\n  .order-xl-2 {\n    order: 2 !important;\n  }\n\n  .order-xl-3 {\n    order: 3 !important;\n  }\n\n  .order-xl-4 {\n    order: 4 !important;\n  }\n\n  .order-xl-5 {\n    order: 5 !important;\n  }\n\n  .order-xl-last {\n    order: 6 !important;\n  }\n\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n\n  .m-xl-auto {\n    margin: auto !important;\n  }\n\n  .mx-xl-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-xl-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-xl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-xl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-xl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-xl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-xl-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-xl-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-xl-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-xl-auto {\n    margin-top: auto !important;\n  }\n\n  .me-xl-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-xl-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-xl-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-xl-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-xl-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-xl-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-xl-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-xl-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-xl-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-xl-auto {\n    margin-right: auto !important;\n  }\n\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n\n  .px-xl-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-xl-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-xl-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-xl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-xl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-xl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-xl-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-xl-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-xl-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-xl-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-xl-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-xl-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-xl-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-xl-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-xl-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-xl-5 {\n    padding-right: 3rem !important;\n  }\n\n  .text-xl-start {\n    text-align: right !important;\n  }\n\n  .text-xl-end {\n    text-align: left !important;\n  }\n\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1400px) {\n  .float-xxl-start {\n    float: right !important;\n  }\n\n  .float-xxl-end {\n    float: left !important;\n  }\n\n  .float-xxl-none {\n    float: none !important;\n  }\n\n  .d-xxl-inline {\n    display: inline !important;\n  }\n\n  .d-xxl-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-xxl-block {\n    display: block !important;\n  }\n\n  .d-xxl-grid {\n    display: grid !important;\n  }\n\n  .d-xxl-table {\n    display: table !important;\n  }\n\n  .d-xxl-table-row {\n    display: table-row !important;\n  }\n\n  .d-xxl-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-xxl-flex {\n    display: flex !important;\n  }\n\n  .d-xxl-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-xxl-none {\n    display: none !important;\n  }\n\n  .flex-xxl-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-xxl-row {\n    flex-direction: row !important;\n  }\n\n  .flex-xxl-column {\n    flex-direction: column !important;\n  }\n\n  .flex-xxl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-xxl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-xxl-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-xxl-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-xxl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-xxl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-xxl-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-xxl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-xxl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-xxl-0 {\n    gap: 0 !important;\n  }\n\n  .gap-xxl-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-xxl-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-xxl-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-xxl-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-xxl-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-xxl-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-xxl-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-xxl-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-xxl-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-xxl-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-xxl-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-xxl-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-xxl-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-xxl-center {\n    align-items: center !important;\n  }\n\n  .align-items-xxl-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-xxl-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-xxl-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-xxl-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-xxl-center {\n    align-content: center !important;\n  }\n\n  .align-content-xxl-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-xxl-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-xxl-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-xxl-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-xxl-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-xxl-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-xxl-center {\n    align-self: center !important;\n  }\n\n  .align-self-xxl-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-xxl-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-xxl-first {\n    order: -1 !important;\n  }\n\n  .order-xxl-0 {\n    order: 0 !important;\n  }\n\n  .order-xxl-1 {\n    order: 1 !important;\n  }\n\n  .order-xxl-2 {\n    order: 2 !important;\n  }\n\n  .order-xxl-3 {\n    order: 3 !important;\n  }\n\n  .order-xxl-4 {\n    order: 4 !important;\n  }\n\n  .order-xxl-5 {\n    order: 5 !important;\n  }\n\n  .order-xxl-last {\n    order: 6 !important;\n  }\n\n  .m-xxl-0 {\n    margin: 0 !important;\n  }\n\n  .m-xxl-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-xxl-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-xxl-3 {\n    margin: 1rem !important;\n  }\n\n  .m-xxl-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-xxl-5 {\n    margin: 3rem !important;\n  }\n\n  .m-xxl-auto {\n    margin: auto !important;\n  }\n\n  .mx-xxl-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-xxl-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-xxl-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-xxl-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-xxl-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-xxl-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-xxl-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-xxl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-xxl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-xxl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-xxl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-xxl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-xxl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-xxl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-xxl-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-xxl-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-xxl-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-xxl-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-xxl-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-xxl-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-xxl-auto {\n    margin-top: auto !important;\n  }\n\n  .me-xxl-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-xxl-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-xxl-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-xxl-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-xxl-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-xxl-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-xxl-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-xxl-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-xxl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-xxl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-xxl-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-xxl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-xxl-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-xxl-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-xxl-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-xxl-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-xxl-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-xxl-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-xxl-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-xxl-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-xxl-auto {\n    margin-right: auto !important;\n  }\n\n  .p-xxl-0 {\n    padding: 0 !important;\n  }\n\n  .p-xxl-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-xxl-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-xxl-3 {\n    padding: 1rem !important;\n  }\n\n  .p-xxl-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-xxl-5 {\n    padding: 3rem !important;\n  }\n\n  .px-xxl-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-xxl-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-xxl-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-xxl-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-xxl-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-xxl-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-xxl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-xxl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-xxl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-xxl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-xxl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-xxl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-xxl-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-xxl-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-xxl-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-xxl-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-xxl-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-xxl-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-xxl-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-xxl-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-xxl-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-xxl-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-xxl-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-xxl-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-xxl-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-xxl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-xxl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-xxl-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-xxl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-xxl-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-xxl-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-xxl-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-xxl-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-xxl-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-xxl-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-xxl-5 {\n    padding-right: 3rem !important;\n  }\n\n  .text-xxl-start {\n    text-align: right !important;\n  }\n\n  .text-xxl-end {\n    text-align: left !important;\n  }\n\n  .text-xxl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .fs-1 {\n    font-size: 2.5rem !important;\n  }\n\n  .fs-2 {\n    font-size: 2rem !important;\n  }\n\n  .fs-3 {\n    font-size: 1.75rem !important;\n  }\n\n  .fs-4 {\n    font-size: 1.5rem !important;\n  }\n}\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-print-block {\n    display: block !important;\n  }\n\n  .d-print-grid {\n    display: grid !important;\n  }\n\n  .d-print-table {\n    display: table !important;\n  }\n\n  .d-print-table-row {\n    display: table-row !important;\n  }\n\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-print-flex {\n    display: flex !important;\n  }\n\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-print-none {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap-utilities.rtl.css.map */"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/bootstrap/dist/css/bootstrap.css",
    "content": "@charset \"UTF-8\";\n/*!\n * Bootstrap v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n  --bs-blue: #0d6efd;\n  --bs-indigo: #6610f2;\n  --bs-purple: #6f42c1;\n  --bs-pink: #d63384;\n  --bs-red: #dc3545;\n  --bs-orange: #fd7e14;\n  --bs-yellow: #ffc107;\n  --bs-green: #198754;\n  --bs-teal: #20c997;\n  --bs-cyan: #0dcaf0;\n  --bs-white: #fff;\n  --bs-gray: #6c757d;\n  --bs-gray-dark: #343a40;\n  --bs-gray-100: #f8f9fa;\n  --bs-gray-200: #e9ecef;\n  --bs-gray-300: #dee2e6;\n  --bs-gray-400: #ced4da;\n  --bs-gray-500: #adb5bd;\n  --bs-gray-600: #6c757d;\n  --bs-gray-700: #495057;\n  --bs-gray-800: #343a40;\n  --bs-gray-900: #212529;\n  --bs-primary: #0d6efd;\n  --bs-secondary: #6c757d;\n  --bs-success: #198754;\n  --bs-info: #0dcaf0;\n  --bs-warning: #ffc107;\n  --bs-danger: #dc3545;\n  --bs-light: #f8f9fa;\n  --bs-dark: #212529;\n  --bs-primary-rgb: 13, 110, 253;\n  --bs-secondary-rgb: 108, 117, 125;\n  --bs-success-rgb: 25, 135, 84;\n  --bs-info-rgb: 13, 202, 240;\n  --bs-warning-rgb: 255, 193, 7;\n  --bs-danger-rgb: 220, 53, 69;\n  --bs-light-rgb: 248, 249, 250;\n  --bs-dark-rgb: 33, 37, 41;\n  --bs-white-rgb: 255, 255, 255;\n  --bs-black-rgb: 0, 0, 0;\n  --bs-body-rgb: 33, 37, 41;\n  --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n  --bs-body-font-family: var(--bs-font-sans-serif);\n  --bs-body-font-size: 1rem;\n  --bs-body-font-weight: 400;\n  --bs-body-line-height: 1.5;\n  --bs-body-color: #212529;\n  --bs-body-bg: #fff;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  :root {\n    scroll-behavior: smooth;\n  }\n}\n\nbody {\n  margin: 0;\n  font-family: var(--bs-body-font-family);\n  font-size: var(--bs-body-font-size);\n  font-weight: var(--bs-body-font-weight);\n  line-height: var(--bs-body-line-height);\n  color: var(--bs-body-color);\n  text-align: var(--bs-body-text-align);\n  background-color: var(--bs-body-bg);\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n  margin: 1rem 0;\n  color: inherit;\n  background-color: currentColor;\n  border: 0;\n  opacity: 0.25;\n}\n\nhr:not([size]) {\n  height: 1px;\n}\n\nh6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n  font-weight: 500;\n  line-height: 1.2;\n}\n\nh1, .h1 {\n  font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n  h1, .h1 {\n    font-size: 2.5rem;\n  }\n}\n\nh2, .h2 {\n  font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n  h2, .h2 {\n    font-size: 2rem;\n  }\n}\n\nh3, .h3 {\n  font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n  h3, .h3 {\n    font-size: 1.75rem;\n  }\n}\n\nh4, .h4 {\n  font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n  h4, .h4 {\n    font-size: 1.5rem;\n  }\n}\n\nh5, .h5 {\n  font-size: 1.25rem;\n}\n\nh6, .h6 {\n  font-size: 1rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-bs-original-title] {\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul {\n  padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: 0.5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall, .small {\n  font-size: 0.875em;\n}\n\nmark, .mark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 0.75em;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\na {\n  color: #0d6efd;\n  text-decoration: underline;\n}\na:hover {\n  color: #0a58ca;\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n  color: inherit;\n  text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: var(--bs-font-monospace);\n  font-size: 1em;\n  direction: ltr /* rtl:ignore */;\n  unicode-bidi: bidi-override;\n}\n\npre {\n  display: block;\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  font-size: 0.875em;\n}\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\ncode {\n  font-size: 0.875em;\n  color: #d63384;\n  word-wrap: break-word;\n}\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 0.875em;\n  color: #fff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n}\nkbd kbd {\n  padding: 0;\n  font-size: 1em;\n  font-weight: 700;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n  vertical-align: middle;\n}\n\ntable {\n  caption-side: bottom;\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  color: #6c757d;\n  text-align: left;\n}\n\nth {\n  text-align: inherit;\n  text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n}\n\nlabel {\n  display: inline-block;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n  outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n[role=button] {\n  cursor: pointer;\n}\n\nselect {\n  word-wrap: normal;\n}\nselect:disabled {\n  opacity: 1;\n}\n\n[list]::-webkit-calendar-picker-indicator {\n  display: none;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n  -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n  cursor: pointer;\n}\n\n::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ntextarea {\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  float: left;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 0.5rem;\n  font-size: calc(1.275rem + 0.3vw);\n  line-height: inherit;\n}\n@media (min-width: 1200px) {\n  legend {\n    font-size: 1.5rem;\n  }\n}\nlegend + * {\n  clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n  padding: 0;\n}\n\n::-webkit-inner-spin-button {\n  height: auto;\n}\n\n[type=search] {\n  outline-offset: -2px;\n  -webkit-appearance: textfield;\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n  direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n  padding: 0;\n}\n\n::file-selector-button {\n  font: inherit;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\niframe {\n  border: 0;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[hidden] {\n  display: none !important;\n}\n\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n\n.display-1 {\n  font-size: calc(1.625rem + 4.5vw);\n  font-weight: 300;\n  line-height: 1.2;\n}\n@media (min-width: 1200px) {\n  .display-1 {\n    font-size: 5rem;\n  }\n}\n\n.display-2 {\n  font-size: calc(1.575rem + 3.9vw);\n  font-weight: 300;\n  line-height: 1.2;\n}\n@media (min-width: 1200px) {\n  .display-2 {\n    font-size: 4.5rem;\n  }\n}\n\n.display-3 {\n  font-size: calc(1.525rem + 3.3vw);\n  font-weight: 300;\n  line-height: 1.2;\n}\n@media (min-width: 1200px) {\n  .display-3 {\n    font-size: 4rem;\n  }\n}\n\n.display-4 {\n  font-size: calc(1.475rem + 2.7vw);\n  font-weight: 300;\n  line-height: 1.2;\n}\n@media (min-width: 1200px) {\n  .display-4 {\n    font-size: 3.5rem;\n  }\n}\n\n.display-5 {\n  font-size: calc(1.425rem + 2.1vw);\n  font-weight: 300;\n  line-height: 1.2;\n}\n@media (min-width: 1200px) {\n  .display-5 {\n    font-size: 3rem;\n  }\n}\n\n.display-6 {\n  font-size: calc(1.375rem + 1.5vw);\n  font-weight: 300;\n  line-height: 1.2;\n}\n@media (min-width: 1200px) {\n  .display-6 {\n    font-size: 2.5rem;\n  }\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline-item {\n  display: inline-block;\n}\n.list-inline-item:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.initialism {\n  font-size: 0.875em;\n  text-transform: uppercase;\n}\n\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.25rem;\n}\n.blockquote > :last-child {\n  margin-bottom: 0;\n}\n\n.blockquote-footer {\n  margin-top: -1rem;\n  margin-bottom: 1rem;\n  font-size: 0.875em;\n  color: #6c757d;\n}\n.blockquote-footer::before {\n  content: \"— \";\n}\n\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n  border-radius: 0.25rem;\n  max-width: 100%;\n  height: auto;\n}\n\n.figure {\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n\n.figure-caption {\n  font-size: 0.875em;\n  color: #6c757d;\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n  width: 100%;\n  padding-right: var(--bs-gutter-x, 0.75rem);\n  padding-left: var(--bs-gutter-x, 0.75rem);\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container-sm, .container {\n    max-width: 540px;\n  }\n}\n@media (min-width: 768px) {\n  .container-md, .container-sm, .container {\n    max-width: 720px;\n  }\n}\n@media (min-width: 992px) {\n  .container-lg, .container-md, .container-sm, .container {\n    max-width: 960px;\n  }\n}\n@media (min-width: 1200px) {\n  .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1140px;\n  }\n}\n@media (min-width: 1400px) {\n  .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1320px;\n  }\n}\n.row {\n  --bs-gutter-x: 1.5rem;\n  --bs-gutter-y: 0;\n  display: flex;\n  flex-wrap: wrap;\n  margin-top: calc(var(--bs-gutter-y) * -1);\n  margin-right: calc(var(--bs-gutter-x) * -.5);\n  margin-left: calc(var(--bs-gutter-x) * -.5);\n}\n.row > * {\n  flex-shrink: 0;\n  width: 100%;\n  max-width: 100%;\n  padding-right: calc(var(--bs-gutter-x) * .5);\n  padding-left: calc(var(--bs-gutter-x) * .5);\n  margin-top: var(--bs-gutter-y);\n}\n\n.col {\n  flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.row-cols-1 > * {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.row-cols-2 > * {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.row-cols-3 > * {\n  flex: 0 0 auto;\n  width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.row-cols-5 > * {\n  flex: 0 0 auto;\n  width: 20%;\n}\n\n.row-cols-6 > * {\n  flex: 0 0 auto;\n  width: 16.6666666667%;\n}\n\n.col-auto {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.col-1 {\n  flex: 0 0 auto;\n  width: 8.33333333%;\n}\n\n.col-2 {\n  flex: 0 0 auto;\n  width: 16.66666667%;\n}\n\n.col-3 {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.col-4 {\n  flex: 0 0 auto;\n  width: 33.33333333%;\n}\n\n.col-5 {\n  flex: 0 0 auto;\n  width: 41.66666667%;\n}\n\n.col-6 {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.col-7 {\n  flex: 0 0 auto;\n  width: 58.33333333%;\n}\n\n.col-8 {\n  flex: 0 0 auto;\n  width: 66.66666667%;\n}\n\n.col-9 {\n  flex: 0 0 auto;\n  width: 75%;\n}\n\n.col-10 {\n  flex: 0 0 auto;\n  width: 83.33333333%;\n}\n\n.col-11 {\n  flex: 0 0 auto;\n  width: 91.66666667%;\n}\n\n.col-12 {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.offset-1 {\n  margin-left: 8.33333333%;\n}\n\n.offset-2 {\n  margin-left: 16.66666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.33333333%;\n}\n\n.offset-5 {\n  margin-left: 41.66666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.33333333%;\n}\n\n.offset-8 {\n  margin-left: 66.66666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.33333333%;\n}\n\n.offset-11 {\n  margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n  --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n  --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n  --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n  --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n  --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n  --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n  --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n  --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n  --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n  --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n  --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n  --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-sm-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-sm-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-sm-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-sm-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-sm-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-sm-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-sm-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-sm-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-sm-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-sm-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-sm-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-sm-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-sm-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-sm-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-sm-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-sm-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-sm-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-sm-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-sm-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-sm-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n\n  .offset-sm-1 {\n    margin-left: 8.33333333%;\n  }\n\n  .offset-sm-2 {\n    margin-left: 16.66666667%;\n  }\n\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n\n  .offset-sm-4 {\n    margin-left: 33.33333333%;\n  }\n\n  .offset-sm-5 {\n    margin-left: 41.66666667%;\n  }\n\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n\n  .offset-sm-7 {\n    margin-left: 58.33333333%;\n  }\n\n  .offset-sm-8 {\n    margin-left: 66.66666667%;\n  }\n\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n\n  .offset-sm-10 {\n    margin-left: 83.33333333%;\n  }\n\n  .offset-sm-11 {\n    margin-left: 91.66666667%;\n  }\n\n  .g-sm-0,\n.gx-sm-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-sm-0,\n.gy-sm-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-sm-1,\n.gx-sm-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-sm-1,\n.gy-sm-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-sm-2,\n.gx-sm-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-sm-2,\n.gy-sm-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-sm-3,\n.gx-sm-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-sm-3,\n.gy-sm-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-sm-4,\n.gx-sm-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-sm-4,\n.gy-sm-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-sm-5,\n.gx-sm-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-sm-5,\n.gy-sm-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 768px) {\n  .col-md {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-md-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-md-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-md-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-md-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-md-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-md-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-md-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-md-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-md-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-md-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-md-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-md-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-md-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-md-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-md-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-md-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-md-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-md-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-md-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-md-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-md-0 {\n    margin-left: 0;\n  }\n\n  .offset-md-1 {\n    margin-left: 8.33333333%;\n  }\n\n  .offset-md-2 {\n    margin-left: 16.66666667%;\n  }\n\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n\n  .offset-md-4 {\n    margin-left: 33.33333333%;\n  }\n\n  .offset-md-5 {\n    margin-left: 41.66666667%;\n  }\n\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n\n  .offset-md-7 {\n    margin-left: 58.33333333%;\n  }\n\n  .offset-md-8 {\n    margin-left: 66.66666667%;\n  }\n\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n\n  .offset-md-10 {\n    margin-left: 83.33333333%;\n  }\n\n  .offset-md-11 {\n    margin-left: 91.66666667%;\n  }\n\n  .g-md-0,\n.gx-md-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-md-0,\n.gy-md-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-md-1,\n.gx-md-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-md-1,\n.gy-md-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-md-2,\n.gx-md-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-md-2,\n.gy-md-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-md-3,\n.gx-md-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-md-3,\n.gy-md-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-md-4,\n.gx-md-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-md-4,\n.gy-md-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-md-5,\n.gx-md-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-md-5,\n.gy-md-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 992px) {\n  .col-lg {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-lg-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-lg-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-lg-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-lg-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-lg-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-lg-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-lg-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-lg-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-lg-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-lg-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-lg-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-lg-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-lg-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-lg-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-lg-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-lg-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-lg-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-lg-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-lg-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-lg-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n\n  .offset-lg-1 {\n    margin-left: 8.33333333%;\n  }\n\n  .offset-lg-2 {\n    margin-left: 16.66666667%;\n  }\n\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n\n  .offset-lg-4 {\n    margin-left: 33.33333333%;\n  }\n\n  .offset-lg-5 {\n    margin-left: 41.66666667%;\n  }\n\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n\n  .offset-lg-7 {\n    margin-left: 58.33333333%;\n  }\n\n  .offset-lg-8 {\n    margin-left: 66.66666667%;\n  }\n\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n\n  .offset-lg-10 {\n    margin-left: 83.33333333%;\n  }\n\n  .offset-lg-11 {\n    margin-left: 91.66666667%;\n  }\n\n  .g-lg-0,\n.gx-lg-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-lg-0,\n.gy-lg-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-lg-1,\n.gx-lg-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-lg-1,\n.gy-lg-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-lg-2,\n.gx-lg-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-lg-2,\n.gy-lg-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-lg-3,\n.gx-lg-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-lg-3,\n.gy-lg-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-lg-4,\n.gx-lg-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-lg-4,\n.gy-lg-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-lg-5,\n.gx-lg-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-lg-5,\n.gy-lg-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1200px) {\n  .col-xl {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-xl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-xl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-xl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-xl-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-xl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-xl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-xl-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-xl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-xl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-xl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-xl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-xl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-xl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-xl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-xl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-xl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-xl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-xl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-xl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-xl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n\n  .offset-xl-1 {\n    margin-left: 8.33333333%;\n  }\n\n  .offset-xl-2 {\n    margin-left: 16.66666667%;\n  }\n\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n\n  .offset-xl-4 {\n    margin-left: 33.33333333%;\n  }\n\n  .offset-xl-5 {\n    margin-left: 41.66666667%;\n  }\n\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n\n  .offset-xl-7 {\n    margin-left: 58.33333333%;\n  }\n\n  .offset-xl-8 {\n    margin-left: 66.66666667%;\n  }\n\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n\n  .offset-xl-10 {\n    margin-left: 83.33333333%;\n  }\n\n  .offset-xl-11 {\n    margin-left: 91.66666667%;\n  }\n\n  .g-xl-0,\n.gx-xl-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-xl-0,\n.gy-xl-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-xl-1,\n.gx-xl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-xl-1,\n.gy-xl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-xl-2,\n.gx-xl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-xl-2,\n.gy-xl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-xl-3,\n.gx-xl-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-xl-3,\n.gy-xl-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-xl-4,\n.gx-xl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-xl-4,\n.gy-xl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-xl-5,\n.gx-xl-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-xl-5,\n.gy-xl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1400px) {\n  .col-xxl {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-xxl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-xxl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-xxl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-xxl-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-xxl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-xxl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-xxl-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-xxl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-xxl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-xxl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-xxl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-xxl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-xxl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-xxl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-xxl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-xxl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-xxl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-xxl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-xxl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-xxl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-xxl-0 {\n    margin-left: 0;\n  }\n\n  .offset-xxl-1 {\n    margin-left: 8.33333333%;\n  }\n\n  .offset-xxl-2 {\n    margin-left: 16.66666667%;\n  }\n\n  .offset-xxl-3 {\n    margin-left: 25%;\n  }\n\n  .offset-xxl-4 {\n    margin-left: 33.33333333%;\n  }\n\n  .offset-xxl-5 {\n    margin-left: 41.66666667%;\n  }\n\n  .offset-xxl-6 {\n    margin-left: 50%;\n  }\n\n  .offset-xxl-7 {\n    margin-left: 58.33333333%;\n  }\n\n  .offset-xxl-8 {\n    margin-left: 66.66666667%;\n  }\n\n  .offset-xxl-9 {\n    margin-left: 75%;\n  }\n\n  .offset-xxl-10 {\n    margin-left: 83.33333333%;\n  }\n\n  .offset-xxl-11 {\n    margin-left: 91.66666667%;\n  }\n\n  .g-xxl-0,\n.gx-xxl-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-xxl-0,\n.gy-xxl-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-xxl-1,\n.gx-xxl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-xxl-1,\n.gy-xxl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-xxl-2,\n.gx-xxl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-xxl-2,\n.gy-xxl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-xxl-3,\n.gx-xxl-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-xxl-3,\n.gy-xxl-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-xxl-4,\n.gx-xxl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-xxl-4,\n.gy-xxl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-xxl-5,\n.gx-xxl-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-xxl-5,\n.gy-xxl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n.table {\n  --bs-table-bg: transparent;\n  --bs-table-accent-bg: transparent;\n  --bs-table-striped-color: #212529;\n  --bs-table-striped-bg: rgba(0, 0, 0, 0.05);\n  --bs-table-active-color: #212529;\n  --bs-table-active-bg: rgba(0, 0, 0, 0.1);\n  --bs-table-hover-color: #212529;\n  --bs-table-hover-bg: rgba(0, 0, 0, 0.075);\n  width: 100%;\n  margin-bottom: 1rem;\n  color: #212529;\n  vertical-align: top;\n  border-color: #dee2e6;\n}\n.table > :not(caption) > * > * {\n  padding: 0.5rem 0.5rem;\n  background-color: var(--bs-table-bg);\n  border-bottom-width: 1px;\n  box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);\n}\n.table > tbody {\n  vertical-align: inherit;\n}\n.table > thead {\n  vertical-align: bottom;\n}\n.table > :not(:last-child) > :last-child > * {\n  border-bottom-color: currentColor;\n}\n\n.caption-top {\n  caption-side: top;\n}\n\n.table-sm > :not(caption) > * > * {\n  padding: 0.25rem 0.25rem;\n}\n\n.table-bordered > :not(caption) > * {\n  border-width: 1px 0;\n}\n.table-bordered > :not(caption) > * > * {\n  border-width: 0 1px;\n}\n\n.table-borderless > :not(caption) > * > * {\n  border-bottom-width: 0;\n}\n\n.table-striped > tbody > tr:nth-of-type(odd) {\n  --bs-table-accent-bg: var(--bs-table-striped-bg);\n  color: var(--bs-table-striped-color);\n}\n\n.table-active {\n  --bs-table-accent-bg: var(--bs-table-active-bg);\n  color: var(--bs-table-active-color);\n}\n\n.table-hover > tbody > tr:hover {\n  --bs-table-accent-bg: var(--bs-table-hover-bg);\n  color: var(--bs-table-hover-color);\n}\n\n.table-primary {\n  --bs-table-bg: #cfe2ff;\n  --bs-table-striped-bg: #c5d7f2;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #bacbe6;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #bfd1ec;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #bacbe6;\n}\n\n.table-secondary {\n  --bs-table-bg: #e2e3e5;\n  --bs-table-striped-bg: #d7d8da;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #cbccce;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #d1d2d4;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #cbccce;\n}\n\n.table-success {\n  --bs-table-bg: #d1e7dd;\n  --bs-table-striped-bg: #c7dbd2;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #bcd0c7;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #c1d6cc;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #bcd0c7;\n}\n\n.table-info {\n  --bs-table-bg: #cff4fc;\n  --bs-table-striped-bg: #c5e8ef;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #badce3;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #bfe2e9;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #badce3;\n}\n\n.table-warning {\n  --bs-table-bg: #fff3cd;\n  --bs-table-striped-bg: #f2e7c3;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #e6dbb9;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #ece1be;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #e6dbb9;\n}\n\n.table-danger {\n  --bs-table-bg: #f8d7da;\n  --bs-table-striped-bg: #eccccf;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #dfc2c4;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #e5c7ca;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #dfc2c4;\n}\n\n.table-light {\n  --bs-table-bg: #f8f9fa;\n  --bs-table-striped-bg: #ecedee;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #dfe0e1;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #e5e6e7;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #dfe0e1;\n}\n\n.table-dark {\n  --bs-table-bg: #212529;\n  --bs-table-striped-bg: #2c3034;\n  --bs-table-striped-color: #fff;\n  --bs-table-active-bg: #373b3e;\n  --bs-table-active-color: #fff;\n  --bs-table-hover-bg: #323539;\n  --bs-table-hover-color: #fff;\n  color: #fff;\n  border-color: #373b3e;\n}\n\n.table-responsive {\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n@media (max-width: 575.98px) {\n  .table-responsive-sm {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 767.98px) {\n  .table-responsive-md {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 991.98px) {\n  .table-responsive-lg {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 1199.98px) {\n  .table-responsive-xl {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 1399.98px) {\n  .table-responsive-xxl {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n.form-label {\n  margin-bottom: 0.5rem;\n}\n\n.col-form-label {\n  padding-top: calc(0.375rem + 1px);\n  padding-bottom: calc(0.375rem + 1px);\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n\n.col-form-label-lg {\n  padding-top: calc(0.5rem + 1px);\n  padding-bottom: calc(0.5rem + 1px);\n  font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n  padding-top: calc(0.25rem + 1px);\n  padding-bottom: calc(0.25rem + 1px);\n  font-size: 0.875rem;\n}\n\n.form-text {\n  margin-top: 0.25rem;\n  font-size: 0.875em;\n  color: #6c757d;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ced4da;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  border-radius: 0.25rem;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-control {\n    transition: none;\n  }\n}\n.form-control[type=file] {\n  overflow: hidden;\n}\n.form-control[type=file]:not(:disabled):not([readonly]) {\n  cursor: pointer;\n}\n.form-control:focus {\n  color: #212529;\n  background-color: #fff;\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-control::-webkit-date-and-time-value {\n  height: 1.5em;\n}\n.form-control::-moz-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n.form-control::placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n.form-control:disabled, .form-control[readonly] {\n  background-color: #e9ecef;\n  opacity: 1;\n}\n.form-control::file-selector-button {\n  padding: 0.375rem 0.75rem;\n  margin: -0.375rem -0.75rem;\n  -webkit-margin-end: 0.75rem;\n  margin-inline-end: 0.75rem;\n  color: #212529;\n  background-color: #e9ecef;\n  pointer-events: none;\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n  border-inline-end-width: 1px;\n  border-radius: 0;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-control::file-selector-button {\n    transition: none;\n  }\n}\n.form-control:hover:not(:disabled):not([readonly])::file-selector-button {\n  background-color: #dde0e3;\n}\n.form-control::-webkit-file-upload-button {\n  padding: 0.375rem 0.75rem;\n  margin: -0.375rem -0.75rem;\n  -webkit-margin-end: 0.75rem;\n  margin-inline-end: 0.75rem;\n  color: #212529;\n  background-color: #e9ecef;\n  pointer-events: none;\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n  border-inline-end-width: 1px;\n  border-radius: 0;\n  -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-control::-webkit-file-upload-button {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n  background-color: #dde0e3;\n}\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0;\n  margin-bottom: 0;\n  line-height: 1.5;\n  color: #212529;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: 1px 0;\n}\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.form-control-sm {\n  min-height: calc(1.5em + 0.5rem + 2px);\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  border-radius: 0.2rem;\n}\n.form-control-sm::file-selector-button {\n  padding: 0.25rem 0.5rem;\n  margin: -0.25rem -0.5rem;\n  -webkit-margin-end: 0.5rem;\n  margin-inline-end: 0.5rem;\n}\n.form-control-sm::-webkit-file-upload-button {\n  padding: 0.25rem 0.5rem;\n  margin: -0.25rem -0.5rem;\n  -webkit-margin-end: 0.5rem;\n  margin-inline-end: 0.5rem;\n}\n\n.form-control-lg {\n  min-height: calc(1.5em + 1rem + 2px);\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  border-radius: 0.3rem;\n}\n.form-control-lg::file-selector-button {\n  padding: 0.5rem 1rem;\n  margin: -0.5rem -1rem;\n  -webkit-margin-end: 1rem;\n  margin-inline-end: 1rem;\n}\n.form-control-lg::-webkit-file-upload-button {\n  padding: 0.5rem 1rem;\n  margin: -0.5rem -1rem;\n  -webkit-margin-end: 1rem;\n  margin-inline-end: 1rem;\n}\n\ntextarea.form-control {\n  min-height: calc(1.5em + 0.75rem + 2px);\n}\ntextarea.form-control-sm {\n  min-height: calc(1.5em + 0.5rem + 2px);\n}\ntextarea.form-control-lg {\n  min-height: calc(1.5em + 1rem + 2px);\n}\n\n.form-control-color {\n  width: 3rem;\n  height: auto;\n  padding: 0.375rem;\n}\n.form-control-color:not(:disabled):not([readonly]) {\n  cursor: pointer;\n}\n.form-control-color::-moz-color-swatch {\n  height: 1.5em;\n  border-radius: 0.25rem;\n}\n.form-control-color::-webkit-color-swatch {\n  height: 1.5em;\n  border-radius: 0.25rem;\n}\n\n.form-select {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 2.25rem 0.375rem 0.75rem;\n  -moz-padding-start: calc(0.75rem - 3px);\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  background-color: #fff;\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: right 0.75rem center;\n  background-size: 16px 12px;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-select {\n    transition: none;\n  }\n}\n.form-select:focus {\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-select[multiple], .form-select[size]:not([size=\"1\"]) {\n  padding-right: 0.75rem;\n  background-image: none;\n}\n.form-select:disabled {\n  background-color: #e9ecef;\n}\n.form-select:-moz-focusring {\n  color: transparent;\n  text-shadow: 0 0 0 #212529;\n}\n\n.form-select-sm {\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n  padding-left: 0.5rem;\n  font-size: 0.875rem;\n}\n\n.form-select-lg {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  padding-left: 1rem;\n  font-size: 1.25rem;\n}\n\n.form-check {\n  display: block;\n  min-height: 1.5rem;\n  padding-left: 1.5em;\n  margin-bottom: 0.125rem;\n}\n.form-check .form-check-input {\n  float: left;\n  margin-left: -1.5em;\n}\n\n.form-check-input {\n  width: 1em;\n  height: 1em;\n  margin-top: 0.25em;\n  vertical-align: top;\n  background-color: #fff;\n  background-repeat: no-repeat;\n  background-position: center;\n  background-size: contain;\n  border: 1px solid rgba(0, 0, 0, 0.25);\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  -webkit-print-color-adjust: exact;\n  color-adjust: exact;\n}\n.form-check-input[type=checkbox] {\n  border-radius: 0.25em;\n}\n.form-check-input[type=radio] {\n  border-radius: 50%;\n}\n.form-check-input:active {\n  filter: brightness(90%);\n}\n.form-check-input:focus {\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-check-input:checked {\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.form-check-input:checked[type=checkbox] {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e\");\n}\n.form-check-input:checked[type=radio] {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e\");\n}\n.form-check-input[type=checkbox]:indeterminate {\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e\");\n}\n.form-check-input:disabled {\n  pointer-events: none;\n  filter: none;\n  opacity: 0.5;\n}\n.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {\n  opacity: 0.5;\n}\n\n.form-switch {\n  padding-left: 2.5em;\n}\n.form-switch .form-check-input {\n  width: 2em;\n  margin-left: -2.5em;\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e\");\n  background-position: left center;\n  border-radius: 2em;\n  transition: background-position 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-switch .form-check-input {\n    transition: none;\n  }\n}\n.form-switch .form-check-input:focus {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e\");\n}\n.form-switch .form-check-input:checked {\n  background-position: right center;\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.form-check-inline {\n  display: inline-block;\n  margin-right: 1rem;\n}\n\n.btn-check {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.btn-check[disabled] + .btn, .btn-check:disabled + .btn {\n  pointer-events: none;\n  filter: none;\n  opacity: 0.65;\n}\n\n.form-range {\n  width: 100%;\n  height: 1.5rem;\n  padding: 0;\n  background-color: transparent;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n.form-range:focus {\n  outline: 0;\n}\n.form-range:focus::-webkit-slider-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range:focus::-moz-range-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range::-moz-focus-outer {\n  border: 0;\n}\n.form-range::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  background-color: #0d6efd;\n  border: 0;\n  border-radius: 1rem;\n  -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -webkit-appearance: none;\n  appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-range::-webkit-slider-thumb {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n.form-range::-webkit-slider-thumb:active {\n  background-color: #b6d4fe;\n}\n.form-range::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n.form-range::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #0d6efd;\n  border: 0;\n  border-radius: 1rem;\n  -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -moz-appearance: none;\n  appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-range::-moz-range-thumb {\n    -moz-transition: none;\n    transition: none;\n  }\n}\n.form-range::-moz-range-thumb:active {\n  background-color: #b6d4fe;\n}\n.form-range::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n.form-range:disabled {\n  pointer-events: none;\n}\n.form-range:disabled::-webkit-slider-thumb {\n  background-color: #adb5bd;\n}\n.form-range:disabled::-moz-range-thumb {\n  background-color: #adb5bd;\n}\n\n.form-floating {\n  position: relative;\n}\n.form-floating > .form-control,\n.form-floating > .form-select {\n  height: calc(3.5rem + 2px);\n  line-height: 1.25;\n}\n.form-floating > label {\n  position: absolute;\n  top: 0;\n  left: 0;\n  height: 100%;\n  padding: 1rem 0.75rem;\n  pointer-events: none;\n  border: 1px solid transparent;\n  transform-origin: 0 0;\n  transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-floating > label {\n    transition: none;\n  }\n}\n.form-floating > .form-control {\n  padding: 1rem 0.75rem;\n}\n.form-floating > .form-control::-moz-placeholder {\n  color: transparent;\n}\n.form-floating > .form-control::placeholder {\n  color: transparent;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:-webkit-autofill {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n}\n.form-floating > .form-select {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {\n  opacity: 0.65;\n  transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:focus ~ label,\n.form-floating > .form-control:not(:placeholder-shown) ~ label,\n.form-floating > .form-select ~ label {\n  opacity: 0.65;\n  transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:-webkit-autofill ~ label {\n  opacity: 0.65;\n  transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n\n.input-group {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: stretch;\n  width: 100%;\n}\n.input-group > .form-control,\n.input-group > .form-select {\n  position: relative;\n  flex: 1 1 auto;\n  width: 1%;\n  min-width: 0;\n}\n.input-group > .form-control:focus,\n.input-group > .form-select:focus {\n  z-index: 3;\n}\n.input-group .btn {\n  position: relative;\n  z-index: 2;\n}\n.input-group .btn:focus {\n  z-index: 3;\n}\n\n.input-group-text {\n  display: flex;\n  align-items: center;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #e9ecef;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  border-radius: 0.2rem;\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n  padding-right: 3rem;\n}\n\n.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),\n.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),\n.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {\n  margin-left: -1px;\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 0.875em;\n  color: #198754;\n}\n\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: 0.1rem;\n  font-size: 0.875rem;\n  color: #fff;\n  background-color: rgba(25, 135, 84, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n  border-color: #198754;\n  padding-right: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: right calc(0.375em + 0.1875rem) center;\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n  border-color: #198754;\n  box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n  padding-right: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:valid, .form-select.is-valid {\n  border-color: #198754;\n}\n.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size=\"1\"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size=\"1\"] {\n  padding-right: 4.125rem;\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\"), url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n  background-position: right 0.75rem center, center right 2.25rem;\n  background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:valid:focus, .form-select.is-valid:focus {\n  border-color: #198754;\n  box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n\n.was-validated .form-check-input:valid, .form-check-input.is-valid {\n  border-color: #198754;\n}\n.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {\n  background-color: #198754;\n}\n.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {\n  box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n  color: #198754;\n}\n\n.form-check-inline .form-check-input ~ .valid-feedback {\n  margin-left: 0.5em;\n}\n\n.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid,\n.was-validated .input-group .form-select:valid,\n.input-group .form-select.is-valid {\n  z-index: 1;\n}\n.was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus,\n.was-validated .input-group .form-select:valid:focus,\n.input-group .form-select.is-valid:focus {\n  z-index: 3;\n}\n\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 0.875em;\n  color: #dc3545;\n}\n\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: 0.1rem;\n  font-size: 0.875rem;\n  color: #fff;\n  background-color: rgba(220, 53, 69, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n  border-color: #dc3545;\n  padding-right: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: right calc(0.375em + 0.1875rem) center;\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n  padding-right: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:invalid, .form-select.is-invalid {\n  border-color: #dc3545;\n}\n.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size=\"1\"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size=\"1\"] {\n  padding-right: 4.125rem;\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\"), url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n  background-position: right 0.75rem center, center right 2.25rem;\n  background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-check-input:invalid, .form-check-input.is-invalid {\n  border-color: #dc3545;\n}\n.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {\n  background-color: #dc3545;\n}\n.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {\n  box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n  color: #dc3545;\n}\n\n.form-check-inline .form-check-input ~ .invalid-feedback {\n  margin-left: 0.5em;\n}\n\n.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid,\n.was-validated .input-group .form-select:invalid,\n.input-group .form-select.is-invalid {\n  z-index: 2;\n}\n.was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus,\n.was-validated .input-group .form-select:invalid:focus,\n.input-group .form-select.is-invalid:focus {\n  z-index: 3;\n}\n\n.btn {\n  display: inline-block;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: center;\n  text-decoration: none;\n  vertical-align: middle;\n  cursor: pointer;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n  background-color: transparent;\n  border: 1px solid transparent;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .btn {\n    transition: none;\n  }\n}\n.btn:hover {\n  color: #212529;\n}\n.btn-check:focus + .btn, .btn:focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.btn:disabled, .btn.disabled, fieldset:disabled .btn {\n  pointer-events: none;\n  opacity: 0.65;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.btn-primary:hover {\n  color: #fff;\n  background-color: #0b5ed7;\n  border-color: #0a58ca;\n}\n.btn-check:focus + .btn-primary, .btn-primary:focus {\n  color: #fff;\n  background-color: #0b5ed7;\n  border-color: #0a58ca;\n  box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);\n}\n.btn-check:checked + .btn-primary, .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active, .show > .btn-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #0a58ca;\n  border-color: #0a53be;\n}\n.btn-check:checked + .btn-primary:focus, .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus, .show > .btn-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);\n}\n.btn-primary:disabled, .btn-primary.disabled {\n  color: #fff;\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n\n.btn-secondary {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n.btn-secondary:hover {\n  color: #fff;\n  background-color: #5c636a;\n  border-color: #565e64;\n}\n.btn-check:focus + .btn-secondary, .btn-secondary:focus {\n  color: #fff;\n  background-color: #5c636a;\n  border-color: #565e64;\n  box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);\n}\n.btn-check:checked + .btn-secondary, .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #565e64;\n  border-color: #51585e;\n}\n.btn-check:checked + .btn-secondary:focus, .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus, .show > .btn-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);\n}\n.btn-secondary:disabled, .btn-secondary.disabled {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-success {\n  color: #fff;\n  background-color: #198754;\n  border-color: #198754;\n}\n.btn-success:hover {\n  color: #fff;\n  background-color: #157347;\n  border-color: #146c43;\n}\n.btn-check:focus + .btn-success, .btn-success:focus {\n  color: #fff;\n  background-color: #157347;\n  border-color: #146c43;\n  box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);\n}\n.btn-check:checked + .btn-success, .btn-check:active + .btn-success, .btn-success:active, .btn-success.active, .show > .btn-success.dropdown-toggle {\n  color: #fff;\n  background-color: #146c43;\n  border-color: #13653f;\n}\n.btn-check:checked + .btn-success:focus, .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus, .show > .btn-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);\n}\n.btn-success:disabled, .btn-success.disabled {\n  color: #fff;\n  background-color: #198754;\n  border-color: #198754;\n}\n\n.btn-info {\n  color: #000;\n  background-color: #0dcaf0;\n  border-color: #0dcaf0;\n}\n.btn-info:hover {\n  color: #000;\n  background-color: #31d2f2;\n  border-color: #25cff2;\n}\n.btn-check:focus + .btn-info, .btn-info:focus {\n  color: #000;\n  background-color: #31d2f2;\n  border-color: #25cff2;\n  box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);\n}\n.btn-check:checked + .btn-info, .btn-check:active + .btn-info, .btn-info:active, .btn-info.active, .show > .btn-info.dropdown-toggle {\n  color: #000;\n  background-color: #3dd5f3;\n  border-color: #25cff2;\n}\n.btn-check:checked + .btn-info:focus, .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus, .show > .btn-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);\n}\n.btn-info:disabled, .btn-info.disabled {\n  color: #000;\n  background-color: #0dcaf0;\n  border-color: #0dcaf0;\n}\n\n.btn-warning {\n  color: #000;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n.btn-warning:hover {\n  color: #000;\n  background-color: #ffca2c;\n  border-color: #ffc720;\n}\n.btn-check:focus + .btn-warning, .btn-warning:focus {\n  color: #000;\n  background-color: #ffca2c;\n  border-color: #ffc720;\n  box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);\n}\n.btn-check:checked + .btn-warning, .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active, .show > .btn-warning.dropdown-toggle {\n  color: #000;\n  background-color: #ffcd39;\n  border-color: #ffc720;\n}\n.btn-check:checked + .btn-warning:focus, .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus, .show > .btn-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);\n}\n.btn-warning:disabled, .btn-warning.disabled {\n  color: #000;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-danger {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n.btn-danger:hover {\n  color: #fff;\n  background-color: #bb2d3b;\n  border-color: #b02a37;\n}\n.btn-check:focus + .btn-danger, .btn-danger:focus {\n  color: #fff;\n  background-color: #bb2d3b;\n  border-color: #b02a37;\n  box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);\n}\n.btn-check:checked + .btn-danger, .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active, .show > .btn-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #b02a37;\n  border-color: #a52834;\n}\n.btn-check:checked + .btn-danger:focus, .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus, .show > .btn-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);\n}\n.btn-danger:disabled, .btn-danger.disabled {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-light {\n  color: #000;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n.btn-light:hover {\n  color: #000;\n  background-color: #f9fafb;\n  border-color: #f9fafb;\n}\n.btn-check:focus + .btn-light, .btn-light:focus {\n  color: #000;\n  background-color: #f9fafb;\n  border-color: #f9fafb;\n  box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);\n}\n.btn-check:checked + .btn-light, .btn-check:active + .btn-light, .btn-light:active, .btn-light.active, .show > .btn-light.dropdown-toggle {\n  color: #000;\n  background-color: #f9fafb;\n  border-color: #f9fafb;\n}\n.btn-check:checked + .btn-light:focus, .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show > .btn-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);\n}\n.btn-light:disabled, .btn-light.disabled {\n  color: #000;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-dark {\n  color: #fff;\n  background-color: #212529;\n  border-color: #212529;\n}\n.btn-dark:hover {\n  color: #fff;\n  background-color: #1c1f23;\n  border-color: #1a1e21;\n}\n.btn-check:focus + .btn-dark, .btn-dark:focus {\n  color: #fff;\n  background-color: #1c1f23;\n  border-color: #1a1e21;\n  box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);\n}\n.btn-check:checked + .btn-dark, .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active, .show > .btn-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #1a1e21;\n  border-color: #191c1f;\n}\n.btn-check:checked + .btn-dark:focus, .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus, .show > .btn-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);\n}\n.btn-dark:disabled, .btn-dark.disabled {\n  color: #fff;\n  background-color: #212529;\n  border-color: #212529;\n}\n\n.btn-outline-primary {\n  color: #0d6efd;\n  border-color: #0d6efd;\n}\n.btn-outline-primary:hover {\n  color: #fff;\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus {\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);\n}\n.btn-check:checked + .btn-outline-primary, .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show {\n  color: #fff;\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.btn-check:checked + .btn-outline-primary:focus, .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);\n}\n.btn-outline-primary:disabled, .btn-outline-primary.disabled {\n  color: #0d6efd;\n  background-color: transparent;\n}\n\n.btn-outline-secondary {\n  color: #6c757d;\n  border-color: #6c757d;\n}\n.btn-outline-secondary:hover {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n.btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus {\n  box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);\n}\n.btn-check:checked + .btn-outline-secondary, .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n.btn-check:checked + .btn-outline-secondary:focus, .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);\n}\n.btn-outline-secondary:disabled, .btn-outline-secondary.disabled {\n  color: #6c757d;\n  background-color: transparent;\n}\n\n.btn-outline-success {\n  color: #198754;\n  border-color: #198754;\n}\n.btn-outline-success:hover {\n  color: #fff;\n  background-color: #198754;\n  border-color: #198754;\n}\n.btn-check:focus + .btn-outline-success, .btn-outline-success:focus {\n  box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);\n}\n.btn-check:checked + .btn-outline-success, .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show {\n  color: #fff;\n  background-color: #198754;\n  border-color: #198754;\n}\n.btn-check:checked + .btn-outline-success:focus, .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);\n}\n.btn-outline-success:disabled, .btn-outline-success.disabled {\n  color: #198754;\n  background-color: transparent;\n}\n\n.btn-outline-info {\n  color: #0dcaf0;\n  border-color: #0dcaf0;\n}\n.btn-outline-info:hover {\n  color: #000;\n  background-color: #0dcaf0;\n  border-color: #0dcaf0;\n}\n.btn-check:focus + .btn-outline-info, .btn-outline-info:focus {\n  box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);\n}\n.btn-check:checked + .btn-outline-info, .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show {\n  color: #000;\n  background-color: #0dcaf0;\n  border-color: #0dcaf0;\n}\n.btn-check:checked + .btn-outline-info:focus, .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);\n}\n.btn-outline-info:disabled, .btn-outline-info.disabled {\n  color: #0dcaf0;\n  background-color: transparent;\n}\n\n.btn-outline-warning {\n  color: #ffc107;\n  border-color: #ffc107;\n}\n.btn-outline-warning:hover {\n  color: #000;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n.btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus {\n  box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);\n}\n.btn-check:checked + .btn-outline-warning, .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show {\n  color: #000;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n.btn-check:checked + .btn-outline-warning:focus, .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);\n}\n.btn-outline-warning:disabled, .btn-outline-warning.disabled {\n  color: #ffc107;\n  background-color: transparent;\n}\n\n.btn-outline-danger {\n  color: #dc3545;\n  border-color: #dc3545;\n}\n.btn-outline-danger:hover {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n.btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus {\n  box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);\n}\n.btn-check:checked + .btn-outline-danger, .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n.btn-check:checked + .btn-outline-danger:focus, .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);\n}\n.btn-outline-danger:disabled, .btn-outline-danger.disabled {\n  color: #dc3545;\n  background-color: transparent;\n}\n\n.btn-outline-light {\n  color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n.btn-outline-light:hover {\n  color: #000;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n.btn-check:focus + .btn-outline-light, .btn-outline-light:focus {\n  box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);\n}\n.btn-check:checked + .btn-outline-light, .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show {\n  color: #000;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n.btn-check:checked + .btn-outline-light:focus, .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);\n}\n.btn-outline-light:disabled, .btn-outline-light.disabled {\n  color: #f8f9fa;\n  background-color: transparent;\n}\n\n.btn-outline-dark {\n  color: #212529;\n  border-color: #212529;\n}\n.btn-outline-dark:hover {\n  color: #fff;\n  background-color: #212529;\n  border-color: #212529;\n}\n.btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus {\n  box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);\n}\n.btn-check:checked + .btn-outline-dark, .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show {\n  color: #fff;\n  background-color: #212529;\n  border-color: #212529;\n}\n.btn-check:checked + .btn-outline-dark:focus, .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);\n}\n.btn-outline-dark:disabled, .btn-outline-dark.disabled {\n  color: #212529;\n  background-color: transparent;\n}\n\n.btn-link {\n  font-weight: 400;\n  color: #0d6efd;\n  text-decoration: underline;\n}\n.btn-link:hover {\n  color: #0a58ca;\n}\n.btn-link:disabled, .btn-link.disabled {\n  color: #6c757d;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  border-radius: 0.2rem;\n}\n\n.fade {\n  transition: opacity 0.15s linear;\n}\n@media (prefers-reduced-motion: reduce) {\n  .fade {\n    transition: none;\n  }\n}\n.fade:not(.show) {\n  opacity: 0;\n}\n\n.collapse:not(.show) {\n  display: none;\n}\n\n.collapsing {\n  height: 0;\n  overflow: hidden;\n  transition: height 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .collapsing {\n    transition: none;\n  }\n}\n.collapsing.collapse-horizontal {\n  width: 0;\n  height: auto;\n  transition: width 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .collapsing.collapse-horizontal {\n    transition: none;\n  }\n}\n\n.dropup,\n.dropend,\n.dropdown,\n.dropstart {\n  position: relative;\n}\n\n.dropdown-toggle {\n  white-space: nowrap;\n}\n.dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0;\n  border-left: 0.3em solid transparent;\n}\n.dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  z-index: 1000;\n  display: none;\n  min-width: 10rem;\n  padding: 0.5rem 0;\n  margin: 0;\n  font-size: 1rem;\n  color: #212529;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n}\n.dropdown-menu[data-bs-popper] {\n  top: 100%;\n  left: 0;\n  margin-top: 0.125rem;\n}\n\n.dropdown-menu-start {\n  --bs-position: start;\n}\n.dropdown-menu-start[data-bs-popper] {\n  right: auto;\n  left: 0;\n}\n\n.dropdown-menu-end {\n  --bs-position: end;\n}\n.dropdown-menu-end[data-bs-popper] {\n  right: 0;\n  left: auto;\n}\n\n@media (min-width: 576px) {\n  .dropdown-menu-sm-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-sm-start[data-bs-popper] {\n    right: auto;\n    left: 0;\n  }\n\n  .dropdown-menu-sm-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-sm-end[data-bs-popper] {\n    right: 0;\n    left: auto;\n  }\n}\n@media (min-width: 768px) {\n  .dropdown-menu-md-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-md-start[data-bs-popper] {\n    right: auto;\n    left: 0;\n  }\n\n  .dropdown-menu-md-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-md-end[data-bs-popper] {\n    right: 0;\n    left: auto;\n  }\n}\n@media (min-width: 992px) {\n  .dropdown-menu-lg-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-lg-start[data-bs-popper] {\n    right: auto;\n    left: 0;\n  }\n\n  .dropdown-menu-lg-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-lg-end[data-bs-popper] {\n    right: 0;\n    left: auto;\n  }\n}\n@media (min-width: 1200px) {\n  .dropdown-menu-xl-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-xl-start[data-bs-popper] {\n    right: auto;\n    left: 0;\n  }\n\n  .dropdown-menu-xl-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-xl-end[data-bs-popper] {\n    right: 0;\n    left: auto;\n  }\n}\n@media (min-width: 1400px) {\n  .dropdown-menu-xxl-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-xxl-start[data-bs-popper] {\n    right: auto;\n    left: 0;\n  }\n\n  .dropdown-menu-xxl-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-xxl-end[data-bs-popper] {\n    right: 0;\n    left: auto;\n  }\n}\n.dropup .dropdown-menu[data-bs-popper] {\n  top: auto;\n  bottom: 100%;\n  margin-top: 0;\n  margin-bottom: 0.125rem;\n}\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-left: 0.3em solid transparent;\n}\n.dropup .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropend .dropdown-menu[data-bs-popper] {\n  top: 0;\n  right: auto;\n  left: 100%;\n  margin-top: 0;\n  margin-left: 0.125rem;\n}\n.dropend .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0;\n  border-bottom: 0.3em solid transparent;\n  border-left: 0.3em solid;\n}\n.dropend .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n.dropend .dropdown-toggle::after {\n  vertical-align: 0;\n}\n\n.dropstart .dropdown-menu[data-bs-popper] {\n  top: 0;\n  right: 100%;\n  left: auto;\n  margin-top: 0;\n  margin-right: 0.125rem;\n}\n.dropstart .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n.dropstart .dropdown-toggle::after {\n  display: none;\n}\n.dropstart .dropdown-toggle::before {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n.dropstart .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n.dropstart .dropdown-toggle::before {\n  vertical-align: 0;\n}\n\n.dropdown-divider {\n  height: 0;\n  margin: 0.5rem 0;\n  overflow: hidden;\n  border-top: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: 0.25rem 1rem;\n  clear: both;\n  font-weight: 400;\n  color: #212529;\n  text-align: inherit;\n  text-decoration: none;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n}\n.dropdown-item:hover, .dropdown-item:focus {\n  color: #1e2125;\n  background-color: #e9ecef;\n}\n.dropdown-item.active, .dropdown-item:active {\n  color: #fff;\n  text-decoration: none;\n  background-color: #0d6efd;\n}\n.dropdown-item.disabled, .dropdown-item:disabled {\n  color: #adb5bd;\n  pointer-events: none;\n  background-color: transparent;\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 0.5rem 1rem;\n  margin-bottom: 0;\n  font-size: 0.875rem;\n  color: #6c757d;\n  white-space: nowrap;\n}\n\n.dropdown-item-text {\n  display: block;\n  padding: 0.25rem 1rem;\n  color: #212529;\n}\n\n.dropdown-menu-dark {\n  color: #dee2e6;\n  background-color: #343a40;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.dropdown-menu-dark .dropdown-item {\n  color: #dee2e6;\n}\n.dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus {\n  color: #fff;\n  background-color: rgba(255, 255, 255, 0.15);\n}\n.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active {\n  color: #fff;\n  background-color: #0d6efd;\n}\n.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled {\n  color: #adb5bd;\n}\n.dropdown-menu-dark .dropdown-divider {\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.dropdown-menu-dark .dropdown-item-text {\n  color: #dee2e6;\n}\n.dropdown-menu-dark .dropdown-header {\n  color: #adb5bd;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-flex;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  flex: 1 1 auto;\n}\n.btn-group > .btn-check:checked + .btn,\n.btn-group > .btn-check:focus + .btn,\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn-check:checked + .btn,\n.btn-group-vertical > .btn-check:focus + .btn,\n.btn-group-vertical > .btn:hover,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\n\n.btn-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-start;\n}\n.btn-toolbar .input-group {\n  width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n  margin-left: -1px;\n}\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group > .btn:nth-child(n+3),\n.btn-group > :not(.btn-check) + .btn,\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n  padding-right: 0.5625rem;\n  padding-left: 0.5625rem;\n}\n.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {\n  margin-left: 0;\n}\n.dropstart .dropdown-toggle-split::before {\n  margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-right: 0.375rem;\n  padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-right: 0.75rem;\n  padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  width: 100%;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n  margin-top: -1px;\n}\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn ~ .btn,\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.nav {\n  display: flex;\n  flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: 0.5rem 1rem;\n  color: #0d6efd;\n  text-decoration: none;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .nav-link {\n    transition: none;\n  }\n}\n.nav-link:hover, .nav-link:focus {\n  color: #0a58ca;\n}\n.nav-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: default;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dee2e6;\n}\n.nav-tabs .nav-link {\n  margin-bottom: -1px;\n  background: none;\n  border: 1px solid transparent;\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n  border-color: #e9ecef #e9ecef #dee2e6;\n  isolation: isolate;\n}\n.nav-tabs .nav-link.disabled {\n  color: #6c757d;\n  background-color: transparent;\n  border-color: transparent;\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: #495057;\n  background-color: #fff;\n  border-color: #dee2e6 #dee2e6 #fff;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n  background: none;\n  border: 0;\n  border-radius: 0.25rem;\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #0d6efd;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n  flex: 1 1 auto;\n  text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n  flex-basis: 0;\n  flex-grow: 1;\n  text-align: center;\n}\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n  width: 100%;\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n\n.navbar {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n.navbar > .container,\n.navbar > .container-fluid,\n.navbar > .container-sm,\n.navbar > .container-md,\n.navbar > .container-lg,\n.navbar > .container-xl,\n.navbar > .container-xxl {\n  display: flex;\n  flex-wrap: inherit;\n  align-items: center;\n  justify-content: space-between;\n}\n.navbar-brand {\n  padding-top: 0.3125rem;\n  padding-bottom: 0.3125rem;\n  margin-right: 1rem;\n  font-size: 1.25rem;\n  text-decoration: none;\n  white-space: nowrap;\n}\n.navbar-nav {\n  display: flex;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.navbar-nav .nav-link {\n  padding-right: 0;\n  padding-left: 0;\n}\n.navbar-nav .dropdown-menu {\n  position: static;\n}\n\n.navbar-text {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n  flex-basis: 100%;\n  flex-grow: 1;\n  align-items: center;\n}\n\n.navbar-toggler {\n  padding: 0.25rem 0.75rem;\n  font-size: 1.25rem;\n  line-height: 1;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n  transition: box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .navbar-toggler {\n    transition: none;\n  }\n}\n.navbar-toggler:hover {\n  text-decoration: none;\n}\n.navbar-toggler:focus {\n  text-decoration: none;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem;\n}\n\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  background-repeat: no-repeat;\n  background-position: center;\n  background-size: 100%;\n}\n\n.navbar-nav-scroll {\n  max-height: var(--bs-scroll-height, 75vh);\n  overflow-y: auto;\n}\n\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-sm .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-sm .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-sm .offcanvas {\n    position: inherit;\n    bottom: 0;\n    z-index: 1000;\n    flex-grow: 1;\n    visibility: visible !important;\n    background-color: transparent;\n    border-right: 0;\n    border-left: 0;\n    transition: none;\n    transform: none;\n  }\n  .navbar-expand-sm .offcanvas-top,\n.navbar-expand-sm .offcanvas-bottom {\n    height: auto;\n    border-top: 0;\n    border-bottom: 0;\n  }\n  .navbar-expand-sm .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-md .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-md .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-md .offcanvas {\n    position: inherit;\n    bottom: 0;\n    z-index: 1000;\n    flex-grow: 1;\n    visibility: visible !important;\n    background-color: transparent;\n    border-right: 0;\n    border-left: 0;\n    transition: none;\n    transform: none;\n  }\n  .navbar-expand-md .offcanvas-top,\n.navbar-expand-md .offcanvas-bottom {\n    height: auto;\n    border-top: 0;\n    border-bottom: 0;\n  }\n  .navbar-expand-md .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-lg .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-lg .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-lg .offcanvas {\n    position: inherit;\n    bottom: 0;\n    z-index: 1000;\n    flex-grow: 1;\n    visibility: visible !important;\n    background-color: transparent;\n    border-right: 0;\n    border-left: 0;\n    transition: none;\n    transform: none;\n  }\n  .navbar-expand-lg .offcanvas-top,\n.navbar-expand-lg .offcanvas-bottom {\n    height: auto;\n    border-top: 0;\n    border-bottom: 0;\n  }\n  .navbar-expand-lg .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-xl .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-xl .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-xl .offcanvas {\n    position: inherit;\n    bottom: 0;\n    z-index: 1000;\n    flex-grow: 1;\n    visibility: visible !important;\n    background-color: transparent;\n    border-right: 0;\n    border-left: 0;\n    transition: none;\n    transform: none;\n  }\n  .navbar-expand-xl .offcanvas-top,\n.navbar-expand-xl .offcanvas-bottom {\n    height: auto;\n    border-top: 0;\n    border-bottom: 0;\n  }\n  .navbar-expand-xl .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 1400px) {\n  .navbar-expand-xxl {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xxl .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-xxl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xxl .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-xxl .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-xxl .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-xxl .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-xxl .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-xxl .offcanvas {\n    position: inherit;\n    bottom: 0;\n    z-index: 1000;\n    flex-grow: 1;\n    visibility: visible !important;\n    background-color: transparent;\n    border-right: 0;\n    border-left: 0;\n    transition: none;\n    transform: none;\n  }\n  .navbar-expand-xxl .offcanvas-top,\n.navbar-expand-xxl .offcanvas-bottom {\n    height: auto;\n    border-top: 0;\n    border-bottom: 0;\n  }\n  .navbar-expand-xxl .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n.navbar-expand {\n  flex-wrap: nowrap;\n  justify-content: flex-start;\n}\n.navbar-expand .navbar-nav {\n  flex-direction: row;\n}\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n.navbar-expand .navbar-nav .nav-link {\n  padding-right: 0.5rem;\n  padding-left: 0.5rem;\n}\n.navbar-expand .navbar-nav-scroll {\n  overflow: visible;\n}\n.navbar-expand .navbar-collapse {\n  display: flex !important;\n  flex-basis: auto;\n}\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n.navbar-expand .offcanvas-header {\n  display: none;\n}\n.navbar-expand .offcanvas {\n  position: inherit;\n  bottom: 0;\n  z-index: 1000;\n  flex-grow: 1;\n  visibility: visible !important;\n  background-color: transparent;\n  border-right: 0;\n  border-left: 0;\n  transition: none;\n  transform: none;\n}\n.navbar-expand .offcanvas-top,\n.navbar-expand .offcanvas-bottom {\n  height: auto;\n  border-top: 0;\n  border-bottom: 0;\n}\n.navbar-expand .offcanvas-body {\n  display: flex;\n  flex-grow: 0;\n  padding: 0;\n  overflow-y: visible;\n}\n\n.navbar-light .navbar-brand {\n  color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-nav .nav-link {\n  color: rgba(0, 0, 0, 0.55);\n}\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n  color: rgba(0, 0, 0, 0.7);\n}\n.navbar-light .navbar-nav .nav-link.disabled {\n  color: rgba(0, 0, 0, 0.3);\n}\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .nav-link.active {\n  color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-toggler {\n  color: rgba(0, 0, 0, 0.55);\n  border-color: rgba(0, 0, 0, 0.1);\n}\n.navbar-light .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n.navbar-light .navbar-text {\n  color: rgba(0, 0, 0, 0.55);\n}\n.navbar-light .navbar-text a,\n.navbar-light .navbar-text a:hover,\n.navbar-light .navbar-text a:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n  color: #fff;\n}\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n  color: #fff;\n}\n.navbar-dark .navbar-nav .nav-link {\n  color: rgba(255, 255, 255, 0.55);\n}\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n  color: rgba(255, 255, 255, 0.75);\n}\n.navbar-dark .navbar-nav .nav-link.disabled {\n  color: rgba(255, 255, 255, 0.25);\n}\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .nav-link.active {\n  color: #fff;\n}\n.navbar-dark .navbar-toggler {\n  color: rgba(255, 255, 255, 0.55);\n  border-color: rgba(255, 255, 255, 0.1);\n}\n.navbar-dark .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n.navbar-dark .navbar-text {\n  color: rgba(255, 255, 255, 0.55);\n}\n.navbar-dark .navbar-text a,\n.navbar-dark .navbar-text a:hover,\n.navbar-dark .navbar-text a:focus {\n  color: #fff;\n}\n\n.card {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: border-box;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n  border-radius: 0.25rem;\n}\n.card > hr {\n  margin-right: 0;\n  margin-left: 0;\n}\n.card > .list-group {\n  border-top: inherit;\n  border-bottom: inherit;\n}\n.card > .list-group:first-child {\n  border-top-width: 0;\n  border-top-left-radius: calc(0.25rem - 1px);\n  border-top-right-radius: calc(0.25rem - 1px);\n}\n.card > .list-group:last-child {\n  border-bottom-width: 0;\n  border-bottom-right-radius: calc(0.25rem - 1px);\n  border-bottom-left-radius: calc(0.25rem - 1px);\n}\n.card > .card-header + .list-group,\n.card > .list-group + .card-footer {\n  border-top: 0;\n}\n\n.card-body {\n  flex: 1 1 auto;\n  padding: 1rem 1rem;\n}\n\n.card-title {\n  margin-bottom: 0.5rem;\n}\n\n.card-subtitle {\n  margin-top: -0.25rem;\n  margin-bottom: 0;\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link + .card-link {\n  margin-left: 1rem;\n}\n\n.card-header {\n  padding: 0.5rem 1rem;\n  margin-bottom: 0;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-header:first-child {\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n  padding: 0.5rem 1rem;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-footer:last-child {\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n  margin-right: -0.5rem;\n  margin-bottom: -0.5rem;\n  margin-left: -0.5rem;\n  border-bottom: 0;\n}\n\n.card-header-pills {\n  margin-right: -0.5rem;\n  margin-left: -0.5rem;\n}\n\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 1rem;\n  border-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n  width: 100%;\n}\n\n.card-img,\n.card-img-top {\n  border-top-left-radius: calc(0.25rem - 1px);\n  border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-bottom {\n  border-bottom-right-radius: calc(0.25rem - 1px);\n  border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-group > .card {\n  margin-bottom: 0.75rem;\n}\n@media (min-width: 576px) {\n  .card-group {\n    display: flex;\n    flex-flow: row wrap;\n  }\n  .card-group > .card {\n    flex: 1 0 0%;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-left: 0;\n    border-left: 0;\n  }\n  .card-group > .card:not(:last-child) {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-top,\n.card-group > .card:not(:last-child) .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-bottom,\n.card-group > .card:not(:last-child) .card-footer {\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:first-child) {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-top,\n.card-group > .card:not(:first-child) .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-bottom,\n.card-group > .card:not(:first-child) .card-footer {\n    border-bottom-left-radius: 0;\n  }\n}\n\n.accordion-button {\n  position: relative;\n  display: flex;\n  align-items: center;\n  width: 100%;\n  padding: 1rem 1.25rem;\n  font-size: 1rem;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n  border: 0;\n  border-radius: 0;\n  overflow-anchor: none;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .accordion-button {\n    transition: none;\n  }\n}\n.accordion-button:not(.collapsed) {\n  color: #0c63e4;\n  background-color: #e7f1ff;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125);\n}\n.accordion-button:not(.collapsed)::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n  transform: rotate(-180deg);\n}\n.accordion-button::after {\n  flex-shrink: 0;\n  width: 1.25rem;\n  height: 1.25rem;\n  margin-left: auto;\n  content: \"\";\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-size: 1.25rem;\n  transition: transform 0.2s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .accordion-button::after {\n    transition: none;\n  }\n}\n.accordion-button:hover {\n  z-index: 2;\n}\n.accordion-button:focus {\n  z-index: 3;\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n\n.accordion-header {\n  margin-bottom: 0;\n}\n\n.accordion-item {\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n.accordion-item:first-of-type {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n.accordion-item:first-of-type .accordion-button {\n  border-top-left-radius: calc(0.25rem - 1px);\n  border-top-right-radius: calc(0.25rem - 1px);\n}\n.accordion-item:not(:first-of-type) {\n  border-top: 0;\n}\n.accordion-item:last-of-type {\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n.accordion-item:last-of-type .accordion-button.collapsed {\n  border-bottom-right-radius: calc(0.25rem - 1px);\n  border-bottom-left-radius: calc(0.25rem - 1px);\n}\n.accordion-item:last-of-type .accordion-collapse {\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.accordion-body {\n  padding: 1rem 1.25rem;\n}\n\n.accordion-flush .accordion-collapse {\n  border-width: 0;\n}\n.accordion-flush .accordion-item {\n  border-right: 0;\n  border-left: 0;\n  border-radius: 0;\n}\n.accordion-flush .accordion-item:first-child {\n  border-top: 0;\n}\n.accordion-flush .accordion-item:last-child {\n  border-bottom: 0;\n}\n.accordion-flush .accordion-item .accordion-button {\n  border-radius: 0;\n}\n\n.breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  padding: 0 0;\n  margin-bottom: 1rem;\n  list-style: none;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n  padding-left: 0.5rem;\n}\n.breadcrumb-item + .breadcrumb-item::before {\n  float: left;\n  padding-right: 0.5rem;\n  color: #6c757d;\n  content: var(--bs-breadcrumb-divider, \"/\") /* rtl: var(--bs-breadcrumb-divider, \"/\") */;\n}\n.breadcrumb-item.active {\n  color: #6c757d;\n}\n\n.pagination {\n  display: flex;\n  padding-left: 0;\n  list-style: none;\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  color: #0d6efd;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .page-link {\n    transition: none;\n  }\n}\n.page-link:hover {\n  z-index: 2;\n  color: #0a58ca;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n.page-link:focus {\n  z-index: 3;\n  color: #0a58ca;\n  background-color: #e9ecef;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n\n.page-item:not(:first-child) .page-link {\n  margin-left: -1px;\n}\n.page-item.active .page-link {\n  z-index: 3;\n  color: #fff;\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.page-item.disabled .page-link {\n  color: #6c757d;\n  pointer-events: none;\n  background-color: #fff;\n  border-color: #dee2e6;\n}\n\n.page-link {\n  padding: 0.375rem 0.75rem;\n}\n\n.page-item:first-child .page-link {\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n.page-item:last-child .page-link {\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n\n.pagination-lg .page-link {\n  padding: 0.75rem 1.5rem;\n  font-size: 1.25rem;\n}\n.pagination-lg .page-item:first-child .page-link {\n  border-top-left-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n.pagination-lg .page-item:last-child .page-link {\n  border-top-right-radius: 0.3rem;\n  border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n}\n.pagination-sm .page-item:first-child .page-link {\n  border-top-left-radius: 0.2rem;\n  border-bottom-left-radius: 0.2rem;\n}\n.pagination-sm .page-item:last-child .page-link {\n  border-top-right-radius: 0.2rem;\n  border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n  display: inline-block;\n  padding: 0.35em 0.65em;\n  font-size: 0.75em;\n  font-weight: 700;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: 0.25rem;\n}\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.alert {\n  position: relative;\n  padding: 1rem 1rem;\n  margin-bottom: 1rem;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.alert-heading {\n  color: inherit;\n}\n\n.alert-link {\n  font-weight: 700;\n}\n\n.alert-dismissible {\n  padding-right: 3rem;\n}\n.alert-dismissible .btn-close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2;\n  padding: 1.25rem 1rem;\n}\n\n.alert-primary {\n  color: #084298;\n  background-color: #cfe2ff;\n  border-color: #b6d4fe;\n}\n.alert-primary .alert-link {\n  color: #06357a;\n}\n\n.alert-secondary {\n  color: #41464b;\n  background-color: #e2e3e5;\n  border-color: #d3d6d8;\n}\n.alert-secondary .alert-link {\n  color: #34383c;\n}\n\n.alert-success {\n  color: #0f5132;\n  background-color: #d1e7dd;\n  border-color: #badbcc;\n}\n.alert-success .alert-link {\n  color: #0c4128;\n}\n\n.alert-info {\n  color: #055160;\n  background-color: #cff4fc;\n  border-color: #b6effb;\n}\n.alert-info .alert-link {\n  color: #04414d;\n}\n\n.alert-warning {\n  color: #664d03;\n  background-color: #fff3cd;\n  border-color: #ffecb5;\n}\n.alert-warning .alert-link {\n  color: #523e02;\n}\n\n.alert-danger {\n  color: #842029;\n  background-color: #f8d7da;\n  border-color: #f5c2c7;\n}\n.alert-danger .alert-link {\n  color: #6a1a21;\n}\n\n.alert-light {\n  color: #636464;\n  background-color: #fefefe;\n  border-color: #fdfdfe;\n}\n.alert-light .alert-link {\n  color: #4f5050;\n}\n\n.alert-dark {\n  color: #141619;\n  background-color: #d3d3d4;\n  border-color: #bcbebf;\n}\n.alert-dark .alert-link {\n  color: #101214;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  0% {\n    background-position-x: 1rem;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  0% {\n    background-position-x: 1rem;\n  }\n}\n.progress {\n  display: flex;\n  height: 1rem;\n  overflow: hidden;\n  font-size: 0.75rem;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.progress-bar {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  overflow: hidden;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #0d6efd;\n  transition: width 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar {\n    transition: none;\n  }\n}\n\n.progress-bar-striped {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n  -webkit-animation: 1s linear infinite progress-bar-stripes;\n  animation: 1s linear infinite progress-bar-stripes;\n}\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar-animated {\n    -webkit-animation: none;\n    animation: none;\n  }\n}\n\n.list-group {\n  display: flex;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  border-radius: 0.25rem;\n}\n\n.list-group-numbered {\n  list-style-type: none;\n  counter-reset: section;\n}\n.list-group-numbered > li::before {\n  content: counters(section, \".\") \". \";\n  counter-increment: section;\n}\n\n.list-group-item-action {\n  width: 100%;\n  color: #495057;\n  text-align: inherit;\n}\n.list-group-item-action:hover, .list-group-item-action:focus {\n  z-index: 1;\n  color: #495057;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n.list-group-item-action:active {\n  color: #212529;\n  background-color: #e9ecef;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 0.5rem 1rem;\n  color: #212529;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n.list-group-item:first-child {\n  border-top-left-radius: inherit;\n  border-top-right-radius: inherit;\n}\n.list-group-item:last-child {\n  border-bottom-right-radius: inherit;\n  border-bottom-left-radius: inherit;\n}\n.list-group-item.disabled, .list-group-item:disabled {\n  color: #6c757d;\n  pointer-events: none;\n  background-color: #fff;\n}\n.list-group-item.active {\n  z-index: 2;\n  color: #fff;\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.list-group-item + .list-group-item {\n  border-top-width: 0;\n}\n.list-group-item + .list-group-item.active {\n  margin-top: -1px;\n  border-top-width: 1px;\n}\n\n.list-group-horizontal {\n  flex-direction: row;\n}\n.list-group-horizontal > .list-group-item:first-child {\n  border-bottom-left-radius: 0.25rem;\n  border-top-right-radius: 0;\n}\n.list-group-horizontal > .list-group-item:last-child {\n  border-top-right-radius: 0.25rem;\n  border-bottom-left-radius: 0;\n}\n.list-group-horizontal > .list-group-item.active {\n  margin-top: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item {\n  border-top-width: 1px;\n  border-left-width: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n  margin-left: -1px;\n  border-left-width: 1px;\n}\n\n@media (min-width: 576px) {\n  .list-group-horizontal-sm {\n    flex-direction: row;\n  }\n  .list-group-horizontal-sm > .list-group-item:first-child {\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item:last-child {\n    border-top-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-left-width: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n    margin-left: -1px;\n    border-left-width: 1px;\n  }\n}\n@media (min-width: 768px) {\n  .list-group-horizontal-md {\n    flex-direction: row;\n  }\n  .list-group-horizontal-md > .list-group-item:first-child {\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-md > .list-group-item:last-child {\n    border-top-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-md > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-md > .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-left-width: 0;\n  }\n  .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n    margin-left: -1px;\n    border-left-width: 1px;\n  }\n}\n@media (min-width: 992px) {\n  .list-group-horizontal-lg {\n    flex-direction: row;\n  }\n  .list-group-horizontal-lg > .list-group-item:first-child {\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item:last-child {\n    border-top-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-left-width: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n    margin-left: -1px;\n    border-left-width: 1px;\n  }\n}\n@media (min-width: 1200px) {\n  .list-group-horizontal-xl {\n    flex-direction: row;\n  }\n  .list-group-horizontal-xl > .list-group-item:first-child {\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item:last-child {\n    border-top-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-left-width: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n    margin-left: -1px;\n    border-left-width: 1px;\n  }\n}\n@media (min-width: 1400px) {\n  .list-group-horizontal-xxl {\n    flex-direction: row;\n  }\n  .list-group-horizontal-xxl > .list-group-item:first-child {\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item:last-child {\n    border-top-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-left-width: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {\n    margin-left: -1px;\n    border-left-width: 1px;\n  }\n}\n.list-group-flush {\n  border-radius: 0;\n}\n.list-group-flush > .list-group-item {\n  border-width: 0 0 1px;\n}\n.list-group-flush > .list-group-item:last-child {\n  border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n  color: #084298;\n  background-color: #cfe2ff;\n}\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n  color: #084298;\n  background-color: #bacbe6;\n}\n.list-group-item-primary.list-group-item-action.active {\n  color: #fff;\n  background-color: #084298;\n  border-color: #084298;\n}\n\n.list-group-item-secondary {\n  color: #41464b;\n  background-color: #e2e3e5;\n}\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n  color: #41464b;\n  background-color: #cbccce;\n}\n.list-group-item-secondary.list-group-item-action.active {\n  color: #fff;\n  background-color: #41464b;\n  border-color: #41464b;\n}\n\n.list-group-item-success {\n  color: #0f5132;\n  background-color: #d1e7dd;\n}\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n  color: #0f5132;\n  background-color: #bcd0c7;\n}\n.list-group-item-success.list-group-item-action.active {\n  color: #fff;\n  background-color: #0f5132;\n  border-color: #0f5132;\n}\n\n.list-group-item-info {\n  color: #055160;\n  background-color: #cff4fc;\n}\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n  color: #055160;\n  background-color: #badce3;\n}\n.list-group-item-info.list-group-item-action.active {\n  color: #fff;\n  background-color: #055160;\n  border-color: #055160;\n}\n\n.list-group-item-warning {\n  color: #664d03;\n  background-color: #fff3cd;\n}\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n  color: #664d03;\n  background-color: #e6dbb9;\n}\n.list-group-item-warning.list-group-item-action.active {\n  color: #fff;\n  background-color: #664d03;\n  border-color: #664d03;\n}\n\n.list-group-item-danger {\n  color: #842029;\n  background-color: #f8d7da;\n}\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n  color: #842029;\n  background-color: #dfc2c4;\n}\n.list-group-item-danger.list-group-item-action.active {\n  color: #fff;\n  background-color: #842029;\n  border-color: #842029;\n}\n\n.list-group-item-light {\n  color: #636464;\n  background-color: #fefefe;\n}\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n  color: #636464;\n  background-color: #e5e5e5;\n}\n.list-group-item-light.list-group-item-action.active {\n  color: #fff;\n  background-color: #636464;\n  border-color: #636464;\n}\n\n.list-group-item-dark {\n  color: #141619;\n  background-color: #d3d3d4;\n}\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n  color: #141619;\n  background-color: #bebebf;\n}\n.list-group-item-dark.list-group-item-action.active {\n  color: #fff;\n  background-color: #141619;\n  border-color: #141619;\n}\n\n.btn-close {\n  box-sizing: content-box;\n  width: 1em;\n  height: 1em;\n  padding: 0.25em 0.25em;\n  color: #000;\n  background: transparent url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e\") center/1em auto no-repeat;\n  border: 0;\n  border-radius: 0.25rem;\n  opacity: 0.5;\n}\n.btn-close:hover {\n  color: #000;\n  text-decoration: none;\n  opacity: 0.75;\n}\n.btn-close:focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n  opacity: 1;\n}\n.btn-close:disabled, .btn-close.disabled {\n  pointer-events: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n  opacity: 0.25;\n}\n\n.btn-close-white {\n  filter: invert(1) grayscale(100%) brightness(200%);\n}\n\n.toast {\n  width: 350px;\n  max-width: 100%;\n  font-size: 0.875rem;\n  pointer-events: auto;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n}\n.toast.showing {\n  opacity: 0;\n}\n.toast:not(.show) {\n  display: none;\n}\n\n.toast-container {\n  width: -webkit-max-content;\n  width: -moz-max-content;\n  width: max-content;\n  max-width: 100%;\n  pointer-events: none;\n}\n.toast-container > :not(:last-child) {\n  margin-bottom: 0.75rem;\n}\n\n.toast-header {\n  display: flex;\n  align-items: center;\n  padding: 0.5rem 0.75rem;\n  color: #6c757d;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n  border-top-left-radius: calc(0.25rem - 1px);\n  border-top-right-radius: calc(0.25rem - 1px);\n}\n.toast-header .btn-close {\n  margin-right: -0.375rem;\n  margin-left: 0.75rem;\n}\n\n.toast-body {\n  padding: 0.75rem;\n  word-wrap: break-word;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1055;\n  display: none;\n  width: 100%;\n  height: 100%;\n  overflow-x: hidden;\n  overflow-y: auto;\n  outline: 0;\n}\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 0.5rem;\n  pointer-events: none;\n}\n.modal.fade .modal-dialog {\n  transition: transform 0.3s ease-out;\n  transform: translate(0, -50px);\n}\n@media (prefers-reduced-motion: reduce) {\n  .modal.fade .modal-dialog {\n    transition: none;\n  }\n}\n.modal.show .modal-dialog {\n  transform: none;\n}\n.modal.modal-static .modal-dialog {\n  transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n  height: calc(100% - 1rem);\n}\n.modal-dialog-scrollable .modal-content {\n  max-height: 100%;\n  overflow: hidden;\n}\n.modal-dialog-scrollable .modal-body {\n  overflow-y: auto;\n}\n\n.modal-dialog-centered {\n  display: flex;\n  align-items: center;\n  min-height: calc(100% - 1rem);\n}\n\n.modal-content {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  pointer-events: auto;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n  outline: 0;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1050;\n  width: 100vw;\n  height: 100vh;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n}\n.modal-backdrop.show {\n  opacity: 0.5;\n}\n\n.modal-header {\n  display: flex;\n  flex-shrink: 0;\n  align-items: center;\n  justify-content: space-between;\n  padding: 1rem 1rem;\n  border-bottom: 1px solid #dee2e6;\n  border-top-left-radius: calc(0.3rem - 1px);\n  border-top-right-radius: calc(0.3rem - 1px);\n}\n.modal-header .btn-close {\n  padding: 0.5rem 0.5rem;\n  margin: -0.5rem -0.5rem -0.5rem auto;\n}\n\n.modal-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n\n.modal-body {\n  position: relative;\n  flex: 1 1 auto;\n  padding: 1rem;\n}\n\n.modal-footer {\n  display: flex;\n  flex-wrap: wrap;\n  flex-shrink: 0;\n  align-items: center;\n  justify-content: flex-end;\n  padding: 0.75rem;\n  border-top: 1px solid #dee2e6;\n  border-bottom-right-radius: calc(0.3rem - 1px);\n  border-bottom-left-radius: calc(0.3rem - 1px);\n}\n.modal-footer > * {\n  margin: 0.25rem;\n}\n\n@media (min-width: 576px) {\n  .modal-dialog {\n    max-width: 500px;\n    margin: 1.75rem auto;\n  }\n\n  .modal-dialog-scrollable {\n    height: calc(100% - 3.5rem);\n  }\n\n  .modal-dialog-centered {\n    min-height: calc(100% - 3.5rem);\n  }\n\n  .modal-sm {\n    max-width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg,\n.modal-xl {\n    max-width: 800px;\n  }\n}\n@media (min-width: 1200px) {\n  .modal-xl {\n    max-width: 1140px;\n  }\n}\n.modal-fullscreen {\n  width: 100vw;\n  max-width: none;\n  height: 100%;\n  margin: 0;\n}\n.modal-fullscreen .modal-content {\n  height: 100%;\n  border: 0;\n  border-radius: 0;\n}\n.modal-fullscreen .modal-header {\n  border-radius: 0;\n}\n.modal-fullscreen .modal-body {\n  overflow-y: auto;\n}\n.modal-fullscreen .modal-footer {\n  border-radius: 0;\n}\n\n@media (max-width: 575.98px) {\n  .modal-fullscreen-sm-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-sm-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-sm-down .modal-header {\n    border-radius: 0;\n  }\n  .modal-fullscreen-sm-down .modal-body {\n    overflow-y: auto;\n  }\n  .modal-fullscreen-sm-down .modal-footer {\n    border-radius: 0;\n  }\n}\n@media (max-width: 767.98px) {\n  .modal-fullscreen-md-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-md-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-md-down .modal-header {\n    border-radius: 0;\n  }\n  .modal-fullscreen-md-down .modal-body {\n    overflow-y: auto;\n  }\n  .modal-fullscreen-md-down .modal-footer {\n    border-radius: 0;\n  }\n}\n@media (max-width: 991.98px) {\n  .modal-fullscreen-lg-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-lg-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-lg-down .modal-header {\n    border-radius: 0;\n  }\n  .modal-fullscreen-lg-down .modal-body {\n    overflow-y: auto;\n  }\n  .modal-fullscreen-lg-down .modal-footer {\n    border-radius: 0;\n  }\n}\n@media (max-width: 1199.98px) {\n  .modal-fullscreen-xl-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-xl-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-xl-down .modal-header {\n    border-radius: 0;\n  }\n  .modal-fullscreen-xl-down .modal-body {\n    overflow-y: auto;\n  }\n  .modal-fullscreen-xl-down .modal-footer {\n    border-radius: 0;\n  }\n}\n@media (max-width: 1399.98px) {\n  .modal-fullscreen-xxl-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-xxl-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-xxl-down .modal-header {\n    border-radius: 0;\n  }\n  .modal-fullscreen-xxl-down .modal-body {\n    overflow-y: auto;\n  }\n  .modal-fullscreen-xxl-down .modal-footer {\n    border-radius: 0;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1080;\n  display: block;\n  margin: 0;\n  font-family: var(--bs-font-sans-serif);\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  opacity: 0;\n}\n.tooltip.show {\n  opacity: 0.9;\n}\n.tooltip .tooltip-arrow {\n  position: absolute;\n  display: block;\n  width: 0.8rem;\n  height: 0.4rem;\n}\n.tooltip .tooltip-arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[data-popper-placement^=top] {\n  padding: 0.4rem 0;\n}\n.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {\n  bottom: 0;\n}\n.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {\n  top: -1px;\n  border-width: 0.4rem 0.4rem 0;\n  border-top-color: #000;\n}\n\n.bs-tooltip-end, .bs-tooltip-auto[data-popper-placement^=right] {\n  padding: 0 0.4rem;\n}\n.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {\n  left: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {\n  right: -1px;\n  border-width: 0.4rem 0.4rem 0.4rem 0;\n  border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[data-popper-placement^=bottom] {\n  padding: 0.4rem 0;\n}\n.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {\n  top: 0;\n}\n.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {\n  bottom: -1px;\n  border-width: 0 0.4rem 0.4rem;\n  border-bottom-color: #000;\n}\n\n.bs-tooltip-start, .bs-tooltip-auto[data-popper-placement^=left] {\n  padding: 0 0.4rem;\n}\n.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {\n  right: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {\n  left: -1px;\n  border-width: 0.4rem 0 0.4rem 0.4rem;\n  border-left-color: #000;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 0.25rem 0.5rem;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 0.25rem;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0 /* rtl:ignore */;\n  z-index: 1070;\n  display: block;\n  max-width: 276px;\n  font-family: var(--bs-font-sans-serif);\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n}\n.popover .popover-arrow {\n  position: absolute;\n  display: block;\n  width: 1rem;\n  height: 0.5rem;\n}\n.popover .popover-arrow::before, .popover .popover-arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {\n  bottom: calc(-0.5rem - 1px);\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {\n  bottom: 0;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n  bottom: 1px;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: #fff;\n}\n\n.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {\n  left: calc(-0.5rem - 1px);\n  width: 0.5rem;\n  height: 1rem;\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {\n  left: 0;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n  left: 1px;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: #fff;\n}\n\n.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {\n  top: calc(-0.5rem - 1px);\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {\n  top: 0;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n  top: 1px;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: #fff;\n}\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  display: block;\n  width: 1rem;\n  margin-left: -0.5rem;\n  content: \"\";\n  border-bottom: 1px solid #f0f0f0;\n}\n\n.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {\n  right: calc(-0.5rem - 1px);\n  width: 0.5rem;\n  height: 1rem;\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {\n  right: 0;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n  right: 1px;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: #fff;\n}\n\n.popover-header {\n  padding: 0.5rem 1rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  background-color: #f0f0f0;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n  border-top-left-radius: calc(0.3rem - 1px);\n  border-top-right-radius: calc(0.3rem - 1px);\n}\n.popover-header:empty {\n  display: none;\n}\n\n.popover-body {\n  padding: 1rem 1rem;\n  color: #212529;\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel.pointer-event {\n  touch-action: pan-y;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  float: left;\n  width: 100%;\n  margin-right: -100%;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  transition: transform 0.6s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-item {\n    transition: none;\n  }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n/* rtl:begin:ignore */\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n  transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n  transform: translateX(-100%);\n}\n\n/* rtl:end:ignore */\n.carousel-fade .carousel-item {\n  opacity: 0;\n  transition-property: opacity;\n  transform: none;\n}\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-start,\n.carousel-fade .carousel-item-prev.carousel-item-end {\n  z-index: 1;\n  opacity: 1;\n}\n.carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n  z-index: 0;\n  opacity: 0;\n  transition: opacity 0s 0.6s;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n    transition: none;\n  }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 1;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 15%;\n  padding: 0;\n  color: #fff;\n  text-align: center;\n  background: none;\n  border: 0;\n  opacity: 0.5;\n  transition: opacity 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-control-prev,\n.carousel-control-next {\n    transition: none;\n  }\n}\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  opacity: 0.9;\n}\n\n.carousel-control-prev {\n  left: 0;\n}\n\n.carousel-control-next {\n  right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  background-repeat: no-repeat;\n  background-position: 50%;\n  background-size: 100% 100%;\n}\n\n/* rtl:options: {\n  \"autoRename\": true,\n  \"stringMap\":[ {\n    \"name\"    : \"prev-next\",\n    \"search\"  : \"prev\",\n    \"replace\" : \"next\"\n  } ]\n} */\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 2;\n  display: flex;\n  justify-content: center;\n  padding: 0;\n  margin-right: 15%;\n  margin-bottom: 1rem;\n  margin-left: 15%;\n  list-style: none;\n}\n.carousel-indicators [data-bs-target] {\n  box-sizing: content-box;\n  flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  padding: 0;\n  margin-right: 3px;\n  margin-left: 3px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 0;\n  border-top: 10px solid transparent;\n  border-bottom: 10px solid transparent;\n  opacity: 0.5;\n  transition: opacity 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-indicators [data-bs-target] {\n    transition: none;\n  }\n}\n.carousel-indicators .active {\n  opacity: 1;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 1.25rem;\n  left: 15%;\n  padding-top: 1.25rem;\n  padding-bottom: 1.25rem;\n  color: #fff;\n  text-align: center;\n}\n\n.carousel-dark .carousel-control-prev-icon,\n.carousel-dark .carousel-control-next-icon {\n  filter: invert(1) grayscale(100);\n}\n.carousel-dark .carousel-indicators [data-bs-target] {\n  background-color: #000;\n}\n.carousel-dark .carousel-caption {\n  color: #000;\n}\n\n@-webkit-keyframes spinner-border {\n  to {\n    transform: rotate(360deg) /* rtl:ignore */;\n  }\n}\n\n@keyframes spinner-border {\n  to {\n    transform: rotate(360deg) /* rtl:ignore */;\n  }\n}\n.spinner-border {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: -0.125em;\n  border: 0.25em solid currentColor;\n  border-right-color: transparent;\n  border-radius: 50%;\n  -webkit-animation: 0.75s linear infinite spinner-border;\n  animation: 0.75s linear infinite spinner-border;\n}\n\n.spinner-border-sm {\n  width: 1rem;\n  height: 1rem;\n  border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n  0% {\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n    transform: none;\n  }\n}\n\n@keyframes spinner-grow {\n  0% {\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n    transform: none;\n  }\n}\n.spinner-grow {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: -0.125em;\n  background-color: currentColor;\n  border-radius: 50%;\n  opacity: 0;\n  -webkit-animation: 0.75s linear infinite spinner-grow;\n  animation: 0.75s linear infinite spinner-grow;\n}\n\n.spinner-grow-sm {\n  width: 1rem;\n  height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .spinner-border,\n.spinner-grow {\n    -webkit-animation-duration: 1.5s;\n    animation-duration: 1.5s;\n  }\n}\n.offcanvas {\n  position: fixed;\n  bottom: 0;\n  z-index: 1045;\n  display: flex;\n  flex-direction: column;\n  max-width: 100%;\n  visibility: hidden;\n  background-color: #fff;\n  background-clip: padding-box;\n  outline: 0;\n  transition: transform 0.3s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .offcanvas {\n    transition: none;\n  }\n}\n\n.offcanvas-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1040;\n  width: 100vw;\n  height: 100vh;\n  background-color: #000;\n}\n.offcanvas-backdrop.fade {\n  opacity: 0;\n}\n.offcanvas-backdrop.show {\n  opacity: 0.5;\n}\n\n.offcanvas-header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 1rem 1rem;\n}\n.offcanvas-header .btn-close {\n  padding: 0.5rem 0.5rem;\n  margin-top: -0.5rem;\n  margin-right: -0.5rem;\n  margin-bottom: -0.5rem;\n}\n\n.offcanvas-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n\n.offcanvas-body {\n  flex-grow: 1;\n  padding: 1rem 1rem;\n  overflow-y: auto;\n}\n\n.offcanvas-start {\n  top: 0;\n  left: 0;\n  width: 400px;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n  transform: translateX(-100%);\n}\n\n.offcanvas-end {\n  top: 0;\n  right: 0;\n  width: 400px;\n  border-left: 1px solid rgba(0, 0, 0, 0.2);\n  transform: translateX(100%);\n}\n\n.offcanvas-top {\n  top: 0;\n  right: 0;\n  left: 0;\n  height: 30vh;\n  max-height: 100%;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n  transform: translateY(-100%);\n}\n\n.offcanvas-bottom {\n  right: 0;\n  left: 0;\n  height: 30vh;\n  max-height: 100%;\n  border-top: 1px solid rgba(0, 0, 0, 0.2);\n  transform: translateY(100%);\n}\n\n.offcanvas.show {\n  transform: none;\n}\n\n.placeholder {\n  display: inline-block;\n  min-height: 1em;\n  vertical-align: middle;\n  cursor: wait;\n  background-color: currentColor;\n  opacity: 0.5;\n}\n.placeholder.btn::before {\n  display: inline-block;\n  content: \"\";\n}\n\n.placeholder-xs {\n  min-height: 0.6em;\n}\n\n.placeholder-sm {\n  min-height: 0.8em;\n}\n\n.placeholder-lg {\n  min-height: 1.2em;\n}\n\n.placeholder-glow .placeholder {\n  -webkit-animation: placeholder-glow 2s ease-in-out infinite;\n  animation: placeholder-glow 2s ease-in-out infinite;\n}\n\n@-webkit-keyframes placeholder-glow {\n  50% {\n    opacity: 0.2;\n  }\n}\n\n@keyframes placeholder-glow {\n  50% {\n    opacity: 0.2;\n  }\n}\n.placeholder-wave {\n  -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n  mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n  -webkit-mask-size: 200% 100%;\n  mask-size: 200% 100%;\n  -webkit-animation: placeholder-wave 2s linear infinite;\n  animation: placeholder-wave 2s linear infinite;\n}\n\n@-webkit-keyframes placeholder-wave {\n  100% {\n    -webkit-mask-position: -200% 0%;\n    mask-position: -200% 0%;\n  }\n}\n\n@keyframes placeholder-wave {\n  100% {\n    -webkit-mask-position: -200% 0%;\n    mask-position: -200% 0%;\n  }\n}\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.link-primary {\n  color: #0d6efd;\n}\n.link-primary:hover, .link-primary:focus {\n  color: #0a58ca;\n}\n\n.link-secondary {\n  color: #6c757d;\n}\n.link-secondary:hover, .link-secondary:focus {\n  color: #565e64;\n}\n\n.link-success {\n  color: #198754;\n}\n.link-success:hover, .link-success:focus {\n  color: #146c43;\n}\n\n.link-info {\n  color: #0dcaf0;\n}\n.link-info:hover, .link-info:focus {\n  color: #3dd5f3;\n}\n\n.link-warning {\n  color: #ffc107;\n}\n.link-warning:hover, .link-warning:focus {\n  color: #ffcd39;\n}\n\n.link-danger {\n  color: #dc3545;\n}\n.link-danger:hover, .link-danger:focus {\n  color: #b02a37;\n}\n\n.link-light {\n  color: #f8f9fa;\n}\n.link-light:hover, .link-light:focus {\n  color: #f9fafb;\n}\n\n.link-dark {\n  color: #212529;\n}\n.link-dark:hover, .link-dark:focus {\n  color: #1a1e21;\n}\n\n.ratio {\n  position: relative;\n  width: 100%;\n}\n.ratio::before {\n  display: block;\n  padding-top: var(--bs-aspect-ratio);\n  content: \"\";\n}\n.ratio > * {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.ratio-1x1 {\n  --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n  --bs-aspect-ratio: calc(3 / 4 * 100%);\n}\n\n.ratio-16x9 {\n  --bs-aspect-ratio: calc(9 / 16 * 100%);\n}\n\n.ratio-21x9 {\n  --bs-aspect-ratio: calc(9 / 21 * 100%);\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.sticky-top {\n  position: -webkit-sticky;\n  position: sticky;\n  top: 0;\n  z-index: 1020;\n}\n\n@media (min-width: 576px) {\n  .sticky-sm-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 768px) {\n  .sticky-md-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 992px) {\n  .sticky-lg-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1200px) {\n  .sticky-xl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1400px) {\n  .sticky-xxl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n.hstack {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  align-self: stretch;\n}\n\n.vstack {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n  position: absolute !important;\n  width: 1px !important;\n  height: 1px !important;\n  padding: 0 !important;\n  margin: -1px !important;\n  overflow: hidden !important;\n  clip: rect(0, 0, 0, 0) !important;\n  white-space: nowrap !important;\n  border: 0 !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  content: \"\";\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.vr {\n  display: inline-block;\n  align-self: stretch;\n  width: 1px;\n  min-height: 1em;\n  background-color: currentColor;\n  opacity: 0.25;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.float-start {\n  float: left !important;\n}\n\n.float-end {\n  float: right !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n.opacity-0 {\n  opacity: 0 !important;\n}\n\n.opacity-25 {\n  opacity: 0.25 !important;\n}\n\n.opacity-50 {\n  opacity: 0.5 !important;\n}\n\n.opacity-75 {\n  opacity: 0.75 !important;\n}\n\n.opacity-100 {\n  opacity: 1 !important;\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.overflow-visible {\n  overflow: visible !important;\n}\n\n.overflow-scroll {\n  overflow: scroll !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-grid {\n  display: grid !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n.d-none {\n  display: none !important;\n}\n\n.shadow {\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-sm {\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow-lg {\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.top-0 {\n  top: 0 !important;\n}\n\n.top-50 {\n  top: 50% !important;\n}\n\n.top-100 {\n  top: 100% !important;\n}\n\n.bottom-0 {\n  bottom: 0 !important;\n}\n\n.bottom-50 {\n  bottom: 50% !important;\n}\n\n.bottom-100 {\n  bottom: 100% !important;\n}\n\n.start-0 {\n  left: 0 !important;\n}\n\n.start-50 {\n  left: 50% !important;\n}\n\n.start-100 {\n  left: 100% !important;\n}\n\n.end-0 {\n  right: 0 !important;\n}\n\n.end-50 {\n  right: 50% !important;\n}\n\n.end-100 {\n  right: 100% !important;\n}\n\n.translate-middle {\n  transform: translate(-50%, -50%) !important;\n}\n\n.translate-middle-x {\n  transform: translateX(-50%) !important;\n}\n\n.translate-middle-y {\n  transform: translateY(-50%) !important;\n}\n\n.border {\n  border: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top {\n  border-top: 1px solid #dee2e6 !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-end {\n  border-right: 1px solid #dee2e6 !important;\n}\n\n.border-end-0 {\n  border-right: 0 !important;\n}\n\n.border-bottom {\n  border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-start {\n  border-left: 1px solid #dee2e6 !important;\n}\n\n.border-start-0 {\n  border-left: 0 !important;\n}\n\n.border-primary {\n  border-color: #0d6efd !important;\n}\n\n.border-secondary {\n  border-color: #6c757d !important;\n}\n\n.border-success {\n  border-color: #198754 !important;\n}\n\n.border-info {\n  border-color: #0dcaf0 !important;\n}\n\n.border-warning {\n  border-color: #ffc107 !important;\n}\n\n.border-danger {\n  border-color: #dc3545 !important;\n}\n\n.border-light {\n  border-color: #f8f9fa !important;\n}\n\n.border-dark {\n  border-color: #212529 !important;\n}\n\n.border-white {\n  border-color: #fff !important;\n}\n\n.border-1 {\n  border-width: 1px !important;\n}\n\n.border-2 {\n  border-width: 2px !important;\n}\n\n.border-3 {\n  border-width: 3px !important;\n}\n\n.border-4 {\n  border-width: 4px !important;\n}\n\n.border-5 {\n  border-width: 5px !important;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.gap-0 {\n  gap: 0 !important;\n}\n\n.gap-1 {\n  gap: 0.25rem !important;\n}\n\n.gap-2 {\n  gap: 0.5rem !important;\n}\n\n.gap-3 {\n  gap: 1rem !important;\n}\n\n.gap-4 {\n  gap: 1.5rem !important;\n}\n\n.gap-5 {\n  gap: 3rem !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n  justify-content: space-evenly !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n.order-first {\n  order: -1 !important;\n}\n\n.order-0 {\n  order: 0 !important;\n}\n\n.order-1 {\n  order: 1 !important;\n}\n\n.order-2 {\n  order: 2 !important;\n}\n\n.order-3 {\n  order: 3 !important;\n}\n\n.order-4 {\n  order: 4 !important;\n}\n\n.order-5 {\n  order: 5 !important;\n}\n\n.order-last {\n  order: 6 !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mx-0 {\n  margin-right: 0 !important;\n  margin-left: 0 !important;\n}\n\n.mx-1 {\n  margin-right: 0.25rem !important;\n  margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n  margin-right: 0.5rem !important;\n  margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n  margin-right: 1rem !important;\n  margin-left: 1rem !important;\n}\n\n.mx-4 {\n  margin-right: 1.5rem !important;\n  margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n  margin-right: 3rem !important;\n  margin-left: 3rem !important;\n}\n\n.mx-auto {\n  margin-right: auto !important;\n  margin-left: auto !important;\n}\n\n.my-0 {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n.my-1 {\n  margin-top: 0.25rem !important;\n  margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n  margin-top: 0.5rem !important;\n  margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n  margin-top: 1rem !important;\n  margin-bottom: 1rem !important;\n}\n\n.my-4 {\n  margin-top: 1.5rem !important;\n  margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n  margin-top: 3rem !important;\n  margin-bottom: 3rem !important;\n}\n\n.my-auto {\n  margin-top: auto !important;\n  margin-bottom: auto !important;\n}\n\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.mt-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n  margin-top: 1rem !important;\n}\n\n.mt-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n  margin-top: 3rem !important;\n}\n\n.mt-auto {\n  margin-top: auto !important;\n}\n\n.me-0 {\n  margin-right: 0 !important;\n}\n\n.me-1 {\n  margin-right: 0.25rem !important;\n}\n\n.me-2 {\n  margin-right: 0.5rem !important;\n}\n\n.me-3 {\n  margin-right: 1rem !important;\n}\n\n.me-4 {\n  margin-right: 1.5rem !important;\n}\n\n.me-5 {\n  margin-right: 3rem !important;\n}\n\n.me-auto {\n  margin-right: auto !important;\n}\n\n.mb-0 {\n  margin-bottom: 0 !important;\n}\n\n.mb-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n  margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n  margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n  margin-bottom: auto !important;\n}\n\n.ms-0 {\n  margin-left: 0 !important;\n}\n\n.ms-1 {\n  margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n  margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n  margin-left: 1rem !important;\n}\n\n.ms-4 {\n  margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n  margin-left: 3rem !important;\n}\n\n.ms-auto {\n  margin-left: auto !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.px-0 {\n  padding-right: 0 !important;\n  padding-left: 0 !important;\n}\n\n.px-1 {\n  padding-right: 0.25rem !important;\n  padding-left: 0.25rem !important;\n}\n\n.px-2 {\n  padding-right: 0.5rem !important;\n  padding-left: 0.5rem !important;\n}\n\n.px-3 {\n  padding-right: 1rem !important;\n  padding-left: 1rem !important;\n}\n\n.px-4 {\n  padding-right: 1.5rem !important;\n  padding-left: 1.5rem !important;\n}\n\n.px-5 {\n  padding-right: 3rem !important;\n  padding-left: 3rem !important;\n}\n\n.py-0 {\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n.py-1 {\n  padding-top: 0.25rem !important;\n  padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n  padding-top: 0.5rem !important;\n  padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n  padding-top: 1rem !important;\n  padding-bottom: 1rem !important;\n}\n\n.py-4 {\n  padding-top: 1.5rem !important;\n  padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n  padding-top: 3rem !important;\n  padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n  padding-top: 0 !important;\n}\n\n.pt-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n  padding-top: 1rem !important;\n}\n\n.pt-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n  padding-top: 3rem !important;\n}\n\n.pe-0 {\n  padding-right: 0 !important;\n}\n\n.pe-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n  padding-right: 1rem !important;\n}\n\n.pe-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-0 {\n  padding-bottom: 0 !important;\n}\n\n.pb-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n  padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n  padding-left: 0 !important;\n}\n\n.ps-1 {\n  padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n  padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n  padding-left: 1rem !important;\n}\n\n.ps-4 {\n  padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n  padding-left: 3rem !important;\n}\n\n.font-monospace {\n  font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n  font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n  font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n  font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n  font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n  font-size: 1.25rem !important;\n}\n\n.fs-6 {\n  font-size: 1rem !important;\n}\n\n.fst-italic {\n  font-style: italic !important;\n}\n\n.fst-normal {\n  font-style: normal !important;\n}\n\n.fw-light {\n  font-weight: 300 !important;\n}\n\n.fw-lighter {\n  font-weight: lighter !important;\n}\n\n.fw-normal {\n  font-weight: 400 !important;\n}\n\n.fw-bold {\n  font-weight: 700 !important;\n}\n\n.fw-bolder {\n  font-weight: bolder !important;\n}\n\n.lh-1 {\n  line-height: 1 !important;\n}\n\n.lh-sm {\n  line-height: 1.25 !important;\n}\n\n.lh-base {\n  line-height: 1.5 !important;\n}\n\n.lh-lg {\n  line-height: 2 !important;\n}\n\n.text-start {\n  text-align: left !important;\n}\n\n.text-end {\n  text-align: right !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-decoration-underline {\n  text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n  text-decoration: line-through !important;\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n\n/* rtl:begin:remove */\n.text-break {\n  word-wrap: break-word !important;\n  word-break: break-word !important;\n}\n\n/* rtl:end:remove */\n.text-primary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-body-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n  --bs-text-opacity: 1;\n  color: #6c757d !important;\n}\n\n.text-black-50 {\n  --bs-text-opacity: 1;\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  --bs-text-opacity: 1;\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-reset {\n  --bs-text-opacity: 1;\n  color: inherit !important;\n}\n\n.text-opacity-25 {\n  --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n  --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n  --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n  --bs-text-opacity: 1;\n}\n\n.bg-primary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-body-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n  --bs-bg-opacity: 1;\n  background-color: transparent !important;\n}\n\n.bg-opacity-10 {\n  --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n  --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n  --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n  --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n  --bs-bg-opacity: 1;\n}\n\n.bg-gradient {\n  background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n  -webkit-user-select: all !important;\n  -moz-user-select: all !important;\n  user-select: all !important;\n}\n\n.user-select-auto {\n  -webkit-user-select: auto !important;\n  -moz-user-select: auto !important;\n  user-select: auto !important;\n}\n\n.user-select-none {\n  -webkit-user-select: none !important;\n  -moz-user-select: none !important;\n  user-select: none !important;\n}\n\n.pe-none {\n  pointer-events: none !important;\n}\n\n.pe-auto {\n  pointer-events: auto !important;\n}\n\n.rounded {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.rounded-1 {\n  border-radius: 0.2rem !important;\n}\n\n.rounded-2 {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-3 {\n  border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: 50rem !important;\n}\n\n.rounded-top {\n  border-top-left-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-end {\n  border-top-right-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-start {\n  border-bottom-left-radius: 0.25rem !important;\n  border-top-left-radius: 0.25rem !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-start {\n    float: left !important;\n  }\n\n  .float-sm-end {\n    float: right !important;\n  }\n\n  .float-sm-none {\n    float: none !important;\n  }\n\n  .d-sm-inline {\n    display: inline !important;\n  }\n\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-sm-block {\n    display: block !important;\n  }\n\n  .d-sm-grid {\n    display: grid !important;\n  }\n\n  .d-sm-table {\n    display: table !important;\n  }\n\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-sm-flex {\n    display: flex !important;\n  }\n\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-sm-none {\n    display: none !important;\n  }\n\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-sm-0 {\n    gap: 0 !important;\n  }\n\n  .gap-sm-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-sm-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-sm-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-sm-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-sm-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-sm-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-sm-first {\n    order: -1 !important;\n  }\n\n  .order-sm-0 {\n    order: 0 !important;\n  }\n\n  .order-sm-1 {\n    order: 1 !important;\n  }\n\n  .order-sm-2 {\n    order: 2 !important;\n  }\n\n  .order-sm-3 {\n    order: 3 !important;\n  }\n\n  .order-sm-4 {\n    order: 4 !important;\n  }\n\n  .order-sm-5 {\n    order: 5 !important;\n  }\n\n  .order-sm-last {\n    order: 6 !important;\n  }\n\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n\n  .m-sm-auto {\n    margin: auto !important;\n  }\n\n  .mx-sm-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-sm-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-sm-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-sm-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-sm-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-sm-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-sm-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-sm-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-sm-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-sm-auto {\n    margin-top: auto !important;\n  }\n\n  .me-sm-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-sm-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-sm-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-sm-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-sm-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-sm-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-sm-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-sm-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-sm-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-sm-auto {\n    margin-left: auto !important;\n  }\n\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n\n  .px-sm-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-sm-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-sm-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-sm-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-sm-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-sm-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-sm-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-sm-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-sm-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-sm-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-sm-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-sm-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-sm-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-sm-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-sm-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-sm-5 {\n    padding-left: 3rem !important;\n  }\n\n  .text-sm-start {\n    text-align: left !important;\n  }\n\n  .text-sm-end {\n    text-align: right !important;\n  }\n\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 768px) {\n  .float-md-start {\n    float: left !important;\n  }\n\n  .float-md-end {\n    float: right !important;\n  }\n\n  .float-md-none {\n    float: none !important;\n  }\n\n  .d-md-inline {\n    display: inline !important;\n  }\n\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-md-block {\n    display: block !important;\n  }\n\n  .d-md-grid {\n    display: grid !important;\n  }\n\n  .d-md-table {\n    display: table !important;\n  }\n\n  .d-md-table-row {\n    display: table-row !important;\n  }\n\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-md-flex {\n    display: flex !important;\n  }\n\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-md-none {\n    display: none !important;\n  }\n\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-md-0 {\n    gap: 0 !important;\n  }\n\n  .gap-md-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-md-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-md-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-md-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-md-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-md-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-md-center {\n    align-items: center !important;\n  }\n\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-md-center {\n    align-content: center !important;\n  }\n\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-md-center {\n    align-self: center !important;\n  }\n\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-md-first {\n    order: -1 !important;\n  }\n\n  .order-md-0 {\n    order: 0 !important;\n  }\n\n  .order-md-1 {\n    order: 1 !important;\n  }\n\n  .order-md-2 {\n    order: 2 !important;\n  }\n\n  .order-md-3 {\n    order: 3 !important;\n  }\n\n  .order-md-4 {\n    order: 4 !important;\n  }\n\n  .order-md-5 {\n    order: 5 !important;\n  }\n\n  .order-md-last {\n    order: 6 !important;\n  }\n\n  .m-md-0 {\n    margin: 0 !important;\n  }\n\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n\n  .m-md-auto {\n    margin: auto !important;\n  }\n\n  .mx-md-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-md-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-md-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-md-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-md-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-md-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-md-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-md-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-md-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-md-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-md-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-md-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-md-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-md-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-md-auto {\n    margin-top: auto !important;\n  }\n\n  .me-md-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-md-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-md-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-md-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-md-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-md-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-md-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-md-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-md-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-md-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-md-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-md-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-md-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-md-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-md-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-md-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-md-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-md-auto {\n    margin-left: auto !important;\n  }\n\n  .p-md-0 {\n    padding: 0 !important;\n  }\n\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n\n  .px-md-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-md-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-md-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-md-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-md-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-md-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-md-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-md-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-md-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-md-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-md-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-md-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-md-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-md-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-md-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-md-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-md-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-md-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-md-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-md-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-md-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-md-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-md-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-md-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-md-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-md-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-md-5 {\n    padding-left: 3rem !important;\n  }\n\n  .text-md-start {\n    text-align: left !important;\n  }\n\n  .text-md-end {\n    text-align: right !important;\n  }\n\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 992px) {\n  .float-lg-start {\n    float: left !important;\n  }\n\n  .float-lg-end {\n    float: right !important;\n  }\n\n  .float-lg-none {\n    float: none !important;\n  }\n\n  .d-lg-inline {\n    display: inline !important;\n  }\n\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-lg-block {\n    display: block !important;\n  }\n\n  .d-lg-grid {\n    display: grid !important;\n  }\n\n  .d-lg-table {\n    display: table !important;\n  }\n\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-lg-flex {\n    display: flex !important;\n  }\n\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-lg-none {\n    display: none !important;\n  }\n\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-lg-0 {\n    gap: 0 !important;\n  }\n\n  .gap-lg-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-lg-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-lg-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-lg-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-lg-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-lg-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-lg-first {\n    order: -1 !important;\n  }\n\n  .order-lg-0 {\n    order: 0 !important;\n  }\n\n  .order-lg-1 {\n    order: 1 !important;\n  }\n\n  .order-lg-2 {\n    order: 2 !important;\n  }\n\n  .order-lg-3 {\n    order: 3 !important;\n  }\n\n  .order-lg-4 {\n    order: 4 !important;\n  }\n\n  .order-lg-5 {\n    order: 5 !important;\n  }\n\n  .order-lg-last {\n    order: 6 !important;\n  }\n\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n\n  .m-lg-auto {\n    margin: auto !important;\n  }\n\n  .mx-lg-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-lg-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-lg-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-lg-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-lg-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-lg-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-lg-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-lg-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-lg-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-lg-auto {\n    margin-top: auto !important;\n  }\n\n  .me-lg-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-lg-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-lg-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-lg-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-lg-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-lg-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-lg-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-lg-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-lg-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-lg-auto {\n    margin-left: auto !important;\n  }\n\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n\n  .px-lg-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-lg-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-lg-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-lg-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-lg-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-lg-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-lg-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-lg-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-lg-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-lg-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-lg-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-lg-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-lg-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-lg-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-lg-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-lg-5 {\n    padding-left: 3rem !important;\n  }\n\n  .text-lg-start {\n    text-align: left !important;\n  }\n\n  .text-lg-end {\n    text-align: right !important;\n  }\n\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .float-xl-start {\n    float: left !important;\n  }\n\n  .float-xl-end {\n    float: right !important;\n  }\n\n  .float-xl-none {\n    float: none !important;\n  }\n\n  .d-xl-inline {\n    display: inline !important;\n  }\n\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-xl-block {\n    display: block !important;\n  }\n\n  .d-xl-grid {\n    display: grid !important;\n  }\n\n  .d-xl-table {\n    display: table !important;\n  }\n\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-xl-flex {\n    display: flex !important;\n  }\n\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-xl-none {\n    display: none !important;\n  }\n\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-xl-0 {\n    gap: 0 !important;\n  }\n\n  .gap-xl-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-xl-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-xl-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-xl-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-xl-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-xl-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-xl-first {\n    order: -1 !important;\n  }\n\n  .order-xl-0 {\n    order: 0 !important;\n  }\n\n  .order-xl-1 {\n    order: 1 !important;\n  }\n\n  .order-xl-2 {\n    order: 2 !important;\n  }\n\n  .order-xl-3 {\n    order: 3 !important;\n  }\n\n  .order-xl-4 {\n    order: 4 !important;\n  }\n\n  .order-xl-5 {\n    order: 5 !important;\n  }\n\n  .order-xl-last {\n    order: 6 !important;\n  }\n\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n\n  .m-xl-auto {\n    margin: auto !important;\n  }\n\n  .mx-xl-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-xl-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-xl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-xl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-xl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-xl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-xl-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-xl-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-xl-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-xl-auto {\n    margin-top: auto !important;\n  }\n\n  .me-xl-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-xl-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-xl-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-xl-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-xl-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-xl-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-xl-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-xl-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-xl-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-xl-auto {\n    margin-left: auto !important;\n  }\n\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n\n  .px-xl-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-xl-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-xl-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-xl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-xl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-xl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-xl-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-xl-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-xl-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-xl-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-xl-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-xl-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-xl-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-xl-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-xl-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-xl-5 {\n    padding-left: 3rem !important;\n  }\n\n  .text-xl-start {\n    text-align: left !important;\n  }\n\n  .text-xl-end {\n    text-align: right !important;\n  }\n\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1400px) {\n  .float-xxl-start {\n    float: left !important;\n  }\n\n  .float-xxl-end {\n    float: right !important;\n  }\n\n  .float-xxl-none {\n    float: none !important;\n  }\n\n  .d-xxl-inline {\n    display: inline !important;\n  }\n\n  .d-xxl-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-xxl-block {\n    display: block !important;\n  }\n\n  .d-xxl-grid {\n    display: grid !important;\n  }\n\n  .d-xxl-table {\n    display: table !important;\n  }\n\n  .d-xxl-table-row {\n    display: table-row !important;\n  }\n\n  .d-xxl-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-xxl-flex {\n    display: flex !important;\n  }\n\n  .d-xxl-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-xxl-none {\n    display: none !important;\n  }\n\n  .flex-xxl-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-xxl-row {\n    flex-direction: row !important;\n  }\n\n  .flex-xxl-column {\n    flex-direction: column !important;\n  }\n\n  .flex-xxl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-xxl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-xxl-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-xxl-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-xxl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-xxl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-xxl-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-xxl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-xxl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-xxl-0 {\n    gap: 0 !important;\n  }\n\n  .gap-xxl-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-xxl-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-xxl-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-xxl-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-xxl-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-xxl-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-xxl-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-xxl-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-xxl-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-xxl-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-xxl-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-xxl-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-xxl-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-xxl-center {\n    align-items: center !important;\n  }\n\n  .align-items-xxl-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-xxl-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-xxl-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-xxl-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-xxl-center {\n    align-content: center !important;\n  }\n\n  .align-content-xxl-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-xxl-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-xxl-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-xxl-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-xxl-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-xxl-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-xxl-center {\n    align-self: center !important;\n  }\n\n  .align-self-xxl-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-xxl-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-xxl-first {\n    order: -1 !important;\n  }\n\n  .order-xxl-0 {\n    order: 0 !important;\n  }\n\n  .order-xxl-1 {\n    order: 1 !important;\n  }\n\n  .order-xxl-2 {\n    order: 2 !important;\n  }\n\n  .order-xxl-3 {\n    order: 3 !important;\n  }\n\n  .order-xxl-4 {\n    order: 4 !important;\n  }\n\n  .order-xxl-5 {\n    order: 5 !important;\n  }\n\n  .order-xxl-last {\n    order: 6 !important;\n  }\n\n  .m-xxl-0 {\n    margin: 0 !important;\n  }\n\n  .m-xxl-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-xxl-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-xxl-3 {\n    margin: 1rem !important;\n  }\n\n  .m-xxl-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-xxl-5 {\n    margin: 3rem !important;\n  }\n\n  .m-xxl-auto {\n    margin: auto !important;\n  }\n\n  .mx-xxl-0 {\n    margin-right: 0 !important;\n    margin-left: 0 !important;\n  }\n\n  .mx-xxl-1 {\n    margin-right: 0.25rem !important;\n    margin-left: 0.25rem !important;\n  }\n\n  .mx-xxl-2 {\n    margin-right: 0.5rem !important;\n    margin-left: 0.5rem !important;\n  }\n\n  .mx-xxl-3 {\n    margin-right: 1rem !important;\n    margin-left: 1rem !important;\n  }\n\n  .mx-xxl-4 {\n    margin-right: 1.5rem !important;\n    margin-left: 1.5rem !important;\n  }\n\n  .mx-xxl-5 {\n    margin-right: 3rem !important;\n    margin-left: 3rem !important;\n  }\n\n  .mx-xxl-auto {\n    margin-right: auto !important;\n    margin-left: auto !important;\n  }\n\n  .my-xxl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-xxl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-xxl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-xxl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-xxl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-xxl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-xxl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-xxl-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-xxl-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-xxl-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-xxl-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-xxl-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-xxl-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-xxl-auto {\n    margin-top: auto !important;\n  }\n\n  .me-xxl-0 {\n    margin-right: 0 !important;\n  }\n\n  .me-xxl-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .me-xxl-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .me-xxl-3 {\n    margin-right: 1rem !important;\n  }\n\n  .me-xxl-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .me-xxl-5 {\n    margin-right: 3rem !important;\n  }\n\n  .me-xxl-auto {\n    margin-right: auto !important;\n  }\n\n  .mb-xxl-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-xxl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-xxl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-xxl-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-xxl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-xxl-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-xxl-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-xxl-0 {\n    margin-left: 0 !important;\n  }\n\n  .ms-xxl-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .ms-xxl-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .ms-xxl-3 {\n    margin-left: 1rem !important;\n  }\n\n  .ms-xxl-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .ms-xxl-5 {\n    margin-left: 3rem !important;\n  }\n\n  .ms-xxl-auto {\n    margin-left: auto !important;\n  }\n\n  .p-xxl-0 {\n    padding: 0 !important;\n  }\n\n  .p-xxl-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-xxl-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-xxl-3 {\n    padding: 1rem !important;\n  }\n\n  .p-xxl-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-xxl-5 {\n    padding: 3rem !important;\n  }\n\n  .px-xxl-0 {\n    padding-right: 0 !important;\n    padding-left: 0 !important;\n  }\n\n  .px-xxl-1 {\n    padding-right: 0.25rem !important;\n    padding-left: 0.25rem !important;\n  }\n\n  .px-xxl-2 {\n    padding-right: 0.5rem !important;\n    padding-left: 0.5rem !important;\n  }\n\n  .px-xxl-3 {\n    padding-right: 1rem !important;\n    padding-left: 1rem !important;\n  }\n\n  .px-xxl-4 {\n    padding-right: 1.5rem !important;\n    padding-left: 1.5rem !important;\n  }\n\n  .px-xxl-5 {\n    padding-right: 3rem !important;\n    padding-left: 3rem !important;\n  }\n\n  .py-xxl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-xxl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-xxl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-xxl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-xxl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-xxl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-xxl-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-xxl-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-xxl-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-xxl-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-xxl-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-xxl-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-xxl-0 {\n    padding-right: 0 !important;\n  }\n\n  .pe-xxl-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .pe-xxl-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .pe-xxl-3 {\n    padding-right: 1rem !important;\n  }\n\n  .pe-xxl-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .pe-xxl-5 {\n    padding-right: 3rem !important;\n  }\n\n  .pb-xxl-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-xxl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-xxl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-xxl-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-xxl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-xxl-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-xxl-0 {\n    padding-left: 0 !important;\n  }\n\n  .ps-xxl-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .ps-xxl-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .ps-xxl-3 {\n    padding-left: 1rem !important;\n  }\n\n  .ps-xxl-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .ps-xxl-5 {\n    padding-left: 3rem !important;\n  }\n\n  .text-xxl-start {\n    text-align: left !important;\n  }\n\n  .text-xxl-end {\n    text-align: right !important;\n  }\n\n  .text-xxl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .fs-1 {\n    font-size: 2.5rem !important;\n  }\n\n  .fs-2 {\n    font-size: 2rem !important;\n  }\n\n  .fs-3 {\n    font-size: 1.75rem !important;\n  }\n\n  .fs-4 {\n    font-size: 1.5rem !important;\n  }\n}\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-print-block {\n    display: block !important;\n  }\n\n  .d-print-grid {\n    display: grid !important;\n  }\n\n  .d-print-table {\n    display: table !important;\n  }\n\n  .d-print-table-row {\n    display: table-row !important;\n  }\n\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-print-flex {\n    display: flex !important;\n  }\n\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-print-none {\n    display: none !important;\n  }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/bootstrap/dist/css/bootstrap.rtl.css",
    "content": "@charset \"UTF-8\";\n/*!\n * Bootstrap v5.1.0 (https://getbootstrap.com/)\n * Copyright 2011-2021 The Bootstrap Authors\n * Copyright 2011-2021 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root {\n  --bs-blue: #0d6efd;\n  --bs-indigo: #6610f2;\n  --bs-purple: #6f42c1;\n  --bs-pink: #d63384;\n  --bs-red: #dc3545;\n  --bs-orange: #fd7e14;\n  --bs-yellow: #ffc107;\n  --bs-green: #198754;\n  --bs-teal: #20c997;\n  --bs-cyan: #0dcaf0;\n  --bs-white: #fff;\n  --bs-gray: #6c757d;\n  --bs-gray-dark: #343a40;\n  --bs-gray-100: #f8f9fa;\n  --bs-gray-200: #e9ecef;\n  --bs-gray-300: #dee2e6;\n  --bs-gray-400: #ced4da;\n  --bs-gray-500: #adb5bd;\n  --bs-gray-600: #6c757d;\n  --bs-gray-700: #495057;\n  --bs-gray-800: #343a40;\n  --bs-gray-900: #212529;\n  --bs-primary: #0d6efd;\n  --bs-secondary: #6c757d;\n  --bs-success: #198754;\n  --bs-info: #0dcaf0;\n  --bs-warning: #ffc107;\n  --bs-danger: #dc3545;\n  --bs-light: #f8f9fa;\n  --bs-dark: #212529;\n  --bs-primary-rgb: 13, 110, 253;\n  --bs-secondary-rgb: 108, 117, 125;\n  --bs-success-rgb: 25, 135, 84;\n  --bs-info-rgb: 13, 202, 240;\n  --bs-warning-rgb: 255, 193, 7;\n  --bs-danger-rgb: 220, 53, 69;\n  --bs-light-rgb: 248, 249, 250;\n  --bs-dark-rgb: 33, 37, 41;\n  --bs-white-rgb: 255, 255, 255;\n  --bs-black-rgb: 0, 0, 0;\n  --bs-body-rgb: 33, 37, 41;\n  --bs-font-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", \"Liberation Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n  --bs-body-font-family: var(--bs-font-sans-serif);\n  --bs-body-font-size: 1rem;\n  --bs-body-font-weight: 400;\n  --bs-body-line-height: 1.5;\n  --bs-body-color: #212529;\n  --bs-body-bg: #fff;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n  :root {\n    scroll-behavior: smooth;\n  }\n}\n\nbody {\n  margin: 0;\n  font-family: var(--bs-body-font-family);\n  font-size: var(--bs-body-font-size);\n  font-weight: var(--bs-body-font-weight);\n  line-height: var(--bs-body-line-height);\n  color: var(--bs-body-color);\n  text-align: var(--bs-body-text-align);\n  background-color: var(--bs-body-bg);\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n  margin: 1rem 0;\n  color: inherit;\n  background-color: currentColor;\n  border: 0;\n  opacity: 0.25;\n}\n\nhr:not([size]) {\n  height: 1px;\n}\n\nh6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n  font-weight: 500;\n  line-height: 1.2;\n}\n\nh1, .h1 {\n  font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n  h1, .h1 {\n    font-size: 2.5rem;\n  }\n}\n\nh2, .h2 {\n  font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n  h2, .h2 {\n    font-size: 2rem;\n  }\n}\n\nh3, .h3 {\n  font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n  h3, .h3 {\n    font-size: 1.75rem;\n  }\n}\n\nh4, .h4 {\n  font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n  h4, .h4 {\n    font-size: 1.5rem;\n  }\n}\n\nh5, .h5 {\n  font-size: 1.25rem;\n}\n\nh6, .h6 {\n  font-size: 1rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-bs-original-title] {\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul {\n  padding-right: 2rem;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: 0.5rem;\n  margin-right: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall, .small {\n  font-size: 0.875em;\n}\n\nmark, .mark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 0.75em;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nsup {\n  top: -0.5em;\n}\n\na {\n  color: #0d6efd;\n  text-decoration: underline;\n}\na:hover {\n  color: #0a58ca;\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n  color: inherit;\n  text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: var(--bs-font-monospace);\n  font-size: 1em;\n  direction: ltr ;\n  unicode-bidi: bidi-override;\n}\n\npre {\n  display: block;\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n  font-size: 0.875em;\n}\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\ncode {\n  font-size: 0.875em;\n  color: #d63384;\n  word-wrap: break-word;\n}\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 0.875em;\n  color: #fff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n}\nkbd kbd {\n  padding: 0;\n  font-size: 1em;\n  font-weight: 700;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n  vertical-align: middle;\n}\n\ntable {\n  caption-side: bottom;\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  color: #6c757d;\n  text-align: right;\n}\n\nth {\n  text-align: inherit;\n  text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n}\n\nlabel {\n  display: inline-block;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n  outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n[role=button] {\n  cursor: pointer;\n}\n\nselect {\n  word-wrap: normal;\n}\nselect:disabled {\n  opacity: 1;\n}\n\n[list]::-webkit-calendar-picker-indicator {\n  display: none;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n  -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n  cursor: pointer;\n}\n\n::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ntextarea {\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  float: right;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 0.5rem;\n  font-size: calc(1.275rem + 0.3vw);\n  line-height: inherit;\n}\n@media (min-width: 1200px) {\n  legend {\n    font-size: 1.5rem;\n  }\n}\nlegend + * {\n  clear: right;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n  padding: 0;\n}\n\n::-webkit-inner-spin-button {\n  height: auto;\n}\n\n[type=search] {\n  outline-offset: -2px;\n  -webkit-appearance: textfield;\n}\n\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n  direction: ltr;\n}\n::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n  padding: 0;\n}\n\n::file-selector-button {\n  font: inherit;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\niframe {\n  border: 0;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[hidden] {\n  display: none !important;\n}\n\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n\n.display-1 {\n  font-size: calc(1.625rem + 4.5vw);\n  font-weight: 300;\n  line-height: 1.2;\n}\n@media (min-width: 1200px) {\n  .display-1 {\n    font-size: 5rem;\n  }\n}\n\n.display-2 {\n  font-size: calc(1.575rem + 3.9vw);\n  font-weight: 300;\n  line-height: 1.2;\n}\n@media (min-width: 1200px) {\n  .display-2 {\n    font-size: 4.5rem;\n  }\n}\n\n.display-3 {\n  font-size: calc(1.525rem + 3.3vw);\n  font-weight: 300;\n  line-height: 1.2;\n}\n@media (min-width: 1200px) {\n  .display-3 {\n    font-size: 4rem;\n  }\n}\n\n.display-4 {\n  font-size: calc(1.475rem + 2.7vw);\n  font-weight: 300;\n  line-height: 1.2;\n}\n@media (min-width: 1200px) {\n  .display-4 {\n    font-size: 3.5rem;\n  }\n}\n\n.display-5 {\n  font-size: calc(1.425rem + 2.1vw);\n  font-weight: 300;\n  line-height: 1.2;\n}\n@media (min-width: 1200px) {\n  .display-5 {\n    font-size: 3rem;\n  }\n}\n\n.display-6 {\n  font-size: calc(1.375rem + 1.5vw);\n  font-weight: 300;\n  line-height: 1.2;\n}\n@media (min-width: 1200px) {\n  .display-6 {\n    font-size: 2.5rem;\n  }\n}\n\n.list-unstyled {\n  padding-right: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-right: 0;\n  list-style: none;\n}\n\n.list-inline-item {\n  display: inline-block;\n}\n.list-inline-item:not(:last-child) {\n  margin-left: 0.5rem;\n}\n\n.initialism {\n  font-size: 0.875em;\n  text-transform: uppercase;\n}\n\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.25rem;\n}\n.blockquote > :last-child {\n  margin-bottom: 0;\n}\n\n.blockquote-footer {\n  margin-top: -1rem;\n  margin-bottom: 1rem;\n  font-size: 0.875em;\n  color: #6c757d;\n}\n.blockquote-footer::before {\n  content: \"— \";\n}\n\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n  border-radius: 0.25rem;\n  max-width: 100%;\n  height: auto;\n}\n\n.figure {\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n\n.figure-caption {\n  font-size: 0.875em;\n  color: #6c757d;\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n  width: 100%;\n  padding-left: var(--bs-gutter-x, 0.75rem);\n  padding-right: var(--bs-gutter-x, 0.75rem);\n  margin-left: auto;\n  margin-right: auto;\n}\n\n@media (min-width: 576px) {\n  .container-sm, .container {\n    max-width: 540px;\n  }\n}\n@media (min-width: 768px) {\n  .container-md, .container-sm, .container {\n    max-width: 720px;\n  }\n}\n@media (min-width: 992px) {\n  .container-lg, .container-md, .container-sm, .container {\n    max-width: 960px;\n  }\n}\n@media (min-width: 1200px) {\n  .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1140px;\n  }\n}\n@media (min-width: 1400px) {\n  .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n    max-width: 1320px;\n  }\n}\n.row {\n  --bs-gutter-x: 1.5rem;\n  --bs-gutter-y: 0;\n  display: flex;\n  flex-wrap: wrap;\n  margin-top: calc(var(--bs-gutter-y) * -1);\n  margin-left: calc(var(--bs-gutter-x) * -.5);\n  margin-right: calc(var(--bs-gutter-x) * -.5);\n}\n.row > * {\n  flex-shrink: 0;\n  width: 100%;\n  max-width: 100%;\n  padding-left: calc(var(--bs-gutter-x) * .5);\n  padding-right: calc(var(--bs-gutter-x) * .5);\n  margin-top: var(--bs-gutter-y);\n}\n\n.col {\n  flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.row-cols-1 > * {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.row-cols-2 > * {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.row-cols-3 > * {\n  flex: 0 0 auto;\n  width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.row-cols-5 > * {\n  flex: 0 0 auto;\n  width: 20%;\n}\n\n.row-cols-6 > * {\n  flex: 0 0 auto;\n  width: 16.6666666667%;\n}\n\n.col-auto {\n  flex: 0 0 auto;\n  width: auto;\n}\n\n.col-1 {\n  flex: 0 0 auto;\n  width: 8.33333333%;\n}\n\n.col-2 {\n  flex: 0 0 auto;\n  width: 16.66666667%;\n}\n\n.col-3 {\n  flex: 0 0 auto;\n  width: 25%;\n}\n\n.col-4 {\n  flex: 0 0 auto;\n  width: 33.33333333%;\n}\n\n.col-5 {\n  flex: 0 0 auto;\n  width: 41.66666667%;\n}\n\n.col-6 {\n  flex: 0 0 auto;\n  width: 50%;\n}\n\n.col-7 {\n  flex: 0 0 auto;\n  width: 58.33333333%;\n}\n\n.col-8 {\n  flex: 0 0 auto;\n  width: 66.66666667%;\n}\n\n.col-9 {\n  flex: 0 0 auto;\n  width: 75%;\n}\n\n.col-10 {\n  flex: 0 0 auto;\n  width: 83.33333333%;\n}\n\n.col-11 {\n  flex: 0 0 auto;\n  width: 91.66666667%;\n}\n\n.col-12 {\n  flex: 0 0 auto;\n  width: 100%;\n}\n\n.offset-1 {\n  margin-right: 8.33333333%;\n}\n\n.offset-2 {\n  margin-right: 16.66666667%;\n}\n\n.offset-3 {\n  margin-right: 25%;\n}\n\n.offset-4 {\n  margin-right: 33.33333333%;\n}\n\n.offset-5 {\n  margin-right: 41.66666667%;\n}\n\n.offset-6 {\n  margin-right: 50%;\n}\n\n.offset-7 {\n  margin-right: 58.33333333%;\n}\n\n.offset-8 {\n  margin-right: 66.66666667%;\n}\n\n.offset-9 {\n  margin-right: 75%;\n}\n\n.offset-10 {\n  margin-right: 83.33333333%;\n}\n\n.offset-11 {\n  margin-right: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n  --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n  --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n  --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n  --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n  --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n  --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n  --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n  --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n  --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n  --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n  --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n  --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-sm-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-sm-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-sm-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-sm-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-sm-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-sm-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-sm-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-sm-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-sm-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-sm-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-sm-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-sm-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-sm-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-sm-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-sm-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-sm-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-sm-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-sm-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-sm-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-sm-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-sm-0 {\n    margin-right: 0;\n  }\n\n  .offset-sm-1 {\n    margin-right: 8.33333333%;\n  }\n\n  .offset-sm-2 {\n    margin-right: 16.66666667%;\n  }\n\n  .offset-sm-3 {\n    margin-right: 25%;\n  }\n\n  .offset-sm-4 {\n    margin-right: 33.33333333%;\n  }\n\n  .offset-sm-5 {\n    margin-right: 41.66666667%;\n  }\n\n  .offset-sm-6 {\n    margin-right: 50%;\n  }\n\n  .offset-sm-7 {\n    margin-right: 58.33333333%;\n  }\n\n  .offset-sm-8 {\n    margin-right: 66.66666667%;\n  }\n\n  .offset-sm-9 {\n    margin-right: 75%;\n  }\n\n  .offset-sm-10 {\n    margin-right: 83.33333333%;\n  }\n\n  .offset-sm-11 {\n    margin-right: 91.66666667%;\n  }\n\n  .g-sm-0,\n.gx-sm-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-sm-0,\n.gy-sm-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-sm-1,\n.gx-sm-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-sm-1,\n.gy-sm-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-sm-2,\n.gx-sm-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-sm-2,\n.gy-sm-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-sm-3,\n.gx-sm-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-sm-3,\n.gy-sm-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-sm-4,\n.gx-sm-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-sm-4,\n.gy-sm-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-sm-5,\n.gx-sm-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-sm-5,\n.gy-sm-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 768px) {\n  .col-md {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-md-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-md-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-md-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-md-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-md-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-md-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-md-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-md-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-md-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-md-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-md-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-md-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-md-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-md-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-md-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-md-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-md-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-md-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-md-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-md-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-md-0 {\n    margin-right: 0;\n  }\n\n  .offset-md-1 {\n    margin-right: 8.33333333%;\n  }\n\n  .offset-md-2 {\n    margin-right: 16.66666667%;\n  }\n\n  .offset-md-3 {\n    margin-right: 25%;\n  }\n\n  .offset-md-4 {\n    margin-right: 33.33333333%;\n  }\n\n  .offset-md-5 {\n    margin-right: 41.66666667%;\n  }\n\n  .offset-md-6 {\n    margin-right: 50%;\n  }\n\n  .offset-md-7 {\n    margin-right: 58.33333333%;\n  }\n\n  .offset-md-8 {\n    margin-right: 66.66666667%;\n  }\n\n  .offset-md-9 {\n    margin-right: 75%;\n  }\n\n  .offset-md-10 {\n    margin-right: 83.33333333%;\n  }\n\n  .offset-md-11 {\n    margin-right: 91.66666667%;\n  }\n\n  .g-md-0,\n.gx-md-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-md-0,\n.gy-md-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-md-1,\n.gx-md-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-md-1,\n.gy-md-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-md-2,\n.gx-md-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-md-2,\n.gy-md-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-md-3,\n.gx-md-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-md-3,\n.gy-md-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-md-4,\n.gx-md-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-md-4,\n.gy-md-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-md-5,\n.gx-md-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-md-5,\n.gy-md-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 992px) {\n  .col-lg {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-lg-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-lg-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-lg-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-lg-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-lg-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-lg-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-lg-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-lg-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-lg-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-lg-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-lg-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-lg-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-lg-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-lg-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-lg-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-lg-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-lg-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-lg-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-lg-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-lg-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-lg-0 {\n    margin-right: 0;\n  }\n\n  .offset-lg-1 {\n    margin-right: 8.33333333%;\n  }\n\n  .offset-lg-2 {\n    margin-right: 16.66666667%;\n  }\n\n  .offset-lg-3 {\n    margin-right: 25%;\n  }\n\n  .offset-lg-4 {\n    margin-right: 33.33333333%;\n  }\n\n  .offset-lg-5 {\n    margin-right: 41.66666667%;\n  }\n\n  .offset-lg-6 {\n    margin-right: 50%;\n  }\n\n  .offset-lg-7 {\n    margin-right: 58.33333333%;\n  }\n\n  .offset-lg-8 {\n    margin-right: 66.66666667%;\n  }\n\n  .offset-lg-9 {\n    margin-right: 75%;\n  }\n\n  .offset-lg-10 {\n    margin-right: 83.33333333%;\n  }\n\n  .offset-lg-11 {\n    margin-right: 91.66666667%;\n  }\n\n  .g-lg-0,\n.gx-lg-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-lg-0,\n.gy-lg-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-lg-1,\n.gx-lg-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-lg-1,\n.gy-lg-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-lg-2,\n.gx-lg-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-lg-2,\n.gy-lg-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-lg-3,\n.gx-lg-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-lg-3,\n.gy-lg-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-lg-4,\n.gx-lg-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-lg-4,\n.gy-lg-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-lg-5,\n.gx-lg-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-lg-5,\n.gy-lg-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1200px) {\n  .col-xl {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-xl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-xl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-xl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-xl-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-xl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-xl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-xl-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-xl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-xl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-xl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-xl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-xl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-xl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-xl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-xl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-xl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-xl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-xl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-xl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-xl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-xl-0 {\n    margin-right: 0;\n  }\n\n  .offset-xl-1 {\n    margin-right: 8.33333333%;\n  }\n\n  .offset-xl-2 {\n    margin-right: 16.66666667%;\n  }\n\n  .offset-xl-3 {\n    margin-right: 25%;\n  }\n\n  .offset-xl-4 {\n    margin-right: 33.33333333%;\n  }\n\n  .offset-xl-5 {\n    margin-right: 41.66666667%;\n  }\n\n  .offset-xl-6 {\n    margin-right: 50%;\n  }\n\n  .offset-xl-7 {\n    margin-right: 58.33333333%;\n  }\n\n  .offset-xl-8 {\n    margin-right: 66.66666667%;\n  }\n\n  .offset-xl-9 {\n    margin-right: 75%;\n  }\n\n  .offset-xl-10 {\n    margin-right: 83.33333333%;\n  }\n\n  .offset-xl-11 {\n    margin-right: 91.66666667%;\n  }\n\n  .g-xl-0,\n.gx-xl-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-xl-0,\n.gy-xl-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-xl-1,\n.gx-xl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-xl-1,\n.gy-xl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-xl-2,\n.gx-xl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-xl-2,\n.gy-xl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-xl-3,\n.gx-xl-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-xl-3,\n.gy-xl-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-xl-4,\n.gx-xl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-xl-4,\n.gy-xl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-xl-5,\n.gx-xl-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-xl-5,\n.gy-xl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n@media (min-width: 1400px) {\n  .col-xxl {\n    flex: 1 0 0%;\n  }\n\n  .row-cols-xxl-auto > * {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .row-cols-xxl-1 > * {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .row-cols-xxl-2 > * {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .row-cols-xxl-3 > * {\n    flex: 0 0 auto;\n    width: 33.3333333333%;\n  }\n\n  .row-cols-xxl-4 > * {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .row-cols-xxl-5 > * {\n    flex: 0 0 auto;\n    width: 20%;\n  }\n\n  .row-cols-xxl-6 > * {\n    flex: 0 0 auto;\n    width: 16.6666666667%;\n  }\n\n  .col-xxl-auto {\n    flex: 0 0 auto;\n    width: auto;\n  }\n\n  .col-xxl-1 {\n    flex: 0 0 auto;\n    width: 8.33333333%;\n  }\n\n  .col-xxl-2 {\n    flex: 0 0 auto;\n    width: 16.66666667%;\n  }\n\n  .col-xxl-3 {\n    flex: 0 0 auto;\n    width: 25%;\n  }\n\n  .col-xxl-4 {\n    flex: 0 0 auto;\n    width: 33.33333333%;\n  }\n\n  .col-xxl-5 {\n    flex: 0 0 auto;\n    width: 41.66666667%;\n  }\n\n  .col-xxl-6 {\n    flex: 0 0 auto;\n    width: 50%;\n  }\n\n  .col-xxl-7 {\n    flex: 0 0 auto;\n    width: 58.33333333%;\n  }\n\n  .col-xxl-8 {\n    flex: 0 0 auto;\n    width: 66.66666667%;\n  }\n\n  .col-xxl-9 {\n    flex: 0 0 auto;\n    width: 75%;\n  }\n\n  .col-xxl-10 {\n    flex: 0 0 auto;\n    width: 83.33333333%;\n  }\n\n  .col-xxl-11 {\n    flex: 0 0 auto;\n    width: 91.66666667%;\n  }\n\n  .col-xxl-12 {\n    flex: 0 0 auto;\n    width: 100%;\n  }\n\n  .offset-xxl-0 {\n    margin-right: 0;\n  }\n\n  .offset-xxl-1 {\n    margin-right: 8.33333333%;\n  }\n\n  .offset-xxl-2 {\n    margin-right: 16.66666667%;\n  }\n\n  .offset-xxl-3 {\n    margin-right: 25%;\n  }\n\n  .offset-xxl-4 {\n    margin-right: 33.33333333%;\n  }\n\n  .offset-xxl-5 {\n    margin-right: 41.66666667%;\n  }\n\n  .offset-xxl-6 {\n    margin-right: 50%;\n  }\n\n  .offset-xxl-7 {\n    margin-right: 58.33333333%;\n  }\n\n  .offset-xxl-8 {\n    margin-right: 66.66666667%;\n  }\n\n  .offset-xxl-9 {\n    margin-right: 75%;\n  }\n\n  .offset-xxl-10 {\n    margin-right: 83.33333333%;\n  }\n\n  .offset-xxl-11 {\n    margin-right: 91.66666667%;\n  }\n\n  .g-xxl-0,\n.gx-xxl-0 {\n    --bs-gutter-x: 0;\n  }\n\n  .g-xxl-0,\n.gy-xxl-0 {\n    --bs-gutter-y: 0;\n  }\n\n  .g-xxl-1,\n.gx-xxl-1 {\n    --bs-gutter-x: 0.25rem;\n  }\n\n  .g-xxl-1,\n.gy-xxl-1 {\n    --bs-gutter-y: 0.25rem;\n  }\n\n  .g-xxl-2,\n.gx-xxl-2 {\n    --bs-gutter-x: 0.5rem;\n  }\n\n  .g-xxl-2,\n.gy-xxl-2 {\n    --bs-gutter-y: 0.5rem;\n  }\n\n  .g-xxl-3,\n.gx-xxl-3 {\n    --bs-gutter-x: 1rem;\n  }\n\n  .g-xxl-3,\n.gy-xxl-3 {\n    --bs-gutter-y: 1rem;\n  }\n\n  .g-xxl-4,\n.gx-xxl-4 {\n    --bs-gutter-x: 1.5rem;\n  }\n\n  .g-xxl-4,\n.gy-xxl-4 {\n    --bs-gutter-y: 1.5rem;\n  }\n\n  .g-xxl-5,\n.gx-xxl-5 {\n    --bs-gutter-x: 3rem;\n  }\n\n  .g-xxl-5,\n.gy-xxl-5 {\n    --bs-gutter-y: 3rem;\n  }\n}\n.table {\n  --bs-table-bg: transparent;\n  --bs-table-accent-bg: transparent;\n  --bs-table-striped-color: #212529;\n  --bs-table-striped-bg: rgba(0, 0, 0, 0.05);\n  --bs-table-active-color: #212529;\n  --bs-table-active-bg: rgba(0, 0, 0, 0.1);\n  --bs-table-hover-color: #212529;\n  --bs-table-hover-bg: rgba(0, 0, 0, 0.075);\n  width: 100%;\n  margin-bottom: 1rem;\n  color: #212529;\n  vertical-align: top;\n  border-color: #dee2e6;\n}\n.table > :not(caption) > * > * {\n  padding: 0.5rem 0.5rem;\n  background-color: var(--bs-table-bg);\n  border-bottom-width: 1px;\n  box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg);\n}\n.table > tbody {\n  vertical-align: inherit;\n}\n.table > thead {\n  vertical-align: bottom;\n}\n.table > :not(:last-child) > :last-child > * {\n  border-bottom-color: currentColor;\n}\n\n.caption-top {\n  caption-side: top;\n}\n\n.table-sm > :not(caption) > * > * {\n  padding: 0.25rem 0.25rem;\n}\n\n.table-bordered > :not(caption) > * {\n  border-width: 1px 0;\n}\n.table-bordered > :not(caption) > * > * {\n  border-width: 0 1px;\n}\n\n.table-borderless > :not(caption) > * > * {\n  border-bottom-width: 0;\n}\n\n.table-striped > tbody > tr:nth-of-type(odd) {\n  --bs-table-accent-bg: var(--bs-table-striped-bg);\n  color: var(--bs-table-striped-color);\n}\n\n.table-active {\n  --bs-table-accent-bg: var(--bs-table-active-bg);\n  color: var(--bs-table-active-color);\n}\n\n.table-hover > tbody > tr:hover {\n  --bs-table-accent-bg: var(--bs-table-hover-bg);\n  color: var(--bs-table-hover-color);\n}\n\n.table-primary {\n  --bs-table-bg: #cfe2ff;\n  --bs-table-striped-bg: #c5d7f2;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #bacbe6;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #bfd1ec;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #bacbe6;\n}\n\n.table-secondary {\n  --bs-table-bg: #e2e3e5;\n  --bs-table-striped-bg: #d7d8da;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #cbccce;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #d1d2d4;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #cbccce;\n}\n\n.table-success {\n  --bs-table-bg: #d1e7dd;\n  --bs-table-striped-bg: #c7dbd2;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #bcd0c7;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #c1d6cc;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #bcd0c7;\n}\n\n.table-info {\n  --bs-table-bg: #cff4fc;\n  --bs-table-striped-bg: #c5e8ef;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #badce3;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #bfe2e9;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #badce3;\n}\n\n.table-warning {\n  --bs-table-bg: #fff3cd;\n  --bs-table-striped-bg: #f2e7c3;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #e6dbb9;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #ece1be;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #e6dbb9;\n}\n\n.table-danger {\n  --bs-table-bg: #f8d7da;\n  --bs-table-striped-bg: #eccccf;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #dfc2c4;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #e5c7ca;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #dfc2c4;\n}\n\n.table-light {\n  --bs-table-bg: #f8f9fa;\n  --bs-table-striped-bg: #ecedee;\n  --bs-table-striped-color: #000;\n  --bs-table-active-bg: #dfe0e1;\n  --bs-table-active-color: #000;\n  --bs-table-hover-bg: #e5e6e7;\n  --bs-table-hover-color: #000;\n  color: #000;\n  border-color: #dfe0e1;\n}\n\n.table-dark {\n  --bs-table-bg: #212529;\n  --bs-table-striped-bg: #2c3034;\n  --bs-table-striped-color: #fff;\n  --bs-table-active-bg: #373b3e;\n  --bs-table-active-color: #fff;\n  --bs-table-hover-bg: #323539;\n  --bs-table-hover-color: #fff;\n  color: #fff;\n  border-color: #373b3e;\n}\n\n.table-responsive {\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n@media (max-width: 575.98px) {\n  .table-responsive-sm {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 767.98px) {\n  .table-responsive-md {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 991.98px) {\n  .table-responsive-lg {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 1199.98px) {\n  .table-responsive-xl {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n@media (max-width: 1399.98px) {\n  .table-responsive-xxl {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n}\n.form-label {\n  margin-bottom: 0.5rem;\n}\n\n.col-form-label {\n  padding-top: calc(0.375rem + 1px);\n  padding-bottom: calc(0.375rem + 1px);\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n\n.col-form-label-lg {\n  padding-top: calc(0.5rem + 1px);\n  padding-bottom: calc(0.5rem + 1px);\n  font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n  padding-top: calc(0.25rem + 1px);\n  padding-bottom: calc(0.25rem + 1px);\n  font-size: 0.875rem;\n}\n\n.form-text {\n  margin-top: 0.25rem;\n  font-size: 0.875em;\n  color: #6c757d;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ced4da;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  border-radius: 0.25rem;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-control {\n    transition: none;\n  }\n}\n.form-control[type=file] {\n  overflow: hidden;\n}\n.form-control[type=file]:not(:disabled):not([readonly]) {\n  cursor: pointer;\n}\n.form-control:focus {\n  color: #212529;\n  background-color: #fff;\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-control::-webkit-date-and-time-value {\n  height: 1.5em;\n}\n.form-control::-moz-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n.form-control::placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n.form-control:disabled, .form-control[readonly] {\n  background-color: #e9ecef;\n  opacity: 1;\n}\n.form-control::file-selector-button {\n  padding: 0.375rem 0.75rem;\n  margin: -0.375rem -0.75rem;\n  -webkit-margin-end: 0.75rem;\n  margin-inline-end: 0.75rem;\n  color: #212529;\n  background-color: #e9ecef;\n  pointer-events: none;\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n  border-inline-end-width: 1px;\n  border-radius: 0;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-control::file-selector-button {\n    transition: none;\n  }\n}\n.form-control:hover:not(:disabled):not([readonly])::file-selector-button {\n  background-color: #dde0e3;\n}\n.form-control::-webkit-file-upload-button {\n  padding: 0.375rem 0.75rem;\n  margin: -0.375rem -0.75rem;\n  -webkit-margin-end: 0.75rem;\n  margin-inline-end: 0.75rem;\n  color: #212529;\n  background-color: #e9ecef;\n  pointer-events: none;\n  border-color: inherit;\n  border-style: solid;\n  border-width: 0;\n  border-inline-end-width: 1px;\n  border-radius: 0;\n  -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-control::-webkit-file-upload-button {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n  background-color: #dde0e3;\n}\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0;\n  margin-bottom: 0;\n  line-height: 1.5;\n  color: #212529;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: 1px 0;\n}\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n  padding-left: 0;\n  padding-right: 0;\n}\n\n.form-control-sm {\n  min-height: calc(1.5em + 0.5rem + 2px);\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  border-radius: 0.2rem;\n}\n.form-control-sm::file-selector-button {\n  padding: 0.25rem 0.5rem;\n  margin: -0.25rem -0.5rem;\n  -webkit-margin-end: 0.5rem;\n  margin-inline-end: 0.5rem;\n}\n.form-control-sm::-webkit-file-upload-button {\n  padding: 0.25rem 0.5rem;\n  margin: -0.25rem -0.5rem;\n  -webkit-margin-end: 0.5rem;\n  margin-inline-end: 0.5rem;\n}\n\n.form-control-lg {\n  min-height: calc(1.5em + 1rem + 2px);\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  border-radius: 0.3rem;\n}\n.form-control-lg::file-selector-button {\n  padding: 0.5rem 1rem;\n  margin: -0.5rem -1rem;\n  -webkit-margin-end: 1rem;\n  margin-inline-end: 1rem;\n}\n.form-control-lg::-webkit-file-upload-button {\n  padding: 0.5rem 1rem;\n  margin: -0.5rem -1rem;\n  -webkit-margin-end: 1rem;\n  margin-inline-end: 1rem;\n}\n\ntextarea.form-control {\n  min-height: calc(1.5em + 0.75rem + 2px);\n}\ntextarea.form-control-sm {\n  min-height: calc(1.5em + 0.5rem + 2px);\n}\ntextarea.form-control-lg {\n  min-height: calc(1.5em + 1rem + 2px);\n}\n\n.form-control-color {\n  width: 3rem;\n  height: auto;\n  padding: 0.375rem;\n}\n.form-control-color:not(:disabled):not([readonly]) {\n  cursor: pointer;\n}\n.form-control-color::-moz-color-swatch {\n  height: 1.5em;\n  border-radius: 0.25rem;\n}\n.form-control-color::-webkit-color-swatch {\n  height: 1.5em;\n  border-radius: 0.25rem;\n}\n\n.form-select {\n  display: block;\n  width: 100%;\n  padding: 0.375rem 0.75rem 0.375rem 2.25rem;\n  -moz-padding-start: calc(0.75rem - 3px);\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  background-color: #fff;\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: left 0.75rem center;\n  background-size: 16px 12px;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-select {\n    transition: none;\n  }\n}\n.form-select:focus {\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-select[multiple], .form-select[size]:not([size=\"1\"]) {\n  padding-left: 0.75rem;\n  background-image: none;\n}\n.form-select:disabled {\n  background-color: #e9ecef;\n}\n.form-select:-moz-focusring {\n  color: transparent;\n  text-shadow: 0 0 0 #212529;\n}\n\n.form-select-sm {\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n  padding-right: 0.5rem;\n  font-size: 0.875rem;\n}\n\n.form-select-lg {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  padding-right: 1rem;\n  font-size: 1.25rem;\n}\n\n.form-check {\n  display: block;\n  min-height: 1.5rem;\n  padding-right: 1.5em;\n  margin-bottom: 0.125rem;\n}\n.form-check .form-check-input {\n  float: right;\n  margin-right: -1.5em;\n}\n\n.form-check-input {\n  width: 1em;\n  height: 1em;\n  margin-top: 0.25em;\n  vertical-align: top;\n  background-color: #fff;\n  background-repeat: no-repeat;\n  background-position: center;\n  background-size: contain;\n  border: 1px solid rgba(0, 0, 0, 0.25);\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n  -webkit-print-color-adjust: exact;\n  color-adjust: exact;\n}\n.form-check-input[type=checkbox] {\n  border-radius: 0.25em;\n}\n.form-check-input[type=radio] {\n  border-radius: 50%;\n}\n.form-check-input:active {\n  filter: brightness(90%);\n}\n.form-check-input:focus {\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-check-input:checked {\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.form-check-input:checked[type=checkbox] {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e\");\n}\n.form-check-input:checked[type=radio] {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e\");\n}\n.form-check-input[type=checkbox]:indeterminate {\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e\");\n}\n.form-check-input:disabled {\n  pointer-events: none;\n  filter: none;\n  opacity: 0.5;\n}\n.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {\n  opacity: 0.5;\n}\n\n.form-switch {\n  padding-right: 2.5em;\n}\n.form-switch .form-check-input {\n  width: 2em;\n  margin-right: -2.5em;\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e\");\n  background-position: right center;\n  border-radius: 2em;\n  transition: background-position 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-switch .form-check-input {\n    transition: none;\n  }\n}\n.form-switch .form-check-input:focus {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e\");\n}\n.form-switch .form-check-input:checked {\n  background-position: left center;\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.form-check-inline {\n  display: inline-block;\n  margin-left: 1rem;\n}\n\n.btn-check {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n.btn-check[disabled] + .btn, .btn-check:disabled + .btn {\n  pointer-events: none;\n  filter: none;\n  opacity: 0.65;\n}\n\n.form-range {\n  width: 100%;\n  height: 1.5rem;\n  padding: 0;\n  background-color: transparent;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n.form-range:focus {\n  outline: 0;\n}\n.form-range:focus::-webkit-slider-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range:focus::-moz-range-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range::-moz-focus-outer {\n  border: 0;\n}\n.form-range::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  background-color: #0d6efd;\n  border: 0;\n  border-radius: 1rem;\n  -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -webkit-appearance: none;\n  appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-range::-webkit-slider-thumb {\n    -webkit-transition: none;\n    transition: none;\n  }\n}\n.form-range::-webkit-slider-thumb:active {\n  background-color: #b6d4fe;\n}\n.form-range::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n.form-range::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #0d6efd;\n  border: 0;\n  border-radius: 1rem;\n  -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -moz-appearance: none;\n  appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-range::-moz-range-thumb {\n    -moz-transition: none;\n    transition: none;\n  }\n}\n.form-range::-moz-range-thumb:active {\n  background-color: #b6d4fe;\n}\n.form-range::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n.form-range:disabled {\n  pointer-events: none;\n}\n.form-range:disabled::-webkit-slider-thumb {\n  background-color: #adb5bd;\n}\n.form-range:disabled::-moz-range-thumb {\n  background-color: #adb5bd;\n}\n\n.form-floating {\n  position: relative;\n}\n.form-floating > .form-control,\n.form-floating > .form-select {\n  height: calc(3.5rem + 2px);\n  line-height: 1.25;\n}\n.form-floating > label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  height: 100%;\n  padding: 1rem 0.75rem;\n  pointer-events: none;\n  border: 1px solid transparent;\n  transform-origin: 100% 0;\n  transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .form-floating > label {\n    transition: none;\n  }\n}\n.form-floating > .form-control {\n  padding: 1rem 0.75rem;\n}\n.form-floating > .form-control::-moz-placeholder {\n  color: transparent;\n}\n.form-floating > .form-control::placeholder {\n  color: transparent;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown) {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:-webkit-autofill {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n}\n.form-floating > .form-select {\n  padding-top: 1.625rem;\n  padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {\n  opacity: 0.65;\n  transform: scale(0.85) translateY(-0.5rem) translateX(-0.15rem);\n}\n.form-floating > .form-control:focus ~ label,\n.form-floating > .form-control:not(:placeholder-shown) ~ label,\n.form-floating > .form-select ~ label {\n  opacity: 0.65;\n  transform: scale(0.85) translateY(-0.5rem) translateX(-0.15rem);\n}\n.form-floating > .form-control:-webkit-autofill ~ label {\n  opacity: 0.65;\n  transform: scale(0.85) translateY(-0.5rem) translateX(-0.15rem);\n}\n\n.input-group {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: stretch;\n  width: 100%;\n}\n.input-group > .form-control,\n.input-group > .form-select {\n  position: relative;\n  flex: 1 1 auto;\n  width: 1%;\n  min-width: 0;\n}\n.input-group > .form-control:focus,\n.input-group > .form-select:focus {\n  z-index: 3;\n}\n.input-group .btn {\n  position: relative;\n  z-index: 2;\n}\n.input-group .btn:focus {\n  z-index: 3;\n}\n\n.input-group-text {\n  display: flex;\n  align-items: center;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #e9ecef;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  border-radius: 0.2rem;\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n  padding-left: 3rem;\n}\n\n.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),\n.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),\n.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {\n  margin-right: -1px;\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 0.875em;\n  color: #198754;\n}\n\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: 0.1rem;\n  font-size: 0.875rem;\n  color: #fff;\n  background-color: rgba(25, 135, 84, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n  border-color: #198754;\n  padding-left: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: left calc(0.375em + 0.1875rem) center;\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n  border-color: #198754;\n  box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n  padding-left: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) left calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:valid, .form-select.is-valid {\n  border-color: #198754;\n}\n.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size=\"1\"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size=\"1\"] {\n  padding-left: 4.125rem;\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\"), url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n  background-position: left 0.75rem center, center left 2.25rem;\n  background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:valid:focus, .form-select.is-valid:focus {\n  border-color: #198754;\n  box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n\n.was-validated .form-check-input:valid, .form-check-input.is-valid {\n  border-color: #198754;\n}\n.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {\n  background-color: #198754;\n}\n.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {\n  box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.25);\n}\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n  color: #198754;\n}\n\n.form-check-inline .form-check-input ~ .valid-feedback {\n  margin-right: 0.5em;\n}\n\n.was-validated .input-group .form-control:valid, .input-group .form-control.is-valid,\n.was-validated .input-group .form-select:valid,\n.input-group .form-select.is-valid {\n  z-index: 1;\n}\n.was-validated .input-group .form-control:valid:focus, .input-group .form-control.is-valid:focus,\n.was-validated .input-group .form-select:valid:focus,\n.input-group .form-select.is-valid:focus {\n  z-index: 3;\n}\n\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 0.875em;\n  color: #dc3545;\n}\n\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: 0.1rem;\n  font-size: 0.875rem;\n  color: #fff;\n  background-color: rgba(220, 53, 69, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n  border-color: #dc3545;\n  padding-left: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: left calc(0.375em + 0.1875rem) center;\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n  padding-left: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) left calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:invalid, .form-select.is-invalid {\n  border-color: #dc3545;\n}\n.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size=\"1\"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size=\"1\"] {\n  padding-left: 4.125rem;\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\"), url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n  background-position: left 0.75rem center, center left 2.25rem;\n  background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-check-input:invalid, .form-check-input.is-invalid {\n  border-color: #dc3545;\n}\n.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {\n  background-color: #dc3545;\n}\n.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {\n  box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);\n}\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n  color: #dc3545;\n}\n\n.form-check-inline .form-check-input ~ .invalid-feedback {\n  margin-right: 0.5em;\n}\n\n.was-validated .input-group .form-control:invalid, .input-group .form-control.is-invalid,\n.was-validated .input-group .form-select:invalid,\n.input-group .form-select.is-invalid {\n  z-index: 2;\n}\n.was-validated .input-group .form-control:invalid:focus, .input-group .form-control.is-invalid:focus,\n.was-validated .input-group .form-select:invalid:focus,\n.input-group .form-select.is-invalid:focus {\n  z-index: 3;\n}\n\n.btn {\n  display: inline-block;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: center;\n  text-decoration: none;\n  vertical-align: middle;\n  cursor: pointer;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n  background-color: transparent;\n  border: 1px solid transparent;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .btn {\n    transition: none;\n  }\n}\n.btn:hover {\n  color: #212529;\n}\n.btn-check:focus + .btn, .btn:focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.btn:disabled, .btn.disabled, fieldset:disabled .btn {\n  pointer-events: none;\n  opacity: 0.65;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.btn-primary:hover {\n  color: #fff;\n  background-color: #0b5ed7;\n  border-color: #0a58ca;\n}\n.btn-check:focus + .btn-primary, .btn-primary:focus {\n  color: #fff;\n  background-color: #0b5ed7;\n  border-color: #0a58ca;\n  box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);\n}\n.btn-check:checked + .btn-primary, .btn-check:active + .btn-primary, .btn-primary:active, .btn-primary.active, .show > .btn-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #0a58ca;\n  border-color: #0a53be;\n}\n.btn-check:checked + .btn-primary:focus, .btn-check:active + .btn-primary:focus, .btn-primary:active:focus, .btn-primary.active:focus, .show > .btn-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(49, 132, 253, 0.5);\n}\n.btn-primary:disabled, .btn-primary.disabled {\n  color: #fff;\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n\n.btn-secondary {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n.btn-secondary:hover {\n  color: #fff;\n  background-color: #5c636a;\n  border-color: #565e64;\n}\n.btn-check:focus + .btn-secondary, .btn-secondary:focus {\n  color: #fff;\n  background-color: #5c636a;\n  border-color: #565e64;\n  box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);\n}\n.btn-check:checked + .btn-secondary, .btn-check:active + .btn-secondary, .btn-secondary:active, .btn-secondary.active, .show > .btn-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #565e64;\n  border-color: #51585e;\n}\n.btn-check:checked + .btn-secondary:focus, .btn-check:active + .btn-secondary:focus, .btn-secondary:active:focus, .btn-secondary.active:focus, .show > .btn-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(130, 138, 145, 0.5);\n}\n.btn-secondary:disabled, .btn-secondary.disabled {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-success {\n  color: #fff;\n  background-color: #198754;\n  border-color: #198754;\n}\n.btn-success:hover {\n  color: #fff;\n  background-color: #157347;\n  border-color: #146c43;\n}\n.btn-check:focus + .btn-success, .btn-success:focus {\n  color: #fff;\n  background-color: #157347;\n  border-color: #146c43;\n  box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);\n}\n.btn-check:checked + .btn-success, .btn-check:active + .btn-success, .btn-success:active, .btn-success.active, .show > .btn-success.dropdown-toggle {\n  color: #fff;\n  background-color: #146c43;\n  border-color: #13653f;\n}\n.btn-check:checked + .btn-success:focus, .btn-check:active + .btn-success:focus, .btn-success:active:focus, .btn-success.active:focus, .show > .btn-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(60, 153, 110, 0.5);\n}\n.btn-success:disabled, .btn-success.disabled {\n  color: #fff;\n  background-color: #198754;\n  border-color: #198754;\n}\n\n.btn-info {\n  color: #000;\n  background-color: #0dcaf0;\n  border-color: #0dcaf0;\n}\n.btn-info:hover {\n  color: #000;\n  background-color: #31d2f2;\n  border-color: #25cff2;\n}\n.btn-check:focus + .btn-info, .btn-info:focus {\n  color: #000;\n  background-color: #31d2f2;\n  border-color: #25cff2;\n  box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);\n}\n.btn-check:checked + .btn-info, .btn-check:active + .btn-info, .btn-info:active, .btn-info.active, .show > .btn-info.dropdown-toggle {\n  color: #000;\n  background-color: #3dd5f3;\n  border-color: #25cff2;\n}\n.btn-check:checked + .btn-info:focus, .btn-check:active + .btn-info:focus, .btn-info:active:focus, .btn-info.active:focus, .show > .btn-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(11, 172, 204, 0.5);\n}\n.btn-info:disabled, .btn-info.disabled {\n  color: #000;\n  background-color: #0dcaf0;\n  border-color: #0dcaf0;\n}\n\n.btn-warning {\n  color: #000;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n.btn-warning:hover {\n  color: #000;\n  background-color: #ffca2c;\n  border-color: #ffc720;\n}\n.btn-check:focus + .btn-warning, .btn-warning:focus {\n  color: #000;\n  background-color: #ffca2c;\n  border-color: #ffc720;\n  box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);\n}\n.btn-check:checked + .btn-warning, .btn-check:active + .btn-warning, .btn-warning:active, .btn-warning.active, .show > .btn-warning.dropdown-toggle {\n  color: #000;\n  background-color: #ffcd39;\n  border-color: #ffc720;\n}\n.btn-check:checked + .btn-warning:focus, .btn-check:active + .btn-warning:focus, .btn-warning:active:focus, .btn-warning.active:focus, .show > .btn-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(217, 164, 6, 0.5);\n}\n.btn-warning:disabled, .btn-warning.disabled {\n  color: #000;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-danger {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n.btn-danger:hover {\n  color: #fff;\n  background-color: #bb2d3b;\n  border-color: #b02a37;\n}\n.btn-check:focus + .btn-danger, .btn-danger:focus {\n  color: #fff;\n  background-color: #bb2d3b;\n  border-color: #b02a37;\n  box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);\n}\n.btn-check:checked + .btn-danger, .btn-check:active + .btn-danger, .btn-danger:active, .btn-danger.active, .show > .btn-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #b02a37;\n  border-color: #a52834;\n}\n.btn-check:checked + .btn-danger:focus, .btn-check:active + .btn-danger:focus, .btn-danger:active:focus, .btn-danger.active:focus, .show > .btn-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(225, 83, 97, 0.5);\n}\n.btn-danger:disabled, .btn-danger.disabled {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-light {\n  color: #000;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n.btn-light:hover {\n  color: #000;\n  background-color: #f9fafb;\n  border-color: #f9fafb;\n}\n.btn-check:focus + .btn-light, .btn-light:focus {\n  color: #000;\n  background-color: #f9fafb;\n  border-color: #f9fafb;\n  box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);\n}\n.btn-check:checked + .btn-light, .btn-check:active + .btn-light, .btn-light:active, .btn-light.active, .show > .btn-light.dropdown-toggle {\n  color: #000;\n  background-color: #f9fafb;\n  border-color: #f9fafb;\n}\n.btn-check:checked + .btn-light:focus, .btn-check:active + .btn-light:focus, .btn-light:active:focus, .btn-light.active:focus, .show > .btn-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(211, 212, 213, 0.5);\n}\n.btn-light:disabled, .btn-light.disabled {\n  color: #000;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-dark {\n  color: #fff;\n  background-color: #212529;\n  border-color: #212529;\n}\n.btn-dark:hover {\n  color: #fff;\n  background-color: #1c1f23;\n  border-color: #1a1e21;\n}\n.btn-check:focus + .btn-dark, .btn-dark:focus {\n  color: #fff;\n  background-color: #1c1f23;\n  border-color: #1a1e21;\n  box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);\n}\n.btn-check:checked + .btn-dark, .btn-check:active + .btn-dark, .btn-dark:active, .btn-dark.active, .show > .btn-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #1a1e21;\n  border-color: #191c1f;\n}\n.btn-check:checked + .btn-dark:focus, .btn-check:active + .btn-dark:focus, .btn-dark:active:focus, .btn-dark.active:focus, .show > .btn-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.25rem rgba(66, 70, 73, 0.5);\n}\n.btn-dark:disabled, .btn-dark.disabled {\n  color: #fff;\n  background-color: #212529;\n  border-color: #212529;\n}\n\n.btn-outline-primary {\n  color: #0d6efd;\n  border-color: #0d6efd;\n}\n.btn-outline-primary:hover {\n  color: #fff;\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.btn-check:focus + .btn-outline-primary, .btn-outline-primary:focus {\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);\n}\n.btn-check:checked + .btn-outline-primary, .btn-check:active + .btn-outline-primary, .btn-outline-primary:active, .btn-outline-primary.active, .btn-outline-primary.dropdown-toggle.show {\n  color: #fff;\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.btn-check:checked + .btn-outline-primary:focus, .btn-check:active + .btn-outline-primary:focus, .btn-outline-primary:active:focus, .btn-outline-primary.active:focus, .btn-outline-primary.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.5);\n}\n.btn-outline-primary:disabled, .btn-outline-primary.disabled {\n  color: #0d6efd;\n  background-color: transparent;\n}\n\n.btn-outline-secondary {\n  color: #6c757d;\n  border-color: #6c757d;\n}\n.btn-outline-secondary:hover {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n.btn-check:focus + .btn-outline-secondary, .btn-outline-secondary:focus {\n  box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);\n}\n.btn-check:checked + .btn-outline-secondary, .btn-check:active + .btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n.btn-check:checked + .btn-outline-secondary:focus, .btn-check:active + .btn-outline-secondary:focus, .btn-outline-secondary:active:focus, .btn-outline-secondary.active:focus, .btn-outline-secondary.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(108, 117, 125, 0.5);\n}\n.btn-outline-secondary:disabled, .btn-outline-secondary.disabled {\n  color: #6c757d;\n  background-color: transparent;\n}\n\n.btn-outline-success {\n  color: #198754;\n  border-color: #198754;\n}\n.btn-outline-success:hover {\n  color: #fff;\n  background-color: #198754;\n  border-color: #198754;\n}\n.btn-check:focus + .btn-outline-success, .btn-outline-success:focus {\n  box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);\n}\n.btn-check:checked + .btn-outline-success, .btn-check:active + .btn-outline-success, .btn-outline-success:active, .btn-outline-success.active, .btn-outline-success.dropdown-toggle.show {\n  color: #fff;\n  background-color: #198754;\n  border-color: #198754;\n}\n.btn-check:checked + .btn-outline-success:focus, .btn-check:active + .btn-outline-success:focus, .btn-outline-success:active:focus, .btn-outline-success.active:focus, .btn-outline-success.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(25, 135, 84, 0.5);\n}\n.btn-outline-success:disabled, .btn-outline-success.disabled {\n  color: #198754;\n  background-color: transparent;\n}\n\n.btn-outline-info {\n  color: #0dcaf0;\n  border-color: #0dcaf0;\n}\n.btn-outline-info:hover {\n  color: #000;\n  background-color: #0dcaf0;\n  border-color: #0dcaf0;\n}\n.btn-check:focus + .btn-outline-info, .btn-outline-info:focus {\n  box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);\n}\n.btn-check:checked + .btn-outline-info, .btn-check:active + .btn-outline-info, .btn-outline-info:active, .btn-outline-info.active, .btn-outline-info.dropdown-toggle.show {\n  color: #000;\n  background-color: #0dcaf0;\n  border-color: #0dcaf0;\n}\n.btn-check:checked + .btn-outline-info:focus, .btn-check:active + .btn-outline-info:focus, .btn-outline-info:active:focus, .btn-outline-info.active:focus, .btn-outline-info.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(13, 202, 240, 0.5);\n}\n.btn-outline-info:disabled, .btn-outline-info.disabled {\n  color: #0dcaf0;\n  background-color: transparent;\n}\n\n.btn-outline-warning {\n  color: #ffc107;\n  border-color: #ffc107;\n}\n.btn-outline-warning:hover {\n  color: #000;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n.btn-check:focus + .btn-outline-warning, .btn-outline-warning:focus {\n  box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);\n}\n.btn-check:checked + .btn-outline-warning, .btn-check:active + .btn-outline-warning, .btn-outline-warning:active, .btn-outline-warning.active, .btn-outline-warning.dropdown-toggle.show {\n  color: #000;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n.btn-check:checked + .btn-outline-warning:focus, .btn-check:active + .btn-outline-warning:focus, .btn-outline-warning:active:focus, .btn-outline-warning.active:focus, .btn-outline-warning.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(255, 193, 7, 0.5);\n}\n.btn-outline-warning:disabled, .btn-outline-warning.disabled {\n  color: #ffc107;\n  background-color: transparent;\n}\n\n.btn-outline-danger {\n  color: #dc3545;\n  border-color: #dc3545;\n}\n.btn-outline-danger:hover {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n.btn-check:focus + .btn-outline-danger, .btn-outline-danger:focus {\n  box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);\n}\n.btn-check:checked + .btn-outline-danger, .btn-check:active + .btn-outline-danger, .btn-outline-danger:active, .btn-outline-danger.active, .btn-outline-danger.dropdown-toggle.show {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n.btn-check:checked + .btn-outline-danger:focus, .btn-check:active + .btn-outline-danger:focus, .btn-outline-danger:active:focus, .btn-outline-danger.active:focus, .btn-outline-danger.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.5);\n}\n.btn-outline-danger:disabled, .btn-outline-danger.disabled {\n  color: #dc3545;\n  background-color: transparent;\n}\n\n.btn-outline-light {\n  color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n.btn-outline-light:hover {\n  color: #000;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n.btn-check:focus + .btn-outline-light, .btn-outline-light:focus {\n  box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);\n}\n.btn-check:checked + .btn-outline-light, .btn-check:active + .btn-outline-light, .btn-outline-light:active, .btn-outline-light.active, .btn-outline-light.dropdown-toggle.show {\n  color: #000;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n.btn-check:checked + .btn-outline-light:focus, .btn-check:active + .btn-outline-light:focus, .btn-outline-light:active:focus, .btn-outline-light.active:focus, .btn-outline-light.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(248, 249, 250, 0.5);\n}\n.btn-outline-light:disabled, .btn-outline-light.disabled {\n  color: #f8f9fa;\n  background-color: transparent;\n}\n\n.btn-outline-dark {\n  color: #212529;\n  border-color: #212529;\n}\n.btn-outline-dark:hover {\n  color: #fff;\n  background-color: #212529;\n  border-color: #212529;\n}\n.btn-check:focus + .btn-outline-dark, .btn-outline-dark:focus {\n  box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);\n}\n.btn-check:checked + .btn-outline-dark, .btn-check:active + .btn-outline-dark, .btn-outline-dark:active, .btn-outline-dark.active, .btn-outline-dark.dropdown-toggle.show {\n  color: #fff;\n  background-color: #212529;\n  border-color: #212529;\n}\n.btn-check:checked + .btn-outline-dark:focus, .btn-check:active + .btn-outline-dark:focus, .btn-outline-dark:active:focus, .btn-outline-dark.active:focus, .btn-outline-dark.dropdown-toggle.show:focus {\n  box-shadow: 0 0 0 0.25rem rgba(33, 37, 41, 0.5);\n}\n.btn-outline-dark:disabled, .btn-outline-dark.disabled {\n  color: #212529;\n  background-color: transparent;\n}\n\n.btn-link {\n  font-weight: 400;\n  color: #0d6efd;\n  text-decoration: underline;\n}\n.btn-link:hover {\n  color: #0a58ca;\n}\n.btn-link:disabled, .btn-link.disabled {\n  color: #6c757d;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  border-radius: 0.2rem;\n}\n\n.fade {\n  transition: opacity 0.15s linear;\n}\n@media (prefers-reduced-motion: reduce) {\n  .fade {\n    transition: none;\n  }\n}\n.fade:not(.show) {\n  opacity: 0;\n}\n\n.collapse:not(.show) {\n  display: none;\n}\n\n.collapsing {\n  height: 0;\n  overflow: hidden;\n  transition: height 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .collapsing {\n    transition: none;\n  }\n}\n.collapsing.collapse-horizontal {\n  width: 0;\n  height: auto;\n  transition: width 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .collapsing.collapse-horizontal {\n    transition: none;\n  }\n}\n\n.dropup,\n.dropend,\n.dropdown,\n.dropstart {\n  position: relative;\n}\n\n.dropdown-toggle {\n  white-space: nowrap;\n}\n.dropdown-toggle::after {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-left: 0.3em solid transparent;\n  border-bottom: 0;\n  border-right: 0.3em solid transparent;\n}\n.dropdown-toggle:empty::after {\n  margin-right: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  z-index: 1000;\n  display: none;\n  min-width: 10rem;\n  padding: 0.5rem 0;\n  margin: 0;\n  font-size: 1rem;\n  color: #212529;\n  text-align: right;\n  list-style: none;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n}\n.dropdown-menu[data-bs-popper] {\n  top: 100%;\n  right: 0;\n  margin-top: 0.125rem;\n}\n\n.dropdown-menu-start {\n  --bs-position: start;\n}\n.dropdown-menu-start[data-bs-popper] {\n  left: auto;\n  right: 0;\n}\n\n.dropdown-menu-end {\n  --bs-position: end;\n}\n.dropdown-menu-end[data-bs-popper] {\n  left: 0;\n  right: auto;\n}\n\n@media (min-width: 576px) {\n  .dropdown-menu-sm-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-sm-start[data-bs-popper] {\n    left: auto;\n    right: 0;\n  }\n\n  .dropdown-menu-sm-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-sm-end[data-bs-popper] {\n    left: 0;\n    right: auto;\n  }\n}\n@media (min-width: 768px) {\n  .dropdown-menu-md-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-md-start[data-bs-popper] {\n    left: auto;\n    right: 0;\n  }\n\n  .dropdown-menu-md-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-md-end[data-bs-popper] {\n    left: 0;\n    right: auto;\n  }\n}\n@media (min-width: 992px) {\n  .dropdown-menu-lg-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-lg-start[data-bs-popper] {\n    left: auto;\n    right: 0;\n  }\n\n  .dropdown-menu-lg-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-lg-end[data-bs-popper] {\n    left: 0;\n    right: auto;\n  }\n}\n@media (min-width: 1200px) {\n  .dropdown-menu-xl-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-xl-start[data-bs-popper] {\n    left: auto;\n    right: 0;\n  }\n\n  .dropdown-menu-xl-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-xl-end[data-bs-popper] {\n    left: 0;\n    right: auto;\n  }\n}\n@media (min-width: 1400px) {\n  .dropdown-menu-xxl-start {\n    --bs-position: start;\n  }\n  .dropdown-menu-xxl-start[data-bs-popper] {\n    left: auto;\n    right: 0;\n  }\n\n  .dropdown-menu-xxl-end {\n    --bs-position: end;\n  }\n  .dropdown-menu-xxl-end[data-bs-popper] {\n    left: 0;\n    right: auto;\n  }\n}\n.dropup .dropdown-menu[data-bs-popper] {\n  top: auto;\n  bottom: 100%;\n  margin-top: 0;\n  margin-bottom: 0.125rem;\n}\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-left: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-right: 0.3em solid transparent;\n}\n.dropup .dropdown-toggle:empty::after {\n  margin-right: 0;\n}\n\n.dropend .dropdown-menu[data-bs-popper] {\n  top: 0;\n  left: auto;\n  right: 100%;\n  margin-top: 0;\n  margin-right: 0.125rem;\n}\n.dropend .dropdown-toggle::after {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-left: 0;\n  border-bottom: 0.3em solid transparent;\n  border-right: 0.3em solid;\n}\n.dropend .dropdown-toggle:empty::after {\n  margin-right: 0;\n}\n.dropend .dropdown-toggle::after {\n  vertical-align: 0;\n}\n\n.dropstart .dropdown-menu[data-bs-popper] {\n  top: 0;\n  left: 100%;\n  right: auto;\n  margin-top: 0;\n  margin-left: 0.125rem;\n}\n.dropstart .dropdown-toggle::after {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n.dropstart .dropdown-toggle::after {\n  display: none;\n}\n.dropstart .dropdown-toggle::before {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-left: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n.dropstart .dropdown-toggle:empty::after {\n  margin-right: 0;\n}\n.dropstart .dropdown-toggle::before {\n  vertical-align: 0;\n}\n\n.dropdown-divider {\n  height: 0;\n  margin: 0.5rem 0;\n  overflow: hidden;\n  border-top: 1px solid rgba(0, 0, 0, 0.15);\n}\n\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: 0.25rem 1rem;\n  clear: both;\n  font-weight: 400;\n  color: #212529;\n  text-align: inherit;\n  text-decoration: none;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n}\n.dropdown-item:hover, .dropdown-item:focus {\n  color: #1e2125;\n  background-color: #e9ecef;\n}\n.dropdown-item.active, .dropdown-item:active {\n  color: #fff;\n  text-decoration: none;\n  background-color: #0d6efd;\n}\n.dropdown-item.disabled, .dropdown-item:disabled {\n  color: #adb5bd;\n  pointer-events: none;\n  background-color: transparent;\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 0.5rem 1rem;\n  margin-bottom: 0;\n  font-size: 0.875rem;\n  color: #6c757d;\n  white-space: nowrap;\n}\n\n.dropdown-item-text {\n  display: block;\n  padding: 0.25rem 1rem;\n  color: #212529;\n}\n\n.dropdown-menu-dark {\n  color: #dee2e6;\n  background-color: #343a40;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.dropdown-menu-dark .dropdown-item {\n  color: #dee2e6;\n}\n.dropdown-menu-dark .dropdown-item:hover, .dropdown-menu-dark .dropdown-item:focus {\n  color: #fff;\n  background-color: rgba(255, 255, 255, 0.15);\n}\n.dropdown-menu-dark .dropdown-item.active, .dropdown-menu-dark .dropdown-item:active {\n  color: #fff;\n  background-color: #0d6efd;\n}\n.dropdown-menu-dark .dropdown-item.disabled, .dropdown-menu-dark .dropdown-item:disabled {\n  color: #adb5bd;\n}\n.dropdown-menu-dark .dropdown-divider {\n  border-color: rgba(0, 0, 0, 0.15);\n}\n.dropdown-menu-dark .dropdown-item-text {\n  color: #dee2e6;\n}\n.dropdown-menu-dark .dropdown-header {\n  color: #adb5bd;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-flex;\n  vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  flex: 1 1 auto;\n}\n.btn-group > .btn-check:checked + .btn,\n.btn-group > .btn-check:focus + .btn,\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn-check:checked + .btn,\n.btn-group-vertical > .btn-check:focus + .btn,\n.btn-group-vertical > .btn:hover,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\n\n.btn-toolbar {\n  display: flex;\n  flex-wrap: wrap;\n  justify-content: flex-start;\n}\n.btn-toolbar .input-group {\n  width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n  margin-right: -1px;\n}\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n.btn-group > .btn:nth-child(n+3),\n.btn-group > :not(.btn-check) + .btn,\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.dropdown-toggle-split {\n  padding-left: 0.5625rem;\n  padding-right: 0.5625rem;\n}\n.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {\n  margin-right: 0;\n}\n.dropstart .dropdown-toggle-split::before {\n  margin-left: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-left: 0.375rem;\n  padding-right: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-left: 0.75rem;\n  padding-right: 0.75rem;\n}\n\n.btn-group-vertical {\n  flex-direction: column;\n  align-items: flex-start;\n  justify-content: center;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  width: 100%;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n  margin-top: -1px;\n}\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.btn-group-vertical > .btn ~ .btn,\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.nav {\n  display: flex;\n  flex-wrap: wrap;\n  padding-right: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: 0.5rem 1rem;\n  color: #0d6efd;\n  text-decoration: none;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .nav-link {\n    transition: none;\n  }\n}\n.nav-link:hover, .nav-link:focus {\n  color: #0a58ca;\n}\n.nav-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: default;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dee2e6;\n}\n.nav-tabs .nav-link {\n  margin-bottom: -1px;\n  background: none;\n  border: 1px solid transparent;\n  border-top-right-radius: 0.25rem;\n  border-top-left-radius: 0.25rem;\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n  border-color: #e9ecef #e9ecef #dee2e6;\n  isolation: isolate;\n}\n.nav-tabs .nav-link.disabled {\n  color: #6c757d;\n  background-color: transparent;\n  border-color: transparent;\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: #495057;\n  background-color: #fff;\n  border-color: #dee2e6 #dee2e6 #fff;\n}\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.nav-pills .nav-link {\n  background: none;\n  border: 0;\n  border-radius: 0.25rem;\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #0d6efd;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n  flex: 1 1 auto;\n  text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n  flex-basis: 0;\n  flex-grow: 1;\n  text-align: center;\n}\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n  width: 100%;\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n.tab-content > .active {\n  display: block;\n}\n\n.navbar {\n  position: relative;\n  display: flex;\n  flex-wrap: wrap;\n  align-items: center;\n  justify-content: space-between;\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n.navbar > .container,\n.navbar > .container-fluid,\n.navbar > .container-sm,\n.navbar > .container-md,\n.navbar > .container-lg,\n.navbar > .container-xl,\n.navbar > .container-xxl {\n  display: flex;\n  flex-wrap: inherit;\n  align-items: center;\n  justify-content: space-between;\n}\n.navbar-brand {\n  padding-top: 0.3125rem;\n  padding-bottom: 0.3125rem;\n  margin-left: 1rem;\n  font-size: 1.25rem;\n  text-decoration: none;\n  white-space: nowrap;\n}\n.navbar-nav {\n  display: flex;\n  flex-direction: column;\n  padding-right: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n.navbar-nav .nav-link {\n  padding-left: 0;\n  padding-right: 0;\n}\n.navbar-nav .dropdown-menu {\n  position: static;\n}\n\n.navbar-text {\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n  flex-basis: 100%;\n  flex-grow: 1;\n  align-items: center;\n}\n\n.navbar-toggler {\n  padding: 0.25rem 0.75rem;\n  font-size: 1.25rem;\n  line-height: 1;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n  transition: box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .navbar-toggler {\n    transition: none;\n  }\n}\n.navbar-toggler:hover {\n  text-decoration: none;\n}\n.navbar-toggler:focus {\n  text-decoration: none;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem;\n}\n\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  background-repeat: no-repeat;\n  background-position: center;\n  background-size: 100%;\n}\n\n.navbar-nav-scroll {\n  max-height: var(--bs-scroll-height, 75vh);\n  overflow-y: auto;\n}\n\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-left: 0.5rem;\n    padding-right: 0.5rem;\n  }\n  .navbar-expand-sm .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-sm .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-sm .offcanvas {\n    position: inherit;\n    bottom: 0;\n    z-index: 1000;\n    flex-grow: 1;\n    visibility: visible !important;\n    background-color: transparent;\n    border-left: 0;\n    border-right: 0;\n    transition: none;\n    transform: none;\n  }\n  .navbar-expand-sm .offcanvas-top,\n.navbar-expand-sm .offcanvas-bottom {\n    height: auto;\n    border-top: 0;\n    border-bottom: 0;\n  }\n  .navbar-expand-sm .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-left: 0.5rem;\n    padding-right: 0.5rem;\n  }\n  .navbar-expand-md .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-md .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-md .offcanvas {\n    position: inherit;\n    bottom: 0;\n    z-index: 1000;\n    flex-grow: 1;\n    visibility: visible !important;\n    background-color: transparent;\n    border-left: 0;\n    border-right: 0;\n    transition: none;\n    transform: none;\n  }\n  .navbar-expand-md .offcanvas-top,\n.navbar-expand-md .offcanvas-bottom {\n    height: auto;\n    border-top: 0;\n    border-bottom: 0;\n  }\n  .navbar-expand-md .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-left: 0.5rem;\n    padding-right: 0.5rem;\n  }\n  .navbar-expand-lg .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-lg .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-lg .offcanvas {\n    position: inherit;\n    bottom: 0;\n    z-index: 1000;\n    flex-grow: 1;\n    visibility: visible !important;\n    background-color: transparent;\n    border-left: 0;\n    border-right: 0;\n    transition: none;\n    transform: none;\n  }\n  .navbar-expand-lg .offcanvas-top,\n.navbar-expand-lg .offcanvas-bottom {\n    height: auto;\n    border-top: 0;\n    border-bottom: 0;\n  }\n  .navbar-expand-lg .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-left: 0.5rem;\n    padding-right: 0.5rem;\n  }\n  .navbar-expand-xl .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-xl .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-xl .offcanvas {\n    position: inherit;\n    bottom: 0;\n    z-index: 1000;\n    flex-grow: 1;\n    visibility: visible !important;\n    background-color: transparent;\n    border-left: 0;\n    border-right: 0;\n    transition: none;\n    transform: none;\n  }\n  .navbar-expand-xl .offcanvas-top,\n.navbar-expand-xl .offcanvas-bottom {\n    height: auto;\n    border-top: 0;\n    border-bottom: 0;\n  }\n  .navbar-expand-xl .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n@media (min-width: 1400px) {\n  .navbar-expand-xxl {\n    flex-wrap: nowrap;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xxl .navbar-nav {\n    flex-direction: row;\n  }\n  .navbar-expand-xxl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xxl .navbar-nav .nav-link {\n    padding-left: 0.5rem;\n    padding-right: 0.5rem;\n  }\n  .navbar-expand-xxl .navbar-nav-scroll {\n    overflow: visible;\n  }\n  .navbar-expand-xxl .navbar-collapse {\n    display: flex !important;\n    flex-basis: auto;\n  }\n  .navbar-expand-xxl .navbar-toggler {\n    display: none;\n  }\n  .navbar-expand-xxl .offcanvas-header {\n    display: none;\n  }\n  .navbar-expand-xxl .offcanvas {\n    position: inherit;\n    bottom: 0;\n    z-index: 1000;\n    flex-grow: 1;\n    visibility: visible !important;\n    background-color: transparent;\n    border-left: 0;\n    border-right: 0;\n    transition: none;\n    transform: none;\n  }\n  .navbar-expand-xxl .offcanvas-top,\n.navbar-expand-xxl .offcanvas-bottom {\n    height: auto;\n    border-top: 0;\n    border-bottom: 0;\n  }\n  .navbar-expand-xxl .offcanvas-body {\n    display: flex;\n    flex-grow: 0;\n    padding: 0;\n    overflow-y: visible;\n  }\n}\n.navbar-expand {\n  flex-wrap: nowrap;\n  justify-content: flex-start;\n}\n.navbar-expand .navbar-nav {\n  flex-direction: row;\n}\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n.navbar-expand .navbar-nav .nav-link {\n  padding-left: 0.5rem;\n  padding-right: 0.5rem;\n}\n.navbar-expand .navbar-nav-scroll {\n  overflow: visible;\n}\n.navbar-expand .navbar-collapse {\n  display: flex !important;\n  flex-basis: auto;\n}\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n.navbar-expand .offcanvas-header {\n  display: none;\n}\n.navbar-expand .offcanvas {\n  position: inherit;\n  bottom: 0;\n  z-index: 1000;\n  flex-grow: 1;\n  visibility: visible !important;\n  background-color: transparent;\n  border-left: 0;\n  border-right: 0;\n  transition: none;\n  transform: none;\n}\n.navbar-expand .offcanvas-top,\n.navbar-expand .offcanvas-bottom {\n  height: auto;\n  border-top: 0;\n  border-bottom: 0;\n}\n.navbar-expand .offcanvas-body {\n  display: flex;\n  flex-grow: 0;\n  padding: 0;\n  overflow-y: visible;\n}\n\n.navbar-light .navbar-brand {\n  color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-nav .nav-link {\n  color: rgba(0, 0, 0, 0.55);\n}\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n  color: rgba(0, 0, 0, 0.7);\n}\n.navbar-light .navbar-nav .nav-link.disabled {\n  color: rgba(0, 0, 0, 0.3);\n}\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .nav-link.active {\n  color: rgba(0, 0, 0, 0.9);\n}\n.navbar-light .navbar-toggler {\n  color: rgba(0, 0, 0, 0.55);\n  border-color: rgba(0, 0, 0, 0.1);\n}\n.navbar-light .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n.navbar-light .navbar-text {\n  color: rgba(0, 0, 0, 0.55);\n}\n.navbar-light .navbar-text a,\n.navbar-light .navbar-text a:hover,\n.navbar-light .navbar-text a:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n  color: #fff;\n}\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n  color: #fff;\n}\n.navbar-dark .navbar-nav .nav-link {\n  color: rgba(255, 255, 255, 0.55);\n}\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n  color: rgba(255, 255, 255, 0.75);\n}\n.navbar-dark .navbar-nav .nav-link.disabled {\n  color: rgba(255, 255, 255, 0.25);\n}\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .nav-link.active {\n  color: #fff;\n}\n.navbar-dark .navbar-toggler {\n  color: rgba(255, 255, 255, 0.55);\n  border-color: rgba(255, 255, 255, 0.1);\n}\n.navbar-dark .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n.navbar-dark .navbar-text {\n  color: rgba(255, 255, 255, 0.55);\n}\n.navbar-dark .navbar-text a,\n.navbar-dark .navbar-text a:hover,\n.navbar-dark .navbar-text a:focus {\n  color: #fff;\n}\n\n.card {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  min-width: 0;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: border-box;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n  border-radius: 0.25rem;\n}\n.card > hr {\n  margin-left: 0;\n  margin-right: 0;\n}\n.card > .list-group {\n  border-top: inherit;\n  border-bottom: inherit;\n}\n.card > .list-group:first-child {\n  border-top-width: 0;\n  border-top-right-radius: calc(0.25rem - 1px);\n  border-top-left-radius: calc(0.25rem - 1px);\n}\n.card > .list-group:last-child {\n  border-bottom-width: 0;\n  border-bottom-left-radius: calc(0.25rem - 1px);\n  border-bottom-right-radius: calc(0.25rem - 1px);\n}\n.card > .card-header + .list-group,\n.card > .list-group + .card-footer {\n  border-top: 0;\n}\n\n.card-body {\n  flex: 1 1 auto;\n  padding: 1rem 1rem;\n}\n\n.card-title {\n  margin-bottom: 0.5rem;\n}\n\n.card-subtitle {\n  margin-top: -0.25rem;\n  margin-bottom: 0;\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link + .card-link {\n  margin-right: 1rem;\n}\n\n.card-header {\n  padding: 0.5rem 1rem;\n  margin-bottom: 0;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-header:first-child {\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-footer {\n  padding: 0.5rem 1rem;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n.card-footer:last-child {\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n  margin-left: -0.5rem;\n  margin-bottom: -0.5rem;\n  margin-right: -0.5rem;\n  border-bottom: 0;\n}\n\n.card-header-pills {\n  margin-left: -0.5rem;\n  margin-right: -0.5rem;\n}\n\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  padding: 1rem;\n  border-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n  width: 100%;\n}\n\n.card-img,\n.card-img-top {\n  border-top-right-radius: calc(0.25rem - 1px);\n  border-top-left-radius: calc(0.25rem - 1px);\n}\n\n.card-img,\n.card-img-bottom {\n  border-bottom-left-radius: calc(0.25rem - 1px);\n  border-bottom-right-radius: calc(0.25rem - 1px);\n}\n\n.card-group > .card {\n  margin-bottom: 0.75rem;\n}\n@media (min-width: 576px) {\n  .card-group {\n    display: flex;\n    flex-flow: row wrap;\n  }\n  .card-group > .card {\n    flex: 1 0 0%;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-right: 0;\n    border-right: 0;\n  }\n  .card-group > .card:not(:last-child) {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-top,\n.card-group > .card:not(:last-child) .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-bottom,\n.card-group > .card:not(:last-child) .card-footer {\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-top,\n.card-group > .card:not(:first-child) .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-bottom,\n.card-group > .card:not(:first-child) .card-footer {\n    border-bottom-right-radius: 0;\n  }\n}\n\n.accordion-button {\n  position: relative;\n  display: flex;\n  align-items: center;\n  width: 100%;\n  padding: 1rem 1.25rem;\n  font-size: 1rem;\n  color: #212529;\n  text-align: right;\n  background-color: #fff;\n  border: 0;\n  border-radius: 0;\n  overflow-anchor: none;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .accordion-button {\n    transition: none;\n  }\n}\n.accordion-button:not(.collapsed) {\n  color: #0c63e4;\n  background-color: #e7f1ff;\n  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125);\n}\n.accordion-button:not(.collapsed)::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n  transform: rotate(180deg);\n}\n.accordion-button::after {\n  flex-shrink: 0;\n  width: 1.25rem;\n  height: 1.25rem;\n  margin-right: auto;\n  content: \"\";\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-size: 1.25rem;\n  transition: transform 0.2s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .accordion-button::after {\n    transition: none;\n  }\n}\n.accordion-button:hover {\n  z-index: 2;\n}\n.accordion-button:focus {\n  z-index: 3;\n  border-color: #86b7fe;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n\n.accordion-header {\n  margin-bottom: 0;\n}\n\n.accordion-item {\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n.accordion-item:first-of-type {\n  border-top-right-radius: 0.25rem;\n  border-top-left-radius: 0.25rem;\n}\n.accordion-item:first-of-type .accordion-button {\n  border-top-right-radius: calc(0.25rem - 1px);\n  border-top-left-radius: calc(0.25rem - 1px);\n}\n.accordion-item:not(:first-of-type) {\n  border-top: 0;\n}\n.accordion-item:last-of-type {\n  border-bottom-left-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n.accordion-item:last-of-type .accordion-button.collapsed {\n  border-bottom-left-radius: calc(0.25rem - 1px);\n  border-bottom-right-radius: calc(0.25rem - 1px);\n}\n.accordion-item:last-of-type .accordion-collapse {\n  border-bottom-left-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n\n.accordion-body {\n  padding: 1rem 1.25rem;\n}\n\n.accordion-flush .accordion-collapse {\n  border-width: 0;\n}\n.accordion-flush .accordion-item {\n  border-left: 0;\n  border-right: 0;\n  border-radius: 0;\n}\n.accordion-flush .accordion-item:first-child {\n  border-top: 0;\n}\n.accordion-flush .accordion-item:last-child {\n  border-bottom: 0;\n}\n.accordion-flush .accordion-item .accordion-button {\n  border-radius: 0;\n}\n\n.breadcrumb {\n  display: flex;\n  flex-wrap: wrap;\n  padding: 0 0;\n  margin-bottom: 1rem;\n  list-style: none;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n  padding-right: 0.5rem;\n}\n.breadcrumb-item + .breadcrumb-item::before {\n  float: right;\n  padding-left: 0.5rem;\n  color: #6c757d;\n  content:  var(--bs-breadcrumb-divider, \"/\") ;\n}\n.breadcrumb-item.active {\n  color: #6c757d;\n}\n\n.pagination {\n  display: flex;\n  padding-right: 0;\n  list-style: none;\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  color: #0d6efd;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .page-link {\n    transition: none;\n  }\n}\n.page-link:hover {\n  z-index: 2;\n  color: #0a58ca;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n.page-link:focus {\n  z-index: 3;\n  color: #0a58ca;\n  background-color: #e9ecef;\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n\n.page-item:not(:first-child) .page-link {\n  margin-right: -1px;\n}\n.page-item.active .page-link {\n  z-index: 3;\n  color: #fff;\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.page-item.disabled .page-link {\n  color: #6c757d;\n  pointer-events: none;\n  background-color: #fff;\n  border-color: #dee2e6;\n}\n\n.page-link {\n  padding: 0.375rem 0.75rem;\n}\n\n.page-item:first-child .page-link {\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n.page-item:last-child .page-link {\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.pagination-lg .page-link {\n  padding: 0.75rem 1.5rem;\n  font-size: 1.25rem;\n}\n.pagination-lg .page-item:first-child .page-link {\n  border-top-right-radius: 0.3rem;\n  border-bottom-right-radius: 0.3rem;\n}\n.pagination-lg .page-item:last-child .page-link {\n  border-top-left-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n}\n.pagination-sm .page-item:first-child .page-link {\n  border-top-right-radius: 0.2rem;\n  border-bottom-right-radius: 0.2rem;\n}\n.pagination-sm .page-item:last-child .page-link {\n  border-top-left-radius: 0.2rem;\n  border-bottom-left-radius: 0.2rem;\n}\n\n.badge {\n  display: inline-block;\n  padding: 0.35em 0.65em;\n  font-size: 0.75em;\n  font-weight: 700;\n  line-height: 1;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: 0.25rem;\n}\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.alert {\n  position: relative;\n  padding: 1rem 1rem;\n  margin-bottom: 1rem;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.alert-heading {\n  color: inherit;\n}\n\n.alert-link {\n  font-weight: 700;\n}\n\n.alert-dismissible {\n  padding-left: 3rem;\n}\n.alert-dismissible .btn-close {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 2;\n  padding: 1.25rem 1rem;\n}\n\n.alert-primary {\n  color: #084298;\n  background-color: #cfe2ff;\n  border-color: #b6d4fe;\n}\n.alert-primary .alert-link {\n  color: #06357a;\n}\n\n.alert-secondary {\n  color: #41464b;\n  background-color: #e2e3e5;\n  border-color: #d3d6d8;\n}\n.alert-secondary .alert-link {\n  color: #34383c;\n}\n\n.alert-success {\n  color: #0f5132;\n  background-color: #d1e7dd;\n  border-color: #badbcc;\n}\n.alert-success .alert-link {\n  color: #0c4128;\n}\n\n.alert-info {\n  color: #055160;\n  background-color: #cff4fc;\n  border-color: #b6effb;\n}\n.alert-info .alert-link {\n  color: #04414d;\n}\n\n.alert-warning {\n  color: #664d03;\n  background-color: #fff3cd;\n  border-color: #ffecb5;\n}\n.alert-warning .alert-link {\n  color: #523e02;\n}\n\n.alert-danger {\n  color: #842029;\n  background-color: #f8d7da;\n  border-color: #f5c2c7;\n}\n.alert-danger .alert-link {\n  color: #6a1a21;\n}\n\n.alert-light {\n  color: #636464;\n  background-color: #fefefe;\n  border-color: #fdfdfe;\n}\n.alert-light .alert-link {\n  color: #4f5050;\n}\n\n.alert-dark {\n  color: #141619;\n  background-color: #d3d3d4;\n  border-color: #bcbebf;\n}\n.alert-dark .alert-link {\n  color: #101214;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  0% {\n    background-position-x: 1rem;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  0% {\n    background-position-x: 1rem;\n  }\n}\n.progress {\n  display: flex;\n  height: 1rem;\n  overflow: hidden;\n  font-size: 0.75rem;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.progress-bar {\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  overflow: hidden;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #0d6efd;\n  transition: width 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar {\n    transition: none;\n  }\n}\n\n.progress-bar-striped {\n  background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n  -webkit-animation: 1s linear infinite progress-bar-stripes;\n  animation: 1s linear infinite progress-bar-stripes;\n}\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar-animated {\n    -webkit-animation: none;\n    animation: none;\n  }\n}\n\n.list-group {\n  display: flex;\n  flex-direction: column;\n  padding-right: 0;\n  margin-bottom: 0;\n  border-radius: 0.25rem;\n}\n\n.list-group-numbered {\n  list-style-type: none;\n  counter-reset: section;\n}\n.list-group-numbered > li::before {\n  content: counters(section, \".\") \". \";\n  counter-increment: section;\n}\n\n.list-group-item-action {\n  width: 100%;\n  color: #495057;\n  text-align: inherit;\n}\n.list-group-item-action:hover, .list-group-item-action:focus {\n  z-index: 1;\n  color: #495057;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n.list-group-item-action:active {\n  color: #212529;\n  background-color: #e9ecef;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 0.5rem 1rem;\n  color: #212529;\n  text-decoration: none;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n.list-group-item:first-child {\n  border-top-right-radius: inherit;\n  border-top-left-radius: inherit;\n}\n.list-group-item:last-child {\n  border-bottom-left-radius: inherit;\n  border-bottom-right-radius: inherit;\n}\n.list-group-item.disabled, .list-group-item:disabled {\n  color: #6c757d;\n  pointer-events: none;\n  background-color: #fff;\n}\n.list-group-item.active {\n  z-index: 2;\n  color: #fff;\n  background-color: #0d6efd;\n  border-color: #0d6efd;\n}\n.list-group-item + .list-group-item {\n  border-top-width: 0;\n}\n.list-group-item + .list-group-item.active {\n  margin-top: -1px;\n  border-top-width: 1px;\n}\n\n.list-group-horizontal {\n  flex-direction: row;\n}\n.list-group-horizontal > .list-group-item:first-child {\n  border-bottom-right-radius: 0.25rem;\n  border-top-left-radius: 0;\n}\n.list-group-horizontal > .list-group-item:last-child {\n  border-top-left-radius: 0.25rem;\n  border-bottom-right-radius: 0;\n}\n.list-group-horizontal > .list-group-item.active {\n  margin-top: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item {\n  border-top-width: 1px;\n  border-right-width: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n  margin-right: -1px;\n  border-right-width: 1px;\n}\n\n@media (min-width: 576px) {\n  .list-group-horizontal-sm {\n    flex-direction: row;\n  }\n  .list-group-horizontal-sm > .list-group-item:first-child {\n    border-bottom-right-radius: 0.25rem;\n    border-top-left-radius: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item:last-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-right-radius: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-right-width: 0;\n  }\n  .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n    margin-right: -1px;\n    border-right-width: 1px;\n  }\n}\n@media (min-width: 768px) {\n  .list-group-horizontal-md {\n    flex-direction: row;\n  }\n  .list-group-horizontal-md > .list-group-item:first-child {\n    border-bottom-right-radius: 0.25rem;\n    border-top-left-radius: 0;\n  }\n  .list-group-horizontal-md > .list-group-item:last-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-right-radius: 0;\n  }\n  .list-group-horizontal-md > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-md > .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-right-width: 0;\n  }\n  .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n    margin-right: -1px;\n    border-right-width: 1px;\n  }\n}\n@media (min-width: 992px) {\n  .list-group-horizontal-lg {\n    flex-direction: row;\n  }\n  .list-group-horizontal-lg > .list-group-item:first-child {\n    border-bottom-right-radius: 0.25rem;\n    border-top-left-radius: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item:last-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-right-radius: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-right-width: 0;\n  }\n  .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n    margin-right: -1px;\n    border-right-width: 1px;\n  }\n}\n@media (min-width: 1200px) {\n  .list-group-horizontal-xl {\n    flex-direction: row;\n  }\n  .list-group-horizontal-xl > .list-group-item:first-child {\n    border-bottom-right-radius: 0.25rem;\n    border-top-left-radius: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item:last-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-right-radius: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-right-width: 0;\n  }\n  .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n    margin-right: -1px;\n    border-right-width: 1px;\n  }\n}\n@media (min-width: 1400px) {\n  .list-group-horizontal-xxl {\n    flex-direction: row;\n  }\n  .list-group-horizontal-xxl > .list-group-item:first-child {\n    border-bottom-right-radius: 0.25rem;\n    border-top-left-radius: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item:last-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-right-radius: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item.active {\n    margin-top: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item + .list-group-item {\n    border-top-width: 1px;\n    border-right-width: 0;\n  }\n  .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {\n    margin-right: -1px;\n    border-right-width: 1px;\n  }\n}\n.list-group-flush {\n  border-radius: 0;\n}\n.list-group-flush > .list-group-item {\n  border-width: 0 0 1px;\n}\n.list-group-flush > .list-group-item:last-child {\n  border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n  color: #084298;\n  background-color: #cfe2ff;\n}\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n  color: #084298;\n  background-color: #bacbe6;\n}\n.list-group-item-primary.list-group-item-action.active {\n  color: #fff;\n  background-color: #084298;\n  border-color: #084298;\n}\n\n.list-group-item-secondary {\n  color: #41464b;\n  background-color: #e2e3e5;\n}\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n  color: #41464b;\n  background-color: #cbccce;\n}\n.list-group-item-secondary.list-group-item-action.active {\n  color: #fff;\n  background-color: #41464b;\n  border-color: #41464b;\n}\n\n.list-group-item-success {\n  color: #0f5132;\n  background-color: #d1e7dd;\n}\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n  color: #0f5132;\n  background-color: #bcd0c7;\n}\n.list-group-item-success.list-group-item-action.active {\n  color: #fff;\n  background-color: #0f5132;\n  border-color: #0f5132;\n}\n\n.list-group-item-info {\n  color: #055160;\n  background-color: #cff4fc;\n}\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n  color: #055160;\n  background-color: #badce3;\n}\n.list-group-item-info.list-group-item-action.active {\n  color: #fff;\n  background-color: #055160;\n  border-color: #055160;\n}\n\n.list-group-item-warning {\n  color: #664d03;\n  background-color: #fff3cd;\n}\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n  color: #664d03;\n  background-color: #e6dbb9;\n}\n.list-group-item-warning.list-group-item-action.active {\n  color: #fff;\n  background-color: #664d03;\n  border-color: #664d03;\n}\n\n.list-group-item-danger {\n  color: #842029;\n  background-color: #f8d7da;\n}\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n  color: #842029;\n  background-color: #dfc2c4;\n}\n.list-group-item-danger.list-group-item-action.active {\n  color: #fff;\n  background-color: #842029;\n  border-color: #842029;\n}\n\n.list-group-item-light {\n  color: #636464;\n  background-color: #fefefe;\n}\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n  color: #636464;\n  background-color: #e5e5e5;\n}\n.list-group-item-light.list-group-item-action.active {\n  color: #fff;\n  background-color: #636464;\n  border-color: #636464;\n}\n\n.list-group-item-dark {\n  color: #141619;\n  background-color: #d3d3d4;\n}\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n  color: #141619;\n  background-color: #bebebf;\n}\n.list-group-item-dark.list-group-item-action.active {\n  color: #fff;\n  background-color: #141619;\n  border-color: #141619;\n}\n\n.btn-close {\n  box-sizing: content-box;\n  width: 1em;\n  height: 1em;\n  padding: 0.25em 0.25em;\n  color: #000;\n  background: transparent url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e\") center/1em auto no-repeat;\n  border: 0;\n  border-radius: 0.25rem;\n  opacity: 0.5;\n}\n.btn-close:hover {\n  color: #000;\n  text-decoration: none;\n  opacity: 0.75;\n}\n.btn-close:focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n  opacity: 1;\n}\n.btn-close:disabled, .btn-close.disabled {\n  pointer-events: none;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  user-select: none;\n  opacity: 0.25;\n}\n\n.btn-close-white {\n  filter: invert(1) grayscale(100%) brightness(200%);\n}\n\n.toast {\n  width: 350px;\n  max-width: 100%;\n  font-size: 0.875rem;\n  pointer-events: auto;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n}\n.toast.showing {\n  opacity: 0;\n}\n.toast:not(.show) {\n  display: none;\n}\n\n.toast-container {\n  width: -webkit-max-content;\n  width: -moz-max-content;\n  width: max-content;\n  max-width: 100%;\n  pointer-events: none;\n}\n.toast-container > :not(:last-child) {\n  margin-bottom: 0.75rem;\n}\n\n.toast-header {\n  display: flex;\n  align-items: center;\n  padding: 0.5rem 0.75rem;\n  color: #6c757d;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n  border-top-right-radius: calc(0.25rem - 1px);\n  border-top-left-radius: calc(0.25rem - 1px);\n}\n.toast-header .btn-close {\n  margin-left: -0.375rem;\n  margin-right: 0.75rem;\n}\n\n.toast-body {\n  padding: 0.75rem;\n  word-wrap: break-word;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  z-index: 1055;\n  display: none;\n  width: 100%;\n  height: 100%;\n  overflow-x: hidden;\n  overflow-y: auto;\n  outline: 0;\n}\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 0.5rem;\n  pointer-events: none;\n}\n.modal.fade .modal-dialog {\n  transition: transform 0.3s ease-out;\n  transform: translate(0, -50px);\n}\n@media (prefers-reduced-motion: reduce) {\n  .modal.fade .modal-dialog {\n    transition: none;\n  }\n}\n.modal.show .modal-dialog {\n  transform: none;\n}\n.modal.modal-static .modal-dialog {\n  transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n  height: calc(100% - 1rem);\n}\n.modal-dialog-scrollable .modal-content {\n  max-height: 100%;\n  overflow: hidden;\n}\n.modal-dialog-scrollable .modal-body {\n  overflow-y: auto;\n}\n\n.modal-dialog-centered {\n  display: flex;\n  align-items: center;\n  min-height: calc(100% - 1rem);\n}\n\n.modal-content {\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  width: 100%;\n  pointer-events: auto;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n  outline: 0;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  z-index: 1050;\n  width: 100vw;\n  height: 100vh;\n  background-color: #000;\n}\n.modal-backdrop.fade {\n  opacity: 0;\n}\n.modal-backdrop.show {\n  opacity: 0.5;\n}\n\n.modal-header {\n  display: flex;\n  flex-shrink: 0;\n  align-items: center;\n  justify-content: space-between;\n  padding: 1rem 1rem;\n  border-bottom: 1px solid #dee2e6;\n  border-top-right-radius: calc(0.3rem - 1px);\n  border-top-left-radius: calc(0.3rem - 1px);\n}\n.modal-header .btn-close {\n  padding: 0.5rem 0.5rem;\n  margin: -0.5rem auto -0.5rem -0.5rem;\n}\n\n.modal-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n\n.modal-body {\n  position: relative;\n  flex: 1 1 auto;\n  padding: 1rem;\n}\n\n.modal-footer {\n  display: flex;\n  flex-wrap: wrap;\n  flex-shrink: 0;\n  align-items: center;\n  justify-content: flex-end;\n  padding: 0.75rem;\n  border-top: 1px solid #dee2e6;\n  border-bottom-left-radius: calc(0.3rem - 1px);\n  border-bottom-right-radius: calc(0.3rem - 1px);\n}\n.modal-footer > * {\n  margin: 0.25rem;\n}\n\n@media (min-width: 576px) {\n  .modal-dialog {\n    max-width: 500px;\n    margin: 1.75rem auto;\n  }\n\n  .modal-dialog-scrollable {\n    height: calc(100% - 3.5rem);\n  }\n\n  .modal-dialog-centered {\n    min-height: calc(100% - 3.5rem);\n  }\n\n  .modal-sm {\n    max-width: 300px;\n  }\n}\n@media (min-width: 992px) {\n  .modal-lg,\n.modal-xl {\n    max-width: 800px;\n  }\n}\n@media (min-width: 1200px) {\n  .modal-xl {\n    max-width: 1140px;\n  }\n}\n.modal-fullscreen {\n  width: 100vw;\n  max-width: none;\n  height: 100%;\n  margin: 0;\n}\n.modal-fullscreen .modal-content {\n  height: 100%;\n  border: 0;\n  border-radius: 0;\n}\n.modal-fullscreen .modal-header {\n  border-radius: 0;\n}\n.modal-fullscreen .modal-body {\n  overflow-y: auto;\n}\n.modal-fullscreen .modal-footer {\n  border-radius: 0;\n}\n\n@media (max-width: 575.98px) {\n  .modal-fullscreen-sm-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-sm-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-sm-down .modal-header {\n    border-radius: 0;\n  }\n  .modal-fullscreen-sm-down .modal-body {\n    overflow-y: auto;\n  }\n  .modal-fullscreen-sm-down .modal-footer {\n    border-radius: 0;\n  }\n}\n@media (max-width: 767.98px) {\n  .modal-fullscreen-md-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-md-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-md-down .modal-header {\n    border-radius: 0;\n  }\n  .modal-fullscreen-md-down .modal-body {\n    overflow-y: auto;\n  }\n  .modal-fullscreen-md-down .modal-footer {\n    border-radius: 0;\n  }\n}\n@media (max-width: 991.98px) {\n  .modal-fullscreen-lg-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-lg-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-lg-down .modal-header {\n    border-radius: 0;\n  }\n  .modal-fullscreen-lg-down .modal-body {\n    overflow-y: auto;\n  }\n  .modal-fullscreen-lg-down .modal-footer {\n    border-radius: 0;\n  }\n}\n@media (max-width: 1199.98px) {\n  .modal-fullscreen-xl-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-xl-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-xl-down .modal-header {\n    border-radius: 0;\n  }\n  .modal-fullscreen-xl-down .modal-body {\n    overflow-y: auto;\n  }\n  .modal-fullscreen-xl-down .modal-footer {\n    border-radius: 0;\n  }\n}\n@media (max-width: 1399.98px) {\n  .modal-fullscreen-xxl-down {\n    width: 100vw;\n    max-width: none;\n    height: 100%;\n    margin: 0;\n  }\n  .modal-fullscreen-xxl-down .modal-content {\n    height: 100%;\n    border: 0;\n    border-radius: 0;\n  }\n  .modal-fullscreen-xxl-down .modal-header {\n    border-radius: 0;\n  }\n  .modal-fullscreen-xxl-down .modal-body {\n    overflow-y: auto;\n  }\n  .modal-fullscreen-xxl-down .modal-footer {\n    border-radius: 0;\n  }\n}\n.tooltip {\n  position: absolute;\n  z-index: 1080;\n  display: block;\n  margin: 0;\n  font-family: var(--bs-font-sans-serif);\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: right;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  opacity: 0;\n}\n.tooltip.show {\n  opacity: 0.9;\n}\n.tooltip .tooltip-arrow {\n  position: absolute;\n  display: block;\n  width: 0.8rem;\n  height: 0.4rem;\n}\n.tooltip .tooltip-arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[data-popper-placement^=top] {\n  padding: 0.4rem 0;\n}\n.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {\n  bottom: 0;\n}\n.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {\n  top: -1px;\n  border-width: 0.4rem 0.4rem 0;\n  border-top-color: #000;\n}\n\n.bs-tooltip-end, .bs-tooltip-auto[data-popper-placement^=right] {\n  padding: 0 0.4rem;\n}\n.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {\n  right: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {\n  left: -1px;\n  border-width: 0.4rem 0 0.4rem 0.4rem;\n  border-left-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[data-popper-placement^=bottom] {\n  padding: 0.4rem 0;\n}\n.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {\n  top: 0;\n}\n.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {\n  bottom: -1px;\n  border-width: 0 0.4rem 0.4rem;\n  border-bottom-color: #000;\n}\n\n.bs-tooltip-start, .bs-tooltip-auto[data-popper-placement^=left] {\n  padding: 0 0.4rem;\n}\n.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {\n  left: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {\n  right: -1px;\n  border-width: 0.4rem 0.4rem 0.4rem 0;\n  border-right-color: #000;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 0.25rem 0.5rem;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 0.25rem;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0 ;\n  z-index: 1070;\n  display: block;\n  max-width: 276px;\n  font-family: var(--bs-font-sans-serif);\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: right;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n}\n.popover .popover-arrow {\n  position: absolute;\n  display: block;\n  width: 1rem;\n  height: 0.5rem;\n}\n.popover .popover-arrow::before, .popover .popover-arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {\n  bottom: calc(-0.5rem - 1px);\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {\n  bottom: 0;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n  bottom: 1px;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: #fff;\n}\n\n.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {\n  right: calc(-0.5rem - 1px);\n  width: 0.5rem;\n  height: 1rem;\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {\n  right: 0;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n  right: 1px;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: #fff;\n}\n\n.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {\n  top: calc(-0.5rem - 1px);\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {\n  top: 0;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n  top: 1px;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: #fff;\n}\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {\n  position: absolute;\n  top: 0;\n  right: 50%;\n  display: block;\n  width: 1rem;\n  margin-right: -0.5rem;\n  content: \"\";\n  border-bottom: 1px solid #f0f0f0;\n}\n\n.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {\n  left: calc(-0.5rem - 1px);\n  width: 0.5rem;\n  height: 1rem;\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {\n  left: 0;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n  left: 1px;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: #fff;\n}\n\n.popover-header {\n  padding: 0.5rem 1rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  background-color: #f0f0f0;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n  border-top-right-radius: calc(0.3rem - 1px);\n  border-top-left-radius: calc(0.3rem - 1px);\n}\n.popover-header:empty {\n  display: none;\n}\n\n.popover-body {\n  padding: 1rem 1rem;\n  color: #212529;\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel.pointer-event {\n  touch-action: pan-y;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n.carousel-inner::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  float: right;\n  width: 100%;\n  margin-left: -100%;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  transition: transform 0.6s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-item {\n    transition: none;\n  }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n  transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n  transform: translateX(-100%);\n}\n.carousel-fade .carousel-item {\n  opacity: 0;\n  transition-property: opacity;\n  transform: none;\n}\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-start,\n.carousel-fade .carousel-item-prev.carousel-item-end {\n  z-index: 1;\n  opacity: 1;\n}\n.carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n  z-index: 0;\n  opacity: 0;\n  transition: opacity 0s 0.6s;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n    transition: none;\n  }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 1;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 15%;\n  padding: 0;\n  color: #fff;\n  text-align: center;\n  background: none;\n  border: 0;\n  opacity: 0.5;\n  transition: opacity 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-control-prev,\n.carousel-control-next {\n    transition: none;\n  }\n}\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  opacity: 0.9;\n}\n\n.carousel-control-prev {\n  right: 0;\n}\n\n.carousel-control-next {\n  left: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  background-repeat: no-repeat;\n  background-position: 50%;\n  background-size: 100% 100%;\n}\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n  position: absolute;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  z-index: 2;\n  display: flex;\n  justify-content: center;\n  padding: 0;\n  margin-left: 15%;\n  margin-bottom: 1rem;\n  margin-right: 15%;\n  list-style: none;\n}\n.carousel-indicators [data-bs-target] {\n  box-sizing: content-box;\n  flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  padding: 0;\n  margin-left: 3px;\n  margin-right: 3px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 0;\n  border-top: 10px solid transparent;\n  border-bottom: 10px solid transparent;\n  opacity: 0.5;\n  transition: opacity 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n  .carousel-indicators [data-bs-target] {\n    transition: none;\n  }\n}\n.carousel-indicators .active {\n  opacity: 1;\n}\n\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  bottom: 1.25rem;\n  right: 15%;\n  padding-top: 1.25rem;\n  padding-bottom: 1.25rem;\n  color: #fff;\n  text-align: center;\n}\n\n.carousel-dark .carousel-control-next-icon,\n.carousel-dark .carousel-control-prev-icon {\n  filter: invert(1) grayscale(100);\n}\n.carousel-dark .carousel-indicators [data-bs-target] {\n  background-color: #000;\n}\n.carousel-dark .carousel-caption {\n  color: #000;\n}\n\n@-webkit-keyframes spinner-border {\n  to {\n    transform: rotate(360deg) ;\n  }\n}\n\n@keyframes spinner-border {\n  to {\n    transform: rotate(360deg) ;\n  }\n}\n.spinner-border {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: -0.125em;\n  border: 0.25em solid currentColor;\n  border-left-color: transparent;\n  border-radius: 50%;\n  -webkit-animation: 0.75s linear infinite spinner-border;\n  animation: 0.75s linear infinite spinner-border;\n}\n\n.spinner-border-sm {\n  width: 1rem;\n  height: 1rem;\n  border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n  0% {\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n    transform: none;\n  }\n}\n\n@keyframes spinner-grow {\n  0% {\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n    transform: none;\n  }\n}\n.spinner-grow {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: -0.125em;\n  background-color: currentColor;\n  border-radius: 50%;\n  opacity: 0;\n  -webkit-animation: 0.75s linear infinite spinner-grow;\n  animation: 0.75s linear infinite spinner-grow;\n}\n\n.spinner-grow-sm {\n  width: 1rem;\n  height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .spinner-border,\n.spinner-grow {\n    -webkit-animation-duration: 1.5s;\n    animation-duration: 1.5s;\n  }\n}\n.offcanvas {\n  position: fixed;\n  bottom: 0;\n  z-index: 1045;\n  display: flex;\n  flex-direction: column;\n  max-width: 100%;\n  visibility: hidden;\n  background-color: #fff;\n  background-clip: padding-box;\n  outline: 0;\n  transition: transform 0.3s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n  .offcanvas {\n    transition: none;\n  }\n}\n\n.offcanvas-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  z-index: 1040;\n  width: 100vw;\n  height: 100vh;\n  background-color: #000;\n}\n.offcanvas-backdrop.fade {\n  opacity: 0;\n}\n.offcanvas-backdrop.show {\n  opacity: 0.5;\n}\n\n.offcanvas-header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  padding: 1rem 1rem;\n}\n.offcanvas-header .btn-close {\n  padding: 0.5rem 0.5rem;\n  margin-top: -0.5rem;\n  margin-left: -0.5rem;\n  margin-bottom: -0.5rem;\n}\n\n.offcanvas-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n\n.offcanvas-body {\n  flex-grow: 1;\n  padding: 1rem 1rem;\n  overflow-y: auto;\n}\n\n.offcanvas-start {\n  top: 0;\n  right: 0;\n  width: 400px;\n  border-left: 1px solid rgba(0, 0, 0, 0.2);\n  transform: translateX(100%);\n}\n\n.offcanvas-end {\n  top: 0;\n  left: 0;\n  width: 400px;\n  border-right: 1px solid rgba(0, 0, 0, 0.2);\n  transform: translateX(-100%);\n}\n\n.offcanvas-top {\n  top: 0;\n  left: 0;\n  right: 0;\n  height: 30vh;\n  max-height: 100%;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.2);\n  transform: translateY(-100%);\n}\n\n.offcanvas-bottom {\n  left: 0;\n  right: 0;\n  height: 30vh;\n  max-height: 100%;\n  border-top: 1px solid rgba(0, 0, 0, 0.2);\n  transform: translateY(100%);\n}\n\n.offcanvas.show {\n  transform: none;\n}\n\n.placeholder {\n  display: inline-block;\n  min-height: 1em;\n  vertical-align: middle;\n  cursor: wait;\n  background-color: currentColor;\n  opacity: 0.5;\n}\n.placeholder.btn::before {\n  display: inline-block;\n  content: \"\";\n}\n\n.placeholder-xs {\n  min-height: 0.6em;\n}\n\n.placeholder-sm {\n  min-height: 0.8em;\n}\n\n.placeholder-lg {\n  min-height: 1.2em;\n}\n\n.placeholder-glow .placeholder {\n  -webkit-animation: placeholder-glow 2s ease-in-out infinite;\n  animation: placeholder-glow 2s ease-in-out infinite;\n}\n\n@-webkit-keyframes placeholder-glow {\n  50% {\n    opacity: 0.2;\n  }\n}\n\n@keyframes placeholder-glow {\n  50% {\n    opacity: 0.2;\n  }\n}\n.placeholder-wave {\n  -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n  mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n  -webkit-mask-size: 200% 100%;\n  mask-size: 200% 100%;\n  -webkit-animation: placeholder-wave 2s linear infinite;\n  animation: placeholder-wave 2s linear infinite;\n}\n\n@-webkit-keyframes placeholder-wave {\n  100% {\n    -webkit-mask-position: -200% 0%;\n    mask-position: -200% 0%;\n  }\n}\n\n@keyframes placeholder-wave {\n  100% {\n    -webkit-mask-position: -200% 0%;\n    mask-position: -200% 0%;\n  }\n}\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.link-primary {\n  color: #0d6efd;\n}\n.link-primary:hover, .link-primary:focus {\n  color: #0a58ca;\n}\n\n.link-secondary {\n  color: #6c757d;\n}\n.link-secondary:hover, .link-secondary:focus {\n  color: #565e64;\n}\n\n.link-success {\n  color: #198754;\n}\n.link-success:hover, .link-success:focus {\n  color: #146c43;\n}\n\n.link-info {\n  color: #0dcaf0;\n}\n.link-info:hover, .link-info:focus {\n  color: #3dd5f3;\n}\n\n.link-warning {\n  color: #ffc107;\n}\n.link-warning:hover, .link-warning:focus {\n  color: #ffcd39;\n}\n\n.link-danger {\n  color: #dc3545;\n}\n.link-danger:hover, .link-danger:focus {\n  color: #b02a37;\n}\n\n.link-light {\n  color: #f8f9fa;\n}\n.link-light:hover, .link-light:focus {\n  color: #f9fafb;\n}\n\n.link-dark {\n  color: #212529;\n}\n.link-dark:hover, .link-dark:focus {\n  color: #1a1e21;\n}\n\n.ratio {\n  position: relative;\n  width: 100%;\n}\n.ratio::before {\n  display: block;\n  padding-top: var(--bs-aspect-ratio);\n  content: \"\";\n}\n.ratio > * {\n  position: absolute;\n  top: 0;\n  right: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.ratio-1x1 {\n  --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n  --bs-aspect-ratio: calc(3 / 4 * 100%);\n}\n\n.ratio-16x9 {\n  --bs-aspect-ratio: calc(9 / 16 * 100%);\n}\n\n.ratio-21x9 {\n  --bs-aspect-ratio: calc(9 / 21 * 100%);\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  z-index: 1030;\n}\n\n.sticky-top {\n  position: -webkit-sticky;\n  position: sticky;\n  top: 0;\n  z-index: 1020;\n}\n\n@media (min-width: 576px) {\n  .sticky-sm-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 768px) {\n  .sticky-md-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 992px) {\n  .sticky-lg-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1200px) {\n  .sticky-xl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n@media (min-width: 1400px) {\n  .sticky-xxl-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n.hstack {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  align-self: stretch;\n}\n\n.vstack {\n  display: flex;\n  flex: 1 1 auto;\n  flex-direction: column;\n  align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n  position: absolute !important;\n  width: 1px !important;\n  height: 1px !important;\n  padding: 0 !important;\n  margin: -1px !important;\n  overflow: hidden !important;\n  clip: rect(0, 0, 0, 0) !important;\n  white-space: nowrap !important;\n  border: 0 !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  z-index: 1;\n  content: \"\";\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.vr {\n  display: inline-block;\n  align-self: stretch;\n  width: 1px;\n  min-height: 1em;\n  background-color: currentColor;\n  opacity: 0.25;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.float-start {\n  float: right !important;\n}\n\n.float-end {\n  float: left !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n.opacity-0 {\n  opacity: 0 !important;\n}\n\n.opacity-25 {\n  opacity: 0.25 !important;\n}\n\n.opacity-50 {\n  opacity: 0.5 !important;\n}\n\n.opacity-75 {\n  opacity: 0.75 !important;\n}\n\n.opacity-100 {\n  opacity: 1 !important;\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.overflow-visible {\n  overflow: visible !important;\n}\n\n.overflow-scroll {\n  overflow: scroll !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-grid {\n  display: grid !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: inline-flex !important;\n}\n\n.d-none {\n  display: none !important;\n}\n\n.shadow {\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-sm {\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow-lg {\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.top-0 {\n  top: 0 !important;\n}\n\n.top-50 {\n  top: 50% !important;\n}\n\n.top-100 {\n  top: 100% !important;\n}\n\n.bottom-0 {\n  bottom: 0 !important;\n}\n\n.bottom-50 {\n  bottom: 50% !important;\n}\n\n.bottom-100 {\n  bottom: 100% !important;\n}\n\n.start-0 {\n  right: 0 !important;\n}\n\n.start-50 {\n  right: 50% !important;\n}\n\n.start-100 {\n  right: 100% !important;\n}\n\n.end-0 {\n  left: 0 !important;\n}\n\n.end-50 {\n  left: 50% !important;\n}\n\n.end-100 {\n  left: 100% !important;\n}\n\n.translate-middle {\n  transform: translate(50%, -50%) !important;\n}\n\n.translate-middle-x {\n  transform: translateX(50%) !important;\n}\n\n.translate-middle-y {\n  transform: translateY(-50%) !important;\n}\n\n.border {\n  border: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top {\n  border-top: 1px solid #dee2e6 !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-end {\n  border-left: 1px solid #dee2e6 !important;\n}\n\n.border-end-0 {\n  border-left: 0 !important;\n}\n\n.border-bottom {\n  border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-start {\n  border-right: 1px solid #dee2e6 !important;\n}\n\n.border-start-0 {\n  border-right: 0 !important;\n}\n\n.border-primary {\n  border-color: #0d6efd !important;\n}\n\n.border-secondary {\n  border-color: #6c757d !important;\n}\n\n.border-success {\n  border-color: #198754 !important;\n}\n\n.border-info {\n  border-color: #0dcaf0 !important;\n}\n\n.border-warning {\n  border-color: #ffc107 !important;\n}\n\n.border-danger {\n  border-color: #dc3545 !important;\n}\n\n.border-light {\n  border-color: #f8f9fa !important;\n}\n\n.border-dark {\n  border-color: #212529 !important;\n}\n\n.border-white {\n  border-color: #fff !important;\n}\n\n.border-1 {\n  border-width: 1px !important;\n}\n\n.border-2 {\n  border-width: 2px !important;\n}\n\n.border-3 {\n  border-width: 3px !important;\n}\n\n.border-4 {\n  border-width: 4px !important;\n}\n\n.border-5 {\n  border-width: 5px !important;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.flex-fill {\n  flex: 1 1 auto !important;\n}\n\n.flex-row {\n  flex-direction: row !important;\n}\n\n.flex-column {\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  flex-wrap: wrap-reverse !important;\n}\n\n.gap-0 {\n  gap: 0 !important;\n}\n\n.gap-1 {\n  gap: 0.25rem !important;\n}\n\n.gap-2 {\n  gap: 0.5rem !important;\n}\n\n.gap-3 {\n  gap: 1rem !important;\n}\n\n.gap-4 {\n  gap: 1.5rem !important;\n}\n\n.gap-5 {\n  gap: 3rem !important;\n}\n\n.justify-content-start {\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n  justify-content: space-evenly !important;\n}\n\n.align-items-start {\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  align-content: center !important;\n}\n\n.align-content-between {\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  align-self: auto !important;\n}\n\n.align-self-start {\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  align-self: stretch !important;\n}\n\n.order-first {\n  order: -1 !important;\n}\n\n.order-0 {\n  order: 0 !important;\n}\n\n.order-1 {\n  order: 1 !important;\n}\n\n.order-2 {\n  order: 2 !important;\n}\n\n.order-3 {\n  order: 3 !important;\n}\n\n.order-4 {\n  order: 4 !important;\n}\n\n.order-5 {\n  order: 5 !important;\n}\n\n.order-last {\n  order: 6 !important;\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mx-0 {\n  margin-left: 0 !important;\n  margin-right: 0 !important;\n}\n\n.mx-1 {\n  margin-left: 0.25rem !important;\n  margin-right: 0.25rem !important;\n}\n\n.mx-2 {\n  margin-left: 0.5rem !important;\n  margin-right: 0.5rem !important;\n}\n\n.mx-3 {\n  margin-left: 1rem !important;\n  margin-right: 1rem !important;\n}\n\n.mx-4 {\n  margin-left: 1.5rem !important;\n  margin-right: 1.5rem !important;\n}\n\n.mx-5 {\n  margin-left: 3rem !important;\n  margin-right: 3rem !important;\n}\n\n.mx-auto {\n  margin-left: auto !important;\n  margin-right: auto !important;\n}\n\n.my-0 {\n  margin-top: 0 !important;\n  margin-bottom: 0 !important;\n}\n\n.my-1 {\n  margin-top: 0.25rem !important;\n  margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n  margin-top: 0.5rem !important;\n  margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n  margin-top: 1rem !important;\n  margin-bottom: 1rem !important;\n}\n\n.my-4 {\n  margin-top: 1.5rem !important;\n  margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n  margin-top: 3rem !important;\n  margin-bottom: 3rem !important;\n}\n\n.my-auto {\n  margin-top: auto !important;\n  margin-bottom: auto !important;\n}\n\n.mt-0 {\n  margin-top: 0 !important;\n}\n\n.mt-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n  margin-top: 1rem !important;\n}\n\n.mt-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n  margin-top: 3rem !important;\n}\n\n.mt-auto {\n  margin-top: auto !important;\n}\n\n.me-0 {\n  margin-left: 0 !important;\n}\n\n.me-1 {\n  margin-left: 0.25rem !important;\n}\n\n.me-2 {\n  margin-left: 0.5rem !important;\n}\n\n.me-3 {\n  margin-left: 1rem !important;\n}\n\n.me-4 {\n  margin-left: 1.5rem !important;\n}\n\n.me-5 {\n  margin-left: 3rem !important;\n}\n\n.me-auto {\n  margin-left: auto !important;\n}\n\n.mb-0 {\n  margin-bottom: 0 !important;\n}\n\n.mb-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n  margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n  margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n  margin-bottom: auto !important;\n}\n\n.ms-0 {\n  margin-right: 0 !important;\n}\n\n.ms-1 {\n  margin-right: 0.25rem !important;\n}\n\n.ms-2 {\n  margin-right: 0.5rem !important;\n}\n\n.ms-3 {\n  margin-right: 1rem !important;\n}\n\n.ms-4 {\n  margin-right: 1.5rem !important;\n}\n\n.ms-5 {\n  margin-right: 3rem !important;\n}\n\n.ms-auto {\n  margin-right: auto !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.px-0 {\n  padding-left: 0 !important;\n  padding-right: 0 !important;\n}\n\n.px-1 {\n  padding-left: 0.25rem !important;\n  padding-right: 0.25rem !important;\n}\n\n.px-2 {\n  padding-left: 0.5rem !important;\n  padding-right: 0.5rem !important;\n}\n\n.px-3 {\n  padding-left: 1rem !important;\n  padding-right: 1rem !important;\n}\n\n.px-4 {\n  padding-left: 1.5rem !important;\n  padding-right: 1.5rem !important;\n}\n\n.px-5 {\n  padding-left: 3rem !important;\n  padding-right: 3rem !important;\n}\n\n.py-0 {\n  padding-top: 0 !important;\n  padding-bottom: 0 !important;\n}\n\n.py-1 {\n  padding-top: 0.25rem !important;\n  padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n  padding-top: 0.5rem !important;\n  padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n  padding-top: 1rem !important;\n  padding-bottom: 1rem !important;\n}\n\n.py-4 {\n  padding-top: 1.5rem !important;\n  padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n  padding-top: 3rem !important;\n  padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n  padding-top: 0 !important;\n}\n\n.pt-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n  padding-top: 1rem !important;\n}\n\n.pt-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n  padding-top: 3rem !important;\n}\n\n.pe-0 {\n  padding-left: 0 !important;\n}\n\n.pe-1 {\n  padding-left: 0.25rem !important;\n}\n\n.pe-2 {\n  padding-left: 0.5rem !important;\n}\n\n.pe-3 {\n  padding-left: 1rem !important;\n}\n\n.pe-4 {\n  padding-left: 1.5rem !important;\n}\n\n.pe-5 {\n  padding-left: 3rem !important;\n}\n\n.pb-0 {\n  padding-bottom: 0 !important;\n}\n\n.pb-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n  padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n  padding-right: 0 !important;\n}\n\n.ps-1 {\n  padding-right: 0.25rem !important;\n}\n\n.ps-2 {\n  padding-right: 0.5rem !important;\n}\n\n.ps-3 {\n  padding-right: 1rem !important;\n}\n\n.ps-4 {\n  padding-right: 1.5rem !important;\n}\n\n.ps-5 {\n  padding-right: 3rem !important;\n}\n\n.font-monospace {\n  font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n  font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n  font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n  font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n  font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n  font-size: 1.25rem !important;\n}\n\n.fs-6 {\n  font-size: 1rem !important;\n}\n\n.fst-italic {\n  font-style: italic !important;\n}\n\n.fst-normal {\n  font-style: normal !important;\n}\n\n.fw-light {\n  font-weight: 300 !important;\n}\n\n.fw-lighter {\n  font-weight: lighter !important;\n}\n\n.fw-normal {\n  font-weight: 400 !important;\n}\n\n.fw-bold {\n  font-weight: 700 !important;\n}\n\n.fw-bolder {\n  font-weight: bolder !important;\n}\n\n.lh-1 {\n  line-height: 1 !important;\n}\n\n.lh-sm {\n  line-height: 1.25 !important;\n}\n\n.lh-base {\n  line-height: 1.5 !important;\n}\n\n.lh-lg {\n  line-height: 2 !important;\n}\n\n.text-start {\n  text-align: right !important;\n}\n\n.text-end {\n  text-align: left !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-decoration-underline {\n  text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n  text-decoration: line-through !important;\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n.text-primary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n  --bs-text-opacity: 1;\n  color: rgba(var(--bs-body-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n  --bs-text-opacity: 1;\n  color: #6c757d !important;\n}\n\n.text-black-50 {\n  --bs-text-opacity: 1;\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  --bs-text-opacity: 1;\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-reset {\n  --bs-text-opacity: 1;\n  color: inherit !important;\n}\n\n.text-opacity-25 {\n  --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n  --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n  --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n  --bs-text-opacity: 1;\n}\n\n.bg-primary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n  --bs-bg-opacity: 1;\n  background-color: rgba(var(--bs-body-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n  --bs-bg-opacity: 1;\n  background-color: transparent !important;\n}\n\n.bg-opacity-10 {\n  --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n  --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n  --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n  --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n  --bs-bg-opacity: 1;\n}\n\n.bg-gradient {\n  background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n  -webkit-user-select: all !important;\n  -moz-user-select: all !important;\n  user-select: all !important;\n}\n\n.user-select-auto {\n  -webkit-user-select: auto !important;\n  -moz-user-select: auto !important;\n  user-select: auto !important;\n}\n\n.user-select-none {\n  -webkit-user-select: none !important;\n  -moz-user-select: none !important;\n  user-select: none !important;\n}\n\n.pe-none {\n  pointer-events: none !important;\n}\n\n.pe-auto {\n  pointer-events: auto !important;\n}\n\n.rounded {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.rounded-1 {\n  border-radius: 0.2rem !important;\n}\n\n.rounded-2 {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-3 {\n  border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: 50rem !important;\n}\n\n.rounded-top {\n  border-top-right-radius: 0.25rem !important;\n  border-top-left-radius: 0.25rem !important;\n}\n\n.rounded-end {\n  border-top-left-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n  border-bottom-left-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-start {\n  border-bottom-right-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-start {\n    float: right !important;\n  }\n\n  .float-sm-end {\n    float: left !important;\n  }\n\n  .float-sm-none {\n    float: none !important;\n  }\n\n  .d-sm-inline {\n    display: inline !important;\n  }\n\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-sm-block {\n    display: block !important;\n  }\n\n  .d-sm-grid {\n    display: grid !important;\n  }\n\n  .d-sm-table {\n    display: table !important;\n  }\n\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-sm-flex {\n    display: flex !important;\n  }\n\n  .d-sm-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-sm-none {\n    display: none !important;\n  }\n\n  .flex-sm-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-sm-row {\n    flex-direction: row !important;\n  }\n\n  .flex-sm-column {\n    flex-direction: column !important;\n  }\n\n  .flex-sm-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-sm-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-sm-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-sm-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-sm-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-sm-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-sm-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-sm-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-sm-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-sm-0 {\n    gap: 0 !important;\n  }\n\n  .gap-sm-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-sm-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-sm-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-sm-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-sm-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-sm-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-sm-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-sm-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-sm-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-sm-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-sm-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-sm-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-sm-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-sm-center {\n    align-items: center !important;\n  }\n\n  .align-items-sm-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-sm-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-sm-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-sm-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-sm-center {\n    align-content: center !important;\n  }\n\n  .align-content-sm-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-sm-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-sm-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-sm-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-sm-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-sm-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-sm-center {\n    align-self: center !important;\n  }\n\n  .align-self-sm-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-sm-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-sm-first {\n    order: -1 !important;\n  }\n\n  .order-sm-0 {\n    order: 0 !important;\n  }\n\n  .order-sm-1 {\n    order: 1 !important;\n  }\n\n  .order-sm-2 {\n    order: 2 !important;\n  }\n\n  .order-sm-3 {\n    order: 3 !important;\n  }\n\n  .order-sm-4 {\n    order: 4 !important;\n  }\n\n  .order-sm-5 {\n    order: 5 !important;\n  }\n\n  .order-sm-last {\n    order: 6 !important;\n  }\n\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n\n  .m-sm-auto {\n    margin: auto !important;\n  }\n\n  .mx-sm-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-sm-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-sm-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-sm-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-sm-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-sm-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-sm-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-sm-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-sm-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-sm-auto {\n    margin-top: auto !important;\n  }\n\n  .me-sm-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-sm-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-sm-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-sm-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-sm-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-sm-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-sm-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-sm-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-sm-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-sm-auto {\n    margin-right: auto !important;\n  }\n\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n\n  .px-sm-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-sm-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-sm-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-sm-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-sm-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-sm-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-sm-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-sm-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-sm-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-sm-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-sm-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-sm-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-sm-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-sm-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-sm-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-sm-5 {\n    padding-right: 3rem !important;\n  }\n\n  .text-sm-start {\n    text-align: right !important;\n  }\n\n  .text-sm-end {\n    text-align: left !important;\n  }\n\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 768px) {\n  .float-md-start {\n    float: right !important;\n  }\n\n  .float-md-end {\n    float: left !important;\n  }\n\n  .float-md-none {\n    float: none !important;\n  }\n\n  .d-md-inline {\n    display: inline !important;\n  }\n\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-md-block {\n    display: block !important;\n  }\n\n  .d-md-grid {\n    display: grid !important;\n  }\n\n  .d-md-table {\n    display: table !important;\n  }\n\n  .d-md-table-row {\n    display: table-row !important;\n  }\n\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-md-flex {\n    display: flex !important;\n  }\n\n  .d-md-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-md-none {\n    display: none !important;\n  }\n\n  .flex-md-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-md-row {\n    flex-direction: row !important;\n  }\n\n  .flex-md-column {\n    flex-direction: column !important;\n  }\n\n  .flex-md-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-md-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-md-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-md-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-md-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-md-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-md-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-md-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-md-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-md-0 {\n    gap: 0 !important;\n  }\n\n  .gap-md-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-md-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-md-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-md-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-md-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-md-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-md-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-md-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-md-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-md-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-md-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-md-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-md-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-md-center {\n    align-items: center !important;\n  }\n\n  .align-items-md-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-md-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-md-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-md-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-md-center {\n    align-content: center !important;\n  }\n\n  .align-content-md-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-md-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-md-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-md-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-md-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-md-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-md-center {\n    align-self: center !important;\n  }\n\n  .align-self-md-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-md-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-md-first {\n    order: -1 !important;\n  }\n\n  .order-md-0 {\n    order: 0 !important;\n  }\n\n  .order-md-1 {\n    order: 1 !important;\n  }\n\n  .order-md-2 {\n    order: 2 !important;\n  }\n\n  .order-md-3 {\n    order: 3 !important;\n  }\n\n  .order-md-4 {\n    order: 4 !important;\n  }\n\n  .order-md-5 {\n    order: 5 !important;\n  }\n\n  .order-md-last {\n    order: 6 !important;\n  }\n\n  .m-md-0 {\n    margin: 0 !important;\n  }\n\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n\n  .m-md-auto {\n    margin: auto !important;\n  }\n\n  .mx-md-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-md-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-md-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-md-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-md-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-md-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-md-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-md-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-md-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-md-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-md-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-md-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-md-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-md-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-md-auto {\n    margin-top: auto !important;\n  }\n\n  .me-md-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-md-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-md-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-md-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-md-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-md-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-md-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-md-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-md-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-md-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-md-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-md-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-md-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-md-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-md-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-md-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-md-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-md-auto {\n    margin-right: auto !important;\n  }\n\n  .p-md-0 {\n    padding: 0 !important;\n  }\n\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n\n  .px-md-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-md-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-md-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-md-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-md-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-md-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-md-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-md-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-md-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-md-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-md-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-md-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-md-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-md-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-md-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-md-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-md-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-md-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-md-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-md-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-md-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-md-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-md-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-md-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-md-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-md-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-md-5 {\n    padding-right: 3rem !important;\n  }\n\n  .text-md-start {\n    text-align: right !important;\n  }\n\n  .text-md-end {\n    text-align: left !important;\n  }\n\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 992px) {\n  .float-lg-start {\n    float: right !important;\n  }\n\n  .float-lg-end {\n    float: left !important;\n  }\n\n  .float-lg-none {\n    float: none !important;\n  }\n\n  .d-lg-inline {\n    display: inline !important;\n  }\n\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-lg-block {\n    display: block !important;\n  }\n\n  .d-lg-grid {\n    display: grid !important;\n  }\n\n  .d-lg-table {\n    display: table !important;\n  }\n\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-lg-flex {\n    display: flex !important;\n  }\n\n  .d-lg-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-lg-none {\n    display: none !important;\n  }\n\n  .flex-lg-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-lg-row {\n    flex-direction: row !important;\n  }\n\n  .flex-lg-column {\n    flex-direction: column !important;\n  }\n\n  .flex-lg-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-lg-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-lg-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-lg-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-lg-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-lg-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-lg-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-lg-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-lg-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-lg-0 {\n    gap: 0 !important;\n  }\n\n  .gap-lg-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-lg-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-lg-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-lg-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-lg-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-lg-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-lg-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-lg-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-lg-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-lg-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-lg-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-lg-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-lg-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-lg-center {\n    align-items: center !important;\n  }\n\n  .align-items-lg-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-lg-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-lg-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-lg-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-lg-center {\n    align-content: center !important;\n  }\n\n  .align-content-lg-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-lg-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-lg-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-lg-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-lg-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-lg-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-lg-center {\n    align-self: center !important;\n  }\n\n  .align-self-lg-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-lg-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-lg-first {\n    order: -1 !important;\n  }\n\n  .order-lg-0 {\n    order: 0 !important;\n  }\n\n  .order-lg-1 {\n    order: 1 !important;\n  }\n\n  .order-lg-2 {\n    order: 2 !important;\n  }\n\n  .order-lg-3 {\n    order: 3 !important;\n  }\n\n  .order-lg-4 {\n    order: 4 !important;\n  }\n\n  .order-lg-5 {\n    order: 5 !important;\n  }\n\n  .order-lg-last {\n    order: 6 !important;\n  }\n\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n\n  .m-lg-auto {\n    margin: auto !important;\n  }\n\n  .mx-lg-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-lg-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-lg-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-lg-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-lg-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-lg-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-lg-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-lg-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-lg-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-lg-auto {\n    margin-top: auto !important;\n  }\n\n  .me-lg-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-lg-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-lg-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-lg-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-lg-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-lg-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-lg-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-lg-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-lg-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-lg-auto {\n    margin-right: auto !important;\n  }\n\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n\n  .px-lg-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-lg-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-lg-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-lg-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-lg-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-lg-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-lg-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-lg-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-lg-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-lg-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-lg-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-lg-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-lg-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-lg-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-lg-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-lg-5 {\n    padding-right: 3rem !important;\n  }\n\n  .text-lg-start {\n    text-align: right !important;\n  }\n\n  .text-lg-end {\n    text-align: left !important;\n  }\n\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .float-xl-start {\n    float: right !important;\n  }\n\n  .float-xl-end {\n    float: left !important;\n  }\n\n  .float-xl-none {\n    float: none !important;\n  }\n\n  .d-xl-inline {\n    display: inline !important;\n  }\n\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-xl-block {\n    display: block !important;\n  }\n\n  .d-xl-grid {\n    display: grid !important;\n  }\n\n  .d-xl-table {\n    display: table !important;\n  }\n\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-xl-flex {\n    display: flex !important;\n  }\n\n  .d-xl-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-xl-none {\n    display: none !important;\n  }\n\n  .flex-xl-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-xl-row {\n    flex-direction: row !important;\n  }\n\n  .flex-xl-column {\n    flex-direction: column !important;\n  }\n\n  .flex-xl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-xl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-xl-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-xl-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-xl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-xl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-xl-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-xl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-xl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-xl-0 {\n    gap: 0 !important;\n  }\n\n  .gap-xl-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-xl-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-xl-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-xl-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-xl-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-xl-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-xl-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-xl-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-xl-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-xl-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-xl-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-xl-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-xl-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-xl-center {\n    align-items: center !important;\n  }\n\n  .align-items-xl-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-xl-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-xl-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-xl-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-xl-center {\n    align-content: center !important;\n  }\n\n  .align-content-xl-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-xl-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-xl-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-xl-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-xl-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-xl-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-xl-center {\n    align-self: center !important;\n  }\n\n  .align-self-xl-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-xl-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-xl-first {\n    order: -1 !important;\n  }\n\n  .order-xl-0 {\n    order: 0 !important;\n  }\n\n  .order-xl-1 {\n    order: 1 !important;\n  }\n\n  .order-xl-2 {\n    order: 2 !important;\n  }\n\n  .order-xl-3 {\n    order: 3 !important;\n  }\n\n  .order-xl-4 {\n    order: 4 !important;\n  }\n\n  .order-xl-5 {\n    order: 5 !important;\n  }\n\n  .order-xl-last {\n    order: 6 !important;\n  }\n\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n\n  .m-xl-auto {\n    margin: auto !important;\n  }\n\n  .mx-xl-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-xl-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-xl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-xl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-xl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-xl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-xl-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-xl-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-xl-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-xl-auto {\n    margin-top: auto !important;\n  }\n\n  .me-xl-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-xl-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-xl-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-xl-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-xl-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-xl-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-xl-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-xl-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-xl-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-xl-auto {\n    margin-right: auto !important;\n  }\n\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n\n  .px-xl-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-xl-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-xl-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-xl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-xl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-xl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-xl-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-xl-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-xl-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-xl-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-xl-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-xl-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-xl-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-xl-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-xl-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-xl-5 {\n    padding-right: 3rem !important;\n  }\n\n  .text-xl-start {\n    text-align: right !important;\n  }\n\n  .text-xl-end {\n    text-align: left !important;\n  }\n\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1400px) {\n  .float-xxl-start {\n    float: right !important;\n  }\n\n  .float-xxl-end {\n    float: left !important;\n  }\n\n  .float-xxl-none {\n    float: none !important;\n  }\n\n  .d-xxl-inline {\n    display: inline !important;\n  }\n\n  .d-xxl-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-xxl-block {\n    display: block !important;\n  }\n\n  .d-xxl-grid {\n    display: grid !important;\n  }\n\n  .d-xxl-table {\n    display: table !important;\n  }\n\n  .d-xxl-table-row {\n    display: table-row !important;\n  }\n\n  .d-xxl-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-xxl-flex {\n    display: flex !important;\n  }\n\n  .d-xxl-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-xxl-none {\n    display: none !important;\n  }\n\n  .flex-xxl-fill {\n    flex: 1 1 auto !important;\n  }\n\n  .flex-xxl-row {\n    flex-direction: row !important;\n  }\n\n  .flex-xxl-column {\n    flex-direction: column !important;\n  }\n\n  .flex-xxl-row-reverse {\n    flex-direction: row-reverse !important;\n  }\n\n  .flex-xxl-column-reverse {\n    flex-direction: column-reverse !important;\n  }\n\n  .flex-xxl-grow-0 {\n    flex-grow: 0 !important;\n  }\n\n  .flex-xxl-grow-1 {\n    flex-grow: 1 !important;\n  }\n\n  .flex-xxl-shrink-0 {\n    flex-shrink: 0 !important;\n  }\n\n  .flex-xxl-shrink-1 {\n    flex-shrink: 1 !important;\n  }\n\n  .flex-xxl-wrap {\n    flex-wrap: wrap !important;\n  }\n\n  .flex-xxl-nowrap {\n    flex-wrap: nowrap !important;\n  }\n\n  .flex-xxl-wrap-reverse {\n    flex-wrap: wrap-reverse !important;\n  }\n\n  .gap-xxl-0 {\n    gap: 0 !important;\n  }\n\n  .gap-xxl-1 {\n    gap: 0.25rem !important;\n  }\n\n  .gap-xxl-2 {\n    gap: 0.5rem !important;\n  }\n\n  .gap-xxl-3 {\n    gap: 1rem !important;\n  }\n\n  .gap-xxl-4 {\n    gap: 1.5rem !important;\n  }\n\n  .gap-xxl-5 {\n    gap: 3rem !important;\n  }\n\n  .justify-content-xxl-start {\n    justify-content: flex-start !important;\n  }\n\n  .justify-content-xxl-end {\n    justify-content: flex-end !important;\n  }\n\n  .justify-content-xxl-center {\n    justify-content: center !important;\n  }\n\n  .justify-content-xxl-between {\n    justify-content: space-between !important;\n  }\n\n  .justify-content-xxl-around {\n    justify-content: space-around !important;\n  }\n\n  .justify-content-xxl-evenly {\n    justify-content: space-evenly !important;\n  }\n\n  .align-items-xxl-start {\n    align-items: flex-start !important;\n  }\n\n  .align-items-xxl-end {\n    align-items: flex-end !important;\n  }\n\n  .align-items-xxl-center {\n    align-items: center !important;\n  }\n\n  .align-items-xxl-baseline {\n    align-items: baseline !important;\n  }\n\n  .align-items-xxl-stretch {\n    align-items: stretch !important;\n  }\n\n  .align-content-xxl-start {\n    align-content: flex-start !important;\n  }\n\n  .align-content-xxl-end {\n    align-content: flex-end !important;\n  }\n\n  .align-content-xxl-center {\n    align-content: center !important;\n  }\n\n  .align-content-xxl-between {\n    align-content: space-between !important;\n  }\n\n  .align-content-xxl-around {\n    align-content: space-around !important;\n  }\n\n  .align-content-xxl-stretch {\n    align-content: stretch !important;\n  }\n\n  .align-self-xxl-auto {\n    align-self: auto !important;\n  }\n\n  .align-self-xxl-start {\n    align-self: flex-start !important;\n  }\n\n  .align-self-xxl-end {\n    align-self: flex-end !important;\n  }\n\n  .align-self-xxl-center {\n    align-self: center !important;\n  }\n\n  .align-self-xxl-baseline {\n    align-self: baseline !important;\n  }\n\n  .align-self-xxl-stretch {\n    align-self: stretch !important;\n  }\n\n  .order-xxl-first {\n    order: -1 !important;\n  }\n\n  .order-xxl-0 {\n    order: 0 !important;\n  }\n\n  .order-xxl-1 {\n    order: 1 !important;\n  }\n\n  .order-xxl-2 {\n    order: 2 !important;\n  }\n\n  .order-xxl-3 {\n    order: 3 !important;\n  }\n\n  .order-xxl-4 {\n    order: 4 !important;\n  }\n\n  .order-xxl-5 {\n    order: 5 !important;\n  }\n\n  .order-xxl-last {\n    order: 6 !important;\n  }\n\n  .m-xxl-0 {\n    margin: 0 !important;\n  }\n\n  .m-xxl-1 {\n    margin: 0.25rem !important;\n  }\n\n  .m-xxl-2 {\n    margin: 0.5rem !important;\n  }\n\n  .m-xxl-3 {\n    margin: 1rem !important;\n  }\n\n  .m-xxl-4 {\n    margin: 1.5rem !important;\n  }\n\n  .m-xxl-5 {\n    margin: 3rem !important;\n  }\n\n  .m-xxl-auto {\n    margin: auto !important;\n  }\n\n  .mx-xxl-0 {\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n  }\n\n  .mx-xxl-1 {\n    margin-left: 0.25rem !important;\n    margin-right: 0.25rem !important;\n  }\n\n  .mx-xxl-2 {\n    margin-left: 0.5rem !important;\n    margin-right: 0.5rem !important;\n  }\n\n  .mx-xxl-3 {\n    margin-left: 1rem !important;\n    margin-right: 1rem !important;\n  }\n\n  .mx-xxl-4 {\n    margin-left: 1.5rem !important;\n    margin-right: 1.5rem !important;\n  }\n\n  .mx-xxl-5 {\n    margin-left: 3rem !important;\n    margin-right: 3rem !important;\n  }\n\n  .mx-xxl-auto {\n    margin-left: auto !important;\n    margin-right: auto !important;\n  }\n\n  .my-xxl-0 {\n    margin-top: 0 !important;\n    margin-bottom: 0 !important;\n  }\n\n  .my-xxl-1 {\n    margin-top: 0.25rem !important;\n    margin-bottom: 0.25rem !important;\n  }\n\n  .my-xxl-2 {\n    margin-top: 0.5rem !important;\n    margin-bottom: 0.5rem !important;\n  }\n\n  .my-xxl-3 {\n    margin-top: 1rem !important;\n    margin-bottom: 1rem !important;\n  }\n\n  .my-xxl-4 {\n    margin-top: 1.5rem !important;\n    margin-bottom: 1.5rem !important;\n  }\n\n  .my-xxl-5 {\n    margin-top: 3rem !important;\n    margin-bottom: 3rem !important;\n  }\n\n  .my-xxl-auto {\n    margin-top: auto !important;\n    margin-bottom: auto !important;\n  }\n\n  .mt-xxl-0 {\n    margin-top: 0 !important;\n  }\n\n  .mt-xxl-1 {\n    margin-top: 0.25rem !important;\n  }\n\n  .mt-xxl-2 {\n    margin-top: 0.5rem !important;\n  }\n\n  .mt-xxl-3 {\n    margin-top: 1rem !important;\n  }\n\n  .mt-xxl-4 {\n    margin-top: 1.5rem !important;\n  }\n\n  .mt-xxl-5 {\n    margin-top: 3rem !important;\n  }\n\n  .mt-xxl-auto {\n    margin-top: auto !important;\n  }\n\n  .me-xxl-0 {\n    margin-left: 0 !important;\n  }\n\n  .me-xxl-1 {\n    margin-left: 0.25rem !important;\n  }\n\n  .me-xxl-2 {\n    margin-left: 0.5rem !important;\n  }\n\n  .me-xxl-3 {\n    margin-left: 1rem !important;\n  }\n\n  .me-xxl-4 {\n    margin-left: 1.5rem !important;\n  }\n\n  .me-xxl-5 {\n    margin-left: 3rem !important;\n  }\n\n  .me-xxl-auto {\n    margin-left: auto !important;\n  }\n\n  .mb-xxl-0 {\n    margin-bottom: 0 !important;\n  }\n\n  .mb-xxl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n\n  .mb-xxl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n\n  .mb-xxl-3 {\n    margin-bottom: 1rem !important;\n  }\n\n  .mb-xxl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n\n  .mb-xxl-5 {\n    margin-bottom: 3rem !important;\n  }\n\n  .mb-xxl-auto {\n    margin-bottom: auto !important;\n  }\n\n  .ms-xxl-0 {\n    margin-right: 0 !important;\n  }\n\n  .ms-xxl-1 {\n    margin-right: 0.25rem !important;\n  }\n\n  .ms-xxl-2 {\n    margin-right: 0.5rem !important;\n  }\n\n  .ms-xxl-3 {\n    margin-right: 1rem !important;\n  }\n\n  .ms-xxl-4 {\n    margin-right: 1.5rem !important;\n  }\n\n  .ms-xxl-5 {\n    margin-right: 3rem !important;\n  }\n\n  .ms-xxl-auto {\n    margin-right: auto !important;\n  }\n\n  .p-xxl-0 {\n    padding: 0 !important;\n  }\n\n  .p-xxl-1 {\n    padding: 0.25rem !important;\n  }\n\n  .p-xxl-2 {\n    padding: 0.5rem !important;\n  }\n\n  .p-xxl-3 {\n    padding: 1rem !important;\n  }\n\n  .p-xxl-4 {\n    padding: 1.5rem !important;\n  }\n\n  .p-xxl-5 {\n    padding: 3rem !important;\n  }\n\n  .px-xxl-0 {\n    padding-left: 0 !important;\n    padding-right: 0 !important;\n  }\n\n  .px-xxl-1 {\n    padding-left: 0.25rem !important;\n    padding-right: 0.25rem !important;\n  }\n\n  .px-xxl-2 {\n    padding-left: 0.5rem !important;\n    padding-right: 0.5rem !important;\n  }\n\n  .px-xxl-3 {\n    padding-left: 1rem !important;\n    padding-right: 1rem !important;\n  }\n\n  .px-xxl-4 {\n    padding-left: 1.5rem !important;\n    padding-right: 1.5rem !important;\n  }\n\n  .px-xxl-5 {\n    padding-left: 3rem !important;\n    padding-right: 3rem !important;\n  }\n\n  .py-xxl-0 {\n    padding-top: 0 !important;\n    padding-bottom: 0 !important;\n  }\n\n  .py-xxl-1 {\n    padding-top: 0.25rem !important;\n    padding-bottom: 0.25rem !important;\n  }\n\n  .py-xxl-2 {\n    padding-top: 0.5rem !important;\n    padding-bottom: 0.5rem !important;\n  }\n\n  .py-xxl-3 {\n    padding-top: 1rem !important;\n    padding-bottom: 1rem !important;\n  }\n\n  .py-xxl-4 {\n    padding-top: 1.5rem !important;\n    padding-bottom: 1.5rem !important;\n  }\n\n  .py-xxl-5 {\n    padding-top: 3rem !important;\n    padding-bottom: 3rem !important;\n  }\n\n  .pt-xxl-0 {\n    padding-top: 0 !important;\n  }\n\n  .pt-xxl-1 {\n    padding-top: 0.25rem !important;\n  }\n\n  .pt-xxl-2 {\n    padding-top: 0.5rem !important;\n  }\n\n  .pt-xxl-3 {\n    padding-top: 1rem !important;\n  }\n\n  .pt-xxl-4 {\n    padding-top: 1.5rem !important;\n  }\n\n  .pt-xxl-5 {\n    padding-top: 3rem !important;\n  }\n\n  .pe-xxl-0 {\n    padding-left: 0 !important;\n  }\n\n  .pe-xxl-1 {\n    padding-left: 0.25rem !important;\n  }\n\n  .pe-xxl-2 {\n    padding-left: 0.5rem !important;\n  }\n\n  .pe-xxl-3 {\n    padding-left: 1rem !important;\n  }\n\n  .pe-xxl-4 {\n    padding-left: 1.5rem !important;\n  }\n\n  .pe-xxl-5 {\n    padding-left: 3rem !important;\n  }\n\n  .pb-xxl-0 {\n    padding-bottom: 0 !important;\n  }\n\n  .pb-xxl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n\n  .pb-xxl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n\n  .pb-xxl-3 {\n    padding-bottom: 1rem !important;\n  }\n\n  .pb-xxl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n\n  .pb-xxl-5 {\n    padding-bottom: 3rem !important;\n  }\n\n  .ps-xxl-0 {\n    padding-right: 0 !important;\n  }\n\n  .ps-xxl-1 {\n    padding-right: 0.25rem !important;\n  }\n\n  .ps-xxl-2 {\n    padding-right: 0.5rem !important;\n  }\n\n  .ps-xxl-3 {\n    padding-right: 1rem !important;\n  }\n\n  .ps-xxl-4 {\n    padding-right: 1.5rem !important;\n  }\n\n  .ps-xxl-5 {\n    padding-right: 3rem !important;\n  }\n\n  .text-xxl-start {\n    text-align: right !important;\n  }\n\n  .text-xxl-end {\n    text-align: left !important;\n  }\n\n  .text-xxl-center {\n    text-align: center !important;\n  }\n}\n@media (min-width: 1200px) {\n  .fs-1 {\n    font-size: 2.5rem !important;\n  }\n\n  .fs-2 {\n    font-size: 2rem !important;\n  }\n\n  .fs-3 {\n    font-size: 1.75rem !important;\n  }\n\n  .fs-4 {\n    font-size: 1.5rem !important;\n  }\n}\n@media print {\n  .d-print-inline {\n    display: inline !important;\n  }\n\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n\n  .d-print-block {\n    display: block !important;\n  }\n\n  .d-print-grid {\n    display: grid !important;\n  }\n\n  .d-print-table {\n    display: table !important;\n  }\n\n  .d-print-table-row {\n    display: table-row !important;\n  }\n\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n\n  .d-print-flex {\n    display: flex !important;\n  }\n\n  .d-print-inline-flex {\n    display: inline-flex !important;\n  }\n\n  .d-print-none {\n    display: none !important;\n  }\n}\n/*# sourceMappingURL=bootstrap.rtl.css.map */"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js",
    "content": "/*!\n  * Bootstrap v5.1.0 (https://getbootstrap.com/)\n  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory());\n}(this, (function () { 'use strict';\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): util/index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const MAX_UID = 1000000;\n  const MILLISECONDS_MULTIPLIER = 1000;\n  const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  const toType = obj => {\n    if (obj === null || obj === undefined) {\n      return `${obj}`;\n    }\n\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  };\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  const getUID = prefix => {\n    do {\n      prefix += Math.floor(Math.random() * MAX_UID);\n    } while (document.getElementById(prefix));\n\n    return prefix;\n  };\n\n  const getSelector = element => {\n    let selector = element.getAttribute('data-bs-target');\n\n    if (!selector || selector === '#') {\n      let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,\n      // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n      // `document.querySelector` will rightfully complain it is invalid.\n      // See https://github.com/twbs/bootstrap/issues/32273\n\n      if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {\n        return null;\n      } // Just in case some CMS puts out a full URL with the anchor appended\n\n\n      if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n        hrefAttr = `#${hrefAttr.split('#')[1]}`;\n      }\n\n      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;\n    }\n\n    return selector;\n  };\n\n  const getSelectorFromElement = element => {\n    const selector = getSelector(element);\n\n    if (selector) {\n      return document.querySelector(selector) ? selector : null;\n    }\n\n    return null;\n  };\n\n  const getElementFromSelector = element => {\n    const selector = getSelector(element);\n    return selector ? document.querySelector(selector) : null;\n  };\n\n  const getTransitionDurationFromElement = element => {\n    if (!element) {\n      return 0;\n    } // Get transition-duration of the element\n\n\n    let {\n      transitionDuration,\n      transitionDelay\n    } = window.getComputedStyle(element);\n    const floatTransitionDuration = Number.parseFloat(transitionDuration);\n    const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n    if (!floatTransitionDuration && !floatTransitionDelay) {\n      return 0;\n    } // If multiple durations are defined, take the first\n\n\n    transitionDuration = transitionDuration.split(',')[0];\n    transitionDelay = transitionDelay.split(',')[0];\n    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n  };\n\n  const triggerTransitionEnd = element => {\n    element.dispatchEvent(new Event(TRANSITION_END));\n  };\n\n  const isElement$1 = obj => {\n    if (!obj || typeof obj !== 'object') {\n      return false;\n    }\n\n    if (typeof obj.jquery !== 'undefined') {\n      obj = obj[0];\n    }\n\n    return typeof obj.nodeType !== 'undefined';\n  };\n\n  const getElement = obj => {\n    if (isElement$1(obj)) {\n      // it's a jQuery object or a node element\n      return obj.jquery ? obj[0] : obj;\n    }\n\n    if (typeof obj === 'string' && obj.length > 0) {\n      return document.querySelector(obj);\n    }\n\n    return null;\n  };\n\n  const typeCheckConfig = (componentName, config, configTypes) => {\n    Object.keys(configTypes).forEach(property => {\n      const expectedTypes = configTypes[property];\n      const value = config[property];\n      const valueType = value && isElement$1(value) ? 'element' : toType(value);\n\n      if (!new RegExp(expectedTypes).test(valueType)) {\n        throw new TypeError(`${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n      }\n    });\n  };\n\n  const isVisible = element => {\n    if (!isElement$1(element) || element.getClientRects().length === 0) {\n      return false;\n    }\n\n    return getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n  };\n\n  const isDisabled = element => {\n    if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n      return true;\n    }\n\n    if (element.classList.contains('disabled')) {\n      return true;\n    }\n\n    if (typeof element.disabled !== 'undefined') {\n      return element.disabled;\n    }\n\n    return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n  };\n\n  const findShadowRoot = element => {\n    if (!document.documentElement.attachShadow) {\n      return null;\n    } // Can find the shadow root otherwise it'll return the document\n\n\n    if (typeof element.getRootNode === 'function') {\n      const root = element.getRootNode();\n      return root instanceof ShadowRoot ? root : null;\n    }\n\n    if (element instanceof ShadowRoot) {\n      return element;\n    } // when we don't find a shadow root\n\n\n    if (!element.parentNode) {\n      return null;\n    }\n\n    return findShadowRoot(element.parentNode);\n  };\n\n  const noop = () => {};\n  /**\n   * Trick to restart an element's animation\n   *\n   * @param {HTMLElement} element\n   * @return void\n   *\n   * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n   */\n\n\n  const reflow = element => {\n    // eslint-disable-next-line no-unused-expressions\n    element.offsetHeight;\n  };\n\n  const getjQuery = () => {\n    const {\n      jQuery\n    } = window;\n\n    if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n      return jQuery;\n    }\n\n    return null;\n  };\n\n  const DOMContentLoadedCallbacks = [];\n\n  const onDOMContentLoaded = callback => {\n    if (document.readyState === 'loading') {\n      // add listener on the first call when the document is in loading state\n      if (!DOMContentLoadedCallbacks.length) {\n        document.addEventListener('DOMContentLoaded', () => {\n          DOMContentLoadedCallbacks.forEach(callback => callback());\n        });\n      }\n\n      DOMContentLoadedCallbacks.push(callback);\n    } else {\n      callback();\n    }\n  };\n\n  const isRTL = () => document.documentElement.dir === 'rtl';\n\n  const defineJQueryPlugin = plugin => {\n    onDOMContentLoaded(() => {\n      const $ = getjQuery();\n      /* istanbul ignore if */\n\n      if ($) {\n        const name = plugin.NAME;\n        const JQUERY_NO_CONFLICT = $.fn[name];\n        $.fn[name] = plugin.jQueryInterface;\n        $.fn[name].Constructor = plugin;\n\n        $.fn[name].noConflict = () => {\n          $.fn[name] = JQUERY_NO_CONFLICT;\n          return plugin.jQueryInterface;\n        };\n      }\n    });\n  };\n\n  const execute = callback => {\n    if (typeof callback === 'function') {\n      callback();\n    }\n  };\n\n  const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n    if (!waitForTransition) {\n      execute(callback);\n      return;\n    }\n\n    const durationPadding = 5;\n    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n    let called = false;\n\n    const handler = ({\n      target\n    }) => {\n      if (target !== transitionElement) {\n        return;\n      }\n\n      called = true;\n      transitionElement.removeEventListener(TRANSITION_END, handler);\n      execute(callback);\n    };\n\n    transitionElement.addEventListener(TRANSITION_END, handler);\n    setTimeout(() => {\n      if (!called) {\n        triggerTransitionEnd(transitionElement);\n      }\n    }, emulatedDuration);\n  };\n  /**\n   * Return the previous/next element of a list.\n   *\n   * @param {array} list    The list of elements\n   * @param activeElement   The active element\n   * @param shouldGetNext   Choose to get next or previous element\n   * @param isCycleAllowed\n   * @return {Element|elem} The proper element\n   */\n\n\n  const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n    let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n\n    if (index === -1) {\n      return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0];\n    }\n\n    const listLength = list.length;\n    index += shouldGetNext ? 1 : -1;\n\n    if (isCycleAllowed) {\n      index = (index + listLength) % listLength;\n    }\n\n    return list[Math.max(0, Math.min(index, listLength - 1))];\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): dom/event-handler.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\n  const stripNameRegex = /\\..*/;\n  const stripUidRegex = /::\\d+$/;\n  const eventRegistry = {}; // Events storage\n\n  let uidEvent = 1;\n  const customEvents = {\n    mouseenter: 'mouseover',\n    mouseleave: 'mouseout'\n  };\n  const customEventsRegex = /^(mouseenter|mouseleave)/i;\n  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n  /**\n   * ------------------------------------------------------------------------\n   * Private methods\n   * ------------------------------------------------------------------------\n   */\n\n  function getUidEvent(element, uid) {\n    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n  }\n\n  function getEvent(element) {\n    const uid = getUidEvent(element);\n    element.uidEvent = uid;\n    eventRegistry[uid] = eventRegistry[uid] || {};\n    return eventRegistry[uid];\n  }\n\n  function bootstrapHandler(element, fn) {\n    return function handler(event) {\n      event.delegateTarget = element;\n\n      if (handler.oneOff) {\n        EventHandler.off(element, event.type, fn);\n      }\n\n      return fn.apply(element, [event]);\n    };\n  }\n\n  function bootstrapDelegationHandler(element, selector, fn) {\n    return function handler(event) {\n      const domElements = element.querySelectorAll(selector);\n\n      for (let {\n        target\n      } = event; target && target !== this; target = target.parentNode) {\n        for (let i = domElements.length; i--;) {\n          if (domElements[i] === target) {\n            event.delegateTarget = target;\n\n            if (handler.oneOff) {\n              // eslint-disable-next-line unicorn/consistent-destructuring\n              EventHandler.off(element, event.type, selector, fn);\n            }\n\n            return fn.apply(target, [event]);\n          }\n        }\n      } // To please ESLint\n\n\n      return null;\n    };\n  }\n\n  function findHandler(events, handler, delegationSelector = null) {\n    const uidEventList = Object.keys(events);\n\n    for (let i = 0, len = uidEventList.length; i < len; i++) {\n      const event = events[uidEventList[i]];\n\n      if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n        return event;\n      }\n    }\n\n    return null;\n  }\n\n  function normalizeParams(originalTypeEvent, handler, delegationFn) {\n    const delegation = typeof handler === 'string';\n    const originalHandler = delegation ? delegationFn : handler;\n    let typeEvent = getTypeEvent(originalTypeEvent);\n    const isNative = nativeEvents.has(typeEvent);\n\n    if (!isNative) {\n      typeEvent = originalTypeEvent;\n    }\n\n    return [delegation, originalHandler, typeEvent];\n  }\n\n  function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n    if (typeof originalTypeEvent !== 'string' || !element) {\n      return;\n    }\n\n    if (!handler) {\n      handler = delegationFn;\n      delegationFn = null;\n    } // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n    // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n\n\n    if (customEventsRegex.test(originalTypeEvent)) {\n      const wrapFn = fn => {\n        return function (event) {\n          if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n            return fn.call(this, event);\n          }\n        };\n      };\n\n      if (delegationFn) {\n        delegationFn = wrapFn(delegationFn);\n      } else {\n        handler = wrapFn(handler);\n      }\n    }\n\n    const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);\n    const events = getEvent(element);\n    const handlers = events[typeEvent] || (events[typeEvent] = {});\n    const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null);\n\n    if (previousFn) {\n      previousFn.oneOff = previousFn.oneOff && oneOff;\n      return;\n    }\n\n    const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''));\n    const fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler);\n    fn.delegationSelector = delegation ? handler : null;\n    fn.originalHandler = originalHandler;\n    fn.oneOff = oneOff;\n    fn.uidEvent = uid;\n    handlers[uid] = fn;\n    element.addEventListener(typeEvent, fn, delegation);\n  }\n\n  function removeHandler(element, events, typeEvent, handler, delegationSelector) {\n    const fn = findHandler(events[typeEvent], handler, delegationSelector);\n\n    if (!fn) {\n      return;\n    }\n\n    element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n    delete events[typeEvent][fn.uidEvent];\n  }\n\n  function removeNamespacedHandlers(element, events, typeEvent, namespace) {\n    const storeElementEvent = events[typeEvent] || {};\n    Object.keys(storeElementEvent).forEach(handlerKey => {\n      if (handlerKey.includes(namespace)) {\n        const event = storeElementEvent[handlerKey];\n        removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);\n      }\n    });\n  }\n\n  function getTypeEvent(event) {\n    // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n    event = event.replace(stripNameRegex, '');\n    return customEvents[event] || event;\n  }\n\n  const EventHandler = {\n    on(element, event, handler, delegationFn) {\n      addHandler(element, event, handler, delegationFn, false);\n    },\n\n    one(element, event, handler, delegationFn) {\n      addHandler(element, event, handler, delegationFn, true);\n    },\n\n    off(element, originalTypeEvent, handler, delegationFn) {\n      if (typeof originalTypeEvent !== 'string' || !element) {\n        return;\n      }\n\n      const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);\n      const inNamespace = typeEvent !== originalTypeEvent;\n      const events = getEvent(element);\n      const isNamespace = originalTypeEvent.startsWith('.');\n\n      if (typeof originalHandler !== 'undefined') {\n        // Simplest case: handler is passed, remove that listener ONLY.\n        if (!events || !events[typeEvent]) {\n          return;\n        }\n\n        removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null);\n        return;\n      }\n\n      if (isNamespace) {\n        Object.keys(events).forEach(elementEvent => {\n          removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n        });\n      }\n\n      const storeElementEvent = events[typeEvent] || {};\n      Object.keys(storeElementEvent).forEach(keyHandlers => {\n        const handlerKey = keyHandlers.replace(stripUidRegex, '');\n\n        if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n          const event = storeElementEvent[keyHandlers];\n          removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);\n        }\n      });\n    },\n\n    trigger(element, event, args) {\n      if (typeof event !== 'string' || !element) {\n        return null;\n      }\n\n      const $ = getjQuery();\n      const typeEvent = getTypeEvent(event);\n      const inNamespace = event !== typeEvent;\n      const isNative = nativeEvents.has(typeEvent);\n      let jQueryEvent;\n      let bubbles = true;\n      let nativeDispatch = true;\n      let defaultPrevented = false;\n      let evt = null;\n\n      if (inNamespace && $) {\n        jQueryEvent = $.Event(event, args);\n        $(element).trigger(jQueryEvent);\n        bubbles = !jQueryEvent.isPropagationStopped();\n        nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n        defaultPrevented = jQueryEvent.isDefaultPrevented();\n      }\n\n      if (isNative) {\n        evt = document.createEvent('HTMLEvents');\n        evt.initEvent(typeEvent, bubbles, true);\n      } else {\n        evt = new CustomEvent(event, {\n          bubbles,\n          cancelable: true\n        });\n      } // merge custom information in our event\n\n\n      if (typeof args !== 'undefined') {\n        Object.keys(args).forEach(key => {\n          Object.defineProperty(evt, key, {\n            get() {\n              return args[key];\n            }\n\n          });\n        });\n      }\n\n      if (defaultPrevented) {\n        evt.preventDefault();\n      }\n\n      if (nativeDispatch) {\n        element.dispatchEvent(evt);\n      }\n\n      if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n        jQueryEvent.preventDefault();\n      }\n\n      return evt;\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): dom/data.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  const elementMap = new Map();\n  var Data = {\n    set(element, key, instance) {\n      if (!elementMap.has(element)) {\n        elementMap.set(element, new Map());\n      }\n\n      const instanceMap = elementMap.get(element); // make it clear we only want one instance per element\n      // can be removed later when multiple key/instances are fine to be used\n\n      if (!instanceMap.has(key) && instanceMap.size !== 0) {\n        // eslint-disable-next-line no-console\n        console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n        return;\n      }\n\n      instanceMap.set(key, instance);\n    },\n\n    get(element, key) {\n      if (elementMap.has(element)) {\n        return elementMap.get(element).get(key) || null;\n      }\n\n      return null;\n    },\n\n    remove(element, key) {\n      if (!elementMap.has(element)) {\n        return;\n      }\n\n      const instanceMap = elementMap.get(element);\n      instanceMap.delete(key); // free up element references if there are no instances left for an element\n\n      if (instanceMap.size === 0) {\n        elementMap.delete(element);\n      }\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): base-component.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const VERSION = '5.1.0';\n\n  class BaseComponent {\n    constructor(element) {\n      element = getElement(element);\n\n      if (!element) {\n        return;\n      }\n\n      this._element = element;\n      Data.set(this._element, this.constructor.DATA_KEY, this);\n    }\n\n    dispose() {\n      Data.remove(this._element, this.constructor.DATA_KEY);\n      EventHandler.off(this._element, this.constructor.EVENT_KEY);\n      Object.getOwnPropertyNames(this).forEach(propertyName => {\n        this[propertyName] = null;\n      });\n    }\n\n    _queueCallback(callback, element, isAnimated = true) {\n      executeAfterTransition(callback, element, isAnimated);\n    }\n    /** Static */\n\n\n    static getInstance(element) {\n      return Data.get(getElement(element), this.DATA_KEY);\n    }\n\n    static getOrCreateInstance(element, config = {}) {\n      return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n    }\n\n    static get VERSION() {\n      return VERSION;\n    }\n\n    static get NAME() {\n      throw new Error('You have to implement the static method \"NAME\", for each component!');\n    }\n\n    static get DATA_KEY() {\n      return `bs.${this.NAME}`;\n    }\n\n    static get EVENT_KEY() {\n      return `.${this.DATA_KEY}`;\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): util/component-functions.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const enableDismissTrigger = (component, method = 'hide') => {\n    const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n    const name = component.NAME;\n    EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n      if (['A', 'AREA'].includes(this.tagName)) {\n        event.preventDefault();\n      }\n\n      if (isDisabled(this)) {\n        return;\n      }\n\n      const target = getElementFromSelector(this) || this.closest(`.${name}`);\n      const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n\n      instance[method]();\n    });\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): alert.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$d = 'alert';\n  const DATA_KEY$c = 'bs.alert';\n  const EVENT_KEY$c = `.${DATA_KEY$c}`;\n  const EVENT_CLOSE = `close${EVENT_KEY$c}`;\n  const EVENT_CLOSED = `closed${EVENT_KEY$c}`;\n  const CLASS_NAME_FADE$5 = 'fade';\n  const CLASS_NAME_SHOW$8 = 'show';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Alert extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$d;\n    } // Public\n\n\n    close() {\n      const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n\n      if (closeEvent.defaultPrevented) {\n        return;\n      }\n\n      this._element.classList.remove(CLASS_NAME_SHOW$8);\n\n      const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n\n      this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n    } // Private\n\n\n    _destroyElement() {\n      this._element.remove();\n\n      EventHandler.trigger(this._element, EVENT_CLOSED);\n      this.dispose();\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Alert.getOrCreateInstance(this);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](this);\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  enableDismissTrigger(Alert, 'close');\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Alert to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Alert);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): button.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$c = 'button';\n  const DATA_KEY$b = 'bs.button';\n  const EVENT_KEY$b = `.${DATA_KEY$b}`;\n  const DATA_API_KEY$7 = '.data-api';\n  const CLASS_NAME_ACTIVE$3 = 'active';\n  const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\n  const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$b}${DATA_API_KEY$7}`;\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Button extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$c;\n    } // Public\n\n\n    toggle() {\n      // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n      this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Button.getOrCreateInstance(this);\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n    event.preventDefault();\n    const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n    const data = Button.getOrCreateInstance(button);\n    data.toggle();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Button to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Button);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): dom/manipulator.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  function normalizeData(val) {\n    if (val === 'true') {\n      return true;\n    }\n\n    if (val === 'false') {\n      return false;\n    }\n\n    if (val === Number(val).toString()) {\n      return Number(val);\n    }\n\n    if (val === '' || val === 'null') {\n      return null;\n    }\n\n    return val;\n  }\n\n  function normalizeDataKey(key) {\n    return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n  }\n\n  const Manipulator = {\n    setDataAttribute(element, key, value) {\n      element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n    },\n\n    removeDataAttribute(element, key) {\n      element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n    },\n\n    getDataAttributes(element) {\n      if (!element) {\n        return {};\n      }\n\n      const attributes = {};\n      Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => {\n        let pureKey = key.replace(/^bs/, '');\n        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n        attributes[pureKey] = normalizeData(element.dataset[key]);\n      });\n      return attributes;\n    },\n\n    getDataAttribute(element, key) {\n      return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n    },\n\n    offset(element) {\n      const rect = element.getBoundingClientRect();\n      return {\n        top: rect.top + window.pageYOffset,\n        left: rect.left + window.pageXOffset\n      };\n    },\n\n    position(element) {\n      return {\n        top: element.offsetTop,\n        left: element.offsetLeft\n      };\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): dom/selector-engine.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const NODE_TEXT = 3;\n  const SelectorEngine = {\n    find(selector, element = document.documentElement) {\n      return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n    },\n\n    findOne(selector, element = document.documentElement) {\n      return Element.prototype.querySelector.call(element, selector);\n    },\n\n    children(element, selector) {\n      return [].concat(...element.children).filter(child => child.matches(selector));\n    },\n\n    parents(element, selector) {\n      const parents = [];\n      let ancestor = element.parentNode;\n\n      while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n        if (ancestor.matches(selector)) {\n          parents.push(ancestor);\n        }\n\n        ancestor = ancestor.parentNode;\n      }\n\n      return parents;\n    },\n\n    prev(element, selector) {\n      let previous = element.previousElementSibling;\n\n      while (previous) {\n        if (previous.matches(selector)) {\n          return [previous];\n        }\n\n        previous = previous.previousElementSibling;\n      }\n\n      return [];\n    },\n\n    next(element, selector) {\n      let next = element.nextElementSibling;\n\n      while (next) {\n        if (next.matches(selector)) {\n          return [next];\n        }\n\n        next = next.nextElementSibling;\n      }\n\n      return [];\n    },\n\n    focusableChildren(element) {\n      const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ');\n      return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): carousel.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$b = 'carousel';\n  const DATA_KEY$a = 'bs.carousel';\n  const EVENT_KEY$a = `.${DATA_KEY$a}`;\n  const DATA_API_KEY$6 = '.data-api';\n  const ARROW_LEFT_KEY = 'ArrowLeft';\n  const ARROW_RIGHT_KEY = 'ArrowRight';\n  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  const SWIPE_THRESHOLD = 40;\n  const Default$a = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  const DefaultType$a = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  const ORDER_NEXT = 'next';\n  const ORDER_PREV = 'prev';\n  const DIRECTION_LEFT = 'left';\n  const DIRECTION_RIGHT = 'right';\n  const KEY_TO_DIRECTION = {\n    [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n    [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n  };\n  const EVENT_SLIDE = `slide${EVENT_KEY$a}`;\n  const EVENT_SLID = `slid${EVENT_KEY$a}`;\n  const EVENT_KEYDOWN = `keydown${EVENT_KEY$a}`;\n  const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$a}`;\n  const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$a}`;\n  const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$a}`;\n  const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$a}`;\n  const EVENT_TOUCHEND = `touchend${EVENT_KEY$a}`;\n  const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$a}`;\n  const EVENT_POINTERUP = `pointerup${EVENT_KEY$a}`;\n  const EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`;\n  const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$a}${DATA_API_KEY$6}`;\n  const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n  const CLASS_NAME_CAROUSEL = 'carousel';\n  const CLASS_NAME_ACTIVE$2 = 'active';\n  const CLASS_NAME_SLIDE = 'slide';\n  const CLASS_NAME_END = 'carousel-item-end';\n  const CLASS_NAME_START = 'carousel-item-start';\n  const CLASS_NAME_NEXT = 'carousel-item-next';\n  const CLASS_NAME_PREV = 'carousel-item-prev';\n  const CLASS_NAME_POINTER_EVENT = 'pointer-event';\n  const SELECTOR_ACTIVE$1 = '.active';\n  const SELECTOR_ACTIVE_ITEM = '.active.carousel-item';\n  const SELECTOR_ITEM = '.carousel-item';\n  const SELECTOR_ITEM_IMG = '.carousel-item img';\n  const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';\n  const SELECTOR_INDICATORS = '.carousel-indicators';\n  const SELECTOR_INDICATOR = '[data-bs-target]';\n  const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\n  const SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\n  const POINTER_TYPE_TOUCH = 'touch';\n  const POINTER_TYPE_PEN = 'pen';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Carousel extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    static get Default() {\n      return Default$a;\n    }\n\n    static get NAME() {\n      return NAME$b;\n    } // Public\n\n\n    next() {\n      this._slide(ORDER_NEXT);\n    }\n\n    nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && isVisible(this._element)) {\n        this.next();\n      }\n    }\n\n    prev() {\n      this._slide(ORDER_PREV);\n    }\n\n    pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n        triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    }\n\n    cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config && this._config.interval && !this._isPaused) {\n        this._updateInterval();\n\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    }\n\n    to(index) {\n      this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n      const activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n\n      this._slide(order, this._items[index]);\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$a,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$b, config, DefaultType$a);\n      return config;\n    }\n\n    _handleSwipe() {\n      const absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      const direction = absDeltax / this.touchDeltaX;\n      this.touchDeltaX = 0;\n\n      if (!direction) {\n        return;\n      }\n\n      this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT);\n    }\n\n    _addEventListeners() {\n      if (this._config.keyboard) {\n        EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));\n      }\n\n      if (this._config.pause === 'hover') {\n        EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event));\n        EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event));\n      }\n\n      if (this._config.touch && this._touchSupported) {\n        this._addTouchEventListeners();\n      }\n    }\n\n    _addTouchEventListeners() {\n      const start = event => {\n        if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {\n          this.touchStartX = event.clientX;\n        } else if (!this._pointerEvent) {\n          this.touchStartX = event.touches[0].clientX;\n        }\n      };\n\n      const move = event => {\n        // ensure swiping with one touch and not pinching\n        this.touchDeltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX;\n      };\n\n      const end = event => {\n        if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {\n          this.touchDeltaX = event.clientX - this.touchStartX;\n        }\n\n        this._handleSwipe();\n\n        if (this._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          this.pause();\n\n          if (this.touchTimeout) {\n            clearTimeout(this.touchTimeout);\n          }\n\n          this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n        }\n      };\n\n      SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n        EventHandler.on(itemImg, EVENT_DRAG_START, e => e.preventDefault());\n      });\n\n      if (this._pointerEvent) {\n        EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event));\n        EventHandler.on(this._element, EVENT_POINTERUP, event => end(event));\n\n        this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n      } else {\n        EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event));\n        EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event));\n        EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event));\n      }\n    }\n\n    _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      const direction = KEY_TO_DIRECTION[event.key];\n\n      if (direction) {\n        event.preventDefault();\n\n        this._slide(direction);\n      }\n    }\n\n    _getItemIndex(element) {\n      this._items = element && element.parentNode ? SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : [];\n      return this._items.indexOf(element);\n    }\n\n    _getItemByOrder(order, activeElement) {\n      const isNext = order === ORDER_NEXT;\n      return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap);\n    }\n\n    _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      const targetIndex = this._getItemIndex(relatedTarget);\n\n      const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element));\n\n      return EventHandler.trigger(this._element, EVENT_SLIDE, {\n        relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n    }\n\n    _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE$1, this._indicatorsElement);\n        activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n        activeIndicator.removeAttribute('aria-current');\n        const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement);\n\n        for (let i = 0; i < indicators.length; i++) {\n          if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n            indicators[i].classList.add(CLASS_NAME_ACTIVE$2);\n            indicators[i].setAttribute('aria-current', 'true');\n            break;\n          }\n        }\n      }\n    }\n\n    _updateInterval() {\n      const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n      if (!element) {\n        return;\n      }\n\n      const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n\n      if (elementInterval) {\n        this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n        this._config.interval = elementInterval;\n      } else {\n        this._config.interval = this._config.defaultInterval || this._config.interval;\n      }\n    }\n\n    _slide(directionOrOrder, element) {\n      const order = this._directionToOrder(directionOrOrder);\n\n      const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n      const activeElementIndex = this._getItemIndex(activeElement);\n\n      const nextElement = element || this._getItemByOrder(order, activeElement);\n\n      const nextElementIndex = this._getItemIndex(nextElement);\n\n      const isCycling = Boolean(this._interval);\n      const isNext = order === ORDER_NEXT;\n      const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n      const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n\n      const eventDirectionName = this._orderToDirection(order);\n\n      if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE$2)) {\n        this._isSliding = false;\n        return;\n      }\n\n      if (this._isSliding) {\n        return;\n      }\n\n      const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.defaultPrevented) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      this._activeElement = nextElement;\n\n      const triggerSlidEvent = () => {\n        EventHandler.trigger(this._element, EVENT_SLID, {\n          relatedTarget: nextElement,\n          direction: eventDirectionName,\n          from: activeElementIndex,\n          to: nextElementIndex\n        });\n      };\n\n      if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n        nextElement.classList.add(orderClassName);\n        reflow(nextElement);\n        activeElement.classList.add(directionalClassName);\n        nextElement.classList.add(directionalClassName);\n\n        const completeCallBack = () => {\n          nextElement.classList.remove(directionalClassName, orderClassName);\n          nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n          activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n          this._isSliding = false;\n          setTimeout(triggerSlidEvent, 0);\n        };\n\n        this._queueCallback(completeCallBack, activeElement, true);\n      } else {\n        activeElement.classList.remove(CLASS_NAME_ACTIVE$2);\n        nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n        this._isSliding = false;\n        triggerSlidEvent();\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    }\n\n    _directionToOrder(direction) {\n      if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n        return direction;\n      }\n\n      if (isRTL()) {\n        return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n      }\n\n      return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n    }\n\n    _orderToDirection(order) {\n      if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n        return order;\n      }\n\n      if (isRTL()) {\n        return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n      }\n\n      return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n    } // Static\n\n\n    static carouselInterface(element, config) {\n      const data = Carousel.getOrCreateInstance(element, config);\n      let {\n        _config\n      } = data;\n\n      if (typeof config === 'object') {\n        _config = { ..._config,\n          ...config\n        };\n      }\n\n      const action = typeof config === 'string' ? config : _config.slide;\n\n      if (typeof config === 'number') {\n        data.to(config);\n      } else if (typeof action === 'string') {\n        if (typeof data[action] === 'undefined') {\n          throw new TypeError(`No method named \"${action}\"`);\n        }\n\n        data[action]();\n      } else if (_config.interval && _config.ride) {\n        data.pause();\n        data.cycle();\n      }\n    }\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        Carousel.carouselInterface(this, config);\n      });\n    }\n\n    static dataApiClickHandler(event) {\n      const target = getElementFromSelector(this);\n\n      if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n        return;\n      }\n\n      const config = { ...Manipulator.getDataAttributes(target),\n        ...Manipulator.getDataAttributes(this)\n      };\n      const slideIndex = this.getAttribute('data-bs-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel.carouselInterface(target, config);\n\n      if (slideIndex) {\n        Carousel.getInstance(target).to(slideIndex);\n      }\n\n      event.preventDefault();\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler);\n  EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n    const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n\n    for (let i = 0, len = carousels.length; i < len; i++) {\n      Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]));\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Carousel to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Carousel);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): collapse.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$a = 'collapse';\n  const DATA_KEY$9 = 'bs.collapse';\n  const EVENT_KEY$9 = `.${DATA_KEY$9}`;\n  const DATA_API_KEY$5 = '.data-api';\n  const Default$9 = {\n    toggle: true,\n    parent: null\n  };\n  const DefaultType$9 = {\n    toggle: 'boolean',\n    parent: '(null|element)'\n  };\n  const EVENT_SHOW$5 = `show${EVENT_KEY$9}`;\n  const EVENT_SHOWN$5 = `shown${EVENT_KEY$9}`;\n  const EVENT_HIDE$5 = `hide${EVENT_KEY$9}`;\n  const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$9}`;\n  const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$9}${DATA_API_KEY$5}`;\n  const CLASS_NAME_SHOW$7 = 'show';\n  const CLASS_NAME_COLLAPSE = 'collapse';\n  const CLASS_NAME_COLLAPSING = 'collapsing';\n  const CLASS_NAME_COLLAPSED = 'collapsed';\n  const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\n  const WIDTH = 'width';\n  const HEIGHT = 'height';\n  const SELECTOR_ACTIVES = '.show, .collapsing';\n  const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Collapse extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._isTransitioning = false;\n      this._config = this._getConfig(config);\n      this._triggerArray = [];\n      const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n\n      for (let i = 0, len = toggleList.length; i < len; i++) {\n        const elem = toggleList[i];\n        const selector = getSelectorFromElement(elem);\n        const filterElement = SelectorEngine.find(selector).filter(foundElem => foundElem === this._element);\n\n        if (selector !== null && filterElement.length) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._initializeChildren();\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    static get Default() {\n      return Default$9;\n    }\n\n    static get NAME() {\n      return NAME$a;\n    } // Public\n\n\n    toggle() {\n      if (this._isShown()) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    }\n\n    show() {\n      if (this._isTransitioning || this._isShown()) {\n        return;\n      }\n\n      let actives = [];\n      let activesData;\n\n      if (this._config.parent) {\n        const children = SelectorEngine.find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);\n        actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth\n      }\n\n      const container = SelectorEngine.findOne(this._selector);\n\n      if (actives.length) {\n        const tempActiveData = actives.find(elem => container !== elem);\n        activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$5);\n\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n\n      actives.forEach(elemActive => {\n        if (container !== elemActive) {\n          Collapse.getOrCreateInstance(elemActive, {\n            toggle: false\n          }).hide();\n        }\n\n        if (!activesData) {\n          Data.set(elemActive, DATA_KEY$9, null);\n        }\n      });\n\n      const dimension = this._getDimension();\n\n      this._element.classList.remove(CLASS_NAME_COLLAPSE);\n\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n      this._element.style[dimension] = 0;\n\n      this._addAriaAndCollapsedClass(this._triggerArray, true);\n\n      this._isTransitioning = true;\n\n      const complete = () => {\n        this._isTransitioning = false;\n\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n        this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n        this._element.style[dimension] = '';\n        EventHandler.trigger(this._element, EVENT_SHOWN$5);\n      };\n\n      const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      const scrollSize = `scroll${capitalizedDimension}`;\n\n      this._queueCallback(complete, this._element, true);\n\n      this._element.style[dimension] = `${this._element[scrollSize]}px`;\n    }\n\n    hide() {\n      if (this._isTransitioning || !this._isShown()) {\n        return;\n      }\n\n      const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$5);\n\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n\n      const dimension = this._getDimension();\n\n      this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n      reflow(this._element);\n\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n      this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n      const triggerArrayLength = this._triggerArray.length;\n\n      for (let i = 0; i < triggerArrayLength; i++) {\n        const trigger = this._triggerArray[i];\n        const elem = getElementFromSelector(trigger);\n\n        if (elem && !this._isShown(elem)) {\n          this._addAriaAndCollapsedClass([trigger], false);\n        }\n      }\n\n      this._isTransitioning = true;\n\n      const complete = () => {\n        this._isTransitioning = false;\n\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n        this._element.classList.add(CLASS_NAME_COLLAPSE);\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN$5);\n      };\n\n      this._element.style[dimension] = '';\n\n      this._queueCallback(complete, this._element, true);\n    }\n\n    _isShown(element = this._element) {\n      return element.classList.contains(CLASS_NAME_SHOW$7);\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$9,\n        ...Manipulator.getDataAttributes(this._element),\n        ...config\n      };\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      config.parent = getElement(config.parent);\n      typeCheckConfig(NAME$a, config, DefaultType$9);\n      return config;\n    }\n\n    _getDimension() {\n      return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n    }\n\n    _initializeChildren() {\n      if (!this._config.parent) {\n        return;\n      }\n\n      const children = SelectorEngine.find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);\n      SelectorEngine.find(SELECTOR_DATA_TOGGLE$4, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {\n        const selected = getElementFromSelector(element);\n\n        if (selected) {\n          this._addAriaAndCollapsedClass([element], this._isShown(selected));\n        }\n      });\n    }\n\n    _addAriaAndCollapsedClass(triggerArray, isOpen) {\n      if (!triggerArray.length) {\n        return;\n      }\n\n      triggerArray.forEach(elem => {\n        if (isOpen) {\n          elem.classList.remove(CLASS_NAME_COLLAPSED);\n        } else {\n          elem.classList.add(CLASS_NAME_COLLAPSED);\n        }\n\n        elem.setAttribute('aria-expanded', isOpen);\n      });\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const _config = {};\n\n        if (typeof config === 'string' && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        const data = Collapse.getOrCreateInstance(this, _config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    const selector = getSelectorFromElement(this);\n    const selectorElements = SelectorEngine.find(selector);\n    selectorElements.forEach(element => {\n      Collapse.getOrCreateInstance(element, {\n        toggle: false\n      }).toggle();\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Collapse to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Collapse);\n\n  var top = 'top';\n  var bottom = 'bottom';\n  var right = 'right';\n  var left = 'left';\n  var auto = 'auto';\n  var basePlacements = [top, bottom, right, left];\n  var start = 'start';\n  var end = 'end';\n  var clippingParents = 'clippingParents';\n  var viewport = 'viewport';\n  var popper = 'popper';\n  var reference = 'reference';\n  var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n    return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n  }, []);\n  var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n    return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n  }, []); // modifiers that need to read the DOM\n\n  var beforeRead = 'beforeRead';\n  var read = 'read';\n  var afterRead = 'afterRead'; // pure-logic modifiers\n\n  var beforeMain = 'beforeMain';\n  var main = 'main';\n  var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\n  var beforeWrite = 'beforeWrite';\n  var write = 'write';\n  var afterWrite = 'afterWrite';\n  var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];\n\n  function getNodeName(element) {\n    return element ? (element.nodeName || '').toLowerCase() : null;\n  }\n\n  function getWindow(node) {\n    if (node == null) {\n      return window;\n    }\n\n    if (node.toString() !== '[object Window]') {\n      var ownerDocument = node.ownerDocument;\n      return ownerDocument ? ownerDocument.defaultView || window : window;\n    }\n\n    return node;\n  }\n\n  function isElement(node) {\n    var OwnElement = getWindow(node).Element;\n    return node instanceof OwnElement || node instanceof Element;\n  }\n\n  function isHTMLElement(node) {\n    var OwnElement = getWindow(node).HTMLElement;\n    return node instanceof OwnElement || node instanceof HTMLElement;\n  }\n\n  function isShadowRoot(node) {\n    // IE 11 has no ShadowRoot\n    if (typeof ShadowRoot === 'undefined') {\n      return false;\n    }\n\n    var OwnElement = getWindow(node).ShadowRoot;\n    return node instanceof OwnElement || node instanceof ShadowRoot;\n  }\n\n  // and applies them to the HTMLElements such as popper and arrow\n\n  function applyStyles(_ref) {\n    var state = _ref.state;\n    Object.keys(state.elements).forEach(function (name) {\n      var style = state.styles[name] || {};\n      var attributes = state.attributes[name] || {};\n      var element = state.elements[name]; // arrow is optional + virtual elements\n\n      if (!isHTMLElement(element) || !getNodeName(element)) {\n        return;\n      } // Flow doesn't support to extend this property, but it's the most\n      // effective way to apply styles to an HTMLElement\n      // $FlowFixMe[cannot-write]\n\n\n      Object.assign(element.style, style);\n      Object.keys(attributes).forEach(function (name) {\n        var value = attributes[name];\n\n        if (value === false) {\n          element.removeAttribute(name);\n        } else {\n          element.setAttribute(name, value === true ? '' : value);\n        }\n      });\n    });\n  }\n\n  function effect$2(_ref2) {\n    var state = _ref2.state;\n    var initialStyles = {\n      popper: {\n        position: state.options.strategy,\n        left: '0',\n        top: '0',\n        margin: '0'\n      },\n      arrow: {\n        position: 'absolute'\n      },\n      reference: {}\n    };\n    Object.assign(state.elements.popper.style, initialStyles.popper);\n    state.styles = initialStyles;\n\n    if (state.elements.arrow) {\n      Object.assign(state.elements.arrow.style, initialStyles.arrow);\n    }\n\n    return function () {\n      Object.keys(state.elements).forEach(function (name) {\n        var element = state.elements[name];\n        var attributes = state.attributes[name] || {};\n        var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n        var style = styleProperties.reduce(function (style, property) {\n          style[property] = '';\n          return style;\n        }, {}); // arrow is optional + virtual elements\n\n        if (!isHTMLElement(element) || !getNodeName(element)) {\n          return;\n        }\n\n        Object.assign(element.style, style);\n        Object.keys(attributes).forEach(function (attribute) {\n          element.removeAttribute(attribute);\n        });\n      });\n    };\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  var applyStyles$1 = {\n    name: 'applyStyles',\n    enabled: true,\n    phase: 'write',\n    fn: applyStyles,\n    effect: effect$2,\n    requires: ['computeStyles']\n  };\n\n  function getBasePlacement(placement) {\n    return placement.split('-')[0];\n  }\n\n  var round$1 = Math.round;\n  function getBoundingClientRect(element, includeScale) {\n    if (includeScale === void 0) {\n      includeScale = false;\n    }\n\n    var rect = element.getBoundingClientRect();\n    var scaleX = 1;\n    var scaleY = 1;\n\n    if (isHTMLElement(element) && includeScale) {\n      // Fallback to 1 in case both values are `0`\n      scaleX = rect.width / element.offsetWidth || 1;\n      scaleY = rect.height / element.offsetHeight || 1;\n    }\n\n    return {\n      width: round$1(rect.width / scaleX),\n      height: round$1(rect.height / scaleY),\n      top: round$1(rect.top / scaleY),\n      right: round$1(rect.right / scaleX),\n      bottom: round$1(rect.bottom / scaleY),\n      left: round$1(rect.left / scaleX),\n      x: round$1(rect.left / scaleX),\n      y: round$1(rect.top / scaleY)\n    };\n  }\n\n  // means it doesn't take into account transforms.\n\n  function getLayoutRect(element) {\n    var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n    // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n    var width = element.offsetWidth;\n    var height = element.offsetHeight;\n\n    if (Math.abs(clientRect.width - width) <= 1) {\n      width = clientRect.width;\n    }\n\n    if (Math.abs(clientRect.height - height) <= 1) {\n      height = clientRect.height;\n    }\n\n    return {\n      x: element.offsetLeft,\n      y: element.offsetTop,\n      width: width,\n      height: height\n    };\n  }\n\n  function contains(parent, child) {\n    var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n    if (parent.contains(child)) {\n      return true;\n    } // then fallback to custom implementation with Shadow DOM support\n    else if (rootNode && isShadowRoot(rootNode)) {\n        var next = child;\n\n        do {\n          if (next && parent.isSameNode(next)) {\n            return true;\n          } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n          next = next.parentNode || next.host;\n        } while (next);\n      } // Give up, the result is false\n\n\n    return false;\n  }\n\n  function getComputedStyle$1(element) {\n    return getWindow(element).getComputedStyle(element);\n  }\n\n  function isTableElement(element) {\n    return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n  }\n\n  function getDocumentElement(element) {\n    // $FlowFixMe[incompatible-return]: assume body is always available\n    return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n    element.document) || window.document).documentElement;\n  }\n\n  function getParentNode(element) {\n    if (getNodeName(element) === 'html') {\n      return element;\n    }\n\n    return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n      // $FlowFixMe[incompatible-return]\n      // $FlowFixMe[prop-missing]\n      element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n      element.parentNode || ( // DOM Element detected\n      isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n      // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n      getDocumentElement(element) // fallback\n\n    );\n  }\n\n  function getTrueOffsetParent(element) {\n    if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n    getComputedStyle$1(element).position === 'fixed') {\n      return null;\n    }\n\n    return element.offsetParent;\n  } // `.offsetParent` reports `null` for fixed elements, while absolute elements\n  // return the containing block\n\n\n  function getContainingBlock(element) {\n    var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n    var isIE = navigator.userAgent.indexOf('Trident') !== -1;\n\n    if (isIE && isHTMLElement(element)) {\n      // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n      var elementCss = getComputedStyle$1(element);\n\n      if (elementCss.position === 'fixed') {\n        return null;\n      }\n    }\n\n    var currentNode = getParentNode(element);\n\n    while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n      var css = getComputedStyle$1(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n      // create a containing block.\n      // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n      if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n        return currentNode;\n      } else {\n        currentNode = currentNode.parentNode;\n      }\n    }\n\n    return null;\n  } // Gets the closest ancestor positioned element. Handles some edge cases,\n  // such as table ancestors and cross browser bugs.\n\n\n  function getOffsetParent(element) {\n    var window = getWindow(element);\n    var offsetParent = getTrueOffsetParent(element);\n\n    while (offsetParent && isTableElement(offsetParent) && getComputedStyle$1(offsetParent).position === 'static') {\n      offsetParent = getTrueOffsetParent(offsetParent);\n    }\n\n    if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle$1(offsetParent).position === 'static')) {\n      return window;\n    }\n\n    return offsetParent || getContainingBlock(element) || window;\n  }\n\n  function getMainAxisFromPlacement(placement) {\n    return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n  }\n\n  var max = Math.max;\n  var min = Math.min;\n  var round = Math.round;\n\n  function within(min$1, value, max$1) {\n    return max(min$1, min(value, max$1));\n  }\n\n  function getFreshSideObject() {\n    return {\n      top: 0,\n      right: 0,\n      bottom: 0,\n      left: 0\n    };\n  }\n\n  function mergePaddingObject(paddingObject) {\n    return Object.assign({}, getFreshSideObject(), paddingObject);\n  }\n\n  function expandToHashMap(value, keys) {\n    return keys.reduce(function (hashMap, key) {\n      hashMap[key] = value;\n      return hashMap;\n    }, {});\n  }\n\n  var toPaddingObject = function toPaddingObject(padding, state) {\n    padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n      placement: state.placement\n    })) : padding;\n    return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n  };\n\n  function arrow(_ref) {\n    var _state$modifiersData$;\n\n    var state = _ref.state,\n        name = _ref.name,\n        options = _ref.options;\n    var arrowElement = state.elements.arrow;\n    var popperOffsets = state.modifiersData.popperOffsets;\n    var basePlacement = getBasePlacement(state.placement);\n    var axis = getMainAxisFromPlacement(basePlacement);\n    var isVertical = [left, right].indexOf(basePlacement) >= 0;\n    var len = isVertical ? 'height' : 'width';\n\n    if (!arrowElement || !popperOffsets) {\n      return;\n    }\n\n    var paddingObject = toPaddingObject(options.padding, state);\n    var arrowRect = getLayoutRect(arrowElement);\n    var minProp = axis === 'y' ? top : left;\n    var maxProp = axis === 'y' ? bottom : right;\n    var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n    var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n    var arrowOffsetParent = getOffsetParent(arrowElement);\n    var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n    var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n    // outside of the popper bounds\n\n    var min = paddingObject[minProp];\n    var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n    var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n    var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n    var axisProp = axis;\n    state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n  }\n\n  function effect$1(_ref2) {\n    var state = _ref2.state,\n        options = _ref2.options;\n    var _options$element = options.element,\n        arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n    if (arrowElement == null) {\n      return;\n    } // CSS selector\n\n\n    if (typeof arrowElement === 'string') {\n      arrowElement = state.elements.popper.querySelector(arrowElement);\n\n      if (!arrowElement) {\n        return;\n      }\n    }\n\n    if (!contains(state.elements.popper, arrowElement)) {\n\n      return;\n    }\n\n    state.elements.arrow = arrowElement;\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  var arrow$1 = {\n    name: 'arrow',\n    enabled: true,\n    phase: 'main',\n    fn: arrow,\n    effect: effect$1,\n    requires: ['popperOffsets'],\n    requiresIfExists: ['preventOverflow']\n  };\n\n  var unsetSides = {\n    top: 'auto',\n    right: 'auto',\n    bottom: 'auto',\n    left: 'auto'\n  }; // Round the offsets to the nearest suitable subpixel based on the DPR.\n  // Zooming can change the DPR, but it seems to report a value that will\n  // cleanly divide the values into the appropriate subpixels.\n\n  function roundOffsetsByDPR(_ref) {\n    var x = _ref.x,\n        y = _ref.y;\n    var win = window;\n    var dpr = win.devicePixelRatio || 1;\n    return {\n      x: round(round(x * dpr) / dpr) || 0,\n      y: round(round(y * dpr) / dpr) || 0\n    };\n  }\n\n  function mapToStyles(_ref2) {\n    var _Object$assign2;\n\n    var popper = _ref2.popper,\n        popperRect = _ref2.popperRect,\n        placement = _ref2.placement,\n        offsets = _ref2.offsets,\n        position = _ref2.position,\n        gpuAcceleration = _ref2.gpuAcceleration,\n        adaptive = _ref2.adaptive,\n        roundOffsets = _ref2.roundOffsets;\n\n    var _ref3 = roundOffsets === true ? roundOffsetsByDPR(offsets) : typeof roundOffsets === 'function' ? roundOffsets(offsets) : offsets,\n        _ref3$x = _ref3.x,\n        x = _ref3$x === void 0 ? 0 : _ref3$x,\n        _ref3$y = _ref3.y,\n        y = _ref3$y === void 0 ? 0 : _ref3$y;\n\n    var hasX = offsets.hasOwnProperty('x');\n    var hasY = offsets.hasOwnProperty('y');\n    var sideX = left;\n    var sideY = top;\n    var win = window;\n\n    if (adaptive) {\n      var offsetParent = getOffsetParent(popper);\n      var heightProp = 'clientHeight';\n      var widthProp = 'clientWidth';\n\n      if (offsetParent === getWindow(popper)) {\n        offsetParent = getDocumentElement(popper);\n\n        if (getComputedStyle$1(offsetParent).position !== 'static') {\n          heightProp = 'scrollHeight';\n          widthProp = 'scrollWidth';\n        }\n      } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n      offsetParent = offsetParent;\n\n      if (placement === top) {\n        sideY = bottom; // $FlowFixMe[prop-missing]\n\n        y -= offsetParent[heightProp] - popperRect.height;\n        y *= gpuAcceleration ? 1 : -1;\n      }\n\n      if (placement === left) {\n        sideX = right; // $FlowFixMe[prop-missing]\n\n        x -= offsetParent[widthProp] - popperRect.width;\n        x *= gpuAcceleration ? 1 : -1;\n      }\n    }\n\n    var commonStyles = Object.assign({\n      position: position\n    }, adaptive && unsetSides);\n\n    if (gpuAcceleration) {\n      var _Object$assign;\n\n      return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n    }\n\n    return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n  }\n\n  function computeStyles(_ref4) {\n    var state = _ref4.state,\n        options = _ref4.options;\n    var _options$gpuAccelerat = options.gpuAcceleration,\n        gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n        _options$adaptive = options.adaptive,\n        adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n        _options$roundOffsets = options.roundOffsets,\n        roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n    var commonStyles = {\n      placement: getBasePlacement(state.placement),\n      popper: state.elements.popper,\n      popperRect: state.rects.popper,\n      gpuAcceleration: gpuAcceleration\n    };\n\n    if (state.modifiersData.popperOffsets != null) {\n      state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n        offsets: state.modifiersData.popperOffsets,\n        position: state.options.strategy,\n        adaptive: adaptive,\n        roundOffsets: roundOffsets\n      })));\n    }\n\n    if (state.modifiersData.arrow != null) {\n      state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n        offsets: state.modifiersData.arrow,\n        position: 'absolute',\n        adaptive: false,\n        roundOffsets: roundOffsets\n      })));\n    }\n\n    state.attributes.popper = Object.assign({}, state.attributes.popper, {\n      'data-popper-placement': state.placement\n    });\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  var computeStyles$1 = {\n    name: 'computeStyles',\n    enabled: true,\n    phase: 'beforeWrite',\n    fn: computeStyles,\n    data: {}\n  };\n\n  var passive = {\n    passive: true\n  };\n\n  function effect(_ref) {\n    var state = _ref.state,\n        instance = _ref.instance,\n        options = _ref.options;\n    var _options$scroll = options.scroll,\n        scroll = _options$scroll === void 0 ? true : _options$scroll,\n        _options$resize = options.resize,\n        resize = _options$resize === void 0 ? true : _options$resize;\n    var window = getWindow(state.elements.popper);\n    var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n    if (scroll) {\n      scrollParents.forEach(function (scrollParent) {\n        scrollParent.addEventListener('scroll', instance.update, passive);\n      });\n    }\n\n    if (resize) {\n      window.addEventListener('resize', instance.update, passive);\n    }\n\n    return function () {\n      if (scroll) {\n        scrollParents.forEach(function (scrollParent) {\n          scrollParent.removeEventListener('scroll', instance.update, passive);\n        });\n      }\n\n      if (resize) {\n        window.removeEventListener('resize', instance.update, passive);\n      }\n    };\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  var eventListeners = {\n    name: 'eventListeners',\n    enabled: true,\n    phase: 'write',\n    fn: function fn() {},\n    effect: effect,\n    data: {}\n  };\n\n  var hash$1 = {\n    left: 'right',\n    right: 'left',\n    bottom: 'top',\n    top: 'bottom'\n  };\n  function getOppositePlacement(placement) {\n    return placement.replace(/left|right|bottom|top/g, function (matched) {\n      return hash$1[matched];\n    });\n  }\n\n  var hash = {\n    start: 'end',\n    end: 'start'\n  };\n  function getOppositeVariationPlacement(placement) {\n    return placement.replace(/start|end/g, function (matched) {\n      return hash[matched];\n    });\n  }\n\n  function getWindowScroll(node) {\n    var win = getWindow(node);\n    var scrollLeft = win.pageXOffset;\n    var scrollTop = win.pageYOffset;\n    return {\n      scrollLeft: scrollLeft,\n      scrollTop: scrollTop\n    };\n  }\n\n  function getWindowScrollBarX(element) {\n    // If <html> has a CSS width greater than the viewport, then this will be\n    // incorrect for RTL.\n    // Popper 1 is broken in this case and never had a bug report so let's assume\n    // it's not an issue. I don't think anyone ever specifies width on <html>\n    // anyway.\n    // Browsers where the left scrollbar doesn't cause an issue report `0` for\n    // this (e.g. Edge 2019, IE11, Safari)\n    return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n  }\n\n  function getViewportRect(element) {\n    var win = getWindow(element);\n    var html = getDocumentElement(element);\n    var visualViewport = win.visualViewport;\n    var width = html.clientWidth;\n    var height = html.clientHeight;\n    var x = 0;\n    var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n    // can be obscured underneath it.\n    // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n    // if it isn't open, so if this isn't available, the popper will be detected\n    // to overflow the bottom of the screen too early.\n\n    if (visualViewport) {\n      width = visualViewport.width;\n      height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n      // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n      // errors due to floating point numbers, so we need to check precision.\n      // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n      // Feature detection fails in mobile emulation mode in Chrome.\n      // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n      // 0.001\n      // Fallback here: \"Not Safari\" userAgent\n\n      if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n        x = visualViewport.offsetLeft;\n        y = visualViewport.offsetTop;\n      }\n    }\n\n    return {\n      width: width,\n      height: height,\n      x: x + getWindowScrollBarX(element),\n      y: y\n    };\n  }\n\n  // of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\n  function getDocumentRect(element) {\n    var _element$ownerDocumen;\n\n    var html = getDocumentElement(element);\n    var winScroll = getWindowScroll(element);\n    var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n    var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n    var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n    var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n    var y = -winScroll.scrollTop;\n\n    if (getComputedStyle$1(body || html).direction === 'rtl') {\n      x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n    }\n\n    return {\n      width: width,\n      height: height,\n      x: x,\n      y: y\n    };\n  }\n\n  function isScrollParent(element) {\n    // Firefox wants us to check `-x` and `-y` variations as well\n    var _getComputedStyle = getComputedStyle$1(element),\n        overflow = _getComputedStyle.overflow,\n        overflowX = _getComputedStyle.overflowX,\n        overflowY = _getComputedStyle.overflowY;\n\n    return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n  }\n\n  function getScrollParent(node) {\n    if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n      // $FlowFixMe[incompatible-return]: assume body is always available\n      return node.ownerDocument.body;\n    }\n\n    if (isHTMLElement(node) && isScrollParent(node)) {\n      return node;\n    }\n\n    return getScrollParent(getParentNode(node));\n  }\n\n  /*\n  given a DOM element, return the list of all scroll parents, up the list of ancesors\n  until we get to the top window object. This list is what we attach scroll listeners\n  to, because if any of these parent elements scroll, we'll need to re-calculate the\n  reference element's position.\n  */\n\n  function listScrollParents(element, list) {\n    var _element$ownerDocumen;\n\n    if (list === void 0) {\n      list = [];\n    }\n\n    var scrollParent = getScrollParent(element);\n    var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n    var win = getWindow(scrollParent);\n    var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n    var updatedList = list.concat(target);\n    return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n    updatedList.concat(listScrollParents(getParentNode(target)));\n  }\n\n  function rectToClientRect(rect) {\n    return Object.assign({}, rect, {\n      left: rect.x,\n      top: rect.y,\n      right: rect.x + rect.width,\n      bottom: rect.y + rect.height\n    });\n  }\n\n  function getInnerBoundingClientRect(element) {\n    var rect = getBoundingClientRect(element);\n    rect.top = rect.top + element.clientTop;\n    rect.left = rect.left + element.clientLeft;\n    rect.bottom = rect.top + element.clientHeight;\n    rect.right = rect.left + element.clientWidth;\n    rect.width = element.clientWidth;\n    rect.height = element.clientHeight;\n    rect.x = rect.left;\n    rect.y = rect.top;\n    return rect;\n  }\n\n  function getClientRectFromMixedType(element, clippingParent) {\n    return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n  } // A \"clipping parent\" is an overflowable container with the characteristic of\n  // clipping (or hiding) overflowing elements with a position different from\n  // `initial`\n\n\n  function getClippingParents(element) {\n    var clippingParents = listScrollParents(getParentNode(element));\n    var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle$1(element).position) >= 0;\n    var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n    if (!isElement(clipperElement)) {\n      return [];\n    } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n    return clippingParents.filter(function (clippingParent) {\n      return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n    });\n  } // Gets the maximum area that the element is visible in due to any number of\n  // clipping parents\n\n\n  function getClippingRect(element, boundary, rootBoundary) {\n    var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n    var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n    var firstClippingParent = clippingParents[0];\n    var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n      var rect = getClientRectFromMixedType(element, clippingParent);\n      accRect.top = max(rect.top, accRect.top);\n      accRect.right = min(rect.right, accRect.right);\n      accRect.bottom = min(rect.bottom, accRect.bottom);\n      accRect.left = max(rect.left, accRect.left);\n      return accRect;\n    }, getClientRectFromMixedType(element, firstClippingParent));\n    clippingRect.width = clippingRect.right - clippingRect.left;\n    clippingRect.height = clippingRect.bottom - clippingRect.top;\n    clippingRect.x = clippingRect.left;\n    clippingRect.y = clippingRect.top;\n    return clippingRect;\n  }\n\n  function getVariation(placement) {\n    return placement.split('-')[1];\n  }\n\n  function computeOffsets(_ref) {\n    var reference = _ref.reference,\n        element = _ref.element,\n        placement = _ref.placement;\n    var basePlacement = placement ? getBasePlacement(placement) : null;\n    var variation = placement ? getVariation(placement) : null;\n    var commonX = reference.x + reference.width / 2 - element.width / 2;\n    var commonY = reference.y + reference.height / 2 - element.height / 2;\n    var offsets;\n\n    switch (basePlacement) {\n      case top:\n        offsets = {\n          x: commonX,\n          y: reference.y - element.height\n        };\n        break;\n\n      case bottom:\n        offsets = {\n          x: commonX,\n          y: reference.y + reference.height\n        };\n        break;\n\n      case right:\n        offsets = {\n          x: reference.x + reference.width,\n          y: commonY\n        };\n        break;\n\n      case left:\n        offsets = {\n          x: reference.x - element.width,\n          y: commonY\n        };\n        break;\n\n      default:\n        offsets = {\n          x: reference.x,\n          y: reference.y\n        };\n    }\n\n    var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n    if (mainAxis != null) {\n      var len = mainAxis === 'y' ? 'height' : 'width';\n\n      switch (variation) {\n        case start:\n          offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n          break;\n\n        case end:\n          offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n          break;\n      }\n    }\n\n    return offsets;\n  }\n\n  function detectOverflow(state, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var _options = options,\n        _options$placement = _options.placement,\n        placement = _options$placement === void 0 ? state.placement : _options$placement,\n        _options$boundary = _options.boundary,\n        boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n        _options$rootBoundary = _options.rootBoundary,\n        rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n        _options$elementConte = _options.elementContext,\n        elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n        _options$altBoundary = _options.altBoundary,\n        altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n        _options$padding = _options.padding,\n        padding = _options$padding === void 0 ? 0 : _options$padding;\n    var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n    var altContext = elementContext === popper ? reference : popper;\n    var referenceElement = state.elements.reference;\n    var popperRect = state.rects.popper;\n    var element = state.elements[altBoundary ? altContext : elementContext];\n    var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n    var referenceClientRect = getBoundingClientRect(referenceElement);\n    var popperOffsets = computeOffsets({\n      reference: referenceClientRect,\n      element: popperRect,\n      strategy: 'absolute',\n      placement: placement\n    });\n    var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n    var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n    // 0 or negative = within the clipping rect\n\n    var overflowOffsets = {\n      top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n      bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n      left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n      right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n    };\n    var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n    if (elementContext === popper && offsetData) {\n      var offset = offsetData[placement];\n      Object.keys(overflowOffsets).forEach(function (key) {\n        var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n        var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n        overflowOffsets[key] += offset[axis] * multiply;\n      });\n    }\n\n    return overflowOffsets;\n  }\n\n  function computeAutoPlacement(state, options) {\n    if (options === void 0) {\n      options = {};\n    }\n\n    var _options = options,\n        placement = _options.placement,\n        boundary = _options.boundary,\n        rootBoundary = _options.rootBoundary,\n        padding = _options.padding,\n        flipVariations = _options.flipVariations,\n        _options$allowedAutoP = _options.allowedAutoPlacements,\n        allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;\n    var variation = getVariation(placement);\n    var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n      return getVariation(placement) === variation;\n    }) : basePlacements;\n    var allowedPlacements = placements$1.filter(function (placement) {\n      return allowedAutoPlacements.indexOf(placement) >= 0;\n    });\n\n    if (allowedPlacements.length === 0) {\n      allowedPlacements = placements$1;\n    } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n    var overflows = allowedPlacements.reduce(function (acc, placement) {\n      acc[placement] = detectOverflow(state, {\n        placement: placement,\n        boundary: boundary,\n        rootBoundary: rootBoundary,\n        padding: padding\n      })[getBasePlacement(placement)];\n      return acc;\n    }, {});\n    return Object.keys(overflows).sort(function (a, b) {\n      return overflows[a] - overflows[b];\n    });\n  }\n\n  function getExpandedFallbackPlacements(placement) {\n    if (getBasePlacement(placement) === auto) {\n      return [];\n    }\n\n    var oppositePlacement = getOppositePlacement(placement);\n    return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n  }\n\n  function flip(_ref) {\n    var state = _ref.state,\n        options = _ref.options,\n        name = _ref.name;\n\n    if (state.modifiersData[name]._skip) {\n      return;\n    }\n\n    var _options$mainAxis = options.mainAxis,\n        checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n        _options$altAxis = options.altAxis,\n        checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n        specifiedFallbackPlacements = options.fallbackPlacements,\n        padding = options.padding,\n        boundary = options.boundary,\n        rootBoundary = options.rootBoundary,\n        altBoundary = options.altBoundary,\n        _options$flipVariatio = options.flipVariations,\n        flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n        allowedAutoPlacements = options.allowedAutoPlacements;\n    var preferredPlacement = state.options.placement;\n    var basePlacement = getBasePlacement(preferredPlacement);\n    var isBasePlacement = basePlacement === preferredPlacement;\n    var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n    var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n      return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n        placement: placement,\n        boundary: boundary,\n        rootBoundary: rootBoundary,\n        padding: padding,\n        flipVariations: flipVariations,\n        allowedAutoPlacements: allowedAutoPlacements\n      }) : placement);\n    }, []);\n    var referenceRect = state.rects.reference;\n    var popperRect = state.rects.popper;\n    var checksMap = new Map();\n    var makeFallbackChecks = true;\n    var firstFittingPlacement = placements[0];\n\n    for (var i = 0; i < placements.length; i++) {\n      var placement = placements[i];\n\n      var _basePlacement = getBasePlacement(placement);\n\n      var isStartVariation = getVariation(placement) === start;\n      var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n      var len = isVertical ? 'width' : 'height';\n      var overflow = detectOverflow(state, {\n        placement: placement,\n        boundary: boundary,\n        rootBoundary: rootBoundary,\n        altBoundary: altBoundary,\n        padding: padding\n      });\n      var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n      if (referenceRect[len] > popperRect[len]) {\n        mainVariationSide = getOppositePlacement(mainVariationSide);\n      }\n\n      var altVariationSide = getOppositePlacement(mainVariationSide);\n      var checks = [];\n\n      if (checkMainAxis) {\n        checks.push(overflow[_basePlacement] <= 0);\n      }\n\n      if (checkAltAxis) {\n        checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n      }\n\n      if (checks.every(function (check) {\n        return check;\n      })) {\n        firstFittingPlacement = placement;\n        makeFallbackChecks = false;\n        break;\n      }\n\n      checksMap.set(placement, checks);\n    }\n\n    if (makeFallbackChecks) {\n      // `2` may be desired in some cases – research later\n      var numberOfChecks = flipVariations ? 3 : 1;\n\n      var _loop = function _loop(_i) {\n        var fittingPlacement = placements.find(function (placement) {\n          var checks = checksMap.get(placement);\n\n          if (checks) {\n            return checks.slice(0, _i).every(function (check) {\n              return check;\n            });\n          }\n        });\n\n        if (fittingPlacement) {\n          firstFittingPlacement = fittingPlacement;\n          return \"break\";\n        }\n      };\n\n      for (var _i = numberOfChecks; _i > 0; _i--) {\n        var _ret = _loop(_i);\n\n        if (_ret === \"break\") break;\n      }\n    }\n\n    if (state.placement !== firstFittingPlacement) {\n      state.modifiersData[name]._skip = true;\n      state.placement = firstFittingPlacement;\n      state.reset = true;\n    }\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  var flip$1 = {\n    name: 'flip',\n    enabled: true,\n    phase: 'main',\n    fn: flip,\n    requiresIfExists: ['offset'],\n    data: {\n      _skip: false\n    }\n  };\n\n  function getSideOffsets(overflow, rect, preventedOffsets) {\n    if (preventedOffsets === void 0) {\n      preventedOffsets = {\n        x: 0,\n        y: 0\n      };\n    }\n\n    return {\n      top: overflow.top - rect.height - preventedOffsets.y,\n      right: overflow.right - rect.width + preventedOffsets.x,\n      bottom: overflow.bottom - rect.height + preventedOffsets.y,\n      left: overflow.left - rect.width - preventedOffsets.x\n    };\n  }\n\n  function isAnySideFullyClipped(overflow) {\n    return [top, right, bottom, left].some(function (side) {\n      return overflow[side] >= 0;\n    });\n  }\n\n  function hide(_ref) {\n    var state = _ref.state,\n        name = _ref.name;\n    var referenceRect = state.rects.reference;\n    var popperRect = state.rects.popper;\n    var preventedOffsets = state.modifiersData.preventOverflow;\n    var referenceOverflow = detectOverflow(state, {\n      elementContext: 'reference'\n    });\n    var popperAltOverflow = detectOverflow(state, {\n      altBoundary: true\n    });\n    var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n    var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n    var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n    var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n    state.modifiersData[name] = {\n      referenceClippingOffsets: referenceClippingOffsets,\n      popperEscapeOffsets: popperEscapeOffsets,\n      isReferenceHidden: isReferenceHidden,\n      hasPopperEscaped: hasPopperEscaped\n    };\n    state.attributes.popper = Object.assign({}, state.attributes.popper, {\n      'data-popper-reference-hidden': isReferenceHidden,\n      'data-popper-escaped': hasPopperEscaped\n    });\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  var hide$1 = {\n    name: 'hide',\n    enabled: true,\n    phase: 'main',\n    requiresIfExists: ['preventOverflow'],\n    fn: hide\n  };\n\n  function distanceAndSkiddingToXY(placement, rects, offset) {\n    var basePlacement = getBasePlacement(placement);\n    var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n    var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n      placement: placement\n    })) : offset,\n        skidding = _ref[0],\n        distance = _ref[1];\n\n    skidding = skidding || 0;\n    distance = (distance || 0) * invertDistance;\n    return [left, right].indexOf(basePlacement) >= 0 ? {\n      x: distance,\n      y: skidding\n    } : {\n      x: skidding,\n      y: distance\n    };\n  }\n\n  function offset(_ref2) {\n    var state = _ref2.state,\n        options = _ref2.options,\n        name = _ref2.name;\n    var _options$offset = options.offset,\n        offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n    var data = placements.reduce(function (acc, placement) {\n      acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n      return acc;\n    }, {});\n    var _data$state$placement = data[state.placement],\n        x = _data$state$placement.x,\n        y = _data$state$placement.y;\n\n    if (state.modifiersData.popperOffsets != null) {\n      state.modifiersData.popperOffsets.x += x;\n      state.modifiersData.popperOffsets.y += y;\n    }\n\n    state.modifiersData[name] = data;\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  var offset$1 = {\n    name: 'offset',\n    enabled: true,\n    phase: 'main',\n    requires: ['popperOffsets'],\n    fn: offset\n  };\n\n  function popperOffsets(_ref) {\n    var state = _ref.state,\n        name = _ref.name;\n    // Offsets are the actual position the popper needs to have to be\n    // properly positioned near its reference element\n    // This is the most basic placement, and will be adjusted by\n    // the modifiers in the next step\n    state.modifiersData[name] = computeOffsets({\n      reference: state.rects.reference,\n      element: state.rects.popper,\n      strategy: 'absolute',\n      placement: state.placement\n    });\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  var popperOffsets$1 = {\n    name: 'popperOffsets',\n    enabled: true,\n    phase: 'read',\n    fn: popperOffsets,\n    data: {}\n  };\n\n  function getAltAxis(axis) {\n    return axis === 'x' ? 'y' : 'x';\n  }\n\n  function preventOverflow(_ref) {\n    var state = _ref.state,\n        options = _ref.options,\n        name = _ref.name;\n    var _options$mainAxis = options.mainAxis,\n        checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n        _options$altAxis = options.altAxis,\n        checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n        boundary = options.boundary,\n        rootBoundary = options.rootBoundary,\n        altBoundary = options.altBoundary,\n        padding = options.padding,\n        _options$tether = options.tether,\n        tether = _options$tether === void 0 ? true : _options$tether,\n        _options$tetherOffset = options.tetherOffset,\n        tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n    var overflow = detectOverflow(state, {\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding,\n      altBoundary: altBoundary\n    });\n    var basePlacement = getBasePlacement(state.placement);\n    var variation = getVariation(state.placement);\n    var isBasePlacement = !variation;\n    var mainAxis = getMainAxisFromPlacement(basePlacement);\n    var altAxis = getAltAxis(mainAxis);\n    var popperOffsets = state.modifiersData.popperOffsets;\n    var referenceRect = state.rects.reference;\n    var popperRect = state.rects.popper;\n    var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n      placement: state.placement\n    })) : tetherOffset;\n    var data = {\n      x: 0,\n      y: 0\n    };\n\n    if (!popperOffsets) {\n      return;\n    }\n\n    if (checkMainAxis || checkAltAxis) {\n      var mainSide = mainAxis === 'y' ? top : left;\n      var altSide = mainAxis === 'y' ? bottom : right;\n      var len = mainAxis === 'y' ? 'height' : 'width';\n      var offset = popperOffsets[mainAxis];\n      var min$1 = popperOffsets[mainAxis] + overflow[mainSide];\n      var max$1 = popperOffsets[mainAxis] - overflow[altSide];\n      var additive = tether ? -popperRect[len] / 2 : 0;\n      var minLen = variation === start ? referenceRect[len] : popperRect[len];\n      var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n      // outside the reference bounds\n\n      var arrowElement = state.elements.arrow;\n      var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n        width: 0,\n        height: 0\n      };\n      var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n      var arrowPaddingMin = arrowPaddingObject[mainSide];\n      var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n      // to include its full size in the calculation. If the reference is small\n      // and near the edge of a boundary, the popper can overflow even if the\n      // reference is not overflowing as well (e.g. virtual elements with no\n      // width or height)\n\n      var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n      var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n      var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n      var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n      var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n      var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;\n      var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n      var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n\n      if (checkMainAxis) {\n        var preventedOffset = within(tether ? min(min$1, tetherMin) : min$1, offset, tether ? max(max$1, tetherMax) : max$1);\n        popperOffsets[mainAxis] = preventedOffset;\n        data[mainAxis] = preventedOffset - offset;\n      }\n\n      if (checkAltAxis) {\n        var _mainSide = mainAxis === 'x' ? top : left;\n\n        var _altSide = mainAxis === 'x' ? bottom : right;\n\n        var _offset = popperOffsets[altAxis];\n\n        var _min = _offset + overflow[_mainSide];\n\n        var _max = _offset - overflow[_altSide];\n\n        var _preventedOffset = within(tether ? min(_min, tetherMin) : _min, _offset, tether ? max(_max, tetherMax) : _max);\n\n        popperOffsets[altAxis] = _preventedOffset;\n        data[altAxis] = _preventedOffset - _offset;\n      }\n    }\n\n    state.modifiersData[name] = data;\n  } // eslint-disable-next-line import/no-unused-modules\n\n\n  var preventOverflow$1 = {\n    name: 'preventOverflow',\n    enabled: true,\n    phase: 'main',\n    fn: preventOverflow,\n    requiresIfExists: ['offset']\n  };\n\n  function getHTMLElementScroll(element) {\n    return {\n      scrollLeft: element.scrollLeft,\n      scrollTop: element.scrollTop\n    };\n  }\n\n  function getNodeScroll(node) {\n    if (node === getWindow(node) || !isHTMLElement(node)) {\n      return getWindowScroll(node);\n    } else {\n      return getHTMLElementScroll(node);\n    }\n  }\n\n  function isElementScaled(element) {\n    var rect = element.getBoundingClientRect();\n    var scaleX = rect.width / element.offsetWidth || 1;\n    var scaleY = rect.height / element.offsetHeight || 1;\n    return scaleX !== 1 || scaleY !== 1;\n  } // Returns the composite rect of an element relative to its offsetParent.\n  // Composite means it takes into account transforms as well as layout.\n\n\n  function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n    if (isFixed === void 0) {\n      isFixed = false;\n    }\n\n    var isOffsetParentAnElement = isHTMLElement(offsetParent);\n    var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n    var documentElement = getDocumentElement(offsetParent);\n    var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);\n    var scroll = {\n      scrollLeft: 0,\n      scrollTop: 0\n    };\n    var offsets = {\n      x: 0,\n      y: 0\n    };\n\n    if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n      if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n      isScrollParent(documentElement)) {\n        scroll = getNodeScroll(offsetParent);\n      }\n\n      if (isHTMLElement(offsetParent)) {\n        offsets = getBoundingClientRect(offsetParent, true);\n        offsets.x += offsetParent.clientLeft;\n        offsets.y += offsetParent.clientTop;\n      } else if (documentElement) {\n        offsets.x = getWindowScrollBarX(documentElement);\n      }\n    }\n\n    return {\n      x: rect.left + scroll.scrollLeft - offsets.x,\n      y: rect.top + scroll.scrollTop - offsets.y,\n      width: rect.width,\n      height: rect.height\n    };\n  }\n\n  function order(modifiers) {\n    var map = new Map();\n    var visited = new Set();\n    var result = [];\n    modifiers.forEach(function (modifier) {\n      map.set(modifier.name, modifier);\n    }); // On visiting object, check for its dependencies and visit them recursively\n\n    function sort(modifier) {\n      visited.add(modifier.name);\n      var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n      requires.forEach(function (dep) {\n        if (!visited.has(dep)) {\n          var depModifier = map.get(dep);\n\n          if (depModifier) {\n            sort(depModifier);\n          }\n        }\n      });\n      result.push(modifier);\n    }\n\n    modifiers.forEach(function (modifier) {\n      if (!visited.has(modifier.name)) {\n        // check for visited object\n        sort(modifier);\n      }\n    });\n    return result;\n  }\n\n  function orderModifiers(modifiers) {\n    // order based on dependencies\n    var orderedModifiers = order(modifiers); // order based on phase\n\n    return modifierPhases.reduce(function (acc, phase) {\n      return acc.concat(orderedModifiers.filter(function (modifier) {\n        return modifier.phase === phase;\n      }));\n    }, []);\n  }\n\n  function debounce(fn) {\n    var pending;\n    return function () {\n      if (!pending) {\n        pending = new Promise(function (resolve) {\n          Promise.resolve().then(function () {\n            pending = undefined;\n            resolve(fn());\n          });\n        });\n      }\n\n      return pending;\n    };\n  }\n\n  function mergeByName(modifiers) {\n    var merged = modifiers.reduce(function (merged, current) {\n      var existing = merged[current.name];\n      merged[current.name] = existing ? Object.assign({}, existing, current, {\n        options: Object.assign({}, existing.options, current.options),\n        data: Object.assign({}, existing.data, current.data)\n      }) : current;\n      return merged;\n    }, {}); // IE11 does not support Object.values\n\n    return Object.keys(merged).map(function (key) {\n      return merged[key];\n    });\n  }\n\n  var DEFAULT_OPTIONS = {\n    placement: 'bottom',\n    modifiers: [],\n    strategy: 'absolute'\n  };\n\n  function areValidElements() {\n    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return !args.some(function (element) {\n      return !(element && typeof element.getBoundingClientRect === 'function');\n    });\n  }\n\n  function popperGenerator(generatorOptions) {\n    if (generatorOptions === void 0) {\n      generatorOptions = {};\n    }\n\n    var _generatorOptions = generatorOptions,\n        _generatorOptions$def = _generatorOptions.defaultModifiers,\n        defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n        _generatorOptions$def2 = _generatorOptions.defaultOptions,\n        defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n    return function createPopper(reference, popper, options) {\n      if (options === void 0) {\n        options = defaultOptions;\n      }\n\n      var state = {\n        placement: 'bottom',\n        orderedModifiers: [],\n        options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n        modifiersData: {},\n        elements: {\n          reference: reference,\n          popper: popper\n        },\n        attributes: {},\n        styles: {}\n      };\n      var effectCleanupFns = [];\n      var isDestroyed = false;\n      var instance = {\n        state: state,\n        setOptions: function setOptions(options) {\n          cleanupModifierEffects();\n          state.options = Object.assign({}, defaultOptions, state.options, options);\n          state.scrollParents = {\n            reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n            popper: listScrollParents(popper)\n          }; // Orders the modifiers based on their dependencies and `phase`\n          // properties\n\n          var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n          state.orderedModifiers = orderedModifiers.filter(function (m) {\n            return m.enabled;\n          }); // Validate the provided modifiers so that the consumer will get warned\n\n          runModifierEffects();\n          return instance.update();\n        },\n        // Sync update – it will always be executed, even if not necessary. This\n        // is useful for low frequency updates where sync behavior simplifies the\n        // logic.\n        // For high frequency updates (e.g. `resize` and `scroll` events), always\n        // prefer the async Popper#update method\n        forceUpdate: function forceUpdate() {\n          if (isDestroyed) {\n            return;\n          }\n\n          var _state$elements = state.elements,\n              reference = _state$elements.reference,\n              popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n          // anymore\n\n          if (!areValidElements(reference, popper)) {\n\n            return;\n          } // Store the reference and popper rects to be read by modifiers\n\n\n          state.rects = {\n            reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n            popper: getLayoutRect(popper)\n          }; // Modifiers have the ability to reset the current update cycle. The\n          // most common use case for this is the `flip` modifier changing the\n          // placement, which then needs to re-run all the modifiers, because the\n          // logic was previously ran for the previous placement and is therefore\n          // stale/incorrect\n\n          state.reset = false;\n          state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n          // is filled with the initial data specified by the modifier. This means\n          // it doesn't persist and is fresh on each update.\n          // To ensure persistent data, use `${name}#persistent`\n\n          state.orderedModifiers.forEach(function (modifier) {\n            return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n          });\n\n          for (var index = 0; index < state.orderedModifiers.length; index++) {\n\n            if (state.reset === true) {\n              state.reset = false;\n              index = -1;\n              continue;\n            }\n\n            var _state$orderedModifie = state.orderedModifiers[index],\n                fn = _state$orderedModifie.fn,\n                _state$orderedModifie2 = _state$orderedModifie.options,\n                _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n                name = _state$orderedModifie.name;\n\n            if (typeof fn === 'function') {\n              state = fn({\n                state: state,\n                options: _options,\n                name: name,\n                instance: instance\n              }) || state;\n            }\n          }\n        },\n        // Async and optimistically optimized update – it will not be executed if\n        // not necessary (debounced to run at most once-per-tick)\n        update: debounce(function () {\n          return new Promise(function (resolve) {\n            instance.forceUpdate();\n            resolve(state);\n          });\n        }),\n        destroy: function destroy() {\n          cleanupModifierEffects();\n          isDestroyed = true;\n        }\n      };\n\n      if (!areValidElements(reference, popper)) {\n\n        return instance;\n      }\n\n      instance.setOptions(options).then(function (state) {\n        if (!isDestroyed && options.onFirstUpdate) {\n          options.onFirstUpdate(state);\n        }\n      }); // Modifiers have the ability to execute arbitrary code before the first\n      // update cycle runs. They will be executed in the same order as the update\n      // cycle. This is useful when a modifier adds some persistent data that\n      // other modifiers need to use, but the modifier is run after the dependent\n      // one.\n\n      function runModifierEffects() {\n        state.orderedModifiers.forEach(function (_ref3) {\n          var name = _ref3.name,\n              _ref3$options = _ref3.options,\n              options = _ref3$options === void 0 ? {} : _ref3$options,\n              effect = _ref3.effect;\n\n          if (typeof effect === 'function') {\n            var cleanupFn = effect({\n              state: state,\n              name: name,\n              instance: instance,\n              options: options\n            });\n\n            var noopFn = function noopFn() {};\n\n            effectCleanupFns.push(cleanupFn || noopFn);\n          }\n        });\n      }\n\n      function cleanupModifierEffects() {\n        effectCleanupFns.forEach(function (fn) {\n          return fn();\n        });\n        effectCleanupFns = [];\n      }\n\n      return instance;\n    };\n  }\n  var createPopper$2 = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\n  var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1];\n  var createPopper$1 = /*#__PURE__*/popperGenerator({\n    defaultModifiers: defaultModifiers$1\n  }); // eslint-disable-next-line import/no-unused-modules\n\n  var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1];\n  var createPopper = /*#__PURE__*/popperGenerator({\n    defaultModifiers: defaultModifiers\n  }); // eslint-disable-next-line import/no-unused-modules\n\n  var Popper = /*#__PURE__*/Object.freeze({\n    __proto__: null,\n    popperGenerator: popperGenerator,\n    detectOverflow: detectOverflow,\n    createPopperBase: createPopper$2,\n    createPopper: createPopper,\n    createPopperLite: createPopper$1,\n    top: top,\n    bottom: bottom,\n    right: right,\n    left: left,\n    auto: auto,\n    basePlacements: basePlacements,\n    start: start,\n    end: end,\n    clippingParents: clippingParents,\n    viewport: viewport,\n    popper: popper,\n    reference: reference,\n    variationPlacements: variationPlacements,\n    placements: placements,\n    beforeRead: beforeRead,\n    read: read,\n    afterRead: afterRead,\n    beforeMain: beforeMain,\n    main: main,\n    afterMain: afterMain,\n    beforeWrite: beforeWrite,\n    write: write,\n    afterWrite: afterWrite,\n    modifierPhases: modifierPhases,\n    applyStyles: applyStyles$1,\n    arrow: arrow$1,\n    computeStyles: computeStyles$1,\n    eventListeners: eventListeners,\n    flip: flip$1,\n    hide: hide$1,\n    offset: offset$1,\n    popperOffsets: popperOffsets$1,\n    preventOverflow: preventOverflow$1\n  });\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): dropdown.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$9 = 'dropdown';\n  const DATA_KEY$8 = 'bs.dropdown';\n  const EVENT_KEY$8 = `.${DATA_KEY$8}`;\n  const DATA_API_KEY$4 = '.data-api';\n  const ESCAPE_KEY$2 = 'Escape';\n  const SPACE_KEY = 'Space';\n  const TAB_KEY$1 = 'Tab';\n  const ARROW_UP_KEY = 'ArrowUp';\n  const ARROW_DOWN_KEY = 'ArrowDown';\n  const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\n  const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`);\n  const EVENT_HIDE$4 = `hide${EVENT_KEY$8}`;\n  const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$8}`;\n  const EVENT_SHOW$4 = `show${EVENT_KEY$8}`;\n  const EVENT_SHOWN$4 = `shown${EVENT_KEY$8}`;\n  const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$8}${DATA_API_KEY$4}`;\n  const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$4}`;\n  const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$4}`;\n  const CLASS_NAME_SHOW$6 = 'show';\n  const CLASS_NAME_DROPUP = 'dropup';\n  const CLASS_NAME_DROPEND = 'dropend';\n  const CLASS_NAME_DROPSTART = 'dropstart';\n  const CLASS_NAME_NAVBAR = 'navbar';\n  const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]';\n  const SELECTOR_MENU = '.dropdown-menu';\n  const SELECTOR_NAVBAR_NAV = '.navbar-nav';\n  const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\n  const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\n  const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\n  const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\n  const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\n  const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\n  const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\n  const Default$8 = {\n    offset: [0, 2],\n    boundary: 'clippingParents',\n    reference: 'toggle',\n    display: 'dynamic',\n    popperConfig: null,\n    autoClose: true\n  };\n  const DefaultType$8 = {\n    offset: '(array|string|function)',\n    boundary: '(string|element)',\n    reference: '(string|element|object)',\n    display: 'string',\n    popperConfig: '(null|object|function)',\n    autoClose: '(boolean|string)'\n  };\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Dropdown extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n    } // Getters\n\n\n    static get Default() {\n      return Default$8;\n    }\n\n    static get DefaultType() {\n      return DefaultType$8;\n    }\n\n    static get NAME() {\n      return NAME$9;\n    } // Public\n\n\n    toggle() {\n      return this._isShown() ? this.hide() : this.show();\n    }\n\n    show() {\n      if (isDisabled(this._element) || this._isShown(this._menu)) {\n        return;\n      }\n\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, relatedTarget);\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      const parent = Dropdown.getParentFromElement(this._element); // Totally disable Popper for Dropdowns in Navbar\n\n      if (this._inNavbar) {\n        Manipulator.setDataAttribute(this._menu, 'popper', 'none');\n      } else {\n        this._createPopper(parent);\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {\n        [].concat(...document.body.children).forEach(elem => EventHandler.on(elem, 'mouseover', noop));\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      this._menu.classList.add(CLASS_NAME_SHOW$6);\n\n      this._element.classList.add(CLASS_NAME_SHOW$6);\n\n      EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget);\n    }\n\n    hide() {\n      if (isDisabled(this._element) || !this._isShown(this._menu)) {\n        return;\n      }\n\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n\n      this._completeHide(relatedTarget);\n    }\n\n    dispose() {\n      if (this._popper) {\n        this._popper.destroy();\n      }\n\n      super.dispose();\n    }\n\n    update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper) {\n        this._popper.update();\n      }\n    } // Private\n\n\n    _completeHide(relatedTarget) {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      } // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n\n      if ('ontouchstart' in document.documentElement) {\n        [].concat(...document.body.children).forEach(elem => EventHandler.off(elem, 'mouseover', noop));\n      }\n\n      if (this._popper) {\n        this._popper.destroy();\n      }\n\n      this._menu.classList.remove(CLASS_NAME_SHOW$6);\n\n      this._element.classList.remove(CLASS_NAME_SHOW$6);\n\n      this._element.setAttribute('aria-expanded', 'false');\n\n      Manipulator.removeDataAttribute(this._menu, 'popper');\n      EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget);\n    }\n\n    _getConfig(config) {\n      config = { ...this.constructor.Default,\n        ...Manipulator.getDataAttributes(this._element),\n        ...config\n      };\n      typeCheckConfig(NAME$9, config, this.constructor.DefaultType);\n\n      if (typeof config.reference === 'object' && !isElement$1(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n        // Popper virtual elements require a getBoundingClientRect method\n        throw new TypeError(`${NAME$9.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n      }\n\n      return config;\n    }\n\n    _createPopper(parent) {\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n      }\n\n      let referenceElement = this._element;\n\n      if (this._config.reference === 'parent') {\n        referenceElement = parent;\n      } else if (isElement$1(this._config.reference)) {\n        referenceElement = getElement(this._config.reference);\n      } else if (typeof this._config.reference === 'object') {\n        referenceElement = this._config.reference;\n      }\n\n      const popperConfig = this._getPopperConfig();\n\n      const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);\n      this._popper = createPopper(referenceElement, this._menu, popperConfig);\n\n      if (isDisplayStatic) {\n        Manipulator.setDataAttribute(this._menu, 'popper', 'static');\n      }\n    }\n\n    _isShown(element = this._element) {\n      return element.classList.contains(CLASS_NAME_SHOW$6);\n    }\n\n    _getMenuElement() {\n      return SelectorEngine.next(this._element, SELECTOR_MENU)[0];\n    }\n\n    _getPlacement() {\n      const parentDropdown = this._element.parentNode;\n\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n        return PLACEMENT_RIGHT;\n      }\n\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n        return PLACEMENT_LEFT;\n      } // We need to trim the value because custom properties can also include spaces\n\n\n      const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n        return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n      }\n\n      return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n    }\n\n    _detectNavbar() {\n      return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;\n    }\n\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n\n      if (typeof offset === 'string') {\n        return offset.split(',').map(val => Number.parseInt(val, 10));\n      }\n\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n\n      return offset;\n    }\n\n    _getPopperConfig() {\n      const defaultBsPopperConfig = {\n        placement: this._getPlacement(),\n        modifiers: [{\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }]\n      }; // Disable Popper if we have a static display\n\n      if (this._config.display === 'static') {\n        defaultBsPopperConfig.modifiers = [{\n          name: 'applyStyles',\n          enabled: false\n        }];\n      }\n\n      return { ...defaultBsPopperConfig,\n        ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n      };\n    }\n\n    _selectMenuItem({\n      key,\n      target\n    }) {\n      const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);\n\n      if (!items.length) {\n        return;\n      } // if target isn't included in items (e.g. when expanding the dropdown)\n      // allow cycling to get the last item in case key equals ARROW_UP_KEY\n\n\n      getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Dropdown.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config]();\n      });\n    }\n\n    static clearMenus(event) {\n      if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1)) {\n        return;\n      }\n\n      const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE$3);\n\n      for (let i = 0, len = toggles.length; i < len; i++) {\n        const context = Dropdown.getInstance(toggles[i]);\n\n        if (!context || context._config.autoClose === false) {\n          continue;\n        }\n\n        if (!context._isShown()) {\n          continue;\n        }\n\n        const relatedTarget = {\n          relatedTarget: context._element\n        };\n\n        if (event) {\n          const composedPath = event.composedPath();\n          const isMenuTarget = composedPath.includes(context._menu);\n\n          if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n            continue;\n          } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n\n\n          if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n            continue;\n          }\n\n          if (event.type === 'click') {\n            relatedTarget.clickEvent = event;\n          }\n        }\n\n        context._completeHide(relatedTarget);\n      }\n    }\n\n    static getParentFromElement(element) {\n      return getElementFromSelector(element) || element.parentNode;\n    }\n\n    static dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY$2 && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {\n        return;\n      }\n\n      const isActive = this.classList.contains(CLASS_NAME_SHOW$6);\n\n      if (!isActive && event.key === ESCAPE_KEY$2) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (isDisabled(this)) {\n        return;\n      }\n\n      const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];\n      const instance = Dropdown.getOrCreateInstance(getToggleButton);\n\n      if (event.key === ESCAPE_KEY$2) {\n        instance.hide();\n        return;\n      }\n\n      if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n        if (!isActive) {\n          instance.show();\n        }\n\n        instance._selectMenuItem(event);\n\n        return;\n      }\n\n      if (!isActive || event.key === SPACE_KEY) {\n        Dropdown.clearMenus();\n      }\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n    event.preventDefault();\n    Dropdown.getOrCreateInstance(this).toggle();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Dropdown to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Dropdown);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): util/scrollBar.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\n  const SELECTOR_STICKY_CONTENT = '.sticky-top';\n\n  class ScrollBarHelper {\n    constructor() {\n      this._element = document.body;\n    }\n\n    getWidth() {\n      // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n      const documentWidth = document.documentElement.clientWidth;\n      return Math.abs(window.innerWidth - documentWidth);\n    }\n\n    hide() {\n      const width = this.getWidth();\n\n      this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width\n\n\n      this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n\n\n      this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);\n\n      this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);\n    }\n\n    _disableOverFlow() {\n      this._saveInitialAttribute(this._element, 'overflow');\n\n      this._element.style.overflow = 'hidden';\n    }\n\n    _setElementAttributes(selector, styleProp, callback) {\n      const scrollbarWidth = this.getWidth();\n\n      const manipulationCallBack = element => {\n        if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n          return;\n        }\n\n        this._saveInitialAttribute(element, styleProp);\n\n        const calculatedValue = window.getComputedStyle(element)[styleProp];\n        element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;\n      };\n\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n\n    reset() {\n      this._resetElementAttributes(this._element, 'overflow');\n\n      this._resetElementAttributes(this._element, 'paddingRight');\n\n      this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');\n\n      this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');\n    }\n\n    _saveInitialAttribute(element, styleProp) {\n      const actualValue = element.style[styleProp];\n\n      if (actualValue) {\n        Manipulator.setDataAttribute(element, styleProp, actualValue);\n      }\n    }\n\n    _resetElementAttributes(selector, styleProp) {\n      const manipulationCallBack = element => {\n        const value = Manipulator.getDataAttribute(element, styleProp);\n\n        if (typeof value === 'undefined') {\n          element.style.removeProperty(styleProp);\n        } else {\n          Manipulator.removeDataAttribute(element, styleProp);\n          element.style[styleProp] = value;\n        }\n      };\n\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n\n    _applyManipulationCallback(selector, callBack) {\n      if (isElement$1(selector)) {\n        callBack(selector);\n      } else {\n        SelectorEngine.find(selector, this._element).forEach(callBack);\n      }\n    }\n\n    isOverflowing() {\n      return this.getWidth() > 0;\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): util/backdrop.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const Default$7 = {\n    className: 'modal-backdrop',\n    isVisible: true,\n    // if false, we use the backdrop helper without adding any element to the dom\n    isAnimated: false,\n    rootElement: 'body',\n    // give the choice to place backdrop under different elements\n    clickCallback: null\n  };\n  const DefaultType$7 = {\n    className: 'string',\n    isVisible: 'boolean',\n    isAnimated: 'boolean',\n    rootElement: '(element|string)',\n    clickCallback: '(function|null)'\n  };\n  const NAME$8 = 'backdrop';\n  const CLASS_NAME_FADE$4 = 'fade';\n  const CLASS_NAME_SHOW$5 = 'show';\n  const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$8}`;\n\n  class Backdrop {\n    constructor(config) {\n      this._config = this._getConfig(config);\n      this._isAppended = false;\n      this._element = null;\n    }\n\n    show(callback) {\n      if (!this._config.isVisible) {\n        execute(callback);\n        return;\n      }\n\n      this._append();\n\n      if (this._config.isAnimated) {\n        reflow(this._getElement());\n      }\n\n      this._getElement().classList.add(CLASS_NAME_SHOW$5);\n\n      this._emulateAnimation(() => {\n        execute(callback);\n      });\n    }\n\n    hide(callback) {\n      if (!this._config.isVisible) {\n        execute(callback);\n        return;\n      }\n\n      this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n\n      this._emulateAnimation(() => {\n        this.dispose();\n        execute(callback);\n      });\n    } // Private\n\n\n    _getElement() {\n      if (!this._element) {\n        const backdrop = document.createElement('div');\n        backdrop.className = this._config.className;\n\n        if (this._config.isAnimated) {\n          backdrop.classList.add(CLASS_NAME_FADE$4);\n        }\n\n        this._element = backdrop;\n      }\n\n      return this._element;\n    }\n\n    _getConfig(config) {\n      config = { ...Default$7,\n        ...(typeof config === 'object' ? config : {})\n      }; // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n\n      config.rootElement = getElement(config.rootElement);\n      typeCheckConfig(NAME$8, config, DefaultType$7);\n      return config;\n    }\n\n    _append() {\n      if (this._isAppended) {\n        return;\n      }\n\n      this._config.rootElement.append(this._getElement());\n\n      EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n        execute(this._config.clickCallback);\n      });\n      this._isAppended = true;\n    }\n\n    dispose() {\n      if (!this._isAppended) {\n        return;\n      }\n\n      EventHandler.off(this._element, EVENT_MOUSEDOWN);\n\n      this._element.remove();\n\n      this._isAppended = false;\n    }\n\n    _emulateAnimation(callback) {\n      executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): util/focustrap.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const Default$6 = {\n    trapElement: null,\n    // The element to trap focus inside of\n    autofocus: true\n  };\n  const DefaultType$6 = {\n    trapElement: 'element',\n    autofocus: 'boolean'\n  };\n  const NAME$7 = 'focustrap';\n  const DATA_KEY$7 = 'bs.focustrap';\n  const EVENT_KEY$7 = `.${DATA_KEY$7}`;\n  const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$7}`;\n  const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`;\n  const TAB_KEY = 'Tab';\n  const TAB_NAV_FORWARD = 'forward';\n  const TAB_NAV_BACKWARD = 'backward';\n\n  class FocusTrap {\n    constructor(config) {\n      this._config = this._getConfig(config);\n      this._isActive = false;\n      this._lastTabNavDirection = null;\n    }\n\n    activate() {\n      const {\n        trapElement,\n        autofocus\n      } = this._config;\n\n      if (this._isActive) {\n        return;\n      }\n\n      if (autofocus) {\n        trapElement.focus();\n      }\n\n      EventHandler.off(document, EVENT_KEY$7); // guard against infinite focus loop\n\n      EventHandler.on(document, EVENT_FOCUSIN$1, event => this._handleFocusin(event));\n      EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n      this._isActive = true;\n    }\n\n    deactivate() {\n      if (!this._isActive) {\n        return;\n      }\n\n      this._isActive = false;\n      EventHandler.off(document, EVENT_KEY$7);\n    } // Private\n\n\n    _handleFocusin(event) {\n      const {\n        target\n      } = event;\n      const {\n        trapElement\n      } = this._config;\n\n      if (target === document || target === trapElement || trapElement.contains(target)) {\n        return;\n      }\n\n      const elements = SelectorEngine.focusableChildren(trapElement);\n\n      if (elements.length === 0) {\n        trapElement.focus();\n      } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n        elements[elements.length - 1].focus();\n      } else {\n        elements[0].focus();\n      }\n    }\n\n    _handleKeydown(event) {\n      if (event.key !== TAB_KEY) {\n        return;\n      }\n\n      this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n    }\n\n    _getConfig(config) {\n      config = { ...Default$6,\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$7, config, DefaultType$6);\n      return config;\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): modal.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$6 = 'modal';\n  const DATA_KEY$6 = 'bs.modal';\n  const EVENT_KEY$6 = `.${DATA_KEY$6}`;\n  const DATA_API_KEY$3 = '.data-api';\n  const ESCAPE_KEY$1 = 'Escape';\n  const Default$5 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true\n  };\n  const DefaultType$5 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean'\n  };\n  const EVENT_HIDE$3 = `hide${EVENT_KEY$6}`;\n  const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$6}`;\n  const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`;\n  const EVENT_SHOW$3 = `show${EVENT_KEY$6}`;\n  const EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`;\n  const EVENT_RESIZE = `resize${EVENT_KEY$6}`;\n  const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`;\n  const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;\n  const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`;\n  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;\n  const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\n  const CLASS_NAME_OPEN = 'modal-open';\n  const CLASS_NAME_FADE$3 = 'fade';\n  const CLASS_NAME_SHOW$4 = 'show';\n  const CLASS_NAME_STATIC = 'modal-static';\n  const SELECTOR_DIALOG = '.modal-dialog';\n  const SELECTOR_MODAL_BODY = '.modal-body';\n  const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Modal extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._config = this._getConfig(config);\n      this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n      this._isShown = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollBar = new ScrollBarHelper();\n    } // Getters\n\n\n    static get Default() {\n      return Default$5;\n    }\n\n    static get NAME() {\n      return NAME$6;\n    } // Public\n\n\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n\n    show(relatedTarget) {\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n        relatedTarget\n      });\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      this._isShown = true;\n\n      if (this._isAnimated()) {\n        this._isTransitioning = true;\n      }\n\n      this._scrollBar.hide();\n\n      document.body.classList.add(CLASS_NAME_OPEN);\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n        EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n          if (event.target === this._element) {\n            this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(() => this._showElement(relatedTarget));\n    }\n\n    hide() {\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      this._isShown = false;\n\n      const isAnimated = this._isAnimated();\n\n      if (isAnimated) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      this._focustrap.deactivate();\n\n      this._element.classList.remove(CLASS_NAME_SHOW$4);\n\n      EventHandler.off(this._element, EVENT_CLICK_DISMISS);\n      EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);\n\n      this._queueCallback(() => this._hideModal(), this._element, isAnimated);\n    }\n\n    dispose() {\n      [window, this._dialog].forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY$6));\n\n      this._backdrop.dispose();\n\n      this._focustrap.deactivate();\n\n      super.dispose();\n    }\n\n    handleUpdate() {\n      this._adjustDialog();\n    } // Private\n\n\n    _initializeBackDrop() {\n      return new Backdrop({\n        isVisible: Boolean(this._config.backdrop),\n        // 'static' option will be translated to true, and booleans will keep their value\n        isAnimated: this._isAnimated()\n      });\n    }\n\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n\n    _getConfig(config) {\n      config = { ...Default$5,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$6, config, DefaultType$5);\n      return config;\n    }\n\n    _showElement(relatedTarget) {\n      const isAnimated = this._isAnimated();\n\n      const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.append(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      this._element.setAttribute('role', 'dialog');\n\n      this._element.scrollTop = 0;\n\n      if (modalBody) {\n        modalBody.scrollTop = 0;\n      }\n\n      if (isAnimated) {\n        reflow(this._element);\n      }\n\n      this._element.classList.add(CLASS_NAME_SHOW$4);\n\n      const transitionComplete = () => {\n        if (this._config.focus) {\n          this._focustrap.activate();\n        }\n\n        this._isTransitioning = false;\n        EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n          relatedTarget\n        });\n      };\n\n      this._queueCallback(transitionComplete, this._dialog, isAnimated);\n    }\n\n    _setEscapeEvent() {\n      if (this._isShown) {\n        EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n          if (this._config.keyboard && event.key === ESCAPE_KEY$1) {\n            event.preventDefault();\n            this.hide();\n          } else if (!this._config.keyboard && event.key === ESCAPE_KEY$1) {\n            this._triggerBackdropTransition();\n          }\n        });\n      } else {\n        EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS$1);\n      }\n    }\n\n    _setResizeEvent() {\n      if (this._isShown) {\n        EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog());\n      } else {\n        EventHandler.off(window, EVENT_RESIZE);\n      }\n    }\n\n    _hideModal() {\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._element.removeAttribute('role');\n\n      this._isTransitioning = false;\n\n      this._backdrop.hide(() => {\n        document.body.classList.remove(CLASS_NAME_OPEN);\n\n        this._resetAdjustments();\n\n        this._scrollBar.reset();\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n      });\n    }\n\n    _showBackdrop(callback) {\n      EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n        if (this._ignoreBackdropClick) {\n          this._ignoreBackdropClick = false;\n          return;\n        }\n\n        if (event.target !== event.currentTarget) {\n          return;\n        }\n\n        if (this._config.backdrop === true) {\n          this.hide();\n        } else if (this._config.backdrop === 'static') {\n          this._triggerBackdropTransition();\n        }\n      });\n\n      this._backdrop.show(callback);\n    }\n\n    _isAnimated() {\n      return this._element.classList.contains(CLASS_NAME_FADE$3);\n    }\n\n    _triggerBackdropTransition() {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      const {\n        classList,\n        scrollHeight,\n        style\n      } = this._element;\n      const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed\n\n      if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {\n        return;\n      }\n\n      if (!isModalOverflowing) {\n        style.overflowY = 'hidden';\n      }\n\n      classList.add(CLASS_NAME_STATIC);\n\n      this._queueCallback(() => {\n        classList.remove(CLASS_NAME_STATIC);\n\n        if (!isModalOverflowing) {\n          this._queueCallback(() => {\n            style.overflowY = '';\n          }, this._dialog);\n        }\n      }, this._dialog);\n\n      this._element.focus();\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // ----------------------------------------------------------------------\n\n\n    _adjustDialog() {\n      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      const scrollbarWidth = this._scrollBar.getWidth();\n\n      const isBodyOverflowing = scrollbarWidth > 0;\n\n      if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {\n        this._element.style.paddingLeft = `${scrollbarWidth}px`;\n      }\n\n      if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {\n        this._element.style.paddingRight = `${scrollbarWidth}px`;\n      }\n    }\n\n    _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    } // Static\n\n\n    static jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        const data = Modal.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](relatedTarget);\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n    const target = getElementFromSelector(this);\n\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    EventHandler.one(target, EVENT_SHOW$3, showEvent => {\n      if (showEvent.defaultPrevented) {\n        // only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      EventHandler.one(target, EVENT_HIDDEN$3, () => {\n        if (isVisible(this)) {\n          this.focus();\n        }\n      });\n    });\n    const data = Modal.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  enableDismissTrigger(Modal);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Modal to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Modal);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): offcanvas.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$5 = 'offcanvas';\n  const DATA_KEY$5 = 'bs.offcanvas';\n  const EVENT_KEY$5 = `.${DATA_KEY$5}`;\n  const DATA_API_KEY$2 = '.data-api';\n  const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$5}${DATA_API_KEY$2}`;\n  const ESCAPE_KEY = 'Escape';\n  const Default$4 = {\n    backdrop: true,\n    keyboard: true,\n    scroll: false\n  };\n  const DefaultType$4 = {\n    backdrop: 'boolean',\n    keyboard: 'boolean',\n    scroll: 'boolean'\n  };\n  const CLASS_NAME_SHOW$3 = 'show';\n  const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\n  const OPEN_SELECTOR = '.offcanvas.show';\n  const EVENT_SHOW$2 = `show${EVENT_KEY$5}`;\n  const EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`;\n  const EVENT_HIDE$2 = `hide${EVENT_KEY$5}`;\n  const EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`;\n  const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`;\n  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;\n  const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Offcanvas extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._config = this._getConfig(config);\n      this._isShown = false;\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    static get NAME() {\n      return NAME$5;\n    }\n\n    static get Default() {\n      return Default$4;\n    } // Public\n\n\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n\n    show(relatedTarget) {\n      if (this._isShown) {\n        return;\n      }\n\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$2, {\n        relatedTarget\n      });\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      this._isShown = true;\n      this._element.style.visibility = 'visible';\n\n      this._backdrop.show();\n\n      if (!this._config.scroll) {\n        new ScrollBarHelper().hide();\n      }\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      this._element.setAttribute('role', 'dialog');\n\n      this._element.classList.add(CLASS_NAME_SHOW$3);\n\n      const completeCallBack = () => {\n        if (!this._config.scroll) {\n          this._focustrap.activate();\n        }\n\n        EventHandler.trigger(this._element, EVENT_SHOWN$2, {\n          relatedTarget\n        });\n      };\n\n      this._queueCallback(completeCallBack, this._element, true);\n    }\n\n    hide() {\n      if (!this._isShown) {\n        return;\n      }\n\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$2);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      this._focustrap.deactivate();\n\n      this._element.blur();\n\n      this._isShown = false;\n\n      this._element.classList.remove(CLASS_NAME_SHOW$3);\n\n      this._backdrop.hide();\n\n      const completeCallback = () => {\n        this._element.setAttribute('aria-hidden', true);\n\n        this._element.removeAttribute('aria-modal');\n\n        this._element.removeAttribute('role');\n\n        this._element.style.visibility = 'hidden';\n\n        if (!this._config.scroll) {\n          new ScrollBarHelper().reset();\n        }\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN$2);\n      };\n\n      this._queueCallback(completeCallback, this._element, true);\n    }\n\n    dispose() {\n      this._backdrop.dispose();\n\n      this._focustrap.deactivate();\n\n      super.dispose();\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$4,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$5, config, DefaultType$4);\n      return config;\n    }\n\n    _initializeBackDrop() {\n      return new Backdrop({\n        className: CLASS_NAME_BACKDROP,\n        isVisible: this._config.backdrop,\n        isAnimated: true,\n        rootElement: this._element.parentNode,\n        clickCallback: () => this.hide()\n      });\n    }\n\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n\n    _addEventListeners() {\n      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n        if (this._config.keyboard && event.key === ESCAPE_KEY) {\n          this.hide();\n        }\n      });\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Offcanvas.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](this);\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n    const target = getElementFromSelector(this);\n\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    if (isDisabled(this)) {\n      return;\n    }\n\n    EventHandler.one(target, EVENT_HIDDEN$2, () => {\n      // focus on trigger when it is closed\n      if (isVisible(this)) {\n        this.focus();\n      }\n    }); // avoid conflict when clicking a toggler of an offcanvas, while another is open\n\n    const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n\n    if (allReadyOpen && allReadyOpen !== target) {\n      Offcanvas.getInstance(allReadyOpen).hide();\n    }\n\n    const data = Offcanvas.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));\n  enableDismissTrigger(Offcanvas);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  defineJQueryPlugin(Offcanvas);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): util/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const uriAttrs = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  /**\n   * A pattern that recognizes a commonly useful subset of URLs that are safe.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  const DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i;\n\n  const allowedAttribute = (attr, allowedAttributeList) => {\n    const attrName = attr.nodeName.toLowerCase();\n\n    if (allowedAttributeList.includes(attrName)) {\n      if (uriAttrs.has(attrName)) {\n        return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue));\n      }\n\n      return true;\n    }\n\n    const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp); // Check if a regular expression validates the attribute.\n\n    for (let i = 0, len = regExp.length; i < len; i++) {\n      if (regExp[i].test(attrName)) {\n        return true;\n      }\n    }\n\n    return false;\n  };\n\n  const DefaultAllowlist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n  };\n  function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n    if (!unsafeHtml.length) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    const domParser = new window.DOMParser();\n    const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    const allowlistKeys = Object.keys(allowList);\n    const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n\n    for (let i = 0, len = elements.length; i < len; i++) {\n      const el = elements[i];\n      const elName = el.nodeName.toLowerCase();\n\n      if (!allowlistKeys.includes(elName)) {\n        el.remove();\n        continue;\n      }\n\n      const attributeList = [].concat(...el.attributes);\n      const allowedAttributes = [].concat(allowList['*'] || [], allowList[elName] || []);\n      attributeList.forEach(attr => {\n        if (!allowedAttribute(attr, allowedAttributes)) {\n          el.removeAttribute(attr.nodeName);\n        }\n      });\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): tooltip.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$4 = 'tooltip';\n  const DATA_KEY$4 = 'bs.tooltip';\n  const EVENT_KEY$4 = `.${DATA_KEY$4}`;\n  const CLASS_PREFIX$1 = 'bs-tooltip';\n  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\n  const DefaultType$3 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(array|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacements: 'array',\n    boundary: '(string|element)',\n    customClass: '(string|function)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    allowList: 'object',\n    popperConfig: '(null|object|function)'\n  };\n  const AttachmentMap = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: isRTL() ? 'left' : 'right',\n    BOTTOM: 'bottom',\n    LEFT: isRTL() ? 'right' : 'left'\n  };\n  const Default$3 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"tooltip-arrow\"></div>' + '<div class=\"tooltip-inner\"></div>' + '</div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: [0, 0],\n    container: false,\n    fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n    boundary: 'clippingParents',\n    customClass: '',\n    sanitize: true,\n    sanitizeFn: null,\n    allowList: DefaultAllowlist,\n    popperConfig: null\n  };\n  const Event$2 = {\n    HIDE: `hide${EVENT_KEY$4}`,\n    HIDDEN: `hidden${EVENT_KEY$4}`,\n    SHOW: `show${EVENT_KEY$4}`,\n    SHOWN: `shown${EVENT_KEY$4}`,\n    INSERTED: `inserted${EVENT_KEY$4}`,\n    CLICK: `click${EVENT_KEY$4}`,\n    FOCUSIN: `focusin${EVENT_KEY$4}`,\n    FOCUSOUT: `focusout${EVENT_KEY$4}`,\n    MOUSEENTER: `mouseenter${EVENT_KEY$4}`,\n    MOUSELEAVE: `mouseleave${EVENT_KEY$4}`\n  };\n  const CLASS_NAME_FADE$2 = 'fade';\n  const CLASS_NAME_MODAL = 'modal';\n  const CLASS_NAME_SHOW$2 = 'show';\n  const HOVER_STATE_SHOW = 'show';\n  const HOVER_STATE_OUT = 'out';\n  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\n  const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\n  const EVENT_MODAL_HIDE = 'hide.bs.modal';\n  const TRIGGER_HOVER = 'hover';\n  const TRIGGER_FOCUS = 'focus';\n  const TRIGGER_CLICK = 'click';\n  const TRIGGER_MANUAL = 'manual';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Tooltip extends BaseComponent {\n    constructor(element, config) {\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n      }\n\n      super(element); // private\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this._config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    static get Default() {\n      return Default$3;\n    }\n\n    static get NAME() {\n      return NAME$4;\n    }\n\n    static get Event() {\n      return Event$2;\n    }\n\n    static get DefaultType() {\n      return DefaultType$3;\n    } // Public\n\n\n    enable() {\n      this._isEnabled = true;\n    }\n\n    disable() {\n      this._isEnabled = false;\n    }\n\n    toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    }\n\n    toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        const context = this._initializeOnDelegatedTarget(event);\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$2)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    }\n\n    dispose() {\n      clearTimeout(this._timeout);\n      EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n\n      if (this.tip) {\n        this.tip.remove();\n      }\n\n      if (this._popper) {\n        this._popper.destroy();\n      }\n\n      super.dispose();\n    }\n\n    show() {\n      if (this._element.style.display === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      if (!(this.isWithContent() && this._isEnabled)) {\n        return;\n      }\n\n      const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW);\n      const shadowRoot = findShadowRoot(this._element);\n      const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element);\n\n      if (showEvent.defaultPrevented || !isInTheDom) {\n        return;\n      }\n\n      const tip = this.getTipElement();\n      const tipId = getUID(this.constructor.NAME);\n      tip.setAttribute('id', tipId);\n\n      this._element.setAttribute('aria-describedby', tipId);\n\n      if (this._config.animation) {\n        tip.classList.add(CLASS_NAME_FADE$2);\n      }\n\n      const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;\n\n      const attachment = this._getAttachment(placement);\n\n      this._addAttachmentClass(attachment);\n\n      const {\n        container\n      } = this._config;\n      Data.set(tip, this.constructor.DATA_KEY, this);\n\n      if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n        container.append(tip);\n        EventHandler.trigger(this._element, this.constructor.Event.INSERTED);\n      }\n\n      if (this._popper) {\n        this._popper.update();\n      } else {\n        this._popper = createPopper(this._element, tip, this._getPopperConfig(attachment));\n      }\n\n      tip.classList.add(CLASS_NAME_SHOW$2);\n\n      const customClass = this._resolvePossibleFunction(this._config.customClass);\n\n      if (customClass) {\n        tip.classList.add(...customClass.split(' '));\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement) {\n        [].concat(...document.body.children).forEach(element => {\n          EventHandler.on(element, 'mouseover', noop);\n        });\n      }\n\n      const complete = () => {\n        const prevHoverState = this._hoverState;\n        this._hoverState = null;\n        EventHandler.trigger(this._element, this.constructor.Event.SHOWN);\n\n        if (prevHoverState === HOVER_STATE_OUT) {\n          this._leave(null, this);\n        }\n      };\n\n      const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);\n\n      this._queueCallback(complete, this.tip, isAnimated);\n    }\n\n    hide() {\n      if (!this._popper) {\n        return;\n      }\n\n      const tip = this.getTipElement();\n\n      const complete = () => {\n        if (this._isWithActiveTrigger()) {\n          return;\n        }\n\n        if (this._hoverState !== HOVER_STATE_SHOW) {\n          tip.remove();\n        }\n\n        this._cleanTipClass();\n\n        this._element.removeAttribute('aria-describedby');\n\n        EventHandler.trigger(this._element, this.constructor.Event.HIDDEN);\n\n        if (this._popper) {\n          this._popper.destroy();\n\n          this._popper = null;\n        }\n      };\n\n      const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        [].concat(...document.body.children).forEach(element => EventHandler.off(element, 'mouseover', noop));\n      }\n\n      this._activeTrigger[TRIGGER_CLICK] = false;\n      this._activeTrigger[TRIGGER_FOCUS] = false;\n      this._activeTrigger[TRIGGER_HOVER] = false;\n      const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);\n\n      this._queueCallback(complete, this.tip, isAnimated);\n\n      this._hoverState = '';\n    }\n\n    update() {\n      if (this._popper !== null) {\n        this._popper.update();\n      }\n    } // Protected\n\n\n    isWithContent() {\n      return Boolean(this.getTitle());\n    }\n\n    getTipElement() {\n      if (this.tip) {\n        return this.tip;\n      }\n\n      const element = document.createElement('div');\n      element.innerHTML = this._config.template;\n      const tip = element.children[0];\n      this.setContent(tip);\n      tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n      this.tip = tip;\n      return this.tip;\n    }\n\n    setContent(tip) {\n      this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER);\n    }\n\n    _sanitizeAndSetContent(template, content, selector) {\n      const templateElement = SelectorEngine.findOne(selector, template);\n\n      if (!content && templateElement) {\n        templateElement.remove();\n        return;\n      } // we use append for html objects to maintain js events\n\n\n      this.setElementContent(templateElement, content);\n    }\n\n    setElementContent(element, content) {\n      if (element === null) {\n        return;\n      }\n\n      if (isElement$1(content)) {\n        content = getElement(content); // content is a DOM node or a jQuery\n\n        if (this._config.html) {\n          if (content.parentNode !== element) {\n            element.innerHTML = '';\n            element.append(content);\n          }\n        } else {\n          element.textContent = content.textContent;\n        }\n\n        return;\n      }\n\n      if (this._config.html) {\n        if (this._config.sanitize) {\n          content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn);\n        }\n\n        element.innerHTML = content;\n      } else {\n        element.textContent = content;\n      }\n    }\n\n    getTitle() {\n      const title = this._element.getAttribute('data-bs-original-title') || this._config.title;\n\n      return this._resolvePossibleFunction(title);\n    }\n\n    updateAttachment(attachment) {\n      if (attachment === 'right') {\n        return 'end';\n      }\n\n      if (attachment === 'left') {\n        return 'start';\n      }\n\n      return attachment;\n    } // Private\n\n\n    _initializeOnDelegatedTarget(event, context) {\n      return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n    }\n\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n\n      if (typeof offset === 'string') {\n        return offset.split(',').map(val => Number.parseInt(val, 10));\n      }\n\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n\n      return offset;\n    }\n\n    _resolvePossibleFunction(content) {\n      return typeof content === 'function' ? content.call(this._element) : content;\n    }\n\n    _getPopperConfig(attachment) {\n      const defaultBsPopperConfig = {\n        placement: attachment,\n        modifiers: [{\n          name: 'flip',\n          options: {\n            fallbackPlacements: this._config.fallbackPlacements\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }, {\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'arrow',\n          options: {\n            element: `.${this.constructor.NAME}-arrow`\n          }\n        }, {\n          name: 'onChange',\n          enabled: true,\n          phase: 'afterWrite',\n          fn: data => this._handlePopperPlacementChange(data)\n        }],\n        onFirstUpdate: data => {\n          if (data.options.placement !== data.placement) {\n            this._handlePopperPlacementChange(data);\n          }\n        }\n      };\n      return { ...defaultBsPopperConfig,\n        ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n      };\n    }\n\n    _addAttachmentClass(attachment) {\n      this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`);\n    }\n\n    _getAttachment(placement) {\n      return AttachmentMap[placement.toUpperCase()];\n    }\n\n    _setListeners() {\n      const triggers = this._config.trigger.split(' ');\n\n      triggers.forEach(trigger => {\n        if (trigger === 'click') {\n          EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event));\n        } else if (trigger !== TRIGGER_MANUAL) {\n          const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN;\n          const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT;\n          EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event));\n          EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event));\n        }\n      });\n\n      this._hideModalHandler = () => {\n        if (this._element) {\n          this.hide();\n        }\n      };\n\n      EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n\n      if (this._config.selector) {\n        this._config = { ...this._config,\n          trigger: 'manual',\n          selector: ''\n        };\n      } else {\n        this._fixTitle();\n      }\n    }\n\n    _fixTitle() {\n      const title = this._element.getAttribute('title');\n\n      const originalTitleType = typeof this._element.getAttribute('data-bs-original-title');\n\n      if (title || originalTitleType !== 'string') {\n        this._element.setAttribute('data-bs-original-title', title || '');\n\n        if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n          this._element.setAttribute('aria-label', title);\n        }\n\n        this._element.setAttribute('title', '');\n      }\n    }\n\n    _enter(event, context) {\n      context = this._initializeOnDelegatedTarget(event, context);\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n      }\n\n      if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$2) || context._hoverState === HOVER_STATE_SHOW) {\n        context._hoverState = HOVER_STATE_SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HOVER_STATE_SHOW;\n\n      if (!context._config.delay || !context._config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(() => {\n        if (context._hoverState === HOVER_STATE_SHOW) {\n          context.show();\n        }\n      }, context._config.delay.show);\n    }\n\n    _leave(event, context) {\n      context = this._initializeOnDelegatedTarget(event, context);\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HOVER_STATE_OUT;\n\n      if (!context._config.delay || !context._config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(() => {\n        if (context._hoverState === HOVER_STATE_OUT) {\n          context.hide();\n        }\n      }, context._config.delay.hide);\n    }\n\n    _isWithActiveTrigger() {\n      for (const trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    _getConfig(config) {\n      const dataAttributes = Manipulator.getDataAttributes(this._element);\n      Object.keys(dataAttributes).forEach(dataAttr => {\n        if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = { ...this.constructor.Default,\n        ...dataAttributes,\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      config.container = config.container === false ? document.body : getElement(config.container);\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn);\n      }\n\n      return config;\n    }\n\n    _getDelegateConfig() {\n      const config = {};\n\n      for (const key in this._config) {\n        if (this.constructor.Default[key] !== this._config[key]) {\n          config[key] = this._config[key];\n        }\n      } // In the future can be replaced with:\n      // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n      // `Object.fromEntries(keysWithDifferentValues)`\n\n\n      return config;\n    }\n\n    _cleanTipClass() {\n      const tip = this.getTipElement();\n      const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g');\n      const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));\n      }\n    }\n\n    _getBasicClassPrefix() {\n      return CLASS_PREFIX$1;\n    }\n\n    _handlePopperPlacementChange(popperData) {\n      const {\n        state\n      } = popperData;\n\n      if (!state) {\n        return;\n      }\n\n      this.tip = state.elements.popper;\n\n      this._cleanTipClass();\n\n      this._addAttachmentClass(this._getAttachment(state.placement));\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tooltip.getOrCreateInstance(this, config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Tooltip to jQuery only if jQuery is present\n   */\n\n\n  defineJQueryPlugin(Tooltip);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): popover.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$3 = 'popover';\n  const DATA_KEY$3 = 'bs.popover';\n  const EVENT_KEY$3 = `.${DATA_KEY$3}`;\n  const CLASS_PREFIX = 'bs-popover';\n  const Default$2 = { ...Tooltip.Default,\n    placement: 'right',\n    offset: [0, 8],\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"popover-arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div>' + '</div>'\n  };\n  const DefaultType$2 = { ...Tooltip.DefaultType,\n    content: '(string|element|function)'\n  };\n  const Event$1 = {\n    HIDE: `hide${EVENT_KEY$3}`,\n    HIDDEN: `hidden${EVENT_KEY$3}`,\n    SHOW: `show${EVENT_KEY$3}`,\n    SHOWN: `shown${EVENT_KEY$3}`,\n    INSERTED: `inserted${EVENT_KEY$3}`,\n    CLICK: `click${EVENT_KEY$3}`,\n    FOCUSIN: `focusin${EVENT_KEY$3}`,\n    FOCUSOUT: `focusout${EVENT_KEY$3}`,\n    MOUSEENTER: `mouseenter${EVENT_KEY$3}`,\n    MOUSELEAVE: `mouseleave${EVENT_KEY$3}`\n  };\n  const SELECTOR_TITLE = '.popover-header';\n  const SELECTOR_CONTENT = '.popover-body';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Popover extends Tooltip {\n    // Getters\n    static get Default() {\n      return Default$2;\n    }\n\n    static get NAME() {\n      return NAME$3;\n    }\n\n    static get Event() {\n      return Event$1;\n    }\n\n    static get DefaultType() {\n      return DefaultType$2;\n    } // Overrides\n\n\n    isWithContent() {\n      return this.getTitle() || this._getContent();\n    }\n\n    setContent(tip) {\n      this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);\n\n      this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);\n    } // Private\n\n\n    _getContent() {\n      return this._resolvePossibleFunction(this._config.content);\n    }\n\n    _getBasicClassPrefix() {\n      return CLASS_PREFIX;\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Popover.getOrCreateInstance(this, config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Popover to jQuery only if jQuery is present\n   */\n\n\n  defineJQueryPlugin(Popover);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): scrollspy.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$2 = 'scrollspy';\n  const DATA_KEY$2 = 'bs.scrollspy';\n  const EVENT_KEY$2 = `.${DATA_KEY$2}`;\n  const DATA_API_KEY$1 = '.data-api';\n  const Default$1 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  const DefaultType$1 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\n  const EVENT_SCROLL = `scroll${EVENT_KEY$2}`;\n  const EVENT_LOAD_DATA_API = `load${EVENT_KEY$2}${DATA_API_KEY$1}`;\n  const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\n  const CLASS_NAME_ACTIVE$1 = 'active';\n  const SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\n  const SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';\n  const SELECTOR_NAV_LINKS = '.nav-link';\n  const SELECTOR_NAV_ITEMS = '.nav-item';\n  const SELECTOR_LIST_ITEMS = '.list-group-item';\n  const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;\n  const SELECTOR_DROPDOWN$1 = '.dropdown';\n  const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\n  const METHOD_OFFSET = 'offset';\n  const METHOD_POSITION = 'position';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class ScrollSpy extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;\n      this._config = this._getConfig(config);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process());\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    static get Default() {\n      return Default$1;\n    }\n\n    static get NAME() {\n      return NAME$2;\n    } // Public\n\n\n    refresh() {\n      const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;\n      const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target);\n      targets.map(element => {\n        const targetSelector = getSelectorFromElement(element);\n        const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null;\n\n        if (target) {\n          const targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(item => item).sort((a, b) => a[0] - b[0]).forEach(item => {\n        this._offsets.push(item[0]);\n\n        this._targets.push(item[1]);\n      });\n    }\n\n    dispose() {\n      EventHandler.off(this._scrollElement, EVENT_KEY$2);\n      super.dispose();\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$1,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      config.target = getElement(config.target) || document.documentElement;\n      typeCheckConfig(NAME$2, config, DefaultType$1);\n      return config;\n    }\n\n    _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    }\n\n    _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    }\n\n    _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    }\n\n    _process() {\n      const scrollTop = this._getScrollTop() + this._config.offset;\n\n      const scrollHeight = this._getScrollHeight();\n\n      const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        const target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      for (let i = this._offsets.length; i--;) {\n        const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    }\n\n    _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`);\n      const link = SelectorEngine.findOne(queries.join(','), this._config.target);\n      link.classList.add(CLASS_NAME_ACTIVE$1);\n\n      if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n        SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1);\n      } else {\n        SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1).forEach(listGroup => {\n          // Set triggered links parents as active\n          // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n          SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1)); // Handle special case when .nav-link is inside .nav-item\n\n          SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS).forEach(navItem => {\n            SelectorEngine.children(navItem, SELECTOR_NAV_LINKS).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1));\n          });\n        });\n      }\n\n      EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {\n        relatedTarget: target\n      });\n    }\n\n    _clear() {\n      SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target).filter(node => node.classList.contains(CLASS_NAME_ACTIVE$1)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE$1));\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = ScrollSpy.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config]();\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n    SelectorEngine.find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .ScrollSpy to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(ScrollSpy);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): tab.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$1 = 'tab';\n  const DATA_KEY$1 = 'bs.tab';\n  const EVENT_KEY$1 = `.${DATA_KEY$1}`;\n  const DATA_API_KEY = '.data-api';\n  const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;\n  const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;\n  const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;\n  const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}${DATA_API_KEY}`;\n  const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';\n  const CLASS_NAME_ACTIVE = 'active';\n  const CLASS_NAME_FADE$1 = 'fade';\n  const CLASS_NAME_SHOW$1 = 'show';\n  const SELECTOR_DROPDOWN = '.dropdown';\n  const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\n  const SELECTOR_ACTIVE = '.active';\n  const SELECTOR_ACTIVE_UL = ':scope > li > .active';\n  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]';\n  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\n  const SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Tab extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$1;\n    } // Public\n\n\n    show() {\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE)) {\n        return;\n      }\n\n      let previous;\n      const target = getElementFromSelector(this._element);\n\n      const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);\n\n      if (listElement) {\n        const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;\n        previous = SelectorEngine.find(itemSelector, listElement);\n        previous = previous[previous.length - 1];\n      }\n\n      const hideEvent = previous ? EventHandler.trigger(previous, EVENT_HIDE$1, {\n        relatedTarget: this._element\n      }) : null;\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$1, {\n        relatedTarget: previous\n      });\n\n      if (showEvent.defaultPrevented || hideEvent !== null && hideEvent.defaultPrevented) {\n        return;\n      }\n\n      this._activate(this._element, listElement);\n\n      const complete = () => {\n        EventHandler.trigger(previous, EVENT_HIDDEN$1, {\n          relatedTarget: this._element\n        });\n        EventHandler.trigger(this._element, EVENT_SHOWN$1, {\n          relatedTarget: previous\n        });\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    } // Private\n\n\n    _activate(element, container, callback) {\n      const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine.find(SELECTOR_ACTIVE_UL, container) : SelectorEngine.children(container, SELECTOR_ACTIVE);\n      const active = activeElements[0];\n      const isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE$1);\n\n      const complete = () => this._transitionComplete(element, active, callback);\n\n      if (active && isTransitioning) {\n        active.classList.remove(CLASS_NAME_SHOW$1);\n\n        this._queueCallback(complete, element, true);\n      } else {\n        complete();\n      }\n    }\n\n    _transitionComplete(element, active, callback) {\n      if (active) {\n        active.classList.remove(CLASS_NAME_ACTIVE);\n        const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);\n\n        if (dropdownChild) {\n          dropdownChild.classList.remove(CLASS_NAME_ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      element.classList.add(CLASS_NAME_ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      reflow(element);\n\n      if (element.classList.contains(CLASS_NAME_FADE$1)) {\n        element.classList.add(CLASS_NAME_SHOW$1);\n      }\n\n      let parent = element.parentNode;\n\n      if (parent && parent.nodeName === 'LI') {\n        parent = parent.parentNode;\n      }\n\n      if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {\n        const dropdownElement = element.closest(SELECTOR_DROPDOWN);\n\n        if (dropdownElement) {\n          SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement).forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE));\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tab.getOrCreateInstance(this);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    if (isDisabled(this)) {\n      return;\n    }\n\n    const data = Tab.getOrCreateInstance(this);\n    data.show();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Tab to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Tab);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): toast.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME = 'toast';\n  const DATA_KEY = 'bs.toast';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;\n  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;\n  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;\n  const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;\n  const EVENT_HIDE = `hide${EVENT_KEY}`;\n  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n  const EVENT_SHOW = `show${EVENT_KEY}`;\n  const EVENT_SHOWN = `shown${EVENT_KEY}`;\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility\n\n  const CLASS_NAME_SHOW = 'show';\n  const CLASS_NAME_SHOWING = 'showing';\n  const DefaultType = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  const Default = {\n    animation: true,\n    autohide: true,\n    delay: 5000\n  };\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Toast extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._config = this._getConfig(config);\n      this._timeout = null;\n      this._hasMouseInteraction = false;\n      this._hasKeyboardInteraction = false;\n\n      this._setListeners();\n    } // Getters\n\n\n    static get DefaultType() {\n      return DefaultType;\n    }\n\n    static get Default() {\n      return Default;\n    }\n\n    static get NAME() {\n      return NAME;\n    } // Public\n\n\n    show() {\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      this._clearTimeout();\n\n      if (this._config.animation) {\n        this._element.classList.add(CLASS_NAME_FADE);\n      }\n\n      const complete = () => {\n        this._element.classList.remove(CLASS_NAME_SHOWING);\n\n        EventHandler.trigger(this._element, EVENT_SHOWN);\n\n        this._maybeScheduleHide();\n      };\n\n      this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated\n\n\n      reflow(this._element);\n\n      this._element.classList.add(CLASS_NAME_SHOW);\n\n      this._element.classList.add(CLASS_NAME_SHOWING);\n\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n\n    hide() {\n      if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n        return;\n      }\n\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      const complete = () => {\n        this._element.classList.add(CLASS_NAME_HIDE); // @deprecated\n\n\n        this._element.classList.remove(CLASS_NAME_SHOWING);\n\n        this._element.classList.remove(CLASS_NAME_SHOW);\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN);\n      };\n\n      this._element.classList.add(CLASS_NAME_SHOWING);\n\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n\n    dispose() {\n      this._clearTimeout();\n\n      if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n        this._element.classList.remove(CLASS_NAME_SHOW);\n      }\n\n      super.dispose();\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      typeCheckConfig(NAME, config, this.constructor.DefaultType);\n      return config;\n    }\n\n    _maybeScheduleHide() {\n      if (!this._config.autohide) {\n        return;\n      }\n\n      if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n        return;\n      }\n\n      this._timeout = setTimeout(() => {\n        this.hide();\n      }, this._config.delay);\n    }\n\n    _onInteraction(event, isInteracting) {\n      switch (event.type) {\n        case 'mouseover':\n        case 'mouseout':\n          this._hasMouseInteraction = isInteracting;\n          break;\n\n        case 'focusin':\n        case 'focusout':\n          this._hasKeyboardInteraction = isInteracting;\n          break;\n      }\n\n      if (isInteracting) {\n        this._clearTimeout();\n\n        return;\n      }\n\n      const nextElement = event.relatedTarget;\n\n      if (this._element === nextElement || this._element.contains(nextElement)) {\n        return;\n      }\n\n      this._maybeScheduleHide();\n    }\n\n    _setListeners() {\n      EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));\n      EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));\n    }\n\n    _clearTimeout() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Toast.getOrCreateInstance(this, config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config](this);\n        }\n      });\n    }\n\n  }\n\n  enableDismissTrigger(Toast);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Toast to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Toast);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): index.umd.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  var index_umd = {\n    Alert,\n    Button,\n    Carousel,\n    Collapse,\n    Dropdown,\n    Modal,\n    Offcanvas,\n    Popover,\n    ScrollSpy,\n    Tab,\n    Toast,\n    Tooltip\n  };\n\n  return index_umd;\n\n})));\n//# sourceMappingURL=bootstrap.bundle.js.map\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/bootstrap/dist/js/bootstrap.esm.js",
    "content": "/*!\n  * Bootstrap v5.1.0 (https://getbootstrap.com/)\n  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\nimport * as Popper from '@popperjs/core';\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\nconst MAX_UID = 1000000;\nconst MILLISECONDS_MULTIPLIER = 1000;\nconst TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\nconst toType = obj => {\n  if (obj === null || obj === undefined) {\n    return `${obj}`;\n  }\n\n  return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n};\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\n\nconst getUID = prefix => {\n  do {\n    prefix += Math.floor(Math.random() * MAX_UID);\n  } while (document.getElementById(prefix));\n\n  return prefix;\n};\n\nconst getSelector = element => {\n  let selector = element.getAttribute('data-bs-target');\n\n  if (!selector || selector === '#') {\n    let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,\n    // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n    // `document.querySelector` will rightfully complain it is invalid.\n    // See https://github.com/twbs/bootstrap/issues/32273\n\n    if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {\n      return null;\n    } // Just in case some CMS puts out a full URL with the anchor appended\n\n\n    if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n      hrefAttr = `#${hrefAttr.split('#')[1]}`;\n    }\n\n    selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;\n  }\n\n  return selector;\n};\n\nconst getSelectorFromElement = element => {\n  const selector = getSelector(element);\n\n  if (selector) {\n    return document.querySelector(selector) ? selector : null;\n  }\n\n  return null;\n};\n\nconst getElementFromSelector = element => {\n  const selector = getSelector(element);\n  return selector ? document.querySelector(selector) : null;\n};\n\nconst getTransitionDurationFromElement = element => {\n  if (!element) {\n    return 0;\n  } // Get transition-duration of the element\n\n\n  let {\n    transitionDuration,\n    transitionDelay\n  } = window.getComputedStyle(element);\n  const floatTransitionDuration = Number.parseFloat(transitionDuration);\n  const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n  if (!floatTransitionDuration && !floatTransitionDelay) {\n    return 0;\n  } // If multiple durations are defined, take the first\n\n\n  transitionDuration = transitionDuration.split(',')[0];\n  transitionDelay = transitionDelay.split(',')[0];\n  return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n};\n\nconst triggerTransitionEnd = element => {\n  element.dispatchEvent(new Event(TRANSITION_END));\n};\n\nconst isElement = obj => {\n  if (!obj || typeof obj !== 'object') {\n    return false;\n  }\n\n  if (typeof obj.jquery !== 'undefined') {\n    obj = obj[0];\n  }\n\n  return typeof obj.nodeType !== 'undefined';\n};\n\nconst getElement = obj => {\n  if (isElement(obj)) {\n    // it's a jQuery object or a node element\n    return obj.jquery ? obj[0] : obj;\n  }\n\n  if (typeof obj === 'string' && obj.length > 0) {\n    return document.querySelector(obj);\n  }\n\n  return null;\n};\n\nconst typeCheckConfig = (componentName, config, configTypes) => {\n  Object.keys(configTypes).forEach(property => {\n    const expectedTypes = configTypes[property];\n    const value = config[property];\n    const valueType = value && isElement(value) ? 'element' : toType(value);\n\n    if (!new RegExp(expectedTypes).test(valueType)) {\n      throw new TypeError(`${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n    }\n  });\n};\n\nconst isVisible = element => {\n  if (!isElement(element) || element.getClientRects().length === 0) {\n    return false;\n  }\n\n  return getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n};\n\nconst isDisabled = element => {\n  if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n    return true;\n  }\n\n  if (element.classList.contains('disabled')) {\n    return true;\n  }\n\n  if (typeof element.disabled !== 'undefined') {\n    return element.disabled;\n  }\n\n  return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n};\n\nconst findShadowRoot = element => {\n  if (!document.documentElement.attachShadow) {\n    return null;\n  } // Can find the shadow root otherwise it'll return the document\n\n\n  if (typeof element.getRootNode === 'function') {\n    const root = element.getRootNode();\n    return root instanceof ShadowRoot ? root : null;\n  }\n\n  if (element instanceof ShadowRoot) {\n    return element;\n  } // when we don't find a shadow root\n\n\n  if (!element.parentNode) {\n    return null;\n  }\n\n  return findShadowRoot(element.parentNode);\n};\n\nconst noop = () => {};\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\n\n\nconst reflow = element => {\n  // eslint-disable-next-line no-unused-expressions\n  element.offsetHeight;\n};\n\nconst getjQuery = () => {\n  const {\n    jQuery\n  } = window;\n\n  if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n    return jQuery;\n  }\n\n  return null;\n};\n\nconst DOMContentLoadedCallbacks = [];\n\nconst onDOMContentLoaded = callback => {\n  if (document.readyState === 'loading') {\n    // add listener on the first call when the document is in loading state\n    if (!DOMContentLoadedCallbacks.length) {\n      document.addEventListener('DOMContentLoaded', () => {\n        DOMContentLoadedCallbacks.forEach(callback => callback());\n      });\n    }\n\n    DOMContentLoadedCallbacks.push(callback);\n  } else {\n    callback();\n  }\n};\n\nconst isRTL = () => document.documentElement.dir === 'rtl';\n\nconst defineJQueryPlugin = plugin => {\n  onDOMContentLoaded(() => {\n    const $ = getjQuery();\n    /* istanbul ignore if */\n\n    if ($) {\n      const name = plugin.NAME;\n      const JQUERY_NO_CONFLICT = $.fn[name];\n      $.fn[name] = plugin.jQueryInterface;\n      $.fn[name].Constructor = plugin;\n\n      $.fn[name].noConflict = () => {\n        $.fn[name] = JQUERY_NO_CONFLICT;\n        return plugin.jQueryInterface;\n      };\n    }\n  });\n};\n\nconst execute = callback => {\n  if (typeof callback === 'function') {\n    callback();\n  }\n};\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n  if (!waitForTransition) {\n    execute(callback);\n    return;\n  }\n\n  const durationPadding = 5;\n  const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n  let called = false;\n\n  const handler = ({\n    target\n  }) => {\n    if (target !== transitionElement) {\n      return;\n    }\n\n    called = true;\n    transitionElement.removeEventListener(TRANSITION_END, handler);\n    execute(callback);\n  };\n\n  transitionElement.addEventListener(TRANSITION_END, handler);\n  setTimeout(() => {\n    if (!called) {\n      triggerTransitionEnd(transitionElement);\n    }\n  }, emulatedDuration);\n};\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list    The list of elements\n * @param activeElement   The active element\n * @param shouldGetNext   Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\n\n\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n  let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n\n  if (index === -1) {\n    return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0];\n  }\n\n  const listLength = list.length;\n  index += shouldGetNext ? 1 : -1;\n\n  if (isCycleAllowed) {\n    index = (index + listLength) % listLength;\n  }\n\n  return list[Math.max(0, Math.min(index, listLength - 1))];\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\nconst stripNameRegex = /\\..*/;\nconst stripUidRegex = /::\\d+$/;\nconst eventRegistry = {}; // Events storage\n\nlet uidEvent = 1;\nconst customEvents = {\n  mouseenter: 'mouseover',\n  mouseleave: 'mouseout'\n};\nconst customEventsRegex = /^(mouseenter|mouseleave)/i;\nconst nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n/**\n * ------------------------------------------------------------------------\n * Private methods\n * ------------------------------------------------------------------------\n */\n\nfunction getUidEvent(element, uid) {\n  return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n}\n\nfunction getEvent(element) {\n  const uid = getUidEvent(element);\n  element.uidEvent = uid;\n  eventRegistry[uid] = eventRegistry[uid] || {};\n  return eventRegistry[uid];\n}\n\nfunction bootstrapHandler(element, fn) {\n  return function handler(event) {\n    event.delegateTarget = element;\n\n    if (handler.oneOff) {\n      EventHandler.off(element, event.type, fn);\n    }\n\n    return fn.apply(element, [event]);\n  };\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n  return function handler(event) {\n    const domElements = element.querySelectorAll(selector);\n\n    for (let {\n      target\n    } = event; target && target !== this; target = target.parentNode) {\n      for (let i = domElements.length; i--;) {\n        if (domElements[i] === target) {\n          event.delegateTarget = target;\n\n          if (handler.oneOff) {\n            // eslint-disable-next-line unicorn/consistent-destructuring\n            EventHandler.off(element, event.type, selector, fn);\n          }\n\n          return fn.apply(target, [event]);\n        }\n      }\n    } // To please ESLint\n\n\n    return null;\n  };\n}\n\nfunction findHandler(events, handler, delegationSelector = null) {\n  const uidEventList = Object.keys(events);\n\n  for (let i = 0, len = uidEventList.length; i < len; i++) {\n    const event = events[uidEventList[i]];\n\n    if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n      return event;\n    }\n  }\n\n  return null;\n}\n\nfunction normalizeParams(originalTypeEvent, handler, delegationFn) {\n  const delegation = typeof handler === 'string';\n  const originalHandler = delegation ? delegationFn : handler;\n  let typeEvent = getTypeEvent(originalTypeEvent);\n  const isNative = nativeEvents.has(typeEvent);\n\n  if (!isNative) {\n    typeEvent = originalTypeEvent;\n  }\n\n  return [delegation, originalHandler, typeEvent];\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n  if (typeof originalTypeEvent !== 'string' || !element) {\n    return;\n  }\n\n  if (!handler) {\n    handler = delegationFn;\n    delegationFn = null;\n  } // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n  // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n\n\n  if (customEventsRegex.test(originalTypeEvent)) {\n    const wrapFn = fn => {\n      return function (event) {\n        if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n          return fn.call(this, event);\n        }\n      };\n    };\n\n    if (delegationFn) {\n      delegationFn = wrapFn(delegationFn);\n    } else {\n      handler = wrapFn(handler);\n    }\n  }\n\n  const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);\n  const events = getEvent(element);\n  const handlers = events[typeEvent] || (events[typeEvent] = {});\n  const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null);\n\n  if (previousFn) {\n    previousFn.oneOff = previousFn.oneOff && oneOff;\n    return;\n  }\n\n  const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''));\n  const fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler);\n  fn.delegationSelector = delegation ? handler : null;\n  fn.originalHandler = originalHandler;\n  fn.oneOff = oneOff;\n  fn.uidEvent = uid;\n  handlers[uid] = fn;\n  element.addEventListener(typeEvent, fn, delegation);\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n  const fn = findHandler(events[typeEvent], handler, delegationSelector);\n\n  if (!fn) {\n    return;\n  }\n\n  element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n  delete events[typeEvent][fn.uidEvent];\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n  const storeElementEvent = events[typeEvent] || {};\n  Object.keys(storeElementEvent).forEach(handlerKey => {\n    if (handlerKey.includes(namespace)) {\n      const event = storeElementEvent[handlerKey];\n      removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);\n    }\n  });\n}\n\nfunction getTypeEvent(event) {\n  // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n  event = event.replace(stripNameRegex, '');\n  return customEvents[event] || event;\n}\n\nconst EventHandler = {\n  on(element, event, handler, delegationFn) {\n    addHandler(element, event, handler, delegationFn, false);\n  },\n\n  one(element, event, handler, delegationFn) {\n    addHandler(element, event, handler, delegationFn, true);\n  },\n\n  off(element, originalTypeEvent, handler, delegationFn) {\n    if (typeof originalTypeEvent !== 'string' || !element) {\n      return;\n    }\n\n    const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);\n    const inNamespace = typeEvent !== originalTypeEvent;\n    const events = getEvent(element);\n    const isNamespace = originalTypeEvent.startsWith('.');\n\n    if (typeof originalHandler !== 'undefined') {\n      // Simplest case: handler is passed, remove that listener ONLY.\n      if (!events || !events[typeEvent]) {\n        return;\n      }\n\n      removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null);\n      return;\n    }\n\n    if (isNamespace) {\n      Object.keys(events).forEach(elementEvent => {\n        removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n      });\n    }\n\n    const storeElementEvent = events[typeEvent] || {};\n    Object.keys(storeElementEvent).forEach(keyHandlers => {\n      const handlerKey = keyHandlers.replace(stripUidRegex, '');\n\n      if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n        const event = storeElementEvent[keyHandlers];\n        removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);\n      }\n    });\n  },\n\n  trigger(element, event, args) {\n    if (typeof event !== 'string' || !element) {\n      return null;\n    }\n\n    const $ = getjQuery();\n    const typeEvent = getTypeEvent(event);\n    const inNamespace = event !== typeEvent;\n    const isNative = nativeEvents.has(typeEvent);\n    let jQueryEvent;\n    let bubbles = true;\n    let nativeDispatch = true;\n    let defaultPrevented = false;\n    let evt = null;\n\n    if (inNamespace && $) {\n      jQueryEvent = $.Event(event, args);\n      $(element).trigger(jQueryEvent);\n      bubbles = !jQueryEvent.isPropagationStopped();\n      nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n      defaultPrevented = jQueryEvent.isDefaultPrevented();\n    }\n\n    if (isNative) {\n      evt = document.createEvent('HTMLEvents');\n      evt.initEvent(typeEvent, bubbles, true);\n    } else {\n      evt = new CustomEvent(event, {\n        bubbles,\n        cancelable: true\n      });\n    } // merge custom information in our event\n\n\n    if (typeof args !== 'undefined') {\n      Object.keys(args).forEach(key => {\n        Object.defineProperty(evt, key, {\n          get() {\n            return args[key];\n          }\n\n        });\n      });\n    }\n\n    if (defaultPrevented) {\n      evt.preventDefault();\n    }\n\n    if (nativeDispatch) {\n      element.dispatchEvent(evt);\n    }\n\n    if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n      jQueryEvent.preventDefault();\n    }\n\n    return evt;\n  }\n\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\nconst elementMap = new Map();\nvar Data = {\n  set(element, key, instance) {\n    if (!elementMap.has(element)) {\n      elementMap.set(element, new Map());\n    }\n\n    const instanceMap = elementMap.get(element); // make it clear we only want one instance per element\n    // can be removed later when multiple key/instances are fine to be used\n\n    if (!instanceMap.has(key) && instanceMap.size !== 0) {\n      // eslint-disable-next-line no-console\n      console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n      return;\n    }\n\n    instanceMap.set(key, instance);\n  },\n\n  get(element, key) {\n    if (elementMap.has(element)) {\n      return elementMap.get(element).get(key) || null;\n    }\n\n    return null;\n  },\n\n  remove(element, key) {\n    if (!elementMap.has(element)) {\n      return;\n    }\n\n    const instanceMap = elementMap.get(element);\n    instanceMap.delete(key); // free up element references if there are no instances left for an element\n\n    if (instanceMap.size === 0) {\n      elementMap.delete(element);\n    }\n  }\n\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst VERSION = '5.1.0';\n\nclass BaseComponent {\n  constructor(element) {\n    element = getElement(element);\n\n    if (!element) {\n      return;\n    }\n\n    this._element = element;\n    Data.set(this._element, this.constructor.DATA_KEY, this);\n  }\n\n  dispose() {\n    Data.remove(this._element, this.constructor.DATA_KEY);\n    EventHandler.off(this._element, this.constructor.EVENT_KEY);\n    Object.getOwnPropertyNames(this).forEach(propertyName => {\n      this[propertyName] = null;\n    });\n  }\n\n  _queueCallback(callback, element, isAnimated = true) {\n    executeAfterTransition(callback, element, isAnimated);\n  }\n  /** Static */\n\n\n  static getInstance(element) {\n    return Data.get(getElement(element), this.DATA_KEY);\n  }\n\n  static getOrCreateInstance(element, config = {}) {\n    return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n  }\n\n  static get VERSION() {\n    return VERSION;\n  }\n\n  static get NAME() {\n    throw new Error('You have to implement the static method \"NAME\", for each component!');\n  }\n\n  static get DATA_KEY() {\n    return `bs.${this.NAME}`;\n  }\n\n  static get EVENT_KEY() {\n    return `.${this.DATA_KEY}`;\n  }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n  const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n  const name = component.NAME;\n  EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    if (isDisabled(this)) {\n      return;\n    }\n\n    const target = getElementFromSelector(this) || this.closest(`.${name}`);\n    const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n\n    instance[method]();\n  });\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME$d = 'alert';\nconst DATA_KEY$c = 'bs.alert';\nconst EVENT_KEY$c = `.${DATA_KEY$c}`;\nconst EVENT_CLOSE = `close${EVENT_KEY$c}`;\nconst EVENT_CLOSED = `closed${EVENT_KEY$c}`;\nconst CLASS_NAME_FADE$5 = 'fade';\nconst CLASS_NAME_SHOW$8 = 'show';\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Alert extends BaseComponent {\n  // Getters\n  static get NAME() {\n    return NAME$d;\n  } // Public\n\n\n  close() {\n    const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n\n    if (closeEvent.defaultPrevented) {\n      return;\n    }\n\n    this._element.classList.remove(CLASS_NAME_SHOW$8);\n\n    const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n\n    this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n  } // Private\n\n\n  _destroyElement() {\n    this._element.remove();\n\n    EventHandler.trigger(this._element, EVENT_CLOSED);\n    this.dispose();\n  } // Static\n\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Alert.getOrCreateInstance(this);\n\n      if (typeof config !== 'string') {\n        return;\n      }\n\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n\n      data[config](this);\n    });\n  }\n\n}\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\nenableDismissTrigger(Alert, 'close');\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Alert to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Alert);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME$c = 'button';\nconst DATA_KEY$b = 'bs.button';\nconst EVENT_KEY$b = `.${DATA_KEY$b}`;\nconst DATA_API_KEY$7 = '.data-api';\nconst CLASS_NAME_ACTIVE$3 = 'active';\nconst SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\nconst EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$b}${DATA_API_KEY$7}`;\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Button extends BaseComponent {\n  // Getters\n  static get NAME() {\n    return NAME$c;\n  } // Public\n\n\n  toggle() {\n    // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n    this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n  } // Static\n\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Button.getOrCreateInstance(this);\n\n      if (config === 'toggle') {\n        data[config]();\n      }\n    });\n  }\n\n}\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n  event.preventDefault();\n  const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n  const data = Button.getOrCreateInstance(button);\n  data.toggle();\n});\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Button to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Button);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\nfunction normalizeData(val) {\n  if (val === 'true') {\n    return true;\n  }\n\n  if (val === 'false') {\n    return false;\n  }\n\n  if (val === Number(val).toString()) {\n    return Number(val);\n  }\n\n  if (val === '' || val === 'null') {\n    return null;\n  }\n\n  return val;\n}\n\nfunction normalizeDataKey(key) {\n  return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n}\n\nconst Manipulator = {\n  setDataAttribute(element, key, value) {\n    element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n  },\n\n  removeDataAttribute(element, key) {\n    element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n  },\n\n  getDataAttributes(element) {\n    if (!element) {\n      return {};\n    }\n\n    const attributes = {};\n    Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => {\n      let pureKey = key.replace(/^bs/, '');\n      pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n      attributes[pureKey] = normalizeData(element.dataset[key]);\n    });\n    return attributes;\n  },\n\n  getDataAttribute(element, key) {\n    return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n  },\n\n  offset(element) {\n    const rect = element.getBoundingClientRect();\n    return {\n      top: rect.top + window.pageYOffset,\n      left: rect.left + window.pageXOffset\n    };\n  },\n\n  position(element) {\n    return {\n      top: element.offsetTop,\n      left: element.offsetLeft\n    };\n  }\n\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\nconst NODE_TEXT = 3;\nconst SelectorEngine = {\n  find(selector, element = document.documentElement) {\n    return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n  },\n\n  findOne(selector, element = document.documentElement) {\n    return Element.prototype.querySelector.call(element, selector);\n  },\n\n  children(element, selector) {\n    return [].concat(...element.children).filter(child => child.matches(selector));\n  },\n\n  parents(element, selector) {\n    const parents = [];\n    let ancestor = element.parentNode;\n\n    while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n      if (ancestor.matches(selector)) {\n        parents.push(ancestor);\n      }\n\n      ancestor = ancestor.parentNode;\n    }\n\n    return parents;\n  },\n\n  prev(element, selector) {\n    let previous = element.previousElementSibling;\n\n    while (previous) {\n      if (previous.matches(selector)) {\n        return [previous];\n      }\n\n      previous = previous.previousElementSibling;\n    }\n\n    return [];\n  },\n\n  next(element, selector) {\n    let next = element.nextElementSibling;\n\n    while (next) {\n      if (next.matches(selector)) {\n        return [next];\n      }\n\n      next = next.nextElementSibling;\n    }\n\n    return [];\n  },\n\n  focusableChildren(element) {\n    const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ');\n    return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n  }\n\n};\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME$b = 'carousel';\nconst DATA_KEY$a = 'bs.carousel';\nconst EVENT_KEY$a = `.${DATA_KEY$a}`;\nconst DATA_API_KEY$6 = '.data-api';\nconst ARROW_LEFT_KEY = 'ArrowLeft';\nconst ARROW_RIGHT_KEY = 'ArrowRight';\nconst TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\nconst SWIPE_THRESHOLD = 40;\nconst Default$a = {\n  interval: 5000,\n  keyboard: true,\n  slide: false,\n  pause: 'hover',\n  wrap: true,\n  touch: true\n};\nconst DefaultType$a = {\n  interval: '(number|boolean)',\n  keyboard: 'boolean',\n  slide: '(boolean|string)',\n  pause: '(string|boolean)',\n  wrap: 'boolean',\n  touch: 'boolean'\n};\nconst ORDER_NEXT = 'next';\nconst ORDER_PREV = 'prev';\nconst DIRECTION_LEFT = 'left';\nconst DIRECTION_RIGHT = 'right';\nconst KEY_TO_DIRECTION = {\n  [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n  [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n};\nconst EVENT_SLIDE = `slide${EVENT_KEY$a}`;\nconst EVENT_SLID = `slid${EVENT_KEY$a}`;\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY$a}`;\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$a}`;\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$a}`;\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY$a}`;\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$a}`;\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY$a}`;\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$a}`;\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY$a}`;\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`;\nconst EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$a}${DATA_API_KEY$6}`;\nconst EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\nconst CLASS_NAME_CAROUSEL = 'carousel';\nconst CLASS_NAME_ACTIVE$2 = 'active';\nconst CLASS_NAME_SLIDE = 'slide';\nconst CLASS_NAME_END = 'carousel-item-end';\nconst CLASS_NAME_START = 'carousel-item-start';\nconst CLASS_NAME_NEXT = 'carousel-item-next';\nconst CLASS_NAME_PREV = 'carousel-item-prev';\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event';\nconst SELECTOR_ACTIVE$1 = '.active';\nconst SELECTOR_ACTIVE_ITEM = '.active.carousel-item';\nconst SELECTOR_ITEM = '.carousel-item';\nconst SELECTOR_ITEM_IMG = '.carousel-item img';\nconst SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';\nconst SELECTOR_INDICATORS = '.carousel-indicators';\nconst SELECTOR_INDICATOR = '[data-bs-target]';\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\nconst POINTER_TYPE_TOUCH = 'touch';\nconst POINTER_TYPE_PEN = 'pen';\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Carousel extends BaseComponent {\n  constructor(element, config) {\n    super(element);\n    this._items = null;\n    this._interval = null;\n    this._activeElement = null;\n    this._isPaused = false;\n    this._isSliding = false;\n    this.touchTimeout = null;\n    this.touchStartX = 0;\n    this.touchDeltaX = 0;\n    this._config = this._getConfig(config);\n    this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n    this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n    this._pointerEvent = Boolean(window.PointerEvent);\n\n    this._addEventListeners();\n  } // Getters\n\n\n  static get Default() {\n    return Default$a;\n  }\n\n  static get NAME() {\n    return NAME$b;\n  } // Public\n\n\n  next() {\n    this._slide(ORDER_NEXT);\n  }\n\n  nextWhenVisible() {\n    // Don't call next when the page isn't visible\n    // or the carousel or its parent isn't visible\n    if (!document.hidden && isVisible(this._element)) {\n      this.next();\n    }\n  }\n\n  prev() {\n    this._slide(ORDER_PREV);\n  }\n\n  pause(event) {\n    if (!event) {\n      this._isPaused = true;\n    }\n\n    if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n      triggerTransitionEnd(this._element);\n      this.cycle(true);\n    }\n\n    clearInterval(this._interval);\n    this._interval = null;\n  }\n\n  cycle(event) {\n    if (!event) {\n      this._isPaused = false;\n    }\n\n    if (this._interval) {\n      clearInterval(this._interval);\n      this._interval = null;\n    }\n\n    if (this._config && this._config.interval && !this._isPaused) {\n      this._updateInterval();\n\n      this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n    }\n  }\n\n  to(index) {\n    this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n    const activeIndex = this._getItemIndex(this._activeElement);\n\n    if (index > this._items.length - 1 || index < 0) {\n      return;\n    }\n\n    if (this._isSliding) {\n      EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n      return;\n    }\n\n    if (activeIndex === index) {\n      this.pause();\n      this.cycle();\n      return;\n    }\n\n    const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n\n    this._slide(order, this._items[index]);\n  } // Private\n\n\n  _getConfig(config) {\n    config = { ...Default$a,\n      ...Manipulator.getDataAttributes(this._element),\n      ...(typeof config === 'object' ? config : {})\n    };\n    typeCheckConfig(NAME$b, config, DefaultType$a);\n    return config;\n  }\n\n  _handleSwipe() {\n    const absDeltax = Math.abs(this.touchDeltaX);\n\n    if (absDeltax <= SWIPE_THRESHOLD) {\n      return;\n    }\n\n    const direction = absDeltax / this.touchDeltaX;\n    this.touchDeltaX = 0;\n\n    if (!direction) {\n      return;\n    }\n\n    this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT);\n  }\n\n  _addEventListeners() {\n    if (this._config.keyboard) {\n      EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));\n    }\n\n    if (this._config.pause === 'hover') {\n      EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event));\n      EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event));\n    }\n\n    if (this._config.touch && this._touchSupported) {\n      this._addTouchEventListeners();\n    }\n  }\n\n  _addTouchEventListeners() {\n    const start = event => {\n      if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {\n        this.touchStartX = event.clientX;\n      } else if (!this._pointerEvent) {\n        this.touchStartX = event.touches[0].clientX;\n      }\n    };\n\n    const move = event => {\n      // ensure swiping with one touch and not pinching\n      this.touchDeltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX;\n    };\n\n    const end = event => {\n      if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {\n        this.touchDeltaX = event.clientX - this.touchStartX;\n      }\n\n      this._handleSwipe();\n\n      if (this._config.pause === 'hover') {\n        // If it's a touch-enabled device, mouseenter/leave are fired as\n        // part of the mouse compatibility events on first tap - the carousel\n        // would stop cycling until user tapped out of it;\n        // here, we listen for touchend, explicitly pause the carousel\n        // (as if it's the second time we tap on it, mouseenter compat event\n        // is NOT fired) and after a timeout (to allow for mouse compatibility\n        // events to fire) we explicitly restart cycling\n        this.pause();\n\n        if (this.touchTimeout) {\n          clearTimeout(this.touchTimeout);\n        }\n\n        this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n      }\n    };\n\n    SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n      EventHandler.on(itemImg, EVENT_DRAG_START, e => e.preventDefault());\n    });\n\n    if (this._pointerEvent) {\n      EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event));\n      EventHandler.on(this._element, EVENT_POINTERUP, event => end(event));\n\n      this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n    } else {\n      EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event));\n      EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event));\n      EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event));\n    }\n  }\n\n  _keydown(event) {\n    if (/input|textarea/i.test(event.target.tagName)) {\n      return;\n    }\n\n    const direction = KEY_TO_DIRECTION[event.key];\n\n    if (direction) {\n      event.preventDefault();\n\n      this._slide(direction);\n    }\n  }\n\n  _getItemIndex(element) {\n    this._items = element && element.parentNode ? SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : [];\n    return this._items.indexOf(element);\n  }\n\n  _getItemByOrder(order, activeElement) {\n    const isNext = order === ORDER_NEXT;\n    return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap);\n  }\n\n  _triggerSlideEvent(relatedTarget, eventDirectionName) {\n    const targetIndex = this._getItemIndex(relatedTarget);\n\n    const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element));\n\n    return EventHandler.trigger(this._element, EVENT_SLIDE, {\n      relatedTarget,\n      direction: eventDirectionName,\n      from: fromIndex,\n      to: targetIndex\n    });\n  }\n\n  _setActiveIndicatorElement(element) {\n    if (this._indicatorsElement) {\n      const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE$1, this._indicatorsElement);\n      activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n      activeIndicator.removeAttribute('aria-current');\n      const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement);\n\n      for (let i = 0; i < indicators.length; i++) {\n        if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n          indicators[i].classList.add(CLASS_NAME_ACTIVE$2);\n          indicators[i].setAttribute('aria-current', 'true');\n          break;\n        }\n      }\n    }\n  }\n\n  _updateInterval() {\n    const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n    if (!element) {\n      return;\n    }\n\n    const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n\n    if (elementInterval) {\n      this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n      this._config.interval = elementInterval;\n    } else {\n      this._config.interval = this._config.defaultInterval || this._config.interval;\n    }\n  }\n\n  _slide(directionOrOrder, element) {\n    const order = this._directionToOrder(directionOrOrder);\n\n    const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n    const activeElementIndex = this._getItemIndex(activeElement);\n\n    const nextElement = element || this._getItemByOrder(order, activeElement);\n\n    const nextElementIndex = this._getItemIndex(nextElement);\n\n    const isCycling = Boolean(this._interval);\n    const isNext = order === ORDER_NEXT;\n    const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n    const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n\n    const eventDirectionName = this._orderToDirection(order);\n\n    if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE$2)) {\n      this._isSliding = false;\n      return;\n    }\n\n    if (this._isSliding) {\n      return;\n    }\n\n    const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n    if (slideEvent.defaultPrevented) {\n      return;\n    }\n\n    if (!activeElement || !nextElement) {\n      // Some weirdness is happening, so we bail\n      return;\n    }\n\n    this._isSliding = true;\n\n    if (isCycling) {\n      this.pause();\n    }\n\n    this._setActiveIndicatorElement(nextElement);\n\n    this._activeElement = nextElement;\n\n    const triggerSlidEvent = () => {\n      EventHandler.trigger(this._element, EVENT_SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      });\n    };\n\n    if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n      nextElement.classList.add(orderClassName);\n      reflow(nextElement);\n      activeElement.classList.add(directionalClassName);\n      nextElement.classList.add(directionalClassName);\n\n      const completeCallBack = () => {\n        nextElement.classList.remove(directionalClassName, orderClassName);\n        nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n        activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n        this._isSliding = false;\n        setTimeout(triggerSlidEvent, 0);\n      };\n\n      this._queueCallback(completeCallBack, activeElement, true);\n    } else {\n      activeElement.classList.remove(CLASS_NAME_ACTIVE$2);\n      nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n      this._isSliding = false;\n      triggerSlidEvent();\n    }\n\n    if (isCycling) {\n      this.cycle();\n    }\n  }\n\n  _directionToOrder(direction) {\n    if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n      return direction;\n    }\n\n    if (isRTL()) {\n      return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n    }\n\n    return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n  }\n\n  _orderToDirection(order) {\n    if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n      return order;\n    }\n\n    if (isRTL()) {\n      return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n    }\n\n    return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n  } // Static\n\n\n  static carouselInterface(element, config) {\n    const data = Carousel.getOrCreateInstance(element, config);\n    let {\n      _config\n    } = data;\n\n    if (typeof config === 'object') {\n      _config = { ..._config,\n        ...config\n      };\n    }\n\n    const action = typeof config === 'string' ? config : _config.slide;\n\n    if (typeof config === 'number') {\n      data.to(config);\n    } else if (typeof action === 'string') {\n      if (typeof data[action] === 'undefined') {\n        throw new TypeError(`No method named \"${action}\"`);\n      }\n\n      data[action]();\n    } else if (_config.interval && _config.ride) {\n      data.pause();\n      data.cycle();\n    }\n  }\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      Carousel.carouselInterface(this, config);\n    });\n  }\n\n  static dataApiClickHandler(event) {\n    const target = getElementFromSelector(this);\n\n    if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n      return;\n    }\n\n    const config = { ...Manipulator.getDataAttributes(target),\n      ...Manipulator.getDataAttributes(this)\n    };\n    const slideIndex = this.getAttribute('data-bs-slide-to');\n\n    if (slideIndex) {\n      config.interval = false;\n    }\n\n    Carousel.carouselInterface(target, config);\n\n    if (slideIndex) {\n      Carousel.getInstance(target).to(slideIndex);\n    }\n\n    event.preventDefault();\n  }\n\n}\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler);\nEventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n  const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n\n  for (let i = 0, len = carousels.length; i < len; i++) {\n    Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]));\n  }\n});\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Carousel to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Carousel);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME$a = 'collapse';\nconst DATA_KEY$9 = 'bs.collapse';\nconst EVENT_KEY$9 = `.${DATA_KEY$9}`;\nconst DATA_API_KEY$5 = '.data-api';\nconst Default$9 = {\n  toggle: true,\n  parent: null\n};\nconst DefaultType$9 = {\n  toggle: 'boolean',\n  parent: '(null|element)'\n};\nconst EVENT_SHOW$5 = `show${EVENT_KEY$9}`;\nconst EVENT_SHOWN$5 = `shown${EVENT_KEY$9}`;\nconst EVENT_HIDE$5 = `hide${EVENT_KEY$9}`;\nconst EVENT_HIDDEN$5 = `hidden${EVENT_KEY$9}`;\nconst EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$9}${DATA_API_KEY$5}`;\nconst CLASS_NAME_SHOW$7 = 'show';\nconst CLASS_NAME_COLLAPSE = 'collapse';\nconst CLASS_NAME_COLLAPSING = 'collapsing';\nconst CLASS_NAME_COLLAPSED = 'collapsed';\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\nconst SELECTOR_ACTIVES = '.show, .collapsing';\nconst SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Collapse extends BaseComponent {\n  constructor(element, config) {\n    super(element);\n    this._isTransitioning = false;\n    this._config = this._getConfig(config);\n    this._triggerArray = [];\n    const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n\n    for (let i = 0, len = toggleList.length; i < len; i++) {\n      const elem = toggleList[i];\n      const selector = getSelectorFromElement(elem);\n      const filterElement = SelectorEngine.find(selector).filter(foundElem => foundElem === this._element);\n\n      if (selector !== null && filterElement.length) {\n        this._selector = selector;\n\n        this._triggerArray.push(elem);\n      }\n    }\n\n    this._initializeChildren();\n\n    if (!this._config.parent) {\n      this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n    }\n\n    if (this._config.toggle) {\n      this.toggle();\n    }\n  } // Getters\n\n\n  static get Default() {\n    return Default$9;\n  }\n\n  static get NAME() {\n    return NAME$a;\n  } // Public\n\n\n  toggle() {\n    if (this._isShown()) {\n      this.hide();\n    } else {\n      this.show();\n    }\n  }\n\n  show() {\n    if (this._isTransitioning || this._isShown()) {\n      return;\n    }\n\n    let actives = [];\n    let activesData;\n\n    if (this._config.parent) {\n      const children = SelectorEngine.find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);\n      actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth\n    }\n\n    const container = SelectorEngine.findOne(this._selector);\n\n    if (actives.length) {\n      const tempActiveData = actives.find(elem => container !== elem);\n      activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;\n\n      if (activesData && activesData._isTransitioning) {\n        return;\n      }\n    }\n\n    const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$5);\n\n    if (startEvent.defaultPrevented) {\n      return;\n    }\n\n    actives.forEach(elemActive => {\n      if (container !== elemActive) {\n        Collapse.getOrCreateInstance(elemActive, {\n          toggle: false\n        }).hide();\n      }\n\n      if (!activesData) {\n        Data.set(elemActive, DATA_KEY$9, null);\n      }\n    });\n\n    const dimension = this._getDimension();\n\n    this._element.classList.remove(CLASS_NAME_COLLAPSE);\n\n    this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n    this._element.style[dimension] = 0;\n\n    this._addAriaAndCollapsedClass(this._triggerArray, true);\n\n    this._isTransitioning = true;\n\n    const complete = () => {\n      this._isTransitioning = false;\n\n      this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n      this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n      this._element.style[dimension] = '';\n      EventHandler.trigger(this._element, EVENT_SHOWN$5);\n    };\n\n    const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n    const scrollSize = `scroll${capitalizedDimension}`;\n\n    this._queueCallback(complete, this._element, true);\n\n    this._element.style[dimension] = `${this._element[scrollSize]}px`;\n  }\n\n  hide() {\n    if (this._isTransitioning || !this._isShown()) {\n      return;\n    }\n\n    const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$5);\n\n    if (startEvent.defaultPrevented) {\n      return;\n    }\n\n    const dimension = this._getDimension();\n\n    this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n    reflow(this._element);\n\n    this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n    this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n    const triggerArrayLength = this._triggerArray.length;\n\n    for (let i = 0; i < triggerArrayLength; i++) {\n      const trigger = this._triggerArray[i];\n      const elem = getElementFromSelector(trigger);\n\n      if (elem && !this._isShown(elem)) {\n        this._addAriaAndCollapsedClass([trigger], false);\n      }\n    }\n\n    this._isTransitioning = true;\n\n    const complete = () => {\n      this._isTransitioning = false;\n\n      this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n      this._element.classList.add(CLASS_NAME_COLLAPSE);\n\n      EventHandler.trigger(this._element, EVENT_HIDDEN$5);\n    };\n\n    this._element.style[dimension] = '';\n\n    this._queueCallback(complete, this._element, true);\n  }\n\n  _isShown(element = this._element) {\n    return element.classList.contains(CLASS_NAME_SHOW$7);\n  } // Private\n\n\n  _getConfig(config) {\n    config = { ...Default$9,\n      ...Manipulator.getDataAttributes(this._element),\n      ...config\n    };\n    config.toggle = Boolean(config.toggle); // Coerce string values\n\n    config.parent = getElement(config.parent);\n    typeCheckConfig(NAME$a, config, DefaultType$9);\n    return config;\n  }\n\n  _getDimension() {\n    return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n  }\n\n  _initializeChildren() {\n    if (!this._config.parent) {\n      return;\n    }\n\n    const children = SelectorEngine.find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);\n    SelectorEngine.find(SELECTOR_DATA_TOGGLE$4, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {\n      const selected = getElementFromSelector(element);\n\n      if (selected) {\n        this._addAriaAndCollapsedClass([element], this._isShown(selected));\n      }\n    });\n  }\n\n  _addAriaAndCollapsedClass(triggerArray, isOpen) {\n    if (!triggerArray.length) {\n      return;\n    }\n\n    triggerArray.forEach(elem => {\n      if (isOpen) {\n        elem.classList.remove(CLASS_NAME_COLLAPSED);\n      } else {\n        elem.classList.add(CLASS_NAME_COLLAPSED);\n      }\n\n      elem.setAttribute('aria-expanded', isOpen);\n    });\n  } // Static\n\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const _config = {};\n\n      if (typeof config === 'string' && /show|hide/.test(config)) {\n        _config.toggle = false;\n      }\n\n      const data = Collapse.getOrCreateInstance(this, _config);\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config]();\n      }\n    });\n  }\n\n}\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n  // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n  if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n    event.preventDefault();\n  }\n\n  const selector = getSelectorFromElement(this);\n  const selectorElements = SelectorEngine.find(selector);\n  selectorElements.forEach(element => {\n    Collapse.getOrCreateInstance(element, {\n      toggle: false\n    }).toggle();\n  });\n});\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Collapse to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Collapse);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME$9 = 'dropdown';\nconst DATA_KEY$8 = 'bs.dropdown';\nconst EVENT_KEY$8 = `.${DATA_KEY$8}`;\nconst DATA_API_KEY$4 = '.data-api';\nconst ESCAPE_KEY$2 = 'Escape';\nconst SPACE_KEY = 'Space';\nconst TAB_KEY$1 = 'Tab';\nconst ARROW_UP_KEY = 'ArrowUp';\nconst ARROW_DOWN_KEY = 'ArrowDown';\nconst RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\nconst REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`);\nconst EVENT_HIDE$4 = `hide${EVENT_KEY$8}`;\nconst EVENT_HIDDEN$4 = `hidden${EVENT_KEY$8}`;\nconst EVENT_SHOW$4 = `show${EVENT_KEY$8}`;\nconst EVENT_SHOWN$4 = `shown${EVENT_KEY$8}`;\nconst EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$8}${DATA_API_KEY$4}`;\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$4}`;\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$4}`;\nconst CLASS_NAME_SHOW$6 = 'show';\nconst CLASS_NAME_DROPUP = 'dropup';\nconst CLASS_NAME_DROPEND = 'dropend';\nconst CLASS_NAME_DROPSTART = 'dropstart';\nconst CLASS_NAME_NAVBAR = 'navbar';\nconst SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]';\nconst SELECTOR_MENU = '.dropdown-menu';\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav';\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\nconst Default$8 = {\n  offset: [0, 2],\n  boundary: 'clippingParents',\n  reference: 'toggle',\n  display: 'dynamic',\n  popperConfig: null,\n  autoClose: true\n};\nconst DefaultType$8 = {\n  offset: '(array|string|function)',\n  boundary: '(string|element)',\n  reference: '(string|element|object)',\n  display: 'string',\n  popperConfig: '(null|object|function)',\n  autoClose: '(boolean|string)'\n};\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Dropdown extends BaseComponent {\n  constructor(element, config) {\n    super(element);\n    this._popper = null;\n    this._config = this._getConfig(config);\n    this._menu = this._getMenuElement();\n    this._inNavbar = this._detectNavbar();\n  } // Getters\n\n\n  static get Default() {\n    return Default$8;\n  }\n\n  static get DefaultType() {\n    return DefaultType$8;\n  }\n\n  static get NAME() {\n    return NAME$9;\n  } // Public\n\n\n  toggle() {\n    return this._isShown() ? this.hide() : this.show();\n  }\n\n  show() {\n    if (isDisabled(this._element) || this._isShown(this._menu)) {\n      return;\n    }\n\n    const relatedTarget = {\n      relatedTarget: this._element\n    };\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, relatedTarget);\n\n    if (showEvent.defaultPrevented) {\n      return;\n    }\n\n    const parent = Dropdown.getParentFromElement(this._element); // Totally disable Popper for Dropdowns in Navbar\n\n    if (this._inNavbar) {\n      Manipulator.setDataAttribute(this._menu, 'popper', 'none');\n    } else {\n      this._createPopper(parent);\n    } // If this is a touch-enabled device we add extra\n    // empty mouseover listeners to the body's immediate children;\n    // only needed because of broken event delegation on iOS\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n    if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {\n      [].concat(...document.body.children).forEach(elem => EventHandler.on(elem, 'mouseover', noop));\n    }\n\n    this._element.focus();\n\n    this._element.setAttribute('aria-expanded', true);\n\n    this._menu.classList.add(CLASS_NAME_SHOW$6);\n\n    this._element.classList.add(CLASS_NAME_SHOW$6);\n\n    EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget);\n  }\n\n  hide() {\n    if (isDisabled(this._element) || !this._isShown(this._menu)) {\n      return;\n    }\n\n    const relatedTarget = {\n      relatedTarget: this._element\n    };\n\n    this._completeHide(relatedTarget);\n  }\n\n  dispose() {\n    if (this._popper) {\n      this._popper.destroy();\n    }\n\n    super.dispose();\n  }\n\n  update() {\n    this._inNavbar = this._detectNavbar();\n\n    if (this._popper) {\n      this._popper.update();\n    }\n  } // Private\n\n\n  _completeHide(relatedTarget) {\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);\n\n    if (hideEvent.defaultPrevented) {\n      return;\n    } // If this is a touch-enabled device we remove the extra\n    // empty mouseover listeners we added for iOS support\n\n\n    if ('ontouchstart' in document.documentElement) {\n      [].concat(...document.body.children).forEach(elem => EventHandler.off(elem, 'mouseover', noop));\n    }\n\n    if (this._popper) {\n      this._popper.destroy();\n    }\n\n    this._menu.classList.remove(CLASS_NAME_SHOW$6);\n\n    this._element.classList.remove(CLASS_NAME_SHOW$6);\n\n    this._element.setAttribute('aria-expanded', 'false');\n\n    Manipulator.removeDataAttribute(this._menu, 'popper');\n    EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget);\n  }\n\n  _getConfig(config) {\n    config = { ...this.constructor.Default,\n      ...Manipulator.getDataAttributes(this._element),\n      ...config\n    };\n    typeCheckConfig(NAME$9, config, this.constructor.DefaultType);\n\n    if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n      // Popper virtual elements require a getBoundingClientRect method\n      throw new TypeError(`${NAME$9.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n    }\n\n    return config;\n  }\n\n  _createPopper(parent) {\n    if (typeof Popper === 'undefined') {\n      throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n    }\n\n    let referenceElement = this._element;\n\n    if (this._config.reference === 'parent') {\n      referenceElement = parent;\n    } else if (isElement(this._config.reference)) {\n      referenceElement = getElement(this._config.reference);\n    } else if (typeof this._config.reference === 'object') {\n      referenceElement = this._config.reference;\n    }\n\n    const popperConfig = this._getPopperConfig();\n\n    const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);\n    this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig);\n\n    if (isDisplayStatic) {\n      Manipulator.setDataAttribute(this._menu, 'popper', 'static');\n    }\n  }\n\n  _isShown(element = this._element) {\n    return element.classList.contains(CLASS_NAME_SHOW$6);\n  }\n\n  _getMenuElement() {\n    return SelectorEngine.next(this._element, SELECTOR_MENU)[0];\n  }\n\n  _getPlacement() {\n    const parentDropdown = this._element.parentNode;\n\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n      return PLACEMENT_RIGHT;\n    }\n\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n      return PLACEMENT_LEFT;\n    } // We need to trim the value because custom properties can also include spaces\n\n\n    const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n\n    if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n      return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n    }\n\n    return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n  }\n\n  _detectNavbar() {\n    return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;\n  }\n\n  _getOffset() {\n    const {\n      offset\n    } = this._config;\n\n    if (typeof offset === 'string') {\n      return offset.split(',').map(val => Number.parseInt(val, 10));\n    }\n\n    if (typeof offset === 'function') {\n      return popperData => offset(popperData, this._element);\n    }\n\n    return offset;\n  }\n\n  _getPopperConfig() {\n    const defaultBsPopperConfig = {\n      placement: this._getPlacement(),\n      modifiers: [{\n        name: 'preventOverflow',\n        options: {\n          boundary: this._config.boundary\n        }\n      }, {\n        name: 'offset',\n        options: {\n          offset: this._getOffset()\n        }\n      }]\n    }; // Disable Popper if we have a static display\n\n    if (this._config.display === 'static') {\n      defaultBsPopperConfig.modifiers = [{\n        name: 'applyStyles',\n        enabled: false\n      }];\n    }\n\n    return { ...defaultBsPopperConfig,\n      ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n    };\n  }\n\n  _selectMenuItem({\n    key,\n    target\n  }) {\n    const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);\n\n    if (!items.length) {\n      return;\n    } // if target isn't included in items (e.g. when expanding the dropdown)\n    // allow cycling to get the last item in case key equals ARROW_UP_KEY\n\n\n    getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();\n  } // Static\n\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Dropdown.getOrCreateInstance(this, config);\n\n      if (typeof config !== 'string') {\n        return;\n      }\n\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n\n      data[config]();\n    });\n  }\n\n  static clearMenus(event) {\n    if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1)) {\n      return;\n    }\n\n    const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE$3);\n\n    for (let i = 0, len = toggles.length; i < len; i++) {\n      const context = Dropdown.getInstance(toggles[i]);\n\n      if (!context || context._config.autoClose === false) {\n        continue;\n      }\n\n      if (!context._isShown()) {\n        continue;\n      }\n\n      const relatedTarget = {\n        relatedTarget: context._element\n      };\n\n      if (event) {\n        const composedPath = event.composedPath();\n        const isMenuTarget = composedPath.includes(context._menu);\n\n        if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n          continue;\n        } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n\n\n        if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n          continue;\n        }\n\n        if (event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n      }\n\n      context._completeHide(relatedTarget);\n    }\n  }\n\n  static getParentFromElement(element) {\n    return getElementFromSelector(element) || element.parentNode;\n  }\n\n  static dataApiKeydownHandler(event) {\n    // If not input/textarea:\n    //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n    // If input/textarea:\n    //  - If space key => not a dropdown command\n    //  - If key is other than escape\n    //    - If key is not up or down => not a dropdown command\n    //    - If trigger inside the menu => not a dropdown command\n    if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY$2 && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {\n      return;\n    }\n\n    const isActive = this.classList.contains(CLASS_NAME_SHOW$6);\n\n    if (!isActive && event.key === ESCAPE_KEY$2) {\n      return;\n    }\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    if (isDisabled(this)) {\n      return;\n    }\n\n    const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];\n    const instance = Dropdown.getOrCreateInstance(getToggleButton);\n\n    if (event.key === ESCAPE_KEY$2) {\n      instance.hide();\n      return;\n    }\n\n    if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n      if (!isActive) {\n        instance.show();\n      }\n\n      instance._selectMenuItem(event);\n\n      return;\n    }\n\n    if (!isActive || event.key === SPACE_KEY) {\n      Dropdown.clearMenus();\n    }\n  }\n\n}\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\nEventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n  event.preventDefault();\n  Dropdown.getOrCreateInstance(this).toggle();\n});\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Dropdown to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Dropdown);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\n\nclass ScrollBarHelper {\n  constructor() {\n    this._element = document.body;\n  }\n\n  getWidth() {\n    // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n    const documentWidth = document.documentElement.clientWidth;\n    return Math.abs(window.innerWidth - documentWidth);\n  }\n\n  hide() {\n    const width = this.getWidth();\n\n    this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width\n\n\n    this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n\n\n    this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);\n\n    this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);\n  }\n\n  _disableOverFlow() {\n    this._saveInitialAttribute(this._element, 'overflow');\n\n    this._element.style.overflow = 'hidden';\n  }\n\n  _setElementAttributes(selector, styleProp, callback) {\n    const scrollbarWidth = this.getWidth();\n\n    const manipulationCallBack = element => {\n      if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n        return;\n      }\n\n      this._saveInitialAttribute(element, styleProp);\n\n      const calculatedValue = window.getComputedStyle(element)[styleProp];\n      element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;\n    };\n\n    this._applyManipulationCallback(selector, manipulationCallBack);\n  }\n\n  reset() {\n    this._resetElementAttributes(this._element, 'overflow');\n\n    this._resetElementAttributes(this._element, 'paddingRight');\n\n    this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');\n\n    this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');\n  }\n\n  _saveInitialAttribute(element, styleProp) {\n    const actualValue = element.style[styleProp];\n\n    if (actualValue) {\n      Manipulator.setDataAttribute(element, styleProp, actualValue);\n    }\n  }\n\n  _resetElementAttributes(selector, styleProp) {\n    const manipulationCallBack = element => {\n      const value = Manipulator.getDataAttribute(element, styleProp);\n\n      if (typeof value === 'undefined') {\n        element.style.removeProperty(styleProp);\n      } else {\n        Manipulator.removeDataAttribute(element, styleProp);\n        element.style[styleProp] = value;\n      }\n    };\n\n    this._applyManipulationCallback(selector, manipulationCallBack);\n  }\n\n  _applyManipulationCallback(selector, callBack) {\n    if (isElement(selector)) {\n      callBack(selector);\n    } else {\n      SelectorEngine.find(selector, this._element).forEach(callBack);\n    }\n  }\n\n  isOverflowing() {\n    return this.getWidth() > 0;\n  }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\nconst Default$7 = {\n  className: 'modal-backdrop',\n  isVisible: true,\n  // if false, we use the backdrop helper without adding any element to the dom\n  isAnimated: false,\n  rootElement: 'body',\n  // give the choice to place backdrop under different elements\n  clickCallback: null\n};\nconst DefaultType$7 = {\n  className: 'string',\n  isVisible: 'boolean',\n  isAnimated: 'boolean',\n  rootElement: '(element|string)',\n  clickCallback: '(function|null)'\n};\nconst NAME$8 = 'backdrop';\nconst CLASS_NAME_FADE$4 = 'fade';\nconst CLASS_NAME_SHOW$5 = 'show';\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME$8}`;\n\nclass Backdrop {\n  constructor(config) {\n    this._config = this._getConfig(config);\n    this._isAppended = false;\n    this._element = null;\n  }\n\n  show(callback) {\n    if (!this._config.isVisible) {\n      execute(callback);\n      return;\n    }\n\n    this._append();\n\n    if (this._config.isAnimated) {\n      reflow(this._getElement());\n    }\n\n    this._getElement().classList.add(CLASS_NAME_SHOW$5);\n\n    this._emulateAnimation(() => {\n      execute(callback);\n    });\n  }\n\n  hide(callback) {\n    if (!this._config.isVisible) {\n      execute(callback);\n      return;\n    }\n\n    this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n\n    this._emulateAnimation(() => {\n      this.dispose();\n      execute(callback);\n    });\n  } // Private\n\n\n  _getElement() {\n    if (!this._element) {\n      const backdrop = document.createElement('div');\n      backdrop.className = this._config.className;\n\n      if (this._config.isAnimated) {\n        backdrop.classList.add(CLASS_NAME_FADE$4);\n      }\n\n      this._element = backdrop;\n    }\n\n    return this._element;\n  }\n\n  _getConfig(config) {\n    config = { ...Default$7,\n      ...(typeof config === 'object' ? config : {})\n    }; // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n\n    config.rootElement = getElement(config.rootElement);\n    typeCheckConfig(NAME$8, config, DefaultType$7);\n    return config;\n  }\n\n  _append() {\n    if (this._isAppended) {\n      return;\n    }\n\n    this._config.rootElement.append(this._getElement());\n\n    EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n      execute(this._config.clickCallback);\n    });\n    this._isAppended = true;\n  }\n\n  dispose() {\n    if (!this._isAppended) {\n      return;\n    }\n\n    EventHandler.off(this._element, EVENT_MOUSEDOWN);\n\n    this._element.remove();\n\n    this._isAppended = false;\n  }\n\n  _emulateAnimation(callback) {\n    executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n  }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\nconst Default$6 = {\n  trapElement: null,\n  // The element to trap focus inside of\n  autofocus: true\n};\nconst DefaultType$6 = {\n  trapElement: 'element',\n  autofocus: 'boolean'\n};\nconst NAME$7 = 'focustrap';\nconst DATA_KEY$7 = 'bs.focustrap';\nconst EVENT_KEY$7 = `.${DATA_KEY$7}`;\nconst EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$7}`;\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`;\nconst TAB_KEY = 'Tab';\nconst TAB_NAV_FORWARD = 'forward';\nconst TAB_NAV_BACKWARD = 'backward';\n\nclass FocusTrap {\n  constructor(config) {\n    this._config = this._getConfig(config);\n    this._isActive = false;\n    this._lastTabNavDirection = null;\n  }\n\n  activate() {\n    const {\n      trapElement,\n      autofocus\n    } = this._config;\n\n    if (this._isActive) {\n      return;\n    }\n\n    if (autofocus) {\n      trapElement.focus();\n    }\n\n    EventHandler.off(document, EVENT_KEY$7); // guard against infinite focus loop\n\n    EventHandler.on(document, EVENT_FOCUSIN$1, event => this._handleFocusin(event));\n    EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n    this._isActive = true;\n  }\n\n  deactivate() {\n    if (!this._isActive) {\n      return;\n    }\n\n    this._isActive = false;\n    EventHandler.off(document, EVENT_KEY$7);\n  } // Private\n\n\n  _handleFocusin(event) {\n    const {\n      target\n    } = event;\n    const {\n      trapElement\n    } = this._config;\n\n    if (target === document || target === trapElement || trapElement.contains(target)) {\n      return;\n    }\n\n    const elements = SelectorEngine.focusableChildren(trapElement);\n\n    if (elements.length === 0) {\n      trapElement.focus();\n    } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n      elements[elements.length - 1].focus();\n    } else {\n      elements[0].focus();\n    }\n  }\n\n  _handleKeydown(event) {\n    if (event.key !== TAB_KEY) {\n      return;\n    }\n\n    this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n  }\n\n  _getConfig(config) {\n    config = { ...Default$6,\n      ...(typeof config === 'object' ? config : {})\n    };\n    typeCheckConfig(NAME$7, config, DefaultType$6);\n    return config;\n  }\n\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME$6 = 'modal';\nconst DATA_KEY$6 = 'bs.modal';\nconst EVENT_KEY$6 = `.${DATA_KEY$6}`;\nconst DATA_API_KEY$3 = '.data-api';\nconst ESCAPE_KEY$1 = 'Escape';\nconst Default$5 = {\n  backdrop: true,\n  keyboard: true,\n  focus: true\n};\nconst DefaultType$5 = {\n  backdrop: '(boolean|string)',\n  keyboard: 'boolean',\n  focus: 'boolean'\n};\nconst EVENT_HIDE$3 = `hide${EVENT_KEY$6}`;\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$6}`;\nconst EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`;\nconst EVENT_SHOW$3 = `show${EVENT_KEY$6}`;\nconst EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`;\nconst EVENT_RESIZE = `resize${EVENT_KEY$6}`;\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`;\nconst EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;\nconst EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`;\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;\nconst EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\nconst CLASS_NAME_OPEN = 'modal-open';\nconst CLASS_NAME_FADE$3 = 'fade';\nconst CLASS_NAME_SHOW$4 = 'show';\nconst CLASS_NAME_STATIC = 'modal-static';\nconst SELECTOR_DIALOG = '.modal-dialog';\nconst SELECTOR_MODAL_BODY = '.modal-body';\nconst SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Modal extends BaseComponent {\n  constructor(element, config) {\n    super(element);\n    this._config = this._getConfig(config);\n    this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n    this._backdrop = this._initializeBackDrop();\n    this._focustrap = this._initializeFocusTrap();\n    this._isShown = false;\n    this._ignoreBackdropClick = false;\n    this._isTransitioning = false;\n    this._scrollBar = new ScrollBarHelper();\n  } // Getters\n\n\n  static get Default() {\n    return Default$5;\n  }\n\n  static get NAME() {\n    return NAME$6;\n  } // Public\n\n\n  toggle(relatedTarget) {\n    return this._isShown ? this.hide() : this.show(relatedTarget);\n  }\n\n  show(relatedTarget) {\n    if (this._isShown || this._isTransitioning) {\n      return;\n    }\n\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n      relatedTarget\n    });\n\n    if (showEvent.defaultPrevented) {\n      return;\n    }\n\n    this._isShown = true;\n\n    if (this._isAnimated()) {\n      this._isTransitioning = true;\n    }\n\n    this._scrollBar.hide();\n\n    document.body.classList.add(CLASS_NAME_OPEN);\n\n    this._adjustDialog();\n\n    this._setEscapeEvent();\n\n    this._setResizeEvent();\n\n    EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n      EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n        if (event.target === this._element) {\n          this._ignoreBackdropClick = true;\n        }\n      });\n    });\n\n    this._showBackdrop(() => this._showElement(relatedTarget));\n  }\n\n  hide() {\n    if (!this._isShown || this._isTransitioning) {\n      return;\n    }\n\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n\n    if (hideEvent.defaultPrevented) {\n      return;\n    }\n\n    this._isShown = false;\n\n    const isAnimated = this._isAnimated();\n\n    if (isAnimated) {\n      this._isTransitioning = true;\n    }\n\n    this._setEscapeEvent();\n\n    this._setResizeEvent();\n\n    this._focustrap.deactivate();\n\n    this._element.classList.remove(CLASS_NAME_SHOW$4);\n\n    EventHandler.off(this._element, EVENT_CLICK_DISMISS);\n    EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);\n\n    this._queueCallback(() => this._hideModal(), this._element, isAnimated);\n  }\n\n  dispose() {\n    [window, this._dialog].forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY$6));\n\n    this._backdrop.dispose();\n\n    this._focustrap.deactivate();\n\n    super.dispose();\n  }\n\n  handleUpdate() {\n    this._adjustDialog();\n  } // Private\n\n\n  _initializeBackDrop() {\n    return new Backdrop({\n      isVisible: Boolean(this._config.backdrop),\n      // 'static' option will be translated to true, and booleans will keep their value\n      isAnimated: this._isAnimated()\n    });\n  }\n\n  _initializeFocusTrap() {\n    return new FocusTrap({\n      trapElement: this._element\n    });\n  }\n\n  _getConfig(config) {\n    config = { ...Default$5,\n      ...Manipulator.getDataAttributes(this._element),\n      ...(typeof config === 'object' ? config : {})\n    };\n    typeCheckConfig(NAME$6, config, DefaultType$5);\n    return config;\n  }\n\n  _showElement(relatedTarget) {\n    const isAnimated = this._isAnimated();\n\n    const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n\n    if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n      // Don't move modal's DOM position\n      document.body.append(this._element);\n    }\n\n    this._element.style.display = 'block';\n\n    this._element.removeAttribute('aria-hidden');\n\n    this._element.setAttribute('aria-modal', true);\n\n    this._element.setAttribute('role', 'dialog');\n\n    this._element.scrollTop = 0;\n\n    if (modalBody) {\n      modalBody.scrollTop = 0;\n    }\n\n    if (isAnimated) {\n      reflow(this._element);\n    }\n\n    this._element.classList.add(CLASS_NAME_SHOW$4);\n\n    const transitionComplete = () => {\n      if (this._config.focus) {\n        this._focustrap.activate();\n      }\n\n      this._isTransitioning = false;\n      EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n        relatedTarget\n      });\n    };\n\n    this._queueCallback(transitionComplete, this._dialog, isAnimated);\n  }\n\n  _setEscapeEvent() {\n    if (this._isShown) {\n      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n        if (this._config.keyboard && event.key === ESCAPE_KEY$1) {\n          event.preventDefault();\n          this.hide();\n        } else if (!this._config.keyboard && event.key === ESCAPE_KEY$1) {\n          this._triggerBackdropTransition();\n        }\n      });\n    } else {\n      EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS$1);\n    }\n  }\n\n  _setResizeEvent() {\n    if (this._isShown) {\n      EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog());\n    } else {\n      EventHandler.off(window, EVENT_RESIZE);\n    }\n  }\n\n  _hideModal() {\n    this._element.style.display = 'none';\n\n    this._element.setAttribute('aria-hidden', true);\n\n    this._element.removeAttribute('aria-modal');\n\n    this._element.removeAttribute('role');\n\n    this._isTransitioning = false;\n\n    this._backdrop.hide(() => {\n      document.body.classList.remove(CLASS_NAME_OPEN);\n\n      this._resetAdjustments();\n\n      this._scrollBar.reset();\n\n      EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n    });\n  }\n\n  _showBackdrop(callback) {\n    EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n      if (this._ignoreBackdropClick) {\n        this._ignoreBackdropClick = false;\n        return;\n      }\n\n      if (event.target !== event.currentTarget) {\n        return;\n      }\n\n      if (this._config.backdrop === true) {\n        this.hide();\n      } else if (this._config.backdrop === 'static') {\n        this._triggerBackdropTransition();\n      }\n    });\n\n    this._backdrop.show(callback);\n  }\n\n  _isAnimated() {\n    return this._element.classList.contains(CLASS_NAME_FADE$3);\n  }\n\n  _triggerBackdropTransition() {\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n\n    if (hideEvent.defaultPrevented) {\n      return;\n    }\n\n    const {\n      classList,\n      scrollHeight,\n      style\n    } = this._element;\n    const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed\n\n    if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {\n      return;\n    }\n\n    if (!isModalOverflowing) {\n      style.overflowY = 'hidden';\n    }\n\n    classList.add(CLASS_NAME_STATIC);\n\n    this._queueCallback(() => {\n      classList.remove(CLASS_NAME_STATIC);\n\n      if (!isModalOverflowing) {\n        this._queueCallback(() => {\n          style.overflowY = '';\n        }, this._dialog);\n      }\n    }, this._dialog);\n\n    this._element.focus();\n  } // ----------------------------------------------------------------------\n  // the following methods are used to handle overflowing modals\n  // ----------------------------------------------------------------------\n\n\n  _adjustDialog() {\n    const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n    const scrollbarWidth = this._scrollBar.getWidth();\n\n    const isBodyOverflowing = scrollbarWidth > 0;\n\n    if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {\n      this._element.style.paddingLeft = `${scrollbarWidth}px`;\n    }\n\n    if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {\n      this._element.style.paddingRight = `${scrollbarWidth}px`;\n    }\n  }\n\n  _resetAdjustments() {\n    this._element.style.paddingLeft = '';\n    this._element.style.paddingRight = '';\n  } // Static\n\n\n  static jQueryInterface(config, relatedTarget) {\n    return this.each(function () {\n      const data = Modal.getOrCreateInstance(this, config);\n\n      if (typeof config !== 'string') {\n        return;\n      }\n\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n\n      data[config](relatedTarget);\n    });\n  }\n\n}\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n  const target = getElementFromSelector(this);\n\n  if (['A', 'AREA'].includes(this.tagName)) {\n    event.preventDefault();\n  }\n\n  EventHandler.one(target, EVENT_SHOW$3, showEvent => {\n    if (showEvent.defaultPrevented) {\n      // only register focus restorer if modal will actually get shown\n      return;\n    }\n\n    EventHandler.one(target, EVENT_HIDDEN$3, () => {\n      if (isVisible(this)) {\n        this.focus();\n      }\n    });\n  });\n  const data = Modal.getOrCreateInstance(target);\n  data.toggle(this);\n});\nenableDismissTrigger(Modal);\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Modal to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Modal);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME$5 = 'offcanvas';\nconst DATA_KEY$5 = 'bs.offcanvas';\nconst EVENT_KEY$5 = `.${DATA_KEY$5}`;\nconst DATA_API_KEY$2 = '.data-api';\nconst EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$5}${DATA_API_KEY$2}`;\nconst ESCAPE_KEY = 'Escape';\nconst Default$4 = {\n  backdrop: true,\n  keyboard: true,\n  scroll: false\n};\nconst DefaultType$4 = {\n  backdrop: 'boolean',\n  keyboard: 'boolean',\n  scroll: 'boolean'\n};\nconst CLASS_NAME_SHOW$3 = 'show';\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\nconst OPEN_SELECTOR = '.offcanvas.show';\nconst EVENT_SHOW$2 = `show${EVENT_KEY$5}`;\nconst EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`;\nconst EVENT_HIDE$2 = `hide${EVENT_KEY$5}`;\nconst EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`;\nconst EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`;\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;\nconst SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Offcanvas extends BaseComponent {\n  constructor(element, config) {\n    super(element);\n    this._config = this._getConfig(config);\n    this._isShown = false;\n    this._backdrop = this._initializeBackDrop();\n    this._focustrap = this._initializeFocusTrap();\n\n    this._addEventListeners();\n  } // Getters\n\n\n  static get NAME() {\n    return NAME$5;\n  }\n\n  static get Default() {\n    return Default$4;\n  } // Public\n\n\n  toggle(relatedTarget) {\n    return this._isShown ? this.hide() : this.show(relatedTarget);\n  }\n\n  show(relatedTarget) {\n    if (this._isShown) {\n      return;\n    }\n\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$2, {\n      relatedTarget\n    });\n\n    if (showEvent.defaultPrevented) {\n      return;\n    }\n\n    this._isShown = true;\n    this._element.style.visibility = 'visible';\n\n    this._backdrop.show();\n\n    if (!this._config.scroll) {\n      new ScrollBarHelper().hide();\n    }\n\n    this._element.removeAttribute('aria-hidden');\n\n    this._element.setAttribute('aria-modal', true);\n\n    this._element.setAttribute('role', 'dialog');\n\n    this._element.classList.add(CLASS_NAME_SHOW$3);\n\n    const completeCallBack = () => {\n      if (!this._config.scroll) {\n        this._focustrap.activate();\n      }\n\n      EventHandler.trigger(this._element, EVENT_SHOWN$2, {\n        relatedTarget\n      });\n    };\n\n    this._queueCallback(completeCallBack, this._element, true);\n  }\n\n  hide() {\n    if (!this._isShown) {\n      return;\n    }\n\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$2);\n\n    if (hideEvent.defaultPrevented) {\n      return;\n    }\n\n    this._focustrap.deactivate();\n\n    this._element.blur();\n\n    this._isShown = false;\n\n    this._element.classList.remove(CLASS_NAME_SHOW$3);\n\n    this._backdrop.hide();\n\n    const completeCallback = () => {\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._element.removeAttribute('role');\n\n      this._element.style.visibility = 'hidden';\n\n      if (!this._config.scroll) {\n        new ScrollBarHelper().reset();\n      }\n\n      EventHandler.trigger(this._element, EVENT_HIDDEN$2);\n    };\n\n    this._queueCallback(completeCallback, this._element, true);\n  }\n\n  dispose() {\n    this._backdrop.dispose();\n\n    this._focustrap.deactivate();\n\n    super.dispose();\n  } // Private\n\n\n  _getConfig(config) {\n    config = { ...Default$4,\n      ...Manipulator.getDataAttributes(this._element),\n      ...(typeof config === 'object' ? config : {})\n    };\n    typeCheckConfig(NAME$5, config, DefaultType$4);\n    return config;\n  }\n\n  _initializeBackDrop() {\n    return new Backdrop({\n      className: CLASS_NAME_BACKDROP,\n      isVisible: this._config.backdrop,\n      isAnimated: true,\n      rootElement: this._element.parentNode,\n      clickCallback: () => this.hide()\n    });\n  }\n\n  _initializeFocusTrap() {\n    return new FocusTrap({\n      trapElement: this._element\n    });\n  }\n\n  _addEventListeners() {\n    EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n      if (this._config.keyboard && event.key === ESCAPE_KEY) {\n        this.hide();\n      }\n    });\n  } // Static\n\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Offcanvas.getOrCreateInstance(this, config);\n\n      if (typeof config !== 'string') {\n        return;\n      }\n\n      if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n\n      data[config](this);\n    });\n  }\n\n}\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n  const target = getElementFromSelector(this);\n\n  if (['A', 'AREA'].includes(this.tagName)) {\n    event.preventDefault();\n  }\n\n  if (isDisabled(this)) {\n    return;\n  }\n\n  EventHandler.one(target, EVENT_HIDDEN$2, () => {\n    // focus on trigger when it is closed\n    if (isVisible(this)) {\n      this.focus();\n    }\n  }); // avoid conflict when clicking a toggler of an offcanvas, while another is open\n\n  const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n\n  if (allReadyOpen && allReadyOpen !== target) {\n    Offcanvas.getInstance(allReadyOpen).hide();\n  }\n\n  const data = Offcanvas.getOrCreateInstance(target);\n  data.toggle(this);\n});\nEventHandler.on(window, EVENT_LOAD_DATA_API$1, () => SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));\nenableDismissTrigger(Offcanvas);\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\ndefineJQueryPlugin(Offcanvas);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\nconst uriAttrs = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n/**\n * A pattern that recognizes a commonly useful subset of URLs that are safe.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\n\nconst SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i;\n/**\n * A pattern that matches safe data URLs. Only matches image, video and audio types.\n *\n * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n */\n\nconst DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i;\n\nconst allowedAttribute = (attr, allowedAttributeList) => {\n  const attrName = attr.nodeName.toLowerCase();\n\n  if (allowedAttributeList.includes(attrName)) {\n    if (uriAttrs.has(attrName)) {\n      return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue));\n    }\n\n    return true;\n  }\n\n  const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp); // Check if a regular expression validates the attribute.\n\n  for (let i = 0, len = regExp.length; i < len; i++) {\n    if (regExp[i].test(attrName)) {\n      return true;\n    }\n  }\n\n  return false;\n};\n\nconst DefaultAllowlist = {\n  // Global attributes allowed on any supplied element below.\n  '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n  a: ['target', 'href', 'title', 'rel'],\n  area: [],\n  b: [],\n  br: [],\n  col: [],\n  code: [],\n  div: [],\n  em: [],\n  hr: [],\n  h1: [],\n  h2: [],\n  h3: [],\n  h4: [],\n  h5: [],\n  h6: [],\n  i: [],\n  img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n  li: [],\n  ol: [],\n  p: [],\n  pre: [],\n  s: [],\n  small: [],\n  span: [],\n  sub: [],\n  sup: [],\n  strong: [],\n  u: [],\n  ul: []\n};\nfunction sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n  if (!unsafeHtml.length) {\n    return unsafeHtml;\n  }\n\n  if (sanitizeFn && typeof sanitizeFn === 'function') {\n    return sanitizeFn(unsafeHtml);\n  }\n\n  const domParser = new window.DOMParser();\n  const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n  const allowlistKeys = Object.keys(allowList);\n  const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n\n  for (let i = 0, len = elements.length; i < len; i++) {\n    const el = elements[i];\n    const elName = el.nodeName.toLowerCase();\n\n    if (!allowlistKeys.includes(elName)) {\n      el.remove();\n      continue;\n    }\n\n    const attributeList = [].concat(...el.attributes);\n    const allowedAttributes = [].concat(allowList['*'] || [], allowList[elName] || []);\n    attributeList.forEach(attr => {\n      if (!allowedAttribute(attr, allowedAttributes)) {\n        el.removeAttribute(attr.nodeName);\n      }\n    });\n  }\n\n  return createdDocument.body.innerHTML;\n}\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME$4 = 'tooltip';\nconst DATA_KEY$4 = 'bs.tooltip';\nconst EVENT_KEY$4 = `.${DATA_KEY$4}`;\nconst CLASS_PREFIX$1 = 'bs-tooltip';\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\nconst DefaultType$3 = {\n  animation: 'boolean',\n  template: 'string',\n  title: '(string|element|function)',\n  trigger: 'string',\n  delay: '(number|object)',\n  html: 'boolean',\n  selector: '(string|boolean)',\n  placement: '(string|function)',\n  offset: '(array|string|function)',\n  container: '(string|element|boolean)',\n  fallbackPlacements: 'array',\n  boundary: '(string|element)',\n  customClass: '(string|function)',\n  sanitize: 'boolean',\n  sanitizeFn: '(null|function)',\n  allowList: 'object',\n  popperConfig: '(null|object|function)'\n};\nconst AttachmentMap = {\n  AUTO: 'auto',\n  TOP: 'top',\n  RIGHT: isRTL() ? 'left' : 'right',\n  BOTTOM: 'bottom',\n  LEFT: isRTL() ? 'right' : 'left'\n};\nconst Default$3 = {\n  animation: true,\n  template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"tooltip-arrow\"></div>' + '<div class=\"tooltip-inner\"></div>' + '</div>',\n  trigger: 'hover focus',\n  title: '',\n  delay: 0,\n  html: false,\n  selector: false,\n  placement: 'top',\n  offset: [0, 0],\n  container: false,\n  fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n  boundary: 'clippingParents',\n  customClass: '',\n  sanitize: true,\n  sanitizeFn: null,\n  allowList: DefaultAllowlist,\n  popperConfig: null\n};\nconst Event$2 = {\n  HIDE: `hide${EVENT_KEY$4}`,\n  HIDDEN: `hidden${EVENT_KEY$4}`,\n  SHOW: `show${EVENT_KEY$4}`,\n  SHOWN: `shown${EVENT_KEY$4}`,\n  INSERTED: `inserted${EVENT_KEY$4}`,\n  CLICK: `click${EVENT_KEY$4}`,\n  FOCUSIN: `focusin${EVENT_KEY$4}`,\n  FOCUSOUT: `focusout${EVENT_KEY$4}`,\n  MOUSEENTER: `mouseenter${EVENT_KEY$4}`,\n  MOUSELEAVE: `mouseleave${EVENT_KEY$4}`\n};\nconst CLASS_NAME_FADE$2 = 'fade';\nconst CLASS_NAME_MODAL = 'modal';\nconst CLASS_NAME_SHOW$2 = 'show';\nconst HOVER_STATE_SHOW = 'show';\nconst HOVER_STATE_OUT = 'out';\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\nconst EVENT_MODAL_HIDE = 'hide.bs.modal';\nconst TRIGGER_HOVER = 'hover';\nconst TRIGGER_FOCUS = 'focus';\nconst TRIGGER_CLICK = 'click';\nconst TRIGGER_MANUAL = 'manual';\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tooltip extends BaseComponent {\n  constructor(element, config) {\n    if (typeof Popper === 'undefined') {\n      throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n    }\n\n    super(element); // private\n\n    this._isEnabled = true;\n    this._timeout = 0;\n    this._hoverState = '';\n    this._activeTrigger = {};\n    this._popper = null; // Protected\n\n    this._config = this._getConfig(config);\n    this.tip = null;\n\n    this._setListeners();\n  } // Getters\n\n\n  static get Default() {\n    return Default$3;\n  }\n\n  static get NAME() {\n    return NAME$4;\n  }\n\n  static get Event() {\n    return Event$2;\n  }\n\n  static get DefaultType() {\n    return DefaultType$3;\n  } // Public\n\n\n  enable() {\n    this._isEnabled = true;\n  }\n\n  disable() {\n    this._isEnabled = false;\n  }\n\n  toggleEnabled() {\n    this._isEnabled = !this._isEnabled;\n  }\n\n  toggle(event) {\n    if (!this._isEnabled) {\n      return;\n    }\n\n    if (event) {\n      const context = this._initializeOnDelegatedTarget(event);\n\n      context._activeTrigger.click = !context._activeTrigger.click;\n\n      if (context._isWithActiveTrigger()) {\n        context._enter(null, context);\n      } else {\n        context._leave(null, context);\n      }\n    } else {\n      if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$2)) {\n        this._leave(null, this);\n\n        return;\n      }\n\n      this._enter(null, this);\n    }\n  }\n\n  dispose() {\n    clearTimeout(this._timeout);\n    EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n\n    if (this.tip) {\n      this.tip.remove();\n    }\n\n    if (this._popper) {\n      this._popper.destroy();\n    }\n\n    super.dispose();\n  }\n\n  show() {\n    if (this._element.style.display === 'none') {\n      throw new Error('Please use show on visible elements');\n    }\n\n    if (!(this.isWithContent() && this._isEnabled)) {\n      return;\n    }\n\n    const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW);\n    const shadowRoot = findShadowRoot(this._element);\n    const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element);\n\n    if (showEvent.defaultPrevented || !isInTheDom) {\n      return;\n    }\n\n    const tip = this.getTipElement();\n    const tipId = getUID(this.constructor.NAME);\n    tip.setAttribute('id', tipId);\n\n    this._element.setAttribute('aria-describedby', tipId);\n\n    if (this._config.animation) {\n      tip.classList.add(CLASS_NAME_FADE$2);\n    }\n\n    const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;\n\n    const attachment = this._getAttachment(placement);\n\n    this._addAttachmentClass(attachment);\n\n    const {\n      container\n    } = this._config;\n    Data.set(tip, this.constructor.DATA_KEY, this);\n\n    if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n      container.append(tip);\n      EventHandler.trigger(this._element, this.constructor.Event.INSERTED);\n    }\n\n    if (this._popper) {\n      this._popper.update();\n    } else {\n      this._popper = Popper.createPopper(this._element, tip, this._getPopperConfig(attachment));\n    }\n\n    tip.classList.add(CLASS_NAME_SHOW$2);\n\n    const customClass = this._resolvePossibleFunction(this._config.customClass);\n\n    if (customClass) {\n      tip.classList.add(...customClass.split(' '));\n    } // If this is a touch-enabled device we add extra\n    // empty mouseover listeners to the body's immediate children;\n    // only needed because of broken event delegation on iOS\n    // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n    if ('ontouchstart' in document.documentElement) {\n      [].concat(...document.body.children).forEach(element => {\n        EventHandler.on(element, 'mouseover', noop);\n      });\n    }\n\n    const complete = () => {\n      const prevHoverState = this._hoverState;\n      this._hoverState = null;\n      EventHandler.trigger(this._element, this.constructor.Event.SHOWN);\n\n      if (prevHoverState === HOVER_STATE_OUT) {\n        this._leave(null, this);\n      }\n    };\n\n    const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);\n\n    this._queueCallback(complete, this.tip, isAnimated);\n  }\n\n  hide() {\n    if (!this._popper) {\n      return;\n    }\n\n    const tip = this.getTipElement();\n\n    const complete = () => {\n      if (this._isWithActiveTrigger()) {\n        return;\n      }\n\n      if (this._hoverState !== HOVER_STATE_SHOW) {\n        tip.remove();\n      }\n\n      this._cleanTipClass();\n\n      this._element.removeAttribute('aria-describedby');\n\n      EventHandler.trigger(this._element, this.constructor.Event.HIDDEN);\n\n      if (this._popper) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    };\n\n    const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE);\n\n    if (hideEvent.defaultPrevented) {\n      return;\n    }\n\n    tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra\n    // empty mouseover listeners we added for iOS support\n\n    if ('ontouchstart' in document.documentElement) {\n      [].concat(...document.body.children).forEach(element => EventHandler.off(element, 'mouseover', noop));\n    }\n\n    this._activeTrigger[TRIGGER_CLICK] = false;\n    this._activeTrigger[TRIGGER_FOCUS] = false;\n    this._activeTrigger[TRIGGER_HOVER] = false;\n    const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);\n\n    this._queueCallback(complete, this.tip, isAnimated);\n\n    this._hoverState = '';\n  }\n\n  update() {\n    if (this._popper !== null) {\n      this._popper.update();\n    }\n  } // Protected\n\n\n  isWithContent() {\n    return Boolean(this.getTitle());\n  }\n\n  getTipElement() {\n    if (this.tip) {\n      return this.tip;\n    }\n\n    const element = document.createElement('div');\n    element.innerHTML = this._config.template;\n    const tip = element.children[0];\n    this.setContent(tip);\n    tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n    this.tip = tip;\n    return this.tip;\n  }\n\n  setContent(tip) {\n    this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER);\n  }\n\n  _sanitizeAndSetContent(template, content, selector) {\n    const templateElement = SelectorEngine.findOne(selector, template);\n\n    if (!content && templateElement) {\n      templateElement.remove();\n      return;\n    } // we use append for html objects to maintain js events\n\n\n    this.setElementContent(templateElement, content);\n  }\n\n  setElementContent(element, content) {\n    if (element === null) {\n      return;\n    }\n\n    if (isElement(content)) {\n      content = getElement(content); // content is a DOM node or a jQuery\n\n      if (this._config.html) {\n        if (content.parentNode !== element) {\n          element.innerHTML = '';\n          element.append(content);\n        }\n      } else {\n        element.textContent = content.textContent;\n      }\n\n      return;\n    }\n\n    if (this._config.html) {\n      if (this._config.sanitize) {\n        content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn);\n      }\n\n      element.innerHTML = content;\n    } else {\n      element.textContent = content;\n    }\n  }\n\n  getTitle() {\n    const title = this._element.getAttribute('data-bs-original-title') || this._config.title;\n\n    return this._resolvePossibleFunction(title);\n  }\n\n  updateAttachment(attachment) {\n    if (attachment === 'right') {\n      return 'end';\n    }\n\n    if (attachment === 'left') {\n      return 'start';\n    }\n\n    return attachment;\n  } // Private\n\n\n  _initializeOnDelegatedTarget(event, context) {\n    return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n  }\n\n  _getOffset() {\n    const {\n      offset\n    } = this._config;\n\n    if (typeof offset === 'string') {\n      return offset.split(',').map(val => Number.parseInt(val, 10));\n    }\n\n    if (typeof offset === 'function') {\n      return popperData => offset(popperData, this._element);\n    }\n\n    return offset;\n  }\n\n  _resolvePossibleFunction(content) {\n    return typeof content === 'function' ? content.call(this._element) : content;\n  }\n\n  _getPopperConfig(attachment) {\n    const defaultBsPopperConfig = {\n      placement: attachment,\n      modifiers: [{\n        name: 'flip',\n        options: {\n          fallbackPlacements: this._config.fallbackPlacements\n        }\n      }, {\n        name: 'offset',\n        options: {\n          offset: this._getOffset()\n        }\n      }, {\n        name: 'preventOverflow',\n        options: {\n          boundary: this._config.boundary\n        }\n      }, {\n        name: 'arrow',\n        options: {\n          element: `.${this.constructor.NAME}-arrow`\n        }\n      }, {\n        name: 'onChange',\n        enabled: true,\n        phase: 'afterWrite',\n        fn: data => this._handlePopperPlacementChange(data)\n      }],\n      onFirstUpdate: data => {\n        if (data.options.placement !== data.placement) {\n          this._handlePopperPlacementChange(data);\n        }\n      }\n    };\n    return { ...defaultBsPopperConfig,\n      ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n    };\n  }\n\n  _addAttachmentClass(attachment) {\n    this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`);\n  }\n\n  _getAttachment(placement) {\n    return AttachmentMap[placement.toUpperCase()];\n  }\n\n  _setListeners() {\n    const triggers = this._config.trigger.split(' ');\n\n    triggers.forEach(trigger => {\n      if (trigger === 'click') {\n        EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event));\n      } else if (trigger !== TRIGGER_MANUAL) {\n        const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN;\n        const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT;\n        EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event));\n        EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event));\n      }\n    });\n\n    this._hideModalHandler = () => {\n      if (this._element) {\n        this.hide();\n      }\n    };\n\n    EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n\n    if (this._config.selector) {\n      this._config = { ...this._config,\n        trigger: 'manual',\n        selector: ''\n      };\n    } else {\n      this._fixTitle();\n    }\n  }\n\n  _fixTitle() {\n    const title = this._element.getAttribute('title');\n\n    const originalTitleType = typeof this._element.getAttribute('data-bs-original-title');\n\n    if (title || originalTitleType !== 'string') {\n      this._element.setAttribute('data-bs-original-title', title || '');\n\n      if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n        this._element.setAttribute('aria-label', title);\n      }\n\n      this._element.setAttribute('title', '');\n    }\n  }\n\n  _enter(event, context) {\n    context = this._initializeOnDelegatedTarget(event, context);\n\n    if (event) {\n      context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n    }\n\n    if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$2) || context._hoverState === HOVER_STATE_SHOW) {\n      context._hoverState = HOVER_STATE_SHOW;\n      return;\n    }\n\n    clearTimeout(context._timeout);\n    context._hoverState = HOVER_STATE_SHOW;\n\n    if (!context._config.delay || !context._config.delay.show) {\n      context.show();\n      return;\n    }\n\n    context._timeout = setTimeout(() => {\n      if (context._hoverState === HOVER_STATE_SHOW) {\n        context.show();\n      }\n    }, context._config.delay.show);\n  }\n\n  _leave(event, context) {\n    context = this._initializeOnDelegatedTarget(event, context);\n\n    if (event) {\n      context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n    }\n\n    if (context._isWithActiveTrigger()) {\n      return;\n    }\n\n    clearTimeout(context._timeout);\n    context._hoverState = HOVER_STATE_OUT;\n\n    if (!context._config.delay || !context._config.delay.hide) {\n      context.hide();\n      return;\n    }\n\n    context._timeout = setTimeout(() => {\n      if (context._hoverState === HOVER_STATE_OUT) {\n        context.hide();\n      }\n    }, context._config.delay.hide);\n  }\n\n  _isWithActiveTrigger() {\n    for (const trigger in this._activeTrigger) {\n      if (this._activeTrigger[trigger]) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  _getConfig(config) {\n    const dataAttributes = Manipulator.getDataAttributes(this._element);\n    Object.keys(dataAttributes).forEach(dataAttr => {\n      if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n        delete dataAttributes[dataAttr];\n      }\n    });\n    config = { ...this.constructor.Default,\n      ...dataAttributes,\n      ...(typeof config === 'object' && config ? config : {})\n    };\n    config.container = config.container === false ? document.body : getElement(config.container);\n\n    if (typeof config.delay === 'number') {\n      config.delay = {\n        show: config.delay,\n        hide: config.delay\n      };\n    }\n\n    if (typeof config.title === 'number') {\n      config.title = config.title.toString();\n    }\n\n    if (typeof config.content === 'number') {\n      config.content = config.content.toString();\n    }\n\n    typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n\n    if (config.sanitize) {\n      config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn);\n    }\n\n    return config;\n  }\n\n  _getDelegateConfig() {\n    const config = {};\n\n    for (const key in this._config) {\n      if (this.constructor.Default[key] !== this._config[key]) {\n        config[key] = this._config[key];\n      }\n    } // In the future can be replaced with:\n    // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n    // `Object.fromEntries(keysWithDifferentValues)`\n\n\n    return config;\n  }\n\n  _cleanTipClass() {\n    const tip = this.getTipElement();\n    const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g');\n    const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex);\n\n    if (tabClass !== null && tabClass.length > 0) {\n      tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));\n    }\n  }\n\n  _getBasicClassPrefix() {\n    return CLASS_PREFIX$1;\n  }\n\n  _handlePopperPlacementChange(popperData) {\n    const {\n      state\n    } = popperData;\n\n    if (!state) {\n      return;\n    }\n\n    this.tip = state.elements.popper;\n\n    this._cleanTipClass();\n\n    this._addAttachmentClass(this._getAttachment(state.placement));\n  } // Static\n\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Tooltip.getOrCreateInstance(this, config);\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config]();\n      }\n    });\n  }\n\n}\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tooltip to jQuery only if jQuery is present\n */\n\n\ndefineJQueryPlugin(Tooltip);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME$3 = 'popover';\nconst DATA_KEY$3 = 'bs.popover';\nconst EVENT_KEY$3 = `.${DATA_KEY$3}`;\nconst CLASS_PREFIX = 'bs-popover';\nconst Default$2 = { ...Tooltip.Default,\n  placement: 'right',\n  offset: [0, 8],\n  trigger: 'click',\n  content: '',\n  template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"popover-arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div>' + '</div>'\n};\nconst DefaultType$2 = { ...Tooltip.DefaultType,\n  content: '(string|element|function)'\n};\nconst Event$1 = {\n  HIDE: `hide${EVENT_KEY$3}`,\n  HIDDEN: `hidden${EVENT_KEY$3}`,\n  SHOW: `show${EVENT_KEY$3}`,\n  SHOWN: `shown${EVENT_KEY$3}`,\n  INSERTED: `inserted${EVENT_KEY$3}`,\n  CLICK: `click${EVENT_KEY$3}`,\n  FOCUSIN: `focusin${EVENT_KEY$3}`,\n  FOCUSOUT: `focusout${EVENT_KEY$3}`,\n  MOUSEENTER: `mouseenter${EVENT_KEY$3}`,\n  MOUSELEAVE: `mouseleave${EVENT_KEY$3}`\n};\nconst SELECTOR_TITLE = '.popover-header';\nconst SELECTOR_CONTENT = '.popover-body';\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Popover extends Tooltip {\n  // Getters\n  static get Default() {\n    return Default$2;\n  }\n\n  static get NAME() {\n    return NAME$3;\n  }\n\n  static get Event() {\n    return Event$1;\n  }\n\n  static get DefaultType() {\n    return DefaultType$2;\n  } // Overrides\n\n\n  isWithContent() {\n    return this.getTitle() || this._getContent();\n  }\n\n  setContent(tip) {\n    this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);\n\n    this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);\n  } // Private\n\n\n  _getContent() {\n    return this._resolvePossibleFunction(this._config.content);\n  }\n\n  _getBasicClassPrefix() {\n    return CLASS_PREFIX;\n  } // Static\n\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Popover.getOrCreateInstance(this, config);\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config]();\n      }\n    });\n  }\n\n}\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Popover to jQuery only if jQuery is present\n */\n\n\ndefineJQueryPlugin(Popover);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME$2 = 'scrollspy';\nconst DATA_KEY$2 = 'bs.scrollspy';\nconst EVENT_KEY$2 = `.${DATA_KEY$2}`;\nconst DATA_API_KEY$1 = '.data-api';\nconst Default$1 = {\n  offset: 10,\n  method: 'auto',\n  target: ''\n};\nconst DefaultType$1 = {\n  offset: 'number',\n  method: 'string',\n  target: '(string|element)'\n};\nconst EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\nconst EVENT_SCROLL = `scroll${EVENT_KEY$2}`;\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY$2}${DATA_API_KEY$1}`;\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\nconst CLASS_NAME_ACTIVE$1 = 'active';\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\nconst SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';\nconst SELECTOR_NAV_LINKS = '.nav-link';\nconst SELECTOR_NAV_ITEMS = '.nav-item';\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;\nconst SELECTOR_DROPDOWN$1 = '.dropdown';\nconst SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\nconst METHOD_OFFSET = 'offset';\nconst METHOD_POSITION = 'position';\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass ScrollSpy extends BaseComponent {\n  constructor(element, config) {\n    super(element);\n    this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;\n    this._config = this._getConfig(config);\n    this._offsets = [];\n    this._targets = [];\n    this._activeTarget = null;\n    this._scrollHeight = 0;\n    EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process());\n    this.refresh();\n\n    this._process();\n  } // Getters\n\n\n  static get Default() {\n    return Default$1;\n  }\n\n  static get NAME() {\n    return NAME$2;\n  } // Public\n\n\n  refresh() {\n    const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;\n    const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n    const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;\n    this._offsets = [];\n    this._targets = [];\n    this._scrollHeight = this._getScrollHeight();\n    const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target);\n    targets.map(element => {\n      const targetSelector = getSelectorFromElement(element);\n      const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null;\n\n      if (target) {\n        const targetBCR = target.getBoundingClientRect();\n\n        if (targetBCR.width || targetBCR.height) {\n          return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector];\n        }\n      }\n\n      return null;\n    }).filter(item => item).sort((a, b) => a[0] - b[0]).forEach(item => {\n      this._offsets.push(item[0]);\n\n      this._targets.push(item[1]);\n    });\n  }\n\n  dispose() {\n    EventHandler.off(this._scrollElement, EVENT_KEY$2);\n    super.dispose();\n  } // Private\n\n\n  _getConfig(config) {\n    config = { ...Default$1,\n      ...Manipulator.getDataAttributes(this._element),\n      ...(typeof config === 'object' && config ? config : {})\n    };\n    config.target = getElement(config.target) || document.documentElement;\n    typeCheckConfig(NAME$2, config, DefaultType$1);\n    return config;\n  }\n\n  _getScrollTop() {\n    return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n  }\n\n  _getScrollHeight() {\n    return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n  }\n\n  _getOffsetHeight() {\n    return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n  }\n\n  _process() {\n    const scrollTop = this._getScrollTop() + this._config.offset;\n\n    const scrollHeight = this._getScrollHeight();\n\n    const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n    if (this._scrollHeight !== scrollHeight) {\n      this.refresh();\n    }\n\n    if (scrollTop >= maxScroll) {\n      const target = this._targets[this._targets.length - 1];\n\n      if (this._activeTarget !== target) {\n        this._activate(target);\n      }\n\n      return;\n    }\n\n    if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n      this._activeTarget = null;\n\n      this._clear();\n\n      return;\n    }\n\n    for (let i = this._offsets.length; i--;) {\n      const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n      if (isActiveTarget) {\n        this._activate(this._targets[i]);\n      }\n    }\n  }\n\n  _activate(target) {\n    this._activeTarget = target;\n\n    this._clear();\n\n    const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`);\n    const link = SelectorEngine.findOne(queries.join(','), this._config.target);\n    link.classList.add(CLASS_NAME_ACTIVE$1);\n\n    if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n      SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1);\n    } else {\n      SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1).forEach(listGroup => {\n        // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n        SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1)); // Handle special case when .nav-link is inside .nav-item\n\n        SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS).forEach(navItem => {\n          SelectorEngine.children(navItem, SELECTOR_NAV_LINKS).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1));\n        });\n      });\n    }\n\n    EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {\n      relatedTarget: target\n    });\n  }\n\n  _clear() {\n    SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target).filter(node => node.classList.contains(CLASS_NAME_ACTIVE$1)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE$1));\n  } // Static\n\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = ScrollSpy.getOrCreateInstance(this, config);\n\n      if (typeof config !== 'string') {\n        return;\n      }\n\n      if (typeof data[config] === 'undefined') {\n        throw new TypeError(`No method named \"${config}\"`);\n      }\n\n      data[config]();\n    });\n  }\n\n}\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n  SelectorEngine.find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy));\n});\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .ScrollSpy to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(ScrollSpy);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): tab.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME$1 = 'tab';\nconst DATA_KEY$1 = 'bs.tab';\nconst EVENT_KEY$1 = `.${DATA_KEY$1}`;\nconst DATA_API_KEY = '.data-api';\nconst EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;\nconst EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;\nconst EVENT_SHOW$1 = `show${EVENT_KEY$1}`;\nconst EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}${DATA_API_KEY}`;\nconst CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';\nconst CLASS_NAME_ACTIVE = 'active';\nconst CLASS_NAME_FADE$1 = 'fade';\nconst CLASS_NAME_SHOW$1 = 'show';\nconst SELECTOR_DROPDOWN = '.dropdown';\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\nconst SELECTOR_ACTIVE = '.active';\nconst SELECTOR_ACTIVE_UL = ':scope > li > .active';\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]';\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\nconst SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active';\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Tab extends BaseComponent {\n  // Getters\n  static get NAME() {\n    return NAME$1;\n  } // Public\n\n\n  show() {\n    if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE)) {\n      return;\n    }\n\n    let previous;\n    const target = getElementFromSelector(this._element);\n\n    const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);\n\n    if (listElement) {\n      const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;\n      previous = SelectorEngine.find(itemSelector, listElement);\n      previous = previous[previous.length - 1];\n    }\n\n    const hideEvent = previous ? EventHandler.trigger(previous, EVENT_HIDE$1, {\n      relatedTarget: this._element\n    }) : null;\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$1, {\n      relatedTarget: previous\n    });\n\n    if (showEvent.defaultPrevented || hideEvent !== null && hideEvent.defaultPrevented) {\n      return;\n    }\n\n    this._activate(this._element, listElement);\n\n    const complete = () => {\n      EventHandler.trigger(previous, EVENT_HIDDEN$1, {\n        relatedTarget: this._element\n      });\n      EventHandler.trigger(this._element, EVENT_SHOWN$1, {\n        relatedTarget: previous\n      });\n    };\n\n    if (target) {\n      this._activate(target, target.parentNode, complete);\n    } else {\n      complete();\n    }\n  } // Private\n\n\n  _activate(element, container, callback) {\n    const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine.find(SELECTOR_ACTIVE_UL, container) : SelectorEngine.children(container, SELECTOR_ACTIVE);\n    const active = activeElements[0];\n    const isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE$1);\n\n    const complete = () => this._transitionComplete(element, active, callback);\n\n    if (active && isTransitioning) {\n      active.classList.remove(CLASS_NAME_SHOW$1);\n\n      this._queueCallback(complete, element, true);\n    } else {\n      complete();\n    }\n  }\n\n  _transitionComplete(element, active, callback) {\n    if (active) {\n      active.classList.remove(CLASS_NAME_ACTIVE);\n      const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);\n\n      if (dropdownChild) {\n        dropdownChild.classList.remove(CLASS_NAME_ACTIVE);\n      }\n\n      if (active.getAttribute('role') === 'tab') {\n        active.setAttribute('aria-selected', false);\n      }\n    }\n\n    element.classList.add(CLASS_NAME_ACTIVE);\n\n    if (element.getAttribute('role') === 'tab') {\n      element.setAttribute('aria-selected', true);\n    }\n\n    reflow(element);\n\n    if (element.classList.contains(CLASS_NAME_FADE$1)) {\n      element.classList.add(CLASS_NAME_SHOW$1);\n    }\n\n    let parent = element.parentNode;\n\n    if (parent && parent.nodeName === 'LI') {\n      parent = parent.parentNode;\n    }\n\n    if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {\n      const dropdownElement = element.closest(SELECTOR_DROPDOWN);\n\n      if (dropdownElement) {\n        SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement).forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE));\n      }\n\n      element.setAttribute('aria-expanded', true);\n    }\n\n    if (callback) {\n      callback();\n    }\n  } // Static\n\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Tab.getOrCreateInstance(this);\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config]();\n      }\n    });\n  }\n\n}\n/**\n * ------------------------------------------------------------------------\n * Data Api implementation\n * ------------------------------------------------------------------------\n */\n\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n  if (['A', 'AREA'].includes(this.tagName)) {\n    event.preventDefault();\n  }\n\n  if (isDisabled(this)) {\n    return;\n  }\n\n  const data = Tab.getOrCreateInstance(this);\n  data.show();\n});\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Tab to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Tab);\n\n/**\n * --------------------------------------------------------------------------\n * Bootstrap (v5.1.0): toast.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME = 'toast';\nconst DATA_KEY = 'bs.toast';\nconst EVENT_KEY = `.${DATA_KEY}`;\nconst EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;\nconst EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`;\nconst EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;\nconst EVENT_HIDE = `hide${EVENT_KEY}`;\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`;\nconst EVENT_SHOW = `show${EVENT_KEY}`;\nconst EVENT_SHOWN = `shown${EVENT_KEY}`;\nconst CLASS_NAME_FADE = 'fade';\nconst CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility\n\nconst CLASS_NAME_SHOW = 'show';\nconst CLASS_NAME_SHOWING = 'showing';\nconst DefaultType = {\n  animation: 'boolean',\n  autohide: 'boolean',\n  delay: 'number'\n};\nconst Default = {\n  animation: true,\n  autohide: true,\n  delay: 5000\n};\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Toast extends BaseComponent {\n  constructor(element, config) {\n    super(element);\n    this._config = this._getConfig(config);\n    this._timeout = null;\n    this._hasMouseInteraction = false;\n    this._hasKeyboardInteraction = false;\n\n    this._setListeners();\n  } // Getters\n\n\n  static get DefaultType() {\n    return DefaultType;\n  }\n\n  static get Default() {\n    return Default;\n  }\n\n  static get NAME() {\n    return NAME;\n  } // Public\n\n\n  show() {\n    const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);\n\n    if (showEvent.defaultPrevented) {\n      return;\n    }\n\n    this._clearTimeout();\n\n    if (this._config.animation) {\n      this._element.classList.add(CLASS_NAME_FADE);\n    }\n\n    const complete = () => {\n      this._element.classList.remove(CLASS_NAME_SHOWING);\n\n      EventHandler.trigger(this._element, EVENT_SHOWN);\n\n      this._maybeScheduleHide();\n    };\n\n    this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated\n\n\n    reflow(this._element);\n\n    this._element.classList.add(CLASS_NAME_SHOW);\n\n    this._element.classList.add(CLASS_NAME_SHOWING);\n\n    this._queueCallback(complete, this._element, this._config.animation);\n  }\n\n  hide() {\n    if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n      return;\n    }\n\n    const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n\n    if (hideEvent.defaultPrevented) {\n      return;\n    }\n\n    const complete = () => {\n      this._element.classList.add(CLASS_NAME_HIDE); // @deprecated\n\n\n      this._element.classList.remove(CLASS_NAME_SHOWING);\n\n      this._element.classList.remove(CLASS_NAME_SHOW);\n\n      EventHandler.trigger(this._element, EVENT_HIDDEN);\n    };\n\n    this._element.classList.add(CLASS_NAME_SHOWING);\n\n    this._queueCallback(complete, this._element, this._config.animation);\n  }\n\n  dispose() {\n    this._clearTimeout();\n\n    if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n      this._element.classList.remove(CLASS_NAME_SHOW);\n    }\n\n    super.dispose();\n  } // Private\n\n\n  _getConfig(config) {\n    config = { ...Default,\n      ...Manipulator.getDataAttributes(this._element),\n      ...(typeof config === 'object' && config ? config : {})\n    };\n    typeCheckConfig(NAME, config, this.constructor.DefaultType);\n    return config;\n  }\n\n  _maybeScheduleHide() {\n    if (!this._config.autohide) {\n      return;\n    }\n\n    if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n      return;\n    }\n\n    this._timeout = setTimeout(() => {\n      this.hide();\n    }, this._config.delay);\n  }\n\n  _onInteraction(event, isInteracting) {\n    switch (event.type) {\n      case 'mouseover':\n      case 'mouseout':\n        this._hasMouseInteraction = isInteracting;\n        break;\n\n      case 'focusin':\n      case 'focusout':\n        this._hasKeyboardInteraction = isInteracting;\n        break;\n    }\n\n    if (isInteracting) {\n      this._clearTimeout();\n\n      return;\n    }\n\n    const nextElement = event.relatedTarget;\n\n    if (this._element === nextElement || this._element.contains(nextElement)) {\n      return;\n    }\n\n    this._maybeScheduleHide();\n  }\n\n  _setListeners() {\n    EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));\n    EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));\n    EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));\n    EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));\n  }\n\n  _clearTimeout() {\n    clearTimeout(this._timeout);\n    this._timeout = null;\n  } // Static\n\n\n  static jQueryInterface(config) {\n    return this.each(function () {\n      const data = Toast.getOrCreateInstance(this, config);\n\n      if (typeof config === 'string') {\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](this);\n      }\n    });\n  }\n\n}\n\nenableDismissTrigger(Toast);\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n * add .Toast to jQuery only if jQuery is present\n */\n\ndefineJQueryPlugin(Toast);\n\nexport { Alert, Button, Carousel, Collapse, Dropdown, Modal, Offcanvas, Popover, ScrollSpy, Tab, Toast, Tooltip };\n//# sourceMappingURL=bootstrap.esm.js.map\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/bootstrap/dist/js/bootstrap.js",
    "content": "/*!\n  * Bootstrap v5.1.0 (https://getbootstrap.com/)\n  * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('@popperjs/core')) :\n  typeof define === 'function' && define.amd ? define(['@popperjs/core'], factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.bootstrap = factory(global.Popper));\n}(this, (function (Popper) { 'use strict';\n\n  function _interopNamespace(e) {\n    if (e && e.__esModule) return e;\n    var n = Object.create(null);\n    if (e) {\n      Object.keys(e).forEach(function (k) {\n        if (k !== 'default') {\n          var d = Object.getOwnPropertyDescriptor(e, k);\n          Object.defineProperty(n, k, d.get ? d : {\n            enumerable: true,\n            get: function () {\n              return e[k];\n            }\n          });\n        }\n      });\n    }\n    n['default'] = e;\n    return Object.freeze(n);\n  }\n\n  var Popper__namespace = /*#__PURE__*/_interopNamespace(Popper);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): util/index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const MAX_UID = 1000000;\n  const MILLISECONDS_MULTIPLIER = 1000;\n  const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  const toType = obj => {\n    if (obj === null || obj === undefined) {\n      return `${obj}`;\n    }\n\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  };\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  const getUID = prefix => {\n    do {\n      prefix += Math.floor(Math.random() * MAX_UID);\n    } while (document.getElementById(prefix));\n\n    return prefix;\n  };\n\n  const getSelector = element => {\n    let selector = element.getAttribute('data-bs-target');\n\n    if (!selector || selector === '#') {\n      let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes,\n      // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n      // `document.querySelector` will rightfully complain it is invalid.\n      // See https://github.com/twbs/bootstrap/issues/32273\n\n      if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) {\n        return null;\n      } // Just in case some CMS puts out a full URL with the anchor appended\n\n\n      if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) {\n        hrefAttr = `#${hrefAttr.split('#')[1]}`;\n      }\n\n      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null;\n    }\n\n    return selector;\n  };\n\n  const getSelectorFromElement = element => {\n    const selector = getSelector(element);\n\n    if (selector) {\n      return document.querySelector(selector) ? selector : null;\n    }\n\n    return null;\n  };\n\n  const getElementFromSelector = element => {\n    const selector = getSelector(element);\n    return selector ? document.querySelector(selector) : null;\n  };\n\n  const getTransitionDurationFromElement = element => {\n    if (!element) {\n      return 0;\n    } // Get transition-duration of the element\n\n\n    let {\n      transitionDuration,\n      transitionDelay\n    } = window.getComputedStyle(element);\n    const floatTransitionDuration = Number.parseFloat(transitionDuration);\n    const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n    if (!floatTransitionDuration && !floatTransitionDelay) {\n      return 0;\n    } // If multiple durations are defined, take the first\n\n\n    transitionDuration = transitionDuration.split(',')[0];\n    transitionDelay = transitionDelay.split(',')[0];\n    return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n  };\n\n  const triggerTransitionEnd = element => {\n    element.dispatchEvent(new Event(TRANSITION_END));\n  };\n\n  const isElement = obj => {\n    if (!obj || typeof obj !== 'object') {\n      return false;\n    }\n\n    if (typeof obj.jquery !== 'undefined') {\n      obj = obj[0];\n    }\n\n    return typeof obj.nodeType !== 'undefined';\n  };\n\n  const getElement = obj => {\n    if (isElement(obj)) {\n      // it's a jQuery object or a node element\n      return obj.jquery ? obj[0] : obj;\n    }\n\n    if (typeof obj === 'string' && obj.length > 0) {\n      return document.querySelector(obj);\n    }\n\n    return null;\n  };\n\n  const typeCheckConfig = (componentName, config, configTypes) => {\n    Object.keys(configTypes).forEach(property => {\n      const expectedTypes = configTypes[property];\n      const value = config[property];\n      const valueType = value && isElement(value) ? 'element' : toType(value);\n\n      if (!new RegExp(expectedTypes).test(valueType)) {\n        throw new TypeError(`${componentName.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n      }\n    });\n  };\n\n  const isVisible = element => {\n    if (!isElement(element) || element.getClientRects().length === 0) {\n      return false;\n    }\n\n    return getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n  };\n\n  const isDisabled = element => {\n    if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n      return true;\n    }\n\n    if (element.classList.contains('disabled')) {\n      return true;\n    }\n\n    if (typeof element.disabled !== 'undefined') {\n      return element.disabled;\n    }\n\n    return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n  };\n\n  const findShadowRoot = element => {\n    if (!document.documentElement.attachShadow) {\n      return null;\n    } // Can find the shadow root otherwise it'll return the document\n\n\n    if (typeof element.getRootNode === 'function') {\n      const root = element.getRootNode();\n      return root instanceof ShadowRoot ? root : null;\n    }\n\n    if (element instanceof ShadowRoot) {\n      return element;\n    } // when we don't find a shadow root\n\n\n    if (!element.parentNode) {\n      return null;\n    }\n\n    return findShadowRoot(element.parentNode);\n  };\n\n  const noop = () => {};\n  /**\n   * Trick to restart an element's animation\n   *\n   * @param {HTMLElement} element\n   * @return void\n   *\n   * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n   */\n\n\n  const reflow = element => {\n    // eslint-disable-next-line no-unused-expressions\n    element.offsetHeight;\n  };\n\n  const getjQuery = () => {\n    const {\n      jQuery\n    } = window;\n\n    if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n      return jQuery;\n    }\n\n    return null;\n  };\n\n  const DOMContentLoadedCallbacks = [];\n\n  const onDOMContentLoaded = callback => {\n    if (document.readyState === 'loading') {\n      // add listener on the first call when the document is in loading state\n      if (!DOMContentLoadedCallbacks.length) {\n        document.addEventListener('DOMContentLoaded', () => {\n          DOMContentLoadedCallbacks.forEach(callback => callback());\n        });\n      }\n\n      DOMContentLoadedCallbacks.push(callback);\n    } else {\n      callback();\n    }\n  };\n\n  const isRTL = () => document.documentElement.dir === 'rtl';\n\n  const defineJQueryPlugin = plugin => {\n    onDOMContentLoaded(() => {\n      const $ = getjQuery();\n      /* istanbul ignore if */\n\n      if ($) {\n        const name = plugin.NAME;\n        const JQUERY_NO_CONFLICT = $.fn[name];\n        $.fn[name] = plugin.jQueryInterface;\n        $.fn[name].Constructor = plugin;\n\n        $.fn[name].noConflict = () => {\n          $.fn[name] = JQUERY_NO_CONFLICT;\n          return plugin.jQueryInterface;\n        };\n      }\n    });\n  };\n\n  const execute = callback => {\n    if (typeof callback === 'function') {\n      callback();\n    }\n  };\n\n  const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n    if (!waitForTransition) {\n      execute(callback);\n      return;\n    }\n\n    const durationPadding = 5;\n    const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n    let called = false;\n\n    const handler = ({\n      target\n    }) => {\n      if (target !== transitionElement) {\n        return;\n      }\n\n      called = true;\n      transitionElement.removeEventListener(TRANSITION_END, handler);\n      execute(callback);\n    };\n\n    transitionElement.addEventListener(TRANSITION_END, handler);\n    setTimeout(() => {\n      if (!called) {\n        triggerTransitionEnd(transitionElement);\n      }\n    }, emulatedDuration);\n  };\n  /**\n   * Return the previous/next element of a list.\n   *\n   * @param {array} list    The list of elements\n   * @param activeElement   The active element\n   * @param shouldGetNext   Choose to get next or previous element\n   * @param isCycleAllowed\n   * @return {Element|elem} The proper element\n   */\n\n\n  const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n    let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed\n\n    if (index === -1) {\n      return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0];\n    }\n\n    const listLength = list.length;\n    index += shouldGetNext ? 1 : -1;\n\n    if (isCycleAllowed) {\n      index = (index + listLength) % listLength;\n    }\n\n    return list[Math.max(0, Math.min(index, listLength - 1))];\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): dom/event-handler.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const namespaceRegex = /[^.]*(?=\\..*)\\.|.*/;\n  const stripNameRegex = /\\..*/;\n  const stripUidRegex = /::\\d+$/;\n  const eventRegistry = {}; // Events storage\n\n  let uidEvent = 1;\n  const customEvents = {\n    mouseenter: 'mouseover',\n    mouseleave: 'mouseout'\n  };\n  const customEventsRegex = /^(mouseenter|mouseleave)/i;\n  const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']);\n  /**\n   * ------------------------------------------------------------------------\n   * Private methods\n   * ------------------------------------------------------------------------\n   */\n\n  function getUidEvent(element, uid) {\n    return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;\n  }\n\n  function getEvent(element) {\n    const uid = getUidEvent(element);\n    element.uidEvent = uid;\n    eventRegistry[uid] = eventRegistry[uid] || {};\n    return eventRegistry[uid];\n  }\n\n  function bootstrapHandler(element, fn) {\n    return function handler(event) {\n      event.delegateTarget = element;\n\n      if (handler.oneOff) {\n        EventHandler.off(element, event.type, fn);\n      }\n\n      return fn.apply(element, [event]);\n    };\n  }\n\n  function bootstrapDelegationHandler(element, selector, fn) {\n    return function handler(event) {\n      const domElements = element.querySelectorAll(selector);\n\n      for (let {\n        target\n      } = event; target && target !== this; target = target.parentNode) {\n        for (let i = domElements.length; i--;) {\n          if (domElements[i] === target) {\n            event.delegateTarget = target;\n\n            if (handler.oneOff) {\n              // eslint-disable-next-line unicorn/consistent-destructuring\n              EventHandler.off(element, event.type, selector, fn);\n            }\n\n            return fn.apply(target, [event]);\n          }\n        }\n      } // To please ESLint\n\n\n      return null;\n    };\n  }\n\n  function findHandler(events, handler, delegationSelector = null) {\n    const uidEventList = Object.keys(events);\n\n    for (let i = 0, len = uidEventList.length; i < len; i++) {\n      const event = events[uidEventList[i]];\n\n      if (event.originalHandler === handler && event.delegationSelector === delegationSelector) {\n        return event;\n      }\n    }\n\n    return null;\n  }\n\n  function normalizeParams(originalTypeEvent, handler, delegationFn) {\n    const delegation = typeof handler === 'string';\n    const originalHandler = delegation ? delegationFn : handler;\n    let typeEvent = getTypeEvent(originalTypeEvent);\n    const isNative = nativeEvents.has(typeEvent);\n\n    if (!isNative) {\n      typeEvent = originalTypeEvent;\n    }\n\n    return [delegation, originalHandler, typeEvent];\n  }\n\n  function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) {\n    if (typeof originalTypeEvent !== 'string' || !element) {\n      return;\n    }\n\n    if (!handler) {\n      handler = delegationFn;\n      delegationFn = null;\n    } // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n    // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n\n\n    if (customEventsRegex.test(originalTypeEvent)) {\n      const wrapFn = fn => {\n        return function (event) {\n          if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n            return fn.call(this, event);\n          }\n        };\n      };\n\n      if (delegationFn) {\n        delegationFn = wrapFn(delegationFn);\n      } else {\n        handler = wrapFn(handler);\n      }\n    }\n\n    const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);\n    const events = getEvent(element);\n    const handlers = events[typeEvent] || (events[typeEvent] = {});\n    const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null);\n\n    if (previousFn) {\n      previousFn.oneOff = previousFn.oneOff && oneOff;\n      return;\n    }\n\n    const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, ''));\n    const fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler);\n    fn.delegationSelector = delegation ? handler : null;\n    fn.originalHandler = originalHandler;\n    fn.oneOff = oneOff;\n    fn.uidEvent = uid;\n    handlers[uid] = fn;\n    element.addEventListener(typeEvent, fn, delegation);\n  }\n\n  function removeHandler(element, events, typeEvent, handler, delegationSelector) {\n    const fn = findHandler(events[typeEvent], handler, delegationSelector);\n\n    if (!fn) {\n      return;\n    }\n\n    element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n    delete events[typeEvent][fn.uidEvent];\n  }\n\n  function removeNamespacedHandlers(element, events, typeEvent, namespace) {\n    const storeElementEvent = events[typeEvent] || {};\n    Object.keys(storeElementEvent).forEach(handlerKey => {\n      if (handlerKey.includes(namespace)) {\n        const event = storeElementEvent[handlerKey];\n        removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);\n      }\n    });\n  }\n\n  function getTypeEvent(event) {\n    // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n    event = event.replace(stripNameRegex, '');\n    return customEvents[event] || event;\n  }\n\n  const EventHandler = {\n    on(element, event, handler, delegationFn) {\n      addHandler(element, event, handler, delegationFn, false);\n    },\n\n    one(element, event, handler, delegationFn) {\n      addHandler(element, event, handler, delegationFn, true);\n    },\n\n    off(element, originalTypeEvent, handler, delegationFn) {\n      if (typeof originalTypeEvent !== 'string' || !element) {\n        return;\n      }\n\n      const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn);\n      const inNamespace = typeEvent !== originalTypeEvent;\n      const events = getEvent(element);\n      const isNamespace = originalTypeEvent.startsWith('.');\n\n      if (typeof originalHandler !== 'undefined') {\n        // Simplest case: handler is passed, remove that listener ONLY.\n        if (!events || !events[typeEvent]) {\n          return;\n        }\n\n        removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null);\n        return;\n      }\n\n      if (isNamespace) {\n        Object.keys(events).forEach(elementEvent => {\n          removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n        });\n      }\n\n      const storeElementEvent = events[typeEvent] || {};\n      Object.keys(storeElementEvent).forEach(keyHandlers => {\n        const handlerKey = keyHandlers.replace(stripUidRegex, '');\n\n        if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n          const event = storeElementEvent[keyHandlers];\n          removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector);\n        }\n      });\n    },\n\n    trigger(element, event, args) {\n      if (typeof event !== 'string' || !element) {\n        return null;\n      }\n\n      const $ = getjQuery();\n      const typeEvent = getTypeEvent(event);\n      const inNamespace = event !== typeEvent;\n      const isNative = nativeEvents.has(typeEvent);\n      let jQueryEvent;\n      let bubbles = true;\n      let nativeDispatch = true;\n      let defaultPrevented = false;\n      let evt = null;\n\n      if (inNamespace && $) {\n        jQueryEvent = $.Event(event, args);\n        $(element).trigger(jQueryEvent);\n        bubbles = !jQueryEvent.isPropagationStopped();\n        nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n        defaultPrevented = jQueryEvent.isDefaultPrevented();\n      }\n\n      if (isNative) {\n        evt = document.createEvent('HTMLEvents');\n        evt.initEvent(typeEvent, bubbles, true);\n      } else {\n        evt = new CustomEvent(event, {\n          bubbles,\n          cancelable: true\n        });\n      } // merge custom information in our event\n\n\n      if (typeof args !== 'undefined') {\n        Object.keys(args).forEach(key => {\n          Object.defineProperty(evt, key, {\n            get() {\n              return args[key];\n            }\n\n          });\n        });\n      }\n\n      if (defaultPrevented) {\n        evt.preventDefault();\n      }\n\n      if (nativeDispatch) {\n        element.dispatchEvent(evt);\n      }\n\n      if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') {\n        jQueryEvent.preventDefault();\n      }\n\n      return evt;\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): dom/data.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n  const elementMap = new Map();\n  var Data = {\n    set(element, key, instance) {\n      if (!elementMap.has(element)) {\n        elementMap.set(element, new Map());\n      }\n\n      const instanceMap = elementMap.get(element); // make it clear we only want one instance per element\n      // can be removed later when multiple key/instances are fine to be used\n\n      if (!instanceMap.has(key) && instanceMap.size !== 0) {\n        // eslint-disable-next-line no-console\n        console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);\n        return;\n      }\n\n      instanceMap.set(key, instance);\n    },\n\n    get(element, key) {\n      if (elementMap.has(element)) {\n        return elementMap.get(element).get(key) || null;\n      }\n\n      return null;\n    },\n\n    remove(element, key) {\n      if (!elementMap.has(element)) {\n        return;\n      }\n\n      const instanceMap = elementMap.get(element);\n      instanceMap.delete(key); // free up element references if there are no instances left for an element\n\n      if (instanceMap.size === 0) {\n        elementMap.delete(element);\n      }\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): base-component.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const VERSION = '5.1.0';\n\n  class BaseComponent {\n    constructor(element) {\n      element = getElement(element);\n\n      if (!element) {\n        return;\n      }\n\n      this._element = element;\n      Data.set(this._element, this.constructor.DATA_KEY, this);\n    }\n\n    dispose() {\n      Data.remove(this._element, this.constructor.DATA_KEY);\n      EventHandler.off(this._element, this.constructor.EVENT_KEY);\n      Object.getOwnPropertyNames(this).forEach(propertyName => {\n        this[propertyName] = null;\n      });\n    }\n\n    _queueCallback(callback, element, isAnimated = true) {\n      executeAfterTransition(callback, element, isAnimated);\n    }\n    /** Static */\n\n\n    static getInstance(element) {\n      return Data.get(getElement(element), this.DATA_KEY);\n    }\n\n    static getOrCreateInstance(element, config = {}) {\n      return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null);\n    }\n\n    static get VERSION() {\n      return VERSION;\n    }\n\n    static get NAME() {\n      throw new Error('You have to implement the static method \"NAME\", for each component!');\n    }\n\n    static get DATA_KEY() {\n      return `bs.${this.NAME}`;\n    }\n\n    static get EVENT_KEY() {\n      return `.${this.DATA_KEY}`;\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): util/component-functions.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  const enableDismissTrigger = (component, method = 'hide') => {\n    const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n    const name = component.NAME;\n    EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n      if (['A', 'AREA'].includes(this.tagName)) {\n        event.preventDefault();\n      }\n\n      if (isDisabled(this)) {\n        return;\n      }\n\n      const target = getElementFromSelector(this) || this.closest(`.${name}`);\n      const instance = component.getOrCreateInstance(target); // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n\n      instance[method]();\n    });\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): alert.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$d = 'alert';\n  const DATA_KEY$c = 'bs.alert';\n  const EVENT_KEY$c = `.${DATA_KEY$c}`;\n  const EVENT_CLOSE = `close${EVENT_KEY$c}`;\n  const EVENT_CLOSED = `closed${EVENT_KEY$c}`;\n  const CLASS_NAME_FADE$5 = 'fade';\n  const CLASS_NAME_SHOW$8 = 'show';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Alert extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$d;\n    } // Public\n\n\n    close() {\n      const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);\n\n      if (closeEvent.defaultPrevented) {\n        return;\n      }\n\n      this._element.classList.remove(CLASS_NAME_SHOW$8);\n\n      const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);\n\n      this._queueCallback(() => this._destroyElement(), this._element, isAnimated);\n    } // Private\n\n\n    _destroyElement() {\n      this._element.remove();\n\n      EventHandler.trigger(this._element, EVENT_CLOSED);\n      this.dispose();\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Alert.getOrCreateInstance(this);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](this);\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  enableDismissTrigger(Alert, 'close');\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Alert to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Alert);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): button.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$c = 'button';\n  const DATA_KEY$b = 'bs.button';\n  const EVENT_KEY$b = `.${DATA_KEY$b}`;\n  const DATA_API_KEY$7 = '.data-api';\n  const CLASS_NAME_ACTIVE$3 = 'active';\n  const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle=\"button\"]';\n  const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$b}${DATA_API_KEY$7}`;\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Button extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$c;\n    } // Public\n\n\n    toggle() {\n      // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n      this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3));\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Button.getOrCreateInstance(this);\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => {\n    event.preventDefault();\n    const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);\n    const data = Button.getOrCreateInstance(button);\n    data.toggle();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Button to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Button);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): dom/manipulator.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  function normalizeData(val) {\n    if (val === 'true') {\n      return true;\n    }\n\n    if (val === 'false') {\n      return false;\n    }\n\n    if (val === Number(val).toString()) {\n      return Number(val);\n    }\n\n    if (val === '' || val === 'null') {\n      return null;\n    }\n\n    return val;\n  }\n\n  function normalizeDataKey(key) {\n    return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n  }\n\n  const Manipulator = {\n    setDataAttribute(element, key, value) {\n      element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n    },\n\n    removeDataAttribute(element, key) {\n      element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n    },\n\n    getDataAttributes(element) {\n      if (!element) {\n        return {};\n      }\n\n      const attributes = {};\n      Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => {\n        let pureKey = key.replace(/^bs/, '');\n        pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n        attributes[pureKey] = normalizeData(element.dataset[key]);\n      });\n      return attributes;\n    },\n\n    getDataAttribute(element, key) {\n      return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n    },\n\n    offset(element) {\n      const rect = element.getBoundingClientRect();\n      return {\n        top: rect.top + window.pageYOffset,\n        left: rect.left + window.pageXOffset\n      };\n    },\n\n    position(element) {\n      return {\n        top: element.offsetTop,\n        left: element.offsetLeft\n      };\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): dom/selector-engine.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const NODE_TEXT = 3;\n  const SelectorEngine = {\n    find(selector, element = document.documentElement) {\n      return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n    },\n\n    findOne(selector, element = document.documentElement) {\n      return Element.prototype.querySelector.call(element, selector);\n    },\n\n    children(element, selector) {\n      return [].concat(...element.children).filter(child => child.matches(selector));\n    },\n\n    parents(element, selector) {\n      const parents = [];\n      let ancestor = element.parentNode;\n\n      while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) {\n        if (ancestor.matches(selector)) {\n          parents.push(ancestor);\n        }\n\n        ancestor = ancestor.parentNode;\n      }\n\n      return parents;\n    },\n\n    prev(element, selector) {\n      let previous = element.previousElementSibling;\n\n      while (previous) {\n        if (previous.matches(selector)) {\n          return [previous];\n        }\n\n        previous = previous.previousElementSibling;\n      }\n\n      return [];\n    },\n\n    next(element, selector) {\n      let next = element.nextElementSibling;\n\n      while (next) {\n        if (next.matches(selector)) {\n          return [next];\n        }\n\n        next = next.nextElementSibling;\n      }\n\n      return [];\n    },\n\n    focusableChildren(element) {\n      const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(', ');\n      return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el));\n    }\n\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): carousel.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$b = 'carousel';\n  const DATA_KEY$a = 'bs.carousel';\n  const EVENT_KEY$a = `.${DATA_KEY$a}`;\n  const DATA_API_KEY$6 = '.data-api';\n  const ARROW_LEFT_KEY = 'ArrowLeft';\n  const ARROW_RIGHT_KEY = 'ArrowRight';\n  const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  const SWIPE_THRESHOLD = 40;\n  const Default$a = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  const DefaultType$a = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  const ORDER_NEXT = 'next';\n  const ORDER_PREV = 'prev';\n  const DIRECTION_LEFT = 'left';\n  const DIRECTION_RIGHT = 'right';\n  const KEY_TO_DIRECTION = {\n    [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n    [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n  };\n  const EVENT_SLIDE = `slide${EVENT_KEY$a}`;\n  const EVENT_SLID = `slid${EVENT_KEY$a}`;\n  const EVENT_KEYDOWN = `keydown${EVENT_KEY$a}`;\n  const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$a}`;\n  const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$a}`;\n  const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$a}`;\n  const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$a}`;\n  const EVENT_TOUCHEND = `touchend${EVENT_KEY$a}`;\n  const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$a}`;\n  const EVENT_POINTERUP = `pointerup${EVENT_KEY$a}`;\n  const EVENT_DRAG_START = `dragstart${EVENT_KEY$a}`;\n  const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$a}${DATA_API_KEY$6}`;\n  const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;\n  const CLASS_NAME_CAROUSEL = 'carousel';\n  const CLASS_NAME_ACTIVE$2 = 'active';\n  const CLASS_NAME_SLIDE = 'slide';\n  const CLASS_NAME_END = 'carousel-item-end';\n  const CLASS_NAME_START = 'carousel-item-start';\n  const CLASS_NAME_NEXT = 'carousel-item-next';\n  const CLASS_NAME_PREV = 'carousel-item-prev';\n  const CLASS_NAME_POINTER_EVENT = 'pointer-event';\n  const SELECTOR_ACTIVE$1 = '.active';\n  const SELECTOR_ACTIVE_ITEM = '.active.carousel-item';\n  const SELECTOR_ITEM = '.carousel-item';\n  const SELECTOR_ITEM_IMG = '.carousel-item img';\n  const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev';\n  const SELECTOR_INDICATORS = '.carousel-indicators';\n  const SELECTOR_INDICATOR = '[data-bs-target]';\n  const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]';\n  const SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]';\n  const POINTER_TYPE_TOUCH = 'touch';\n  const POINTER_TYPE_PEN = 'pen';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Carousel extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    static get Default() {\n      return Default$a;\n    }\n\n    static get NAME() {\n      return NAME$b;\n    } // Public\n\n\n    next() {\n      this._slide(ORDER_NEXT);\n    }\n\n    nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && isVisible(this._element)) {\n        this.next();\n      }\n    }\n\n    prev() {\n      this._slide(ORDER_PREV);\n    }\n\n    pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) {\n        triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    }\n\n    cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config && this._config.interval && !this._isPaused) {\n        this._updateInterval();\n\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    }\n\n    to(index) {\n      this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n      const activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        EventHandler.one(this._element, EVENT_SLID, () => this.to(index));\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV;\n\n      this._slide(order, this._items[index]);\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$a,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$b, config, DefaultType$a);\n      return config;\n    }\n\n    _handleSwipe() {\n      const absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      const direction = absDeltax / this.touchDeltaX;\n      this.touchDeltaX = 0;\n\n      if (!direction) {\n        return;\n      }\n\n      this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT);\n    }\n\n    _addEventListeners() {\n      if (this._config.keyboard) {\n        EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));\n      }\n\n      if (this._config.pause === 'hover') {\n        EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event));\n        EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event));\n      }\n\n      if (this._config.touch && this._touchSupported) {\n        this._addTouchEventListeners();\n      }\n    }\n\n    _addTouchEventListeners() {\n      const start = event => {\n        if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {\n          this.touchStartX = event.clientX;\n        } else if (!this._pointerEvent) {\n          this.touchStartX = event.touches[0].clientX;\n        }\n      };\n\n      const move = event => {\n        // ensure swiping with one touch and not pinching\n        this.touchDeltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX;\n      };\n\n      const end = event => {\n        if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) {\n          this.touchDeltaX = event.clientX - this.touchStartX;\n        }\n\n        this._handleSwipe();\n\n        if (this._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          this.pause();\n\n          if (this.touchTimeout) {\n            clearTimeout(this.touchTimeout);\n          }\n\n          this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval);\n        }\n      };\n\n      SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => {\n        EventHandler.on(itemImg, EVENT_DRAG_START, e => e.preventDefault());\n      });\n\n      if (this._pointerEvent) {\n        EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event));\n        EventHandler.on(this._element, EVENT_POINTERUP, event => end(event));\n\n        this._element.classList.add(CLASS_NAME_POINTER_EVENT);\n      } else {\n        EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event));\n        EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event));\n        EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event));\n      }\n    }\n\n    _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      const direction = KEY_TO_DIRECTION[event.key];\n\n      if (direction) {\n        event.preventDefault();\n\n        this._slide(direction);\n      }\n    }\n\n    _getItemIndex(element) {\n      this._items = element && element.parentNode ? SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : [];\n      return this._items.indexOf(element);\n    }\n\n    _getItemByOrder(order, activeElement) {\n      const isNext = order === ORDER_NEXT;\n      return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap);\n    }\n\n    _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      const targetIndex = this._getItemIndex(relatedTarget);\n\n      const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element));\n\n      return EventHandler.trigger(this._element, EVENT_SLIDE, {\n        relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n    }\n\n    _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE$1, this._indicatorsElement);\n        activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);\n        activeIndicator.removeAttribute('aria-current');\n        const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement);\n\n        for (let i = 0; i < indicators.length; i++) {\n          if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) {\n            indicators[i].classList.add(CLASS_NAME_ACTIVE$2);\n            indicators[i].setAttribute('aria-current', 'true');\n            break;\n          }\n        }\n      }\n    }\n\n    _updateInterval() {\n      const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n      if (!element) {\n        return;\n      }\n\n      const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10);\n\n      if (elementInterval) {\n        this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n        this._config.interval = elementInterval;\n      } else {\n        this._config.interval = this._config.defaultInterval || this._config.interval;\n      }\n    }\n\n    _slide(directionOrOrder, element) {\n      const order = this._directionToOrder(directionOrOrder);\n\n      const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);\n\n      const activeElementIndex = this._getItemIndex(activeElement);\n\n      const nextElement = element || this._getItemByOrder(order, activeElement);\n\n      const nextElementIndex = this._getItemIndex(nextElement);\n\n      const isCycling = Boolean(this._interval);\n      const isNext = order === ORDER_NEXT;\n      const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;\n      const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;\n\n      const eventDirectionName = this._orderToDirection(order);\n\n      if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE$2)) {\n        this._isSliding = false;\n        return;\n      }\n\n      if (this._isSliding) {\n        return;\n      }\n\n      const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.defaultPrevented) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      this._activeElement = nextElement;\n\n      const triggerSlidEvent = () => {\n        EventHandler.trigger(this._element, EVENT_SLID, {\n          relatedTarget: nextElement,\n          direction: eventDirectionName,\n          from: activeElementIndex,\n          to: nextElementIndex\n        });\n      };\n\n      if (this._element.classList.contains(CLASS_NAME_SLIDE)) {\n        nextElement.classList.add(orderClassName);\n        reflow(nextElement);\n        activeElement.classList.add(directionalClassName);\n        nextElement.classList.add(directionalClassName);\n\n        const completeCallBack = () => {\n          nextElement.classList.remove(directionalClassName, orderClassName);\n          nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n          activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);\n          this._isSliding = false;\n          setTimeout(triggerSlidEvent, 0);\n        };\n\n        this._queueCallback(completeCallBack, activeElement, true);\n      } else {\n        activeElement.classList.remove(CLASS_NAME_ACTIVE$2);\n        nextElement.classList.add(CLASS_NAME_ACTIVE$2);\n        this._isSliding = false;\n        triggerSlidEvent();\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    }\n\n    _directionToOrder(direction) {\n      if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) {\n        return direction;\n      }\n\n      if (isRTL()) {\n        return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;\n      }\n\n      return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;\n    }\n\n    _orderToDirection(order) {\n      if (![ORDER_NEXT, ORDER_PREV].includes(order)) {\n        return order;\n      }\n\n      if (isRTL()) {\n        return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;\n      }\n\n      return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;\n    } // Static\n\n\n    static carouselInterface(element, config) {\n      const data = Carousel.getOrCreateInstance(element, config);\n      let {\n        _config\n      } = data;\n\n      if (typeof config === 'object') {\n        _config = { ..._config,\n          ...config\n        };\n      }\n\n      const action = typeof config === 'string' ? config : _config.slide;\n\n      if (typeof config === 'number') {\n        data.to(config);\n      } else if (typeof action === 'string') {\n        if (typeof data[action] === 'undefined') {\n          throw new TypeError(`No method named \"${action}\"`);\n        }\n\n        data[action]();\n      } else if (_config.interval && _config.ride) {\n        data.pause();\n        data.cycle();\n      }\n    }\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        Carousel.carouselInterface(this, config);\n      });\n    }\n\n    static dataApiClickHandler(event) {\n      const target = getElementFromSelector(this);\n\n      if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n        return;\n      }\n\n      const config = { ...Manipulator.getDataAttributes(target),\n        ...Manipulator.getDataAttributes(this)\n      };\n      const slideIndex = this.getAttribute('data-bs-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel.carouselInterface(target, config);\n\n      if (slideIndex) {\n        Carousel.getInstance(target).to(slideIndex);\n      }\n\n      event.preventDefault();\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler);\n  EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {\n    const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);\n\n    for (let i = 0, len = carousels.length; i < len; i++) {\n      Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i]));\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Carousel to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Carousel);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): collapse.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$a = 'collapse';\n  const DATA_KEY$9 = 'bs.collapse';\n  const EVENT_KEY$9 = `.${DATA_KEY$9}`;\n  const DATA_API_KEY$5 = '.data-api';\n  const Default$9 = {\n    toggle: true,\n    parent: null\n  };\n  const DefaultType$9 = {\n    toggle: 'boolean',\n    parent: '(null|element)'\n  };\n  const EVENT_SHOW$5 = `show${EVENT_KEY$9}`;\n  const EVENT_SHOWN$5 = `shown${EVENT_KEY$9}`;\n  const EVENT_HIDE$5 = `hide${EVENT_KEY$9}`;\n  const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$9}`;\n  const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$9}${DATA_API_KEY$5}`;\n  const CLASS_NAME_SHOW$7 = 'show';\n  const CLASS_NAME_COLLAPSE = 'collapse';\n  const CLASS_NAME_COLLAPSING = 'collapsing';\n  const CLASS_NAME_COLLAPSED = 'collapsed';\n  const CLASS_NAME_HORIZONTAL = 'collapse-horizontal';\n  const WIDTH = 'width';\n  const HEIGHT = 'height';\n  const SELECTOR_ACTIVES = '.show, .collapsing';\n  const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle=\"collapse\"]';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Collapse extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._isTransitioning = false;\n      this._config = this._getConfig(config);\n      this._triggerArray = [];\n      const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);\n\n      for (let i = 0, len = toggleList.length; i < len; i++) {\n        const elem = toggleList[i];\n        const selector = getSelectorFromElement(elem);\n        const filterElement = SelectorEngine.find(selector).filter(foundElem => foundElem === this._element);\n\n        if (selector !== null && filterElement.length) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._initializeChildren();\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    static get Default() {\n      return Default$9;\n    }\n\n    static get NAME() {\n      return NAME$a;\n    } // Public\n\n\n    toggle() {\n      if (this._isShown()) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    }\n\n    show() {\n      if (this._isTransitioning || this._isShown()) {\n        return;\n      }\n\n      let actives = [];\n      let activesData;\n\n      if (this._config.parent) {\n        const children = SelectorEngine.find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);\n        actives = SelectorEngine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)); // remove children if greater depth\n      }\n\n      const container = SelectorEngine.findOne(this._selector);\n\n      if (actives.length) {\n        const tempActiveData = actives.find(elem => container !== elem);\n        activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null;\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$5);\n\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n\n      actives.forEach(elemActive => {\n        if (container !== elemActive) {\n          Collapse.getOrCreateInstance(elemActive, {\n            toggle: false\n          }).hide();\n        }\n\n        if (!activesData) {\n          Data.set(elemActive, DATA_KEY$9, null);\n        }\n      });\n\n      const dimension = this._getDimension();\n\n      this._element.classList.remove(CLASS_NAME_COLLAPSE);\n\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n      this._element.style[dimension] = 0;\n\n      this._addAriaAndCollapsedClass(this._triggerArray, true);\n\n      this._isTransitioning = true;\n\n      const complete = () => {\n        this._isTransitioning = false;\n\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n        this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n        this._element.style[dimension] = '';\n        EventHandler.trigger(this._element, EVENT_SHOWN$5);\n      };\n\n      const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      const scrollSize = `scroll${capitalizedDimension}`;\n\n      this._queueCallback(complete, this._element, true);\n\n      this._element.style[dimension] = `${this._element[scrollSize]}px`;\n    }\n\n    hide() {\n      if (this._isTransitioning || !this._isShown()) {\n        return;\n      }\n\n      const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$5);\n\n      if (startEvent.defaultPrevented) {\n        return;\n      }\n\n      const dimension = this._getDimension();\n\n      this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\n      reflow(this._element);\n\n      this._element.classList.add(CLASS_NAME_COLLAPSING);\n\n      this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);\n\n      const triggerArrayLength = this._triggerArray.length;\n\n      for (let i = 0; i < triggerArrayLength; i++) {\n        const trigger = this._triggerArray[i];\n        const elem = getElementFromSelector(trigger);\n\n        if (elem && !this._isShown(elem)) {\n          this._addAriaAndCollapsedClass([trigger], false);\n        }\n      }\n\n      this._isTransitioning = true;\n\n      const complete = () => {\n        this._isTransitioning = false;\n\n        this._element.classList.remove(CLASS_NAME_COLLAPSING);\n\n        this._element.classList.add(CLASS_NAME_COLLAPSE);\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN$5);\n      };\n\n      this._element.style[dimension] = '';\n\n      this._queueCallback(complete, this._element, true);\n    }\n\n    _isShown(element = this._element) {\n      return element.classList.contains(CLASS_NAME_SHOW$7);\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$9,\n        ...Manipulator.getDataAttributes(this._element),\n        ...config\n      };\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      config.parent = getElement(config.parent);\n      typeCheckConfig(NAME$a, config, DefaultType$9);\n      return config;\n    }\n\n    _getDimension() {\n      return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\n    }\n\n    _initializeChildren() {\n      if (!this._config.parent) {\n        return;\n      }\n\n      const children = SelectorEngine.find(`.${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`, this._config.parent);\n      SelectorEngine.find(SELECTOR_DATA_TOGGLE$4, this._config.parent).filter(elem => !children.includes(elem)).forEach(element => {\n        const selected = getElementFromSelector(element);\n\n        if (selected) {\n          this._addAriaAndCollapsedClass([element], this._isShown(selected));\n        }\n      });\n    }\n\n    _addAriaAndCollapsedClass(triggerArray, isOpen) {\n      if (!triggerArray.length) {\n        return;\n      }\n\n      triggerArray.forEach(elem => {\n        if (isOpen) {\n          elem.classList.remove(CLASS_NAME_COLLAPSED);\n        } else {\n          elem.classList.add(CLASS_NAME_COLLAPSED);\n        }\n\n        elem.setAttribute('aria-expanded', isOpen);\n      });\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const _config = {};\n\n        if (typeof config === 'string' && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        const data = Collapse.getOrCreateInstance(this, _config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    const selector = getSelectorFromElement(this);\n    const selectorElements = SelectorEngine.find(selector);\n    selectorElements.forEach(element => {\n      Collapse.getOrCreateInstance(element, {\n        toggle: false\n      }).toggle();\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Collapse to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Collapse);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): dropdown.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$9 = 'dropdown';\n  const DATA_KEY$8 = 'bs.dropdown';\n  const EVENT_KEY$8 = `.${DATA_KEY$8}`;\n  const DATA_API_KEY$4 = '.data-api';\n  const ESCAPE_KEY$2 = 'Escape';\n  const SPACE_KEY = 'Space';\n  const TAB_KEY$1 = 'Tab';\n  const ARROW_UP_KEY = 'ArrowUp';\n  const ARROW_DOWN_KEY = 'ArrowDown';\n  const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button\n\n  const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`);\n  const EVENT_HIDE$4 = `hide${EVENT_KEY$8}`;\n  const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$8}`;\n  const EVENT_SHOW$4 = `show${EVENT_KEY$8}`;\n  const EVENT_SHOWN$4 = `shown${EVENT_KEY$8}`;\n  const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$8}${DATA_API_KEY$4}`;\n  const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$8}${DATA_API_KEY$4}`;\n  const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$8}${DATA_API_KEY$4}`;\n  const CLASS_NAME_SHOW$6 = 'show';\n  const CLASS_NAME_DROPUP = 'dropup';\n  const CLASS_NAME_DROPEND = 'dropend';\n  const CLASS_NAME_DROPSTART = 'dropstart';\n  const CLASS_NAME_NAVBAR = 'navbar';\n  const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle=\"dropdown\"]';\n  const SELECTOR_MENU = '.dropdown-menu';\n  const SELECTOR_NAVBAR_NAV = '.navbar-nav';\n  const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)';\n  const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start';\n  const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end';\n  const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start';\n  const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end';\n  const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start';\n  const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start';\n  const Default$8 = {\n    offset: [0, 2],\n    boundary: 'clippingParents',\n    reference: 'toggle',\n    display: 'dynamic',\n    popperConfig: null,\n    autoClose: true\n  };\n  const DefaultType$8 = {\n    offset: '(array|string|function)',\n    boundary: '(string|element)',\n    reference: '(string|element|object)',\n    display: 'string',\n    popperConfig: '(null|object|function)',\n    autoClose: '(boolean|string)'\n  };\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Dropdown extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n    } // Getters\n\n\n    static get Default() {\n      return Default$8;\n    }\n\n    static get DefaultType() {\n      return DefaultType$8;\n    }\n\n    static get NAME() {\n      return NAME$9;\n    } // Public\n\n\n    toggle() {\n      return this._isShown() ? this.hide() : this.show();\n    }\n\n    show() {\n      if (isDisabled(this._element) || this._isShown(this._menu)) {\n        return;\n      }\n\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, relatedTarget);\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      const parent = Dropdown.getParentFromElement(this._element); // Totally disable Popper for Dropdowns in Navbar\n\n      if (this._inNavbar) {\n        Manipulator.setDataAttribute(this._menu, 'popper', 'none');\n      } else {\n        this._createPopper(parent);\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) {\n        [].concat(...document.body.children).forEach(elem => EventHandler.on(elem, 'mouseover', noop));\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      this._menu.classList.add(CLASS_NAME_SHOW$6);\n\n      this._element.classList.add(CLASS_NAME_SHOW$6);\n\n      EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget);\n    }\n\n    hide() {\n      if (isDisabled(this._element) || !this._isShown(this._menu)) {\n        return;\n      }\n\n      const relatedTarget = {\n        relatedTarget: this._element\n      };\n\n      this._completeHide(relatedTarget);\n    }\n\n    dispose() {\n      if (this._popper) {\n        this._popper.destroy();\n      }\n\n      super.dispose();\n    }\n\n    update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper) {\n        this._popper.update();\n      }\n    } // Private\n\n\n    _completeHide(relatedTarget) {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      } // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n\n      if ('ontouchstart' in document.documentElement) {\n        [].concat(...document.body.children).forEach(elem => EventHandler.off(elem, 'mouseover', noop));\n      }\n\n      if (this._popper) {\n        this._popper.destroy();\n      }\n\n      this._menu.classList.remove(CLASS_NAME_SHOW$6);\n\n      this._element.classList.remove(CLASS_NAME_SHOW$6);\n\n      this._element.setAttribute('aria-expanded', 'false');\n\n      Manipulator.removeDataAttribute(this._menu, 'popper');\n      EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget);\n    }\n\n    _getConfig(config) {\n      config = { ...this.constructor.Default,\n        ...Manipulator.getDataAttributes(this._element),\n        ...config\n      };\n      typeCheckConfig(NAME$9, config, this.constructor.DefaultType);\n\n      if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') {\n        // Popper virtual elements require a getBoundingClientRect method\n        throw new TypeError(`${NAME$9.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`);\n      }\n\n      return config;\n    }\n\n    _createPopper(parent) {\n      if (typeof Popper__namespace === 'undefined') {\n        throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)');\n      }\n\n      let referenceElement = this._element;\n\n      if (this._config.reference === 'parent') {\n        referenceElement = parent;\n      } else if (isElement(this._config.reference)) {\n        referenceElement = getElement(this._config.reference);\n      } else if (typeof this._config.reference === 'object') {\n        referenceElement = this._config.reference;\n      }\n\n      const popperConfig = this._getPopperConfig();\n\n      const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false);\n      this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig);\n\n      if (isDisplayStatic) {\n        Manipulator.setDataAttribute(this._menu, 'popper', 'static');\n      }\n    }\n\n    _isShown(element = this._element) {\n      return element.classList.contains(CLASS_NAME_SHOW$6);\n    }\n\n    _getMenuElement() {\n      return SelectorEngine.next(this._element, SELECTOR_MENU)[0];\n    }\n\n    _getPlacement() {\n      const parentDropdown = this._element.parentNode;\n\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n        return PLACEMENT_RIGHT;\n      }\n\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n        return PLACEMENT_LEFT;\n      } // We need to trim the value because custom properties can also include spaces\n\n\n      const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end';\n\n      if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n        return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;\n      }\n\n      return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;\n    }\n\n    _detectNavbar() {\n      return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null;\n    }\n\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n\n      if (typeof offset === 'string') {\n        return offset.split(',').map(val => Number.parseInt(val, 10));\n      }\n\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n\n      return offset;\n    }\n\n    _getPopperConfig() {\n      const defaultBsPopperConfig = {\n        placement: this._getPlacement(),\n        modifiers: [{\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }]\n      }; // Disable Popper if we have a static display\n\n      if (this._config.display === 'static') {\n        defaultBsPopperConfig.modifiers = [{\n          name: 'applyStyles',\n          enabled: false\n        }];\n      }\n\n      return { ...defaultBsPopperConfig,\n        ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n      };\n    }\n\n    _selectMenuItem({\n      key,\n      target\n    }) {\n      const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible);\n\n      if (!items.length) {\n        return;\n      } // if target isn't included in items (e.g. when expanding the dropdown)\n      // allow cycling to get the last item in case key equals ARROW_UP_KEY\n\n\n      getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus();\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Dropdown.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config]();\n      });\n    }\n\n    static clearMenus(event) {\n      if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY$1)) {\n        return;\n      }\n\n      const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE$3);\n\n      for (let i = 0, len = toggles.length; i < len; i++) {\n        const context = Dropdown.getInstance(toggles[i]);\n\n        if (!context || context._config.autoClose === false) {\n          continue;\n        }\n\n        if (!context._isShown()) {\n          continue;\n        }\n\n        const relatedTarget = {\n          relatedTarget: context._element\n        };\n\n        if (event) {\n          const composedPath = event.composedPath();\n          const isMenuTarget = composedPath.includes(context._menu);\n\n          if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) {\n            continue;\n          } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n\n\n          if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n            continue;\n          }\n\n          if (event.type === 'click') {\n            relatedTarget.clickEvent = event;\n          }\n        }\n\n        context._completeHide(relatedTarget);\n      }\n    }\n\n    static getParentFromElement(element) {\n      return getElementFromSelector(element) || element.parentNode;\n    }\n\n    static dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY$2 && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) {\n        return;\n      }\n\n      const isActive = this.classList.contains(CLASS_NAME_SHOW$6);\n\n      if (!isActive && event.key === ESCAPE_KEY$2) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (isDisabled(this)) {\n        return;\n      }\n\n      const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0];\n      const instance = Dropdown.getOrCreateInstance(getToggleButton);\n\n      if (event.key === ESCAPE_KEY$2) {\n        instance.hide();\n        return;\n      }\n\n      if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) {\n        if (!isActive) {\n          instance.show();\n        }\n\n        instance._selectMenuItem(event);\n\n        return;\n      }\n\n      if (!isActive || event.key === SPACE_KEY) {\n        Dropdown.clearMenus();\n      }\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);\n  EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);\n  EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) {\n    event.preventDefault();\n    Dropdown.getOrCreateInstance(this).toggle();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Dropdown to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Dropdown);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): util/scrollBar.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\n  const SELECTOR_STICKY_CONTENT = '.sticky-top';\n\n  class ScrollBarHelper {\n    constructor() {\n      this._element = document.body;\n    }\n\n    getWidth() {\n      // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n      const documentWidth = document.documentElement.clientWidth;\n      return Math.abs(window.innerWidth - documentWidth);\n    }\n\n    hide() {\n      const width = this.getWidth();\n\n      this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width\n\n\n      this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n\n\n      this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width);\n\n      this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width);\n    }\n\n    _disableOverFlow() {\n      this._saveInitialAttribute(this._element, 'overflow');\n\n      this._element.style.overflow = 'hidden';\n    }\n\n    _setElementAttributes(selector, styleProp, callback) {\n      const scrollbarWidth = this.getWidth();\n\n      const manipulationCallBack = element => {\n        if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n          return;\n        }\n\n        this._saveInitialAttribute(element, styleProp);\n\n        const calculatedValue = window.getComputedStyle(element)[styleProp];\n        element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`;\n      };\n\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n\n    reset() {\n      this._resetElementAttributes(this._element, 'overflow');\n\n      this._resetElementAttributes(this._element, 'paddingRight');\n\n      this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight');\n\n      this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight');\n    }\n\n    _saveInitialAttribute(element, styleProp) {\n      const actualValue = element.style[styleProp];\n\n      if (actualValue) {\n        Manipulator.setDataAttribute(element, styleProp, actualValue);\n      }\n    }\n\n    _resetElementAttributes(selector, styleProp) {\n      const manipulationCallBack = element => {\n        const value = Manipulator.getDataAttribute(element, styleProp);\n\n        if (typeof value === 'undefined') {\n          element.style.removeProperty(styleProp);\n        } else {\n          Manipulator.removeDataAttribute(element, styleProp);\n          element.style[styleProp] = value;\n        }\n      };\n\n      this._applyManipulationCallback(selector, manipulationCallBack);\n    }\n\n    _applyManipulationCallback(selector, callBack) {\n      if (isElement(selector)) {\n        callBack(selector);\n      } else {\n        SelectorEngine.find(selector, this._element).forEach(callBack);\n      }\n    }\n\n    isOverflowing() {\n      return this.getWidth() > 0;\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): util/backdrop.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const Default$7 = {\n    className: 'modal-backdrop',\n    isVisible: true,\n    // if false, we use the backdrop helper without adding any element to the dom\n    isAnimated: false,\n    rootElement: 'body',\n    // give the choice to place backdrop under different elements\n    clickCallback: null\n  };\n  const DefaultType$7 = {\n    className: 'string',\n    isVisible: 'boolean',\n    isAnimated: 'boolean',\n    rootElement: '(element|string)',\n    clickCallback: '(function|null)'\n  };\n  const NAME$8 = 'backdrop';\n  const CLASS_NAME_FADE$4 = 'fade';\n  const CLASS_NAME_SHOW$5 = 'show';\n  const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$8}`;\n\n  class Backdrop {\n    constructor(config) {\n      this._config = this._getConfig(config);\n      this._isAppended = false;\n      this._element = null;\n    }\n\n    show(callback) {\n      if (!this._config.isVisible) {\n        execute(callback);\n        return;\n      }\n\n      this._append();\n\n      if (this._config.isAnimated) {\n        reflow(this._getElement());\n      }\n\n      this._getElement().classList.add(CLASS_NAME_SHOW$5);\n\n      this._emulateAnimation(() => {\n        execute(callback);\n      });\n    }\n\n    hide(callback) {\n      if (!this._config.isVisible) {\n        execute(callback);\n        return;\n      }\n\n      this._getElement().classList.remove(CLASS_NAME_SHOW$5);\n\n      this._emulateAnimation(() => {\n        this.dispose();\n        execute(callback);\n      });\n    } // Private\n\n\n    _getElement() {\n      if (!this._element) {\n        const backdrop = document.createElement('div');\n        backdrop.className = this._config.className;\n\n        if (this._config.isAnimated) {\n          backdrop.classList.add(CLASS_NAME_FADE$4);\n        }\n\n        this._element = backdrop;\n      }\n\n      return this._element;\n    }\n\n    _getConfig(config) {\n      config = { ...Default$7,\n        ...(typeof config === 'object' ? config : {})\n      }; // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n\n      config.rootElement = getElement(config.rootElement);\n      typeCheckConfig(NAME$8, config, DefaultType$7);\n      return config;\n    }\n\n    _append() {\n      if (this._isAppended) {\n        return;\n      }\n\n      this._config.rootElement.append(this._getElement());\n\n      EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => {\n        execute(this._config.clickCallback);\n      });\n      this._isAppended = true;\n    }\n\n    dispose() {\n      if (!this._isAppended) {\n        return;\n      }\n\n      EventHandler.off(this._element, EVENT_MOUSEDOWN);\n\n      this._element.remove();\n\n      this._isAppended = false;\n    }\n\n    _emulateAnimation(callback) {\n      executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): util/focustrap.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const Default$6 = {\n    trapElement: null,\n    // The element to trap focus inside of\n    autofocus: true\n  };\n  const DefaultType$6 = {\n    trapElement: 'element',\n    autofocus: 'boolean'\n  };\n  const NAME$7 = 'focustrap';\n  const DATA_KEY$7 = 'bs.focustrap';\n  const EVENT_KEY$7 = `.${DATA_KEY$7}`;\n  const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$7}`;\n  const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$7}`;\n  const TAB_KEY = 'Tab';\n  const TAB_NAV_FORWARD = 'forward';\n  const TAB_NAV_BACKWARD = 'backward';\n\n  class FocusTrap {\n    constructor(config) {\n      this._config = this._getConfig(config);\n      this._isActive = false;\n      this._lastTabNavDirection = null;\n    }\n\n    activate() {\n      const {\n        trapElement,\n        autofocus\n      } = this._config;\n\n      if (this._isActive) {\n        return;\n      }\n\n      if (autofocus) {\n        trapElement.focus();\n      }\n\n      EventHandler.off(document, EVENT_KEY$7); // guard against infinite focus loop\n\n      EventHandler.on(document, EVENT_FOCUSIN$1, event => this._handleFocusin(event));\n      EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n      this._isActive = true;\n    }\n\n    deactivate() {\n      if (!this._isActive) {\n        return;\n      }\n\n      this._isActive = false;\n      EventHandler.off(document, EVENT_KEY$7);\n    } // Private\n\n\n    _handleFocusin(event) {\n      const {\n        target\n      } = event;\n      const {\n        trapElement\n      } = this._config;\n\n      if (target === document || target === trapElement || trapElement.contains(target)) {\n        return;\n      }\n\n      const elements = SelectorEngine.focusableChildren(trapElement);\n\n      if (elements.length === 0) {\n        trapElement.focus();\n      } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n        elements[elements.length - 1].focus();\n      } else {\n        elements[0].focus();\n      }\n    }\n\n    _handleKeydown(event) {\n      if (event.key !== TAB_KEY) {\n        return;\n      }\n\n      this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n    }\n\n    _getConfig(config) {\n      config = { ...Default$6,\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$7, config, DefaultType$6);\n      return config;\n    }\n\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): modal.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$6 = 'modal';\n  const DATA_KEY$6 = 'bs.modal';\n  const EVENT_KEY$6 = `.${DATA_KEY$6}`;\n  const DATA_API_KEY$3 = '.data-api';\n  const ESCAPE_KEY$1 = 'Escape';\n  const Default$5 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true\n  };\n  const DefaultType$5 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean'\n  };\n  const EVENT_HIDE$3 = `hide${EVENT_KEY$6}`;\n  const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$6}`;\n  const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`;\n  const EVENT_SHOW$3 = `show${EVENT_KEY$6}`;\n  const EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`;\n  const EVENT_RESIZE = `resize${EVENT_KEY$6}`;\n  const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$6}`;\n  const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`;\n  const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`;\n  const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`;\n  const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;\n  const CLASS_NAME_OPEN = 'modal-open';\n  const CLASS_NAME_FADE$3 = 'fade';\n  const CLASS_NAME_SHOW$4 = 'show';\n  const CLASS_NAME_STATIC = 'modal-static';\n  const SELECTOR_DIALOG = '.modal-dialog';\n  const SELECTOR_MODAL_BODY = '.modal-body';\n  const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle=\"modal\"]';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Modal extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._config = this._getConfig(config);\n      this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n      this._isShown = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollBar = new ScrollBarHelper();\n    } // Getters\n\n\n    static get Default() {\n      return Default$5;\n    }\n\n    static get NAME() {\n      return NAME$6;\n    } // Public\n\n\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n\n    show(relatedTarget) {\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {\n        relatedTarget\n      });\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      this._isShown = true;\n\n      if (this._isAnimated()) {\n        this._isTransitioning = true;\n      }\n\n      this._scrollBar.hide();\n\n      document.body.classList.add(CLASS_NAME_OPEN);\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => {\n        EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => {\n          if (event.target === this._element) {\n            this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(() => this._showElement(relatedTarget));\n    }\n\n    hide() {\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      this._isShown = false;\n\n      const isAnimated = this._isAnimated();\n\n      if (isAnimated) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      this._focustrap.deactivate();\n\n      this._element.classList.remove(CLASS_NAME_SHOW$4);\n\n      EventHandler.off(this._element, EVENT_CLICK_DISMISS);\n      EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS);\n\n      this._queueCallback(() => this._hideModal(), this._element, isAnimated);\n    }\n\n    dispose() {\n      [window, this._dialog].forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY$6));\n\n      this._backdrop.dispose();\n\n      this._focustrap.deactivate();\n\n      super.dispose();\n    }\n\n    handleUpdate() {\n      this._adjustDialog();\n    } // Private\n\n\n    _initializeBackDrop() {\n      return new Backdrop({\n        isVisible: Boolean(this._config.backdrop),\n        // 'static' option will be translated to true, and booleans will keep their value\n        isAnimated: this._isAnimated()\n      });\n    }\n\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n\n    _getConfig(config) {\n      config = { ...Default$5,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$6, config, DefaultType$5);\n      return config;\n    }\n\n    _showElement(relatedTarget) {\n      const isAnimated = this._isAnimated();\n\n      const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.append(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      this._element.setAttribute('role', 'dialog');\n\n      this._element.scrollTop = 0;\n\n      if (modalBody) {\n        modalBody.scrollTop = 0;\n      }\n\n      if (isAnimated) {\n        reflow(this._element);\n      }\n\n      this._element.classList.add(CLASS_NAME_SHOW$4);\n\n      const transitionComplete = () => {\n        if (this._config.focus) {\n          this._focustrap.activate();\n        }\n\n        this._isTransitioning = false;\n        EventHandler.trigger(this._element, EVENT_SHOWN$3, {\n          relatedTarget\n        });\n      };\n\n      this._queueCallback(transitionComplete, this._dialog, isAnimated);\n    }\n\n    _setEscapeEvent() {\n      if (this._isShown) {\n        EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => {\n          if (this._config.keyboard && event.key === ESCAPE_KEY$1) {\n            event.preventDefault();\n            this.hide();\n          } else if (!this._config.keyboard && event.key === ESCAPE_KEY$1) {\n            this._triggerBackdropTransition();\n          }\n        });\n      } else {\n        EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS$1);\n      }\n    }\n\n    _setResizeEvent() {\n      if (this._isShown) {\n        EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog());\n      } else {\n        EventHandler.off(window, EVENT_RESIZE);\n      }\n    }\n\n    _hideModal() {\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._element.removeAttribute('role');\n\n      this._isTransitioning = false;\n\n      this._backdrop.hide(() => {\n        document.body.classList.remove(CLASS_NAME_OPEN);\n\n        this._resetAdjustments();\n\n        this._scrollBar.reset();\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN$3);\n      });\n    }\n\n    _showBackdrop(callback) {\n      EventHandler.on(this._element, EVENT_CLICK_DISMISS, event => {\n        if (this._ignoreBackdropClick) {\n          this._ignoreBackdropClick = false;\n          return;\n        }\n\n        if (event.target !== event.currentTarget) {\n          return;\n        }\n\n        if (this._config.backdrop === true) {\n          this.hide();\n        } else if (this._config.backdrop === 'static') {\n          this._triggerBackdropTransition();\n        }\n      });\n\n      this._backdrop.show(callback);\n    }\n\n    _isAnimated() {\n      return this._element.classList.contains(CLASS_NAME_FADE$3);\n    }\n\n    _triggerBackdropTransition() {\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      const {\n        classList,\n        scrollHeight,\n        style\n      } = this._element;\n      const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed\n\n      if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) {\n        return;\n      }\n\n      if (!isModalOverflowing) {\n        style.overflowY = 'hidden';\n      }\n\n      classList.add(CLASS_NAME_STATIC);\n\n      this._queueCallback(() => {\n        classList.remove(CLASS_NAME_STATIC);\n\n        if (!isModalOverflowing) {\n          this._queueCallback(() => {\n            style.overflowY = '';\n          }, this._dialog);\n        }\n      }, this._dialog);\n\n      this._element.focus();\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // ----------------------------------------------------------------------\n\n\n    _adjustDialog() {\n      const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      const scrollbarWidth = this._scrollBar.getWidth();\n\n      const isBodyOverflowing = scrollbarWidth > 0;\n\n      if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) {\n        this._element.style.paddingLeft = `${scrollbarWidth}px`;\n      }\n\n      if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) {\n        this._element.style.paddingRight = `${scrollbarWidth}px`;\n      }\n    }\n\n    _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    } // Static\n\n\n    static jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        const data = Modal.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](relatedTarget);\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) {\n    const target = getElementFromSelector(this);\n\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    EventHandler.one(target, EVENT_SHOW$3, showEvent => {\n      if (showEvent.defaultPrevented) {\n        // only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      EventHandler.one(target, EVENT_HIDDEN$3, () => {\n        if (isVisible(this)) {\n          this.focus();\n        }\n      });\n    });\n    const data = Modal.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  enableDismissTrigger(Modal);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Modal to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Modal);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): offcanvas.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$5 = 'offcanvas';\n  const DATA_KEY$5 = 'bs.offcanvas';\n  const EVENT_KEY$5 = `.${DATA_KEY$5}`;\n  const DATA_API_KEY$2 = '.data-api';\n  const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$5}${DATA_API_KEY$2}`;\n  const ESCAPE_KEY = 'Escape';\n  const Default$4 = {\n    backdrop: true,\n    keyboard: true,\n    scroll: false\n  };\n  const DefaultType$4 = {\n    backdrop: 'boolean',\n    keyboard: 'boolean',\n    scroll: 'boolean'\n  };\n  const CLASS_NAME_SHOW$3 = 'show';\n  const CLASS_NAME_BACKDROP = 'offcanvas-backdrop';\n  const OPEN_SELECTOR = '.offcanvas.show';\n  const EVENT_SHOW$2 = `show${EVENT_KEY$5}`;\n  const EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`;\n  const EVENT_HIDE$2 = `hide${EVENT_KEY$5}`;\n  const EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`;\n  const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`;\n  const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`;\n  const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle=\"offcanvas\"]';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Offcanvas extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._config = this._getConfig(config);\n      this._isShown = false;\n      this._backdrop = this._initializeBackDrop();\n      this._focustrap = this._initializeFocusTrap();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    static get NAME() {\n      return NAME$5;\n    }\n\n    static get Default() {\n      return Default$4;\n    } // Public\n\n\n    toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    }\n\n    show(relatedTarget) {\n      if (this._isShown) {\n        return;\n      }\n\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$2, {\n        relatedTarget\n      });\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      this._isShown = true;\n      this._element.style.visibility = 'visible';\n\n      this._backdrop.show();\n\n      if (!this._config.scroll) {\n        new ScrollBarHelper().hide();\n      }\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      this._element.setAttribute('role', 'dialog');\n\n      this._element.classList.add(CLASS_NAME_SHOW$3);\n\n      const completeCallBack = () => {\n        if (!this._config.scroll) {\n          this._focustrap.activate();\n        }\n\n        EventHandler.trigger(this._element, EVENT_SHOWN$2, {\n          relatedTarget\n        });\n      };\n\n      this._queueCallback(completeCallBack, this._element, true);\n    }\n\n    hide() {\n      if (!this._isShown) {\n        return;\n      }\n\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$2);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      this._focustrap.deactivate();\n\n      this._element.blur();\n\n      this._isShown = false;\n\n      this._element.classList.remove(CLASS_NAME_SHOW$3);\n\n      this._backdrop.hide();\n\n      const completeCallback = () => {\n        this._element.setAttribute('aria-hidden', true);\n\n        this._element.removeAttribute('aria-modal');\n\n        this._element.removeAttribute('role');\n\n        this._element.style.visibility = 'hidden';\n\n        if (!this._config.scroll) {\n          new ScrollBarHelper().reset();\n        }\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN$2);\n      };\n\n      this._queueCallback(completeCallback, this._element, true);\n    }\n\n    dispose() {\n      this._backdrop.dispose();\n\n      this._focustrap.deactivate();\n\n      super.dispose();\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$4,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' ? config : {})\n      };\n      typeCheckConfig(NAME$5, config, DefaultType$4);\n      return config;\n    }\n\n    _initializeBackDrop() {\n      return new Backdrop({\n        className: CLASS_NAME_BACKDROP,\n        isVisible: this._config.backdrop,\n        isAnimated: true,\n        rootElement: this._element.parentNode,\n        clickCallback: () => this.hide()\n      });\n    }\n\n    _initializeFocusTrap() {\n      return new FocusTrap({\n        trapElement: this._element\n      });\n    }\n\n    _addEventListeners() {\n      EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n        if (this._config.keyboard && event.key === ESCAPE_KEY) {\n          this.hide();\n        }\n      });\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Offcanvas.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config](this);\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) {\n    const target = getElementFromSelector(this);\n\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    if (isDisabled(this)) {\n      return;\n    }\n\n    EventHandler.one(target, EVENT_HIDDEN$2, () => {\n      // focus on trigger when it is closed\n      if (isVisible(this)) {\n        this.focus();\n      }\n    }); // avoid conflict when clicking a toggler of an offcanvas, while another is open\n\n    const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n\n    if (allReadyOpen && allReadyOpen !== target) {\n      Offcanvas.getInstance(allReadyOpen).hide();\n    }\n\n    const data = Offcanvas.getOrCreateInstance(target);\n    data.toggle(this);\n  });\n  EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()));\n  enableDismissTrigger(Offcanvas);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  defineJQueryPlugin(Offcanvas);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): util/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  const uriAttrs = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']);\n  const ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  /**\n   * A pattern that recognizes a commonly useful subset of URLs that are safe.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  const DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[\\d+/a-z]+=*$/i;\n\n  const allowedAttribute = (attr, allowedAttributeList) => {\n    const attrName = attr.nodeName.toLowerCase();\n\n    if (allowedAttributeList.includes(attrName)) {\n      if (uriAttrs.has(attrName)) {\n        return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue));\n      }\n\n      return true;\n    }\n\n    const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp); // Check if a regular expression validates the attribute.\n\n    for (let i = 0, len = regExp.length; i < len; i++) {\n      if (regExp[i].test(attrName)) {\n        return true;\n      }\n    }\n\n    return false;\n  };\n\n  const DefaultAllowlist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n  };\n  function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) {\n    if (!unsafeHtml.length) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    const domParser = new window.DOMParser();\n    const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    const allowlistKeys = Object.keys(allowList);\n    const elements = [].concat(...createdDocument.body.querySelectorAll('*'));\n\n    for (let i = 0, len = elements.length; i < len; i++) {\n      const el = elements[i];\n      const elName = el.nodeName.toLowerCase();\n\n      if (!allowlistKeys.includes(elName)) {\n        el.remove();\n        continue;\n      }\n\n      const attributeList = [].concat(...el.attributes);\n      const allowedAttributes = [].concat(allowList['*'] || [], allowList[elName] || []);\n      attributeList.forEach(attr => {\n        if (!allowedAttribute(attr, allowedAttributes)) {\n          el.removeAttribute(attr.nodeName);\n        }\n      });\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): tooltip.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$4 = 'tooltip';\n  const DATA_KEY$4 = 'bs.tooltip';\n  const EVENT_KEY$4 = `.${DATA_KEY$4}`;\n  const CLASS_PREFIX$1 = 'bs-tooltip';\n  const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']);\n  const DefaultType$3 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(array|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacements: 'array',\n    boundary: '(string|element)',\n    customClass: '(string|function)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    allowList: 'object',\n    popperConfig: '(null|object|function)'\n  };\n  const AttachmentMap = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: isRTL() ? 'left' : 'right',\n    BOTTOM: 'bottom',\n    LEFT: isRTL() ? 'right' : 'left'\n  };\n  const Default$3 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"tooltip-arrow\"></div>' + '<div class=\"tooltip-inner\"></div>' + '</div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: [0, 0],\n    container: false,\n    fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n    boundary: 'clippingParents',\n    customClass: '',\n    sanitize: true,\n    sanitizeFn: null,\n    allowList: DefaultAllowlist,\n    popperConfig: null\n  };\n  const Event$2 = {\n    HIDE: `hide${EVENT_KEY$4}`,\n    HIDDEN: `hidden${EVENT_KEY$4}`,\n    SHOW: `show${EVENT_KEY$4}`,\n    SHOWN: `shown${EVENT_KEY$4}`,\n    INSERTED: `inserted${EVENT_KEY$4}`,\n    CLICK: `click${EVENT_KEY$4}`,\n    FOCUSIN: `focusin${EVENT_KEY$4}`,\n    FOCUSOUT: `focusout${EVENT_KEY$4}`,\n    MOUSEENTER: `mouseenter${EVENT_KEY$4}`,\n    MOUSELEAVE: `mouseleave${EVENT_KEY$4}`\n  };\n  const CLASS_NAME_FADE$2 = 'fade';\n  const CLASS_NAME_MODAL = 'modal';\n  const CLASS_NAME_SHOW$2 = 'show';\n  const HOVER_STATE_SHOW = 'show';\n  const HOVER_STATE_OUT = 'out';\n  const SELECTOR_TOOLTIP_INNER = '.tooltip-inner';\n  const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;\n  const EVENT_MODAL_HIDE = 'hide.bs.modal';\n  const TRIGGER_HOVER = 'hover';\n  const TRIGGER_FOCUS = 'focus';\n  const TRIGGER_CLICK = 'click';\n  const TRIGGER_MANUAL = 'manual';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Tooltip extends BaseComponent {\n    constructor(element, config) {\n      if (typeof Popper__namespace === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)');\n      }\n\n      super(element); // private\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this._config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    static get Default() {\n      return Default$3;\n    }\n\n    static get NAME() {\n      return NAME$4;\n    }\n\n    static get Event() {\n      return Event$2;\n    }\n\n    static get DefaultType() {\n      return DefaultType$3;\n    } // Public\n\n\n    enable() {\n      this._isEnabled = true;\n    }\n\n    disable() {\n      this._isEnabled = false;\n    }\n\n    toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    }\n\n    toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        const context = this._initializeOnDelegatedTarget(event);\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$2)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    }\n\n    dispose() {\n      clearTimeout(this._timeout);\n      EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n\n      if (this.tip) {\n        this.tip.remove();\n      }\n\n      if (this._popper) {\n        this._popper.destroy();\n      }\n\n      super.dispose();\n    }\n\n    show() {\n      if (this._element.style.display === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      if (!(this.isWithContent() && this._isEnabled)) {\n        return;\n      }\n\n      const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW);\n      const shadowRoot = findShadowRoot(this._element);\n      const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element);\n\n      if (showEvent.defaultPrevented || !isInTheDom) {\n        return;\n      }\n\n      const tip = this.getTipElement();\n      const tipId = getUID(this.constructor.NAME);\n      tip.setAttribute('id', tipId);\n\n      this._element.setAttribute('aria-describedby', tipId);\n\n      if (this._config.animation) {\n        tip.classList.add(CLASS_NAME_FADE$2);\n      }\n\n      const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement;\n\n      const attachment = this._getAttachment(placement);\n\n      this._addAttachmentClass(attachment);\n\n      const {\n        container\n      } = this._config;\n      Data.set(tip, this.constructor.DATA_KEY, this);\n\n      if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n        container.append(tip);\n        EventHandler.trigger(this._element, this.constructor.Event.INSERTED);\n      }\n\n      if (this._popper) {\n        this._popper.update();\n      } else {\n        this._popper = Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment));\n      }\n\n      tip.classList.add(CLASS_NAME_SHOW$2);\n\n      const customClass = this._resolvePossibleFunction(this._config.customClass);\n\n      if (customClass) {\n        tip.classList.add(...customClass.split(' '));\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement) {\n        [].concat(...document.body.children).forEach(element => {\n          EventHandler.on(element, 'mouseover', noop);\n        });\n      }\n\n      const complete = () => {\n        const prevHoverState = this._hoverState;\n        this._hoverState = null;\n        EventHandler.trigger(this._element, this.constructor.Event.SHOWN);\n\n        if (prevHoverState === HOVER_STATE_OUT) {\n          this._leave(null, this);\n        }\n      };\n\n      const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);\n\n      this._queueCallback(complete, this.tip, isAnimated);\n    }\n\n    hide() {\n      if (!this._popper) {\n        return;\n      }\n\n      const tip = this.getTipElement();\n\n      const complete = () => {\n        if (this._isWithActiveTrigger()) {\n          return;\n        }\n\n        if (this._hoverState !== HOVER_STATE_SHOW) {\n          tip.remove();\n        }\n\n        this._cleanTipClass();\n\n        this._element.removeAttribute('aria-describedby');\n\n        EventHandler.trigger(this._element, this.constructor.Event.HIDDEN);\n\n        if (this._popper) {\n          this._popper.destroy();\n\n          this._popper = null;\n        }\n      };\n\n      const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      tip.classList.remove(CLASS_NAME_SHOW$2); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        [].concat(...document.body.children).forEach(element => EventHandler.off(element, 'mouseover', noop));\n      }\n\n      this._activeTrigger[TRIGGER_CLICK] = false;\n      this._activeTrigger[TRIGGER_FOCUS] = false;\n      this._activeTrigger[TRIGGER_HOVER] = false;\n      const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$2);\n\n      this._queueCallback(complete, this.tip, isAnimated);\n\n      this._hoverState = '';\n    }\n\n    update() {\n      if (this._popper !== null) {\n        this._popper.update();\n      }\n    } // Protected\n\n\n    isWithContent() {\n      return Boolean(this.getTitle());\n    }\n\n    getTipElement() {\n      if (this.tip) {\n        return this.tip;\n      }\n\n      const element = document.createElement('div');\n      element.innerHTML = this._config.template;\n      const tip = element.children[0];\n      this.setContent(tip);\n      tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);\n      this.tip = tip;\n      return this.tip;\n    }\n\n    setContent(tip) {\n      this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER);\n    }\n\n    _sanitizeAndSetContent(template, content, selector) {\n      const templateElement = SelectorEngine.findOne(selector, template);\n\n      if (!content && templateElement) {\n        templateElement.remove();\n        return;\n      } // we use append for html objects to maintain js events\n\n\n      this.setElementContent(templateElement, content);\n    }\n\n    setElementContent(element, content) {\n      if (element === null) {\n        return;\n      }\n\n      if (isElement(content)) {\n        content = getElement(content); // content is a DOM node or a jQuery\n\n        if (this._config.html) {\n          if (content.parentNode !== element) {\n            element.innerHTML = '';\n            element.append(content);\n          }\n        } else {\n          element.textContent = content.textContent;\n        }\n\n        return;\n      }\n\n      if (this._config.html) {\n        if (this._config.sanitize) {\n          content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn);\n        }\n\n        element.innerHTML = content;\n      } else {\n        element.textContent = content;\n      }\n    }\n\n    getTitle() {\n      const title = this._element.getAttribute('data-bs-original-title') || this._config.title;\n\n      return this._resolvePossibleFunction(title);\n    }\n\n    updateAttachment(attachment) {\n      if (attachment === 'right') {\n        return 'end';\n      }\n\n      if (attachment === 'left') {\n        return 'start';\n      }\n\n      return attachment;\n    } // Private\n\n\n    _initializeOnDelegatedTarget(event, context) {\n      return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());\n    }\n\n    _getOffset() {\n      const {\n        offset\n      } = this._config;\n\n      if (typeof offset === 'string') {\n        return offset.split(',').map(val => Number.parseInt(val, 10));\n      }\n\n      if (typeof offset === 'function') {\n        return popperData => offset(popperData, this._element);\n      }\n\n      return offset;\n    }\n\n    _resolvePossibleFunction(content) {\n      return typeof content === 'function' ? content.call(this._element) : content;\n    }\n\n    _getPopperConfig(attachment) {\n      const defaultBsPopperConfig = {\n        placement: attachment,\n        modifiers: [{\n          name: 'flip',\n          options: {\n            fallbackPlacements: this._config.fallbackPlacements\n          }\n        }, {\n          name: 'offset',\n          options: {\n            offset: this._getOffset()\n          }\n        }, {\n          name: 'preventOverflow',\n          options: {\n            boundary: this._config.boundary\n          }\n        }, {\n          name: 'arrow',\n          options: {\n            element: `.${this.constructor.NAME}-arrow`\n          }\n        }, {\n          name: 'onChange',\n          enabled: true,\n          phase: 'afterWrite',\n          fn: data => this._handlePopperPlacementChange(data)\n        }],\n        onFirstUpdate: data => {\n          if (data.options.placement !== data.placement) {\n            this._handlePopperPlacementChange(data);\n          }\n        }\n      };\n      return { ...defaultBsPopperConfig,\n        ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)\n      };\n    }\n\n    _addAttachmentClass(attachment) {\n      this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`);\n    }\n\n    _getAttachment(placement) {\n      return AttachmentMap[placement.toUpperCase()];\n    }\n\n    _setListeners() {\n      const triggers = this._config.trigger.split(' ');\n\n      triggers.forEach(trigger => {\n        if (trigger === 'click') {\n          EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event));\n        } else if (trigger !== TRIGGER_MANUAL) {\n          const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN;\n          const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT;\n          EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event));\n          EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event));\n        }\n      });\n\n      this._hideModalHandler = () => {\n        if (this._element) {\n          this.hide();\n        }\n      };\n\n      EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);\n\n      if (this._config.selector) {\n        this._config = { ...this._config,\n          trigger: 'manual',\n          selector: ''\n        };\n      } else {\n        this._fixTitle();\n      }\n    }\n\n    _fixTitle() {\n      const title = this._element.getAttribute('title');\n\n      const originalTitleType = typeof this._element.getAttribute('data-bs-original-title');\n\n      if (title || originalTitleType !== 'string') {\n        this._element.setAttribute('data-bs-original-title', title || '');\n\n        if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) {\n          this._element.setAttribute('aria-label', title);\n        }\n\n        this._element.setAttribute('title', '');\n      }\n    }\n\n    _enter(event, context) {\n      context = this._initializeOnDelegatedTarget(event, context);\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;\n      }\n\n      if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$2) || context._hoverState === HOVER_STATE_SHOW) {\n        context._hoverState = HOVER_STATE_SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HOVER_STATE_SHOW;\n\n      if (!context._config.delay || !context._config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(() => {\n        if (context._hoverState === HOVER_STATE_SHOW) {\n          context.show();\n        }\n      }, context._config.delay.show);\n    }\n\n    _leave(event, context) {\n      context = this._initializeOnDelegatedTarget(event, context);\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HOVER_STATE_OUT;\n\n      if (!context._config.delay || !context._config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(() => {\n        if (context._hoverState === HOVER_STATE_OUT) {\n          context.hide();\n        }\n      }, context._config.delay.hide);\n    }\n\n    _isWithActiveTrigger() {\n      for (const trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    }\n\n    _getConfig(config) {\n      const dataAttributes = Manipulator.getDataAttributes(this._element);\n      Object.keys(dataAttributes).forEach(dataAttr => {\n        if (DISALLOWED_ATTRIBUTES.has(dataAttr)) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = { ...this.constructor.Default,\n        ...dataAttributes,\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      config.container = config.container === false ? document.body : getElement(config.container);\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn);\n      }\n\n      return config;\n    }\n\n    _getDelegateConfig() {\n      const config = {};\n\n      for (const key in this._config) {\n        if (this.constructor.Default[key] !== this._config[key]) {\n          config[key] = this._config[key];\n        }\n      } // In the future can be replaced with:\n      // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n      // `Object.fromEntries(keysWithDifferentValues)`\n\n\n      return config;\n    }\n\n    _cleanTipClass() {\n      const tip = this.getTipElement();\n      const basicClassPrefixRegex = new RegExp(`(^|\\\\s)${this._getBasicClassPrefix()}\\\\S+`, 'g');\n      const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass));\n      }\n    }\n\n    _getBasicClassPrefix() {\n      return CLASS_PREFIX$1;\n    }\n\n    _handlePopperPlacementChange(popperData) {\n      const {\n        state\n      } = popperData;\n\n      if (!state) {\n        return;\n      }\n\n      this.tip = state.elements.popper;\n\n      this._cleanTipClass();\n\n      this._addAttachmentClass(this._getAttachment(state.placement));\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tooltip.getOrCreateInstance(this, config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Tooltip to jQuery only if jQuery is present\n   */\n\n\n  defineJQueryPlugin(Tooltip);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): popover.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$3 = 'popover';\n  const DATA_KEY$3 = 'bs.popover';\n  const EVENT_KEY$3 = `.${DATA_KEY$3}`;\n  const CLASS_PREFIX = 'bs-popover';\n  const Default$2 = { ...Tooltip.Default,\n    placement: 'right',\n    offset: [0, 8],\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"popover-arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div>' + '</div>'\n  };\n  const DefaultType$2 = { ...Tooltip.DefaultType,\n    content: '(string|element|function)'\n  };\n  const Event$1 = {\n    HIDE: `hide${EVENT_KEY$3}`,\n    HIDDEN: `hidden${EVENT_KEY$3}`,\n    SHOW: `show${EVENT_KEY$3}`,\n    SHOWN: `shown${EVENT_KEY$3}`,\n    INSERTED: `inserted${EVENT_KEY$3}`,\n    CLICK: `click${EVENT_KEY$3}`,\n    FOCUSIN: `focusin${EVENT_KEY$3}`,\n    FOCUSOUT: `focusout${EVENT_KEY$3}`,\n    MOUSEENTER: `mouseenter${EVENT_KEY$3}`,\n    MOUSELEAVE: `mouseleave${EVENT_KEY$3}`\n  };\n  const SELECTOR_TITLE = '.popover-header';\n  const SELECTOR_CONTENT = '.popover-body';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Popover extends Tooltip {\n    // Getters\n    static get Default() {\n      return Default$2;\n    }\n\n    static get NAME() {\n      return NAME$3;\n    }\n\n    static get Event() {\n      return Event$1;\n    }\n\n    static get DefaultType() {\n      return DefaultType$2;\n    } // Overrides\n\n\n    isWithContent() {\n      return this.getTitle() || this._getContent();\n    }\n\n    setContent(tip) {\n      this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TITLE);\n\n      this._sanitizeAndSetContent(tip, this._getContent(), SELECTOR_CONTENT);\n    } // Private\n\n\n    _getContent() {\n      return this._resolvePossibleFunction(this._config.content);\n    }\n\n    _getBasicClassPrefix() {\n      return CLASS_PREFIX;\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Popover.getOrCreateInstance(this, config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Popover to jQuery only if jQuery is present\n   */\n\n\n  defineJQueryPlugin(Popover);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): scrollspy.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$2 = 'scrollspy';\n  const DATA_KEY$2 = 'bs.scrollspy';\n  const EVENT_KEY$2 = `.${DATA_KEY$2}`;\n  const DATA_API_KEY$1 = '.data-api';\n  const Default$1 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  const DefaultType$1 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;\n  const EVENT_SCROLL = `scroll${EVENT_KEY$2}`;\n  const EVENT_LOAD_DATA_API = `load${EVENT_KEY$2}${DATA_API_KEY$1}`;\n  const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item';\n  const CLASS_NAME_ACTIVE$1 = 'active';\n  const SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]';\n  const SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group';\n  const SELECTOR_NAV_LINKS = '.nav-link';\n  const SELECTOR_NAV_ITEMS = '.nav-item';\n  const SELECTOR_LIST_ITEMS = '.list-group-item';\n  const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}, .${CLASS_NAME_DROPDOWN_ITEM}`;\n  const SELECTOR_DROPDOWN$1 = '.dropdown';\n  const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle';\n  const METHOD_OFFSET = 'offset';\n  const METHOD_POSITION = 'position';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class ScrollSpy extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._scrollElement = this._element.tagName === 'BODY' ? window : this._element;\n      this._config = this._getConfig(config);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process());\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    static get Default() {\n      return Default$1;\n    }\n\n    static get NAME() {\n      return NAME$2;\n    } // Public\n\n\n    refresh() {\n      const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION;\n      const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      const targets = SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target);\n      targets.map(element => {\n        const targetSelector = getSelectorFromElement(element);\n        const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null;\n\n        if (target) {\n          const targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(item => item).sort((a, b) => a[0] - b[0]).forEach(item => {\n        this._offsets.push(item[0]);\n\n        this._targets.push(item[1]);\n      });\n    }\n\n    dispose() {\n      EventHandler.off(this._scrollElement, EVENT_KEY$2);\n      super.dispose();\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default$1,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      config.target = getElement(config.target) || document.documentElement;\n      typeCheckConfig(NAME$2, config, DefaultType$1);\n      return config;\n    }\n\n    _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    }\n\n    _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    }\n\n    _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    }\n\n    _process() {\n      const scrollTop = this._getScrollTop() + this._config.offset;\n\n      const scrollHeight = this._getScrollHeight();\n\n      const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        const target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      for (let i = this._offsets.length; i--;) {\n        const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    }\n\n    _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      const queries = SELECTOR_LINK_ITEMS.split(',').map(selector => `${selector}[data-bs-target=\"${target}\"],${selector}[href=\"${target}\"]`);\n      const link = SelectorEngine.findOne(queries.join(','), this._config.target);\n      link.classList.add(CLASS_NAME_ACTIVE$1);\n\n      if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n        SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1);\n      } else {\n        SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1).forEach(listGroup => {\n          // Set triggered links parents as active\n          // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n          SelectorEngine.prev(listGroup, `${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1)); // Handle special case when .nav-link is inside .nav-item\n\n          SelectorEngine.prev(listGroup, SELECTOR_NAV_ITEMS).forEach(navItem => {\n            SelectorEngine.children(navItem, SELECTOR_NAV_LINKS).forEach(item => item.classList.add(CLASS_NAME_ACTIVE$1));\n          });\n        });\n      }\n\n      EventHandler.trigger(this._scrollElement, EVENT_ACTIVATE, {\n        relatedTarget: target\n      });\n    }\n\n    _clear() {\n      SelectorEngine.find(SELECTOR_LINK_ITEMS, this._config.target).filter(node => node.classList.contains(CLASS_NAME_ACTIVE$1)).forEach(node => node.classList.remove(CLASS_NAME_ACTIVE$1));\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = ScrollSpy.getOrCreateInstance(this, config);\n\n        if (typeof config !== 'string') {\n          return;\n        }\n\n        if (typeof data[config] === 'undefined') {\n          throw new TypeError(`No method named \"${config}\"`);\n        }\n\n        data[config]();\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n    SelectorEngine.find(SELECTOR_DATA_SPY).forEach(spy => new ScrollSpy(spy));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .ScrollSpy to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(ScrollSpy);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): tab.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME$1 = 'tab';\n  const DATA_KEY$1 = 'bs.tab';\n  const EVENT_KEY$1 = `.${DATA_KEY$1}`;\n  const DATA_API_KEY = '.data-api';\n  const EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;\n  const EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;\n  const EVENT_SHOW$1 = `show${EVENT_KEY$1}`;\n  const EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;\n  const EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}${DATA_API_KEY}`;\n  const CLASS_NAME_DROPDOWN_MENU = 'dropdown-menu';\n  const CLASS_NAME_ACTIVE = 'active';\n  const CLASS_NAME_FADE$1 = 'fade';\n  const CLASS_NAME_SHOW$1 = 'show';\n  const SELECTOR_DROPDOWN = '.dropdown';\n  const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\n  const SELECTOR_ACTIVE = '.active';\n  const SELECTOR_ACTIVE_UL = ':scope > li > .active';\n  const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"tab\"], [data-bs-toggle=\"pill\"], [data-bs-toggle=\"list\"]';\n  const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle';\n  const SELECTOR_DROPDOWN_ACTIVE_CHILD = ':scope > .dropdown-menu .active';\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Tab extends BaseComponent {\n    // Getters\n    static get NAME() {\n      return NAME$1;\n    } // Public\n\n\n    show() {\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && this._element.classList.contains(CLASS_NAME_ACTIVE)) {\n        return;\n      }\n\n      let previous;\n      const target = getElementFromSelector(this._element);\n\n      const listElement = this._element.closest(SELECTOR_NAV_LIST_GROUP);\n\n      if (listElement) {\n        const itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? SELECTOR_ACTIVE_UL : SELECTOR_ACTIVE;\n        previous = SelectorEngine.find(itemSelector, listElement);\n        previous = previous[previous.length - 1];\n      }\n\n      const hideEvent = previous ? EventHandler.trigger(previous, EVENT_HIDE$1, {\n        relatedTarget: this._element\n      }) : null;\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$1, {\n        relatedTarget: previous\n      });\n\n      if (showEvent.defaultPrevented || hideEvent !== null && hideEvent.defaultPrevented) {\n        return;\n      }\n\n      this._activate(this._element, listElement);\n\n      const complete = () => {\n        EventHandler.trigger(previous, EVENT_HIDDEN$1, {\n          relatedTarget: this._element\n        });\n        EventHandler.trigger(this._element, EVENT_SHOWN$1, {\n          relatedTarget: previous\n        });\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    } // Private\n\n\n    _activate(element, container, callback) {\n      const activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? SelectorEngine.find(SELECTOR_ACTIVE_UL, container) : SelectorEngine.children(container, SELECTOR_ACTIVE);\n      const active = activeElements[0];\n      const isTransitioning = callback && active && active.classList.contains(CLASS_NAME_FADE$1);\n\n      const complete = () => this._transitionComplete(element, active, callback);\n\n      if (active && isTransitioning) {\n        active.classList.remove(CLASS_NAME_SHOW$1);\n\n        this._queueCallback(complete, element, true);\n      } else {\n        complete();\n      }\n    }\n\n    _transitionComplete(element, active, callback) {\n      if (active) {\n        active.classList.remove(CLASS_NAME_ACTIVE);\n        const dropdownChild = SelectorEngine.findOne(SELECTOR_DROPDOWN_ACTIVE_CHILD, active.parentNode);\n\n        if (dropdownChild) {\n          dropdownChild.classList.remove(CLASS_NAME_ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      element.classList.add(CLASS_NAME_ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      reflow(element);\n\n      if (element.classList.contains(CLASS_NAME_FADE$1)) {\n        element.classList.add(CLASS_NAME_SHOW$1);\n      }\n\n      let parent = element.parentNode;\n\n      if (parent && parent.nodeName === 'LI') {\n        parent = parent.parentNode;\n      }\n\n      if (parent && parent.classList.contains(CLASS_NAME_DROPDOWN_MENU)) {\n        const dropdownElement = element.closest(SELECTOR_DROPDOWN);\n\n        if (dropdownElement) {\n          SelectorEngine.find(SELECTOR_DROPDOWN_TOGGLE, dropdownElement).forEach(dropdown => dropdown.classList.add(CLASS_NAME_ACTIVE));\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Tab.getOrCreateInstance(this);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config]();\n        }\n      });\n    }\n\n  }\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n    if (['A', 'AREA'].includes(this.tagName)) {\n      event.preventDefault();\n    }\n\n    if (isDisabled(this)) {\n      return;\n    }\n\n    const data = Tab.getOrCreateInstance(this);\n    data.show();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Tab to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Tab);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): toast.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  const NAME = 'toast';\n  const DATA_KEY = 'bs.toast';\n  const EVENT_KEY = `.${DATA_KEY}`;\n  const EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;\n  const EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;\n  const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;\n  const EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;\n  const EVENT_HIDE = `hide${EVENT_KEY}`;\n  const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n  const EVENT_SHOW = `show${EVENT_KEY}`;\n  const EVENT_SHOWN = `shown${EVENT_KEY}`;\n  const CLASS_NAME_FADE = 'fade';\n  const CLASS_NAME_HIDE = 'hide'; // @deprecated - kept here only for backwards compatibility\n\n  const CLASS_NAME_SHOW = 'show';\n  const CLASS_NAME_SHOWING = 'showing';\n  const DefaultType = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  const Default = {\n    animation: true,\n    autohide: true,\n    delay: 5000\n  };\n  /**\n   * ------------------------------------------------------------------------\n   * Class Definition\n   * ------------------------------------------------------------------------\n   */\n\n  class Toast extends BaseComponent {\n    constructor(element, config) {\n      super(element);\n      this._config = this._getConfig(config);\n      this._timeout = null;\n      this._hasMouseInteraction = false;\n      this._hasKeyboardInteraction = false;\n\n      this._setListeners();\n    } // Getters\n\n\n    static get DefaultType() {\n      return DefaultType;\n    }\n\n    static get Default() {\n      return Default;\n    }\n\n    static get NAME() {\n      return NAME;\n    } // Public\n\n\n    show() {\n      const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);\n\n      if (showEvent.defaultPrevented) {\n        return;\n      }\n\n      this._clearTimeout();\n\n      if (this._config.animation) {\n        this._element.classList.add(CLASS_NAME_FADE);\n      }\n\n      const complete = () => {\n        this._element.classList.remove(CLASS_NAME_SHOWING);\n\n        EventHandler.trigger(this._element, EVENT_SHOWN);\n\n        this._maybeScheduleHide();\n      };\n\n      this._element.classList.remove(CLASS_NAME_HIDE); // @deprecated\n\n\n      reflow(this._element);\n\n      this._element.classList.add(CLASS_NAME_SHOW);\n\n      this._element.classList.add(CLASS_NAME_SHOWING);\n\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n\n    hide() {\n      if (!this._element.classList.contains(CLASS_NAME_SHOW)) {\n        return;\n      }\n\n      const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n\n      if (hideEvent.defaultPrevented) {\n        return;\n      }\n\n      const complete = () => {\n        this._element.classList.add(CLASS_NAME_HIDE); // @deprecated\n\n\n        this._element.classList.remove(CLASS_NAME_SHOWING);\n\n        this._element.classList.remove(CLASS_NAME_SHOW);\n\n        EventHandler.trigger(this._element, EVENT_HIDDEN);\n      };\n\n      this._element.classList.add(CLASS_NAME_SHOWING);\n\n      this._queueCallback(complete, this._element, this._config.animation);\n    }\n\n    dispose() {\n      this._clearTimeout();\n\n      if (this._element.classList.contains(CLASS_NAME_SHOW)) {\n        this._element.classList.remove(CLASS_NAME_SHOW);\n      }\n\n      super.dispose();\n    } // Private\n\n\n    _getConfig(config) {\n      config = { ...Default,\n        ...Manipulator.getDataAttributes(this._element),\n        ...(typeof config === 'object' && config ? config : {})\n      };\n      typeCheckConfig(NAME, config, this.constructor.DefaultType);\n      return config;\n    }\n\n    _maybeScheduleHide() {\n      if (!this._config.autohide) {\n        return;\n      }\n\n      if (this._hasMouseInteraction || this._hasKeyboardInteraction) {\n        return;\n      }\n\n      this._timeout = setTimeout(() => {\n        this.hide();\n      }, this._config.delay);\n    }\n\n    _onInteraction(event, isInteracting) {\n      switch (event.type) {\n        case 'mouseover':\n        case 'mouseout':\n          this._hasMouseInteraction = isInteracting;\n          break;\n\n        case 'focusin':\n        case 'focusout':\n          this._hasKeyboardInteraction = isInteracting;\n          break;\n      }\n\n      if (isInteracting) {\n        this._clearTimeout();\n\n        return;\n      }\n\n      const nextElement = event.relatedTarget;\n\n      if (this._element === nextElement || this._element.contains(nextElement)) {\n        return;\n      }\n\n      this._maybeScheduleHide();\n    }\n\n    _setListeners() {\n      EventHandler.on(this._element, EVENT_MOUSEOVER, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_MOUSEOUT, event => this._onInteraction(event, false));\n      EventHandler.on(this._element, EVENT_FOCUSIN, event => this._onInteraction(event, true));\n      EventHandler.on(this._element, EVENT_FOCUSOUT, event => this._onInteraction(event, false));\n    }\n\n    _clearTimeout() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n    } // Static\n\n\n    static jQueryInterface(config) {\n      return this.each(function () {\n        const data = Toast.getOrCreateInstance(this, config);\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(`No method named \"${config}\"`);\n          }\n\n          data[config](this);\n        }\n      });\n    }\n\n  }\n\n  enableDismissTrigger(Toast);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   * add .Toast to jQuery only if jQuery is present\n   */\n\n  defineJQueryPlugin(Toast);\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v5.1.0): index.umd.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  var index_umd = {\n    Alert,\n    Button,\n    Carousel,\n    Collapse,\n    Dropdown,\n    Modal,\n    Offcanvas,\n    Popover,\n    ScrollSpy,\n    Tab,\n    Toast,\n    Tooltip\n  };\n\n  return index_umd;\n\n})));\n//# sourceMappingURL=bootstrap.js.map\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/jquery/LICENSE.txt",
    "content": "Copyright JS Foundation and other contributors, https://js.foundation/\n\nThis software consists of voluntary contributions made by many\nindividuals. For exact contribution history, see the revision history\navailable at https://github.com/jquery/jquery\n\nThe following license applies to all parts of this software except as\ndocumented below:\n\n====\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n====\n\nAll files located in the node_modules and external directories are\nexternally maintained libraries used by this software which have their\nown licenses; we recommend you read them, as their terms may differ from\nthe terms above.\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/jquery/dist/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v3.5.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2020-05-04T22:49Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n      // Support: Chrome <=57, Firefox <=52\n      // In some browsers, typeof returns \"function\" for HTML <object> elements\n      // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n      // We don't want to classify *any* DOM node as a function.\n      return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n  };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.5.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( _i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.5\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2020-03-14\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem.namespaceURI,\n\t\tdocElem = ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px\";\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = parseInt( trStyle.height ) > 3;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = (\n\t\t\t\t\tdataPriv.get( cur, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script\n\t\t\tif ( !isSuccess && jQuery.inArray( \"script\", s.dataTypes ) > -1 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tif ( typeof props.top === \"number\" ) {\n\t\t\t\tprops.top += \"px\";\n\t\t\t}\n\t\t\tif ( typeof props.left === \"number\" ) {\n\t\t\t\tprops.left += \"px\";\n\t\t\t}\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t} );\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/jquery-validation/LICENSE.md",
    "content": "The MIT License (MIT)\n=====================\n\nCopyright Jörn Zaefferer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/jquery-validation/dist/additional-methods.js",
    "content": "/*!\n * jQuery Validation Plugin v1.17.0\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2017 Jörn Zaefferer\n * Released under the MIT license\n */\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( [\"jquery\", \"./jquery.validate\"], factory );\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t} else {\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n( function() {\n\n\tfunction stripHtml( value ) {\n\n\t\t// Remove html tags and space chars\n\t\treturn value.replace( /<.[^<>]*?>/g, \" \" ).replace( /&nbsp;|&#160;/gi, \" \" )\n\n\t\t// Remove punctuation\n\t\t.replace( /[.(),;:!?%#$'\\\"_+=\\/\\-“”’]*/g, \"\" );\n\t}\n\n\t$.validator.addMethod( \"maxWords\", function( value, element, params ) {\n\t\treturn this.optional( element ) || stripHtml( value ).match( /\\b\\w+\\b/g ).length <= params;\n\t}, $.validator.format( \"Please enter {0} words or less.\" ) );\n\n\t$.validator.addMethod( \"minWords\", function( value, element, params ) {\n\t\treturn this.optional( element ) || stripHtml( value ).match( /\\b\\w+\\b/g ).length >= params;\n\t}, $.validator.format( \"Please enter at least {0} words.\" ) );\n\n\t$.validator.addMethod( \"rangeWords\", function( value, element, params ) {\n\t\tvar valueStripped = stripHtml( value ),\n\t\t\tregex = /\\b\\w+\\b/g;\n\t\treturn this.optional( element ) || valueStripped.match( regex ).length >= params[ 0 ] && valueStripped.match( regex ).length <= params[ 1 ];\n\t}, $.validator.format( \"Please enter between {0} and {1} words.\" ) );\n\n}() );\n\n// Accept a value from a file input based on a required mimetype\n$.validator.addMethod( \"accept\", function( value, element, param ) {\n\n\t// Split mime on commas in case we have multiple types we can accept\n\tvar typeParam = typeof param === \"string\" ? param.replace( /\\s/g, \"\" ) : \"image/*\",\n\t\toptionalValue = this.optional( element ),\n\t\ti, file, regex;\n\n\t// Element is optional\n\tif ( optionalValue ) {\n\t\treturn optionalValue;\n\t}\n\n\tif ( $( element ).attr( \"type\" ) === \"file\" ) {\n\n\t\t// Escape string to be used in the regex\n\t\t// see: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\n\t\t// Escape also \"/*\" as \"/.*\" as a wildcard\n\t\ttypeParam = typeParam\n\t\t\t\t.replace( /[\\-\\[\\]\\/\\{\\}\\(\\)\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\" )\n\t\t\t\t.replace( /,/g, \"|\" )\n\t\t\t\t.replace( /\\/\\*/g, \"/.*\" );\n\n\t\t// Check if the element has a FileList before checking each file\n\t\tif ( element.files && element.files.length ) {\n\t\t\tregex = new RegExp( \".?(\" + typeParam + \")$\", \"i\" );\n\t\t\tfor ( i = 0; i < element.files.length; i++ ) {\n\t\t\t\tfile = element.files[ i ];\n\n\t\t\t\t// Grab the mimetype from the loaded file, verify it matches\n\t\t\t\tif ( !file.type.match( regex ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Either return true because we've validated each file, or because the\n\t// browser does not support element.files and the FileList feature\n\treturn true;\n}, $.validator.format( \"Please enter a value with a valid mimetype.\" ) );\n\n$.validator.addMethod( \"alphanumeric\", function( value, element ) {\n\treturn this.optional( element ) || /^\\w+$/i.test( value );\n}, \"Letters, numbers, and underscores only please\" );\n\n/*\n * Dutch bank account numbers (not 'giro' numbers) have 9 digits\n * and pass the '11 check'.\n * We accept the notation with spaces, as that is common.\n * acceptable: 123456789 or 12 34 56 789\n */\n$.validator.addMethod( \"bankaccountNL\", function( value, element ) {\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\tif ( !( /^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test( value ) ) ) {\n\t\treturn false;\n\t}\n\n\t// Now '11 check'\n\tvar account = value.replace( / /g, \"\" ), // Remove spaces\n\t\tsum = 0,\n\t\tlen = account.length,\n\t\tpos, factor, digit;\n\tfor ( pos = 0; pos < len; pos++ ) {\n\t\tfactor = len - pos;\n\t\tdigit = account.substring( pos, pos + 1 );\n\t\tsum = sum + factor * digit;\n\t}\n\treturn sum % 11 === 0;\n}, \"Please specify a valid bank account number\" );\n\n$.validator.addMethod( \"bankorgiroaccountNL\", function( value, element ) {\n\treturn this.optional( element ) ||\n\t\t\t( $.validator.methods.bankaccountNL.call( this, value, element ) ) ||\n\t\t\t( $.validator.methods.giroaccountNL.call( this, value, element ) );\n}, \"Please specify a valid bank or giro account number\" );\n\n/**\n * BIC is the business identifier code (ISO 9362). This BIC check is not a guarantee for authenticity.\n *\n * BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional)\n *\n * Validation is case-insensitive. Please make sure to normalize input yourself.\n *\n * BIC definition in detail:\n * - First 4 characters - bank code (only letters)\n * - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters)\n * - Next 2 characters - location code (letters and digits)\n *   a. shall not start with '0' or '1'\n *   b. second character must be a letter ('O' is not allowed) or digit ('0' for test (therefore not allowed), '1' denoting passive participant, '2' typically reverse-billing)\n * - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits)\n */\n$.validator.addMethod( \"bic\", function( value, element ) {\n    return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value.toUpperCase() );\n}, \"Please specify a valid BIC code\" );\n\n/*\n * Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities\n * Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal\n *\n * Spanish CIF structure:\n *\n * [ T ][ P ][ P ][ N ][ N ][ N ][ N ][ N ][ C ]\n *\n * Where:\n *\n * T: 1 character. Kind of Organization Letter: [ABCDEFGHJKLMNPQRSUVW]\n * P: 2 characters. Province.\n * N: 5 characters. Secuencial Number within the province.\n * C: 1 character. Control Digit: [0-9A-J].\n *\n * [ T ]: Kind of Organizations. Possible values:\n *\n *   A. Corporations\n *   B. LLCs\n *   C. General partnerships\n *   D. Companies limited partnerships\n *   E. Communities of goods\n *   F. Cooperative Societies\n *   G. Associations\n *   H. Communities of homeowners in horizontal property regime\n *   J. Civil Societies\n *   K. Old format\n *   L. Old format\n *   M. Old format\n *   N. Nonresident entities\n *   P. Local authorities\n *   Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions\n *   R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)\n *   S. Organs of State Administration and regions\n *   V. Agrarian Transformation\n *   W. Permanent establishments of non-resident in Spain\n *\n * [ C ]: Control Digit. It can be a number or a letter depending on T value:\n * [ T ]  -->  [ C ]\n * ------    ----------\n *   A         Number\n *   B         Number\n *   E         Number\n *   H         Number\n *   K         Letter\n *   P         Letter\n *   Q         Letter\n *   S         Letter\n *\n */\n$.validator.addMethod( \"cifES\", function( value, element ) {\n\t\"use strict\";\n\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\n\tvar cifRegEx = new RegExp( /^([ABCDEFGHJKLMNPQRSUVW])(\\d{7})([0-9A-J])$/gi );\n\tvar letter  = value.substring( 0, 1 ), // [ T ]\n\t\tnumber  = value.substring( 1, 8 ), // [ P ][ P ][ N ][ N ][ N ][ N ][ N ]\n\t\tcontrol = value.substring( 8, 9 ), // [ C ]\n\t\tall_sum = 0,\n\t\teven_sum = 0,\n\t\todd_sum = 0,\n\t\ti, n,\n\t\tcontrol_digit,\n\t\tcontrol_letter;\n\n\tfunction isOdd( n ) {\n\t\treturn n % 2 === 0;\n\t}\n\n\t// Quick format test\n\tif ( value.length !== 9 || !cifRegEx.test( value ) ) {\n\t\treturn false;\n\t}\n\n\tfor ( i = 0; i < number.length; i++ ) {\n\t\tn = parseInt( number[ i ], 10 );\n\n\t\t// Odd positions\n\t\tif ( isOdd( i ) ) {\n\n\t\t\t// Odd positions are multiplied first.\n\t\t\tn *= 2;\n\n\t\t\t// If the multiplication is bigger than 10 we need to adjust\n\t\t\todd_sum += n < 10 ? n : n - 9;\n\n\t\t// Even positions\n\t\t// Just sum them\n\t\t} else {\n\t\t\teven_sum += n;\n\t\t}\n\t}\n\n\tall_sum = even_sum + odd_sum;\n\tcontrol_digit = ( 10 - ( all_sum ).toString().substr( -1 ) ).toString();\n\tcontrol_digit = parseInt( control_digit, 10 ) > 9 ? \"0\" : control_digit;\n\tcontrol_letter = \"JABCDEFGHI\".substr( control_digit, 1 ).toString();\n\n\t// Control must be a digit\n\tif ( letter.match( /[ABEH]/ ) ) {\n\t\treturn control === control_digit;\n\n\t// Control must be a letter\n\t} else if ( letter.match( /[KPQS]/ ) ) {\n\t\treturn control === control_letter;\n\t}\n\n\t// Can be either\n\treturn control === control_digit || control === control_letter;\n\n}, \"Please specify a valid CIF number.\" );\n\n/*\n * Brazillian CPF number (Cadastrado de Pessoas Físicas) is the equivalent of a Brazilian tax registration number.\n * CPF numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.\n */\n$.validator.addMethod( \"cpfBR\", function( value ) {\n\n\t// Removing special characters from value\n\tvalue = value.replace( /([~!@#$%^&*()_+=`{}\\[\\]\\-|\\\\:;'<>,.\\/? ])+/g, \"\" );\n\n\t// Checking value to have 11 digits only\n\tif ( value.length !== 11 ) {\n\t\treturn false;\n\t}\n\n\tvar sum = 0,\n\t\tfirstCN, secondCN, checkResult, i;\n\n\tfirstCN = parseInt( value.substring( 9, 10 ), 10 );\n\tsecondCN = parseInt( value.substring( 10, 11 ), 10 );\n\n\tcheckResult = function( sum, cn ) {\n\t\tvar result = ( sum * 10 ) % 11;\n\t\tif ( ( result === 10 ) || ( result === 11 ) ) {\n\t\t\tresult = 0;\n\t\t}\n\t\treturn ( result === cn );\n\t};\n\n\t// Checking for dump data\n\tif ( value === \"\" ||\n\t\tvalue === \"00000000000\" ||\n\t\tvalue === \"11111111111\" ||\n\t\tvalue === \"22222222222\" ||\n\t\tvalue === \"33333333333\" ||\n\t\tvalue === \"44444444444\" ||\n\t\tvalue === \"55555555555\" ||\n\t\tvalue === \"66666666666\" ||\n\t\tvalue === \"77777777777\" ||\n\t\tvalue === \"88888888888\" ||\n\t\tvalue === \"99999999999\"\n\t) {\n\t\treturn false;\n\t}\n\n\t// Step 1 - using first Check Number:\n\tfor ( i = 1; i <= 9; i++ ) {\n\t\tsum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 11 - i );\n\t}\n\n\t// If first Check Number (CN) is valid, move to Step 2 - using second Check Number:\n\tif ( checkResult( sum, firstCN ) ) {\n\t\tsum = 0;\n\t\tfor ( i = 1; i <= 10; i++ ) {\n\t\t\tsum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 12 - i );\n\t\t}\n\t\treturn checkResult( sum, secondCN );\n\t}\n\treturn false;\n\n}, \"Please specify a valid CPF number\" );\n\n// https://jqueryvalidation.org/creditcard-method/\n// based on https://en.wikipedia.org/wiki/Luhn_algorithm\n$.validator.addMethod( \"creditcard\", function( value, element ) {\n\tif ( this.optional( element ) ) {\n\t\treturn \"dependency-mismatch\";\n\t}\n\n\t// Accept only spaces, digits and dashes\n\tif ( /[^0-9 \\-]+/.test( value ) ) {\n\t\treturn false;\n\t}\n\n\tvar nCheck = 0,\n\t\tnDigit = 0,\n\t\tbEven = false,\n\t\tn, cDigit;\n\n\tvalue = value.replace( /\\D/g, \"\" );\n\n\t// Basing min and max length on\n\t// https://developer.ean.com/general_info/Valid_Credit_Card_Types\n\tif ( value.length < 13 || value.length > 19 ) {\n\t\treturn false;\n\t}\n\n\tfor ( n = value.length - 1; n >= 0; n-- ) {\n\t\tcDigit = value.charAt( n );\n\t\tnDigit = parseInt( cDigit, 10 );\n\t\tif ( bEven ) {\n\t\t\tif ( ( nDigit *= 2 ) > 9 ) {\n\t\t\t\tnDigit -= 9;\n\t\t\t}\n\t\t}\n\n\t\tnCheck += nDigit;\n\t\tbEven = !bEven;\n\t}\n\n\treturn ( nCheck % 10 ) === 0;\n}, \"Please enter a valid credit card number.\" );\n\n/* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator\n * Redistributed under the the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0\n * Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)\n */\n$.validator.addMethod( \"creditcardtypes\", function( value, element, param ) {\n\tif ( /[^0-9\\-]+/.test( value ) ) {\n\t\treturn false;\n\t}\n\n\tvalue = value.replace( /\\D/g, \"\" );\n\n\tvar validTypes = 0x0000;\n\n\tif ( param.mastercard ) {\n\t\tvalidTypes |= 0x0001;\n\t}\n\tif ( param.visa ) {\n\t\tvalidTypes |= 0x0002;\n\t}\n\tif ( param.amex ) {\n\t\tvalidTypes |= 0x0004;\n\t}\n\tif ( param.dinersclub ) {\n\t\tvalidTypes |= 0x0008;\n\t}\n\tif ( param.enroute ) {\n\t\tvalidTypes |= 0x0010;\n\t}\n\tif ( param.discover ) {\n\t\tvalidTypes |= 0x0020;\n\t}\n\tif ( param.jcb ) {\n\t\tvalidTypes |= 0x0040;\n\t}\n\tif ( param.unknown ) {\n\t\tvalidTypes |= 0x0080;\n\t}\n\tif ( param.all ) {\n\t\tvalidTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;\n\t}\n\tif ( validTypes & 0x0001 && /^(5[12345])/.test( value ) ) { // Mastercard\n\t\treturn value.length === 16;\n\t}\n\tif ( validTypes & 0x0002 && /^(4)/.test( value ) ) { // Visa\n\t\treturn value.length === 16;\n\t}\n\tif ( validTypes & 0x0004 && /^(3[47])/.test( value ) ) { // Amex\n\t\treturn value.length === 15;\n\t}\n\tif ( validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test( value ) ) { // Dinersclub\n\t\treturn value.length === 14;\n\t}\n\tif ( validTypes & 0x0010 && /^(2(014|149))/.test( value ) ) { // Enroute\n\t\treturn value.length === 15;\n\t}\n\tif ( validTypes & 0x0020 && /^(6011)/.test( value ) ) { // Discover\n\t\treturn value.length === 16;\n\t}\n\tif ( validTypes & 0x0040 && /^(3)/.test( value ) ) { // Jcb\n\t\treturn value.length === 16;\n\t}\n\tif ( validTypes & 0x0040 && /^(2131|1800)/.test( value ) ) { // Jcb\n\t\treturn value.length === 15;\n\t}\n\tif ( validTypes & 0x0080 ) { // Unknown\n\t\treturn true;\n\t}\n\treturn false;\n}, \"Please enter a valid credit card number.\" );\n\n/**\n * Validates currencies with any given symbols by @jameslouiz\n * Symbols can be optional or required. Symbols required by default\n *\n * Usage examples:\n *  currency: [\"£\", false] - Use false for soft currency validation\n *  currency: [\"$\", false]\n *  currency: [\"RM\", false] - also works with text based symbols such as \"RM\" - Malaysia Ringgit etc\n *\n *  <input class=\"currencyInput\" name=\"currencyInput\">\n *\n * Soft symbol checking\n *  currencyInput: {\n *     currency: [\"$\", false]\n *  }\n *\n * Strict symbol checking (default)\n *  currencyInput: {\n *     currency: \"$\"\n *     //OR\n *     currency: [\"$\", true]\n *  }\n *\n * Multiple Symbols\n *  currencyInput: {\n *     currency: \"$,£,¢\"\n *  }\n */\n$.validator.addMethod( \"currency\", function( value, element, param ) {\n    var isParamString = typeof param === \"string\",\n        symbol = isParamString ? param : param[ 0 ],\n        soft = isParamString ? true : param[ 1 ],\n        regex;\n\n    symbol = symbol.replace( /,/g, \"\" );\n    symbol = soft ? symbol + \"]\" : symbol + \"]?\";\n    regex = \"^[\" + symbol + \"([1-9]{1}[0-9]{0,2}(\\\\,[0-9]{3})*(\\\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\\\.[0-9]{0,2})?|0(\\\\.[0-9]{0,2})?|(\\\\.[0-9]{1,2})?)$\";\n    regex = new RegExp( regex );\n    return this.optional( element ) || regex.test( value );\n\n}, \"Please specify a valid currency\" );\n\n$.validator.addMethod( \"dateFA\", function( value, element ) {\n\treturn this.optional( element ) || /^[1-4]\\d{3}\\/((0?[1-6]\\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\\/(30|([1-2][0-9])|(0?[1-9]))))$/.test( value );\n}, $.validator.messages.date );\n\n/**\n * Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.\n *\n * @example $.validator.methods.date(\"01/01/1900\")\n * @result true\n *\n * @example $.validator.methods.date(\"01/13/1990\")\n * @result false\n *\n * @example $.validator.methods.date(\"01.01.1900\")\n * @result false\n *\n * @example <input name=\"pippo\" class=\"{dateITA:true}\" />\n * @desc Declares an optional input element whose value must be a valid date.\n *\n * @name $.validator.methods.dateITA\n * @type Boolean\n * @cat Plugins/Validate/Methods\n */\n$.validator.addMethod( \"dateITA\", function( value, element ) {\n\tvar check = false,\n\t\tre = /^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/,\n\t\tadata, gg, mm, aaaa, xdata;\n\tif ( re.test( value ) ) {\n\t\tadata = value.split( \"/\" );\n\t\tgg = parseInt( adata[ 0 ], 10 );\n\t\tmm = parseInt( adata[ 1 ], 10 );\n\t\taaaa = parseInt( adata[ 2 ], 10 );\n\t\txdata = new Date( Date.UTC( aaaa, mm - 1, gg, 12, 0, 0, 0 ) );\n\t\tif ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth() === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {\n\t\t\tcheck = true;\n\t\t} else {\n\t\t\tcheck = false;\n\t\t}\n\t} else {\n\t\tcheck = false;\n\t}\n\treturn this.optional( element ) || check;\n}, $.validator.messages.date );\n\n$.validator.addMethod( \"dateNL\", function( value, element ) {\n\treturn this.optional( element ) || /^(0?[1-9]|[12]\\d|3[01])[\\.\\/\\-](0?[1-9]|1[012])[\\.\\/\\-]([12]\\d)?(\\d\\d)$/.test( value );\n}, $.validator.messages.date );\n\n// Older \"accept\" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept\n$.validator.addMethod( \"extension\", function( value, element, param ) {\n\tparam = typeof param === \"string\" ? param.replace( /,/g, \"|\" ) : \"png|jpe?g|gif\";\n\treturn this.optional( element ) || value.match( new RegExp( \"\\\\.(\" + param + \")$\", \"i\" ) );\n}, $.validator.format( \"Please enter a value with a valid extension.\" ) );\n\n/**\n * Dutch giro account numbers (not bank numbers) have max 7 digits\n */\n$.validator.addMethod( \"giroaccountNL\", function( value, element ) {\n\treturn this.optional( element ) || /^[0-9]{1,7}$/.test( value );\n}, \"Please specify a valid giro account number\" );\n\n/**\n * IBAN is the international bank account number.\n * It has a country - specific format, that is checked here too\n *\n * Validation is case-insensitive. Please make sure to normalize input yourself.\n */\n$.validator.addMethod( \"iban\", function( value, element ) {\n\n\t// Some quick simple tests to prevent needless work\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\n\t// Remove spaces and to upper case\n\tvar iban = value.replace( / /g, \"\" ).toUpperCase(),\n\t\tibancheckdigits = \"\",\n\t\tleadingZeroes = true,\n\t\tcRest = \"\",\n\t\tcOperator = \"\",\n\t\tcountrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p;\n\n\t// Check for IBAN code length.\n\t// It contains:\n\t// country code ISO 3166-1 - two letters,\n\t// two check digits,\n\t// Basic Bank Account Number (BBAN) - up to 30 chars\n\tvar minimalIBANlength = 5;\n\tif ( iban.length < minimalIBANlength ) {\n\t\treturn false;\n\t}\n\n\t// Check the country code and find the country specific format\n\tcountrycode = iban.substring( 0, 2 );\n\tbbancountrypatterns = {\n\t\t\"AL\": \"\\\\d{8}[\\\\dA-Z]{16}\",\n\t\t\"AD\": \"\\\\d{8}[\\\\dA-Z]{12}\",\n\t\t\"AT\": \"\\\\d{16}\",\n\t\t\"AZ\": \"[\\\\dA-Z]{4}\\\\d{20}\",\n\t\t\"BE\": \"\\\\d{12}\",\n\t\t\"BH\": \"[A-Z]{4}[\\\\dA-Z]{14}\",\n\t\t\"BA\": \"\\\\d{16}\",\n\t\t\"BR\": \"\\\\d{23}[A-Z][\\\\dA-Z]\",\n\t\t\"BG\": \"[A-Z]{4}\\\\d{6}[\\\\dA-Z]{8}\",\n\t\t\"CR\": \"\\\\d{17}\",\n\t\t\"HR\": \"\\\\d{17}\",\n\t\t\"CY\": \"\\\\d{8}[\\\\dA-Z]{16}\",\n\t\t\"CZ\": \"\\\\d{20}\",\n\t\t\"DK\": \"\\\\d{14}\",\n\t\t\"DO\": \"[A-Z]{4}\\\\d{20}\",\n\t\t\"EE\": \"\\\\d{16}\",\n\t\t\"FO\": \"\\\\d{14}\",\n\t\t\"FI\": \"\\\\d{14}\",\n\t\t\"FR\": \"\\\\d{10}[\\\\dA-Z]{11}\\\\d{2}\",\n\t\t\"GE\": \"[\\\\dA-Z]{2}\\\\d{16}\",\n\t\t\"DE\": \"\\\\d{18}\",\n\t\t\"GI\": \"[A-Z]{4}[\\\\dA-Z]{15}\",\n\t\t\"GR\": \"\\\\d{7}[\\\\dA-Z]{16}\",\n\t\t\"GL\": \"\\\\d{14}\",\n\t\t\"GT\": \"[\\\\dA-Z]{4}[\\\\dA-Z]{20}\",\n\t\t\"HU\": \"\\\\d{24}\",\n\t\t\"IS\": \"\\\\d{22}\",\n\t\t\"IE\": \"[\\\\dA-Z]{4}\\\\d{14}\",\n\t\t\"IL\": \"\\\\d{19}\",\n\t\t\"IT\": \"[A-Z]\\\\d{10}[\\\\dA-Z]{12}\",\n\t\t\"KZ\": \"\\\\d{3}[\\\\dA-Z]{13}\",\n\t\t\"KW\": \"[A-Z]{4}[\\\\dA-Z]{22}\",\n\t\t\"LV\": \"[A-Z]{4}[\\\\dA-Z]{13}\",\n\t\t\"LB\": \"\\\\d{4}[\\\\dA-Z]{20}\",\n\t\t\"LI\": \"\\\\d{5}[\\\\dA-Z]{12}\",\n\t\t\"LT\": \"\\\\d{16}\",\n\t\t\"LU\": \"\\\\d{3}[\\\\dA-Z]{13}\",\n\t\t\"MK\": \"\\\\d{3}[\\\\dA-Z]{10}\\\\d{2}\",\n\t\t\"MT\": \"[A-Z]{4}\\\\d{5}[\\\\dA-Z]{18}\",\n\t\t\"MR\": \"\\\\d{23}\",\n\t\t\"MU\": \"[A-Z]{4}\\\\d{19}[A-Z]{3}\",\n\t\t\"MC\": \"\\\\d{10}[\\\\dA-Z]{11}\\\\d{2}\",\n\t\t\"MD\": \"[\\\\dA-Z]{2}\\\\d{18}\",\n\t\t\"ME\": \"\\\\d{18}\",\n\t\t\"NL\": \"[A-Z]{4}\\\\d{10}\",\n\t\t\"NO\": \"\\\\d{11}\",\n\t\t\"PK\": \"[\\\\dA-Z]{4}\\\\d{16}\",\n\t\t\"PS\": \"[\\\\dA-Z]{4}\\\\d{21}\",\n\t\t\"PL\": \"\\\\d{24}\",\n\t\t\"PT\": \"\\\\d{21}\",\n\t\t\"RO\": \"[A-Z]{4}[\\\\dA-Z]{16}\",\n\t\t\"SM\": \"[A-Z]\\\\d{10}[\\\\dA-Z]{12}\",\n\t\t\"SA\": \"\\\\d{2}[\\\\dA-Z]{18}\",\n\t\t\"RS\": \"\\\\d{18}\",\n\t\t\"SK\": \"\\\\d{20}\",\n\t\t\"SI\": \"\\\\d{15}\",\n\t\t\"ES\": \"\\\\d{20}\",\n\t\t\"SE\": \"\\\\d{20}\",\n\t\t\"CH\": \"\\\\d{5}[\\\\dA-Z]{12}\",\n\t\t\"TN\": \"\\\\d{20}\",\n\t\t\"TR\": \"\\\\d{5}[\\\\dA-Z]{17}\",\n\t\t\"AE\": \"\\\\d{3}\\\\d{16}\",\n\t\t\"GB\": \"[A-Z]{4}\\\\d{14}\",\n\t\t\"VG\": \"[\\\\dA-Z]{4}\\\\d{16}\"\n\t};\n\n\tbbanpattern = bbancountrypatterns[ countrycode ];\n\n\t// As new countries will start using IBAN in the\n\t// future, we only check if the countrycode is known.\n\t// This prevents false negatives, while almost all\n\t// false positives introduced by this, will be caught\n\t// by the checksum validation below anyway.\n\t// Strict checking should return FALSE for unknown\n\t// countries.\n\tif ( typeof bbanpattern !== \"undefined\" ) {\n\t\tibanregexp = new RegExp( \"^[A-Z]{2}\\\\d{2}\" + bbanpattern + \"$\", \"\" );\n\t\tif ( !( ibanregexp.test( iban ) ) ) {\n\t\t\treturn false; // Invalid country specific format\n\t\t}\n\t}\n\n\t// Now check the checksum, first convert to digits\n\tibancheck = iban.substring( 4, iban.length ) + iban.substring( 0, 4 );\n\tfor ( i = 0; i < ibancheck.length; i++ ) {\n\t\tcharAt = ibancheck.charAt( i );\n\t\tif ( charAt !== \"0\" ) {\n\t\t\tleadingZeroes = false;\n\t\t}\n\t\tif ( !leadingZeroes ) {\n\t\t\tibancheckdigits += \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\".indexOf( charAt );\n\t\t}\n\t}\n\n\t// Calculate the result of: ibancheckdigits % 97\n\tfor ( p = 0; p < ibancheckdigits.length; p++ ) {\n\t\tcChar = ibancheckdigits.charAt( p );\n\t\tcOperator = \"\" + cRest + \"\" + cChar;\n\t\tcRest = cOperator % 97;\n\t}\n\treturn cRest === 1;\n}, \"Please specify a valid IBAN\" );\n\n$.validator.addMethod( \"integer\", function( value, element ) {\n\treturn this.optional( element ) || /^-?\\d+$/.test( value );\n}, \"A positive or negative non-decimal number please\" );\n\n$.validator.addMethod( \"ipv4\", function( value, element ) {\n\treturn this.optional( element ) || /^(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/i.test( value );\n}, \"Please enter a valid IP v4 address.\" );\n\n$.validator.addMethod( \"ipv6\", function( value, element ) {\n\treturn this.optional( element ) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test( value );\n}, \"Please enter a valid IP v6 address.\" );\n\n$.validator.addMethod( \"lettersonly\", function( value, element ) {\n\treturn this.optional( element ) || /^[a-z]+$/i.test( value );\n}, \"Letters only please\" );\n\n$.validator.addMethod( \"letterswithbasicpunc\", function( value, element ) {\n\treturn this.optional( element ) || /^[a-z\\-.,()'\"\\s]+$/i.test( value );\n}, \"Letters or punctuation only please\" );\n\n$.validator.addMethod( \"mobileNL\", function( value, element ) {\n\treturn this.optional( element ) || /^((\\+|00(\\s|\\s?\\-\\s?)?)31(\\s|\\s?\\-\\s?)?(\\(0\\)[\\-\\s]?)?|0)6((\\s|\\s?\\-\\s?)?[0-9]){8}$/.test( value );\n}, \"Please specify a valid mobile number\" );\n\n/* For UK phone functions, do the following server side processing:\n * Compare original input with this RegEx pattern:\n * ^\\(?(?:(?:00\\)?[\\s\\-]?\\(?|\\+)(44)\\)?[\\s\\-]?\\(?(?:0\\)?[\\s\\-]?\\(?)?|0)([1-9]\\d{1,4}\\)?[\\s\\d\\-]+)$\n * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'\n * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.\n * A number of very detailed GB telephone number RegEx patterns can also be found at:\n * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers\n */\n$.validator.addMethod( \"mobileUK\", function( phone_number, element ) {\n\tphone_number = phone_number.replace( /\\(|\\)|\\s+|-/g, \"\" );\n\treturn this.optional( element ) || phone_number.length > 9 &&\n\t\tphone_number.match( /^(?:(?:(?:00\\s?|\\+)44\\s?|0)7(?:[1345789]\\d{2}|624)\\s?\\d{3}\\s?\\d{3})$/ );\n}, \"Please specify a valid mobile number\" );\n\n$.validator.addMethod( \"netmask\", function( value, element ) {\n    return this.optional( element ) || /^(254|252|248|240|224|192|128)\\.0\\.0\\.0|255\\.(254|252|248|240|224|192|128|0)\\.0\\.0|255\\.255\\.(254|252|248|240|224|192|128|0)\\.0|255\\.255\\.255\\.(254|252|248|240|224|192|128|0)/i.test( value );\n}, \"Please enter a valid netmask.\" );\n\n/*\n * The NIE (Número de Identificación de Extranjero) is a Spanish tax identification number assigned by the Spanish\n * authorities to any foreigner.\n *\n * The NIE is the equivalent of a Spaniards Número de Identificación Fiscal (NIF) which serves as a fiscal\n * identification number. The CIF number (Certificado de Identificación Fiscal) is equivalent to the NIF, but applies to\n * companies rather than individuals. The NIE consists of an 'X' or 'Y' followed by 7 or 8 digits then another letter.\n */\n$.validator.addMethod( \"nieES\", function( value, element ) {\n\t\"use strict\";\n\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\n\tvar nieRegEx = new RegExp( /^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi );\n\tvar validChars = \"TRWAGMYFPDXBNJZSQVHLCKET\",\n\t\tletter = value.substr( value.length - 1 ).toUpperCase(),\n\t\tnumber;\n\n\tvalue = value.toString().toUpperCase();\n\n\t// Quick format test\n\tif ( value.length > 10 || value.length < 9 || !nieRegEx.test( value ) ) {\n\t\treturn false;\n\t}\n\n\t// X means same number\n\t// Y means number + 10000000\n\t// Z means number + 20000000\n\tvalue = value.replace( /^[X]/, \"0\" )\n\t\t.replace( /^[Y]/, \"1\" )\n\t\t.replace( /^[Z]/, \"2\" );\n\n\tnumber = value.length === 9 ? value.substr( 0, 8 ) : value.substr( 0, 9 );\n\n\treturn validChars.charAt( parseInt( number, 10 ) % 23 ) === letter;\n\n}, \"Please specify a valid NIE number.\" );\n\n/*\n * The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals\n */\n$.validator.addMethod( \"nifES\", function( value, element ) {\n\t\"use strict\";\n\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\n\tvalue = value.toUpperCase();\n\n\t// Basic format test\n\tif ( !value.match( \"((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)\" ) ) {\n\t\treturn false;\n\t}\n\n\t// Test NIF\n\tif ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) {\n\t\treturn ( \"TRWAGMYFPDXBNJZSQVHLCKE\".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) );\n\t}\n\n\t// Test specials NIF (starts with K, L or M)\n\tif ( /^[KLM]{1}/.test( value ) ) {\n\t\treturn ( value[ 8 ] === \"TRWAGMYFPDXBNJZSQVHLCKE\".charAt( value.substring( 8, 1 ) % 23 ) );\n\t}\n\n\treturn false;\n\n}, \"Please specify a valid NIF number.\" );\n\n/*\n * Numer identyfikacji podatkowej ( NIP ) is the way tax identification used in Poland for companies\n */\n$.validator.addMethod( \"nipPL\", function( value ) {\n\t\"use strict\";\n\n\tvalue = value.replace( /[^0-9]/g, \"\" );\n\n\tif ( value.length !== 10 ) {\n\t\treturn false;\n\t}\n\n\tvar arrSteps = [ 6, 5, 7, 2, 3, 4, 5, 6, 7 ];\n\tvar intSum = 0;\n\tfor ( var i = 0; i < 9; i++ ) {\n\t\tintSum += arrSteps[ i ] * value[ i ];\n\t}\n\tvar int2 = intSum % 11;\n\tvar intControlNr = ( int2 === 10 ) ? 0 : int2;\n\n\treturn ( intControlNr === parseInt( value[ 9 ], 10 ) );\n}, \"Please specify a valid NIP number.\" );\n\n$.validator.addMethod( \"notEqualTo\", function( value, element, param ) {\n\treturn this.optional( element ) || !$.validator.methods.equalTo.call( this, value, element, param );\n}, \"Please enter a different value, values must not be the same.\" );\n\n$.validator.addMethod( \"nowhitespace\", function( value, element ) {\n\treturn this.optional( element ) || /^\\S+$/i.test( value );\n}, \"No white space please\" );\n\n/**\n* Return true if the field value matches the given format RegExp\n*\n* @example $.validator.methods.pattern(\"AR1004\",element,/^AR\\d{4}$/)\n* @result true\n*\n* @example $.validator.methods.pattern(\"BR1004\",element,/^AR\\d{4}$/)\n* @result false\n*\n* @name $.validator.methods.pattern\n* @type Boolean\n* @cat Plugins/Validate/Methods\n*/\n$.validator.addMethod( \"pattern\", function( value, element, param ) {\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\tif ( typeof param === \"string\" ) {\n\t\tparam = new RegExp( \"^(?:\" + param + \")$\" );\n\t}\n\treturn param.test( value );\n}, \"Invalid format.\" );\n\n/**\n * Dutch phone numbers have 10 digits (or 11 and start with +31).\n */\n$.validator.addMethod( \"phoneNL\", function( value, element ) {\n\treturn this.optional( element ) || /^((\\+|00(\\s|\\s?\\-\\s?)?)31(\\s|\\s?\\-\\s?)?(\\(0\\)[\\-\\s]?)?|0)[1-9]((\\s|\\s?\\-\\s?)?[0-9]){8}$/.test( value );\n}, \"Please specify a valid phone number.\" );\n\n/* For UK phone functions, do the following server side processing:\n * Compare original input with this RegEx pattern:\n * ^\\(?(?:(?:00\\)?[\\s\\-]?\\(?|\\+)(44)\\)?[\\s\\-]?\\(?(?:0\\)?[\\s\\-]?\\(?)?|0)([1-9]\\d{1,4}\\)?[\\s\\d\\-]+)$\n * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'\n * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.\n * A number of very detailed GB telephone number RegEx patterns can also be found at:\n * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers\n */\n\n// Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers\n$.validator.addMethod( \"phonesUK\", function( phone_number, element ) {\n\tphone_number = phone_number.replace( /\\(|\\)|\\s+|-/g, \"\" );\n\treturn this.optional( element ) || phone_number.length > 9 &&\n\t\tphone_number.match( /^(?:(?:(?:00\\s?|\\+)44\\s?|0)(?:1\\d{8,9}|[23]\\d{9}|7(?:[1345789]\\d{8}|624\\d{6})))$/ );\n}, \"Please specify a valid uk phone number\" );\n\n/* For UK phone functions, do the following server side processing:\n * Compare original input with this RegEx pattern:\n * ^\\(?(?:(?:00\\)?[\\s\\-]?\\(?|\\+)(44)\\)?[\\s\\-]?\\(?(?:0\\)?[\\s\\-]?\\(?)?|0)([1-9]\\d{1,4}\\)?[\\s\\d\\-]+)$\n * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'\n * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.\n * A number of very detailed GB telephone number RegEx patterns can also be found at:\n * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers\n */\n$.validator.addMethod( \"phoneUK\", function( phone_number, element ) {\n\tphone_number = phone_number.replace( /\\(|\\)|\\s+|-/g, \"\" );\n\treturn this.optional( element ) || phone_number.length > 9 &&\n\t\tphone_number.match( /^(?:(?:(?:00\\s?|\\+)44\\s?)|(?:\\(?0))(?:\\d{2}\\)?\\s?\\d{4}\\s?\\d{4}|\\d{3}\\)?\\s?\\d{3}\\s?\\d{3,4}|\\d{4}\\)?\\s?(?:\\d{5}|\\d{3}\\s?\\d{3})|\\d{5}\\)?\\s?\\d{4,5})$/ );\n}, \"Please specify a valid phone number\" );\n\n/**\n * Matches US phone number format\n *\n * where the area code may not start with 1 and the prefix may not start with 1\n * allows '-' or ' ' as a separator and allows parens around area code\n * some people may want to put a '1' in front of their number\n *\n * 1(212)-999-2345 or\n * 212 999 2344 or\n * 212-999-0983\n *\n * but not\n * 111-123-5434\n * and not\n * 212 123 4567\n */\n$.validator.addMethod( \"phoneUS\", function( phone_number, element ) {\n\tphone_number = phone_number.replace( /\\s+/g, \"\" );\n\treturn this.optional( element ) || phone_number.length > 9 &&\n\t\tphone_number.match( /^(\\+?1-?)?(\\([2-9]([02-9]\\d|1[02-9])\\)|[2-9]([02-9]\\d|1[02-9]))-?[2-9]([02-9]\\d|1[02-9])-?\\d{4}$/ );\n}, \"Please specify a valid phone number\" );\n\n/*\n* Valida CEPs do brasileiros:\n*\n* Formatos aceitos:\n* 99999-999\n* 99.999-999\n* 99999999\n*/\n$.validator.addMethod( \"postalcodeBR\", function( cep_value, element ) {\n\treturn this.optional( element ) || /^\\d{2}.\\d{3}-\\d{3}?$|^\\d{5}-?\\d{3}?$/.test( cep_value );\n}, \"Informe um CEP válido.\" );\n\n/**\n * Matches a valid Canadian Postal Code\n *\n * @example jQuery.validator.methods.postalCodeCA( \"H0H 0H0\", element )\n * @result true\n *\n * @example jQuery.validator.methods.postalCodeCA( \"H0H0H0\", element )\n * @result false\n *\n * @name jQuery.validator.methods.postalCodeCA\n * @type Boolean\n * @cat Plugins/Validate/Methods\n */\n$.validator.addMethod( \"postalCodeCA\", function( value, element ) {\n\treturn this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJKLMNPRSTVWXYZ] *\\d[ABCEGHJKLMNPRSTVWXYZ]\\d$/i.test( value );\n}, \"Please specify a valid postal code\" );\n\n/* Matches Italian postcode (CAP) */\n$.validator.addMethod( \"postalcodeIT\", function( value, element ) {\n\treturn this.optional( element ) || /^\\d{5}$/.test( value );\n}, \"Please specify a valid postal code\" );\n\n$.validator.addMethod( \"postalcodeNL\", function( value, element ) {\n\treturn this.optional( element ) || /^[1-9][0-9]{3}\\s?[a-zA-Z]{2}$/.test( value );\n}, \"Please specify a valid postal code\" );\n\n// Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK)\n$.validator.addMethod( \"postcodeUK\", function( value, element ) {\n\treturn this.optional( element ) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\\s?(0AA))$/i.test( value );\n}, \"Please specify a valid UK postcode\" );\n\n/*\n * Lets you say \"at least X inputs that match selector Y must be filled.\"\n *\n * The end result is that neither of these inputs:\n *\n *\t<input class=\"productinfo\" name=\"partnumber\">\n *\t<input class=\"productinfo\" name=\"description\">\n *\n *\t...will validate unless at least one of them is filled.\n *\n * partnumber:\t{require_from_group: [1,\".productinfo\"]},\n * description: {require_from_group: [1,\".productinfo\"]}\n *\n * options[0]: number of fields that must be filled in the group\n * options[1]: CSS selector that defines the group of conditionally required fields\n */\n$.validator.addMethod( \"require_from_group\", function( value, element, options ) {\n\tvar $fields = $( options[ 1 ], element.form ),\n\t\t$fieldsFirst = $fields.eq( 0 ),\n\t\tvalidator = $fieldsFirst.data( \"valid_req_grp\" ) ? $fieldsFirst.data( \"valid_req_grp\" ) : $.extend( {}, this ),\n\t\tisValid = $fields.filter( function() {\n\t\t\treturn validator.elementValue( this );\n\t\t} ).length >= options[ 0 ];\n\n\t// Store the cloned validator for future validation\n\t$fieldsFirst.data( \"valid_req_grp\", validator );\n\n\t// If element isn't being validated, run each require_from_group field's validation rules\n\tif ( !$( element ).data( \"being_validated\" ) ) {\n\t\t$fields.data( \"being_validated\", true );\n\t\t$fields.each( function() {\n\t\t\tvalidator.element( this );\n\t\t} );\n\t\t$fields.data( \"being_validated\", false );\n\t}\n\treturn isValid;\n}, $.validator.format( \"Please fill at least {0} of these fields.\" ) );\n\n/*\n * Lets you say \"either at least X inputs that match selector Y must be filled,\n * OR they must all be skipped (left blank).\"\n *\n * The end result, is that none of these inputs:\n *\n *\t<input class=\"productinfo\" name=\"partnumber\">\n *\t<input class=\"productinfo\" name=\"description\">\n *\t<input class=\"productinfo\" name=\"color\">\n *\n *\t...will validate unless either at least two of them are filled,\n *\tOR none of them are.\n *\n * partnumber:\t{skip_or_fill_minimum: [2,\".productinfo\"]},\n * description: {skip_or_fill_minimum: [2,\".productinfo\"]},\n * color:\t\t{skip_or_fill_minimum: [2,\".productinfo\"]}\n *\n * options[0]: number of fields that must be filled in the group\n * options[1]: CSS selector that defines the group of conditionally required fields\n *\n */\n$.validator.addMethod( \"skip_or_fill_minimum\", function( value, element, options ) {\n\tvar $fields = $( options[ 1 ], element.form ),\n\t\t$fieldsFirst = $fields.eq( 0 ),\n\t\tvalidator = $fieldsFirst.data( \"valid_skip\" ) ? $fieldsFirst.data( \"valid_skip\" ) : $.extend( {}, this ),\n\t\tnumberFilled = $fields.filter( function() {\n\t\t\treturn validator.elementValue( this );\n\t\t} ).length,\n\t\tisValid = numberFilled === 0 || numberFilled >= options[ 0 ];\n\n\t// Store the cloned validator for future validation\n\t$fieldsFirst.data( \"valid_skip\", validator );\n\n\t// If element isn't being validated, run each skip_or_fill_minimum field's validation rules\n\tif ( !$( element ).data( \"being_validated\" ) ) {\n\t\t$fields.data( \"being_validated\", true );\n\t\t$fields.each( function() {\n\t\t\tvalidator.element( this );\n\t\t} );\n\t\t$fields.data( \"being_validated\", false );\n\t}\n\treturn isValid;\n}, $.validator.format( \"Please either skip these fields or fill at least {0} of them.\" ) );\n\n/* Validates US States and/or Territories by @jdforsythe\n * Can be case insensitive or require capitalization - default is case insensitive\n * Can include US Territories or not - default does not\n * Can include US Military postal abbreviations (AA, AE, AP) - default does not\n *\n * Note: \"States\" always includes DC (District of Colombia)\n *\n * Usage examples:\n *\n *  This is the default - case insensitive, no territories, no military zones\n *  stateInput: {\n *     caseSensitive: false,\n *     includeTerritories: false,\n *     includeMilitary: false\n *  }\n *\n *  Only allow capital letters, no territories, no military zones\n *  stateInput: {\n *     caseSensitive: false\n *  }\n *\n *  Case insensitive, include territories but not military zones\n *  stateInput: {\n *     includeTerritories: true\n *  }\n *\n *  Only allow capital letters, include territories and military zones\n *  stateInput: {\n *     caseSensitive: true,\n *     includeTerritories: true,\n *     includeMilitary: true\n *  }\n *\n */\n$.validator.addMethod( \"stateUS\", function( value, element, options ) {\n\tvar isDefault = typeof options === \"undefined\",\n\t\tcaseSensitive = ( isDefault || typeof options.caseSensitive === \"undefined\" ) ? false : options.caseSensitive,\n\t\tincludeTerritories = ( isDefault || typeof options.includeTerritories === \"undefined\" ) ? false : options.includeTerritories,\n\t\tincludeMilitary = ( isDefault || typeof options.includeMilitary === \"undefined\" ) ? false : options.includeMilitary,\n\t\tregex;\n\n\tif ( !includeTerritories && !includeMilitary ) {\n\t\tregex = \"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$\";\n\t} else if ( includeTerritories && includeMilitary ) {\n\t\tregex = \"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$\";\n\t} else if ( includeTerritories ) {\n\t\tregex = \"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$\";\n\t} else {\n\t\tregex = \"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$\";\n\t}\n\n\tregex = caseSensitive ? new RegExp( regex ) : new RegExp( regex, \"i\" );\n\treturn this.optional( element ) || regex.test( value );\n}, \"Please specify a valid state\" );\n\n// TODO check if value starts with <, otherwise don't try stripping anything\n$.validator.addMethod( \"strippedminlength\", function( value, element, param ) {\n\treturn $( value ).text().length >= param;\n}, $.validator.format( \"Please enter at least {0} characters\" ) );\n\n$.validator.addMethod( \"time\", function( value, element ) {\n\treturn this.optional( element ) || /^([01]\\d|2[0-3]|[0-9])(:[0-5]\\d){1,2}$/.test( value );\n}, \"Please enter a valid time, between 00:00 and 23:59\" );\n\n$.validator.addMethod( \"time12h\", function( value, element ) {\n\treturn this.optional( element ) || /^((0?[1-9]|1[012])(:[0-5]\\d){1,2}(\\ ?[AP]M))$/i.test( value );\n}, \"Please enter a valid time in 12-hour am/pm format\" );\n\n// Same as url, but TLD is optional\n$.validator.addMethod( \"url2\", function( value, element ) {\n\treturn this.optional( element ) || /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)*(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i.test( value );\n}, $.validator.messages.url );\n\n/**\n * Return true, if the value is a valid vehicle identification number (VIN).\n *\n * Works with all kind of text inputs.\n *\n * @example <input type=\"text\" size=\"20\" name=\"VehicleID\" class=\"{required:true,vinUS:true}\" />\n * @desc Declares a required input element whose value must be a valid vehicle identification number.\n *\n * @name $.validator.methods.vinUS\n * @type Boolean\n * @cat Plugins/Validate/Methods\n */\n$.validator.addMethod( \"vinUS\", function( v ) {\n\tif ( v.length !== 17 ) {\n\t\treturn false;\n\t}\n\n\tvar LL = [ \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"J\", \"K\", \"L\", \"M\", \"N\", \"P\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\" ],\n\t\tVL = [ 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9 ],\n\t\tFL = [ 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 ],\n\t\trs = 0,\n\t\ti, n, d, f, cd, cdv;\n\n\tfor ( i = 0; i < 17; i++ ) {\n\t\tf = FL[ i ];\n\t\td = v.slice( i, i + 1 );\n\t\tif ( i === 8 ) {\n\t\t\tcdv = d;\n\t\t}\n\t\tif ( !isNaN( d ) ) {\n\t\t\td *= f;\n\t\t} else {\n\t\t\tfor ( n = 0; n < LL.length; n++ ) {\n\t\t\t\tif ( d.toUpperCase() === LL[ n ] ) {\n\t\t\t\t\td = VL[ n ];\n\t\t\t\t\td *= f;\n\t\t\t\t\tif ( isNaN( cdv ) && n === 8 ) {\n\t\t\t\t\t\tcdv = LL[ n ];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\trs += d;\n\t}\n\tcd = rs % 11;\n\tif ( cd === 10 ) {\n\t\tcd = \"X\";\n\t}\n\tif ( cd === cdv ) {\n\t\treturn true;\n\t}\n\treturn false;\n}, \"The specified vehicle identification number (VIN) is invalid.\" );\n\n$.validator.addMethod( \"zipcodeUS\", function( value, element ) {\n\treturn this.optional( element ) || /^\\d{5}(-\\d{4})?$/.test( value );\n}, \"The specified US ZIP Code is invalid\" );\n\n$.validator.addMethod( \"ziprange\", function( value, element ) {\n\treturn this.optional( element ) || /^90[2-5]\\d\\{2\\}-\\d{4}$/.test( value );\n}, \"Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx\" );\nreturn $;\n}));"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/jquery-validation/dist/jquery.validate.js",
    "content": "/*!\n * jQuery Validation Plugin v1.17.0\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2017 Jörn Zaefferer\n * Released under the MIT license\n */\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( [\"jquery\"], factory );\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t} else {\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.extend( $.fn, {\n\n\t// https://jqueryvalidation.org/validate/\n\tvalidate: function( options ) {\n\n\t\t// If nothing is selected, return nothing; can't chain anyway\n\t\tif ( !this.length ) {\n\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if a validator for this form was already created\n\t\tvar validator = $.data( this[ 0 ], \"validator\" );\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\n\t\t// Add novalidate tag if HTML5.\n\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\n\t\tvalidator = new $.validator( options, this[ 0 ] );\n\t\t$.data( this[ 0 ], \"validator\", validator );\n\n\t\tif ( validator.settings.onsubmit ) {\n\n\t\t\tthis.on( \"click.validate\", \":submit\", function( event ) {\n\n\t\t\t\t// Track the used submit button to properly handle scripted\n\t\t\t\t// submits later.\n\t\t\t\tvalidator.submitButton = event.currentTarget;\n\n\t\t\t\t// Allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\tif ( $( this ).hasClass( \"cancel\" ) ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\tif ( $( this ).attr( \"formnovalidate\" ) !== undefined ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Validate the form on submit\n\t\t\tthis.on( \"submit.validate\", function( event ) {\n\t\t\t\tif ( validator.settings.debug ) {\n\n\t\t\t\t\t// Prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t\tfunction handle() {\n\t\t\t\t\tvar hidden, result;\n\n\t\t\t\t\t// Insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t// The hidden input is inserted in two cases:\n\t\t\t\t\t//   - A user defined a `submitHandler`\n\t\t\t\t\t//   - There was a pending request due to `remote` method and `stopRequest()`\n\t\t\t\t\t//     was called to submit the form in case it's valid\n\t\t\t\t\tif ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {\n\t\t\t\t\t\thidden = $( \"<input type='hidden'/>\" )\n\t\t\t\t\t\t\t.attr( \"name\", validator.submitButton.name )\n\t\t\t\t\t\t\t.val( $( validator.submitButton ).val() )\n\t\t\t\t\t\t\t.appendTo( validator.currentForm );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( validator.settings.submitHandler ) {\n\t\t\t\t\t\tresult = validator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\tif ( hidden ) {\n\n\t\t\t\t\t\t\t// And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn validator;\n\t},\n\n\t// https://jqueryvalidation.org/valid/\n\tvalid: function() {\n\t\tvar valid, validator, errorList;\n\n\t\tif ( $( this[ 0 ] ).is( \"form\" ) ) {\n\t\t\tvalid = this.validate().form();\n\t\t} else {\n\t\t\terrorList = [];\n\t\t\tvalid = true;\n\t\t\tvalidator = $( this[ 0 ].form ).validate();\n\t\t\tthis.each( function() {\n\t\t\t\tvalid = validator.element( this ) && valid;\n\t\t\t\tif ( !valid ) {\n\t\t\t\t\terrorList = errorList.concat( validator.errorList );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvalidator.errorList = errorList;\n\t\t}\n\t\treturn valid;\n\t},\n\n\t// https://jqueryvalidation.org/rules/\n\trules: function( command, argument ) {\n\t\tvar element = this[ 0 ],\n\t\t\tsettings, staticRules, existingRules, data, param, filtered;\n\n\t\t// If nothing is selected, return empty object; can't chain anyway\n\t\tif ( element == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !element.form && element.hasAttribute( \"contenteditable\" ) ) {\n\t\t\telement.form = this.closest( \"form\" )[ 0 ];\n\t\t\telement.name = this.attr( \"name\" );\n\t\t}\n\n\t\tif ( element.form == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( command ) {\n\t\t\tsettings = $.data( element.form, \"validator\" ).settings;\n\t\t\tstaticRules = settings.rules;\n\t\t\texistingRules = $.validator.staticRules( element );\n\t\t\tswitch ( command ) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend( existingRules, $.validator.normalizeRule( argument ) );\n\n\t\t\t\t// Remove messages from rules, but allow them to be set separately\n\t\t\t\tdelete existingRules.messages;\n\t\t\t\tstaticRules[ element.name ] = existingRules;\n\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\tsettings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif ( !argument ) {\n\t\t\t\t\tdelete staticRules[ element.name ];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tfiltered = {};\n\t\t\t\t$.each( argument.split( /\\s/ ), function( index, method ) {\n\t\t\t\t\tfiltered[ method ] = existingRules[ method ];\n\t\t\t\t\tdelete existingRules[ method ];\n\t\t\t\t} );\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\n\t\tdata = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.classRules( element ),\n\t\t\t$.validator.attributeRules( element ),\n\t\t\t$.validator.dataRules( element ),\n\t\t\t$.validator.staticRules( element )\n\t\t), element );\n\n\t\t// Make sure required is at front\n\t\tif ( data.required ) {\n\t\t\tparam = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend( { required: param }, data );\n\t\t}\n\n\t\t// Make sure remote is at back\n\t\tif ( data.remote ) {\n\t\t\tparam = data.remote;\n\t\t\tdelete data.remote;\n\t\t\tdata = $.extend( data, { remote: param } );\n\t\t}\n\n\t\treturn data;\n\t}\n} );\n\n// Custom selectors\n$.extend( $.expr.pseudos || $.expr[ \":\" ], {\t\t// '|| $.expr[ \":\" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support\n\n\t// https://jqueryvalidation.org/blank-selector/\n\tblank: function( a ) {\n\t\treturn !$.trim( \"\" + $( a ).val() );\n\t},\n\n\t// https://jqueryvalidation.org/filled-selector/\n\tfilled: function( a ) {\n\t\tvar val = $( a ).val();\n\t\treturn val !== null && !!$.trim( \"\" + val );\n\t},\n\n\t// https://jqueryvalidation.org/unchecked-selector/\n\tunchecked: function( a ) {\n\t\treturn !$( a ).prop( \"checked\" );\n\t}\n} );\n\n// Constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n// https://jqueryvalidation.org/jQuery.validator.format/\n$.validator.format = function( source, params ) {\n\tif ( arguments.length === 1 ) {\n\t\treturn function() {\n\t\t\tvar args = $.makeArray( arguments );\n\t\t\targs.unshift( source );\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\t}\n\tif ( params === undefined ) {\n\t\treturn source;\n\t}\n\tif ( arguments.length > 2 && params.constructor !== Array  ) {\n\t\tparams = $.makeArray( arguments ).slice( 1 );\n\t}\n\tif ( params.constructor !== Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each( params, function( i, n ) {\n\t\tsource = source.replace( new RegExp( \"\\\\{\" + i + \"\\\\}\", \"g\" ), function() {\n\t\t\treturn n;\n\t\t} );\n\t} );\n\treturn source;\n};\n\n$.extend( $.validator, {\n\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tpendingClass: \"pending\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusCleanup: false,\n\t\tfocusInvalid: true,\n\t\terrorContainer: $( [] ),\n\t\terrorLabelContainer: $( [] ),\n\t\tonsubmit: true,\n\t\tignore: \":hidden\",\n\t\tignoreTitle: false,\n\t\tonfocusin: function( element ) {\n\t\t\tthis.lastActive = element;\n\n\t\t\t// Hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup ) {\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.hideThese( this.errorsFor( element ) );\n\t\t\t}\n\t\t},\n\t\tonfocusout: function( element ) {\n\t\t\tif ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonkeyup: function( element, event ) {\n\n\t\t\t// Avoid revalidate the field when pressing one of the following keys\n\t\t\t// Shift       => 16\n\t\t\t// Ctrl        => 17\n\t\t\t// Alt         => 18\n\t\t\t// Caps lock   => 20\n\t\t\t// End         => 35\n\t\t\t// Home        => 36\n\t\t\t// Left arrow  => 37\n\t\t\t// Up arrow    => 38\n\t\t\t// Right arrow => 39\n\t\t\t// Down arrow  => 40\n\t\t\t// Insert      => 45\n\t\t\t// Num lock    => 144\n\t\t\t// AltGr key   => 225\n\t\t\tvar excludedKeys = [\n\t\t\t\t16, 17, 18, 20, 35, 36, 37,\n\t\t\t\t38, 39, 40, 45, 144, 225\n\t\t\t];\n\n\t\t\tif ( event.which === 9 && this.elementValue( element ) === \"\" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t} else if ( element.name in this.submitted || element.name in this.invalid ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonclick: function( element ) {\n\n\t\t\t// Click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\tthis.element( element );\n\n\t\t\t// Or option elements, check parent select in that case\n\t\t\t} else if ( element.parentNode.name in this.submitted ) {\n\t\t\t\tthis.element( element.parentNode );\n\t\t\t}\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).addClass( errorClass ).removeClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).addClass( errorClass ).removeClass( validClass );\n\t\t\t}\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).removeClass( errorClass ).addClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).removeClass( errorClass ).addClass( validClass );\n\t\t\t}\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.setDefaults/\n\tsetDefaults: function( settings ) {\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\tmaxlength: $.validator.format( \"Please enter no more than {0} characters.\" ),\n\t\tminlength: $.validator.format( \"Please enter at least {0} characters.\" ),\n\t\trangelength: $.validator.format( \"Please enter a value between {0} and {1} characters long.\" ),\n\t\trange: $.validator.format( \"Please enter a value between {0} and {1}.\" ),\n\t\tmax: $.validator.format( \"Please enter a value less than or equal to {0}.\" ),\n\t\tmin: $.validator.format( \"Please enter a value greater than or equal to {0}.\" ),\n\t\tstep: $.validator.format( \"Please enter a multiple of {0}.\" )\n\t},\n\n\tautoCreateRanges: false,\n\n\tprototype: {\n\n\t\tinit: function() {\n\t\t\tthis.labelContainer = $( this.settings.errorLabelContainer );\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );\n\t\t\tthis.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\n\t\t\tvar groups = ( this.groups = {} ),\n\t\t\t\trules;\n\t\t\t$.each( this.settings.groups, function( key, value ) {\n\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\tvalue = value.split( /\\s/ );\n\t\t\t\t}\n\t\t\t\t$.each( value, function( index, name ) {\n\t\t\t\t\tgroups[ name ] = key;\n\t\t\t\t} );\n\t\t\t} );\n\t\t\trules = this.settings.rules;\n\t\t\t$.each( rules, function( key, value ) {\n\t\t\t\trules[ key ] = $.validator.normalizeRule( value );\n\t\t\t} );\n\n\t\t\tfunction delegate( event ) {\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( !this.form && this.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = $( this ).attr( \"name\" );\n\t\t\t\t}\n\n\t\t\t\tvar validator = $.data( this.form, \"validator\" ),\n\t\t\t\t\teventType = \"on\" + event.type.replace( /^validate/, \"\" ),\n\t\t\t\t\tsettings = validator.settings;\n\t\t\t\tif ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {\n\t\t\t\t\tsettings[ eventType ].call( validator, this, event );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.on( \"focusin.validate focusout.validate keyup.validate\",\n\t\t\t\t\t\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], \" +\n\t\t\t\t\t\"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], \" +\n\t\t\t\t\t\"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], \" +\n\t\t\t\t\t\"[type='radio'], [type='checkbox'], [contenteditable], [type='button']\", delegate )\n\n\t\t\t\t// Support: Chrome, oldIE\n\t\t\t\t// \"select\" is provided as event.target when clicking a option\n\t\t\t\t.on( \"click.validate\", \"select, option, [type='radio'], [type='checkbox']\", delegate );\n\n\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t$( this.currentForm ).on( \"invalid-form.validate\", this.settings.invalidHandler );\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.form/\n\t\tform: function() {\n\t\t\tthis.checkForm();\n\t\t\t$.extend( this.submitted, this.errorMap );\n\t\t\tthis.invalid = $.extend( {}, this.errorMap );\n\t\t\tif ( !this.valid() ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {\n\t\t\t\tthis.check( elements[ i ] );\n\t\t\t}\n\t\t\treturn this.valid();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.element/\n\t\telement: function( element ) {\n\t\t\tvar cleanElement = this.clean( element ),\n\t\t\t\tcheckElement = this.validationTargetFor( cleanElement ),\n\t\t\t\tv = this,\n\t\t\t\tresult = true,\n\t\t\t\trs, group;\n\n\t\t\tif ( checkElement === undefined ) {\n\t\t\t\tdelete this.invalid[ cleanElement.name ];\n\t\t\t} else {\n\t\t\t\tthis.prepareElement( checkElement );\n\t\t\t\tthis.currentElements = $( checkElement );\n\n\t\t\t\t// If this element is grouped, then validate all group elements already\n\t\t\t\t// containing a value\n\t\t\t\tgroup = this.groups[ checkElement.name ];\n\t\t\t\tif ( group ) {\n\t\t\t\t\t$.each( this.groups, function( name, testgroup ) {\n\t\t\t\t\t\tif ( testgroup === group && name !== checkElement.name ) {\n\t\t\t\t\t\t\tcleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );\n\t\t\t\t\t\t\tif ( cleanElement && cleanElement.name in v.invalid ) {\n\t\t\t\t\t\t\t\tv.currentElements.push( cleanElement );\n\t\t\t\t\t\t\t\tresult = v.check( cleanElement ) && result;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\trs = this.check( checkElement ) !== false;\n\t\t\t\tresult = result && rs;\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = true;\n\t\t\t\t}\n\n\t\t\t\tif ( !this.numberOfInvalids() ) {\n\n\t\t\t\t\t// Hide error containers on last error\n\t\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t\t}\n\t\t\t\tthis.showErrors();\n\n\t\t\t\t// Add aria-invalid status for screen readers\n\t\t\t\t$( element ).attr( \"aria-invalid\", !rs );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.showErrors/\n\t\tshowErrors: function( errors ) {\n\t\t\tif ( errors ) {\n\t\t\t\tvar validator = this;\n\n\t\t\t\t// Add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = $.map( this.errorMap, function( message, name ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\telement: validator.findByName( name )[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t} );\n\n\t\t\t\t// Remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\treturn !( element.name in errors );\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t} else {\n\t\t\t\tthis.defaultShowErrors();\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.resetForm/\n\t\tresetForm: function() {\n\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\t}\n\t\t\tthis.invalid = {};\n\t\t\tthis.submitted = {};\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tvar elements = this.elements()\n\t\t\t\t.removeData( \"previousValue\" )\n\t\t\t\t.removeAttr( \"aria-invalid\" );\n\n\t\t\tthis.resetElements( elements );\n\t\t},\n\n\t\tresetElements: function( elements ) {\n\t\t\tvar i;\n\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0; elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ],\n\t\t\t\t\t\tthis.settings.errorClass, \"\" );\n\t\t\t\t\tthis.findByName( elements[ i ].name ).removeClass( this.settings.validClass );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telements\n\t\t\t\t\t.removeClass( this.settings.errorClass )\n\t\t\t\t\t.removeClass( this.settings.validClass );\n\t\t\t}\n\t\t},\n\n\t\tnumberOfInvalids: function() {\n\t\t\treturn this.objectLength( this.invalid );\n\t\t},\n\n\t\tobjectLength: function( obj ) {\n\t\t\t/* jshint unused: false */\n\t\t\tvar count = 0,\n\t\t\t\ti;\n\t\t\tfor ( i in obj ) {\n\n\t\t\t\t// This check allows counting elements with empty error\n\t\t\t\t// message as invalid elements\n\t\t\t\tif ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\thideErrors: function() {\n\t\t\tthis.hideThese( this.toHide );\n\t\t},\n\n\t\thideThese: function( errors ) {\n\t\t\terrors.not( this.containers ).text( \"\" );\n\t\t\tthis.addWrapper( errors ).hide();\n\t\t},\n\n\t\tvalid: function() {\n\t\t\treturn this.size() === 0;\n\t\t},\n\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\n\t\tfocusInvalid: function() {\n\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )\n\t\t\t\t\t.filter( \":visible\" )\n\t\t\t\t\t.focus()\n\n\t\t\t\t\t// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger( \"focusin\" );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore IE throwing errors when focusing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep( this.errorList, function( n ) {\n\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t} ).length === 1 && lastActive;\n\t\t},\n\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {};\n\n\t\t\t// Select all valid inputs inside the form (no submit or reset buttons)\n\t\t\treturn $( this.currentForm )\n\t\t\t.find( \"input, select, textarea, [contenteditable]\" )\n\t\t\t.not( \":submit, :reset, :image, :disabled\" )\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter( function() {\n\t\t\t\tvar name = this.name || $( this ).attr( \"name\" ); // For contenteditable\n\t\t\t\tif ( !name && validator.settings.debug && window.console ) {\n\t\t\t\t\tconsole.error( \"%o has no name assigned\", this );\n\t\t\t\t}\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( this.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = name;\n\t\t\t\t}\n\n\t\t\t\t// Select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trulesCache[ name ] = true;\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t},\n\n\t\tclean: function( selector ) {\n\t\t\treturn $( selector )[ 0 ];\n\t\t},\n\n\t\terrors: function() {\n\t\t\tvar errorClass = this.settings.errorClass.split( \" \" ).join( \".\" );\n\t\t\treturn $( this.settings.errorElement + \".\" + errorClass, this.errorContext );\n\t\t},\n\n\t\tresetInternals: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $( [] );\n\t\t\tthis.toHide = $( [] );\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.resetInternals();\n\t\t\tthis.currentElements = $( [] );\n\t\t},\n\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor( element );\n\t\t},\n\n\t\telementValue: function( element ) {\n\t\t\tvar $element = $( element ),\n\t\t\t\ttype = element.type,\n\t\t\t\tval, idx;\n\n\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).val();\n\t\t\t} else if ( type === \"number\" && typeof element.validity !== \"undefined\" ) {\n\t\t\t\treturn element.validity.badInput ? \"NaN\" : $element.val();\n\t\t\t}\n\n\t\t\tif ( element.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\tval = $element.text();\n\t\t\t} else {\n\t\t\t\tval = $element.val();\n\t\t\t}\n\n\t\t\tif ( type === \"file\" ) {\n\n\t\t\t\t// Modern browser (chrome & safari)\n\t\t\t\tif ( val.substr( 0, 12 ) === \"C:\\\\fakepath\\\\\" ) {\n\t\t\t\t\treturn val.substr( 12 );\n\t\t\t\t}\n\n\t\t\t\t// Legacy browsers\n\t\t\t\t// Unix-based path\n\t\t\t\tidx = val.lastIndexOf( \"/\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Windows-based path\n\t\t\t\tidx = val.lastIndexOf( \"\\\\\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Just the file name\n\t\t\t\treturn val;\n\t\t\t}\n\n\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\treturn val.replace( /\\r/g, \"\" );\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\tcheck: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\n\t\t\tvar rules = $( element ).rules(),\n\t\t\t\trulesCount = $.map( rules, function( n, i ) {\n\t\t\t\t\treturn i;\n\t\t\t\t} ).length,\n\t\t\t\tdependencyMismatch = false,\n\t\t\t\tval = this.elementValue( element ),\n\t\t\t\tresult, method, rule, normalizer;\n\n\t\t\t// Prioritize the local normalizer defined for this element over the global one\n\t\t\t// if the former exists, otherwise user the global one in case it exists.\n\t\t\tif ( typeof rules.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = rules.normalizer;\n\t\t\t} else if (\ttypeof this.settings.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = this.settings.normalizer;\n\t\t\t}\n\n\t\t\t// If normalizer is defined, then call it to retreive the changed value instead\n\t\t\t// of using the real one.\n\t\t\t// Note that `this` in the normalizer is `element`.\n\t\t\tif ( normalizer ) {\n\t\t\t\tval = normalizer.call( element, val );\n\n\t\t\t\tif ( typeof val !== \"string\" ) {\n\t\t\t\t\tthrow new TypeError( \"The normalizer should return a string value.\" );\n\t\t\t\t}\n\n\t\t\t\t// Delete the normalizer from rules to avoid treating it as a pre-defined method.\n\t\t\t\tdelete rules.normalizer;\n\t\t\t}\n\n\t\t\tfor ( method in rules ) {\n\t\t\t\trule = { method: method, parameters: rules[ method ] };\n\t\t\t\ttry {\n\t\t\t\t\tresult = $.validator.methods[ method ].call( this, val, element, rule.parameters );\n\n\t\t\t\t\t// If a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result === \"dependency-mismatch\" && rulesCount === 1 ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\n\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor( element ) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t}\n\t\t\t\t\tif ( e instanceof TypeError ) {\n\t\t\t\t\t\te.message += \".  Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( dependencyMismatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.objectLength( rules ) ) {\n\t\t\t\tthis.successList.push( element );\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t// Return the custom message for the given element and validation method\n\t\t// specified in the element's HTML5 data attribute\n\t\t// return the generic message if present and no method specific message is present\n\t\tcustomDataMessage: function( element, method ) {\n\t\t\treturn $( element ).data( \"msg\" + method.charAt( 0 ).toUpperCase() +\n\t\t\t\tmethod.substring( 1 ).toLowerCase() ) || $( element ).data( \"msg\" );\n\t\t},\n\n\t\t// Return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[ name ];\n\t\t\treturn m && ( m.constructor === String ? m : m[ method ] );\n\t\t},\n\n\t\t// Return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor ( var i = 0; i < arguments.length; i++ ) {\n\t\t\t\tif ( arguments[ i ] !== undefined ) {\n\t\t\t\t\treturn arguments[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\n\t\t// The second parameter 'rule' used to be a string, and extended to an object literal\n\t\t// of the following form:\n\t\t// rule = {\n\t\t//     method: \"method name\",\n\t\t//     parameters: \"the given method parameters\"\n\t\t// }\n\t\t//\n\t\t// The old behavior still supported, kept to maintain backward compatibility with\n\t\t// old code, and will be removed in the next major release.\n\t\tdefaultMessage: function( element, rule ) {\n\t\t\tif ( typeof rule === \"string\" ) {\n\t\t\t\trule = { method: rule };\n\t\t\t}\n\n\t\t\tvar message = this.findDefined(\n\t\t\t\t\tthis.customMessage( element.name, rule.method ),\n\t\t\t\t\tthis.customDataMessage( element, rule.method ),\n\n\t\t\t\t\t// 'title' is never undefined, so handle empty string as undefined\n\t\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t\t$.validator.messages[ rule.method ],\n\t\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t\t),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\tmessage = message.call( this, rule.parameters, element );\n\t\t\t} else if ( theregex.test( message ) ) {\n\t\t\t\tmessage = $.validator.format( message.replace( theregex, \"{$1}\" ), rule.parameters );\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule );\n\n\t\t\tthis.errorList.push( {\n\t\t\t\tmessage: message,\n\t\t\t\telement: element,\n\t\t\t\tmethod: rule.method\n\t\t\t} );\n\n\t\t\tthis.errorMap[ element.name ] = message;\n\t\t\tthis.submitted[ element.name ] = message;\n\t\t},\n\n\t\taddWrapper: function( toToggle ) {\n\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t}\n\t\t\treturn toToggle;\n\t\t},\n\n\t\tdefaultShowErrors: function() {\n\t\t\tvar i, elements, error;\n\t\t\tfor ( i = 0; this.errorList[ i ]; i++ ) {\n\t\t\t\terror = this.errorList[ i ];\n\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif ( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif ( this.settings.success ) {\n\t\t\t\tfor ( i = 0; this.successList[ i ]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not( this.invalidElements() );\n\t\t},\n\n\t\tinvalidElements: function() {\n\t\t\treturn $( this.errorList ).map( function() {\n\t\t\t\treturn this.element;\n\t\t\t} );\n\t\t},\n\n\t\tshowLabel: function( element, message ) {\n\t\t\tvar place, group, errorID, v,\n\t\t\t\terror = this.errorsFor( element ),\n\t\t\t\telementID = this.idOrName( element ),\n\t\t\t\tdescribedBy = $( element ).attr( \"aria-describedby\" );\n\n\t\t\tif ( error.length ) {\n\n\t\t\t\t// Refresh error/success class\n\t\t\t\terror.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\n\t\t\t\t// Replace message on existing label\n\t\t\t\terror.html( message );\n\t\t\t} else {\n\n\t\t\t\t// Create error element\n\t\t\t\terror = $( \"<\" + this.settings.errorElement + \">\" )\n\t\t\t\t\t.attr( \"id\", elementID + \"-error\" )\n\t\t\t\t\t.addClass( this.settings.errorClass )\n\t\t\t\t\t.html( message || \"\" );\n\n\t\t\t\t// Maintain reference to the element to be placed into the DOM\n\t\t\t\tplace = error;\n\t\t\t\tif ( this.settings.wrapper ) {\n\n\t\t\t\t\t// Make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tplace = error.hide().show().wrap( \"<\" + this.settings.wrapper + \"/>\" ).parent();\n\t\t\t\t}\n\t\t\t\tif ( this.labelContainer.length ) {\n\t\t\t\t\tthis.labelContainer.append( place );\n\t\t\t\t} else if ( this.settings.errorPlacement ) {\n\t\t\t\t\tthis.settings.errorPlacement.call( this, place, $( element ) );\n\t\t\t\t} else {\n\t\t\t\t\tplace.insertAfter( element );\n\t\t\t\t}\n\n\t\t\t\t// Link error back to the element\n\t\t\t\tif ( error.is( \"label\" ) ) {\n\n\t\t\t\t\t// If the error is a label, then associate using 'for'\n\t\t\t\t\terror.attr( \"for\", elementID );\n\n\t\t\t\t\t// If the element is not a child of an associated label, then it's necessary\n\t\t\t\t\t// to explicitly apply aria-describedby\n\t\t\t\t} else if ( error.parents( \"label[for='\" + this.escapeCssMeta( elementID ) + \"']\" ).length === 0 ) {\n\t\t\t\t\terrorID = error.attr( \"id\" );\n\n\t\t\t\t\t// Respect existing non-error aria-describedby\n\t\t\t\t\tif ( !describedBy ) {\n\t\t\t\t\t\tdescribedBy = errorID;\n\t\t\t\t\t} else if ( !describedBy.match( new RegExp( \"\\\\b\" + this.escapeCssMeta( errorID ) + \"\\\\b\" ) ) ) {\n\n\t\t\t\t\t\t// Add to end of list if not already present\n\t\t\t\t\t\tdescribedBy += \" \" + errorID;\n\t\t\t\t\t}\n\t\t\t\t\t$( element ).attr( \"aria-describedby\", describedBy );\n\n\t\t\t\t\t// If this element is grouped, then assign to all elements in the same group\n\t\t\t\t\tgroup = this.groups[ element.name ];\n\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\tv = this;\n\t\t\t\t\t\t$.each( v.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\tif ( testgroup === group ) {\n\t\t\t\t\t\t\t\t$( \"[name='\" + v.escapeCssMeta( name ) + \"']\", v.currentForm )\n\t\t\t\t\t\t\t\t\t.attr( \"aria-describedby\", error.attr( \"id\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\terror.text( \"\" );\n\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\terror.addClass( this.settings.success );\n\t\t\t\t} else {\n\t\t\t\t\tthis.settings.success( error, element );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add( error );\n\t\t},\n\n\t\terrorsFor: function( element ) {\n\t\t\tvar name = this.escapeCssMeta( this.idOrName( element ) ),\n\t\t\t\tdescriber = $( element ).attr( \"aria-describedby\" ),\n\t\t\t\tselector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\";\n\n\t\t\t// 'aria-describedby' should directly reference the error element\n\t\t\tif ( describer ) {\n\t\t\t\tselector = selector + \", #\" + this.escapeCssMeta( describer )\n\t\t\t\t\t.replace( /\\s+/g, \", #\" );\n\t\t\t}\n\n\t\t\treturn this\n\t\t\t\t.errors()\n\t\t\t\t.filter( selector );\n\t\t},\n\n\t\t// See https://api.jquery.com/category/selectors/, for CSS\n\t\t// meta-characters that should be escaped in order to be used with JQuery\n\t\t// as a literal part of a name/id or any selector.\n\t\tescapeCssMeta: function( string ) {\n\t\t\treturn string.replace( /([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t},\n\n\t\tidOrName: function( element ) {\n\t\t\treturn this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );\n\t\t},\n\n\t\tvalidationTargetFor: function( element ) {\n\n\t\t\t// If radio/checkbox, validate first element in group instead\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\telement = this.findByName( element.name );\n\t\t\t}\n\n\t\t\t// Always apply ignore filter\n\t\t\treturn $( element ).not( this.settings.ignore )[ 0 ];\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn ( /radio|checkbox/i ).test( element.type );\n\t\t},\n\n\t\tfindByName: function( name ) {\n\t\t\treturn $( this.currentForm ).find( \"[name='\" + this.escapeCssMeta( name ) + \"']\" );\n\t\t},\n\n\t\tgetLength: function( value, element ) {\n\t\t\tswitch ( element.nodeName.toLowerCase() ) {\n\t\t\tcase \"select\":\n\t\t\t\treturn $( \"option:selected\", element ).length;\n\t\t\tcase \"input\":\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\n\t\tdepend: function( param, element ) {\n\t\t\treturn this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;\n\t\t},\n\n\t\tdependTypes: {\n\t\t\t\"boolean\": function( param ) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function( param, element ) {\n\t\t\t\treturn !!$( param, element.form ).length;\n\t\t\t},\n\t\t\t\"function\": function( param, element ) {\n\t\t\t\treturn param( element );\n\t\t\t}\n\t\t},\n\n\t\toptional: function( element ) {\n\t\t\tvar val = this.elementValue( element );\n\t\t\treturn !$.validator.methods.required.call( this, val, element ) && \"dependency-mismatch\";\n\t\t},\n\n\t\tstartRequest: function( element ) {\n\t\t\tif ( !this.pending[ element.name ] ) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\t$( element ).addClass( this.settings.pendingClass );\n\t\t\t\tthis.pending[ element.name ] = true;\n\t\t\t}\n\t\t},\n\n\t\tstopRequest: function( element, valid ) {\n\t\t\tthis.pendingRequest--;\n\n\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t}\n\t\t\tdelete this.pending[ element.name ];\n\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {\n\t\t\t\t$( this.currentForm ).submit();\n\n\t\t\t\t// Remove the hidden input that was used as a replacement for the\n\t\t\t\t// missing submit button. The hidden input is added by `handle()`\n\t\t\t\t// to ensure that the value of the used submit button is passed on\n\t\t\t\t// for scripted submits triggered by this method\n\t\t\t\tif ( this.submitButton ) {\n\t\t\t\t\t$( \"input:hidden[name='\" + this.submitButton.name + \"']\", this.currentForm ).remove();\n\t\t\t\t}\n\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\n\t\tpreviousValue: function( element, method ) {\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\treturn $.data( element, \"previousValue\" ) || $.data( element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, { method: method } )\n\t\t\t} );\n\t\t},\n\n\t\t// Cleans up all forms and elements, removes validator-specific events\n\t\tdestroy: function() {\n\t\t\tthis.resetForm();\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.off( \".validate\" )\n\t\t\t\t.removeData( \"validator\" )\n\t\t\t\t.find( \".validate-equalTo-blur\" )\n\t\t\t\t\t.off( \".validate-equalTo\" )\n\t\t\t\t\t.removeClass( \"validate-equalTo-blur\" );\n\t\t}\n\n\t},\n\n\tclassRuleSettings: {\n\t\trequired: { required: true },\n\t\temail: { email: true },\n\t\turl: { url: true },\n\t\tdate: { date: true },\n\t\tdateISO: { dateISO: true },\n\t\tnumber: { number: true },\n\t\tdigits: { digits: true },\n\t\tcreditcard: { creditcard: true }\n\t},\n\n\taddClassRules: function( className, rules ) {\n\t\tif ( className.constructor === String ) {\n\t\t\tthis.classRuleSettings[ className ] = rules;\n\t\t} else {\n\t\t\t$.extend( this.classRuleSettings, className );\n\t\t}\n\t},\n\n\tclassRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tclasses = $( element ).attr( \"class\" );\n\n\t\tif ( classes ) {\n\t\t\t$.each( classes.split( \" \" ), function() {\n\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t$.extend( rules, $.validator.classRuleSettings[ this ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeAttributeRule: function( rules, type, method, value ) {\n\n\t\t// Convert the value to a number for number inputs, and for text for backwards compability\n\t\t// allows type=\"date\" and others to be compared as strings\n\t\tif ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\tvalue = Number( value );\n\n\t\t\t// Support Opera Mini, which returns NaN for undefined minlength\n\t\t\tif ( isNaN( value ) ) {\n\t\t\t\tvalue = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif ( value || value === 0 ) {\n\t\t\trules[ method ] = value;\n\t\t} else if ( type === method && type !== \"range\" ) {\n\n\t\t\t// Exception: the jquery validate 'range' method\n\t\t\t// does not test for the html5 'range' type\n\t\t\trules[ method ] = true;\n\t\t}\n\t},\n\n\tattributeRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\n\t\t\t// Support for <input required> in both html5 and older browsers\n\t\t\tif ( method === \"required\" ) {\n\t\t\t\tvalue = element.getAttribute( method );\n\n\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\n\t\t\t\t// Force non-HTML5 browsers to return bool\n\t\t\t\tvalue = !!value;\n\t\t\t} else {\n\t\t\t\tvalue = $element.attr( method );\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\n\t\t// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\t\tif ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\tdataRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\t\t\tvalue = $element.data( \"rule\" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tstaticRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tvalidator = $.data( element.form, \"validator\" );\n\n\t\tif ( validator.settings.rules ) {\n\t\t\trules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeRules: function( rules, element ) {\n\n\t\t// Handle dependency check\n\t\t$.each( rules, function( prop, val ) {\n\n\t\t\t// Ignore rule when param is explicitly false, eg. required:false\n\t\t\tif ( val === false ) {\n\t\t\t\tdelete rules[ prop ];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( val.param || val.depends ) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch ( typeof val.depends ) {\n\t\t\t\tcase \"string\":\n\t\t\t\t\tkeepRule = !!$( val.depends, element.form ).length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"function\":\n\t\t\t\t\tkeepRule = val.depends.call( element, element );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( keepRule ) {\n\t\t\t\t\trules[ prop ] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\t$.data( element.form, \"validator\" ).resetElements( $( element ) );\n\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Evaluate parameters\n\t\t$.each( rules, function( rule, parameter ) {\n\t\t\trules[ rule ] = $.isFunction( parameter ) && rule !== \"normalizer\" ? parameter( element ) : parameter;\n\t\t} );\n\n\t\t// Clean number parameters\n\t\t$.each( [ \"minlength\", \"maxlength\" ], function() {\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\trules[ this ] = Number( rules[ this ] );\n\t\t\t}\n\t\t} );\n\t\t$.each( [ \"rangelength\", \"range\" ], function() {\n\t\t\tvar parts;\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\tif ( $.isArray( rules[ this ] ) ) {\n\t\t\t\t\trules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];\n\t\t\t\t} else if ( typeof rules[ this ] === \"string\" ) {\n\t\t\t\t\tparts = rules[ this ].replace( /[\\[\\]]/g, \"\" ).split( /[\\s,]+/ );\n\t\t\t\t\trules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tif ( $.validator.autoCreateRanges ) {\n\n\t\t\t// Auto-create ranges\n\t\t\tif ( rules.min != null && rules.max != null ) {\n\t\t\t\trules.range = [ rules.min, rules.max ];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif ( rules.minlength != null && rules.maxlength != null ) {\n\t\t\t\trules.rangelength = [ rules.minlength, rules.maxlength ];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function( data ) {\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each( data.split( /\\s/ ), function() {\n\t\t\t\ttransformed[ this ] = true;\n\t\t\t} );\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.addMethod/\n\taddMethod: function( name, method, message ) {\n\t\t$.validator.methods[ name ] = method;\n\t\t$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];\n\t\tif ( method.length < 3 ) {\n\t\t\t$.validator.addClassRules( name, $.validator.normalizeRule( name ) );\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.methods/\n\tmethods: {\n\n\t\t// https://jqueryvalidation.org/required-method/\n\t\trequired: function( value, element, param ) {\n\n\t\t\t// Check if dependency is met\n\t\t\tif ( !this.depend( param, element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\n\t\t\t\t// Could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $( element ).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\t}\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\treturn this.getLength( value, element ) > 0;\n\t\t\t}\n\t\t\treturn value.length > 0;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/email-method/\n\t\temail: function( value, element ) {\n\n\t\t\t// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n\t\t\t// Retrieved 2014-01-14\n\t\t\t// If you have a problem with this implementation, report a bug against the above spec\n\t\t\t// Or use custom methods to implement your own email validation\n\t\t\treturn this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/url-method/\n\t\turl: function( value, element ) {\n\n\t\t\t// Copyright (c) 2010-2013 Diego Perini, MIT licensed\n\t\t\t// https://gist.github.com/dperini/729294\n\t\t\t// see also https://mathiasbynens.be/demo/url-regex\n\t\t\t// modified to allow protocol-relative URLs\n\t\t\treturn this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})).?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/date-method/\n\t\tdate: function( value, element ) {\n\t\t\treturn this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/dateISO-method/\n\t\tdateISO: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/number-method/\n\t\tnumber: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/digits-method/\n\t\tdigits: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d+$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/minlength-method/\n\t\tminlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/maxlength-method/\n\t\tmaxlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/rangelength-method/\n\t\trangelength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/min-method/\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/max-method/\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/range-method/\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/step-method/\n\t\tstep: function( value, element, param ) {\n\t\t\tvar type = $( element ).attr( \"type\" ),\n\t\t\t\terrorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n\t\t\t\tsupportedTypes = [ \"text\", \"number\", \"range\" ],\n\t\t\t\tre = new RegExp( \"\\\\b\" + type + \"\\\\b\" ),\n\t\t\t\tnotSupported = type && !re.test( supportedTypes.join() ),\n\t\t\t\tdecimalPlaces = function( num ) {\n\t\t\t\t\tvar match = ( \"\" + num ).match( /(?:\\.(\\d+))?$/ );\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Number of digits right of decimal point.\n\t\t\t\t\treturn match[ 1 ] ? match[ 1 ].length : 0;\n\t\t\t\t},\n\t\t\t\ttoInt = function( num ) {\n\t\t\t\t\treturn Math.round( num * Math.pow( 10, decimals ) );\n\t\t\t\t},\n\t\t\t\tvalid = true,\n\t\t\t\tdecimals;\n\n\t\t\t// Works only for text, number and range input types\n\t\t\t// TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\t\t\tif ( notSupported ) {\n\t\t\t\tthrow new Error( errorMessage );\n\t\t\t}\n\n\t\t\tdecimals = decimalPlaces( param );\n\n\t\t\t// Value can't have too many decimals\n\t\t\tif ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {\n\t\t\t\tvalid = false;\n\t\t\t}\n\n\t\t\treturn this.optional( element ) || valid;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/equalTo-method/\n\t\tequalTo: function( value, element, param ) {\n\n\t\t\t// Bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\tvar target = $( param );\n\t\t\tif ( this.settings.onfocusout && target.not( \".validate-equalTo-blur\" ).length ) {\n\t\t\t\ttarget.addClass( \"validate-equalTo-blur\" ).on( \"blur.validate-equalTo\", function() {\n\t\t\t\t\t$( element ).valid();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn value === target.val();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/remote-method/\n\t\tremote: function( value, element, param, method ) {\n\t\t\tif ( this.optional( element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\tvar previous = this.previousValue( element, method ),\n\t\t\t\tvalidator, data, optionDataString;\n\n\t\t\tif ( !this.settings.messages[ element.name ] ) {\n\t\t\t\tthis.settings.messages[ element.name ] = {};\n\t\t\t}\n\t\t\tprevious.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];\n\t\t\tthis.settings.messages[ element.name ][ method ] = previous.message;\n\n\t\t\tparam = typeof param === \"string\" && { url: param } || param;\n\t\t\toptionDataString = $.param( $.extend( { data: value }, param.data ) );\n\t\t\tif ( previous.old === optionDataString ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = optionDataString;\n\t\t\tvalidator = this;\n\t\t\tthis.startRequest( element );\n\t\t\tdata = {};\n\t\t\tdata[ element.name ] = value;\n\t\t\t$.ajax( $.extend( true, {\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: \"validate\" + element.name,\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tcontext: validator.currentForm,\n\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\tvar valid = response === true || response === \"true\",\n\t\t\t\t\t\terrors, message, submitted;\n\n\t\t\t\t\tvalidator.settings.messages[ element.name ][ method ] = previous.originalMessage;\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tsubmitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.resetInternals();\n\t\t\t\t\t\tvalidator.toHide = validator.errorsFor( element );\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push( element );\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = false;\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors = {};\n\t\t\t\t\t\tmessage = response || validator.defaultMessage( element, { method: method, parameters: value } );\n\t\t\t\t\t\terrors[ element.name ] = previous.message = message;\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = true;\n\t\t\t\t\t\tvalidator.showErrors( errors );\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest( element, valid );\n\t\t\t\t}\n\t\t\t}, param ) );\n\t\t\treturn \"pending\";\n\t\t}\n\t}\n\n} );\n\n// Ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\nvar pendingRequests = {},\n\tajax;\n\n// Use a prefilter if available (1.5+)\nif ( $.ajaxPrefilter ) {\n\t$.ajaxPrefilter( function( settings, _, xhr ) {\n\t\tvar port = settings.port;\n\t\tif ( settings.mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = xhr;\n\t\t}\n\t} );\n} else {\n\n\t// Proxy ajax\n\tajax = $.ajax;\n\t$.ajax = function( settings ) {\n\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\tif ( mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = ajax.apply( this, arguments );\n\t\t\treturn pendingRequests[ port ];\n\t\t}\n\t\treturn ajax.apply( this, arguments );\n\t};\n}\nreturn $;\n}));"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt",
    "content": "Copyright (c) .NET Foundation. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthese files except in compliance with the License. You may obtain a copy of the\nLicense at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed\nunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the License for the\nspecific language governing permissions and limitations under the License.\n"
  },
  {
    "path": "Demo/2021/ImplicitUsings/WebApplication1/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js",
    "content": "// Unobtrusive validation support library for jQuery and jQuery Validate\n// Copyright (c) .NET Foundation. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\n// @version v3.2.11\n\n/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */\n/*global document: false, jQuery: false */\n\n(function (factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(\"jquery.validate.unobtrusive\", ['jquery-validation'], factory);\n    } else if (typeof module === 'object' && module.exports) {\n        // CommonJS-like environments that support module.exports     \n        module.exports = factory(require('jquery-validation'));\n    } else {\n        // Browser global\n        jQuery.validator.unobtrusive = factory(jQuery);\n    }\n}(function ($) {\n    var $jQval = $.validator,\n        adapters,\n        data_validation = \"unobtrusiveValidation\";\n\n    function setValidationValues(options, ruleName, value) {\n        options.rules[ruleName] = value;\n        if (options.message) {\n            options.messages[ruleName] = options.message;\n        }\n    }\n\n    function splitAndTrim(value) {\n        return value.replace(/^\\s+|\\s+$/g, \"\").split(/\\s*,\\s*/g);\n    }\n\n    function escapeAttributeValue(value) {\n        // As mentioned on http://api.jquery.com/category/selectors/\n        return value.replace(/([!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n    }\n\n    function getModelPrefix(fieldName) {\n        return fieldName.substr(0, fieldName.lastIndexOf(\".\") + 1);\n    }\n\n    function appendModelPrefix(value, prefix) {\n        if (value.indexOf(\"*.\") === 0) {\n            value = value.replace(\"*.\", prefix);\n        }\n        return value;\n    }\n\n    function onError(error, inputElement) {  // 'this' is the form element\n        var container = $(this).find(\"[data-valmsg-for='\" + escapeAttributeValue(inputElement[0].name) + \"']\"),\n            replaceAttrValue = container.attr(\"data-valmsg-replace\"),\n            replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;\n\n        container.removeClass(\"field-validation-valid\").addClass(\"field-validation-error\");\n        error.data(\"unobtrusiveContainer\", container);\n\n        if (replace) {\n            container.empty();\n            error.removeClass(\"input-validation-error\").appendTo(container);\n        }\n        else {\n            error.hide();\n        }\n    }\n\n    function onErrors(event, validator) {  // 'this' is the form element\n        var container = $(this).find(\"[data-valmsg-summary=true]\"),\n            list = container.find(\"ul\");\n\n        if (list && list.length && validator.errorList.length) {\n            list.empty();\n            container.addClass(\"validation-summary-errors\").removeClass(\"validation-summary-valid\");\n\n            $.each(validator.errorList, function () {\n                $(\"<li />\").html(this.message).appendTo(list);\n            });\n        }\n    }\n\n    function onSuccess(error) {  // 'this' is the form element\n        var container = error.data(\"unobtrusiveContainer\");\n\n        if (container) {\n            var replaceAttrValue = container.attr(\"data-valmsg-replace\"),\n                replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;\n\n            container.addClass(\"field-validation-valid\").removeClass(\"field-validation-error\");\n            error.removeData(\"unobtrusiveContainer\");\n\n            if (replace) {\n                container.empty();\n            }\n        }\n    }\n\n    function onReset(event) {  // 'this' is the form element\n        var $form = $(this),\n            key = '__jquery_unobtrusive_validation_form_reset';\n        if ($form.data(key)) {\n            return;\n        }\n        // Set a flag that indicates we're currently resetting the form.\n        $form.data(key, true);\n        try {\n            $form.data(\"validator\").resetForm();\n        } finally {\n            $form.removeData(key);\n        }\n\n        $form.find(\".validation-summary-errors\")\n            .addClass(\"validation-summary-valid\")\n            .removeClass(\"validation-summary-errors\");\n        $form.find(\".field-validation-error\")\n            .addClass(\"field-validation-valid\")\n            .removeClass(\"field-validation-error\")\n            .removeData(\"unobtrusiveContainer\")\n            .find(\">*\")  // If we were using valmsg-replace, get the underlying error\n            .removeData(\"unobtrusiveContainer\");\n    }\n\n    function validationInfo(form) {\n        var $form = $(form),\n            result = $form.data(data_validation),\n            onResetProxy = $.proxy(onReset, form),\n            defaultOptions = $jQval.unobtrusive.options || {},\n            execInContext = function (name, args) {\n                var func = defaultOptions[name];\n                func && $.isFunction(func) && func.apply(form, args);\n            };\n\n        if (!result) {\n            result = {\n                options: {  // options structure passed to jQuery Validate's validate() method\n                    errorClass: defaultOptions.errorClass || \"input-validation-error\",\n                    errorElement: defaultOptions.errorElement || \"span\",\n                    errorPlacement: function () {\n                        onError.apply(form, arguments);\n                        execInContext(\"errorPlacement\", arguments);\n                    },\n                    invalidHandler: function () {\n                        onErrors.apply(form, arguments);\n                        execInContext(\"invalidHandler\", arguments);\n                    },\n                    messages: {},\n                    rules: {},\n                    success: function () {\n                        onSuccess.apply(form, arguments);\n                        execInContext(\"success\", arguments);\n                    }\n                },\n                attachValidation: function () {\n                    $form\n                        .off(\"reset.\" + data_validation, onResetProxy)\n                        .on(\"reset.\" + data_validation, onResetProxy)\n                        .validate(this.options);\n                },\n                validate: function () {  // a validation function that is called by unobtrusive Ajax\n                    $form.validate();\n                    return $form.valid();\n                }\n            };\n            $form.data(data_validation, result);\n        }\n\n        return result;\n    }\n\n    $jQval.unobtrusive = {\n        adapters: [],\n\n        parseElement: function (element, skipAttach) {\n            /// <summary>\n            /// Parses a single HTML element for unobtrusive validation attributes.\n            /// </summary>\n            /// <param name=\"element\" domElement=\"true\">The HTML element to be parsed.</param>\n            /// <param name=\"skipAttach\" type=\"Boolean\">[Optional] true to skip attaching the\n            /// validation to the form. If parsing just this single element, you should specify true.\n            /// If parsing several elements, you should specify false, and manually attach the validation\n            /// to the form when you are finished. The default is false.</param>\n            var $element = $(element),\n                form = $element.parents(\"form\")[0],\n                valInfo, rules, messages;\n\n            if (!form) {  // Cannot do client-side validation without a form\n                return;\n            }\n\n            valInfo = validationInfo(form);\n            valInfo.options.rules[element.name] = rules = {};\n            valInfo.options.messages[element.name] = messages = {};\n\n            $.each(this.adapters, function () {\n                var prefix = \"data-val-\" + this.name,\n                    message = $element.attr(prefix),\n                    paramValues = {};\n\n                if (message !== undefined) {  // Compare against undefined, because an empty message is legal (and falsy)\n                    prefix += \"-\";\n\n                    $.each(this.params, function () {\n                        paramValues[this] = $element.attr(prefix + this);\n                    });\n\n                    this.adapt({\n                        element: element,\n                        form: form,\n                        message: message,\n                        params: paramValues,\n                        rules: rules,\n                        messages: messages\n                    });\n                }\n            });\n\n            $.extend(rules, { \"__dummy__\": true });\n\n            if (!skipAttach) {\n                valInfo.attachValidation();\n            }\n        },\n\n        parse: function (selector) {\n            /// <summary>\n            /// Parses all the HTML elements in the specified selector. It looks for input elements decorated\n            /// with the [data-val=true] attribute value and enables validation according to the data-val-*\n            /// attribute values.\n            /// </summary>\n            /// <param name=\"selector\" type=\"String\">Any valid jQuery selector.</param>\n\n            // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one\n            // element with data-val=true\n            var $selector = $(selector),\n                $forms = $selector.parents()\n                    .addBack()\n                    .filter(\"form\")\n                    .add($selector.find(\"form\"))\n                    .has(\"[data-val=true]\");\n\n            $selector.find(\"[data-val=true]\").each(function () {\n                $jQval.unobtrusive.parseElement(this, true);\n            });\n\n            $forms.each(function () {\n                var info = validationInfo(this);\n                if (info) {\n                    info.attachValidation();\n                }\n            });\n        }\n    };\n\n    adapters = $jQval.unobtrusive.adapters;\n\n    adapters.add = function (adapterName, params, fn) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\n        /// <param name=\"params\" type=\"Array\" optional=\"true\">[Optional] An array of parameter names (strings) that will\n        /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and\n        /// mmmm is the parameter name).</param>\n        /// <param name=\"fn\" type=\"Function\">The function to call, which adapts the values from the HTML\n        /// attributes into jQuery Validate rules and/or messages.</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        if (!fn) {  // Called with no params, just a function\n            fn = params;\n            params = [];\n        }\n        this.push({ name: adapterName, params: params, adapt: fn });\n        return this;\n    };\n\n    adapters.addBool = function (adapterName, ruleName) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\n        /// the jQuery Validate validation rule has no parameter values.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\n        /// <param name=\"ruleName\" type=\"String\" optional=\"true\">[Optional] The name of the jQuery Validate rule. If not provided, the value\n        /// of adapterName will be used instead.</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        return this.add(adapterName, function (options) {\n            setValidationValues(options, ruleName || adapterName, true);\n        });\n    };\n\n    adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\n        /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and\n        /// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\n        /// <param name=\"minRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you only\n        /// have a minimum value.</param>\n        /// <param name=\"maxRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you only\n        /// have a maximum value.</param>\n        /// <param name=\"minMaxRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you\n        /// have both a minimum and maximum value.</param>\n        /// <param name=\"minAttribute\" type=\"String\" optional=\"true\">[Optional] The name of the HTML attribute that\n        /// contains the minimum value. The default is \"min\".</param>\n        /// <param name=\"maxAttribute\" type=\"String\" optional=\"true\">[Optional] The name of the HTML attribute that\n        /// contains the maximum value. The default is \"max\".</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        return this.add(adapterName, [minAttribute || \"min\", maxAttribute || \"max\"], function (options) {\n            var min = options.params.min,\n                max = options.params.max;\n\n            if (min && max) {\n                setValidationValues(options, minMaxRuleName, [min, max]);\n            }\n            else if (min) {\n                setValidationValues(options, minRuleName, min);\n            }\n            else if (max) {\n                setValidationValues(options, maxRuleName, max);\n            }\n        });\n    };\n\n    adapters.addSingleVal = function (adapterName, attribute, ruleName) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\n        /// the jQuery Validate validation rule has a single value.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>\n        /// <param name=\"attribute\" type=\"String\">[Optional] The name of the HTML attribute that contains the value.\n        /// The default is \"val\".</param>\n        /// <param name=\"ruleName\" type=\"String\" optional=\"true\">[Optional] The name of the jQuery Validate rule. If not provided, the value\n        /// of adapterName will be used instead.</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        return this.add(adapterName, [attribute || \"val\"], function (options) {\n            setValidationValues(options, ruleName || adapterName, options.params[attribute]);\n        });\n    };\n\n    $jQval.addMethod(\"__dummy__\", function (value, element, params) {\n        return true;\n    });\n\n    $jQval.addMethod(\"regex\", function (value, element, params) {\n        var match;\n        if (this.optional(element)) {\n            return true;\n        }\n\n        match = new RegExp(params).exec(value);\n        return (match && (match.index === 0) && (match[0].length === value.length));\n    });\n\n    $jQval.addMethod(\"nonalphamin\", function (value, element, nonalphamin) {\n        var match;\n        if (nonalphamin) {\n            match = value.match(/\\W/g);\n            match = match && match.length >= nonalphamin;\n        }\n        return match;\n    });\n\n    if ($jQval.methods.extension) {\n        adapters.addSingleVal(\"accept\", \"mimtype\");\n        adapters.addSingleVal(\"extension\", \"extension\");\n    } else {\n        // for backward compatibility, when the 'extension' validation method does not exist, such as with versions\n        // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for\n        // validating the extension, and ignore mime-type validations as they are not supported.\n        adapters.addSingleVal(\"extension\", \"extension\", \"accept\");\n    }\n\n    adapters.addSingleVal(\"regex\", \"pattern\");\n    adapters.addBool(\"creditcard\").addBool(\"date\").addBool(\"digits\").addBool(\"email\").addBool(\"number\").addBool(\"url\");\n    adapters.addMinMax(\"length\", \"minlength\", \"maxlength\", \"rangelength\").addMinMax(\"range\", \"min\", \"max\", \"range\");\n    adapters.addMinMax(\"minlength\", \"minlength\").addMinMax(\"maxlength\", \"minlength\", \"maxlength\");\n    adapters.add(\"equalto\", [\"other\"], function (options) {\n        var prefix = getModelPrefix(options.element.name),\n            other = options.params.other,\n            fullOtherName = appendModelPrefix(other, prefix),\n            element = $(options.form).find(\":input\").filter(\"[name='\" + escapeAttributeValue(fullOtherName) + \"']\")[0];\n\n        setValidationValues(options, \"equalTo\", element);\n    });\n    adapters.add(\"required\", function (options) {\n        // jQuery Validate equates \"required\" with \"mandatory\" for checkbox elements\n        if (options.element.tagName.toUpperCase() !== \"INPUT\" || options.element.type.toUpperCase() !== \"CHECKBOX\") {\n            setValidationValues(options, \"required\", true);\n        }\n    });\n    adapters.add(\"remote\", [\"url\", \"type\", \"additionalfields\"], function (options) {\n        var value = {\n            url: options.params.url,\n            type: options.params.type || \"GET\",\n            data: {}\n        },\n            prefix = getModelPrefix(options.element.name);\n\n        $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {\n            var paramName = appendModelPrefix(fieldName, prefix);\n            value.data[paramName] = function () {\n                var field = $(options.form).find(\":input\").filter(\"[name='\" + escapeAttributeValue(paramName) + \"']\");\n                // For checkboxes and radio buttons, only pick up values from checked fields.\n                if (field.is(\":checkbox\")) {\n                    return field.filter(\":checked\").val() || field.filter(\":hidden\").val() || '';\n                }\n                else if (field.is(\":radio\")) {\n                    return field.filter(\":checked\").val() || '';\n                }\n                return field.val();\n            };\n        });\n\n        setValidationValues(options, \"remote\", value);\n    });\n    adapters.add(\"password\", [\"min\", \"nonalphamin\", \"regex\"], function (options) {\n        if (options.params.min) {\n            setValidationValues(options, \"minlength\", options.params.min);\n        }\n        if (options.params.nonalphamin) {\n            setValidationValues(options, \"nonalphamin\", options.params.nonalphamin);\n        }\n        if (options.params.regex) {\n            setValidationValues(options, \"regex\", options.params.regex);\n        }\n    });\n    adapters.add(\"fileextensions\", [\"extensions\"], function (options) {\n        setValidationValues(options, \"extension\", options.params.extensions);\n    });\n\n    $(function () {\n        $jQval.unobtrusive.parse(document);\n    });\n\n    return $jQval.unobtrusive;\n}));\n"
  },
  {
    "path": "Demo/2021/ModuleInitializerNet48/ConsoleApp1/ConsoleApp1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net48</TargetFramework>\n    <LangVersion>9.0</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/ModuleInitializerNet48/ConsoleApp1/Program.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nConsole.WriteLine(\"Main\");\n\nclass C\n{\n    [ModuleInitializer]\n    public static void M() => Console.WriteLine(\"ModuleInitializer\");\n}\n\nnamespace System.Runtime.CompilerServices\n{\n    class ModuleInitializerAttribute : Attribute { }\n}\n"
  },
  {
    "path": "Demo/2021/ModuleInitializerNet48/ModuleInitializerNet48.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30914.41\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{4626A189-089E-4565-ABF2-B8C9FAF716D9}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{4626A189-089E-4565-ABF2-B8C9FAF716D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4626A189-089E-4565-ABF2-B8C9FAF716D9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4626A189-089E-4565-ABF2-B8C9FAF716D9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4626A189-089E-4565-ABF2-B8C9FAF716D9}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {3C44AC39-7D2C-4B4D-9BCF-308603A0F530}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/ConsoleApp1/ConsoleApp1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/ConsoleApp1/Program.cs",
    "content": "// See https://aka.ms/new-console-template for more information\n\nConsole.WriteLine(\"Hello, World!\");\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/NewTemplatesInNet6.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.31521.260\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{B2A2CF2B-4F02-4ACD-94D5-354459DD0BE0}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WebApplication1\", \"WebApplication1\\WebApplication1.csproj\", \"{C6A2E16B-2E6E-44BA-BC16-DB463FBAB8E7}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WebApplication2\", \"WebApplication2\\WebApplication2.csproj\", \"{963DB234-D014-4D94-B02E-580483F6D97D}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{B2A2CF2B-4F02-4ACD-94D5-354459DD0BE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B2A2CF2B-4F02-4ACD-94D5-354459DD0BE0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B2A2CF2B-4F02-4ACD-94D5-354459DD0BE0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B2A2CF2B-4F02-4ACD-94D5-354459DD0BE0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C6A2E16B-2E6E-44BA-BC16-DB463FBAB8E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C6A2E16B-2E6E-44BA-BC16-DB463FBAB8E7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C6A2E16B-2E6E-44BA-BC16-DB463FBAB8E7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C6A2E16B-2E6E-44BA-BC16-DB463FBAB8E7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{963DB234-D014-4D94-B02E-580483F6D97D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{963DB234-D014-4D94-B02E-580483F6D97D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{963DB234-D014-4D94-B02E-580483F6D97D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{963DB234-D014-4D94-B02E-580483F6D97D}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {33230F1A-26B9-4B0B-B61E-C9D56F2465B5}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/Pages/Error.cshtml",
    "content": "﻿@page\n@model ErrorModel\n@{\n    ViewData[\"Title\"] = \"Error\";\n}\n\n<h1 class=\"text-danger\">Error.</h1>\n<h2 class=\"text-danger\">An error occurred while processing your request.</h2>\n\n@if (Model.ShowRequestId)\n{\n    <p>\n        <strong>Request ID:</strong> <code>@Model.RequestId</code>\n    </p>\n}\n\n<h3>Development Mode</h3>\n<p>\n    Swapping to the <strong>Development</strong> environment displays detailed information about the error that occurred.\n</p>\n<p>\n    <strong>The Development environment shouldn't be enabled for deployed applications.</strong>\n    It can result in displaying sensitive information from exceptions to end users.\n    For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>\n    and restarting the app.\n</p>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/Pages/Error.cshtml.cs",
    "content": "using Microsoft.AspNetCore.Mvc;\nusing Microsoft.AspNetCore.Mvc.RazorPages;\nusing System.Diagnostics;\n\nnamespace WebApplication1.Pages;\n[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]\n[IgnoreAntiforgeryToken]\npublic class ErrorModel : PageModel\n{\n    public string? RequestId { get; set; }\n\n    public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);\n\n    private readonly ILogger<ErrorModel> _logger;\n\n    public ErrorModel(ILogger<ErrorModel> logger)\n    {\n        _logger = logger;\n    }\n\n    public void OnGet()\n    {\n        RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;\n    }\n}\n\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/Pages/Index.cshtml",
    "content": "﻿@page\n@model IndexModel\n@{\n    ViewData[\"Title\"] = \"Home page\";\n}\n\n<div class=\"text-center\">\n    <h1 class=\"display-4\">Welcome</h1>\n    <p>Learn about <a href=\"https://docs.microsoft.com/aspnet/core\">building Web apps with ASP.NET Core</a>.</p>\n</div>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/Pages/Index.cshtml.cs",
    "content": "using Microsoft.AspNetCore.Mvc;\nusing Microsoft.AspNetCore.Mvc.RazorPages;\n\nnamespace WebApplication1.Pages;\npublic class IndexModel : PageModel\n{\n    private readonly ILogger<IndexModel> _logger;\n\n    public IndexModel(ILogger<IndexModel> logger)\n    {\n        _logger = logger;\n    }\n\n    public void OnGet()\n    {\n\n    }\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/Pages/Privacy.cshtml",
    "content": "﻿@page\n@model PrivacyModel\n@{\n    ViewData[\"Title\"] = \"Privacy Policy\";\n}\n<h1>@ViewData[\"Title\"]</h1>\n\n<p>Use this page to detail your site's privacy policy.</p>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/Pages/Privacy.cshtml.cs",
    "content": "﻿using Microsoft.AspNetCore.Mvc;\nusing Microsoft.AspNetCore.Mvc.RazorPages;\n\nnamespace WebApplication1.Pages;\npublic class PrivacyModel : PageModel\n{\n    private readonly ILogger<PrivacyModel> _logger;\n\n    public PrivacyModel(ILogger<PrivacyModel> logger)\n    {\n        _logger = logger;\n    }\n\n    public void OnGet()\n    {\n    }\n}\n\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/Pages/Shared/_Layout.cshtml",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>@ViewData[\"Title\"] - WebApplication1</title>\n    <link rel=\"stylesheet\" href=\"~/lib/bootstrap/dist/css/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"~/css/site.css\" asp-append-version=\"true\" />\n</head>\n<body>\n    <header>\n        <nav class=\"navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3\">\n            <div class=\"container\">\n                <a class=\"navbar-brand\" asp-area=\"\" asp-page=\"/Index\">WebApplication1</a>\n                <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-controls=\"navbarSupportedContent\"\n                        aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                    <span class=\"navbar-toggler-icon\"></span>\n                </button>\n                <div class=\"navbar-collapse collapse d-sm-inline-flex justify-content-between\">\n                    <ul class=\"navbar-nav flex-grow-1\">\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link text-dark\" asp-area=\"\" asp-page=\"/Index\">Home</a>\n                        </li>\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link text-dark\" asp-area=\"\" asp-page=\"/Privacy\">Privacy</a>\n                        </li>\n                    </ul>\n                </div>\n            </div>\n        </nav>\n    </header>\n    <div class=\"container\">\n        <main role=\"main\" class=\"pb-3\">\n            @RenderBody()\n        </main>\n    </div>\n\n    <footer class=\"border-top footer text-muted\">\n        <div class=\"container\">\n            &copy; 2021 - WebApplication1 - <a asp-area=\"\" asp-page=\"/Privacy\">Privacy</a>\n        </div>\n    </footer>\n\n    <script src=\"~/lib/jquery/dist/jquery.min.js\"></script>\n    <script src=\"~/lib/bootstrap/dist/js/bootstrap.bundle.min.js\"></script>\n    <script src=\"~/js/site.js\" asp-append-version=\"true\"></script>\n\n    @await RenderSectionAsync(\"Scripts\", required: false)\n</body>\n</html>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/Pages/Shared/_ValidationScriptsPartial.cshtml",
    "content": "﻿<script src=\"~/lib/jquery-validation/dist/jquery.validate.min.js\"></script>\n<script src=\"~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js\"></script>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/Pages/_ViewImports.cshtml",
    "content": "@using WebApplication1\n@namespace WebApplication1.Pages\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/Pages/_ViewStart.cshtml",
    "content": "﻿@{\n    Layout = \"_Layout\";\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/Program.cs",
    "content": "\nvar builder = WebApplication.CreateBuilder(args);\n\n// Add services to the container.\nbuilder.Services.AddRazorPages();\n\nvar app = builder.Build();\n\n// Configure the HTTP request pipeline.\nif (app.Environment.IsDevelopment())\n{\n    app.UseDeveloperExceptionPage();\n}\nelse\n{\n    app.UseExceptionHandler(\"/Error\");\n    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.\n    app.UseHsts();\n}\n\napp.UseHttpsRedirection();\napp.UseStaticFiles();\n\napp.UseRouting();\n\napp.UseAuthorization();\n\napp.MapRazorPages();\n\napp.Run();\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/Properties/launchSettings.json",
    "content": "﻿{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:22355\",\n      \"sslPort\": 44332\n    }\n  },\n  \"profiles\": {\n    \"WebApplication1\": {\n      \"commandName\": \"Project\",\n      \"dotnetRunMessages\": true,\n      \"launchBrowser\": true,\n      \"applicationUrl\": \"https://localhost:5001;http://localhost:5000\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/WebApplication1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/appsettings.Development.json",
    "content": "{\n  \"DetailedErrors\": true,\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Warning\",\n      \"Microsoft.Hosting.Lifetime\": \"Information\"\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Warning\",\n      \"Microsoft.Hosting.Lifetime\": \"Information\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/css/site.css",
    "content": "﻿/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\nfor details on configuring this project to bundle and minify static web assets. */\n\na.navbar-brand {\n  white-space: normal;\n  text-align: center;\n  word-break: break-all;\n}\n\na {\n  color: #0077cc;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #1b6ec2;\n  border-color: #1861ac;\n}\n\n.nav-pills .nav-link.active, .nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #1b6ec2;\n  border-color: #1861ac;\n}\n\nhtml {\n  font-size: 14px;\n}\n@media (min-width: 768px) {\n  html {\n    font-size: 16px;\n  }\n}\n\n.border-top {\n  border-top: 1px solid #e5e5e5;\n}\n.border-bottom {\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.box-shadow {\n  box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);\n}\n\nbutton.accept-policy {\n  font-size: 1rem;\n  line-height: inherit;\n}\n\nhtml {\n  position: relative;\n  min-height: 100%;\n}\n\nbody {\n  margin-bottom: 60px;\n}\n.footer {\n  position: absolute;\n  bottom: 0;\n  width: 100%;\n  white-space: nowrap;\n  line-height: 60px;\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/js/site.js",
    "content": "﻿// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\n// for details on configuring this project to bundle and minify static web assets.\n\n// Write your JavaScript code.\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/bootstrap/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2011-2018 Twitter, Inc.\nCopyright (c) 2011-2018 The Bootstrap Authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css",
    "content": "/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nhtml {\n  box-sizing: border-box;\n  -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: inherit;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  -ms-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: auto;\n  max-width: 100%;\n}\n\n.col-1 {\n  -ms-flex: 0 0 8.333333%;\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  -ms-flex: 0 0 16.666667%;\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  -ms-flex: 0 0 25%;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -ms-flex: 0 0 33.333333%;\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  -ms-flex: 0 0 41.666667%;\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  -ms-flex: 0 0 50%;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -ms-flex: 0 0 58.333333%;\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  -ms-flex: 0 0 66.666667%;\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  -ms-flex: 0 0 75%;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -ms-flex: 0 0 83.333333%;\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  -ms-flex: 0 0 91.666667%;\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  -ms-flex: 0 0 100%;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -ms-flex-order: -1;\n  order: -1;\n}\n\n.order-last {\n  -ms-flex-order: 13;\n  order: 13;\n}\n\n.order-0 {\n  -ms-flex-order: 0;\n  order: 0;\n}\n\n.order-1 {\n  -ms-flex-order: 1;\n  order: 1;\n}\n\n.order-2 {\n  -ms-flex-order: 2;\n  order: 2;\n}\n\n.order-3 {\n  -ms-flex-order: 3;\n  order: 3;\n}\n\n.order-4 {\n  -ms-flex-order: 4;\n  order: 4;\n}\n\n.order-5 {\n  -ms-flex-order: 5;\n  order: 5;\n}\n\n.order-6 {\n  -ms-flex-order: 6;\n  order: 6;\n}\n\n.order-7 {\n  -ms-flex-order: 7;\n  order: 7;\n}\n\n.order-8 {\n  -ms-flex-order: 8;\n  order: 8;\n}\n\n.order-9 {\n  -ms-flex-order: 9;\n  order: 9;\n}\n\n.order-10 {\n  -ms-flex-order: 10;\n  order: 10;\n}\n\n.order-11 {\n  -ms-flex-order: 11;\n  order: 11;\n}\n\n.order-12 {\n  -ms-flex-order: 12;\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-sm-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-sm-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-sm-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-sm-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-sm-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-sm-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-sm-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-sm-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-sm-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-sm-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-sm-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-sm-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-sm-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-sm-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-sm-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-md-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-md-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-md-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-md-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-md-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-md-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-md-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-md-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-md-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-md-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-md-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-md-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-md-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-md-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-md-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-lg-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-lg-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-lg-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-lg-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-lg-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-lg-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-lg-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-lg-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-lg-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-lg-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-lg-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-lg-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-lg-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-lg-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-lg-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-xl-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-xl-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-xl-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-xl-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-xl-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-xl-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-xl-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-xl-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-xl-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-xl-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-xl-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-xl-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-xl-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-xl-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-xl-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: -ms-flexbox !important;\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: -ms-inline-flexbox !important;\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n.flex-row {\n  -ms-flex-direction: row !important;\n  flex-direction: row !important;\n}\n\n.flex-column {\n  -ms-flex-direction: column !important;\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -ms-flex-direction: row-reverse !important;\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -ms-flex-direction: column-reverse !important;\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n  flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n  -ms-flex: 1 1 auto !important;\n  flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n  -ms-flex-positive: 0 !important;\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  -ms-flex-positive: 1 !important;\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  -ms-flex-negative: 0 !important;\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  -ms-flex-negative: 1 !important;\n  flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n  -ms-flex-pack: start !important;\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -ms-flex-pack: end !important;\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -ms-flex-pack: center !important;\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  -ms-flex-pack: justify !important;\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  -ms-flex-align: start !important;\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  -ms-flex-align: end !important;\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  -ms-flex-align: center !important;\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  -ms-flex-align: baseline !important;\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -ms-flex-align: stretch !important;\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n  align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n  align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n\n.m-n1 {\n  margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n  margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n  margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n  margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n  margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n  margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n  margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n  margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n  margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n  margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n  margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n  margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n  margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n  margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n  margin-left: -1rem !important;\n}\n\n.m-n4 {\n  margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n  margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n  margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n  margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n  margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n  margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n  margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n  margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n  margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n  margin-left: -3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-sm-n1,\n  .my-sm-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-sm-n1,\n  .mx-sm-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-sm-n1,\n  .my-sm-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-sm-n1,\n  .mx-sm-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-sm-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-sm-n2,\n  .my-sm-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-sm-n2,\n  .mx-sm-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-sm-n2,\n  .my-sm-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-sm-n2,\n  .mx-sm-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-sm-n3 {\n    margin: -1rem !important;\n  }\n  .mt-sm-n3,\n  .my-sm-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-sm-n3,\n  .mx-sm-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-sm-n3,\n  .my-sm-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-sm-n3,\n  .mx-sm-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-sm-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-sm-n4,\n  .my-sm-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-sm-n4,\n  .mx-sm-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-sm-n4,\n  .my-sm-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-sm-n4,\n  .mx-sm-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-sm-n5 {\n    margin: -3rem !important;\n  }\n  .mt-sm-n5,\n  .my-sm-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-sm-n5,\n  .mx-sm-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-sm-n5,\n  .my-sm-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-sm-n5,\n  .mx-sm-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-md-n1,\n  .my-md-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-md-n1,\n  .mx-md-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-md-n1,\n  .my-md-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-md-n1,\n  .mx-md-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-md-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-md-n2,\n  .my-md-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-md-n2,\n  .mx-md-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-md-n2,\n  .my-md-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-md-n2,\n  .mx-md-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-md-n3 {\n    margin: -1rem !important;\n  }\n  .mt-md-n3,\n  .my-md-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-md-n3,\n  .mx-md-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-md-n3,\n  .my-md-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-md-n3,\n  .mx-md-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-md-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-md-n4,\n  .my-md-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-md-n4,\n  .mx-md-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-md-n4,\n  .my-md-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-md-n4,\n  .mx-md-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-md-n5 {\n    margin: -3rem !important;\n  }\n  .mt-md-n5,\n  .my-md-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-md-n5,\n  .mx-md-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-md-n5,\n  .my-md-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-md-n5,\n  .mx-md-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-lg-n1,\n  .my-lg-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-lg-n1,\n  .mx-lg-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-lg-n1,\n  .my-lg-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-lg-n1,\n  .mx-lg-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-lg-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-lg-n2,\n  .my-lg-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-lg-n2,\n  .mx-lg-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-lg-n2,\n  .my-lg-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-lg-n2,\n  .mx-lg-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-lg-n3 {\n    margin: -1rem !important;\n  }\n  .mt-lg-n3,\n  .my-lg-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-lg-n3,\n  .mx-lg-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-lg-n3,\n  .my-lg-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-lg-n3,\n  .mx-lg-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-lg-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-lg-n4,\n  .my-lg-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-lg-n4,\n  .mx-lg-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-lg-n4,\n  .my-lg-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-lg-n4,\n  .mx-lg-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-lg-n5 {\n    margin: -3rem !important;\n  }\n  .mt-lg-n5,\n  .my-lg-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-lg-n5,\n  .mx-lg-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-lg-n5,\n  .my-lg-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-lg-n5,\n  .mx-lg-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-xl-n1,\n  .my-xl-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-xl-n1,\n  .mx-xl-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-xl-n1,\n  .my-xl-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-xl-n1,\n  .mx-xl-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-xl-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-xl-n2,\n  .my-xl-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-xl-n2,\n  .mx-xl-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-xl-n2,\n  .my-xl-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-xl-n2,\n  .mx-xl-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-xl-n3 {\n    margin: -1rem !important;\n  }\n  .mt-xl-n3,\n  .my-xl-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-xl-n3,\n  .mx-xl-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-xl-n3,\n  .my-xl-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-xl-n3,\n  .mx-xl-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-xl-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-xl-n4,\n  .my-xl-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-xl-n4,\n  .mx-xl-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-xl-n4,\n  .my-xl-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-xl-n4,\n  .mx-xl-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-xl-n5 {\n    margin: -3rem !important;\n  }\n  .mt-xl-n5,\n  .my-xl-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-xl-n5,\n  .mx-xl-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-xl-n5,\n  .my-xl-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-xl-n5,\n  .mx-xl-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n/*# sourceMappingURL=bootstrap-grid.css.map */"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css",
    "content": "/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg {\n  overflow: hidden;\n  vertical-align: middle;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #6c757d;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nselect {\n  word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n  cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/bootstrap/dist/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n  --blue: #007bff;\n  --indigo: #6610f2;\n  --purple: #6f42c1;\n  --pink: #e83e8c;\n  --red: #dc3545;\n  --orange: #fd7e14;\n  --yellow: #ffc107;\n  --green: #28a745;\n  --teal: #20c997;\n  --cyan: #17a2b8;\n  --white: #fff;\n  --gray: #6c757d;\n  --gray-dark: #343a40;\n  --primary: #007bff;\n  --secondary: #6c757d;\n  --success: #28a745;\n  --info: #17a2b8;\n  --warning: #ffc107;\n  --danger: #dc3545;\n  --light: #f8f9fa;\n  --dark: #343a40;\n  --breakpoint-xs: 0;\n  --breakpoint-sm: 576px;\n  --breakpoint-md: 768px;\n  --breakpoint-lg: 992px;\n  --breakpoint-xl: 1200px;\n  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg {\n  overflow: hidden;\n  vertical-align: middle;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #6c757d;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nselect {\n  word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n  cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  margin-bottom: 0.5rem;\n  font-weight: 500;\n  line-height: 1.2;\n}\n\nh1, .h1 {\n  font-size: 2.5rem;\n}\n\nh2, .h2 {\n  font-size: 2rem;\n}\n\nh3, .h3 {\n  font-size: 1.75rem;\n}\n\nh4, .h4 {\n  font-size: 1.5rem;\n}\n\nh5, .h5 {\n  font-size: 1.25rem;\n}\n\nh6, .h6 {\n  font-size: 1rem;\n}\n\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n\n.display-1 {\n  font-size: 6rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-2 {\n  font-size: 5.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-3 {\n  font-size: 4.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-4 {\n  font-size: 3.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\nhr {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  border: 0;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n  font-size: 80%;\n  font-weight: 400;\n}\n\nmark,\n.mark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline-item {\n  display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.25rem;\n}\n\n.blockquote-footer {\n  display: block;\n  font-size: 80%;\n  color: #6c757d;\n}\n\n.blockquote-footer::before {\n  content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n  border-radius: 0.25rem;\n  max-width: 100%;\n  height: auto;\n}\n\n.figure {\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n\n.figure-caption {\n  font-size: 90%;\n  color: #6c757d;\n}\n\ncode {\n  font-size: 87.5%;\n  color: #e83e8c;\n  word-break: break-word;\n}\n\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 87.5%;\n  color: #fff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n}\n\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: 700;\n}\n\npre {\n  display: block;\n  font-size: 87.5%;\n  color: #212529;\n}\n\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  -ms-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: auto;\n  max-width: 100%;\n}\n\n.col-1 {\n  -ms-flex: 0 0 8.333333%;\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  -ms-flex: 0 0 16.666667%;\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  -ms-flex: 0 0 25%;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -ms-flex: 0 0 33.333333%;\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  -ms-flex: 0 0 41.666667%;\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  -ms-flex: 0 0 50%;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -ms-flex: 0 0 58.333333%;\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  -ms-flex: 0 0 66.666667%;\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  -ms-flex: 0 0 75%;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -ms-flex: 0 0 83.333333%;\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  -ms-flex: 0 0 91.666667%;\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  -ms-flex: 0 0 100%;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -ms-flex-order: -1;\n  order: -1;\n}\n\n.order-last {\n  -ms-flex-order: 13;\n  order: 13;\n}\n\n.order-0 {\n  -ms-flex-order: 0;\n  order: 0;\n}\n\n.order-1 {\n  -ms-flex-order: 1;\n  order: 1;\n}\n\n.order-2 {\n  -ms-flex-order: 2;\n  order: 2;\n}\n\n.order-3 {\n  -ms-flex-order: 3;\n  order: 3;\n}\n\n.order-4 {\n  -ms-flex-order: 4;\n  order: 4;\n}\n\n.order-5 {\n  -ms-flex-order: 5;\n  order: 5;\n}\n\n.order-6 {\n  -ms-flex-order: 6;\n  order: 6;\n}\n\n.order-7 {\n  -ms-flex-order: 7;\n  order: 7;\n}\n\n.order-8 {\n  -ms-flex-order: 8;\n  order: 8;\n}\n\n.order-9 {\n  -ms-flex-order: 9;\n  order: 9;\n}\n\n.order-10 {\n  -ms-flex-order: 10;\n  order: 10;\n}\n\n.order-11 {\n  -ms-flex-order: 11;\n  order: 11;\n}\n\n.order-12 {\n  -ms-flex-order: 12;\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-sm-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-sm-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-sm-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-sm-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-sm-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-sm-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-sm-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-sm-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-sm-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-sm-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-sm-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-sm-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-sm-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-sm-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-sm-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-md-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-md-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-md-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-md-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-md-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-md-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-md-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-md-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-md-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-md-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-md-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-md-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-md-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-md-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-md-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-lg-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-lg-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-lg-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-lg-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-lg-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-lg-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-lg-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-lg-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-lg-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-lg-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-lg-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-lg-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-lg-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-lg-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-lg-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-xl-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-xl-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-xl-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-xl-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-xl-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-xl-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-xl-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-xl-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-xl-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-xl-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-xl-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-xl-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-xl-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-xl-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-xl-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 1rem;\n  color: #212529;\n}\n\n.table th,\n.table td {\n  padding: 0.75rem;\n  vertical-align: top;\n  border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n  padding: 0.3rem;\n}\n\n.table-bordered {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n  border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n  border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n  color: #212529;\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n  background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n  border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n  background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n  background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n  background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n  border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n  background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n  background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n  background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n  border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n  background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n  background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n  background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n  border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n  background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n  background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n  background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n  border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n  background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n  background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n  background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n  border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n  background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n  background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n  background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n  border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n  background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n  background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n  background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n  border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n  background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n  background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #454d55;\n}\n\n.table .thead-light th {\n  color: #495057;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.table-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n  border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n  border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n  color: #fff;\n  background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n  .table-responsive-sm {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-sm > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .table-responsive-md {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-md > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .table-responsive-lg {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-lg > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .table-responsive-xl {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-xl > .table-bordered {\n    border: 0;\n  }\n}\n\n.table-responsive {\n  display: block;\n  width: 100%;\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n  border: 0;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .form-control {\n    transition: none;\n  }\n}\n\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n\n.form-control:focus {\n  color: #495057;\n  background-color: #fff;\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n  background-color: #e9ecef;\n  opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n  display: block;\n  width: 100%;\n}\n\n.col-form-label {\n  padding-top: calc(0.375rem + 1px);\n  padding-bottom: calc(0.375rem + 1px);\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n\n.col-form-label-lg {\n  padding-top: calc(0.5rem + 1px);\n  padding-bottom: calc(0.5rem + 1px);\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.col-form-label-sm {\n  padding-top: calc(0.25rem + 1px);\n  padding-bottom: calc(0.25rem + 1px);\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  margin-bottom: 0;\n  line-height: 1.5;\n  color: #212529;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.form-control-sm {\n  height: calc(1.5em + 0.5rem + 2px);\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.form-control-lg {\n  height: calc(1.5em + 1rem + 2px);\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n  height: auto;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 1rem;\n}\n\n.form-text {\n  display: block;\n  margin-top: 0.25rem;\n}\n\n.form-row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -5px;\n  margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.form-check {\n  position: relative;\n  display: block;\n  padding-left: 1.25rem;\n}\n\n.form-check-input {\n  position: absolute;\n  margin-top: 0.3rem;\n  margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n  color: #6c757d;\n}\n\n.form-check-label {\n  margin-bottom: 0;\n}\n\n.form-check-inline {\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding-left: 0;\n  margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n  position: static;\n  margin-top: 0;\n  margin-right: 0.3125rem;\n  margin-left: 0;\n}\n\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #28a745;\n}\n\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: .1rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  color: #fff;\n  background-color: rgba(40, 167, 69, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n  border-color: #28a745;\n  padding-right: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: center right calc(0.375em + 0.1875rem);\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n  padding-right: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n  border-color: #28a745;\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n  color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n  color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n  border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n  border-color: #34ce57;\n  background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n  border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #dc3545;\n}\n\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: .1rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  color: #fff;\n  background-color: rgba(220, 53, 69, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n  border-color: #dc3545;\n  padding-right: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: center right calc(0.375em + 0.1875rem);\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n  padding-right: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n  border-color: #dc3545;\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n  color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n  color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n  border-color: #e4606d;\n  background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-flow: row wrap;\n  flex-flow: row wrap;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.form-inline .form-check {\n  width: 100%;\n}\n\n@media (min-width: 576px) {\n  .form-inline label {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-group {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n    -ms-flex-align: center;\n    align-items: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-plaintext {\n    display: inline-block;\n  }\n  .form-inline .input-group,\n  .form-inline .custom-select {\n    width: auto;\n  }\n  .form-inline .form-check {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    width: auto;\n    padding-left: 0;\n  }\n  .form-inline .form-check-input {\n    position: relative;\n    -ms-flex-negative: 0;\n    flex-shrink: 0;\n    margin-top: 0;\n    margin-right: 0.25rem;\n    margin-left: 0;\n  }\n  .form-inline .custom-control {\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n  }\n  .form-inline .custom-control-label {\n    margin-bottom: 0;\n  }\n}\n\n.btn {\n  display: inline-block;\n  font-weight: 400;\n  color: #212529;\n  text-align: center;\n  vertical-align: middle;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  background-color: transparent;\n  border: 1px solid transparent;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .btn {\n    transition: none;\n  }\n}\n\n.btn:hover {\n  color: #212529;\n  text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n  opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n  pointer-events: none;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:hover {\n  color: #fff;\n  background-color: #0069d9;\n  border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #0062cc;\n  border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n  color: #fff;\n  background-color: #5a6268;\n  border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #545b62;\n  border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:hover {\n  color: #fff;\n  background-color: #218838;\n  border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n  color: #fff;\n  background-color: #1e7e34;\n  border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:hover {\n  color: #fff;\n  background-color: #138496;\n  border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n  color: #fff;\n  background-color: #117a8b;\n  border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:hover {\n  color: #212529;\n  background-color: #e0a800;\n  border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #d39e00;\n  border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c82333;\n  border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #bd2130;\n  border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n  color: #212529;\n  background-color: #e2e6ea;\n  border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n  color: #212529;\n  background-color: #dae0e5;\n  border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:hover {\n  color: #fff;\n  background-color: #23272b;\n  border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #1d2124;\n  border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n  color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n  color: #007bff;\n  background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n  color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n  color: #6c757d;\n  background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n  color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n  color: #28a745;\n  background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n  color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n  color: #17a2b8;\n  background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n  color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n  color: #ffc107;\n  background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n  color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n  color: #dc3545;\n  background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n  color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n  color: #f8f9fa;\n  background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n  color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n  color: #343a40;\n  background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n  font-weight: 400;\n  color: #007bff;\n  text-decoration: none;\n}\n\n.btn-link:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n  text-decoration: underline;\n  box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n.btn-block + .btn-block {\n  margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .fade {\n    transition: none;\n  }\n}\n\n.fade:not(.show) {\n  opacity: 0;\n}\n\n.collapse:not(.show) {\n  display: none;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .collapsing {\n    transition: none;\n  }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n  position: relative;\n}\n\n.dropdown-toggle {\n  white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0;\n  border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 10rem;\n  padding: 0.5rem 0;\n  margin: 0.125rem 0 0;\n  font-size: 1rem;\n  color: #212529;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n\n@media (min-width: 576px) {\n  .dropdown-menu-sm-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-sm-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 768px) {\n  .dropdown-menu-md-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-md-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 992px) {\n  .dropdown-menu-lg-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-lg-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 1200px) {\n  .dropdown-menu-xl-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-xl-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n.dropup .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-top: 0;\n  margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n  top: 0;\n  right: auto;\n  left: 100%;\n  margin-top: 0;\n  margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0;\n  border-bottom: 0.3em solid transparent;\n  border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n  vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n  top: 0;\n  right: 100%;\n  left: auto;\n  margin-top: 0;\n  margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n  display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n  vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n  right: auto;\n  bottom: auto;\n}\n\n.dropdown-divider {\n  height: 0;\n  margin: 0.5rem 0;\n  overflow: hidden;\n  border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: 0.25rem 1.5rem;\n  clear: both;\n  font-weight: 400;\n  color: #212529;\n  text-align: inherit;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n  color: #16181b;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n  color: #fff;\n  text-decoration: none;\n  background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n  color: #6c757d;\n  pointer-events: none;\n  background-color: transparent;\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 0.5rem 1.5rem;\n  margin-bottom: 0;\n  font-size: 0.875rem;\n  color: #6c757d;\n  white-space: nowrap;\n}\n\n.dropdown-item-text {\n  display: block;\n  padding: 0.25rem 1.5rem;\n  color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n  z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\n\n.btn-toolbar {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n  width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n  margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n  padding-right: 0.5625rem;\n  padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n  margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-right: 0.375rem;\n  padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-right: 0.75rem;\n  padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-align: start;\n  align-items: flex-start;\n  -ms-flex-pack: center;\n  justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n  margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n  margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n\n.input-group {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: stretch;\n  align-items: stretch;\n  width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  width: 1%;\n  margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n  margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n  z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n  z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n  display: -ms-flexbox;\n  display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n  position: relative;\n  z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n  z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n  margin-left: -1px;\n}\n\n.input-group-prepend {\n  margin-right: -1px;\n}\n\n.input-group-append {\n  margin-left: -1px;\n}\n\n.input-group-text {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding: 0.375rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #e9ecef;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n  height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n  height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n  padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.custom-control {\n  position: relative;\n  display: block;\n  min-height: 1.5rem;\n  padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  margin-right: 1rem;\n}\n\n.custom-control-input {\n  position: absolute;\n  z-index: -1;\n  opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n  color: #fff;\n  border-color: #007bff;\n  background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n  color: #fff;\n  background-color: #b3d7ff;\n  border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n  color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n  background-color: #e9ecef;\n}\n\n.custom-control-label {\n  position: relative;\n  margin-bottom: 0;\n  vertical-align: top;\n}\n\n.custom-control-label::before {\n  position: absolute;\n  top: 0.25rem;\n  left: -1.5rem;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  pointer-events: none;\n  content: \"\";\n  background-color: #fff;\n  border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n  position: absolute;\n  top: 0.25rem;\n  left: -1.5rem;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  content: \"\";\n  background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n  border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n  border-color: #007bff;\n  background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n  border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n  padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n  left: -2.25rem;\n  width: 1.75rem;\n  pointer-events: all;\n  border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n  top: calc(0.25rem + 2px);\n  left: calc(-2.25rem + 2px);\n  width: calc(1rem - 4px);\n  height: calc(1rem - 4px);\n  background-color: #adb5bd;\n  border-radius: 0.5rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-switch .custom-control-label::after {\n    transition: none;\n  }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n  background-color: #fff;\n  -webkit-transform: translateX(0.75rem);\n  transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n  display: inline-block;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  vertical-align: middle;\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n  background-color: #fff;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n.custom-select:focus {\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n  height: auto;\n  padding-right: 0.75rem;\n  background-image: none;\n}\n\n.custom-select:disabled {\n  color: #6c757d;\n  background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n  display: none;\n}\n\n.custom-select-sm {\n  height: calc(1.5em + 0.5rem + 2px);\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n  padding-left: 0.5rem;\n  font-size: 0.875rem;\n}\n\n.custom-select-lg {\n  height: calc(1.5em + 1rem + 2px);\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  padding-left: 1rem;\n  font-size: 1.25rem;\n}\n\n.custom-file {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  margin-bottom: 0;\n}\n\n.custom-file-input {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  margin: 0;\n  opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n  border-color: #80bdff;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n  background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n  content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n  content: attr(data-browse);\n}\n\n.custom-file-label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 0.75rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 3;\n  display: block;\n  height: calc(1.5em + 0.75rem);\n  padding: 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  content: \"Browse\";\n  background-color: #e9ecef;\n  border-left: inherit;\n  border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n  width: 100%;\n  height: calc(1rem + 0.4rem);\n  padding: 0;\n  background-color: transparent;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n.custom-range:focus {\n  outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n  border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -webkit-appearance: none;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-webkit-slider-thumb {\n    transition: none;\n  }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-moz-range-thumb {\n    transition: none;\n  }\n}\n\n.custom-range::-moz-range-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: 0;\n  margin-right: 0.2rem;\n  margin-left: 0.2rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-ms-thumb {\n    transition: none;\n  }\n}\n\n.custom-range::-ms-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: transparent;\n  border-color: transparent;\n  border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n  margin-right: 15px;\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n  cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n  cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-control-label::before,\n  .custom-file-label,\n  .custom-select {\n    transition: none;\n  }\n}\n\n.nav {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n  text-decoration: none;\n}\n\n.nav-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: default;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n  margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n  border: 1px solid transparent;\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n  border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n  color: #6c757d;\n  background-color: transparent;\n  border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: #495057;\n  background-color: #fff;\n  border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n  border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  text-align: center;\n}\n\n.nav-justified .nav-item {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  text-align: center;\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.navbar {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n  padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n}\n\n.navbar-brand {\n  display: inline-block;\n  padding-top: 0.3125rem;\n  padding-bottom: 0.3125rem;\n  margin-right: 1rem;\n  font-size: 1.25rem;\n  line-height: inherit;\n  white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n  text-decoration: none;\n}\n\n.navbar-nav {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.navbar-nav .nav-link {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n  position: static;\n  float: none;\n}\n\n.navbar-text {\n  display: inline-block;\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n  -ms-flex-preferred-size: 100%;\n  flex-basis: 100%;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.navbar-toggler {\n  padding: 0.25rem 0.75rem;\n  font-size: 1.25rem;\n  line-height: 1;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n  text-decoration: none;\n}\n\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  content: \"\";\n  background: no-repeat center center;\n  background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n}\n\n.navbar-expand {\n  -ms-flex-flow: row nowrap;\n  flex-flow: row nowrap;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n  -ms-flex-direction: row;\n  flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n  padding-right: 0.5rem;\n  padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  -ms-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n  display: -ms-flexbox !important;\n  display: flex !important;\n  -ms-flex-preferred-size: auto;\n  flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n\n.navbar-light .navbar-brand {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n  color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n  color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n  color: rgba(0, 0, 0, 0.5);\n  border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n  color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n  color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n  color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n  color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n  color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n  color: rgba(255, 255, 255, 0.5);\n  border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n  color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n  color: #fff;\n}\n\n.card {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  min-width: 0;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: border-box;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n  border-radius: 0.25rem;\n}\n\n.card > hr {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  padding: 1.25rem;\n}\n\n.card-title {\n  margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n  margin-top: -0.375rem;\n  margin-bottom: 0;\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link:hover {\n  text-decoration: none;\n}\n\n.card-link + .card-link {\n  margin-left: 1.25rem;\n}\n\n.card-header {\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 0;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n  border-top: 0;\n}\n\n.card-footer {\n  padding: 0.75rem 1.25rem;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n  margin-right: -0.625rem;\n  margin-bottom: -0.75rem;\n  margin-left: -0.625rem;\n  border-bottom: 0;\n}\n\n.card-header-pills {\n  margin-right: -0.625rem;\n  margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 1.25rem;\n}\n\n.card-img {\n  width: 100%;\n  border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n  width: 100%;\n  border-top-left-radius: calc(0.25rem - 1px);\n  border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n  width: 100%;\n  border-bottom-right-radius: calc(0.25rem - 1px);\n  border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.card-deck .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-deck {\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n    margin-right: -15px;\n    margin-left: -15px;\n  }\n  .card-deck .card {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex: 1 0 0%;\n    flex: 1 0 0%;\n    -ms-flex-direction: column;\n    flex-direction: column;\n    margin-right: 15px;\n    margin-bottom: 0;\n    margin-left: 15px;\n  }\n}\n\n.card-group {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.card-group > .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-group {\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n  }\n  .card-group > .card {\n    -ms-flex: 1 0 0%;\n    flex: 1 0 0%;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-left: 0;\n    border-left: 0;\n  }\n  .card-group > .card:not(:last-child) {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-top,\n  .card-group > .card:not(:last-child) .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-bottom,\n  .card-group > .card:not(:last-child) .card-footer {\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:first-child) {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-top,\n  .card-group > .card:not(:first-child) .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-bottom,\n  .card-group > .card:not(:first-child) .card-footer {\n    border-bottom-left-radius: 0;\n  }\n}\n\n.card-columns .card {\n  margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n  .card-columns {\n    -webkit-column-count: 3;\n    -moz-column-count: 3;\n    column-count: 3;\n    -webkit-column-gap: 1.25rem;\n    -moz-column-gap: 1.25rem;\n    column-gap: 1.25rem;\n    orphans: 1;\n    widows: 1;\n  }\n  .card-columns .card {\n    display: inline-block;\n    width: 100%;\n  }\n}\n\n.accordion > .card {\n  overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n  border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n  border-bottom: 0;\n  border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n  border-bottom: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n  margin-bottom: -1px;\n}\n\n.breadcrumb {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  padding: 0.75rem 1rem;\n  margin-bottom: 1rem;\n  list-style: none;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n  padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n  display: inline-block;\n  padding-right: 0.5rem;\n  color: #6c757d;\n  content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: none;\n}\n\n.breadcrumb-item.active {\n  color: #6c757d;\n}\n\n.pagination {\n  display: -ms-flexbox;\n  display: flex;\n  padding-left: 0;\n  list-style: none;\n  border-radius: 0.25rem;\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  padding: 0.5rem 0.75rem;\n  margin-left: -1px;\n  line-height: 1.25;\n  color: #007bff;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n  z-index: 2;\n  color: #0056b3;\n  text-decoration: none;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.page-link:focus {\n  z-index: 2;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n  margin-left: 0;\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n  z-index: 1;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: auto;\n  background-color: #fff;\n  border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n  padding: 0.75rem 1.5rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n  border-top-left-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n  border-top-right-radius: 0.3rem;\n  border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n  border-top-left-radius: 0.2rem;\n  border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n  border-top-right-radius: 0.2rem;\n  border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n  display: inline-block;\n  padding: 0.25em 0.4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .badge {\n    transition: none;\n  }\n}\n\na.badge:hover, a.badge:focus {\n  text-decoration: none;\n}\n\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.badge-pill {\n  padding-right: 0.6em;\n  padding-left: 0.6em;\n  border-radius: 10rem;\n}\n\n.badge-primary {\n  color: #fff;\n  background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n  color: #fff;\n  background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n  color: #fff;\n  background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n  color: #fff;\n  background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n  color: #fff;\n  background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n  color: #fff;\n  background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n  color: #fff;\n  background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n  color: #fff;\n  background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n  color: #212529;\n  background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n  color: #212529;\n  background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n  color: #fff;\n  background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n  color: #fff;\n  background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n  color: #212529;\n  background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n  color: #212529;\n  background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n  color: #fff;\n  background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n  padding: 2rem 1rem;\n  margin-bottom: 2rem;\n  background-color: #e9ecef;\n  border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n  .jumbotron {\n    padding: 4rem 2rem;\n  }\n}\n\n.jumbotron-fluid {\n  padding-right: 0;\n  padding-left: 0;\n  border-radius: 0;\n}\n\n.alert {\n  position: relative;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 1rem;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.alert-heading {\n  color: inherit;\n}\n\n.alert-link {\n  font-weight: 700;\n}\n\n.alert-dismissible {\n  padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0.75rem 1.25rem;\n  color: inherit;\n}\n\n.alert-primary {\n  color: #004085;\n  background-color: #cce5ff;\n  border-color: #b8daff;\n}\n\n.alert-primary hr {\n  border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n  color: #002752;\n}\n\n.alert-secondary {\n  color: #383d41;\n  background-color: #e2e3e5;\n  border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n  border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n  color: #202326;\n}\n\n.alert-success {\n  color: #155724;\n  background-color: #d4edda;\n  border-color: #c3e6cb;\n}\n\n.alert-success hr {\n  border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n  color: #0b2e13;\n}\n\n.alert-info {\n  color: #0c5460;\n  background-color: #d1ecf1;\n  border-color: #bee5eb;\n}\n\n.alert-info hr {\n  border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n  color: #062c33;\n}\n\n.alert-warning {\n  color: #856404;\n  background-color: #fff3cd;\n  border-color: #ffeeba;\n}\n\n.alert-warning hr {\n  border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n  color: #533f03;\n}\n\n.alert-danger {\n  color: #721c24;\n  background-color: #f8d7da;\n  border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n  border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n  color: #491217;\n}\n\n.alert-light {\n  color: #818182;\n  background-color: #fefefe;\n  border-color: #fdfdfe;\n}\n\n.alert-light hr {\n  border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n  color: #686868;\n}\n\n.alert-dark {\n  color: #1b1e21;\n  background-color: #d6d8d9;\n  border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n  border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n  color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  display: -ms-flexbox;\n  display: flex;\n  height: 1rem;\n  overflow: hidden;\n  font-size: 0.75rem;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.progress-bar {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-pack: center;\n  justify-content: center;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #007bff;\n  transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar {\n    transition: none;\n  }\n}\n\n.progress-bar-striped {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n  -webkit-animation: progress-bar-stripes 1s linear infinite;\n  animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar-animated {\n    -webkit-animation: none;\n    animation: none;\n  }\n}\n\n.media {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: start;\n  align-items: flex-start;\n}\n\n.media-body {\n  -ms-flex: 1;\n  flex: 1;\n}\n\n.list-group {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n}\n\n.list-group-item-action {\n  width: 100%;\n  color: #495057;\n  text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n  z-index: 1;\n  color: #495057;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n  color: #212529;\n  background-color: #e9ecef;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n  color: #6c757d;\n  pointer-events: none;\n  background-color: #fff;\n}\n\n.list-group-item.active {\n  z-index: 2;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.list-group-horizontal {\n  -ms-flex-direction: row;\n  flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n  margin-right: -1px;\n  margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n  border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n  margin-right: 0;\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n  .list-group-horizontal-sm {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-sm .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-sm .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-sm .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n@media (min-width: 768px) {\n  .list-group-horizontal-md {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-md .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-md .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-md .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .list-group-horizontal-lg {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-lg .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-lg .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-lg .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .list-group-horizontal-xl {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-xl .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-xl .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-xl .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n.list-group-flush .list-group-item {\n  border-right: 0;\n  border-left: 0;\n  border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n  margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n  border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom: 0;\n}\n\n.list-group-item-primary {\n  color: #004085;\n  background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n  color: #004085;\n  background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n  color: #fff;\n  background-color: #004085;\n  border-color: #004085;\n}\n\n.list-group-item-secondary {\n  color: #383d41;\n  background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n  color: #383d41;\n  background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n  color: #fff;\n  background-color: #383d41;\n  border-color: #383d41;\n}\n\n.list-group-item-success {\n  color: #155724;\n  background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n  color: #155724;\n  background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n  color: #fff;\n  background-color: #155724;\n  border-color: #155724;\n}\n\n.list-group-item-info {\n  color: #0c5460;\n  background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n  color: #0c5460;\n  background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n  color: #fff;\n  background-color: #0c5460;\n  border-color: #0c5460;\n}\n\n.list-group-item-warning {\n  color: #856404;\n  background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n  color: #856404;\n  background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n  color: #fff;\n  background-color: #856404;\n  border-color: #856404;\n}\n\n.list-group-item-danger {\n  color: #721c24;\n  background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n  color: #721c24;\n  background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n  color: #fff;\n  background-color: #721c24;\n  border-color: #721c24;\n}\n\n.list-group-item-light {\n  color: #818182;\n  background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n  color: #818182;\n  background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n  color: #fff;\n  background-color: #818182;\n  border-color: #818182;\n}\n\n.list-group-item-dark {\n  color: #1b1e21;\n  background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n  color: #1b1e21;\n  background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n  color: #fff;\n  background-color: #1b1e21;\n  border-color: #1b1e21;\n}\n\n.close {\n  float: right;\n  font-size: 1.5rem;\n  font-weight: 700;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: .5;\n}\n\n.close:hover {\n  color: #000;\n  text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n  opacity: .75;\n}\n\nbutton.close {\n  padding: 0;\n  background-color: transparent;\n  border: 0;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\na.close.disabled {\n  pointer-events: none;\n}\n\n.toast {\n  max-width: 350px;\n  overflow: hidden;\n  font-size: 0.875rem;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n  -webkit-backdrop-filter: blur(10px);\n  backdrop-filter: blur(10px);\n  opacity: 0;\n  border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n  margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n  opacity: 1;\n}\n\n.toast.show {\n  display: block;\n  opacity: 1;\n}\n\n.toast.hide {\n  display: none;\n}\n\n.toast-header {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding: 0.25rem 0.75rem;\n  color: #6c757d;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n  padding: 0.75rem;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  outline: 0;\n}\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 0.5rem;\n  pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n  transition: -webkit-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n  transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n  -webkit-transform: translate(0, -50px);\n  transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .modal.fade .modal-dialog {\n    transition: none;\n  }\n}\n\n.modal.show .modal-dialog {\n  -webkit-transform: none;\n  transform: none;\n}\n\n.modal-dialog-scrollable {\n  display: -ms-flexbox;\n  display: flex;\n  max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n  max-height: calc(100vh - 1rem);\n  overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n  -ms-flex-negative: 0;\n  flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n  overflow-y: auto;\n}\n\n.modal-dialog-centered {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n  display: block;\n  height: calc(100vh - 1rem);\n  content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-pack: center;\n  justify-content: center;\n  height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n  max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n  content: none;\n}\n\n.modal-content {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  width: 100%;\n  pointer-events: auto;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n  outline: 0;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1040;\n  width: 100vw;\n  height: 100vh;\n  background-color: #000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n}\n\n.modal-backdrop.show {\n  opacity: 0.5;\n}\n\n.modal-header {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: start;\n  align-items: flex-start;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n  padding: 1rem 1rem;\n  border-bottom: 1px solid #dee2e6;\n  border-top-left-radius: 0.3rem;\n  border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n  padding: 1rem 1rem;\n  margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n\n.modal-body {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  padding: 1rem;\n}\n\n.modal-footer {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: end;\n  justify-content: flex-end;\n  padding: 1rem;\n  border-top: 1px solid #dee2e6;\n  border-bottom-right-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n  margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n  margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n@media (min-width: 576px) {\n  .modal-dialog {\n    max-width: 500px;\n    margin: 1.75rem auto;\n  }\n  .modal-dialog-scrollable {\n    max-height: calc(100% - 3.5rem);\n  }\n  .modal-dialog-scrollable .modal-content {\n    max-height: calc(100vh - 3.5rem);\n  }\n  .modal-dialog-centered {\n    min-height: calc(100% - 3.5rem);\n  }\n  .modal-dialog-centered::before {\n    height: calc(100vh - 3.5rem);\n  }\n  .modal-sm {\n    max-width: 300px;\n  }\n}\n\n@media (min-width: 992px) {\n  .modal-lg,\n  .modal-xl {\n    max-width: 800px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .modal-xl {\n    max-width: 1140px;\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  opacity: 0;\n}\n\n.tooltip.show {\n  opacity: 0.9;\n}\n\n.tooltip .arrow {\n  position: absolute;\n  display: block;\n  width: 0.8rem;\n  height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n  bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n  top: 0;\n  border-width: 0.4rem 0.4rem 0;\n  border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n  left: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n  right: 0;\n  border-width: 0.4rem 0.4rem 0.4rem 0;\n  border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n  top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n  bottom: 0;\n  border-width: 0 0.4rem 0.4rem;\n  border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n  right: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n  left: 0;\n  border-width: 0.4rem 0 0.4rem 0.4rem;\n  border-left-color: #000;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 0.25rem 0.5rem;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 0.25rem;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: block;\n  max-width: 276px;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n}\n\n.popover .arrow {\n  position: absolute;\n  display: block;\n  width: 1rem;\n  height: 0.5rem;\n  margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n  margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n  bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n  bottom: 0;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n  bottom: 1px;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n  margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n  left: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n  left: 0;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n  left: 1px;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n  margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n  top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n  top: 0;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n  top: 1px;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  display: block;\n  width: 1rem;\n  margin-left: -0.5rem;\n  content: \"\";\n  border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n  margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n  right: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n  right: 0;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n  right: 1px;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: #fff;\n}\n\n.popover-header {\n  padding: 0.5rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-top-left-radius: calc(0.3rem - 1px);\n  border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n  display: none;\n}\n\n.popover-body {\n  padding: 0.5rem 0.75rem;\n  color: #212529;\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel.pointer-event {\n  -ms-touch-action: pan-y;\n  touch-action: pan-y;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  float: left;\n  width: 100%;\n  margin-right: -100%;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  transition: -webkit-transform 0.6s ease-in-out;\n  transition: transform 0.6s ease-in-out;\n  transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-item {\n    transition: none;\n  }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n  -webkit-transform: translateX(100%);\n  transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n  -webkit-transform: translateX(-100%);\n  transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n  opacity: 0;\n  transition-property: opacity;\n  -webkit-transform: none;\n  transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n  z-index: 1;\n  opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n  z-index: 0;\n  opacity: 0;\n  transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-fade .active.carousel-item-left,\n  .carousel-fade .active.carousel-item-right {\n    transition: none;\n  }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 1;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: center;\n  justify-content: center;\n  width: 15%;\n  color: #fff;\n  text-align: center;\n  opacity: 0.5;\n  transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-control-prev,\n  .carousel-control-next {\n    transition: none;\n  }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  opacity: 0.9;\n}\n\n.carousel-control-prev {\n  left: 0;\n}\n\n.carousel-control-next {\n  right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 15;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-pack: center;\n  justify-content: center;\n  padding-left: 0;\n  margin-right: 15%;\n  margin-left: 15%;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  box-sizing: content-box;\n  -ms-flex: 0 1 auto;\n  flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  margin-right: 3px;\n  margin-left: 3px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #fff;\n  background-clip: padding-box;\n  border-top: 10px solid transparent;\n  border-bottom: 10px solid transparent;\n  opacity: .5;\n  transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-indicators li {\n    transition: none;\n  }\n}\n\n.carousel-indicators .active {\n  opacity: 1;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n}\n\n@-webkit-keyframes spinner-border {\n  to {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n@keyframes spinner-border {\n  to {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n.spinner-border {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: text-bottom;\n  border: 0.25em solid currentColor;\n  border-right-color: transparent;\n  border-radius: 50%;\n  -webkit-animation: spinner-border .75s linear infinite;\n  animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n  width: 1rem;\n  height: 1rem;\n  border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n  0% {\n    -webkit-transform: scale(0);\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n\n@keyframes spinner-grow {\n  0% {\n    -webkit-transform: scale(0);\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n\n.spinner-grow {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: text-bottom;\n  background-color: currentColor;\n  border-radius: 50%;\n  opacity: 0;\n  -webkit-animation: spinner-grow .75s linear infinite;\n  animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n  width: 1rem;\n  height: 1rem;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.bg-primary {\n  background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n  background-color: #0062cc !important;\n}\n\n.bg-secondary {\n  background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n  background-color: #545b62 !important;\n}\n\n.bg-success {\n  background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n  background-color: #1e7e34 !important;\n}\n\n.bg-info {\n  background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n  background-color: #117a8b !important;\n}\n\n.bg-warning {\n  background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n  background-color: #d39e00 !important;\n}\n\n.bg-danger {\n  background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n  background-color: #bd2130 !important;\n}\n\n.bg-light {\n  background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n  background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n  background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n  background-color: #1d2124 !important;\n}\n\n.bg-white {\n  background-color: #fff !important;\n}\n\n.bg-transparent {\n  background-color: transparent !important;\n}\n\n.border {\n  border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n  border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n  border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n  border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n  border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-right-0 {\n  border-right: 0 !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-left-0 {\n  border-left: 0 !important;\n}\n\n.border-primary {\n  border-color: #007bff !important;\n}\n\n.border-secondary {\n  border-color: #6c757d !important;\n}\n\n.border-success {\n  border-color: #28a745 !important;\n}\n\n.border-info {\n  border-color: #17a2b8 !important;\n}\n\n.border-warning {\n  border-color: #ffc107 !important;\n}\n\n.border-danger {\n  border-color: #dc3545 !important;\n}\n\n.border-light {\n  border-color: #f8f9fa !important;\n}\n\n.border-dark {\n  border-color: #343a40 !important;\n}\n\n.border-white {\n  border-color: #fff !important;\n}\n\n.rounded-sm {\n  border-radius: 0.2rem !important;\n}\n\n.rounded {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n  border-top-left-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n  border-top-right-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n  border-top-left-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n  border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: 50rem !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: -ms-flexbox !important;\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: -ms-inline-flexbox !important;\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  overflow: hidden;\n}\n\n.embed-responsive::before {\n  display: block;\n  content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n\n.embed-responsive-21by9::before {\n  padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n  padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n  padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n  padding-top: 100%;\n}\n\n.flex-row {\n  -ms-flex-direction: row !important;\n  flex-direction: row !important;\n}\n\n.flex-column {\n  -ms-flex-direction: column !important;\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -ms-flex-direction: row-reverse !important;\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -ms-flex-direction: column-reverse !important;\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n  flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n  -ms-flex: 1 1 auto !important;\n  flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n  -ms-flex-positive: 0 !important;\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  -ms-flex-positive: 1 !important;\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  -ms-flex-negative: 0 !important;\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  -ms-flex-negative: 1 !important;\n  flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n  -ms-flex-pack: start !important;\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -ms-flex-pack: end !important;\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -ms-flex-pack: center !important;\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  -ms-flex-pack: justify !important;\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  -ms-flex-align: start !important;\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  -ms-flex-align: end !important;\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  -ms-flex-align: center !important;\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  -ms-flex-align: baseline !important;\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -ms-flex-align: stretch !important;\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n  align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n  align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n.float-left {\n  float: left !important;\n}\n\n.float-right {\n  float: right !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-left {\n    float: left !important;\n  }\n  .float-sm-right {\n    float: right !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .float-md-left {\n    float: left !important;\n  }\n  .float-md-right {\n    float: right !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .float-lg-left {\n    float: left !important;\n  }\n  .float-lg-right {\n    float: right !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .float-xl-left {\n    float: left !important;\n  }\n  .float-xl-right {\n    float: right !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n  .sticky-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  overflow: visible;\n  clip: auto;\n  white-space: normal;\n}\n\n.shadow-sm {\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  pointer-events: auto;\n  content: \"\";\n  background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n\n.m-n1 {\n  margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n  margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n  margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n  margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n  margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n  margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n  margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n  margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n  margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n  margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n  margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n  margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n  margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n  margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n  margin-left: -1rem !important;\n}\n\n.m-n4 {\n  margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n  margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n  margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n  margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n  margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n  margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n  margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n  margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n  margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n  margin-left: -3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-sm-n1,\n  .my-sm-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-sm-n1,\n  .mx-sm-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-sm-n1,\n  .my-sm-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-sm-n1,\n  .mx-sm-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-sm-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-sm-n2,\n  .my-sm-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-sm-n2,\n  .mx-sm-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-sm-n2,\n  .my-sm-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-sm-n2,\n  .mx-sm-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-sm-n3 {\n    margin: -1rem !important;\n  }\n  .mt-sm-n3,\n  .my-sm-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-sm-n3,\n  .mx-sm-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-sm-n3,\n  .my-sm-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-sm-n3,\n  .mx-sm-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-sm-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-sm-n4,\n  .my-sm-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-sm-n4,\n  .mx-sm-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-sm-n4,\n  .my-sm-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-sm-n4,\n  .mx-sm-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-sm-n5 {\n    margin: -3rem !important;\n  }\n  .mt-sm-n5,\n  .my-sm-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-sm-n5,\n  .mx-sm-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-sm-n5,\n  .my-sm-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-sm-n5,\n  .mx-sm-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-md-n1,\n  .my-md-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-md-n1,\n  .mx-md-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-md-n1,\n  .my-md-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-md-n1,\n  .mx-md-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-md-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-md-n2,\n  .my-md-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-md-n2,\n  .mx-md-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-md-n2,\n  .my-md-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-md-n2,\n  .mx-md-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-md-n3 {\n    margin: -1rem !important;\n  }\n  .mt-md-n3,\n  .my-md-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-md-n3,\n  .mx-md-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-md-n3,\n  .my-md-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-md-n3,\n  .mx-md-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-md-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-md-n4,\n  .my-md-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-md-n4,\n  .mx-md-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-md-n4,\n  .my-md-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-md-n4,\n  .mx-md-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-md-n5 {\n    margin: -3rem !important;\n  }\n  .mt-md-n5,\n  .my-md-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-md-n5,\n  .mx-md-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-md-n5,\n  .my-md-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-md-n5,\n  .mx-md-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-lg-n1,\n  .my-lg-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-lg-n1,\n  .mx-lg-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-lg-n1,\n  .my-lg-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-lg-n1,\n  .mx-lg-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-lg-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-lg-n2,\n  .my-lg-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-lg-n2,\n  .mx-lg-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-lg-n2,\n  .my-lg-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-lg-n2,\n  .mx-lg-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-lg-n3 {\n    margin: -1rem !important;\n  }\n  .mt-lg-n3,\n  .my-lg-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-lg-n3,\n  .mx-lg-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-lg-n3,\n  .my-lg-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-lg-n3,\n  .mx-lg-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-lg-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-lg-n4,\n  .my-lg-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-lg-n4,\n  .mx-lg-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-lg-n4,\n  .my-lg-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-lg-n4,\n  .mx-lg-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-lg-n5 {\n    margin: -3rem !important;\n  }\n  .mt-lg-n5,\n  .my-lg-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-lg-n5,\n  .mx-lg-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-lg-n5,\n  .my-lg-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-lg-n5,\n  .mx-lg-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-xl-n1,\n  .my-xl-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-xl-n1,\n  .mx-xl-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-xl-n1,\n  .my-xl-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-xl-n1,\n  .mx-xl-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-xl-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-xl-n2,\n  .my-xl-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-xl-n2,\n  .mx-xl-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-xl-n2,\n  .my-xl-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-xl-n2,\n  .mx-xl-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-xl-n3 {\n    margin: -1rem !important;\n  }\n  .mt-xl-n3,\n  .my-xl-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-xl-n3,\n  .mx-xl-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-xl-n3,\n  .my-xl-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-xl-n3,\n  .mx-xl-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-xl-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-xl-n4,\n  .my-xl-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-xl-n4,\n  .mx-xl-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-xl-n4,\n  .my-xl-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-xl-n4,\n  .mx-xl-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-xl-n5 {\n    margin: -3rem !important;\n  }\n  .mt-xl-n5,\n  .my-xl-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-xl-n5,\n  .mx-xl-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-xl-n5,\n  .my-xl-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-xl-n5,\n  .mx-xl-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n\n.text-monospace {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n  text-align: justify !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.text-left {\n  text-align: left !important;\n}\n\n.text-right {\n  text-align: right !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n@media (min-width: 576px) {\n  .text-sm-left {\n    text-align: left !important;\n  }\n  .text-sm-right {\n    text-align: right !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .text-md-left {\n    text-align: left !important;\n  }\n  .text-md-right {\n    text-align: right !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .text-lg-left {\n    text-align: left !important;\n  }\n  .text-lg-right {\n    text-align: right !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .text-xl-left {\n    text-align: left !important;\n  }\n  .text-xl-right {\n    text-align: right !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.font-weight-light {\n  font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n  font-weight: lighter !important;\n}\n\n.font-weight-normal {\n  font-weight: 400 !important;\n}\n\n.font-weight-bold {\n  font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n  font-weight: bolder !important;\n}\n\n.font-italic {\n  font-style: italic !important;\n}\n\n.text-white {\n  color: #fff !important;\n}\n\n.text-primary {\n  color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n  color: #0056b3 !important;\n}\n\n.text-secondary {\n  color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n  color: #494f54 !important;\n}\n\n.text-success {\n  color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n  color: #19692c !important;\n}\n\n.text-info {\n  color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n  color: #0f6674 !important;\n}\n\n.text-warning {\n  color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n  color: #ba8b00 !important;\n}\n\n.text-danger {\n  color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n  color: #a71d2a !important;\n}\n\n.text-light {\n  color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n  color: #cbd3da !important;\n}\n\n.text-dark {\n  color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n  color: #121416 !important;\n}\n\n.text-body {\n  color: #212529 !important;\n}\n\n.text-muted {\n  color: #6c757d !important;\n}\n\n.text-black-50 {\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-break {\n  word-break: break-word !important;\n  overflow-wrap: break-word !important;\n}\n\n.text-reset {\n  color: inherit !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n@media print {\n  *,\n  *::before,\n  *::after {\n    text-shadow: none !important;\n    box-shadow: none !important;\n  }\n  a:not(.btn) {\n    text-decoration: underline;\n  }\n  abbr[title]::after {\n    content: \" (\" attr(title) \")\";\n  }\n  pre {\n    white-space: pre-wrap !important;\n  }\n  pre,\n  blockquote {\n    border: 1px solid #adb5bd;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  @page {\n    size: a3;\n  }\n  body {\n    min-width: 992px !important;\n  }\n  .container {\n    min-width: 992px !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .badge {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #dee2e6 !important;\n  }\n  .table-dark {\n    color: inherit;\n  }\n  .table-dark th,\n  .table-dark td,\n  .table-dark thead th,\n  .table-dark tbody + tbody {\n    border-color: #dee2e6;\n  }\n  .table .thead-dark th {\n    color: inherit;\n    border-color: #dee2e6;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js",
    "content": "/*!\n  * Bootstrap v4.3.1 (https://getbootstrap.com/)\n  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :\n  (global = global || self, factory(global.bootstrap = {}, global.jQuery));\n}(this, function (exports, $) { 'use strict';\n\n  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function _objectSpread(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n      var ownKeys = Object.keys(source);\n\n      if (typeof Object.getOwnPropertySymbols === 'function') {\n        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n          return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n        }));\n      }\n\n      ownKeys.forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    }\n\n    return target;\n  }\n\n  function _inheritsLoose(subClass, superClass) {\n    subClass.prototype = Object.create(superClass.prototype);\n    subClass.prototype.constructor = subClass;\n    subClass.__proto__ = superClass;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): util.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Private TransitionEnd Helpers\n   * ------------------------------------------------------------------------\n   */\n\n  var TRANSITION_END = 'transitionend';\n  var MAX_UID = 1000000;\n  var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  function toType(obj) {\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  }\n\n  function getSpecialTransitionEndEvent() {\n    return {\n      bindType: TRANSITION_END,\n      delegateType: TRANSITION_END,\n      handle: function handle(event) {\n        if ($(event.target).is(this)) {\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n        }\n\n        return undefined; // eslint-disable-line no-undefined\n      }\n    };\n  }\n\n  function transitionEndEmulator(duration) {\n    var _this = this;\n\n    var called = false;\n    $(this).one(Util.TRANSITION_END, function () {\n      called = true;\n    });\n    setTimeout(function () {\n      if (!called) {\n        Util.triggerTransitionEnd(_this);\n      }\n    }, duration);\n    return this;\n  }\n\n  function setTransitionEndSupport() {\n    $.fn.emulateTransitionEnd = transitionEndEmulator;\n    $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n  }\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  var Util = {\n    TRANSITION_END: 'bsTransitionEnd',\n    getUID: function getUID(prefix) {\n      do {\n        // eslint-disable-next-line no-bitwise\n        prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n      } while (document.getElementById(prefix));\n\n      return prefix;\n    },\n    getSelectorFromElement: function getSelectorFromElement(element) {\n      var selector = element.getAttribute('data-target');\n\n      if (!selector || selector === '#') {\n        var hrefAttr = element.getAttribute('href');\n        selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';\n      }\n\n      try {\n        return document.querySelector(selector) ? selector : null;\n      } catch (err) {\n        return null;\n      }\n    },\n    getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n      if (!element) {\n        return 0;\n      } // Get transition-duration of the element\n\n\n      var transitionDuration = $(element).css('transition-duration');\n      var transitionDelay = $(element).css('transition-delay');\n      var floatTransitionDuration = parseFloat(transitionDuration);\n      var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n      if (!floatTransitionDuration && !floatTransitionDelay) {\n        return 0;\n      } // If multiple durations are defined, take the first\n\n\n      transitionDuration = transitionDuration.split(',')[0];\n      transitionDelay = transitionDelay.split(',')[0];\n      return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n    },\n    reflow: function reflow(element) {\n      return element.offsetHeight;\n    },\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\n      $(element).trigger(TRANSITION_END);\n    },\n    // TODO: Remove in v5\n    supportsTransitionEnd: function supportsTransitionEnd() {\n      return Boolean(TRANSITION_END);\n    },\n    isElement: function isElement(obj) {\n      return (obj[0] || obj).nodeType;\n    },\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n      for (var property in configTypes) {\n        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n          var expectedTypes = configTypes[property];\n          var value = config[property];\n          var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n          if (!new RegExp(expectedTypes).test(valueType)) {\n            throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n          }\n        }\n      }\n    },\n    findShadowRoot: function findShadowRoot(element) {\n      if (!document.documentElement.attachShadow) {\n        return null;\n      } // Can find the shadow root otherwise it'll return the document\n\n\n      if (typeof element.getRootNode === 'function') {\n        var root = element.getRootNode();\n        return root instanceof ShadowRoot ? root : null;\n      }\n\n      if (element instanceof ShadowRoot) {\n        return element;\n      } // when we don't find a shadow root\n\n\n      if (!element.parentNode) {\n        return null;\n      }\n\n      return Util.findShadowRoot(element.parentNode);\n    }\n  };\n  setTransitionEndSupport();\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME = 'alert';\n  var VERSION = '4.3.1';\n  var DATA_KEY = 'bs.alert';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n  var Selector = {\n    DISMISS: '[data-dismiss=\"alert\"]'\n  };\n  var Event = {\n    CLOSE: \"close\" + EVENT_KEY,\n    CLOSED: \"closed\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    ALERT: 'alert',\n    FADE: 'fade',\n    SHOW: 'show'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Alert =\n  /*#__PURE__*/\n  function () {\n    function Alert(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Alert.prototype;\n\n    // Public\n    _proto.close = function close(element) {\n      var rootElement = this._element;\n\n      if (element) {\n        rootElement = this._getRootElement(element);\n      }\n\n      var customEvent = this._triggerCloseEvent(rootElement);\n\n      if (customEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._removeElement(rootElement);\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._getRootElement = function _getRootElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      var parent = false;\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      if (!parent) {\n        parent = $(element).closest(\".\" + ClassName.ALERT)[0];\n      }\n\n      return parent;\n    };\n\n    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n      var closeEvent = $.Event(Event.CLOSE);\n      $(element).trigger(closeEvent);\n      return closeEvent;\n    };\n\n    _proto._removeElement = function _removeElement(element) {\n      var _this = this;\n\n      $(element).removeClass(ClassName.SHOW);\n\n      if (!$(element).hasClass(ClassName.FADE)) {\n        this._destroyElement(element);\n\n        return;\n      }\n\n      var transitionDuration = Util.getTransitionDurationFromElement(element);\n      $(element).one(Util.TRANSITION_END, function (event) {\n        return _this._destroyElement(element, event);\n      }).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto._destroyElement = function _destroyElement(element) {\n      $(element).detach().trigger(Event.CLOSED).remove();\n    } // Static\n    ;\n\n    Alert._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY);\n\n        if (!data) {\n          data = new Alert(this);\n          $element.data(DATA_KEY, data);\n        }\n\n        if (config === 'close') {\n          data[config](this);\n        }\n      });\n    };\n\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\n      return function (event) {\n        if (event) {\n          event.preventDefault();\n        }\n\n        alertInstance.close(this);\n      };\n    };\n\n    _createClass(Alert, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n\n    return Alert;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME] = Alert._jQueryInterface;\n  $.fn[NAME].Constructor = Alert;\n\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Alert._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$1 = 'button';\n  var VERSION$1 = '4.3.1';\n  var DATA_KEY$1 = 'bs.button';\n  var EVENT_KEY$1 = \".\" + DATA_KEY$1;\n  var DATA_API_KEY$1 = '.data-api';\n  var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1];\n  var ClassName$1 = {\n    ACTIVE: 'active',\n    BUTTON: 'btn',\n    FOCUS: 'focus'\n  };\n  var Selector$1 = {\n    DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n    DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n    INPUT: 'input:not([type=\"hidden\"])',\n    ACTIVE: '.active',\n    BUTTON: '.btn'\n  };\n  var Event$1 = {\n    CLICK_DATA_API: \"click\" + EVENT_KEY$1 + DATA_API_KEY$1,\n    FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY$1 + DATA_API_KEY$1 + \" \" + (\"blur\" + EVENT_KEY$1 + DATA_API_KEY$1)\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Button =\n  /*#__PURE__*/\n  function () {\n    function Button(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Button.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      var triggerChangeEvent = true;\n      var addAriaPressed = true;\n      var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];\n\n      if (rootElement) {\n        var input = this._element.querySelector(Selector$1.INPUT);\n\n        if (input) {\n          if (input.type === 'radio') {\n            if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) {\n              triggerChangeEvent = false;\n            } else {\n              var activeElement = rootElement.querySelector(Selector$1.ACTIVE);\n\n              if (activeElement) {\n                $(activeElement).removeClass(ClassName$1.ACTIVE);\n              }\n            }\n          }\n\n          if (triggerChangeEvent) {\n            if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n              return;\n            }\n\n            input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);\n            $(input).trigger('change');\n          }\n\n          input.focus();\n          addAriaPressed = false;\n        }\n      }\n\n      if (addAriaPressed) {\n        this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));\n      }\n\n      if (triggerChangeEvent) {\n        $(this._element).toggleClass(ClassName$1.ACTIVE);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$1);\n      this._element = null;\n    } // Static\n    ;\n\n    Button._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$1);\n\n        if (!data) {\n          data = new Button(this);\n          $(this).data(DATA_KEY$1, data);\n        }\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Button, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$1;\n      }\n    }]);\n\n    return Button;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    event.preventDefault();\n    var button = event.target;\n\n    if (!$(button).hasClass(ClassName$1.BUTTON)) {\n      button = $(button).closest(Selector$1.BUTTON);\n    }\n\n    Button._jQueryInterface.call($(button), 'toggle');\n  }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    var button = $(event.target).closest(Selector$1.BUTTON)[0];\n    $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$1] = Button._jQueryInterface;\n  $.fn[NAME$1].Constructor = Button;\n\n  $.fn[NAME$1].noConflict = function () {\n    $.fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n    return Button._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$2 = 'carousel';\n  var VERSION$2 = '4.3.1';\n  var DATA_KEY$2 = 'bs.carousel';\n  var EVENT_KEY$2 = \".\" + DATA_KEY$2;\n  var DATA_API_KEY$2 = '.data-api';\n  var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2];\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  var SWIPE_THRESHOLD = 40;\n  var Default = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  var DefaultType = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  var Direction = {\n    NEXT: 'next',\n    PREV: 'prev',\n    LEFT: 'left',\n    RIGHT: 'right'\n  };\n  var Event$2 = {\n    SLIDE: \"slide\" + EVENT_KEY$2,\n    SLID: \"slid\" + EVENT_KEY$2,\n    KEYDOWN: \"keydown\" + EVENT_KEY$2,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$2,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$2,\n    TOUCHSTART: \"touchstart\" + EVENT_KEY$2,\n    TOUCHMOVE: \"touchmove\" + EVENT_KEY$2,\n    TOUCHEND: \"touchend\" + EVENT_KEY$2,\n    POINTERDOWN: \"pointerdown\" + EVENT_KEY$2,\n    POINTERUP: \"pointerup\" + EVENT_KEY$2,\n    DRAG_START: \"dragstart\" + EVENT_KEY$2,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$2 + DATA_API_KEY$2,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$2 + DATA_API_KEY$2\n  };\n  var ClassName$2 = {\n    CAROUSEL: 'carousel',\n    ACTIVE: 'active',\n    SLIDE: 'slide',\n    RIGHT: 'carousel-item-right',\n    LEFT: 'carousel-item-left',\n    NEXT: 'carousel-item-next',\n    PREV: 'carousel-item-prev',\n    ITEM: 'carousel-item',\n    POINTER_EVENT: 'pointer-event'\n  };\n  var Selector$2 = {\n    ACTIVE: '.active',\n    ACTIVE_ITEM: '.active.carousel-item',\n    ITEM: '.carousel-item',\n    ITEM_IMG: '.carousel-item img',\n    NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n    INDICATORS: '.carousel-indicators',\n    DATA_SLIDE: '[data-slide], [data-slide-to]',\n    DATA_RIDE: '[data-ride=\"carousel\"]'\n  };\n  var PointerType = {\n    TOUCH: 'touch',\n    PEN: 'pen'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Carousel =\n  /*#__PURE__*/\n  function () {\n    function Carousel(element, config) {\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Carousel.prototype;\n\n    // Public\n    _proto.next = function next() {\n      if (!this._isSliding) {\n        this._slide(Direction.NEXT);\n      }\n    };\n\n    _proto.nextWhenVisible = function nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {\n        this.next();\n      }\n    };\n\n    _proto.prev = function prev() {\n      if (!this._isSliding) {\n        this._slide(Direction.PREV);\n      }\n    };\n\n    _proto.pause = function pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (this._element.querySelector(Selector$2.NEXT_PREV)) {\n        Util.triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    };\n\n    _proto.cycle = function cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config.interval && !this._isPaused) {\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    };\n\n    _proto.to = function to(index) {\n      var _this = this;\n\n      this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        $(this._element).one(Event$2.SLID, function () {\n          return _this.to(index);\n        });\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n      this._slide(direction, this._items[index]);\n    };\n\n    _proto.dispose = function dispose() {\n      $(this._element).off(EVENT_KEY$2);\n      $.removeData(this._element, DATA_KEY$2);\n      this._items = null;\n      this._config = null;\n      this._element = null;\n      this._interval = null;\n      this._isPaused = null;\n      this._isSliding = null;\n      this._activeElement = null;\n      this._indicatorsElement = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default, config);\n      Util.typeCheckConfig(NAME$2, config, DefaultType);\n      return config;\n    };\n\n    _proto._handleSwipe = function _handleSwipe() {\n      var absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      var direction = absDeltax / this.touchDeltaX; // swipe left\n\n      if (direction > 0) {\n        this.prev();\n      } // swipe right\n\n\n      if (direction < 0) {\n        this.next();\n      }\n    };\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this2 = this;\n\n      if (this._config.keyboard) {\n        $(this._element).on(Event$2.KEYDOWN, function (event) {\n          return _this2._keydown(event);\n        });\n      }\n\n      if (this._config.pause === 'hover') {\n        $(this._element).on(Event$2.MOUSEENTER, function (event) {\n          return _this2.pause(event);\n        }).on(Event$2.MOUSELEAVE, function (event) {\n          return _this2.cycle(event);\n        });\n      }\n\n      if (this._config.touch) {\n        this._addTouchEventListeners();\n      }\n    };\n\n    _proto._addTouchEventListeners = function _addTouchEventListeners() {\n      var _this3 = this;\n\n      if (!this._touchSupported) {\n        return;\n      }\n\n      var start = function start(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchStartX = event.originalEvent.clientX;\n        } else if (!_this3._pointerEvent) {\n          _this3.touchStartX = event.originalEvent.touches[0].clientX;\n        }\n      };\n\n      var move = function move(event) {\n        // ensure swiping with one touch and not pinching\n        if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n          _this3.touchDeltaX = 0;\n        } else {\n          _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;\n        }\n      };\n\n      var end = function end(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;\n        }\n\n        _this3._handleSwipe();\n\n        if (_this3._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          _this3.pause();\n\n          if (_this3.touchTimeout) {\n            clearTimeout(_this3.touchTimeout);\n          }\n\n          _this3.touchTimeout = setTimeout(function (event) {\n            return _this3.cycle(event);\n          }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);\n        }\n      };\n\n      $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) {\n        return e.preventDefault();\n      });\n\n      if (this._pointerEvent) {\n        $(this._element).on(Event$2.POINTERDOWN, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.POINTERUP, function (event) {\n          return end(event);\n        });\n\n        this._element.classList.add(ClassName$2.POINTER_EVENT);\n      } else {\n        $(this._element).on(Event$2.TOUCHSTART, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.TOUCHMOVE, function (event) {\n          return move(event);\n        });\n        $(this._element).on(Event$2.TOUCHEND, function (event) {\n          return end(event);\n        });\n      }\n    };\n\n    _proto._keydown = function _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      switch (event.which) {\n        case ARROW_LEFT_KEYCODE:\n          event.preventDefault();\n          this.prev();\n          break;\n\n        case ARROW_RIGHT_KEYCODE:\n          event.preventDefault();\n          this.next();\n          break;\n\n        default:\n      }\n    };\n\n    _proto._getItemIndex = function _getItemIndex(element) {\n      this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : [];\n      return this._items.indexOf(element);\n    };\n\n    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n      var isNextDirection = direction === Direction.NEXT;\n      var isPrevDirection = direction === Direction.PREV;\n\n      var activeIndex = this._getItemIndex(activeElement);\n\n      var lastItemIndex = this._items.length - 1;\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n      if (isGoingToWrap && !this._config.wrap) {\n        return activeElement;\n      }\n\n      var delta = direction === Direction.PREV ? -1 : 1;\n      var itemIndex = (activeIndex + delta) % this._items.length;\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n    };\n\n    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      var targetIndex = this._getItemIndex(relatedTarget);\n\n      var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM));\n\n      var slideEvent = $.Event(Event$2.SLIDE, {\n        relatedTarget: relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n      $(this._element).trigger(slideEvent);\n      return slideEvent;\n    };\n\n    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE));\n        $(indicators).removeClass(ClassName$2.ACTIVE);\n\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n        if (nextIndicator) {\n          $(nextIndicator).addClass(ClassName$2.ACTIVE);\n        }\n      }\n    };\n\n    _proto._slide = function _slide(direction, element) {\n      var _this4 = this;\n\n      var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeElementIndex = this._getItemIndex(activeElement);\n\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n      var nextElementIndex = this._getItemIndex(nextElement);\n\n      var isCycling = Boolean(this._interval);\n      var directionalClassName;\n      var orderClassName;\n      var eventDirectionName;\n\n      if (direction === Direction.NEXT) {\n        directionalClassName = ClassName$2.LEFT;\n        orderClassName = ClassName$2.NEXT;\n        eventDirectionName = Direction.LEFT;\n      } else {\n        directionalClassName = ClassName$2.RIGHT;\n        orderClassName = ClassName$2.PREV;\n        eventDirectionName = Direction.RIGHT;\n      }\n\n      if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) {\n        this._isSliding = false;\n        return;\n      }\n\n      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      var slidEvent = $.Event(Event$2.SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      });\n\n      if ($(this._element).hasClass(ClassName$2.SLIDE)) {\n        $(nextElement).addClass(orderClassName);\n        Util.reflow(nextElement);\n        $(activeElement).addClass(directionalClassName);\n        $(nextElement).addClass(directionalClassName);\n        var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);\n\n        if (nextElementInterval) {\n          this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n          this._config.interval = nextElementInterval;\n        } else {\n          this._config.interval = this._config.defaultInterval || this._config.interval;\n        }\n\n        var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n        $(activeElement).one(Util.TRANSITION_END, function () {\n          $(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName$2.ACTIVE);\n          $(activeElement).removeClass(ClassName$2.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n          _this4._isSliding = false;\n          setTimeout(function () {\n            return $(_this4._element).trigger(slidEvent);\n          }, 0);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        $(activeElement).removeClass(ClassName$2.ACTIVE);\n        $(nextElement).addClass(ClassName$2.ACTIVE);\n        this._isSliding = false;\n        $(this._element).trigger(slidEvent);\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    } // Static\n    ;\n\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$2);\n\n        var _config = _objectSpread({}, Default, $(this).data());\n\n        if (typeof config === 'object') {\n          _config = _objectSpread({}, _config, config);\n        }\n\n        var action = typeof config === 'string' ? config : _config.slide;\n\n        if (!data) {\n          data = new Carousel(this, _config);\n          $(this).data(DATA_KEY$2, data);\n        }\n\n        if (typeof config === 'number') {\n          data.to(config);\n        } else if (typeof action === 'string') {\n          if (typeof data[action] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n          }\n\n          data[action]();\n        } else if (_config.interval && _config.ride) {\n          data.pause();\n          data.cycle();\n        }\n      });\n    };\n\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n      var selector = Util.getSelectorFromElement(this);\n\n      if (!selector) {\n        return;\n      }\n\n      var target = $(selector)[0];\n\n      if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) {\n        return;\n      }\n\n      var config = _objectSpread({}, $(target).data(), $(this).data());\n\n      var slideIndex = this.getAttribute('data-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel._jQueryInterface.call($(target), config);\n\n      if (slideIndex) {\n        $(target).data(DATA_KEY$2).to(slideIndex);\n      }\n\n      event.preventDefault();\n    };\n\n    _createClass(Carousel, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$2;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n\n    return Carousel;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler);\n  $(window).on(Event$2.LOAD_DATA_API, function () {\n    var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE));\n\n    for (var i = 0, len = carousels.length; i < len; i++) {\n      var $carousel = $(carousels[i]);\n\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$2] = Carousel._jQueryInterface;\n  $.fn[NAME$2].Constructor = Carousel;\n\n  $.fn[NAME$2].noConflict = function () {\n    $.fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n    return Carousel._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$3 = 'collapse';\n  var VERSION$3 = '4.3.1';\n  var DATA_KEY$3 = 'bs.collapse';\n  var EVENT_KEY$3 = \".\" + DATA_KEY$3;\n  var DATA_API_KEY$3 = '.data-api';\n  var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3];\n  var Default$1 = {\n    toggle: true,\n    parent: ''\n  };\n  var DefaultType$1 = {\n    toggle: 'boolean',\n    parent: '(string|element)'\n  };\n  var Event$3 = {\n    SHOW: \"show\" + EVENT_KEY$3,\n    SHOWN: \"shown\" + EVENT_KEY$3,\n    HIDE: \"hide\" + EVENT_KEY$3,\n    HIDDEN: \"hidden\" + EVENT_KEY$3,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$3 + DATA_API_KEY$3\n  };\n  var ClassName$3 = {\n    SHOW: 'show',\n    COLLAPSE: 'collapse',\n    COLLAPSING: 'collapsing',\n    COLLAPSED: 'collapsed'\n  };\n  var Dimension = {\n    WIDTH: 'width',\n    HEIGHT: 'height'\n  };\n  var Selector$3 = {\n    ACTIVES: '.show, .collapsing',\n    DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Collapse =\n  /*#__PURE__*/\n  function () {\n    function Collapse(element, config) {\n      this._isTransitioning = false;\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._triggerArray = [].slice.call(document.querySelectorAll(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n      var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE));\n\n      for (var i = 0, len = toggleList.length; i < len; i++) {\n        var elem = toggleList[i];\n        var selector = Util.getSelectorFromElement(elem);\n        var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {\n          return foundElem === element;\n        });\n\n        if (selector !== null && filterElement.length > 0) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._parent = this._config.parent ? this._getParent() : null;\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    var _proto = Collapse.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if ($(this._element).hasClass(ClassName$3.SHOW)) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var actives;\n      var activesData;\n\n      if (this._parent) {\n        actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) {\n          if (typeof _this._config.parent === 'string') {\n            return elem.getAttribute('data-parent') === _this._config.parent;\n          }\n\n          return elem.classList.contains(ClassName$3.COLLAPSE);\n        });\n\n        if (actives.length === 0) {\n          actives = null;\n        }\n      }\n\n      if (actives) {\n        activesData = $(actives).not(this._selector).data(DATA_KEY$3);\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      var startEvent = $.Event(Event$3.SHOW);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (actives) {\n        Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');\n\n        if (!activesData) {\n          $(actives).data(DATA_KEY$3, null);\n        }\n      }\n\n      var dimension = this._getDimension();\n\n      $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING);\n      this._element.style[dimension] = 0;\n\n      if (this._triggerArray.length) {\n        $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true);\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW);\n        _this._element.style[dimension] = '';\n\n        _this.setTransitioning(false);\n\n        $(_this._element).trigger(Event$3.SHOWN);\n      };\n\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      var scrollSize = \"scroll\" + capitalizedDimension;\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      this._element.style[dimension] = this._element[scrollSize] + \"px\";\n    };\n\n    _proto.hide = function hide() {\n      var _this2 = this;\n\n      if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var startEvent = $.Event(Event$3.HIDE);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      var dimension = this._getDimension();\n\n      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n      Util.reflow(this._element);\n      $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW);\n      var triggerArrayLength = this._triggerArray.length;\n\n      if (triggerArrayLength > 0) {\n        for (var i = 0; i < triggerArrayLength; i++) {\n          var trigger = this._triggerArray[i];\n          var selector = Util.getSelectorFromElement(trigger);\n\n          if (selector !== null) {\n            var $elem = $([].slice.call(document.querySelectorAll(selector)));\n\n            if (!$elem.hasClass(ClassName$3.SHOW)) {\n              $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false);\n            }\n          }\n        }\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        _this2.setTransitioning(false);\n\n        $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN);\n      };\n\n      this._element.style[dimension] = '';\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto.setTransitioning = function setTransitioning(isTransitioning) {\n      this._isTransitioning = isTransitioning;\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$3);\n      this._config = null;\n      this._parent = null;\n      this._element = null;\n      this._triggerArray = null;\n      this._isTransitioning = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$1, config);\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      Util.typeCheckConfig(NAME$3, config, DefaultType$1);\n      return config;\n    };\n\n    _proto._getDimension = function _getDimension() {\n      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n    };\n\n    _proto._getParent = function _getParent() {\n      var _this3 = this;\n\n      var parent;\n\n      if (Util.isElement(this._config.parent)) {\n        parent = this._config.parent; // It's a jQuery object\n\n        if (typeof this._config.parent.jquery !== 'undefined') {\n          parent = this._config.parent[0];\n        }\n      } else {\n        parent = document.querySelector(this._config.parent);\n      }\n\n      var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n      var children = [].slice.call(parent.querySelectorAll(selector));\n      $(children).each(function (i, element) {\n        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n      });\n      return parent;\n    };\n\n    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n      var isOpen = $(element).hasClass(ClassName$3.SHOW);\n\n      if (triggerArray.length) {\n        $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n      }\n    } // Static\n    ;\n\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      return selector ? document.querySelector(selector) : null;\n    };\n\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$3);\n\n        var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});\n\n        if (!data && _config.toggle && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        if (!data) {\n          data = new Collapse(this, _config);\n          $this.data(DATA_KEY$3, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Collapse, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$3;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$1;\n      }\n    }]);\n\n    return Collapse;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.currentTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    var $trigger = $(this);\n    var selector = Util.getSelectorFromElement(this);\n    var selectors = [].slice.call(document.querySelectorAll(selector));\n    $(selectors).each(function () {\n      var $target = $(this);\n      var data = $target.data(DATA_KEY$3);\n      var config = data ? 'toggle' : $trigger.data();\n\n      Collapse._jQueryInterface.call($target, config);\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$3] = Collapse._jQueryInterface;\n  $.fn[NAME$3].Constructor = Collapse;\n\n  $.fn[NAME$3].noConflict = function () {\n    $.fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n    return Collapse._jQueryInterface;\n  };\n\n  /**!\n   * @fileOverview Kickass library to create and place poppers near their reference elements.\n   * @version 1.14.7\n   * @license\n   * Copyright (c) 2016 Federico Zivolo and contributors\n   *\n   * Permission is hereby granted, free of charge, to any person obtaining a copy\n   * of this software and associated documentation files (the \"Software\"), to deal\n   * in the Software without restriction, including without limitation the rights\n   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n   * copies of the Software, and to permit persons to whom the Software is\n   * furnished to do so, subject to the following conditions:\n   *\n   * The above copyright notice and this permission notice shall be included in all\n   * copies or substantial portions of the Software.\n   *\n   * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n   * SOFTWARE.\n   */\n  var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n  var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n  var timeoutDuration = 0;\n  for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n      timeoutDuration = 1;\n      break;\n    }\n  }\n\n  function microtaskDebounce(fn) {\n    var called = false;\n    return function () {\n      if (called) {\n        return;\n      }\n      called = true;\n      window.Promise.resolve().then(function () {\n        called = false;\n        fn();\n      });\n    };\n  }\n\n  function taskDebounce(fn) {\n    var scheduled = false;\n    return function () {\n      if (!scheduled) {\n        scheduled = true;\n        setTimeout(function () {\n          scheduled = false;\n          fn();\n        }, timeoutDuration);\n      }\n    };\n  }\n\n  var supportsMicroTasks = isBrowser && window.Promise;\n\n  /**\n  * Create a debounced version of a method, that's asynchronously deferred\n  * but called in the minimum time possible.\n  *\n  * @method\n  * @memberof Popper.Utils\n  * @argument {Function} fn\n  * @returns {Function}\n  */\n  var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n  /**\n   * Check if the given variable is a function\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Any} functionToCheck - variable to check\n   * @returns {Boolean} answer to: is a function?\n   */\n  function isFunction(functionToCheck) {\n    var getType = {};\n    return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n  }\n\n  /**\n   * Get CSS computed property of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Eement} element\n   * @argument {String} property\n   */\n  function getStyleComputedProperty(element, property) {\n    if (element.nodeType !== 1) {\n      return [];\n    }\n    // NOTE: 1 DOM access here\n    var window = element.ownerDocument.defaultView;\n    var css = window.getComputedStyle(element, null);\n    return property ? css[property] : css;\n  }\n\n  /**\n   * Returns the parentNode or the host of the element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} parent\n   */\n  function getParentNode(element) {\n    if (element.nodeName === 'HTML') {\n      return element;\n    }\n    return element.parentNode || element.host;\n  }\n\n  /**\n   * Returns the scrolling parent of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} scroll parent\n   */\n  function getScrollParent(element) {\n    // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n    if (!element) {\n      return document.body;\n    }\n\n    switch (element.nodeName) {\n      case 'HTML':\n      case 'BODY':\n        return element.ownerDocument.body;\n      case '#document':\n        return element.body;\n    }\n\n    // Firefox want us to check `-x` and `-y` variations as well\n\n    var _getStyleComputedProp = getStyleComputedProperty(element),\n        overflow = _getStyleComputedProp.overflow,\n        overflowX = _getStyleComputedProp.overflowX,\n        overflowY = _getStyleComputedProp.overflowY;\n\n    if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n      return element;\n    }\n\n    return getScrollParent(getParentNode(element));\n  }\n\n  var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\n  var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n  /**\n   * Determines if the browser is Internet Explorer\n   * @method\n   * @memberof Popper.Utils\n   * @param {Number} version to check\n   * @returns {Boolean} isIE\n   */\n  function isIE(version) {\n    if (version === 11) {\n      return isIE11;\n    }\n    if (version === 10) {\n      return isIE10;\n    }\n    return isIE11 || isIE10;\n  }\n\n  /**\n   * Returns the offset parent of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} offset parent\n   */\n  function getOffsetParent(element) {\n    if (!element) {\n      return document.documentElement;\n    }\n\n    var noOffsetParent = isIE(10) ? document.body : null;\n\n    // NOTE: 1 DOM access here\n    var offsetParent = element.offsetParent || null;\n    // Skip hidden elements which don't have an offsetParent\n    while (offsetParent === noOffsetParent && element.nextElementSibling) {\n      offsetParent = (element = element.nextElementSibling).offsetParent;\n    }\n\n    var nodeName = offsetParent && offsetParent.nodeName;\n\n    if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n      return element ? element.ownerDocument.documentElement : document.documentElement;\n    }\n\n    // .offsetParent will return the closest TH, TD or TABLE in case\n    // no offsetParent is present, I hate this job...\n    if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n      return getOffsetParent(offsetParent);\n    }\n\n    return offsetParent;\n  }\n\n  function isOffsetContainer(element) {\n    var nodeName = element.nodeName;\n\n    if (nodeName === 'BODY') {\n      return false;\n    }\n    return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n  }\n\n  /**\n   * Finds the root node (document, shadowDOM root) of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} node\n   * @returns {Element} root node\n   */\n  function getRoot(node) {\n    if (node.parentNode !== null) {\n      return getRoot(node.parentNode);\n    }\n\n    return node;\n  }\n\n  /**\n   * Finds the offset parent common to the two provided nodes\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element1\n   * @argument {Element} element2\n   * @returns {Element} common offset parent\n   */\n  function findCommonOffsetParent(element1, element2) {\n    // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n    if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n      return document.documentElement;\n    }\n\n    // Here we make sure to give as \"start\" the element that comes first in the DOM\n    var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n    var start = order ? element1 : element2;\n    var end = order ? element2 : element1;\n\n    // Get common ancestor container\n    var range = document.createRange();\n    range.setStart(start, 0);\n    range.setEnd(end, 0);\n    var commonAncestorContainer = range.commonAncestorContainer;\n\n    // Both nodes are inside #document\n\n    if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n      if (isOffsetContainer(commonAncestorContainer)) {\n        return commonAncestorContainer;\n      }\n\n      return getOffsetParent(commonAncestorContainer);\n    }\n\n    // one of the nodes is inside shadowDOM, find which one\n    var element1root = getRoot(element1);\n    if (element1root.host) {\n      return findCommonOffsetParent(element1root.host, element2);\n    } else {\n      return findCommonOffsetParent(element1, getRoot(element2).host);\n    }\n  }\n\n  /**\n   * Gets the scroll value of the given element in the given side (top and left)\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @argument {String} side `top` or `left`\n   * @returns {number} amount of scrolled pixels\n   */\n  function getScroll(element) {\n    var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n    var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n    var nodeName = element.nodeName;\n\n    if (nodeName === 'BODY' || nodeName === 'HTML') {\n      var html = element.ownerDocument.documentElement;\n      var scrollingElement = element.ownerDocument.scrollingElement || html;\n      return scrollingElement[upperSide];\n    }\n\n    return element[upperSide];\n  }\n\n  /*\n   * Sum or subtract the element scroll values (left and top) from a given rect object\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} rect - Rect object you want to change\n   * @param {HTMLElement} element - The element from the function reads the scroll values\n   * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n   * @return {Object} rect - The modifier rect object\n   */\n  function includeScroll(rect, element) {\n    var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    var scrollTop = getScroll(element, 'top');\n    var scrollLeft = getScroll(element, 'left');\n    var modifier = subtract ? -1 : 1;\n    rect.top += scrollTop * modifier;\n    rect.bottom += scrollTop * modifier;\n    rect.left += scrollLeft * modifier;\n    rect.right += scrollLeft * modifier;\n    return rect;\n  }\n\n  /*\n   * Helper to detect borders of a given element\n   * @method\n   * @memberof Popper.Utils\n   * @param {CSSStyleDeclaration} styles\n   * Result of `getStyleComputedProperty` on the given element\n   * @param {String} axis - `x` or `y`\n   * @return {number} borders - The borders size of the given axis\n   */\n\n  function getBordersSize(styles, axis) {\n    var sideA = axis === 'x' ? 'Left' : 'Top';\n    var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n    return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n  }\n\n  function getSize(axis, body, html, computedStyle) {\n    return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n  }\n\n  function getWindowSizes(document) {\n    var body = document.body;\n    var html = document.documentElement;\n    var computedStyle = isIE(10) && getComputedStyle(html);\n\n    return {\n      height: getSize('Height', body, html, computedStyle),\n      width: getSize('Width', body, html, computedStyle)\n    };\n  }\n\n  var classCallCheck = function (instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  };\n\n  var createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n\n\n\n\n\n  var defineProperty = function (obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  };\n\n  var _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  /**\n   * Given element offsets, generate an output similar to getBoundingClientRect\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Object} offsets\n   * @returns {Object} ClientRect like output\n   */\n  function getClientRect(offsets) {\n    return _extends({}, offsets, {\n      right: offsets.left + offsets.width,\n      bottom: offsets.top + offsets.height\n    });\n  }\n\n  /**\n   * Get bounding client rect of given element\n   * @method\n   * @memberof Popper.Utils\n   * @param {HTMLElement} element\n   * @return {Object} client rect\n   */\n  function getBoundingClientRect(element) {\n    var rect = {};\n\n    // IE10 10 FIX: Please, don't ask, the element isn't\n    // considered in DOM in some circumstances...\n    // This isn't reproducible in IE10 compatibility mode of IE11\n    try {\n      if (isIE(10)) {\n        rect = element.getBoundingClientRect();\n        var scrollTop = getScroll(element, 'top');\n        var scrollLeft = getScroll(element, 'left');\n        rect.top += scrollTop;\n        rect.left += scrollLeft;\n        rect.bottom += scrollTop;\n        rect.right += scrollLeft;\n      } else {\n        rect = element.getBoundingClientRect();\n      }\n    } catch (e) {}\n\n    var result = {\n      left: rect.left,\n      top: rect.top,\n      width: rect.right - rect.left,\n      height: rect.bottom - rect.top\n    };\n\n    // subtract scrollbar size from sizes\n    var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n    var width = sizes.width || element.clientWidth || result.right - result.left;\n    var height = sizes.height || element.clientHeight || result.bottom - result.top;\n\n    var horizScrollbar = element.offsetWidth - width;\n    var vertScrollbar = element.offsetHeight - height;\n\n    // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n    // we make this check conditional for performance reasons\n    if (horizScrollbar || vertScrollbar) {\n      var styles = getStyleComputedProperty(element);\n      horizScrollbar -= getBordersSize(styles, 'x');\n      vertScrollbar -= getBordersSize(styles, 'y');\n\n      result.width -= horizScrollbar;\n      result.height -= vertScrollbar;\n    }\n\n    return getClientRect(result);\n  }\n\n  function getOffsetRectRelativeToArbitraryNode(children, parent) {\n    var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    var isIE10 = isIE(10);\n    var isHTML = parent.nodeName === 'HTML';\n    var childrenRect = getBoundingClientRect(children);\n    var parentRect = getBoundingClientRect(parent);\n    var scrollParent = getScrollParent(children);\n\n    var styles = getStyleComputedProperty(parent);\n    var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n    var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n    // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n    if (fixedPosition && isHTML) {\n      parentRect.top = Math.max(parentRect.top, 0);\n      parentRect.left = Math.max(parentRect.left, 0);\n    }\n    var offsets = getClientRect({\n      top: childrenRect.top - parentRect.top - borderTopWidth,\n      left: childrenRect.left - parentRect.left - borderLeftWidth,\n      width: childrenRect.width,\n      height: childrenRect.height\n    });\n    offsets.marginTop = 0;\n    offsets.marginLeft = 0;\n\n    // Subtract margins of documentElement in case it's being used as parent\n    // we do this only on HTML because it's the only element that behaves\n    // differently when margins are applied to it. The margins are included in\n    // the box of the documentElement, in the other cases not.\n    if (!isIE10 && isHTML) {\n      var marginTop = parseFloat(styles.marginTop, 10);\n      var marginLeft = parseFloat(styles.marginLeft, 10);\n\n      offsets.top -= borderTopWidth - marginTop;\n      offsets.bottom -= borderTopWidth - marginTop;\n      offsets.left -= borderLeftWidth - marginLeft;\n      offsets.right -= borderLeftWidth - marginLeft;\n\n      // Attach marginTop and marginLeft because in some circumstances we may need them\n      offsets.marginTop = marginTop;\n      offsets.marginLeft = marginLeft;\n    }\n\n    if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n      offsets = includeScroll(offsets, parent);\n    }\n\n    return offsets;\n  }\n\n  function getViewportOffsetRectRelativeToArtbitraryNode(element) {\n    var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    var html = element.ownerDocument.documentElement;\n    var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n    var width = Math.max(html.clientWidth, window.innerWidth || 0);\n    var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n    var scrollTop = !excludeScroll ? getScroll(html) : 0;\n    var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n    var offset = {\n      top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n      left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n      width: width,\n      height: height\n    };\n\n    return getClientRect(offset);\n  }\n\n  /**\n   * Check if the given element is fixed or is inside a fixed parent\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @argument {Element} customContainer\n   * @returns {Boolean} answer to \"isFixed?\"\n   */\n  function isFixed(element) {\n    var nodeName = element.nodeName;\n    if (nodeName === 'BODY' || nodeName === 'HTML') {\n      return false;\n    }\n    if (getStyleComputedProperty(element, 'position') === 'fixed') {\n      return true;\n    }\n    var parentNode = getParentNode(element);\n    if (!parentNode) {\n      return false;\n    }\n    return isFixed(parentNode);\n  }\n\n  /**\n   * Finds the first parent of an element that has a transformed property defined\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} first transformed parent or documentElement\n   */\n\n  function getFixedPositionOffsetParent(element) {\n    // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n    if (!element || !element.parentElement || isIE()) {\n      return document.documentElement;\n    }\n    var el = element.parentElement;\n    while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n      el = el.parentElement;\n    }\n    return el || document.documentElement;\n  }\n\n  /**\n   * Computed the boundaries limits and return them\n   * @method\n   * @memberof Popper.Utils\n   * @param {HTMLElement} popper\n   * @param {HTMLElement} reference\n   * @param {number} padding\n   * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n   * @param {Boolean} fixedPosition - Is in fixed position mode\n   * @returns {Object} Coordinates of the boundaries\n   */\n  function getBoundaries(popper, reference, padding, boundariesElement) {\n    var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n    // NOTE: 1 DOM access here\n\n    var boundaries = { top: 0, left: 0 };\n    var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n\n    // Handle viewport case\n    if (boundariesElement === 'viewport') {\n      boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n    } else {\n      // Handle other cases based on DOM element used as boundaries\n      var boundariesNode = void 0;\n      if (boundariesElement === 'scrollParent') {\n        boundariesNode = getScrollParent(getParentNode(reference));\n        if (boundariesNode.nodeName === 'BODY') {\n          boundariesNode = popper.ownerDocument.documentElement;\n        }\n      } else if (boundariesElement === 'window') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      } else {\n        boundariesNode = boundariesElement;\n      }\n\n      var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n      // In case of HTML, we need a different computation\n      if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n        var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n            height = _getWindowSizes.height,\n            width = _getWindowSizes.width;\n\n        boundaries.top += offsets.top - offsets.marginTop;\n        boundaries.bottom = height + offsets.top;\n        boundaries.left += offsets.left - offsets.marginLeft;\n        boundaries.right = width + offsets.left;\n      } else {\n        // for all the other DOM elements, this one is good\n        boundaries = offsets;\n      }\n    }\n\n    // Add paddings\n    padding = padding || 0;\n    var isPaddingNumber = typeof padding === 'number';\n    boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n    boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n    boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n    boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n    return boundaries;\n  }\n\n  function getArea(_ref) {\n    var width = _ref.width,\n        height = _ref.height;\n\n    return width * height;\n  }\n\n  /**\n   * Utility used to transform the `auto` placement to the placement with more\n   * available space.\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n    var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n    if (placement.indexOf('auto') === -1) {\n      return placement;\n    }\n\n    var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n    var rects = {\n      top: {\n        width: boundaries.width,\n        height: refRect.top - boundaries.top\n      },\n      right: {\n        width: boundaries.right - refRect.right,\n        height: boundaries.height\n      },\n      bottom: {\n        width: boundaries.width,\n        height: boundaries.bottom - refRect.bottom\n      },\n      left: {\n        width: refRect.left - boundaries.left,\n        height: boundaries.height\n      }\n    };\n\n    var sortedAreas = Object.keys(rects).map(function (key) {\n      return _extends({\n        key: key\n      }, rects[key], {\n        area: getArea(rects[key])\n      });\n    }).sort(function (a, b) {\n      return b.area - a.area;\n    });\n\n    var filteredAreas = sortedAreas.filter(function (_ref2) {\n      var width = _ref2.width,\n          height = _ref2.height;\n      return width >= popper.clientWidth && height >= popper.clientHeight;\n    });\n\n    var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n    var variation = placement.split('-')[1];\n\n    return computedPlacement + (variation ? '-' + variation : '');\n  }\n\n  /**\n   * Get offsets to the reference element\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} state\n   * @param {Element} popper - the popper element\n   * @param {Element} reference - the reference element (the popper will be relative to this)\n   * @param {Element} fixedPosition - is in fixed position mode\n   * @returns {Object} An object containing the offsets which will be applied to the popper\n   */\n  function getReferenceOffsets(state, popper, reference) {\n    var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n    var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n    return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n  }\n\n  /**\n   * Get the outer sizes of the given element (offset size + margins)\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Object} object containing width and height properties\n   */\n  function getOuterSizes(element) {\n    var window = element.ownerDocument.defaultView;\n    var styles = window.getComputedStyle(element);\n    var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n    var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n    var result = {\n      width: element.offsetWidth + y,\n      height: element.offsetHeight + x\n    };\n    return result;\n  }\n\n  /**\n   * Get the opposite placement of the given one\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement\n   * @returns {String} flipped placement\n   */\n  function getOppositePlacement(placement) {\n    var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n    return placement.replace(/left|right|bottom|top/g, function (matched) {\n      return hash[matched];\n    });\n  }\n\n  /**\n   * Get offsets to the popper\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} position - CSS position the Popper will get applied\n   * @param {HTMLElement} popper - the popper element\n   * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n   * @param {String} placement - one of the valid placement options\n   * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n   */\n  function getPopperOffsets(popper, referenceOffsets, placement) {\n    placement = placement.split('-')[0];\n\n    // Get popper node sizes\n    var popperRect = getOuterSizes(popper);\n\n    // Add position, width and height to our offsets object\n    var popperOffsets = {\n      width: popperRect.width,\n      height: popperRect.height\n    };\n\n    // depending by the popper placement we have to compute its offsets slightly differently\n    var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n    var mainSide = isHoriz ? 'top' : 'left';\n    var secondarySide = isHoriz ? 'left' : 'top';\n    var measurement = isHoriz ? 'height' : 'width';\n    var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n    popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n    if (placement === secondarySide) {\n      popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n    } else {\n      popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n    }\n\n    return popperOffsets;\n  }\n\n  /**\n   * Mimics the `find` method of Array\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Array} arr\n   * @argument prop\n   * @argument value\n   * @returns index or -1\n   */\n  function find(arr, check) {\n    // use native find if supported\n    if (Array.prototype.find) {\n      return arr.find(check);\n    }\n\n    // use `filter` to obtain the same behavior of `find`\n    return arr.filter(check)[0];\n  }\n\n  /**\n   * Return the index of the matching object\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Array} arr\n   * @argument prop\n   * @argument value\n   * @returns index or -1\n   */\n  function findIndex(arr, prop, value) {\n    // use native findIndex if supported\n    if (Array.prototype.findIndex) {\n      return arr.findIndex(function (cur) {\n        return cur[prop] === value;\n      });\n    }\n\n    // use `find` + `indexOf` if `findIndex` isn't supported\n    var match = find(arr, function (obj) {\n      return obj[prop] === value;\n    });\n    return arr.indexOf(match);\n  }\n\n  /**\n   * Loop trough the list of modifiers and run them in order,\n   * each of them will then edit the data object.\n   * @method\n   * @memberof Popper.Utils\n   * @param {dataObject} data\n   * @param {Array} modifiers\n   * @param {String} ends - Optional modifier name used as stopper\n   * @returns {dataObject}\n   */\n  function runModifiers(modifiers, data, ends) {\n    var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n    modifiersToRun.forEach(function (modifier) {\n      if (modifier['function']) {\n        // eslint-disable-line dot-notation\n        console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n      }\n      var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n      if (modifier.enabled && isFunction(fn)) {\n        // Add properties to offsets to make them a complete clientRect object\n        // we do this before each modifier to make sure the previous one doesn't\n        // mess with these values\n        data.offsets.popper = getClientRect(data.offsets.popper);\n        data.offsets.reference = getClientRect(data.offsets.reference);\n\n        data = fn(data, modifier);\n      }\n    });\n\n    return data;\n  }\n\n  /**\n   * Updates the position of the popper, computing the new offsets and applying\n   * the new style.<br />\n   * Prefer `scheduleUpdate` over `update` because of performance reasons.\n   * @method\n   * @memberof Popper\n   */\n  function update() {\n    // if popper is destroyed, don't perform any further update\n    if (this.state.isDestroyed) {\n      return;\n    }\n\n    var data = {\n      instance: this,\n      styles: {},\n      arrowStyles: {},\n      attributes: {},\n      flipped: false,\n      offsets: {}\n    };\n\n    // compute reference element offsets\n    data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n    // compute auto placement, store placement inside the data object,\n    // modifiers will be able to edit `placement` if needed\n    // and refer to originalPlacement to know the original value\n    data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n    // store the computed placement inside `originalPlacement`\n    data.originalPlacement = data.placement;\n\n    data.positionFixed = this.options.positionFixed;\n\n    // compute the popper offsets\n    data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n    data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n    // run the modifiers\n    data = runModifiers(this.modifiers, data);\n\n    // the first `update` will call `onCreate` callback\n    // the other ones will call `onUpdate` callback\n    if (!this.state.isCreated) {\n      this.state.isCreated = true;\n      this.options.onCreate(data);\n    } else {\n      this.options.onUpdate(data);\n    }\n  }\n\n  /**\n   * Helper used to know if the given modifier is enabled.\n   * @method\n   * @memberof Popper.Utils\n   * @returns {Boolean}\n   */\n  function isModifierEnabled(modifiers, modifierName) {\n    return modifiers.some(function (_ref) {\n      var name = _ref.name,\n          enabled = _ref.enabled;\n      return enabled && name === modifierName;\n    });\n  }\n\n  /**\n   * Get the prefixed supported property name\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} property (camelCase)\n   * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n   */\n  function getSupportedPropertyName(property) {\n    var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n    var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n    for (var i = 0; i < prefixes.length; i++) {\n      var prefix = prefixes[i];\n      var toCheck = prefix ? '' + prefix + upperProp : property;\n      if (typeof document.body.style[toCheck] !== 'undefined') {\n        return toCheck;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Destroys the popper.\n   * @method\n   * @memberof Popper\n   */\n  function destroy() {\n    this.state.isDestroyed = true;\n\n    // touch DOM only if `applyStyle` modifier is enabled\n    if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n      this.popper.removeAttribute('x-placement');\n      this.popper.style.position = '';\n      this.popper.style.top = '';\n      this.popper.style.left = '';\n      this.popper.style.right = '';\n      this.popper.style.bottom = '';\n      this.popper.style.willChange = '';\n      this.popper.style[getSupportedPropertyName('transform')] = '';\n    }\n\n    this.disableEventListeners();\n\n    // remove the popper if user explicity asked for the deletion on destroy\n    // do not use `remove` because IE11 doesn't support it\n    if (this.options.removeOnDestroy) {\n      this.popper.parentNode.removeChild(this.popper);\n    }\n    return this;\n  }\n\n  /**\n   * Get the window associated with the element\n   * @argument {Element} element\n   * @returns {Window}\n   */\n  function getWindow(element) {\n    var ownerDocument = element.ownerDocument;\n    return ownerDocument ? ownerDocument.defaultView : window;\n  }\n\n  function attachToScrollParents(scrollParent, event, callback, scrollParents) {\n    var isBody = scrollParent.nodeName === 'BODY';\n    var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n    target.addEventListener(event, callback, { passive: true });\n\n    if (!isBody) {\n      attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n    }\n    scrollParents.push(target);\n  }\n\n  /**\n   * Setup needed event listeners used to update the popper position\n   * @method\n   * @memberof Popper.Utils\n   * @private\n   */\n  function setupEventListeners(reference, options, state, updateBound) {\n    // Resize event listener on window\n    state.updateBound = updateBound;\n    getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n    // Scroll event listener on scroll parents\n    var scrollElement = getScrollParent(reference);\n    attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n    state.scrollElement = scrollElement;\n    state.eventsEnabled = true;\n\n    return state;\n  }\n\n  /**\n   * It will add resize/scroll events and start recalculating\n   * position of the popper element when they are triggered.\n   * @method\n   * @memberof Popper\n   */\n  function enableEventListeners() {\n    if (!this.state.eventsEnabled) {\n      this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n    }\n  }\n\n  /**\n   * Remove event listeners used to update the popper position\n   * @method\n   * @memberof Popper.Utils\n   * @private\n   */\n  function removeEventListeners(reference, state) {\n    // Remove resize event listener on window\n    getWindow(reference).removeEventListener('resize', state.updateBound);\n\n    // Remove scroll event listener on scroll parents\n    state.scrollParents.forEach(function (target) {\n      target.removeEventListener('scroll', state.updateBound);\n    });\n\n    // Reset state\n    state.updateBound = null;\n    state.scrollParents = [];\n    state.scrollElement = null;\n    state.eventsEnabled = false;\n    return state;\n  }\n\n  /**\n   * It will remove resize/scroll events and won't recalculate popper position\n   * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n   * unless you call `update` method manually.\n   * @method\n   * @memberof Popper\n   */\n  function disableEventListeners() {\n    if (this.state.eventsEnabled) {\n      cancelAnimationFrame(this.scheduleUpdate);\n      this.state = removeEventListeners(this.reference, this.state);\n    }\n  }\n\n  /**\n   * Tells if a given input is a number\n   * @method\n   * @memberof Popper.Utils\n   * @param {*} input to check\n   * @return {Boolean}\n   */\n  function isNumeric(n) {\n    return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n  }\n\n  /**\n   * Set the style to the given popper\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element - Element to apply the style to\n   * @argument {Object} styles\n   * Object with a list of properties and values which will be applied to the element\n   */\n  function setStyles(element, styles) {\n    Object.keys(styles).forEach(function (prop) {\n      var unit = '';\n      // add unit if the value is numeric and is one of the following\n      if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n        unit = 'px';\n      }\n      element.style[prop] = styles[prop] + unit;\n    });\n  }\n\n  /**\n   * Set the attributes to the given popper\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element - Element to apply the attributes to\n   * @argument {Object} styles\n   * Object with a list of properties and values which will be applied to the element\n   */\n  function setAttributes(element, attributes) {\n    Object.keys(attributes).forEach(function (prop) {\n      var value = attributes[prop];\n      if (value !== false) {\n        element.setAttribute(prop, attributes[prop]);\n      } else {\n        element.removeAttribute(prop);\n      }\n    });\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} data.styles - List of style properties - values to apply to popper element\n   * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The same data object\n   */\n  function applyStyle(data) {\n    // any property present in `data.styles` will be applied to the popper,\n    // in this way we can make the 3rd party modifiers add custom styles to it\n    // Be aware, modifiers could override the properties defined in the previous\n    // lines of this modifier!\n    setStyles(data.instance.popper, data.styles);\n\n    // any property present in `data.attributes` will be applied to the popper,\n    // they will be set as HTML attributes of the element\n    setAttributes(data.instance.popper, data.attributes);\n\n    // if arrowElement is defined and arrowStyles has some properties\n    if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n      setStyles(data.arrowElement, data.arrowStyles);\n    }\n\n    return data;\n  }\n\n  /**\n   * Set the x-placement attribute before everything else because it could be used\n   * to add margins to the popper margins needs to be calculated to get the\n   * correct popper offsets.\n   * @method\n   * @memberof Popper.modifiers\n   * @param {HTMLElement} reference - The reference element used to position the popper\n   * @param {HTMLElement} popper - The HTML element used as popper\n   * @param {Object} options - Popper.js options\n   */\n  function applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n    // compute reference element offsets\n    var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n    // compute auto placement, store placement inside the data object,\n    // modifiers will be able to edit `placement` if needed\n    // and refer to originalPlacement to know the original value\n    var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n    popper.setAttribute('x-placement', placement);\n\n    // Apply `position` to popper before anything else because\n    // without the position applied we can't guarantee correct computations\n    setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n    return options;\n  }\n\n  /**\n   * @function\n   * @memberof Popper.Utils\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n   * @returns {Object} The popper's position offsets rounded\n   *\n   * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n   * good as it can be within reason.\n   * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n   *\n   * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n   * as well on High DPI screens).\n   *\n   * Firefox prefers no rounding for positioning and does not have blurriness on\n   * high DPI screens.\n   *\n   * Only horizontal placement and left/right values need to be considered.\n   */\n  function getRoundedOffsets(data, shouldRound) {\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n    var round = Math.round,\n        floor = Math.floor;\n\n    var noRound = function noRound(v) {\n      return v;\n    };\n\n    var referenceWidth = round(reference.width);\n    var popperWidth = round(popper.width);\n\n    var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n    var isVariation = data.placement.indexOf('-') !== -1;\n    var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n    var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n    var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n    var verticalToInteger = !shouldRound ? noRound : round;\n\n    return {\n      left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n      top: verticalToInteger(popper.top),\n      bottom: verticalToInteger(popper.bottom),\n      right: horizontalToInteger(popper.right)\n    };\n  }\n\n  var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function computeStyle(data, options) {\n    var x = options.x,\n        y = options.y;\n    var popper = data.offsets.popper;\n\n    // Remove this legacy support in Popper.js v2\n\n    var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n      return modifier.name === 'applyStyle';\n    }).gpuAcceleration;\n    if (legacyGpuAccelerationOption !== undefined) {\n      console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n    }\n    var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n    var offsetParent = getOffsetParent(data.instance.popper);\n    var offsetParentRect = getBoundingClientRect(offsetParent);\n\n    // Styles\n    var styles = {\n      position: popper.position\n    };\n\n    var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n    var sideA = x === 'bottom' ? 'top' : 'bottom';\n    var sideB = y === 'right' ? 'left' : 'right';\n\n    // if gpuAcceleration is set to `true` and transform is supported,\n    //  we use `translate3d` to apply the position to the popper we\n    // automatically use the supported prefixed version if needed\n    var prefixedProperty = getSupportedPropertyName('transform');\n\n    // now, let's make a step back and look at this code closely (wtf?)\n    // If the content of the popper grows once it's been positioned, it\n    // may happen that the popper gets misplaced because of the new content\n    // overflowing its reference element\n    // To avoid this problem, we provide two options (x and y), which allow\n    // the consumer to define the offset origin.\n    // If we position a popper on top of a reference element, we can set\n    // `x` to `top` to make the popper grow towards its top instead of\n    // its bottom.\n    var left = void 0,\n        top = void 0;\n    if (sideA === 'bottom') {\n      // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n      // and not the bottom of the html element\n      if (offsetParent.nodeName === 'HTML') {\n        top = -offsetParent.clientHeight + offsets.bottom;\n      } else {\n        top = -offsetParentRect.height + offsets.bottom;\n      }\n    } else {\n      top = offsets.top;\n    }\n    if (sideB === 'right') {\n      if (offsetParent.nodeName === 'HTML') {\n        left = -offsetParent.clientWidth + offsets.right;\n      } else {\n        left = -offsetParentRect.width + offsets.right;\n      }\n    } else {\n      left = offsets.left;\n    }\n    if (gpuAcceleration && prefixedProperty) {\n      styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n      styles[sideA] = 0;\n      styles[sideB] = 0;\n      styles.willChange = 'transform';\n    } else {\n      // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n      var invertTop = sideA === 'bottom' ? -1 : 1;\n      var invertLeft = sideB === 'right' ? -1 : 1;\n      styles[sideA] = top * invertTop;\n      styles[sideB] = left * invertLeft;\n      styles.willChange = sideA + ', ' + sideB;\n    }\n\n    // Attributes\n    var attributes = {\n      'x-placement': data.placement\n    };\n\n    // Update `data` attributes, styles and arrowStyles\n    data.attributes = _extends({}, attributes, data.attributes);\n    data.styles = _extends({}, styles, data.styles);\n    data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n    return data;\n  }\n\n  /**\n   * Helper used to know if the given modifier depends from another one.<br />\n   * It checks if the needed modifier is listed and enabled.\n   * @method\n   * @memberof Popper.Utils\n   * @param {Array} modifiers - list of modifiers\n   * @param {String} requestingName - name of requesting modifier\n   * @param {String} requestedName - name of requested modifier\n   * @returns {Boolean}\n   */\n  function isModifierRequired(modifiers, requestingName, requestedName) {\n    var requesting = find(modifiers, function (_ref) {\n      var name = _ref.name;\n      return name === requestingName;\n    });\n\n    var isRequired = !!requesting && modifiers.some(function (modifier) {\n      return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n    });\n\n    if (!isRequired) {\n      var _requesting = '`' + requestingName + '`';\n      var requested = '`' + requestedName + '`';\n      console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n    }\n    return isRequired;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function arrow(data, options) {\n    var _data$offsets$arrow;\n\n    // arrow depends on keepTogether in order to work\n    if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n      return data;\n    }\n\n    var arrowElement = options.element;\n\n    // if arrowElement is a string, suppose it's a CSS selector\n    if (typeof arrowElement === 'string') {\n      arrowElement = data.instance.popper.querySelector(arrowElement);\n\n      // if arrowElement is not found, don't run the modifier\n      if (!arrowElement) {\n        return data;\n      }\n    } else {\n      // if the arrowElement isn't a query selector we must check that the\n      // provided DOM node is child of its popper node\n      if (!data.instance.popper.contains(arrowElement)) {\n        console.warn('WARNING: `arrow.element` must be child of its popper element!');\n        return data;\n      }\n    }\n\n    var placement = data.placement.split('-')[0];\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n    var len = isVertical ? 'height' : 'width';\n    var sideCapitalized = isVertical ? 'Top' : 'Left';\n    var side = sideCapitalized.toLowerCase();\n    var altSide = isVertical ? 'left' : 'top';\n    var opSide = isVertical ? 'bottom' : 'right';\n    var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n    //\n    // extends keepTogether behavior making sure the popper and its\n    // reference have enough pixels in conjunction\n    //\n\n    // top/left side\n    if (reference[opSide] - arrowElementSize < popper[side]) {\n      data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n    }\n    // bottom/right side\n    if (reference[side] + arrowElementSize > popper[opSide]) {\n      data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n    }\n    data.offsets.popper = getClientRect(data.offsets.popper);\n\n    // compute center of the popper\n    var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n    // Compute the sideValue using the updated popper offsets\n    // take popper margin in account because we don't have this info available\n    var css = getStyleComputedProperty(data.instance.popper);\n    var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n    var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n    var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n    // prevent arrowElement from being placed not contiguously to its popper\n    sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n    data.arrowElement = arrowElement;\n    data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n    return data;\n  }\n\n  /**\n   * Get the opposite placement variation of the given one\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement variation\n   * @returns {String} flipped placement variation\n   */\n  function getOppositeVariation(variation) {\n    if (variation === 'end') {\n      return 'start';\n    } else if (variation === 'start') {\n      return 'end';\n    }\n    return variation;\n  }\n\n  /**\n   * List of accepted placements to use as values of the `placement` option.<br />\n   * Valid placements are:\n   * - `auto`\n   * - `top`\n   * - `right`\n   * - `bottom`\n   * - `left`\n   *\n   * Each placement can have a variation from this list:\n   * - `-start`\n   * - `-end`\n   *\n   * Variations are interpreted easily if you think of them as the left to right\n   * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n   * is right.<br />\n   * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n   *\n   * Some valid examples are:\n   * - `top-end` (on top of reference, right aligned)\n   * - `right-start` (on right of reference, top aligned)\n   * - `bottom` (on bottom, centered)\n   * - `auto-end` (on the side with more space available, alignment depends by placement)\n   *\n   * @static\n   * @type {Array}\n   * @enum {String}\n   * @readonly\n   * @method placements\n   * @memberof Popper\n   */\n  var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n  // Get rid of `auto` `auto-start` and `auto-end`\n  var validPlacements = placements.slice(3);\n\n  /**\n   * Given an initial placement, returns all the subsequent placements\n   * clockwise (or counter-clockwise).\n   *\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement - A valid placement (it accepts variations)\n   * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n   * @returns {Array} placements including their variations\n   */\n  function clockwise(placement) {\n    var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    var index = validPlacements.indexOf(placement);\n    var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n    return counter ? arr.reverse() : arr;\n  }\n\n  var BEHAVIORS = {\n    FLIP: 'flip',\n    CLOCKWISE: 'clockwise',\n    COUNTERCLOCKWISE: 'counterclockwise'\n  };\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function flip(data, options) {\n    // if `inner` modifier is enabled, we can't use the `flip` modifier\n    if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n      return data;\n    }\n\n    if (data.flipped && data.placement === data.originalPlacement) {\n      // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n      return data;\n    }\n\n    var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n    var placement = data.placement.split('-')[0];\n    var placementOpposite = getOppositePlacement(placement);\n    var variation = data.placement.split('-')[1] || '';\n\n    var flipOrder = [];\n\n    switch (options.behavior) {\n      case BEHAVIORS.FLIP:\n        flipOrder = [placement, placementOpposite];\n        break;\n      case BEHAVIORS.CLOCKWISE:\n        flipOrder = clockwise(placement);\n        break;\n      case BEHAVIORS.COUNTERCLOCKWISE:\n        flipOrder = clockwise(placement, true);\n        break;\n      default:\n        flipOrder = options.behavior;\n    }\n\n    flipOrder.forEach(function (step, index) {\n      if (placement !== step || flipOrder.length === index + 1) {\n        return data;\n      }\n\n      placement = data.placement.split('-')[0];\n      placementOpposite = getOppositePlacement(placement);\n\n      var popperOffsets = data.offsets.popper;\n      var refOffsets = data.offsets.reference;\n\n      // using floor because the reference offsets may contain decimals we are not going to consider here\n      var floor = Math.floor;\n      var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n      var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n      var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n      var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n      var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n      var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n      // flip the variation if required\n      var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n      var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n      if (overlapsRef || overflowsBoundaries || flippedVariation) {\n        // this boolean to detect any flip loop\n        data.flipped = true;\n\n        if (overlapsRef || overflowsBoundaries) {\n          placement = flipOrder[index + 1];\n        }\n\n        if (flippedVariation) {\n          variation = getOppositeVariation(variation);\n        }\n\n        data.placement = placement + (variation ? '-' + variation : '');\n\n        // this object contains `position`, we want to preserve it along with\n        // any additional property we may add in the future\n        data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n        data = runModifiers(data.instance.modifiers, data, 'flip');\n      }\n    });\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function keepTogether(data) {\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var placement = data.placement.split('-')[0];\n    var floor = Math.floor;\n    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n    var side = isVertical ? 'right' : 'bottom';\n    var opSide = isVertical ? 'left' : 'top';\n    var measurement = isVertical ? 'width' : 'height';\n\n    if (popper[side] < floor(reference[opSide])) {\n      data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n    }\n    if (popper[opSide] > floor(reference[side])) {\n      data.offsets.popper[opSide] = floor(reference[side]);\n    }\n\n    return data;\n  }\n\n  /**\n   * Converts a string containing value + unit into a px value number\n   * @function\n   * @memberof {modifiers~offset}\n   * @private\n   * @argument {String} str - Value + unit string\n   * @argument {String} measurement - `height` or `width`\n   * @argument {Object} popperOffsets\n   * @argument {Object} referenceOffsets\n   * @returns {Number|String}\n   * Value in pixels, or original string if no values were extracted\n   */\n  function toValue(str, measurement, popperOffsets, referenceOffsets) {\n    // separate value from unit\n    var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n    var value = +split[1];\n    var unit = split[2];\n\n    // If it's not a number it's an operator, I guess\n    if (!value) {\n      return str;\n    }\n\n    if (unit.indexOf('%') === 0) {\n      var element = void 0;\n      switch (unit) {\n        case '%p':\n          element = popperOffsets;\n          break;\n        case '%':\n        case '%r':\n        default:\n          element = referenceOffsets;\n      }\n\n      var rect = getClientRect(element);\n      return rect[measurement] / 100 * value;\n    } else if (unit === 'vh' || unit === 'vw') {\n      // if is a vh or vw, we calculate the size based on the viewport\n      var size = void 0;\n      if (unit === 'vh') {\n        size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n      } else {\n        size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n      }\n      return size / 100 * value;\n    } else {\n      // if is an explicit pixel unit, we get rid of the unit and keep the value\n      // if is an implicit unit, it's px, and we return just the value\n      return value;\n    }\n  }\n\n  /**\n   * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n   * @function\n   * @memberof {modifiers~offset}\n   * @private\n   * @argument {String} offset\n   * @argument {Object} popperOffsets\n   * @argument {Object} referenceOffsets\n   * @argument {String} basePlacement\n   * @returns {Array} a two cells array with x and y offsets in numbers\n   */\n  function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n    var offsets = [0, 0];\n\n    // Use height if placement is left or right and index is 0 otherwise use width\n    // in this way the first offset will use an axis and the second one\n    // will use the other one\n    var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n    // Split the offset string to obtain a list of values and operands\n    // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n    var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n      return frag.trim();\n    });\n\n    // Detect if the offset string contains a pair of values or a single one\n    // they could be separated by comma or space\n    var divider = fragments.indexOf(find(fragments, function (frag) {\n      return frag.search(/,|\\s/) !== -1;\n    }));\n\n    if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n      console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n    }\n\n    // If divider is found, we divide the list of values and operands to divide\n    // them by ofset X and Y.\n    var splitRegex = /\\s*,\\s*|\\s+/;\n    var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n    // Convert the values with units to absolute pixels to allow our computations\n    ops = ops.map(function (op, index) {\n      // Most of the units rely on the orientation of the popper\n      var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n      var mergeWithPrevious = false;\n      return op\n      // This aggregates any `+` or `-` sign that aren't considered operators\n      // e.g.: 10 + +5 => [10, +, +5]\n      .reduce(function (a, b) {\n        if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n          a[a.length - 1] = b;\n          mergeWithPrevious = true;\n          return a;\n        } else if (mergeWithPrevious) {\n          a[a.length - 1] += b;\n          mergeWithPrevious = false;\n          return a;\n        } else {\n          return a.concat(b);\n        }\n      }, [])\n      // Here we convert the string values into number values (in px)\n      .map(function (str) {\n        return toValue(str, measurement, popperOffsets, referenceOffsets);\n      });\n    });\n\n    // Loop trough the offsets arrays and execute the operations\n    ops.forEach(function (op, index) {\n      op.forEach(function (frag, index2) {\n        if (isNumeric(frag)) {\n          offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n        }\n      });\n    });\n    return offsets;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @argument {Number|String} options.offset=0\n   * The offset value as described in the modifier description\n   * @returns {Object} The data object, properly modified\n   */\n  function offset(data, _ref) {\n    var offset = _ref.offset;\n    var placement = data.placement,\n        _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var basePlacement = placement.split('-')[0];\n\n    var offsets = void 0;\n    if (isNumeric(+offset)) {\n      offsets = [+offset, 0];\n    } else {\n      offsets = parseOffset(offset, popper, reference, basePlacement);\n    }\n\n    if (basePlacement === 'left') {\n      popper.top += offsets[0];\n      popper.left -= offsets[1];\n    } else if (basePlacement === 'right') {\n      popper.top += offsets[0];\n      popper.left += offsets[1];\n    } else if (basePlacement === 'top') {\n      popper.left += offsets[0];\n      popper.top -= offsets[1];\n    } else if (basePlacement === 'bottom') {\n      popper.left += offsets[0];\n      popper.top += offsets[1];\n    }\n\n    data.popper = popper;\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function preventOverflow(data, options) {\n    var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n    // If offsetParent is the reference element, we really want to\n    // go one step up and use the next offsetParent as reference to\n    // avoid to make this modifier completely useless and look like broken\n    if (data.instance.reference === boundariesElement) {\n      boundariesElement = getOffsetParent(boundariesElement);\n    }\n\n    // NOTE: DOM access here\n    // resets the popper's position so that the document size can be calculated excluding\n    // the size of the popper element itself\n    var transformProp = getSupportedPropertyName('transform');\n    var popperStyles = data.instance.popper.style; // assignment to help minification\n    var top = popperStyles.top,\n        left = popperStyles.left,\n        transform = popperStyles[transformProp];\n\n    popperStyles.top = '';\n    popperStyles.left = '';\n    popperStyles[transformProp] = '';\n\n    var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n    // NOTE: DOM access here\n    // restores the original style properties after the offsets have been computed\n    popperStyles.top = top;\n    popperStyles.left = left;\n    popperStyles[transformProp] = transform;\n\n    options.boundaries = boundaries;\n\n    var order = options.priority;\n    var popper = data.offsets.popper;\n\n    var check = {\n      primary: function primary(placement) {\n        var value = popper[placement];\n        if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n          value = Math.max(popper[placement], boundaries[placement]);\n        }\n        return defineProperty({}, placement, value);\n      },\n      secondary: function secondary(placement) {\n        var mainSide = placement === 'right' ? 'left' : 'top';\n        var value = popper[mainSide];\n        if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n          value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n        }\n        return defineProperty({}, mainSide, value);\n      }\n    };\n\n    order.forEach(function (placement) {\n      var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n      popper = _extends({}, popper, check[side](placement));\n    });\n\n    data.offsets.popper = popper;\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function shift(data) {\n    var placement = data.placement;\n    var basePlacement = placement.split('-')[0];\n    var shiftvariation = placement.split('-')[1];\n\n    // if shift shiftvariation is specified, run the modifier\n    if (shiftvariation) {\n      var _data$offsets = data.offsets,\n          reference = _data$offsets.reference,\n          popper = _data$offsets.popper;\n\n      var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n      var side = isVertical ? 'left' : 'top';\n      var measurement = isVertical ? 'width' : 'height';\n\n      var shiftOffsets = {\n        start: defineProperty({}, side, reference[side]),\n        end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n      };\n\n      data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n    }\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function hide(data) {\n    if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n      return data;\n    }\n\n    var refRect = data.offsets.reference;\n    var bound = find(data.instance.modifiers, function (modifier) {\n      return modifier.name === 'preventOverflow';\n    }).boundaries;\n\n    if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n      // Avoid unnecessary DOM access if visibility hasn't changed\n      if (data.hide === true) {\n        return data;\n      }\n\n      data.hide = true;\n      data.attributes['x-out-of-boundaries'] = '';\n    } else {\n      // Avoid unnecessary DOM access if visibility hasn't changed\n      if (data.hide === false) {\n        return data;\n      }\n\n      data.hide = false;\n      data.attributes['x-out-of-boundaries'] = false;\n    }\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function inner(data) {\n    var placement = data.placement;\n    var basePlacement = placement.split('-')[0];\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n    var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n    popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n    data.placement = getOppositePlacement(placement);\n    data.offsets.popper = getClientRect(popper);\n\n    return data;\n  }\n\n  /**\n   * Modifier function, each modifier can have a function of this type assigned\n   * to its `fn` property.<br />\n   * These functions will be called on each update, this means that you must\n   * make sure they are performant enough to avoid performance bottlenecks.\n   *\n   * @function ModifierFn\n   * @argument {dataObject} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {dataObject} The data object, properly modified\n   */\n\n  /**\n   * Modifiers are plugins used to alter the behavior of your poppers.<br />\n   * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n   * needed by the library.\n   *\n   * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n   * All the other properties are configurations that could be tweaked.\n   * @namespace modifiers\n   */\n  var modifiers = {\n    /**\n     * Modifier used to shift the popper on the start or end of its reference\n     * element.<br />\n     * It will read the variation of the `placement` property.<br />\n     * It can be one either `-end` or `-start`.\n     * @memberof modifiers\n     * @inner\n     */\n    shift: {\n      /** @prop {number} order=100 - Index used to define the order of execution */\n      order: 100,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: shift\n    },\n\n    /**\n     * The `offset` modifier can shift your popper on both its axis.\n     *\n     * It accepts the following units:\n     * - `px` or unit-less, interpreted as pixels\n     * - `%` or `%r`, percentage relative to the length of the reference element\n     * - `%p`, percentage relative to the length of the popper element\n     * - `vw`, CSS viewport width unit\n     * - `vh`, CSS viewport height unit\n     *\n     * For length is intended the main axis relative to the placement of the popper.<br />\n     * This means that if the placement is `top` or `bottom`, the length will be the\n     * `width`. In case of `left` or `right`, it will be the `height`.\n     *\n     * You can provide a single value (as `Number` or `String`), or a pair of values\n     * as `String` divided by a comma or one (or more) white spaces.<br />\n     * The latter is a deprecated method because it leads to confusion and will be\n     * removed in v2.<br />\n     * Additionally, it accepts additions and subtractions between different units.\n     * Note that multiplications and divisions aren't supported.\n     *\n     * Valid examples are:\n     * ```\n     * 10\n     * '10%'\n     * '10, 10'\n     * '10%, 10'\n     * '10 + 10%'\n     * '10 - 5vh + 3%'\n     * '-10px + 5vh, 5px - 6%'\n     * ```\n     * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n     * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n     * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    offset: {\n      /** @prop {number} order=200 - Index used to define the order of execution */\n      order: 200,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: offset,\n      /** @prop {Number|String} offset=0\n       * The offset value as described in the modifier description\n       */\n      offset: 0\n    },\n\n    /**\n     * Modifier used to prevent the popper from being positioned outside the boundary.\n     *\n     * A scenario exists where the reference itself is not within the boundaries.<br />\n     * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n     * In this case we need to decide whether the popper should either:\n     *\n     * - detach from the reference and remain \"trapped\" in the boundaries, or\n     * - if it should ignore the boundary and \"escape with its reference\"\n     *\n     * When `escapeWithReference` is set to`true` and reference is completely\n     * outside its boundaries, the popper will overflow (or completely leave)\n     * the boundaries in order to remain attached to the edge of the reference.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    preventOverflow: {\n      /** @prop {number} order=300 - Index used to define the order of execution */\n      order: 300,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: preventOverflow,\n      /**\n       * @prop {Array} [priority=['left','right','top','bottom']]\n       * Popper will try to prevent overflow following these priorities by default,\n       * then, it could overflow on the left and on top of the `boundariesElement`\n       */\n      priority: ['left', 'right', 'top', 'bottom'],\n      /**\n       * @prop {number} padding=5\n       * Amount of pixel used to define a minimum distance between the boundaries\n       * and the popper. This makes sure the popper always has a little padding\n       * between the edges of its container\n       */\n      padding: 5,\n      /**\n       * @prop {String|HTMLElement} boundariesElement='scrollParent'\n       * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n       * `viewport` or any DOM element.\n       */\n      boundariesElement: 'scrollParent'\n    },\n\n    /**\n     * Modifier used to make sure the reference and its popper stay near each other\n     * without leaving any gap between the two. Especially useful when the arrow is\n     * enabled and you want to ensure that it points to its reference element.\n     * It cares only about the first axis. You can still have poppers with margin\n     * between the popper and its reference element.\n     * @memberof modifiers\n     * @inner\n     */\n    keepTogether: {\n      /** @prop {number} order=400 - Index used to define the order of execution */\n      order: 400,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: keepTogether\n    },\n\n    /**\n     * This modifier is used to move the `arrowElement` of the popper to make\n     * sure it is positioned between the reference element and its popper element.\n     * It will read the outer size of the `arrowElement` node to detect how many\n     * pixels of conjunction are needed.\n     *\n     * It has no effect if no `arrowElement` is provided.\n     * @memberof modifiers\n     * @inner\n     */\n    arrow: {\n      /** @prop {number} order=500 - Index used to define the order of execution */\n      order: 500,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: arrow,\n      /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n      element: '[x-arrow]'\n    },\n\n    /**\n     * Modifier used to flip the popper's placement when it starts to overlap its\n     * reference element.\n     *\n     * Requires the `preventOverflow` modifier before it in order to work.\n     *\n     * **NOTE:** this modifier will interrupt the current update cycle and will\n     * restart it if it detects the need to flip the placement.\n     * @memberof modifiers\n     * @inner\n     */\n    flip: {\n      /** @prop {number} order=600 - Index used to define the order of execution */\n      order: 600,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: flip,\n      /**\n       * @prop {String|Array} behavior='flip'\n       * The behavior used to change the popper's placement. It can be one of\n       * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n       * placements (with optional variations)\n       */\n      behavior: 'flip',\n      /**\n       * @prop {number} padding=5\n       * The popper will flip if it hits the edges of the `boundariesElement`\n       */\n      padding: 5,\n      /**\n       * @prop {String|HTMLElement} boundariesElement='viewport'\n       * The element which will define the boundaries of the popper position.\n       * The popper will never be placed outside of the defined boundaries\n       * (except if `keepTogether` is enabled)\n       */\n      boundariesElement: 'viewport'\n    },\n\n    /**\n     * Modifier used to make the popper flow toward the inner of the reference element.\n     * By default, when this modifier is disabled, the popper will be placed outside\n     * the reference element.\n     * @memberof modifiers\n     * @inner\n     */\n    inner: {\n      /** @prop {number} order=700 - Index used to define the order of execution */\n      order: 700,\n      /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n      enabled: false,\n      /** @prop {ModifierFn} */\n      fn: inner\n    },\n\n    /**\n     * Modifier used to hide the popper when its reference element is outside of the\n     * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n     * be used to hide with a CSS selector the popper when its reference is\n     * out of boundaries.\n     *\n     * Requires the `preventOverflow` modifier before it in order to work.\n     * @memberof modifiers\n     * @inner\n     */\n    hide: {\n      /** @prop {number} order=800 - Index used to define the order of execution */\n      order: 800,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: hide\n    },\n\n    /**\n     * Computes the style that will be applied to the popper element to gets\n     * properly positioned.\n     *\n     * Note that this modifier will not touch the DOM, it just prepares the styles\n     * so that `applyStyle` modifier can apply it. This separation is useful\n     * in case you need to replace `applyStyle` with a custom implementation.\n     *\n     * This modifier has `850` as `order` value to maintain backward compatibility\n     * with previous versions of Popper.js. Expect the modifiers ordering method\n     * to change in future major versions of the library.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    computeStyle: {\n      /** @prop {number} order=850 - Index used to define the order of execution */\n      order: 850,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: computeStyle,\n      /**\n       * @prop {Boolean} gpuAcceleration=true\n       * If true, it uses the CSS 3D transformation to position the popper.\n       * Otherwise, it will use the `top` and `left` properties\n       */\n      gpuAcceleration: true,\n      /**\n       * @prop {string} [x='bottom']\n       * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n       * Change this if your popper should grow in a direction different from `bottom`\n       */\n      x: 'bottom',\n      /**\n       * @prop {string} [x='left']\n       * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n       * Change this if your popper should grow in a direction different from `right`\n       */\n      y: 'right'\n    },\n\n    /**\n     * Applies the computed styles to the popper element.\n     *\n     * All the DOM manipulations are limited to this modifier. This is useful in case\n     * you want to integrate Popper.js inside a framework or view library and you\n     * want to delegate all the DOM manipulations to it.\n     *\n     * Note that if you disable this modifier, you must make sure the popper element\n     * has its position set to `absolute` before Popper.js can do its work!\n     *\n     * Just disable this modifier and define your own to achieve the desired effect.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    applyStyle: {\n      /** @prop {number} order=900 - Index used to define the order of execution */\n      order: 900,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: applyStyle,\n      /** @prop {Function} */\n      onLoad: applyStyleOnLoad,\n      /**\n       * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n       * @prop {Boolean} gpuAcceleration=true\n       * If true, it uses the CSS 3D transformation to position the popper.\n       * Otherwise, it will use the `top` and `left` properties\n       */\n      gpuAcceleration: undefined\n    }\n  };\n\n  /**\n   * The `dataObject` is an object containing all the information used by Popper.js.\n   * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n   * @name dataObject\n   * @property {Object} data.instance The Popper.js instance\n   * @property {String} data.placement Placement applied to popper\n   * @property {String} data.originalPlacement Placement originally defined on init\n   * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n   * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n   * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n   * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n   * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n   * @property {Object} data.boundaries Offsets of the popper boundaries\n   * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n   * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n   * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n   * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n   */\n\n  /**\n   * Default options provided to Popper.js constructor.<br />\n   * These can be overridden using the `options` argument of Popper.js.<br />\n   * To override an option, simply pass an object with the same\n   * structure of the `options` object, as the 3rd argument. For example:\n   * ```\n   * new Popper(ref, pop, {\n   *   modifiers: {\n   *     preventOverflow: { enabled: false }\n   *   }\n   * })\n   * ```\n   * @type {Object}\n   * @static\n   * @memberof Popper\n   */\n  var Defaults = {\n    /**\n     * Popper's placement.\n     * @prop {Popper.placements} placement='bottom'\n     */\n    placement: 'bottom',\n\n    /**\n     * Set this to true if you want popper to position it self in 'fixed' mode\n     * @prop {Boolean} positionFixed=false\n     */\n    positionFixed: false,\n\n    /**\n     * Whether events (resize, scroll) are initially enabled.\n     * @prop {Boolean} eventsEnabled=true\n     */\n    eventsEnabled: true,\n\n    /**\n     * Set to true if you want to automatically remove the popper when\n     * you call the `destroy` method.\n     * @prop {Boolean} removeOnDestroy=false\n     */\n    removeOnDestroy: false,\n\n    /**\n     * Callback called when the popper is created.<br />\n     * By default, it is set to no-op.<br />\n     * Access Popper.js instance with `data.instance`.\n     * @prop {onCreate}\n     */\n    onCreate: function onCreate() {},\n\n    /**\n     * Callback called when the popper is updated. This callback is not called\n     * on the initialization/creation of the popper, but only on subsequent\n     * updates.<br />\n     * By default, it is set to no-op.<br />\n     * Access Popper.js instance with `data.instance`.\n     * @prop {onUpdate}\n     */\n    onUpdate: function onUpdate() {},\n\n    /**\n     * List of modifiers used to modify the offsets before they are applied to the popper.\n     * They provide most of the functionalities of Popper.js.\n     * @prop {modifiers}\n     */\n    modifiers: modifiers\n  };\n\n  /**\n   * @callback onCreate\n   * @param {dataObject} data\n   */\n\n  /**\n   * @callback onUpdate\n   * @param {dataObject} data\n   */\n\n  // Utils\n  // Methods\n  var Popper = function () {\n    /**\n     * Creates a new Popper.js instance.\n     * @class Popper\n     * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper\n     * @param {HTMLElement} popper - The HTML element used as the popper\n     * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n     * @return {Object} instance - The generated Popper.js instance\n     */\n    function Popper(reference, popper) {\n      var _this = this;\n\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      classCallCheck(this, Popper);\n\n      this.scheduleUpdate = function () {\n        return requestAnimationFrame(_this.update);\n      };\n\n      // make update() debounced, so that it only runs at most once-per-tick\n      this.update = debounce(this.update.bind(this));\n\n      // with {} we create a new object with the options inside it\n      this.options = _extends({}, Popper.Defaults, options);\n\n      // init state\n      this.state = {\n        isDestroyed: false,\n        isCreated: false,\n        scrollParents: []\n      };\n\n      // get reference and popper elements (allow jQuery wrappers)\n      this.reference = reference && reference.jquery ? reference[0] : reference;\n      this.popper = popper && popper.jquery ? popper[0] : popper;\n\n      // Deep merge modifiers options\n      this.options.modifiers = {};\n      Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n        _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n      });\n\n      // Refactoring modifiers' list (Object => Array)\n      this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n        return _extends({\n          name: name\n        }, _this.options.modifiers[name]);\n      })\n      // sort the modifiers by order\n      .sort(function (a, b) {\n        return a.order - b.order;\n      });\n\n      // modifiers have the ability to execute arbitrary code when Popper.js get inited\n      // such code is executed in the same order of its modifier\n      // they could add new properties to their options configuration\n      // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n      this.modifiers.forEach(function (modifierOptions) {\n        if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n          modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n        }\n      });\n\n      // fire the first update to position the popper in the right place\n      this.update();\n\n      var eventsEnabled = this.options.eventsEnabled;\n      if (eventsEnabled) {\n        // setup event listeners, they will take care of update the position in specific situations\n        this.enableEventListeners();\n      }\n\n      this.state.eventsEnabled = eventsEnabled;\n    }\n\n    // We can't use class properties because they don't get listed in the\n    // class prototype and break stuff like Sinon stubs\n\n\n    createClass(Popper, [{\n      key: 'update',\n      value: function update$$1() {\n        return update.call(this);\n      }\n    }, {\n      key: 'destroy',\n      value: function destroy$$1() {\n        return destroy.call(this);\n      }\n    }, {\n      key: 'enableEventListeners',\n      value: function enableEventListeners$$1() {\n        return enableEventListeners.call(this);\n      }\n    }, {\n      key: 'disableEventListeners',\n      value: function disableEventListeners$$1() {\n        return disableEventListeners.call(this);\n      }\n\n      /**\n       * Schedules an update. It will run on the next UI update available.\n       * @method scheduleUpdate\n       * @memberof Popper\n       */\n\n\n      /**\n       * Collection of utilities useful when writing custom modifiers.\n       * Starting from version 1.7, this method is available only if you\n       * include `popper-utils.js` before `popper.js`.\n       *\n       * **DEPRECATION**: This way to access PopperUtils is deprecated\n       * and will be removed in v2! Use the PopperUtils module directly instead.\n       * Due to the high instability of the methods contained in Utils, we can't\n       * guarantee them to follow semver. Use them at your own risk!\n       * @static\n       * @private\n       * @type {Object}\n       * @deprecated since version 1.8\n       * @member Utils\n       * @memberof Popper\n       */\n\n    }]);\n    return Popper;\n  }();\n\n  /**\n   * The `referenceObject` is an object that provides an interface compatible with Popper.js\n   * and lets you use it as replacement of a real DOM node.<br />\n   * You can use this method to position a popper relatively to a set of coordinates\n   * in case you don't have a DOM node to use as reference.\n   *\n   * ```\n   * new Popper(referenceObject, popperNode);\n   * ```\n   *\n   * NB: This feature isn't supported in Internet Explorer 10.\n   * @name referenceObject\n   * @property {Function} data.getBoundingClientRect\n   * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n   * @property {number} data.clientWidth\n   * An ES6 getter that will return the width of the virtual reference element.\n   * @property {number} data.clientHeight\n   * An ES6 getter that will return the height of the virtual reference element.\n   */\n\n\n  Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\n  Popper.placements = placements;\n  Popper.Defaults = Defaults;\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$4 = 'dropdown';\n  var VERSION$4 = '4.3.1';\n  var DATA_KEY$4 = 'bs.dropdown';\n  var EVENT_KEY$4 = \".\" + DATA_KEY$4;\n  var DATA_API_KEY$4 = '.data-api';\n  var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4];\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n  var Event$4 = {\n    HIDE: \"hide\" + EVENT_KEY$4,\n    HIDDEN: \"hidden\" + EVENT_KEY$4,\n    SHOW: \"show\" + EVENT_KEY$4,\n    SHOWN: \"shown\" + EVENT_KEY$4,\n    CLICK: \"click\" + EVENT_KEY$4,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYUP_DATA_API: \"keyup\" + EVENT_KEY$4 + DATA_API_KEY$4\n  };\n  var ClassName$4 = {\n    DISABLED: 'disabled',\n    SHOW: 'show',\n    DROPUP: 'dropup',\n    DROPRIGHT: 'dropright',\n    DROPLEFT: 'dropleft',\n    MENURIGHT: 'dropdown-menu-right',\n    MENULEFT: 'dropdown-menu-left',\n    POSITION_STATIC: 'position-static'\n  };\n  var Selector$4 = {\n    DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n    FORM_CHILD: '.dropdown form',\n    MENU: '.dropdown-menu',\n    NAVBAR_NAV: '.navbar-nav',\n    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n  };\n  var AttachmentMap = {\n    TOP: 'top-start',\n    TOPEND: 'top-end',\n    BOTTOM: 'bottom-start',\n    BOTTOMEND: 'bottom-end',\n    RIGHT: 'right-start',\n    RIGHTEND: 'right-end',\n    LEFT: 'left-start',\n    LEFTEND: 'left-end'\n  };\n  var Default$2 = {\n    offset: 0,\n    flip: true,\n    boundary: 'scrollParent',\n    reference: 'toggle',\n    display: 'dynamic'\n  };\n  var DefaultType$2 = {\n    offset: '(number|string|function)',\n    flip: 'boolean',\n    boundary: '(string|element)',\n    reference: '(string|element)',\n    display: 'string'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Dropdown =\n  /*#__PURE__*/\n  function () {\n    function Dropdown(element, config) {\n      this._element = element;\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Dropdown.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      var isActive = $(this._menu).hasClass(ClassName$4.SHOW);\n\n      Dropdown._clearMenus();\n\n      if (isActive) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      } // Disable totally Popper.js for Dropdown in Navbar\n\n\n      if (!this._inNavbar) {\n        /**\n         * Check for Popper dependency\n         * Popper - https://popper.js.org\n         */\n        if (typeof Popper === 'undefined') {\n          throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)');\n        }\n\n        var referenceElement = this._element;\n\n        if (this._config.reference === 'parent') {\n          referenceElement = parent;\n        } else if (Util.isElement(this._config.reference)) {\n          referenceElement = this._config.reference; // Check if it's jQuery element\n\n          if (typeof this._config.reference.jquery !== 'undefined') {\n            referenceElement = this._config.reference[0];\n          }\n        } // If boundary is not `scrollParent`, then set position to `static`\n        // to allow the menu to \"escape\" the scroll parent's boundaries\n        // https://github.com/twbs/bootstrap/issues/24251\n\n\n        if (this._config.boundary !== 'scrollParent') {\n          $(parent).addClass(ClassName$4.POSITION_STATIC);\n        }\n\n        this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) {\n        $(document.body).children().on('mouseover', null, $.noop);\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.show = function show() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.hide = function hide() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$4);\n      $(this._element).off(EVENT_KEY$4);\n      this._element = null;\n      this._menu = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    };\n\n    _proto.update = function update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Private\n    ;\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this = this;\n\n      $(this._element).on(Event$4.CLICK, function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        _this.toggle();\n      });\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);\n      Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getMenuElement = function _getMenuElement() {\n      if (!this._menu) {\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        if (parent) {\n          this._menu = parent.querySelector(Selector$4.MENU);\n        }\n      }\n\n      return this._menu;\n    };\n\n    _proto._getPlacement = function _getPlacement() {\n      var $parentDropdown = $(this._element.parentNode);\n      var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n      if ($parentDropdown.hasClass(ClassName$4.DROPUP)) {\n        placement = AttachmentMap.TOP;\n\n        if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n          placement = AttachmentMap.TOPEND;\n        }\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) {\n        placement = AttachmentMap.RIGHT;\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) {\n        placement = AttachmentMap.LEFT;\n      } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n        placement = AttachmentMap.BOTTOMEND;\n      }\n\n      return placement;\n    };\n\n    _proto._detectNavbar = function _detectNavbar() {\n      return $(this._element).closest('.navbar').length > 0;\n    };\n\n    _proto._getOffset = function _getOffset() {\n      var _this2 = this;\n\n      var offset = {};\n\n      if (typeof this._config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this._config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getPopperConfig = function _getPopperConfig() {\n      var popperConfig = {\n        placement: this._getPlacement(),\n        modifiers: {\n          offset: this._getOffset(),\n          flip: {\n            enabled: this._config.flip\n          },\n          preventOverflow: {\n            boundariesElement: this._config.boundary\n          }\n        } // Disable Popper.js if we have a static display\n\n      };\n\n      if (this._config.display === 'static') {\n        popperConfig.modifiers.applyStyle = {\n          enabled: false\n        };\n      }\n\n      return popperConfig;\n    } // Static\n    ;\n\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$4);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data) {\n          data = new Dropdown(this, _config);\n          $(this).data(DATA_KEY$4, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    Dropdown._clearMenus = function _clearMenus(event) {\n      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n        return;\n      }\n\n      var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE));\n\n      for (var i = 0, len = toggles.length; i < len; i++) {\n        var parent = Dropdown._getParentFromElement(toggles[i]);\n\n        var context = $(toggles[i]).data(DATA_KEY$4);\n        var relatedTarget = {\n          relatedTarget: toggles[i]\n        };\n\n        if (event && event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n\n        if (!context) {\n          continue;\n        }\n\n        var dropdownMenu = context._menu;\n\n        if (!$(parent).hasClass(ClassName$4.SHOW)) {\n          continue;\n        }\n\n        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {\n          continue;\n        }\n\n        var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n        $(parent).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          continue;\n        } // If this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().off('mouseover', null, $.noop);\n        }\n\n        toggles[i].setAttribute('aria-expanded', 'false');\n        $(dropdownMenu).removeClass(ClassName$4.SHOW);\n        $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n      }\n    };\n\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\n      var parent;\n      var selector = Util.getSelectorFromElement(element);\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      return parent || element.parentNode;\n    } // eslint-disable-next-line complexity\n    ;\n\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this);\n\n      var isActive = $(parent).hasClass(ClassName$4.SHOW);\n\n      if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n        if (event.which === ESCAPE_KEYCODE) {\n          var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);\n          $(toggle).trigger('focus');\n        }\n\n        $(this).trigger('click');\n        return;\n      }\n\n      var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));\n\n      if (items.length === 0) {\n        return;\n      }\n\n      var index = items.indexOf(event.target);\n\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\n        // Up\n        index--;\n      }\n\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n        // Down\n        index++;\n      }\n\n      if (index < 0) {\n        index = 0;\n      }\n\n      items[index].focus();\n    };\n\n    _createClass(Dropdown, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$4;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$2;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$2;\n      }\n    }]);\n\n    return Dropdown;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + \" \" + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    Dropdown._jQueryInterface.call($(this), 'toggle');\n  }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) {\n    e.stopPropagation();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$4] = Dropdown._jQueryInterface;\n  $.fn[NAME$4].Constructor = Dropdown;\n\n  $.fn[NAME$4].noConflict = function () {\n    $.fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n    return Dropdown._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$5 = 'modal';\n  var VERSION$5 = '4.3.1';\n  var DATA_KEY$5 = 'bs.modal';\n  var EVENT_KEY$5 = \".\" + DATA_KEY$5;\n  var DATA_API_KEY$5 = '.data-api';\n  var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5];\n  var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var Default$3 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true,\n    show: true\n  };\n  var DefaultType$3 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean',\n    show: 'boolean'\n  };\n  var Event$5 = {\n    HIDE: \"hide\" + EVENT_KEY$5,\n    HIDDEN: \"hidden\" + EVENT_KEY$5,\n    SHOW: \"show\" + EVENT_KEY$5,\n    SHOWN: \"shown\" + EVENT_KEY$5,\n    FOCUSIN: \"focusin\" + EVENT_KEY$5,\n    RESIZE: \"resize\" + EVENT_KEY$5,\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$5,\n    KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY$5,\n    MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY$5,\n    MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY$5,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$5 + DATA_API_KEY$5\n  };\n  var ClassName$5 = {\n    SCROLLABLE: 'modal-dialog-scrollable',\n    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n    BACKDROP: 'modal-backdrop',\n    OPEN: 'modal-open',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$5 = {\n    DIALOG: '.modal-dialog',\n    MODAL_BODY: '.modal-body',\n    DATA_TOGGLE: '[data-toggle=\"modal\"]',\n    DATA_DISMISS: '[data-dismiss=\"modal\"]',\n    FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n    STICKY_CONTENT: '.sticky-top'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Modal =\n  /*#__PURE__*/\n  function () {\n    function Modal(element, config) {\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._dialog = element.querySelector(Selector$5.DIALOG);\n      this._backdrop = null;\n      this._isShown = false;\n      this._isBodyOverflowing = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollbarWidth = 0;\n    } // Getters\n\n\n    var _proto = Modal.prototype;\n\n    // Public\n    _proto.toggle = function toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    };\n\n    _proto.show = function show(relatedTarget) {\n      var _this = this;\n\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      if ($(this._element).hasClass(ClassName$5.FADE)) {\n        this._isTransitioning = true;\n      }\n\n      var showEvent = $.Event(Event$5.SHOW, {\n        relatedTarget: relatedTarget\n      });\n      $(this._element).trigger(showEvent);\n\n      if (this._isShown || showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = true;\n\n      this._checkScrollbar();\n\n      this._setScrollbar();\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) {\n        return _this.hide(event);\n      });\n      $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () {\n        $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) {\n          if ($(event.target).is(_this._element)) {\n            _this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(function () {\n        return _this._showElement(relatedTarget);\n      });\n    };\n\n    _proto.hide = function hide(event) {\n      var _this2 = this;\n\n      if (event) {\n        event.preventDefault();\n      }\n\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      var hideEvent = $.Event(Event$5.HIDE);\n      $(this._element).trigger(hideEvent);\n\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = false;\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (transition) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(document).off(Event$5.FOCUSIN);\n      $(this._element).removeClass(ClassName$5.SHOW);\n      $(this._element).off(Event$5.CLICK_DISMISS);\n      $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS);\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, function (event) {\n          return _this2._hideModal(event);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        this._hideModal();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      [window, this._element, this._dialog].forEach(function (htmlElement) {\n        return $(htmlElement).off(EVENT_KEY$5);\n      });\n      /**\n       * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n       * Do not move `document` in `htmlElements` array\n       * It will remove `Event.CLICK_DATA_API` event that should remain\n       */\n\n      $(document).off(Event$5.FOCUSIN);\n      $.removeData(this._element, DATA_KEY$5);\n      this._config = null;\n      this._element = null;\n      this._dialog = null;\n      this._backdrop = null;\n      this._isShown = null;\n      this._isBodyOverflowing = null;\n      this._ignoreBackdropClick = null;\n      this._isTransitioning = null;\n      this._scrollbarWidth = null;\n    };\n\n    _proto.handleUpdate = function handleUpdate() {\n      this._adjustDialog();\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$3, config);\n      Util.typeCheckConfig(NAME$5, config, DefaultType$3);\n      return config;\n    };\n\n    _proto._showElement = function _showElement(relatedTarget) {\n      var _this3 = this;\n\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.appendChild(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {\n        this._dialog.querySelector(Selector$5.MODAL_BODY).scrollTop = 0;\n      } else {\n        this._element.scrollTop = 0;\n      }\n\n      if (transition) {\n        Util.reflow(this._element);\n      }\n\n      $(this._element).addClass(ClassName$5.SHOW);\n\n      if (this._config.focus) {\n        this._enforceFocus();\n      }\n\n      var shownEvent = $.Event(Event$5.SHOWN, {\n        relatedTarget: relatedTarget\n      });\n\n      var transitionComplete = function transitionComplete() {\n        if (_this3._config.focus) {\n          _this3._element.focus();\n        }\n\n        _this3._isTransitioning = false;\n        $(_this3._element).trigger(shownEvent);\n      };\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);\n        $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n      } else {\n        transitionComplete();\n      }\n    };\n\n    _proto._enforceFocus = function _enforceFocus() {\n      var _this4 = this;\n\n      $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop\n      .on(Event$5.FOCUSIN, function (event) {\n        if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {\n          _this4._element.focus();\n        }\n      });\n    };\n\n    _proto._setEscapeEvent = function _setEscapeEvent() {\n      var _this5 = this;\n\n      if (this._isShown && this._config.keyboard) {\n        $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {\n          if (event.which === ESCAPE_KEYCODE$1) {\n            event.preventDefault();\n\n            _this5.hide();\n          }\n        });\n      } else if (!this._isShown) {\n        $(this._element).off(Event$5.KEYDOWN_DISMISS);\n      }\n    };\n\n    _proto._setResizeEvent = function _setResizeEvent() {\n      var _this6 = this;\n\n      if (this._isShown) {\n        $(window).on(Event$5.RESIZE, function (event) {\n          return _this6.handleUpdate(event);\n        });\n      } else {\n        $(window).off(Event$5.RESIZE);\n      }\n    };\n\n    _proto._hideModal = function _hideModal() {\n      var _this7 = this;\n\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._isTransitioning = false;\n\n      this._showBackdrop(function () {\n        $(document.body).removeClass(ClassName$5.OPEN);\n\n        _this7._resetAdjustments();\n\n        _this7._resetScrollbar();\n\n        $(_this7._element).trigger(Event$5.HIDDEN);\n      });\n    };\n\n    _proto._removeBackdrop = function _removeBackdrop() {\n      if (this._backdrop) {\n        $(this._backdrop).remove();\n        this._backdrop = null;\n      }\n    };\n\n    _proto._showBackdrop = function _showBackdrop(callback) {\n      var _this8 = this;\n\n      var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';\n\n      if (this._isShown && this._config.backdrop) {\n        this._backdrop = document.createElement('div');\n        this._backdrop.className = ClassName$5.BACKDROP;\n\n        if (animate) {\n          this._backdrop.classList.add(animate);\n        }\n\n        $(this._backdrop).appendTo(document.body);\n        $(this._element).on(Event$5.CLICK_DISMISS, function (event) {\n          if (_this8._ignoreBackdropClick) {\n            _this8._ignoreBackdropClick = false;\n            return;\n          }\n\n          if (event.target !== event.currentTarget) {\n            return;\n          }\n\n          if (_this8._config.backdrop === 'static') {\n            _this8._element.focus();\n          } else {\n            _this8.hide();\n          }\n        });\n\n        if (animate) {\n          Util.reflow(this._backdrop);\n        }\n\n        $(this._backdrop).addClass(ClassName$5.SHOW);\n\n        if (!callback) {\n          return;\n        }\n\n        if (!animate) {\n          callback();\n          return;\n        }\n\n        var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n        $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n      } else if (!this._isShown && this._backdrop) {\n        $(this._backdrop).removeClass(ClassName$5.SHOW);\n\n        var callbackRemove = function callbackRemove() {\n          _this8._removeBackdrop();\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        if ($(this._element).hasClass(ClassName$5.FADE)) {\n          var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n          $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n        } else {\n          callbackRemove();\n        }\n      } else if (callback) {\n        callback();\n      }\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // todo (fat): these should probably be refactored out of modal.js\n    // ----------------------------------------------------------------------\n    ;\n\n    _proto._adjustDialog = function _adjustDialog() {\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      if (!this._isBodyOverflowing && isModalOverflowing) {\n        this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n      }\n\n      if (this._isBodyOverflowing && !isModalOverflowing) {\n        this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n      }\n    };\n\n    _proto._resetAdjustments = function _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    };\n\n    _proto._checkScrollbar = function _checkScrollbar() {\n      var rect = document.body.getBoundingClientRect();\n      this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n      this._scrollbarWidth = this._getScrollbarWidth();\n    };\n\n    _proto._setScrollbar = function _setScrollbar() {\n      var _this9 = this;\n\n      if (this._isBodyOverflowing) {\n        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n        var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n        var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding\n\n        $(fixedContent).each(function (index, element) {\n          var actualPadding = element.style.paddingRight;\n          var calculatedPadding = $(element).css('padding-right');\n          $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n        }); // Adjust sticky content margin\n\n        $(stickyContent).each(function (index, element) {\n          var actualMargin = element.style.marginRight;\n          var calculatedMargin = $(element).css('margin-right');\n          $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n        }); // Adjust body padding\n\n        var actualPadding = document.body.style.paddingRight;\n        var calculatedPadding = $(document.body).css('padding-right');\n        $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n      }\n\n      $(document.body).addClass(ClassName$5.OPEN);\n    };\n\n    _proto._resetScrollbar = function _resetScrollbar() {\n      // Restore fixed content padding\n      var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n      $(fixedContent).each(function (index, element) {\n        var padding = $(element).data('padding-right');\n        $(element).removeData('padding-right');\n        element.style.paddingRight = padding ? padding : '';\n      }); // Restore sticky content\n\n      var elements = [].slice.call(document.querySelectorAll(\"\" + Selector$5.STICKY_CONTENT));\n      $(elements).each(function (index, element) {\n        var margin = $(element).data('margin-right');\n\n        if (typeof margin !== 'undefined') {\n          $(element).css('margin-right', margin).removeData('margin-right');\n        }\n      }); // Restore body padding\n\n      var padding = $(document.body).data('padding-right');\n      $(document.body).removeData('padding-right');\n      document.body.style.paddingRight = padding ? padding : '';\n    };\n\n    _proto._getScrollbarWidth = function _getScrollbarWidth() {\n      // thx d.walsh\n      var scrollDiv = document.createElement('div');\n      scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER;\n      document.body.appendChild(scrollDiv);\n      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n      document.body.removeChild(scrollDiv);\n      return scrollbarWidth;\n    } // Static\n    ;\n\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$5);\n\n        var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});\n\n        if (!data) {\n          data = new Modal(this, _config);\n          $(this).data(DATA_KEY$5, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](relatedTarget);\n        } else if (_config.show) {\n          data.show(relatedTarget);\n        }\n      });\n    };\n\n    _createClass(Modal, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$5;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$3;\n      }\n    }]);\n\n    return Modal;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {\n    var _this10 = this;\n\n    var target;\n    var selector = Util.getSelectorFromElement(this);\n\n    if (selector) {\n      target = document.querySelector(selector);\n    }\n\n    var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());\n\n    if (this.tagName === 'A' || this.tagName === 'AREA') {\n      event.preventDefault();\n    }\n\n    var $target = $(target).one(Event$5.SHOW, function (showEvent) {\n      if (showEvent.isDefaultPrevented()) {\n        // Only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      $target.one(Event$5.HIDDEN, function () {\n        if ($(_this10).is(':visible')) {\n          _this10.focus();\n        }\n      });\n    });\n\n    Modal._jQueryInterface.call($(target), config, this);\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$5] = Modal._jQueryInterface;\n  $.fn[NAME$5].Constructor = Modal;\n\n  $.fn[NAME$5].noConflict = function () {\n    $.fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n    return Modal._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): tools/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];\n  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  var DefaultWhitelist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n    /**\n     * A pattern that recognizes a commonly useful subset of URLs that are safe.\n     *\n     * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n     */\n\n  };\n  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;\n\n  function allowedAttribute(attr, allowedAttributeList) {\n    var attrName = attr.nodeName.toLowerCase();\n\n    if (allowedAttributeList.indexOf(attrName) !== -1) {\n      if (uriAttrs.indexOf(attrName) !== -1) {\n        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));\n      }\n\n      return true;\n    }\n\n    var regExp = allowedAttributeList.filter(function (attrRegex) {\n      return attrRegex instanceof RegExp;\n    }); // Check if a regular expression validates the attribute.\n\n    for (var i = 0, l = regExp.length; i < l; i++) {\n      if (attrName.match(regExp[i])) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n    if (unsafeHtml.length === 0) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    var domParser = new window.DOMParser();\n    var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    var whitelistKeys = Object.keys(whiteList);\n    var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));\n\n    var _loop = function _loop(i, len) {\n      var el = elements[i];\n      var elName = el.nodeName.toLowerCase();\n\n      if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n        el.parentNode.removeChild(el);\n        return \"continue\";\n      }\n\n      var attributeList = [].slice.call(el.attributes);\n      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);\n      attributeList.forEach(function (attr) {\n        if (!allowedAttribute(attr, whitelistedAttributes)) {\n          el.removeAttribute(attr.nodeName);\n        }\n      });\n    };\n\n    for (var i = 0, len = elements.length; i < len; i++) {\n      var _ret = _loop(i, len);\n\n      if (_ret === \"continue\") continue;\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$6 = 'tooltip';\n  var VERSION$6 = '4.3.1';\n  var DATA_KEY$6 = 'bs.tooltip';\n  var EVENT_KEY$6 = \".\" + DATA_KEY$6;\n  var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];\n  var CLASS_PREFIX = 'bs-tooltip';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];\n  var DefaultType$4 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(number|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacement: '(string|array)',\n    boundary: '(string|element)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    whiteList: 'object'\n  };\n  var AttachmentMap$1 = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: 'right',\n    BOTTOM: 'bottom',\n    LEFT: 'left'\n  };\n  var Default$4 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: 0,\n    container: false,\n    fallbackPlacement: 'flip',\n    boundary: 'scrollParent',\n    sanitize: true,\n    sanitizeFn: null,\n    whiteList: DefaultWhitelist\n  };\n  var HoverState = {\n    SHOW: 'show',\n    OUT: 'out'\n  };\n  var Event$6 = {\n    HIDE: \"hide\" + EVENT_KEY$6,\n    HIDDEN: \"hidden\" + EVENT_KEY$6,\n    SHOW: \"show\" + EVENT_KEY$6,\n    SHOWN: \"shown\" + EVENT_KEY$6,\n    INSERTED: \"inserted\" + EVENT_KEY$6,\n    CLICK: \"click\" + EVENT_KEY$6,\n    FOCUSIN: \"focusin\" + EVENT_KEY$6,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$6,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$6,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$6\n  };\n  var ClassName$6 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$6 = {\n    TOOLTIP: '.tooltip',\n    TOOLTIP_INNER: '.tooltip-inner',\n    ARROW: '.arrow'\n  };\n  var Trigger = {\n    HOVER: 'hover',\n    FOCUS: 'focus',\n    CLICK: 'click',\n    MANUAL: 'manual'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tooltip =\n  /*#__PURE__*/\n  function () {\n    function Tooltip(element, config) {\n      /**\n       * Check for Popper dependency\n       * Popper - https://popper.js.org\n       */\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)');\n      } // private\n\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this.element = element;\n      this.config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Tooltip.prototype;\n\n    // Public\n    _proto.enable = function enable() {\n      this._isEnabled = true;\n    };\n\n    _proto.disable = function disable() {\n      this._isEnabled = false;\n    };\n\n    _proto.toggleEnabled = function toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    };\n\n    _proto.toggle = function toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        var dataKey = this.constructor.DATA_KEY;\n        var context = $(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $(event.currentTarget).data(dataKey, context);\n        }\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      $.removeData(this.element, this.constructor.DATA_KEY);\n      $(this.element).off(this.constructor.EVENT_KEY);\n      $(this.element).closest('.modal').off('hide.bs.modal');\n\n      if (this.tip) {\n        $(this.tip).remove();\n      }\n\n      this._isEnabled = null;\n      this._timeout = null;\n      this._hoverState = null;\n      this._activeTrigger = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n      }\n\n      this._popper = null;\n      this.element = null;\n      this.config = null;\n      this.tip = null;\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if ($(this.element).css('display') === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      var showEvent = $.Event(this.constructor.Event.SHOW);\n\n      if (this.isWithContent() && this._isEnabled) {\n        $(this.element).trigger(showEvent);\n        var shadowRoot = Util.findShadowRoot(this.element);\n        var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);\n\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\n          return;\n        }\n\n        var tip = this.getTipElement();\n        var tipId = Util.getUID(this.constructor.NAME);\n        tip.setAttribute('id', tipId);\n        this.element.setAttribute('aria-describedby', tipId);\n        this.setContent();\n\n        if (this.config.animation) {\n          $(tip).addClass(ClassName$6.FADE);\n        }\n\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n        var attachment = this._getAttachment(placement);\n\n        this.addAttachmentClass(attachment);\n\n        var container = this._getContainer();\n\n        $(tip).data(this.constructor.DATA_KEY, this);\n\n        if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n          $(tip).appendTo(container);\n        }\n\n        $(this.element).trigger(this.constructor.Event.INSERTED);\n        this._popper = new Popper(this.element, tip, {\n          placement: attachment,\n          modifiers: {\n            offset: this._getOffset(),\n            flip: {\n              behavior: this.config.fallbackPlacement\n            },\n            arrow: {\n              element: Selector$6.ARROW\n            },\n            preventOverflow: {\n              boundariesElement: this.config.boundary\n            }\n          },\n          onCreate: function onCreate(data) {\n            if (data.originalPlacement !== data.placement) {\n              _this._handlePopperPlacementChange(data);\n            }\n          },\n          onUpdate: function onUpdate(data) {\n            return _this._handlePopperPlacementChange(data);\n          }\n        });\n        $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().on('mouseover', null, $.noop);\n        }\n\n        var complete = function complete() {\n          if (_this.config.animation) {\n            _this._fixTransition();\n          }\n\n          var prevHoverState = _this._hoverState;\n          _this._hoverState = null;\n          $(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n          if (prevHoverState === HoverState.OUT) {\n            _this._leave(null, _this);\n          }\n        };\n\n        if ($(this.tip).hasClass(ClassName$6.FADE)) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n          $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n      }\n    };\n\n    _proto.hide = function hide(callback) {\n      var _this2 = this;\n\n      var tip = this.getTipElement();\n      var hideEvent = $.Event(this.constructor.Event.HIDE);\n\n      var complete = function complete() {\n        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n          tip.parentNode.removeChild(tip);\n        }\n\n        _this2._cleanTipClass();\n\n        _this2.element.removeAttribute('aria-describedby');\n\n        $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n        if (_this2._popper !== null) {\n          _this2._popper.destroy();\n        }\n\n        if (callback) {\n          callback();\n        }\n      };\n\n      $(this.element).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        $(document.body).children().off('mouseover', null, $.noop);\n      }\n\n      this._activeTrigger[Trigger.CLICK] = false;\n      this._activeTrigger[Trigger.FOCUS] = false;\n      this._activeTrigger[Trigger.HOVER] = false;\n\n      if ($(this.tip).hasClass(ClassName$6.FADE)) {\n        var transitionDuration = Util.getTransitionDurationFromElement(tip);\n        $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n\n      this._hoverState = '';\n    };\n\n    _proto.update = function update() {\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Protected\n    ;\n\n    _proto.isWithContent = function isWithContent() {\n      return Boolean(this.getTitle());\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var tip = this.getTipElement();\n      this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle());\n      $(tip).removeClass(ClassName$6.FADE + \" \" + ClassName$6.SHOW);\n    };\n\n    _proto.setElementContent = function setElementContent($element, content) {\n      if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n        // Content is a DOM node or a jQuery\n        if (this.config.html) {\n          if (!$(content).parent().is($element)) {\n            $element.empty().append(content);\n          }\n        } else {\n          $element.text($(content).text());\n        }\n\n        return;\n      }\n\n      if (this.config.html) {\n        if (this.config.sanitize) {\n          content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);\n        }\n\n        $element.html(content);\n      } else {\n        $element.text(content);\n      }\n    };\n\n    _proto.getTitle = function getTitle() {\n      var title = this.element.getAttribute('data-original-title');\n\n      if (!title) {\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n      }\n\n      return title;\n    } // Private\n    ;\n\n    _proto._getOffset = function _getOffset() {\n      var _this3 = this;\n\n      var offset = {};\n\n      if (typeof this.config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this.config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getContainer = function _getContainer() {\n      if (this.config.container === false) {\n        return document.body;\n      }\n\n      if (Util.isElement(this.config.container)) {\n        return $(this.config.container);\n      }\n\n      return $(document).find(this.config.container);\n    };\n\n    _proto._getAttachment = function _getAttachment(placement) {\n      return AttachmentMap$1[placement.toUpperCase()];\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this4 = this;\n\n      var triggers = this.config.trigger.split(' ');\n      triggers.forEach(function (trigger) {\n        if (trigger === 'click') {\n          $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {\n            return _this4.toggle(event);\n          });\n        } else if (trigger !== Trigger.MANUAL) {\n          var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;\n          var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;\n          $(_this4.element).on(eventIn, _this4.config.selector, function (event) {\n            return _this4._enter(event);\n          }).on(eventOut, _this4.config.selector, function (event) {\n            return _this4._leave(event);\n          });\n        }\n      });\n      $(this.element).closest('.modal').on('hide.bs.modal', function () {\n        if (_this4.element) {\n          _this4.hide();\n        }\n      });\n\n      if (this.config.selector) {\n        this.config = _objectSpread({}, this.config, {\n          trigger: 'manual',\n          selector: ''\n        });\n      } else {\n        this._fixTitle();\n      }\n    };\n\n    _proto._fixTitle = function _fixTitle() {\n      var titleType = typeof this.element.getAttribute('data-original-title');\n\n      if (this.element.getAttribute('title') || titleType !== 'string') {\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n        this.element.setAttribute('title', '');\n      }\n    };\n\n    _proto._enter = function _enter(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n      }\n\n      if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) {\n        context._hoverState = HoverState.SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.SHOW;\n\n      if (!context.config.delay || !context.config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.SHOW) {\n          context.show();\n        }\n      }, context.config.delay.show);\n    };\n\n    _proto._leave = function _leave(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.OUT;\n\n      if (!context.config.delay || !context.config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.OUT) {\n          context.hide();\n        }\n      }, context.config.delay.hide);\n    };\n\n    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n      for (var trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      var dataAttributes = $(this.element).data();\n      Object.keys(dataAttributes).forEach(function (dataAttr) {\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);\n      }\n\n      return config;\n    };\n\n    _proto._getDelegateConfig = function _getDelegateConfig() {\n      var config = {};\n\n      if (this.config) {\n        for (var key in this.config) {\n          if (this.constructor.Default[key] !== this.config[key]) {\n            config[key] = this.config[key];\n          }\n        }\n      }\n\n      return config;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    };\n\n    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {\n      var popperInstance = popperData.instance;\n      this.tip = popperInstance.popper;\n\n      this._cleanTipClass();\n\n      this.addAttachmentClass(this._getAttachment(popperData.placement));\n    };\n\n    _proto._fixTransition = function _fixTransition() {\n      var tip = this.getTipElement();\n      var initConfigAnimation = this.config.animation;\n\n      if (tip.getAttribute('x-placement') !== null) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.FADE);\n      this.config.animation = false;\n      this.hide();\n      this.show();\n      this.config.animation = initConfigAnimation;\n    } // Static\n    ;\n\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$6);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Tooltip(this, _config);\n          $(this).data(DATA_KEY$6, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tooltip, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$6;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$4;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$6;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$6;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$6;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$6;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$4;\n      }\n    }]);\n\n    return Tooltip;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$6] = Tooltip._jQueryInterface;\n  $.fn[NAME$6].Constructor = Tooltip;\n\n  $.fn[NAME$6].noConflict = function () {\n    $.fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n    return Tooltip._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$7 = 'popover';\n  var VERSION$7 = '4.3.1';\n  var DATA_KEY$7 = 'bs.popover';\n  var EVENT_KEY$7 = \".\" + DATA_KEY$7;\n  var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];\n  var CLASS_PREFIX$1 = 'bs-popover';\n  var BSCLS_PREFIX_REGEX$1 = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX$1 + \"\\\\S+\", 'g');\n\n  var Default$5 = _objectSpread({}, Tooltip.Default, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n  });\n\n  var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, {\n    content: '(string|element|function)'\n  });\n\n  var ClassName$7 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$7 = {\n    TITLE: '.popover-header',\n    CONTENT: '.popover-body'\n  };\n  var Event$7 = {\n    HIDE: \"hide\" + EVENT_KEY$7,\n    HIDDEN: \"hidden\" + EVENT_KEY$7,\n    SHOW: \"show\" + EVENT_KEY$7,\n    SHOWN: \"shown\" + EVENT_KEY$7,\n    INSERTED: \"inserted\" + EVENT_KEY$7,\n    CLICK: \"click\" + EVENT_KEY$7,\n    FOCUSIN: \"focusin\" + EVENT_KEY$7,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$7,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$7,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$7\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Popover =\n  /*#__PURE__*/\n  function (_Tooltip) {\n    _inheritsLoose(Popover, _Tooltip);\n\n    function Popover() {\n      return _Tooltip.apply(this, arguments) || this;\n    }\n\n    var _proto = Popover.prototype;\n\n    // Overrides\n    _proto.isWithContent = function isWithContent() {\n      return this.getTitle() || this._getContent();\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX$1 + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events\n\n      this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle());\n\n      var content = this._getContent();\n\n      if (typeof content === 'function') {\n        content = content.call(this.element);\n      }\n\n      this.setElementContent($tip.find(Selector$7.CONTENT), content);\n      $tip.removeClass(ClassName$7.FADE + \" \" + ClassName$7.SHOW);\n    } // Private\n    ;\n\n    _proto._getContent = function _getContent() {\n      return this.element.getAttribute('data-content') || this.config.content;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    } // Static\n    ;\n\n    Popover._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$7);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Popover(this, _config);\n          $(this).data(DATA_KEY$7, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Popover, null, [{\n      key: \"VERSION\",\n      // Getters\n      get: function get() {\n        return VERSION$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$5;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$7;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$7;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$7;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$7;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$5;\n      }\n    }]);\n\n    return Popover;\n  }(Tooltip);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$7] = Popover._jQueryInterface;\n  $.fn[NAME$7].Constructor = Popover;\n\n  $.fn[NAME$7].noConflict = function () {\n    $.fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n    return Popover._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$8 = 'scrollspy';\n  var VERSION$8 = '4.3.1';\n  var DATA_KEY$8 = 'bs.scrollspy';\n  var EVENT_KEY$8 = \".\" + DATA_KEY$8;\n  var DATA_API_KEY$6 = '.data-api';\n  var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8];\n  var Default$6 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  var DefaultType$6 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  var Event$8 = {\n    ACTIVATE: \"activate\" + EVENT_KEY$8,\n    SCROLL: \"scroll\" + EVENT_KEY$8,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$8 + DATA_API_KEY$6\n  };\n  var ClassName$8 = {\n    DROPDOWN_ITEM: 'dropdown-item',\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active'\n  };\n  var Selector$8 = {\n    DATA_SPY: '[data-spy=\"scroll\"]',\n    ACTIVE: '.active',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    NAV_LINKS: '.nav-link',\n    NAV_ITEMS: '.nav-item',\n    LIST_ITEMS: '.list-group-item',\n    DROPDOWN: '.dropdown',\n    DROPDOWN_ITEMS: '.dropdown-item',\n    DROPDOWN_TOGGLE: '.dropdown-toggle'\n  };\n  var OffsetMethod = {\n    OFFSET: 'offset',\n    POSITION: 'position'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var ScrollSpy =\n  /*#__PURE__*/\n  function () {\n    function ScrollSpy(element, config) {\n      var _this = this;\n\n      this._element = element;\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\n      this._config = this._getConfig(config);\n      this._selector = this._config.target + \" \" + Selector$8.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector$8.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector$8.DROPDOWN_ITEMS);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      $(this._scrollElement).on(Event$8.SCROLL, function (event) {\n        return _this._process(event);\n      });\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    var _proto = ScrollSpy.prototype;\n\n    // Public\n    _proto.refresh = function refresh() {\n      var _this2 = this;\n\n      var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      var targets = [].slice.call(document.querySelectorAll(this._selector));\n      targets.map(function (element) {\n        var target;\n        var targetSelector = Util.getSelectorFromElement(element);\n\n        if (targetSelector) {\n          target = document.querySelector(targetSelector);\n        }\n\n        if (target) {\n          var targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            // TODO (fat): remove sketch reliance on jQuery position/offset\n            return [$(target)[offsetMethod]().top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(function (item) {\n        return item;\n      }).sort(function (a, b) {\n        return a[0] - b[0];\n      }).forEach(function (item) {\n        _this2._offsets.push(item[0]);\n\n        _this2._targets.push(item[1]);\n      });\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$8);\n      $(this._scrollElement).off(EVENT_KEY$8);\n      this._element = null;\n      this._scrollElement = null;\n      this._config = null;\n      this._selector = null;\n      this._offsets = null;\n      this._targets = null;\n      this._activeTarget = null;\n      this._scrollHeight = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$6, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.target !== 'string') {\n        var id = $(config.target).attr('id');\n\n        if (!id) {\n          id = Util.getUID(NAME$8);\n          $(config.target).attr('id', id);\n        }\n\n        config.target = \"#\" + id;\n      }\n\n      Util.typeCheckConfig(NAME$8, config, DefaultType$6);\n      return config;\n    };\n\n    _proto._getScrollTop = function _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    };\n\n    _proto._getScrollHeight = function _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    };\n\n    _proto._getOffsetHeight = function _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    };\n\n    _proto._process = function _process() {\n      var scrollTop = this._getScrollTop() + this._config.offset;\n\n      var scrollHeight = this._getScrollHeight();\n\n      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        var target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      var offsetLength = this._offsets.length;\n\n      for (var i = offsetLength; i--;) {\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    };\n\n    _proto._activate = function _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      var queries = this._selector.split(',').map(function (selector) {\n        return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + selector + \"[href=\\\"\" + target + \"\\\"]\";\n      });\n\n      var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));\n\n      if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) {\n        $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE);\n        $link.addClass(ClassName$8.ACTIVE);\n      } else {\n        // Set triggered link as active\n        $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_LINKS + \", \" + Selector$8.LIST_ITEMS).addClass(ClassName$8.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_ITEMS).children(Selector$8.NAV_LINKS).addClass(ClassName$8.ACTIVE);\n      }\n\n      $(this._scrollElement).trigger(Event$8.ACTIVATE, {\n        relatedTarget: target\n      });\n    };\n\n    _proto._clear = function _clear() {\n      [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {\n        return node.classList.contains(ClassName$8.ACTIVE);\n      }).forEach(function (node) {\n        return node.classList.remove(ClassName$8.ACTIVE);\n      });\n    } // Static\n    ;\n\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$8);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new ScrollSpy(this, _config);\n          $(this).data(DATA_KEY$8, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(ScrollSpy, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$8;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$6;\n      }\n    }]);\n\n    return ScrollSpy;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(window).on(Event$8.LOAD_DATA_API, function () {\n    var scrollSpys = [].slice.call(document.querySelectorAll(Selector$8.DATA_SPY));\n    var scrollSpysLength = scrollSpys.length;\n\n    for (var i = scrollSpysLength; i--;) {\n      var $spy = $(scrollSpys[i]);\n\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$8] = ScrollSpy._jQueryInterface;\n  $.fn[NAME$8].Constructor = ScrollSpy;\n\n  $.fn[NAME$8].noConflict = function () {\n    $.fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n    return ScrollSpy._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$9 = 'tab';\n  var VERSION$9 = '4.3.1';\n  var DATA_KEY$9 = 'bs.tab';\n  var EVENT_KEY$9 = \".\" + DATA_KEY$9;\n  var DATA_API_KEY$7 = '.data-api';\n  var JQUERY_NO_CONFLICT$9 = $.fn[NAME$9];\n  var Event$9 = {\n    HIDE: \"hide\" + EVENT_KEY$9,\n    HIDDEN: \"hidden\" + EVENT_KEY$9,\n    SHOW: \"show\" + EVENT_KEY$9,\n    SHOWN: \"shown\" + EVENT_KEY$9,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$9 + DATA_API_KEY$7\n  };\n  var ClassName$9 = {\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active',\n    DISABLED: 'disabled',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$9 = {\n    DROPDOWN: '.dropdown',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    ACTIVE: '.active',\n    ACTIVE_UL: '> li > .active',\n    DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n    DROPDOWN_TOGGLE: '.dropdown-toggle',\n    DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tab =\n  /*#__PURE__*/\n  function () {\n    function Tab(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Tab.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName$9.ACTIVE) || $(this._element).hasClass(ClassName$9.DISABLED)) {\n        return;\n      }\n\n      var target;\n      var previous;\n      var listElement = $(this._element).closest(Selector$9.NAV_LIST_GROUP)[0];\n      var selector = Util.getSelectorFromElement(this._element);\n\n      if (listElement) {\n        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector$9.ACTIVE_UL : Selector$9.ACTIVE;\n        previous = $.makeArray($(listElement).find(itemSelector));\n        previous = previous[previous.length - 1];\n      }\n\n      var hideEvent = $.Event(Event$9.HIDE, {\n        relatedTarget: this._element\n      });\n      var showEvent = $.Event(Event$9.SHOW, {\n        relatedTarget: previous\n      });\n\n      if (previous) {\n        $(previous).trigger(hideEvent);\n      }\n\n      $(this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (selector) {\n        target = document.querySelector(selector);\n      }\n\n      this._activate(this._element, listElement);\n\n      var complete = function complete() {\n        var hiddenEvent = $.Event(Event$9.HIDDEN, {\n          relatedTarget: _this._element\n        });\n        var shownEvent = $.Event(Event$9.SHOWN, {\n          relatedTarget: previous\n        });\n        $(previous).trigger(hiddenEvent);\n        $(_this._element).trigger(shownEvent);\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$9);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._activate = function _activate(element, container, callback) {\n      var _this2 = this;\n\n      var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector$9.ACTIVE_UL) : $(container).children(Selector$9.ACTIVE);\n      var active = activeElements[0];\n      var isTransitioning = callback && active && $(active).hasClass(ClassName$9.FADE);\n\n      var complete = function complete() {\n        return _this2._transitionComplete(element, active, callback);\n      };\n\n      if (active && isTransitioning) {\n        var transitionDuration = Util.getTransitionDurationFromElement(active);\n        $(active).removeClass(ClassName$9.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n      if (active) {\n        $(active).removeClass(ClassName$9.ACTIVE);\n        var dropdownChild = $(active.parentNode).find(Selector$9.DROPDOWN_ACTIVE_CHILD)[0];\n\n        if (dropdownChild) {\n          $(dropdownChild).removeClass(ClassName$9.ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      $(element).addClass(ClassName$9.ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      Util.reflow(element);\n\n      if (element.classList.contains(ClassName$9.FADE)) {\n        element.classList.add(ClassName$9.SHOW);\n      }\n\n      if (element.parentNode && $(element.parentNode).hasClass(ClassName$9.DROPDOWN_MENU)) {\n        var dropdownElement = $(element).closest(Selector$9.DROPDOWN)[0];\n\n        if (dropdownElement) {\n          var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector$9.DROPDOWN_TOGGLE));\n          $(dropdownToggleList).addClass(ClassName$9.ACTIVE);\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n    ;\n\n    Tab._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$9);\n\n        if (!data) {\n          data = new Tab(this);\n          $this.data(DATA_KEY$9, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tab, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$9;\n      }\n    }]);\n\n    return Tab;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$9.CLICK_DATA_API, Selector$9.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n\n    Tab._jQueryInterface.call($(this), 'show');\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$9] = Tab._jQueryInterface;\n  $.fn[NAME$9].Constructor = Tab;\n\n  $.fn[NAME$9].noConflict = function () {\n    $.fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n    return Tab._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$a = 'toast';\n  var VERSION$a = '4.3.1';\n  var DATA_KEY$a = 'bs.toast';\n  var EVENT_KEY$a = \".\" + DATA_KEY$a;\n  var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];\n  var Event$a = {\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$a,\n    HIDE: \"hide\" + EVENT_KEY$a,\n    HIDDEN: \"hidden\" + EVENT_KEY$a,\n    SHOW: \"show\" + EVENT_KEY$a,\n    SHOWN: \"shown\" + EVENT_KEY$a\n  };\n  var ClassName$a = {\n    FADE: 'fade',\n    HIDE: 'hide',\n    SHOW: 'show',\n    SHOWING: 'showing'\n  };\n  var DefaultType$7 = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  var Default$7 = {\n    animation: true,\n    autohide: true,\n    delay: 500\n  };\n  var Selector$a = {\n    DATA_DISMISS: '[data-dismiss=\"toast\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Toast =\n  /*#__PURE__*/\n  function () {\n    function Toast(element, config) {\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._timeout = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Toast.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      $(this._element).trigger(Event$a.SHOW);\n\n      if (this._config.animation) {\n        this._element.classList.add(ClassName$a.FADE);\n      }\n\n      var complete = function complete() {\n        _this._element.classList.remove(ClassName$a.SHOWING);\n\n        _this._element.classList.add(ClassName$a.SHOW);\n\n        $(_this._element).trigger(Event$a.SHOWN);\n\n        if (_this._config.autohide) {\n          _this.hide();\n        }\n      };\n\n      this._element.classList.remove(ClassName$a.HIDE);\n\n      this._element.classList.add(ClassName$a.SHOWING);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.hide = function hide(withoutTimeout) {\n      var _this2 = this;\n\n      if (!this._element.classList.contains(ClassName$a.SHOW)) {\n        return;\n      }\n\n      $(this._element).trigger(Event$a.HIDE);\n\n      if (withoutTimeout) {\n        this._close();\n      } else {\n        this._timeout = setTimeout(function () {\n          _this2._close();\n        }, this._config.delay);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n\n      if (this._element.classList.contains(ClassName$a.SHOW)) {\n        this._element.classList.remove(ClassName$a.SHOW);\n      }\n\n      $(this._element).off(Event$a.CLICK_DISMISS);\n      $.removeData(this._element, DATA_KEY$a);\n      this._element = null;\n      this._config = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$7, $(this._element).data(), typeof config === 'object' && config ? config : {});\n      Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this3 = this;\n\n      $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {\n        return _this3.hide(true);\n      });\n    };\n\n    _proto._close = function _close() {\n      var _this4 = this;\n\n      var complete = function complete() {\n        _this4._element.classList.add(ClassName$a.HIDE);\n\n        $(_this4._element).trigger(Event$a.HIDDEN);\n      };\n\n      this._element.classList.remove(ClassName$a.SHOW);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    } // Static\n    ;\n\n    Toast._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY$a);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new Toast(this, _config);\n          $element.data(DATA_KEY$a, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](this);\n        }\n      });\n    };\n\n    _createClass(Toast, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$a;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$7;\n      }\n    }]);\n\n    return Toast;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$a] = Toast._jQueryInterface;\n  $.fn[NAME$a].Constructor = Toast;\n\n  $.fn[NAME$a].noConflict = function () {\n    $.fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n    return Toast._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  (function () {\n    if (typeof $ === 'undefined') {\n      throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n    }\n\n    var version = $.fn.jquery.split(' ')[0].split('.');\n    var minMajor = 1;\n    var ltMajor = 2;\n    var minMinor = 9;\n    var minPatch = 1;\n    var maxMajor = 4;\n\n    if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n      throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n    }\n  })();\n\n  exports.Util = Util;\n  exports.Alert = Alert;\n  exports.Button = Button;\n  exports.Carousel = Carousel;\n  exports.Collapse = Collapse;\n  exports.Dropdown = Dropdown;\n  exports.Modal = Modal;\n  exports.Popover = Popover;\n  exports.Scrollspy = ScrollSpy;\n  exports.Tab = Tab;\n  exports.Toast = Toast;\n  exports.Tooltip = Tooltip;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=bootstrap.bundle.js.map\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/bootstrap/dist/js/bootstrap.js",
    "content": "/*!\n  * Bootstrap v4.3.1 (https://getbootstrap.com/)\n  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :\n  (global = global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper));\n}(this, function (exports, $, Popper) { 'use strict';\n\n  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n  Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function _objectSpread(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n      var ownKeys = Object.keys(source);\n\n      if (typeof Object.getOwnPropertySymbols === 'function') {\n        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n          return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n        }));\n      }\n\n      ownKeys.forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    }\n\n    return target;\n  }\n\n  function _inheritsLoose(subClass, superClass) {\n    subClass.prototype = Object.create(superClass.prototype);\n    subClass.prototype.constructor = subClass;\n    subClass.__proto__ = superClass;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): util.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Private TransitionEnd Helpers\n   * ------------------------------------------------------------------------\n   */\n\n  var TRANSITION_END = 'transitionend';\n  var MAX_UID = 1000000;\n  var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  function toType(obj) {\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  }\n\n  function getSpecialTransitionEndEvent() {\n    return {\n      bindType: TRANSITION_END,\n      delegateType: TRANSITION_END,\n      handle: function handle(event) {\n        if ($(event.target).is(this)) {\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n        }\n\n        return undefined; // eslint-disable-line no-undefined\n      }\n    };\n  }\n\n  function transitionEndEmulator(duration) {\n    var _this = this;\n\n    var called = false;\n    $(this).one(Util.TRANSITION_END, function () {\n      called = true;\n    });\n    setTimeout(function () {\n      if (!called) {\n        Util.triggerTransitionEnd(_this);\n      }\n    }, duration);\n    return this;\n  }\n\n  function setTransitionEndSupport() {\n    $.fn.emulateTransitionEnd = transitionEndEmulator;\n    $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n  }\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  var Util = {\n    TRANSITION_END: 'bsTransitionEnd',\n    getUID: function getUID(prefix) {\n      do {\n        // eslint-disable-next-line no-bitwise\n        prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n      } while (document.getElementById(prefix));\n\n      return prefix;\n    },\n    getSelectorFromElement: function getSelectorFromElement(element) {\n      var selector = element.getAttribute('data-target');\n\n      if (!selector || selector === '#') {\n        var hrefAttr = element.getAttribute('href');\n        selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';\n      }\n\n      try {\n        return document.querySelector(selector) ? selector : null;\n      } catch (err) {\n        return null;\n      }\n    },\n    getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n      if (!element) {\n        return 0;\n      } // Get transition-duration of the element\n\n\n      var transitionDuration = $(element).css('transition-duration');\n      var transitionDelay = $(element).css('transition-delay');\n      var floatTransitionDuration = parseFloat(transitionDuration);\n      var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n      if (!floatTransitionDuration && !floatTransitionDelay) {\n        return 0;\n      } // If multiple durations are defined, take the first\n\n\n      transitionDuration = transitionDuration.split(',')[0];\n      transitionDelay = transitionDelay.split(',')[0];\n      return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n    },\n    reflow: function reflow(element) {\n      return element.offsetHeight;\n    },\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\n      $(element).trigger(TRANSITION_END);\n    },\n    // TODO: Remove in v5\n    supportsTransitionEnd: function supportsTransitionEnd() {\n      return Boolean(TRANSITION_END);\n    },\n    isElement: function isElement(obj) {\n      return (obj[0] || obj).nodeType;\n    },\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n      for (var property in configTypes) {\n        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n          var expectedTypes = configTypes[property];\n          var value = config[property];\n          var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n          if (!new RegExp(expectedTypes).test(valueType)) {\n            throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n          }\n        }\n      }\n    },\n    findShadowRoot: function findShadowRoot(element) {\n      if (!document.documentElement.attachShadow) {\n        return null;\n      } // Can find the shadow root otherwise it'll return the document\n\n\n      if (typeof element.getRootNode === 'function') {\n        var root = element.getRootNode();\n        return root instanceof ShadowRoot ? root : null;\n      }\n\n      if (element instanceof ShadowRoot) {\n        return element;\n      } // when we don't find a shadow root\n\n\n      if (!element.parentNode) {\n        return null;\n      }\n\n      return Util.findShadowRoot(element.parentNode);\n    }\n  };\n  setTransitionEndSupport();\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME = 'alert';\n  var VERSION = '4.3.1';\n  var DATA_KEY = 'bs.alert';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n  var Selector = {\n    DISMISS: '[data-dismiss=\"alert\"]'\n  };\n  var Event = {\n    CLOSE: \"close\" + EVENT_KEY,\n    CLOSED: \"closed\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    ALERT: 'alert',\n    FADE: 'fade',\n    SHOW: 'show'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Alert =\n  /*#__PURE__*/\n  function () {\n    function Alert(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Alert.prototype;\n\n    // Public\n    _proto.close = function close(element) {\n      var rootElement = this._element;\n\n      if (element) {\n        rootElement = this._getRootElement(element);\n      }\n\n      var customEvent = this._triggerCloseEvent(rootElement);\n\n      if (customEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._removeElement(rootElement);\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._getRootElement = function _getRootElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      var parent = false;\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      if (!parent) {\n        parent = $(element).closest(\".\" + ClassName.ALERT)[0];\n      }\n\n      return parent;\n    };\n\n    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n      var closeEvent = $.Event(Event.CLOSE);\n      $(element).trigger(closeEvent);\n      return closeEvent;\n    };\n\n    _proto._removeElement = function _removeElement(element) {\n      var _this = this;\n\n      $(element).removeClass(ClassName.SHOW);\n\n      if (!$(element).hasClass(ClassName.FADE)) {\n        this._destroyElement(element);\n\n        return;\n      }\n\n      var transitionDuration = Util.getTransitionDurationFromElement(element);\n      $(element).one(Util.TRANSITION_END, function (event) {\n        return _this._destroyElement(element, event);\n      }).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto._destroyElement = function _destroyElement(element) {\n      $(element).detach().trigger(Event.CLOSED).remove();\n    } // Static\n    ;\n\n    Alert._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY);\n\n        if (!data) {\n          data = new Alert(this);\n          $element.data(DATA_KEY, data);\n        }\n\n        if (config === 'close') {\n          data[config](this);\n        }\n      });\n    };\n\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\n      return function (event) {\n        if (event) {\n          event.preventDefault();\n        }\n\n        alertInstance.close(this);\n      };\n    };\n\n    _createClass(Alert, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n\n    return Alert;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME] = Alert._jQueryInterface;\n  $.fn[NAME].Constructor = Alert;\n\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Alert._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$1 = 'button';\n  var VERSION$1 = '4.3.1';\n  var DATA_KEY$1 = 'bs.button';\n  var EVENT_KEY$1 = \".\" + DATA_KEY$1;\n  var DATA_API_KEY$1 = '.data-api';\n  var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1];\n  var ClassName$1 = {\n    ACTIVE: 'active',\n    BUTTON: 'btn',\n    FOCUS: 'focus'\n  };\n  var Selector$1 = {\n    DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n    DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n    INPUT: 'input:not([type=\"hidden\"])',\n    ACTIVE: '.active',\n    BUTTON: '.btn'\n  };\n  var Event$1 = {\n    CLICK_DATA_API: \"click\" + EVENT_KEY$1 + DATA_API_KEY$1,\n    FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY$1 + DATA_API_KEY$1 + \" \" + (\"blur\" + EVENT_KEY$1 + DATA_API_KEY$1)\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Button =\n  /*#__PURE__*/\n  function () {\n    function Button(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Button.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      var triggerChangeEvent = true;\n      var addAriaPressed = true;\n      var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];\n\n      if (rootElement) {\n        var input = this._element.querySelector(Selector$1.INPUT);\n\n        if (input) {\n          if (input.type === 'radio') {\n            if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) {\n              triggerChangeEvent = false;\n            } else {\n              var activeElement = rootElement.querySelector(Selector$1.ACTIVE);\n\n              if (activeElement) {\n                $(activeElement).removeClass(ClassName$1.ACTIVE);\n              }\n            }\n          }\n\n          if (triggerChangeEvent) {\n            if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n              return;\n            }\n\n            input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);\n            $(input).trigger('change');\n          }\n\n          input.focus();\n          addAriaPressed = false;\n        }\n      }\n\n      if (addAriaPressed) {\n        this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));\n      }\n\n      if (triggerChangeEvent) {\n        $(this._element).toggleClass(ClassName$1.ACTIVE);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$1);\n      this._element = null;\n    } // Static\n    ;\n\n    Button._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$1);\n\n        if (!data) {\n          data = new Button(this);\n          $(this).data(DATA_KEY$1, data);\n        }\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Button, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$1;\n      }\n    }]);\n\n    return Button;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    event.preventDefault();\n    var button = event.target;\n\n    if (!$(button).hasClass(ClassName$1.BUTTON)) {\n      button = $(button).closest(Selector$1.BUTTON);\n    }\n\n    Button._jQueryInterface.call($(button), 'toggle');\n  }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    var button = $(event.target).closest(Selector$1.BUTTON)[0];\n    $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$1] = Button._jQueryInterface;\n  $.fn[NAME$1].Constructor = Button;\n\n  $.fn[NAME$1].noConflict = function () {\n    $.fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n    return Button._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$2 = 'carousel';\n  var VERSION$2 = '4.3.1';\n  var DATA_KEY$2 = 'bs.carousel';\n  var EVENT_KEY$2 = \".\" + DATA_KEY$2;\n  var DATA_API_KEY$2 = '.data-api';\n  var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2];\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  var SWIPE_THRESHOLD = 40;\n  var Default = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  var DefaultType = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  var Direction = {\n    NEXT: 'next',\n    PREV: 'prev',\n    LEFT: 'left',\n    RIGHT: 'right'\n  };\n  var Event$2 = {\n    SLIDE: \"slide\" + EVENT_KEY$2,\n    SLID: \"slid\" + EVENT_KEY$2,\n    KEYDOWN: \"keydown\" + EVENT_KEY$2,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$2,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$2,\n    TOUCHSTART: \"touchstart\" + EVENT_KEY$2,\n    TOUCHMOVE: \"touchmove\" + EVENT_KEY$2,\n    TOUCHEND: \"touchend\" + EVENT_KEY$2,\n    POINTERDOWN: \"pointerdown\" + EVENT_KEY$2,\n    POINTERUP: \"pointerup\" + EVENT_KEY$2,\n    DRAG_START: \"dragstart\" + EVENT_KEY$2,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$2 + DATA_API_KEY$2,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$2 + DATA_API_KEY$2\n  };\n  var ClassName$2 = {\n    CAROUSEL: 'carousel',\n    ACTIVE: 'active',\n    SLIDE: 'slide',\n    RIGHT: 'carousel-item-right',\n    LEFT: 'carousel-item-left',\n    NEXT: 'carousel-item-next',\n    PREV: 'carousel-item-prev',\n    ITEM: 'carousel-item',\n    POINTER_EVENT: 'pointer-event'\n  };\n  var Selector$2 = {\n    ACTIVE: '.active',\n    ACTIVE_ITEM: '.active.carousel-item',\n    ITEM: '.carousel-item',\n    ITEM_IMG: '.carousel-item img',\n    NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n    INDICATORS: '.carousel-indicators',\n    DATA_SLIDE: '[data-slide], [data-slide-to]',\n    DATA_RIDE: '[data-ride=\"carousel\"]'\n  };\n  var PointerType = {\n    TOUCH: 'touch',\n    PEN: 'pen'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Carousel =\n  /*#__PURE__*/\n  function () {\n    function Carousel(element, config) {\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Carousel.prototype;\n\n    // Public\n    _proto.next = function next() {\n      if (!this._isSliding) {\n        this._slide(Direction.NEXT);\n      }\n    };\n\n    _proto.nextWhenVisible = function nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {\n        this.next();\n      }\n    };\n\n    _proto.prev = function prev() {\n      if (!this._isSliding) {\n        this._slide(Direction.PREV);\n      }\n    };\n\n    _proto.pause = function pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (this._element.querySelector(Selector$2.NEXT_PREV)) {\n        Util.triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    };\n\n    _proto.cycle = function cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config.interval && !this._isPaused) {\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    };\n\n    _proto.to = function to(index) {\n      var _this = this;\n\n      this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        $(this._element).one(Event$2.SLID, function () {\n          return _this.to(index);\n        });\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n      this._slide(direction, this._items[index]);\n    };\n\n    _proto.dispose = function dispose() {\n      $(this._element).off(EVENT_KEY$2);\n      $.removeData(this._element, DATA_KEY$2);\n      this._items = null;\n      this._config = null;\n      this._element = null;\n      this._interval = null;\n      this._isPaused = null;\n      this._isSliding = null;\n      this._activeElement = null;\n      this._indicatorsElement = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default, config);\n      Util.typeCheckConfig(NAME$2, config, DefaultType);\n      return config;\n    };\n\n    _proto._handleSwipe = function _handleSwipe() {\n      var absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      var direction = absDeltax / this.touchDeltaX; // swipe left\n\n      if (direction > 0) {\n        this.prev();\n      } // swipe right\n\n\n      if (direction < 0) {\n        this.next();\n      }\n    };\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this2 = this;\n\n      if (this._config.keyboard) {\n        $(this._element).on(Event$2.KEYDOWN, function (event) {\n          return _this2._keydown(event);\n        });\n      }\n\n      if (this._config.pause === 'hover') {\n        $(this._element).on(Event$2.MOUSEENTER, function (event) {\n          return _this2.pause(event);\n        }).on(Event$2.MOUSELEAVE, function (event) {\n          return _this2.cycle(event);\n        });\n      }\n\n      if (this._config.touch) {\n        this._addTouchEventListeners();\n      }\n    };\n\n    _proto._addTouchEventListeners = function _addTouchEventListeners() {\n      var _this3 = this;\n\n      if (!this._touchSupported) {\n        return;\n      }\n\n      var start = function start(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchStartX = event.originalEvent.clientX;\n        } else if (!_this3._pointerEvent) {\n          _this3.touchStartX = event.originalEvent.touches[0].clientX;\n        }\n      };\n\n      var move = function move(event) {\n        // ensure swiping with one touch and not pinching\n        if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n          _this3.touchDeltaX = 0;\n        } else {\n          _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;\n        }\n      };\n\n      var end = function end(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;\n        }\n\n        _this3._handleSwipe();\n\n        if (_this3._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          _this3.pause();\n\n          if (_this3.touchTimeout) {\n            clearTimeout(_this3.touchTimeout);\n          }\n\n          _this3.touchTimeout = setTimeout(function (event) {\n            return _this3.cycle(event);\n          }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);\n        }\n      };\n\n      $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) {\n        return e.preventDefault();\n      });\n\n      if (this._pointerEvent) {\n        $(this._element).on(Event$2.POINTERDOWN, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.POINTERUP, function (event) {\n          return end(event);\n        });\n\n        this._element.classList.add(ClassName$2.POINTER_EVENT);\n      } else {\n        $(this._element).on(Event$2.TOUCHSTART, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.TOUCHMOVE, function (event) {\n          return move(event);\n        });\n        $(this._element).on(Event$2.TOUCHEND, function (event) {\n          return end(event);\n        });\n      }\n    };\n\n    _proto._keydown = function _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      switch (event.which) {\n        case ARROW_LEFT_KEYCODE:\n          event.preventDefault();\n          this.prev();\n          break;\n\n        case ARROW_RIGHT_KEYCODE:\n          event.preventDefault();\n          this.next();\n          break;\n\n        default:\n      }\n    };\n\n    _proto._getItemIndex = function _getItemIndex(element) {\n      this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : [];\n      return this._items.indexOf(element);\n    };\n\n    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n      var isNextDirection = direction === Direction.NEXT;\n      var isPrevDirection = direction === Direction.PREV;\n\n      var activeIndex = this._getItemIndex(activeElement);\n\n      var lastItemIndex = this._items.length - 1;\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n      if (isGoingToWrap && !this._config.wrap) {\n        return activeElement;\n      }\n\n      var delta = direction === Direction.PREV ? -1 : 1;\n      var itemIndex = (activeIndex + delta) % this._items.length;\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n    };\n\n    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      var targetIndex = this._getItemIndex(relatedTarget);\n\n      var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM));\n\n      var slideEvent = $.Event(Event$2.SLIDE, {\n        relatedTarget: relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n      $(this._element).trigger(slideEvent);\n      return slideEvent;\n    };\n\n    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE));\n        $(indicators).removeClass(ClassName$2.ACTIVE);\n\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n        if (nextIndicator) {\n          $(nextIndicator).addClass(ClassName$2.ACTIVE);\n        }\n      }\n    };\n\n    _proto._slide = function _slide(direction, element) {\n      var _this4 = this;\n\n      var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeElementIndex = this._getItemIndex(activeElement);\n\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n      var nextElementIndex = this._getItemIndex(nextElement);\n\n      var isCycling = Boolean(this._interval);\n      var directionalClassName;\n      var orderClassName;\n      var eventDirectionName;\n\n      if (direction === Direction.NEXT) {\n        directionalClassName = ClassName$2.LEFT;\n        orderClassName = ClassName$2.NEXT;\n        eventDirectionName = Direction.LEFT;\n      } else {\n        directionalClassName = ClassName$2.RIGHT;\n        orderClassName = ClassName$2.PREV;\n        eventDirectionName = Direction.RIGHT;\n      }\n\n      if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) {\n        this._isSliding = false;\n        return;\n      }\n\n      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      var slidEvent = $.Event(Event$2.SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      });\n\n      if ($(this._element).hasClass(ClassName$2.SLIDE)) {\n        $(nextElement).addClass(orderClassName);\n        Util.reflow(nextElement);\n        $(activeElement).addClass(directionalClassName);\n        $(nextElement).addClass(directionalClassName);\n        var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);\n\n        if (nextElementInterval) {\n          this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n          this._config.interval = nextElementInterval;\n        } else {\n          this._config.interval = this._config.defaultInterval || this._config.interval;\n        }\n\n        var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n        $(activeElement).one(Util.TRANSITION_END, function () {\n          $(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName$2.ACTIVE);\n          $(activeElement).removeClass(ClassName$2.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n          _this4._isSliding = false;\n          setTimeout(function () {\n            return $(_this4._element).trigger(slidEvent);\n          }, 0);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        $(activeElement).removeClass(ClassName$2.ACTIVE);\n        $(nextElement).addClass(ClassName$2.ACTIVE);\n        this._isSliding = false;\n        $(this._element).trigger(slidEvent);\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    } // Static\n    ;\n\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$2);\n\n        var _config = _objectSpread({}, Default, $(this).data());\n\n        if (typeof config === 'object') {\n          _config = _objectSpread({}, _config, config);\n        }\n\n        var action = typeof config === 'string' ? config : _config.slide;\n\n        if (!data) {\n          data = new Carousel(this, _config);\n          $(this).data(DATA_KEY$2, data);\n        }\n\n        if (typeof config === 'number') {\n          data.to(config);\n        } else if (typeof action === 'string') {\n          if (typeof data[action] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n          }\n\n          data[action]();\n        } else if (_config.interval && _config.ride) {\n          data.pause();\n          data.cycle();\n        }\n      });\n    };\n\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n      var selector = Util.getSelectorFromElement(this);\n\n      if (!selector) {\n        return;\n      }\n\n      var target = $(selector)[0];\n\n      if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) {\n        return;\n      }\n\n      var config = _objectSpread({}, $(target).data(), $(this).data());\n\n      var slideIndex = this.getAttribute('data-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel._jQueryInterface.call($(target), config);\n\n      if (slideIndex) {\n        $(target).data(DATA_KEY$2).to(slideIndex);\n      }\n\n      event.preventDefault();\n    };\n\n    _createClass(Carousel, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$2;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n\n    return Carousel;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler);\n  $(window).on(Event$2.LOAD_DATA_API, function () {\n    var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE));\n\n    for (var i = 0, len = carousels.length; i < len; i++) {\n      var $carousel = $(carousels[i]);\n\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$2] = Carousel._jQueryInterface;\n  $.fn[NAME$2].Constructor = Carousel;\n\n  $.fn[NAME$2].noConflict = function () {\n    $.fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n    return Carousel._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$3 = 'collapse';\n  var VERSION$3 = '4.3.1';\n  var DATA_KEY$3 = 'bs.collapse';\n  var EVENT_KEY$3 = \".\" + DATA_KEY$3;\n  var DATA_API_KEY$3 = '.data-api';\n  var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3];\n  var Default$1 = {\n    toggle: true,\n    parent: ''\n  };\n  var DefaultType$1 = {\n    toggle: 'boolean',\n    parent: '(string|element)'\n  };\n  var Event$3 = {\n    SHOW: \"show\" + EVENT_KEY$3,\n    SHOWN: \"shown\" + EVENT_KEY$3,\n    HIDE: \"hide\" + EVENT_KEY$3,\n    HIDDEN: \"hidden\" + EVENT_KEY$3,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$3 + DATA_API_KEY$3\n  };\n  var ClassName$3 = {\n    SHOW: 'show',\n    COLLAPSE: 'collapse',\n    COLLAPSING: 'collapsing',\n    COLLAPSED: 'collapsed'\n  };\n  var Dimension = {\n    WIDTH: 'width',\n    HEIGHT: 'height'\n  };\n  var Selector$3 = {\n    ACTIVES: '.show, .collapsing',\n    DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Collapse =\n  /*#__PURE__*/\n  function () {\n    function Collapse(element, config) {\n      this._isTransitioning = false;\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._triggerArray = [].slice.call(document.querySelectorAll(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n      var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE));\n\n      for (var i = 0, len = toggleList.length; i < len; i++) {\n        var elem = toggleList[i];\n        var selector = Util.getSelectorFromElement(elem);\n        var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {\n          return foundElem === element;\n        });\n\n        if (selector !== null && filterElement.length > 0) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._parent = this._config.parent ? this._getParent() : null;\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    var _proto = Collapse.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if ($(this._element).hasClass(ClassName$3.SHOW)) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var actives;\n      var activesData;\n\n      if (this._parent) {\n        actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) {\n          if (typeof _this._config.parent === 'string') {\n            return elem.getAttribute('data-parent') === _this._config.parent;\n          }\n\n          return elem.classList.contains(ClassName$3.COLLAPSE);\n        });\n\n        if (actives.length === 0) {\n          actives = null;\n        }\n      }\n\n      if (actives) {\n        activesData = $(actives).not(this._selector).data(DATA_KEY$3);\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      var startEvent = $.Event(Event$3.SHOW);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (actives) {\n        Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');\n\n        if (!activesData) {\n          $(actives).data(DATA_KEY$3, null);\n        }\n      }\n\n      var dimension = this._getDimension();\n\n      $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING);\n      this._element.style[dimension] = 0;\n\n      if (this._triggerArray.length) {\n        $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true);\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW);\n        _this._element.style[dimension] = '';\n\n        _this.setTransitioning(false);\n\n        $(_this._element).trigger(Event$3.SHOWN);\n      };\n\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      var scrollSize = \"scroll\" + capitalizedDimension;\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      this._element.style[dimension] = this._element[scrollSize] + \"px\";\n    };\n\n    _proto.hide = function hide() {\n      var _this2 = this;\n\n      if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var startEvent = $.Event(Event$3.HIDE);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      var dimension = this._getDimension();\n\n      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n      Util.reflow(this._element);\n      $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW);\n      var triggerArrayLength = this._triggerArray.length;\n\n      if (triggerArrayLength > 0) {\n        for (var i = 0; i < triggerArrayLength; i++) {\n          var trigger = this._triggerArray[i];\n          var selector = Util.getSelectorFromElement(trigger);\n\n          if (selector !== null) {\n            var $elem = $([].slice.call(document.querySelectorAll(selector)));\n\n            if (!$elem.hasClass(ClassName$3.SHOW)) {\n              $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false);\n            }\n          }\n        }\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        _this2.setTransitioning(false);\n\n        $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN);\n      };\n\n      this._element.style[dimension] = '';\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto.setTransitioning = function setTransitioning(isTransitioning) {\n      this._isTransitioning = isTransitioning;\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$3);\n      this._config = null;\n      this._parent = null;\n      this._element = null;\n      this._triggerArray = null;\n      this._isTransitioning = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$1, config);\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      Util.typeCheckConfig(NAME$3, config, DefaultType$1);\n      return config;\n    };\n\n    _proto._getDimension = function _getDimension() {\n      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n    };\n\n    _proto._getParent = function _getParent() {\n      var _this3 = this;\n\n      var parent;\n\n      if (Util.isElement(this._config.parent)) {\n        parent = this._config.parent; // It's a jQuery object\n\n        if (typeof this._config.parent.jquery !== 'undefined') {\n          parent = this._config.parent[0];\n        }\n      } else {\n        parent = document.querySelector(this._config.parent);\n      }\n\n      var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n      var children = [].slice.call(parent.querySelectorAll(selector));\n      $(children).each(function (i, element) {\n        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n      });\n      return parent;\n    };\n\n    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n      var isOpen = $(element).hasClass(ClassName$3.SHOW);\n\n      if (triggerArray.length) {\n        $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n      }\n    } // Static\n    ;\n\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      return selector ? document.querySelector(selector) : null;\n    };\n\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$3);\n\n        var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});\n\n        if (!data && _config.toggle && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        if (!data) {\n          data = new Collapse(this, _config);\n          $this.data(DATA_KEY$3, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Collapse, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$3;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$1;\n      }\n    }]);\n\n    return Collapse;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.currentTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    var $trigger = $(this);\n    var selector = Util.getSelectorFromElement(this);\n    var selectors = [].slice.call(document.querySelectorAll(selector));\n    $(selectors).each(function () {\n      var $target = $(this);\n      var data = $target.data(DATA_KEY$3);\n      var config = data ? 'toggle' : $trigger.data();\n\n      Collapse._jQueryInterface.call($target, config);\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$3] = Collapse._jQueryInterface;\n  $.fn[NAME$3].Constructor = Collapse;\n\n  $.fn[NAME$3].noConflict = function () {\n    $.fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n    return Collapse._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$4 = 'dropdown';\n  var VERSION$4 = '4.3.1';\n  var DATA_KEY$4 = 'bs.dropdown';\n  var EVENT_KEY$4 = \".\" + DATA_KEY$4;\n  var DATA_API_KEY$4 = '.data-api';\n  var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4];\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n  var Event$4 = {\n    HIDE: \"hide\" + EVENT_KEY$4,\n    HIDDEN: \"hidden\" + EVENT_KEY$4,\n    SHOW: \"show\" + EVENT_KEY$4,\n    SHOWN: \"shown\" + EVENT_KEY$4,\n    CLICK: \"click\" + EVENT_KEY$4,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYUP_DATA_API: \"keyup\" + EVENT_KEY$4 + DATA_API_KEY$4\n  };\n  var ClassName$4 = {\n    DISABLED: 'disabled',\n    SHOW: 'show',\n    DROPUP: 'dropup',\n    DROPRIGHT: 'dropright',\n    DROPLEFT: 'dropleft',\n    MENURIGHT: 'dropdown-menu-right',\n    MENULEFT: 'dropdown-menu-left',\n    POSITION_STATIC: 'position-static'\n  };\n  var Selector$4 = {\n    DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n    FORM_CHILD: '.dropdown form',\n    MENU: '.dropdown-menu',\n    NAVBAR_NAV: '.navbar-nav',\n    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n  };\n  var AttachmentMap = {\n    TOP: 'top-start',\n    TOPEND: 'top-end',\n    BOTTOM: 'bottom-start',\n    BOTTOMEND: 'bottom-end',\n    RIGHT: 'right-start',\n    RIGHTEND: 'right-end',\n    LEFT: 'left-start',\n    LEFTEND: 'left-end'\n  };\n  var Default$2 = {\n    offset: 0,\n    flip: true,\n    boundary: 'scrollParent',\n    reference: 'toggle',\n    display: 'dynamic'\n  };\n  var DefaultType$2 = {\n    offset: '(number|string|function)',\n    flip: 'boolean',\n    boundary: '(string|element)',\n    reference: '(string|element)',\n    display: 'string'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Dropdown =\n  /*#__PURE__*/\n  function () {\n    function Dropdown(element, config) {\n      this._element = element;\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Dropdown.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      var isActive = $(this._menu).hasClass(ClassName$4.SHOW);\n\n      Dropdown._clearMenus();\n\n      if (isActive) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      } // Disable totally Popper.js for Dropdown in Navbar\n\n\n      if (!this._inNavbar) {\n        /**\n         * Check for Popper dependency\n         * Popper - https://popper.js.org\n         */\n        if (typeof Popper === 'undefined') {\n          throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)');\n        }\n\n        var referenceElement = this._element;\n\n        if (this._config.reference === 'parent') {\n          referenceElement = parent;\n        } else if (Util.isElement(this._config.reference)) {\n          referenceElement = this._config.reference; // Check if it's jQuery element\n\n          if (typeof this._config.reference.jquery !== 'undefined') {\n            referenceElement = this._config.reference[0];\n          }\n        } // If boundary is not `scrollParent`, then set position to `static`\n        // to allow the menu to \"escape\" the scroll parent's boundaries\n        // https://github.com/twbs/bootstrap/issues/24251\n\n\n        if (this._config.boundary !== 'scrollParent') {\n          $(parent).addClass(ClassName$4.POSITION_STATIC);\n        }\n\n        this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) {\n        $(document.body).children().on('mouseover', null, $.noop);\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.show = function show() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.hide = function hide() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$4);\n      $(this._element).off(EVENT_KEY$4);\n      this._element = null;\n      this._menu = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    };\n\n    _proto.update = function update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Private\n    ;\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this = this;\n\n      $(this._element).on(Event$4.CLICK, function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        _this.toggle();\n      });\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);\n      Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getMenuElement = function _getMenuElement() {\n      if (!this._menu) {\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        if (parent) {\n          this._menu = parent.querySelector(Selector$4.MENU);\n        }\n      }\n\n      return this._menu;\n    };\n\n    _proto._getPlacement = function _getPlacement() {\n      var $parentDropdown = $(this._element.parentNode);\n      var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n      if ($parentDropdown.hasClass(ClassName$4.DROPUP)) {\n        placement = AttachmentMap.TOP;\n\n        if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n          placement = AttachmentMap.TOPEND;\n        }\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) {\n        placement = AttachmentMap.RIGHT;\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) {\n        placement = AttachmentMap.LEFT;\n      } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n        placement = AttachmentMap.BOTTOMEND;\n      }\n\n      return placement;\n    };\n\n    _proto._detectNavbar = function _detectNavbar() {\n      return $(this._element).closest('.navbar').length > 0;\n    };\n\n    _proto._getOffset = function _getOffset() {\n      var _this2 = this;\n\n      var offset = {};\n\n      if (typeof this._config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this._config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getPopperConfig = function _getPopperConfig() {\n      var popperConfig = {\n        placement: this._getPlacement(),\n        modifiers: {\n          offset: this._getOffset(),\n          flip: {\n            enabled: this._config.flip\n          },\n          preventOverflow: {\n            boundariesElement: this._config.boundary\n          }\n        } // Disable Popper.js if we have a static display\n\n      };\n\n      if (this._config.display === 'static') {\n        popperConfig.modifiers.applyStyle = {\n          enabled: false\n        };\n      }\n\n      return popperConfig;\n    } // Static\n    ;\n\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$4);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data) {\n          data = new Dropdown(this, _config);\n          $(this).data(DATA_KEY$4, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    Dropdown._clearMenus = function _clearMenus(event) {\n      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n        return;\n      }\n\n      var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE));\n\n      for (var i = 0, len = toggles.length; i < len; i++) {\n        var parent = Dropdown._getParentFromElement(toggles[i]);\n\n        var context = $(toggles[i]).data(DATA_KEY$4);\n        var relatedTarget = {\n          relatedTarget: toggles[i]\n        };\n\n        if (event && event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n\n        if (!context) {\n          continue;\n        }\n\n        var dropdownMenu = context._menu;\n\n        if (!$(parent).hasClass(ClassName$4.SHOW)) {\n          continue;\n        }\n\n        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {\n          continue;\n        }\n\n        var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n        $(parent).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          continue;\n        } // If this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().off('mouseover', null, $.noop);\n        }\n\n        toggles[i].setAttribute('aria-expanded', 'false');\n        $(dropdownMenu).removeClass(ClassName$4.SHOW);\n        $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n      }\n    };\n\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\n      var parent;\n      var selector = Util.getSelectorFromElement(element);\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      return parent || element.parentNode;\n    } // eslint-disable-next-line complexity\n    ;\n\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this);\n\n      var isActive = $(parent).hasClass(ClassName$4.SHOW);\n\n      if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n        if (event.which === ESCAPE_KEYCODE) {\n          var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);\n          $(toggle).trigger('focus');\n        }\n\n        $(this).trigger('click');\n        return;\n      }\n\n      var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));\n\n      if (items.length === 0) {\n        return;\n      }\n\n      var index = items.indexOf(event.target);\n\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\n        // Up\n        index--;\n      }\n\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n        // Down\n        index++;\n      }\n\n      if (index < 0) {\n        index = 0;\n      }\n\n      items[index].focus();\n    };\n\n    _createClass(Dropdown, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$4;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$2;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$2;\n      }\n    }]);\n\n    return Dropdown;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + \" \" + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    Dropdown._jQueryInterface.call($(this), 'toggle');\n  }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) {\n    e.stopPropagation();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$4] = Dropdown._jQueryInterface;\n  $.fn[NAME$4].Constructor = Dropdown;\n\n  $.fn[NAME$4].noConflict = function () {\n    $.fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n    return Dropdown._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$5 = 'modal';\n  var VERSION$5 = '4.3.1';\n  var DATA_KEY$5 = 'bs.modal';\n  var EVENT_KEY$5 = \".\" + DATA_KEY$5;\n  var DATA_API_KEY$5 = '.data-api';\n  var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5];\n  var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var Default$3 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true,\n    show: true\n  };\n  var DefaultType$3 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean',\n    show: 'boolean'\n  };\n  var Event$5 = {\n    HIDE: \"hide\" + EVENT_KEY$5,\n    HIDDEN: \"hidden\" + EVENT_KEY$5,\n    SHOW: \"show\" + EVENT_KEY$5,\n    SHOWN: \"shown\" + EVENT_KEY$5,\n    FOCUSIN: \"focusin\" + EVENT_KEY$5,\n    RESIZE: \"resize\" + EVENT_KEY$5,\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$5,\n    KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY$5,\n    MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY$5,\n    MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY$5,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$5 + DATA_API_KEY$5\n  };\n  var ClassName$5 = {\n    SCROLLABLE: 'modal-dialog-scrollable',\n    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n    BACKDROP: 'modal-backdrop',\n    OPEN: 'modal-open',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$5 = {\n    DIALOG: '.modal-dialog',\n    MODAL_BODY: '.modal-body',\n    DATA_TOGGLE: '[data-toggle=\"modal\"]',\n    DATA_DISMISS: '[data-dismiss=\"modal\"]',\n    FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n    STICKY_CONTENT: '.sticky-top'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Modal =\n  /*#__PURE__*/\n  function () {\n    function Modal(element, config) {\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._dialog = element.querySelector(Selector$5.DIALOG);\n      this._backdrop = null;\n      this._isShown = false;\n      this._isBodyOverflowing = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollbarWidth = 0;\n    } // Getters\n\n\n    var _proto = Modal.prototype;\n\n    // Public\n    _proto.toggle = function toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    };\n\n    _proto.show = function show(relatedTarget) {\n      var _this = this;\n\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      if ($(this._element).hasClass(ClassName$5.FADE)) {\n        this._isTransitioning = true;\n      }\n\n      var showEvent = $.Event(Event$5.SHOW, {\n        relatedTarget: relatedTarget\n      });\n      $(this._element).trigger(showEvent);\n\n      if (this._isShown || showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = true;\n\n      this._checkScrollbar();\n\n      this._setScrollbar();\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) {\n        return _this.hide(event);\n      });\n      $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () {\n        $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) {\n          if ($(event.target).is(_this._element)) {\n            _this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(function () {\n        return _this._showElement(relatedTarget);\n      });\n    };\n\n    _proto.hide = function hide(event) {\n      var _this2 = this;\n\n      if (event) {\n        event.preventDefault();\n      }\n\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      var hideEvent = $.Event(Event$5.HIDE);\n      $(this._element).trigger(hideEvent);\n\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = false;\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (transition) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(document).off(Event$5.FOCUSIN);\n      $(this._element).removeClass(ClassName$5.SHOW);\n      $(this._element).off(Event$5.CLICK_DISMISS);\n      $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS);\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, function (event) {\n          return _this2._hideModal(event);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        this._hideModal();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      [window, this._element, this._dialog].forEach(function (htmlElement) {\n        return $(htmlElement).off(EVENT_KEY$5);\n      });\n      /**\n       * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n       * Do not move `document` in `htmlElements` array\n       * It will remove `Event.CLICK_DATA_API` event that should remain\n       */\n\n      $(document).off(Event$5.FOCUSIN);\n      $.removeData(this._element, DATA_KEY$5);\n      this._config = null;\n      this._element = null;\n      this._dialog = null;\n      this._backdrop = null;\n      this._isShown = null;\n      this._isBodyOverflowing = null;\n      this._ignoreBackdropClick = null;\n      this._isTransitioning = null;\n      this._scrollbarWidth = null;\n    };\n\n    _proto.handleUpdate = function handleUpdate() {\n      this._adjustDialog();\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$3, config);\n      Util.typeCheckConfig(NAME$5, config, DefaultType$3);\n      return config;\n    };\n\n    _proto._showElement = function _showElement(relatedTarget) {\n      var _this3 = this;\n\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.appendChild(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {\n        this._dialog.querySelector(Selector$5.MODAL_BODY).scrollTop = 0;\n      } else {\n        this._element.scrollTop = 0;\n      }\n\n      if (transition) {\n        Util.reflow(this._element);\n      }\n\n      $(this._element).addClass(ClassName$5.SHOW);\n\n      if (this._config.focus) {\n        this._enforceFocus();\n      }\n\n      var shownEvent = $.Event(Event$5.SHOWN, {\n        relatedTarget: relatedTarget\n      });\n\n      var transitionComplete = function transitionComplete() {\n        if (_this3._config.focus) {\n          _this3._element.focus();\n        }\n\n        _this3._isTransitioning = false;\n        $(_this3._element).trigger(shownEvent);\n      };\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);\n        $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n      } else {\n        transitionComplete();\n      }\n    };\n\n    _proto._enforceFocus = function _enforceFocus() {\n      var _this4 = this;\n\n      $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop\n      .on(Event$5.FOCUSIN, function (event) {\n        if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {\n          _this4._element.focus();\n        }\n      });\n    };\n\n    _proto._setEscapeEvent = function _setEscapeEvent() {\n      var _this5 = this;\n\n      if (this._isShown && this._config.keyboard) {\n        $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {\n          if (event.which === ESCAPE_KEYCODE$1) {\n            event.preventDefault();\n\n            _this5.hide();\n          }\n        });\n      } else if (!this._isShown) {\n        $(this._element).off(Event$5.KEYDOWN_DISMISS);\n      }\n    };\n\n    _proto._setResizeEvent = function _setResizeEvent() {\n      var _this6 = this;\n\n      if (this._isShown) {\n        $(window).on(Event$5.RESIZE, function (event) {\n          return _this6.handleUpdate(event);\n        });\n      } else {\n        $(window).off(Event$5.RESIZE);\n      }\n    };\n\n    _proto._hideModal = function _hideModal() {\n      var _this7 = this;\n\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._isTransitioning = false;\n\n      this._showBackdrop(function () {\n        $(document.body).removeClass(ClassName$5.OPEN);\n\n        _this7._resetAdjustments();\n\n        _this7._resetScrollbar();\n\n        $(_this7._element).trigger(Event$5.HIDDEN);\n      });\n    };\n\n    _proto._removeBackdrop = function _removeBackdrop() {\n      if (this._backdrop) {\n        $(this._backdrop).remove();\n        this._backdrop = null;\n      }\n    };\n\n    _proto._showBackdrop = function _showBackdrop(callback) {\n      var _this8 = this;\n\n      var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';\n\n      if (this._isShown && this._config.backdrop) {\n        this._backdrop = document.createElement('div');\n        this._backdrop.className = ClassName$5.BACKDROP;\n\n        if (animate) {\n          this._backdrop.classList.add(animate);\n        }\n\n        $(this._backdrop).appendTo(document.body);\n        $(this._element).on(Event$5.CLICK_DISMISS, function (event) {\n          if (_this8._ignoreBackdropClick) {\n            _this8._ignoreBackdropClick = false;\n            return;\n          }\n\n          if (event.target !== event.currentTarget) {\n            return;\n          }\n\n          if (_this8._config.backdrop === 'static') {\n            _this8._element.focus();\n          } else {\n            _this8.hide();\n          }\n        });\n\n        if (animate) {\n          Util.reflow(this._backdrop);\n        }\n\n        $(this._backdrop).addClass(ClassName$5.SHOW);\n\n        if (!callback) {\n          return;\n        }\n\n        if (!animate) {\n          callback();\n          return;\n        }\n\n        var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n        $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n      } else if (!this._isShown && this._backdrop) {\n        $(this._backdrop).removeClass(ClassName$5.SHOW);\n\n        var callbackRemove = function callbackRemove() {\n          _this8._removeBackdrop();\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        if ($(this._element).hasClass(ClassName$5.FADE)) {\n          var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n          $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n        } else {\n          callbackRemove();\n        }\n      } else if (callback) {\n        callback();\n      }\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // todo (fat): these should probably be refactored out of modal.js\n    // ----------------------------------------------------------------------\n    ;\n\n    _proto._adjustDialog = function _adjustDialog() {\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      if (!this._isBodyOverflowing && isModalOverflowing) {\n        this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n      }\n\n      if (this._isBodyOverflowing && !isModalOverflowing) {\n        this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n      }\n    };\n\n    _proto._resetAdjustments = function _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    };\n\n    _proto._checkScrollbar = function _checkScrollbar() {\n      var rect = document.body.getBoundingClientRect();\n      this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n      this._scrollbarWidth = this._getScrollbarWidth();\n    };\n\n    _proto._setScrollbar = function _setScrollbar() {\n      var _this9 = this;\n\n      if (this._isBodyOverflowing) {\n        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n        var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n        var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding\n\n        $(fixedContent).each(function (index, element) {\n          var actualPadding = element.style.paddingRight;\n          var calculatedPadding = $(element).css('padding-right');\n          $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n        }); // Adjust sticky content margin\n\n        $(stickyContent).each(function (index, element) {\n          var actualMargin = element.style.marginRight;\n          var calculatedMargin = $(element).css('margin-right');\n          $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n        }); // Adjust body padding\n\n        var actualPadding = document.body.style.paddingRight;\n        var calculatedPadding = $(document.body).css('padding-right');\n        $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n      }\n\n      $(document.body).addClass(ClassName$5.OPEN);\n    };\n\n    _proto._resetScrollbar = function _resetScrollbar() {\n      // Restore fixed content padding\n      var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n      $(fixedContent).each(function (index, element) {\n        var padding = $(element).data('padding-right');\n        $(element).removeData('padding-right');\n        element.style.paddingRight = padding ? padding : '';\n      }); // Restore sticky content\n\n      var elements = [].slice.call(document.querySelectorAll(\"\" + Selector$5.STICKY_CONTENT));\n      $(elements).each(function (index, element) {\n        var margin = $(element).data('margin-right');\n\n        if (typeof margin !== 'undefined') {\n          $(element).css('margin-right', margin).removeData('margin-right');\n        }\n      }); // Restore body padding\n\n      var padding = $(document.body).data('padding-right');\n      $(document.body).removeData('padding-right');\n      document.body.style.paddingRight = padding ? padding : '';\n    };\n\n    _proto._getScrollbarWidth = function _getScrollbarWidth() {\n      // thx d.walsh\n      var scrollDiv = document.createElement('div');\n      scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER;\n      document.body.appendChild(scrollDiv);\n      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n      document.body.removeChild(scrollDiv);\n      return scrollbarWidth;\n    } // Static\n    ;\n\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$5);\n\n        var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});\n\n        if (!data) {\n          data = new Modal(this, _config);\n          $(this).data(DATA_KEY$5, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](relatedTarget);\n        } else if (_config.show) {\n          data.show(relatedTarget);\n        }\n      });\n    };\n\n    _createClass(Modal, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$5;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$3;\n      }\n    }]);\n\n    return Modal;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {\n    var _this10 = this;\n\n    var target;\n    var selector = Util.getSelectorFromElement(this);\n\n    if (selector) {\n      target = document.querySelector(selector);\n    }\n\n    var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());\n\n    if (this.tagName === 'A' || this.tagName === 'AREA') {\n      event.preventDefault();\n    }\n\n    var $target = $(target).one(Event$5.SHOW, function (showEvent) {\n      if (showEvent.isDefaultPrevented()) {\n        // Only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      $target.one(Event$5.HIDDEN, function () {\n        if ($(_this10).is(':visible')) {\n          _this10.focus();\n        }\n      });\n    });\n\n    Modal._jQueryInterface.call($(target), config, this);\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$5] = Modal._jQueryInterface;\n  $.fn[NAME$5].Constructor = Modal;\n\n  $.fn[NAME$5].noConflict = function () {\n    $.fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n    return Modal._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): tools/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];\n  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  var DefaultWhitelist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n    /**\n     * A pattern that recognizes a commonly useful subset of URLs that are safe.\n     *\n     * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n     */\n\n  };\n  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;\n\n  function allowedAttribute(attr, allowedAttributeList) {\n    var attrName = attr.nodeName.toLowerCase();\n\n    if (allowedAttributeList.indexOf(attrName) !== -1) {\n      if (uriAttrs.indexOf(attrName) !== -1) {\n        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));\n      }\n\n      return true;\n    }\n\n    var regExp = allowedAttributeList.filter(function (attrRegex) {\n      return attrRegex instanceof RegExp;\n    }); // Check if a regular expression validates the attribute.\n\n    for (var i = 0, l = regExp.length; i < l; i++) {\n      if (attrName.match(regExp[i])) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n    if (unsafeHtml.length === 0) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    var domParser = new window.DOMParser();\n    var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    var whitelistKeys = Object.keys(whiteList);\n    var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));\n\n    var _loop = function _loop(i, len) {\n      var el = elements[i];\n      var elName = el.nodeName.toLowerCase();\n\n      if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n        el.parentNode.removeChild(el);\n        return \"continue\";\n      }\n\n      var attributeList = [].slice.call(el.attributes);\n      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);\n      attributeList.forEach(function (attr) {\n        if (!allowedAttribute(attr, whitelistedAttributes)) {\n          el.removeAttribute(attr.nodeName);\n        }\n      });\n    };\n\n    for (var i = 0, len = elements.length; i < len; i++) {\n      var _ret = _loop(i, len);\n\n      if (_ret === \"continue\") continue;\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$6 = 'tooltip';\n  var VERSION$6 = '4.3.1';\n  var DATA_KEY$6 = 'bs.tooltip';\n  var EVENT_KEY$6 = \".\" + DATA_KEY$6;\n  var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];\n  var CLASS_PREFIX = 'bs-tooltip';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];\n  var DefaultType$4 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(number|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacement: '(string|array)',\n    boundary: '(string|element)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    whiteList: 'object'\n  };\n  var AttachmentMap$1 = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: 'right',\n    BOTTOM: 'bottom',\n    LEFT: 'left'\n  };\n  var Default$4 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: 0,\n    container: false,\n    fallbackPlacement: 'flip',\n    boundary: 'scrollParent',\n    sanitize: true,\n    sanitizeFn: null,\n    whiteList: DefaultWhitelist\n  };\n  var HoverState = {\n    SHOW: 'show',\n    OUT: 'out'\n  };\n  var Event$6 = {\n    HIDE: \"hide\" + EVENT_KEY$6,\n    HIDDEN: \"hidden\" + EVENT_KEY$6,\n    SHOW: \"show\" + EVENT_KEY$6,\n    SHOWN: \"shown\" + EVENT_KEY$6,\n    INSERTED: \"inserted\" + EVENT_KEY$6,\n    CLICK: \"click\" + EVENT_KEY$6,\n    FOCUSIN: \"focusin\" + EVENT_KEY$6,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$6,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$6,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$6\n  };\n  var ClassName$6 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$6 = {\n    TOOLTIP: '.tooltip',\n    TOOLTIP_INNER: '.tooltip-inner',\n    ARROW: '.arrow'\n  };\n  var Trigger = {\n    HOVER: 'hover',\n    FOCUS: 'focus',\n    CLICK: 'click',\n    MANUAL: 'manual'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tooltip =\n  /*#__PURE__*/\n  function () {\n    function Tooltip(element, config) {\n      /**\n       * Check for Popper dependency\n       * Popper - https://popper.js.org\n       */\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)');\n      } // private\n\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this.element = element;\n      this.config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Tooltip.prototype;\n\n    // Public\n    _proto.enable = function enable() {\n      this._isEnabled = true;\n    };\n\n    _proto.disable = function disable() {\n      this._isEnabled = false;\n    };\n\n    _proto.toggleEnabled = function toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    };\n\n    _proto.toggle = function toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        var dataKey = this.constructor.DATA_KEY;\n        var context = $(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $(event.currentTarget).data(dataKey, context);\n        }\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      $.removeData(this.element, this.constructor.DATA_KEY);\n      $(this.element).off(this.constructor.EVENT_KEY);\n      $(this.element).closest('.modal').off('hide.bs.modal');\n\n      if (this.tip) {\n        $(this.tip).remove();\n      }\n\n      this._isEnabled = null;\n      this._timeout = null;\n      this._hoverState = null;\n      this._activeTrigger = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n      }\n\n      this._popper = null;\n      this.element = null;\n      this.config = null;\n      this.tip = null;\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if ($(this.element).css('display') === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      var showEvent = $.Event(this.constructor.Event.SHOW);\n\n      if (this.isWithContent() && this._isEnabled) {\n        $(this.element).trigger(showEvent);\n        var shadowRoot = Util.findShadowRoot(this.element);\n        var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);\n\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\n          return;\n        }\n\n        var tip = this.getTipElement();\n        var tipId = Util.getUID(this.constructor.NAME);\n        tip.setAttribute('id', tipId);\n        this.element.setAttribute('aria-describedby', tipId);\n        this.setContent();\n\n        if (this.config.animation) {\n          $(tip).addClass(ClassName$6.FADE);\n        }\n\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n        var attachment = this._getAttachment(placement);\n\n        this.addAttachmentClass(attachment);\n\n        var container = this._getContainer();\n\n        $(tip).data(this.constructor.DATA_KEY, this);\n\n        if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n          $(tip).appendTo(container);\n        }\n\n        $(this.element).trigger(this.constructor.Event.INSERTED);\n        this._popper = new Popper(this.element, tip, {\n          placement: attachment,\n          modifiers: {\n            offset: this._getOffset(),\n            flip: {\n              behavior: this.config.fallbackPlacement\n            },\n            arrow: {\n              element: Selector$6.ARROW\n            },\n            preventOverflow: {\n              boundariesElement: this.config.boundary\n            }\n          },\n          onCreate: function onCreate(data) {\n            if (data.originalPlacement !== data.placement) {\n              _this._handlePopperPlacementChange(data);\n            }\n          },\n          onUpdate: function onUpdate(data) {\n            return _this._handlePopperPlacementChange(data);\n          }\n        });\n        $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().on('mouseover', null, $.noop);\n        }\n\n        var complete = function complete() {\n          if (_this.config.animation) {\n            _this._fixTransition();\n          }\n\n          var prevHoverState = _this._hoverState;\n          _this._hoverState = null;\n          $(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n          if (prevHoverState === HoverState.OUT) {\n            _this._leave(null, _this);\n          }\n        };\n\n        if ($(this.tip).hasClass(ClassName$6.FADE)) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n          $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n      }\n    };\n\n    _proto.hide = function hide(callback) {\n      var _this2 = this;\n\n      var tip = this.getTipElement();\n      var hideEvent = $.Event(this.constructor.Event.HIDE);\n\n      var complete = function complete() {\n        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n          tip.parentNode.removeChild(tip);\n        }\n\n        _this2._cleanTipClass();\n\n        _this2.element.removeAttribute('aria-describedby');\n\n        $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n        if (_this2._popper !== null) {\n          _this2._popper.destroy();\n        }\n\n        if (callback) {\n          callback();\n        }\n      };\n\n      $(this.element).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        $(document.body).children().off('mouseover', null, $.noop);\n      }\n\n      this._activeTrigger[Trigger.CLICK] = false;\n      this._activeTrigger[Trigger.FOCUS] = false;\n      this._activeTrigger[Trigger.HOVER] = false;\n\n      if ($(this.tip).hasClass(ClassName$6.FADE)) {\n        var transitionDuration = Util.getTransitionDurationFromElement(tip);\n        $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n\n      this._hoverState = '';\n    };\n\n    _proto.update = function update() {\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Protected\n    ;\n\n    _proto.isWithContent = function isWithContent() {\n      return Boolean(this.getTitle());\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var tip = this.getTipElement();\n      this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle());\n      $(tip).removeClass(ClassName$6.FADE + \" \" + ClassName$6.SHOW);\n    };\n\n    _proto.setElementContent = function setElementContent($element, content) {\n      if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n        // Content is a DOM node or a jQuery\n        if (this.config.html) {\n          if (!$(content).parent().is($element)) {\n            $element.empty().append(content);\n          }\n        } else {\n          $element.text($(content).text());\n        }\n\n        return;\n      }\n\n      if (this.config.html) {\n        if (this.config.sanitize) {\n          content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);\n        }\n\n        $element.html(content);\n      } else {\n        $element.text(content);\n      }\n    };\n\n    _proto.getTitle = function getTitle() {\n      var title = this.element.getAttribute('data-original-title');\n\n      if (!title) {\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n      }\n\n      return title;\n    } // Private\n    ;\n\n    _proto._getOffset = function _getOffset() {\n      var _this3 = this;\n\n      var offset = {};\n\n      if (typeof this.config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this.config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getContainer = function _getContainer() {\n      if (this.config.container === false) {\n        return document.body;\n      }\n\n      if (Util.isElement(this.config.container)) {\n        return $(this.config.container);\n      }\n\n      return $(document).find(this.config.container);\n    };\n\n    _proto._getAttachment = function _getAttachment(placement) {\n      return AttachmentMap$1[placement.toUpperCase()];\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this4 = this;\n\n      var triggers = this.config.trigger.split(' ');\n      triggers.forEach(function (trigger) {\n        if (trigger === 'click') {\n          $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {\n            return _this4.toggle(event);\n          });\n        } else if (trigger !== Trigger.MANUAL) {\n          var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;\n          var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;\n          $(_this4.element).on(eventIn, _this4.config.selector, function (event) {\n            return _this4._enter(event);\n          }).on(eventOut, _this4.config.selector, function (event) {\n            return _this4._leave(event);\n          });\n        }\n      });\n      $(this.element).closest('.modal').on('hide.bs.modal', function () {\n        if (_this4.element) {\n          _this4.hide();\n        }\n      });\n\n      if (this.config.selector) {\n        this.config = _objectSpread({}, this.config, {\n          trigger: 'manual',\n          selector: ''\n        });\n      } else {\n        this._fixTitle();\n      }\n    };\n\n    _proto._fixTitle = function _fixTitle() {\n      var titleType = typeof this.element.getAttribute('data-original-title');\n\n      if (this.element.getAttribute('title') || titleType !== 'string') {\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n        this.element.setAttribute('title', '');\n      }\n    };\n\n    _proto._enter = function _enter(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n      }\n\n      if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) {\n        context._hoverState = HoverState.SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.SHOW;\n\n      if (!context.config.delay || !context.config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.SHOW) {\n          context.show();\n        }\n      }, context.config.delay.show);\n    };\n\n    _proto._leave = function _leave(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.OUT;\n\n      if (!context.config.delay || !context.config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.OUT) {\n          context.hide();\n        }\n      }, context.config.delay.hide);\n    };\n\n    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n      for (var trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      var dataAttributes = $(this.element).data();\n      Object.keys(dataAttributes).forEach(function (dataAttr) {\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);\n      }\n\n      return config;\n    };\n\n    _proto._getDelegateConfig = function _getDelegateConfig() {\n      var config = {};\n\n      if (this.config) {\n        for (var key in this.config) {\n          if (this.constructor.Default[key] !== this.config[key]) {\n            config[key] = this.config[key];\n          }\n        }\n      }\n\n      return config;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    };\n\n    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {\n      var popperInstance = popperData.instance;\n      this.tip = popperInstance.popper;\n\n      this._cleanTipClass();\n\n      this.addAttachmentClass(this._getAttachment(popperData.placement));\n    };\n\n    _proto._fixTransition = function _fixTransition() {\n      var tip = this.getTipElement();\n      var initConfigAnimation = this.config.animation;\n\n      if (tip.getAttribute('x-placement') !== null) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.FADE);\n      this.config.animation = false;\n      this.hide();\n      this.show();\n      this.config.animation = initConfigAnimation;\n    } // Static\n    ;\n\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$6);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Tooltip(this, _config);\n          $(this).data(DATA_KEY$6, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tooltip, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$6;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$4;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$6;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$6;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$6;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$6;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$4;\n      }\n    }]);\n\n    return Tooltip;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$6] = Tooltip._jQueryInterface;\n  $.fn[NAME$6].Constructor = Tooltip;\n\n  $.fn[NAME$6].noConflict = function () {\n    $.fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n    return Tooltip._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$7 = 'popover';\n  var VERSION$7 = '4.3.1';\n  var DATA_KEY$7 = 'bs.popover';\n  var EVENT_KEY$7 = \".\" + DATA_KEY$7;\n  var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];\n  var CLASS_PREFIX$1 = 'bs-popover';\n  var BSCLS_PREFIX_REGEX$1 = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX$1 + \"\\\\S+\", 'g');\n\n  var Default$5 = _objectSpread({}, Tooltip.Default, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n  });\n\n  var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, {\n    content: '(string|element|function)'\n  });\n\n  var ClassName$7 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$7 = {\n    TITLE: '.popover-header',\n    CONTENT: '.popover-body'\n  };\n  var Event$7 = {\n    HIDE: \"hide\" + EVENT_KEY$7,\n    HIDDEN: \"hidden\" + EVENT_KEY$7,\n    SHOW: \"show\" + EVENT_KEY$7,\n    SHOWN: \"shown\" + EVENT_KEY$7,\n    INSERTED: \"inserted\" + EVENT_KEY$7,\n    CLICK: \"click\" + EVENT_KEY$7,\n    FOCUSIN: \"focusin\" + EVENT_KEY$7,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$7,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$7,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$7\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Popover =\n  /*#__PURE__*/\n  function (_Tooltip) {\n    _inheritsLoose(Popover, _Tooltip);\n\n    function Popover() {\n      return _Tooltip.apply(this, arguments) || this;\n    }\n\n    var _proto = Popover.prototype;\n\n    // Overrides\n    _proto.isWithContent = function isWithContent() {\n      return this.getTitle() || this._getContent();\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX$1 + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events\n\n      this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle());\n\n      var content = this._getContent();\n\n      if (typeof content === 'function') {\n        content = content.call(this.element);\n      }\n\n      this.setElementContent($tip.find(Selector$7.CONTENT), content);\n      $tip.removeClass(ClassName$7.FADE + \" \" + ClassName$7.SHOW);\n    } // Private\n    ;\n\n    _proto._getContent = function _getContent() {\n      return this.element.getAttribute('data-content') || this.config.content;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    } // Static\n    ;\n\n    Popover._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$7);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Popover(this, _config);\n          $(this).data(DATA_KEY$7, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Popover, null, [{\n      key: \"VERSION\",\n      // Getters\n      get: function get() {\n        return VERSION$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$5;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$7;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$7;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$7;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$7;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$5;\n      }\n    }]);\n\n    return Popover;\n  }(Tooltip);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$7] = Popover._jQueryInterface;\n  $.fn[NAME$7].Constructor = Popover;\n\n  $.fn[NAME$7].noConflict = function () {\n    $.fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n    return Popover._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$8 = 'scrollspy';\n  var VERSION$8 = '4.3.1';\n  var DATA_KEY$8 = 'bs.scrollspy';\n  var EVENT_KEY$8 = \".\" + DATA_KEY$8;\n  var DATA_API_KEY$6 = '.data-api';\n  var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8];\n  var Default$6 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  var DefaultType$6 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  var Event$8 = {\n    ACTIVATE: \"activate\" + EVENT_KEY$8,\n    SCROLL: \"scroll\" + EVENT_KEY$8,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$8 + DATA_API_KEY$6\n  };\n  var ClassName$8 = {\n    DROPDOWN_ITEM: 'dropdown-item',\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active'\n  };\n  var Selector$8 = {\n    DATA_SPY: '[data-spy=\"scroll\"]',\n    ACTIVE: '.active',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    NAV_LINKS: '.nav-link',\n    NAV_ITEMS: '.nav-item',\n    LIST_ITEMS: '.list-group-item',\n    DROPDOWN: '.dropdown',\n    DROPDOWN_ITEMS: '.dropdown-item',\n    DROPDOWN_TOGGLE: '.dropdown-toggle'\n  };\n  var OffsetMethod = {\n    OFFSET: 'offset',\n    POSITION: 'position'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var ScrollSpy =\n  /*#__PURE__*/\n  function () {\n    function ScrollSpy(element, config) {\n      var _this = this;\n\n      this._element = element;\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\n      this._config = this._getConfig(config);\n      this._selector = this._config.target + \" \" + Selector$8.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector$8.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector$8.DROPDOWN_ITEMS);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      $(this._scrollElement).on(Event$8.SCROLL, function (event) {\n        return _this._process(event);\n      });\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    var _proto = ScrollSpy.prototype;\n\n    // Public\n    _proto.refresh = function refresh() {\n      var _this2 = this;\n\n      var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      var targets = [].slice.call(document.querySelectorAll(this._selector));\n      targets.map(function (element) {\n        var target;\n        var targetSelector = Util.getSelectorFromElement(element);\n\n        if (targetSelector) {\n          target = document.querySelector(targetSelector);\n        }\n\n        if (target) {\n          var targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            // TODO (fat): remove sketch reliance on jQuery position/offset\n            return [$(target)[offsetMethod]().top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(function (item) {\n        return item;\n      }).sort(function (a, b) {\n        return a[0] - b[0];\n      }).forEach(function (item) {\n        _this2._offsets.push(item[0]);\n\n        _this2._targets.push(item[1]);\n      });\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$8);\n      $(this._scrollElement).off(EVENT_KEY$8);\n      this._element = null;\n      this._scrollElement = null;\n      this._config = null;\n      this._selector = null;\n      this._offsets = null;\n      this._targets = null;\n      this._activeTarget = null;\n      this._scrollHeight = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$6, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.target !== 'string') {\n        var id = $(config.target).attr('id');\n\n        if (!id) {\n          id = Util.getUID(NAME$8);\n          $(config.target).attr('id', id);\n        }\n\n        config.target = \"#\" + id;\n      }\n\n      Util.typeCheckConfig(NAME$8, config, DefaultType$6);\n      return config;\n    };\n\n    _proto._getScrollTop = function _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    };\n\n    _proto._getScrollHeight = function _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    };\n\n    _proto._getOffsetHeight = function _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    };\n\n    _proto._process = function _process() {\n      var scrollTop = this._getScrollTop() + this._config.offset;\n\n      var scrollHeight = this._getScrollHeight();\n\n      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        var target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      var offsetLength = this._offsets.length;\n\n      for (var i = offsetLength; i--;) {\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    };\n\n    _proto._activate = function _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      var queries = this._selector.split(',').map(function (selector) {\n        return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + selector + \"[href=\\\"\" + target + \"\\\"]\";\n      });\n\n      var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));\n\n      if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) {\n        $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE);\n        $link.addClass(ClassName$8.ACTIVE);\n      } else {\n        // Set triggered link as active\n        $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_LINKS + \", \" + Selector$8.LIST_ITEMS).addClass(ClassName$8.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_ITEMS).children(Selector$8.NAV_LINKS).addClass(ClassName$8.ACTIVE);\n      }\n\n      $(this._scrollElement).trigger(Event$8.ACTIVATE, {\n        relatedTarget: target\n      });\n    };\n\n    _proto._clear = function _clear() {\n      [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {\n        return node.classList.contains(ClassName$8.ACTIVE);\n      }).forEach(function (node) {\n        return node.classList.remove(ClassName$8.ACTIVE);\n      });\n    } // Static\n    ;\n\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$8);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new ScrollSpy(this, _config);\n          $(this).data(DATA_KEY$8, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(ScrollSpy, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$8;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$6;\n      }\n    }]);\n\n    return ScrollSpy;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(window).on(Event$8.LOAD_DATA_API, function () {\n    var scrollSpys = [].slice.call(document.querySelectorAll(Selector$8.DATA_SPY));\n    var scrollSpysLength = scrollSpys.length;\n\n    for (var i = scrollSpysLength; i--;) {\n      var $spy = $(scrollSpys[i]);\n\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$8] = ScrollSpy._jQueryInterface;\n  $.fn[NAME$8].Constructor = ScrollSpy;\n\n  $.fn[NAME$8].noConflict = function () {\n    $.fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n    return ScrollSpy._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$9 = 'tab';\n  var VERSION$9 = '4.3.1';\n  var DATA_KEY$9 = 'bs.tab';\n  var EVENT_KEY$9 = \".\" + DATA_KEY$9;\n  var DATA_API_KEY$7 = '.data-api';\n  var JQUERY_NO_CONFLICT$9 = $.fn[NAME$9];\n  var Event$9 = {\n    HIDE: \"hide\" + EVENT_KEY$9,\n    HIDDEN: \"hidden\" + EVENT_KEY$9,\n    SHOW: \"show\" + EVENT_KEY$9,\n    SHOWN: \"shown\" + EVENT_KEY$9,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$9 + DATA_API_KEY$7\n  };\n  var ClassName$9 = {\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active',\n    DISABLED: 'disabled',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$9 = {\n    DROPDOWN: '.dropdown',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    ACTIVE: '.active',\n    ACTIVE_UL: '> li > .active',\n    DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n    DROPDOWN_TOGGLE: '.dropdown-toggle',\n    DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tab =\n  /*#__PURE__*/\n  function () {\n    function Tab(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Tab.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName$9.ACTIVE) || $(this._element).hasClass(ClassName$9.DISABLED)) {\n        return;\n      }\n\n      var target;\n      var previous;\n      var listElement = $(this._element).closest(Selector$9.NAV_LIST_GROUP)[0];\n      var selector = Util.getSelectorFromElement(this._element);\n\n      if (listElement) {\n        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector$9.ACTIVE_UL : Selector$9.ACTIVE;\n        previous = $.makeArray($(listElement).find(itemSelector));\n        previous = previous[previous.length - 1];\n      }\n\n      var hideEvent = $.Event(Event$9.HIDE, {\n        relatedTarget: this._element\n      });\n      var showEvent = $.Event(Event$9.SHOW, {\n        relatedTarget: previous\n      });\n\n      if (previous) {\n        $(previous).trigger(hideEvent);\n      }\n\n      $(this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (selector) {\n        target = document.querySelector(selector);\n      }\n\n      this._activate(this._element, listElement);\n\n      var complete = function complete() {\n        var hiddenEvent = $.Event(Event$9.HIDDEN, {\n          relatedTarget: _this._element\n        });\n        var shownEvent = $.Event(Event$9.SHOWN, {\n          relatedTarget: previous\n        });\n        $(previous).trigger(hiddenEvent);\n        $(_this._element).trigger(shownEvent);\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$9);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._activate = function _activate(element, container, callback) {\n      var _this2 = this;\n\n      var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector$9.ACTIVE_UL) : $(container).children(Selector$9.ACTIVE);\n      var active = activeElements[0];\n      var isTransitioning = callback && active && $(active).hasClass(ClassName$9.FADE);\n\n      var complete = function complete() {\n        return _this2._transitionComplete(element, active, callback);\n      };\n\n      if (active && isTransitioning) {\n        var transitionDuration = Util.getTransitionDurationFromElement(active);\n        $(active).removeClass(ClassName$9.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n      if (active) {\n        $(active).removeClass(ClassName$9.ACTIVE);\n        var dropdownChild = $(active.parentNode).find(Selector$9.DROPDOWN_ACTIVE_CHILD)[0];\n\n        if (dropdownChild) {\n          $(dropdownChild).removeClass(ClassName$9.ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      $(element).addClass(ClassName$9.ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      Util.reflow(element);\n\n      if (element.classList.contains(ClassName$9.FADE)) {\n        element.classList.add(ClassName$9.SHOW);\n      }\n\n      if (element.parentNode && $(element.parentNode).hasClass(ClassName$9.DROPDOWN_MENU)) {\n        var dropdownElement = $(element).closest(Selector$9.DROPDOWN)[0];\n\n        if (dropdownElement) {\n          var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector$9.DROPDOWN_TOGGLE));\n          $(dropdownToggleList).addClass(ClassName$9.ACTIVE);\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n    ;\n\n    Tab._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$9);\n\n        if (!data) {\n          data = new Tab(this);\n          $this.data(DATA_KEY$9, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tab, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$9;\n      }\n    }]);\n\n    return Tab;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$9.CLICK_DATA_API, Selector$9.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n\n    Tab._jQueryInterface.call($(this), 'show');\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$9] = Tab._jQueryInterface;\n  $.fn[NAME$9].Constructor = Tab;\n\n  $.fn[NAME$9].noConflict = function () {\n    $.fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n    return Tab._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$a = 'toast';\n  var VERSION$a = '4.3.1';\n  var DATA_KEY$a = 'bs.toast';\n  var EVENT_KEY$a = \".\" + DATA_KEY$a;\n  var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];\n  var Event$a = {\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$a,\n    HIDE: \"hide\" + EVENT_KEY$a,\n    HIDDEN: \"hidden\" + EVENT_KEY$a,\n    SHOW: \"show\" + EVENT_KEY$a,\n    SHOWN: \"shown\" + EVENT_KEY$a\n  };\n  var ClassName$a = {\n    FADE: 'fade',\n    HIDE: 'hide',\n    SHOW: 'show',\n    SHOWING: 'showing'\n  };\n  var DefaultType$7 = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  var Default$7 = {\n    animation: true,\n    autohide: true,\n    delay: 500\n  };\n  var Selector$a = {\n    DATA_DISMISS: '[data-dismiss=\"toast\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Toast =\n  /*#__PURE__*/\n  function () {\n    function Toast(element, config) {\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._timeout = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Toast.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      $(this._element).trigger(Event$a.SHOW);\n\n      if (this._config.animation) {\n        this._element.classList.add(ClassName$a.FADE);\n      }\n\n      var complete = function complete() {\n        _this._element.classList.remove(ClassName$a.SHOWING);\n\n        _this._element.classList.add(ClassName$a.SHOW);\n\n        $(_this._element).trigger(Event$a.SHOWN);\n\n        if (_this._config.autohide) {\n          _this.hide();\n        }\n      };\n\n      this._element.classList.remove(ClassName$a.HIDE);\n\n      this._element.classList.add(ClassName$a.SHOWING);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.hide = function hide(withoutTimeout) {\n      var _this2 = this;\n\n      if (!this._element.classList.contains(ClassName$a.SHOW)) {\n        return;\n      }\n\n      $(this._element).trigger(Event$a.HIDE);\n\n      if (withoutTimeout) {\n        this._close();\n      } else {\n        this._timeout = setTimeout(function () {\n          _this2._close();\n        }, this._config.delay);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n\n      if (this._element.classList.contains(ClassName$a.SHOW)) {\n        this._element.classList.remove(ClassName$a.SHOW);\n      }\n\n      $(this._element).off(Event$a.CLICK_DISMISS);\n      $.removeData(this._element, DATA_KEY$a);\n      this._element = null;\n      this._config = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$7, $(this._element).data(), typeof config === 'object' && config ? config : {});\n      Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this3 = this;\n\n      $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {\n        return _this3.hide(true);\n      });\n    };\n\n    _proto._close = function _close() {\n      var _this4 = this;\n\n      var complete = function complete() {\n        _this4._element.classList.add(ClassName$a.HIDE);\n\n        $(_this4._element).trigger(Event$a.HIDDEN);\n      };\n\n      this._element.classList.remove(ClassName$a.SHOW);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    } // Static\n    ;\n\n    Toast._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY$a);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new Toast(this, _config);\n          $element.data(DATA_KEY$a, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](this);\n        }\n      });\n    };\n\n    _createClass(Toast, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$a;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$7;\n      }\n    }]);\n\n    return Toast;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$a] = Toast._jQueryInterface;\n  $.fn[NAME$a].Constructor = Toast;\n\n  $.fn[NAME$a].noConflict = function () {\n    $.fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n    return Toast._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  (function () {\n    if (typeof $ === 'undefined') {\n      throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n    }\n\n    var version = $.fn.jquery.split(' ')[0].split('.');\n    var minMajor = 1;\n    var ltMajor = 2;\n    var minMinor = 9;\n    var minPatch = 1;\n    var maxMajor = 4;\n\n    if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n      throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n    }\n  })();\n\n  exports.Util = Util;\n  exports.Alert = Alert;\n  exports.Button = Button;\n  exports.Carousel = Carousel;\n  exports.Collapse = Collapse;\n  exports.Dropdown = Dropdown;\n  exports.Modal = Modal;\n  exports.Popover = Popover;\n  exports.Scrollspy = ScrollSpy;\n  exports.Tab = Tab;\n  exports.Toast = Toast;\n  exports.Tooltip = Tooltip;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=bootstrap.js.map\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/jquery/LICENSE.txt",
    "content": "Copyright JS Foundation and other contributors, https://js.foundation/\n\nThis software consists of voluntary contributions made by many\nindividuals. For exact contribution history, see the revision history\navailable at https://github.com/jquery/jquery\n\nThe following license applies to all parts of this software except as\ndocumented below:\n\n====\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n====\n\nAll files located in the node_modules and external directories are\nexternally maintained libraries used by this software which have their\nown licenses; we recommend you read them, as their terms may differ from\nthe terms above.\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/jquery/dist/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v3.5.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2020-05-04T22:49Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n      // Support: Chrome <=57, Firefox <=52\n      // In some browsers, typeof returns \"function\" for HTML <object> elements\n      // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n      // We don't want to classify *any* DOM node as a function.\n      return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n  };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.5.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( _i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.5\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2020-03-14\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem.namespaceURI,\n\t\tdocElem = ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px\";\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = parseInt( trStyle.height ) > 3;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = (\n\t\t\t\t\tdataPriv.get( cur, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script\n\t\t\tif ( !isSuccess && jQuery.inArray( \"script\", s.dataTypes ) > -1 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tif ( typeof props.top === \"number\" ) {\n\t\t\t\tprops.top += \"px\";\n\t\t\t}\n\t\t\tif ( typeof props.left === \"number\" ) {\n\t\t\t\tprops.left += \"px\";\n\t\t\t}\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t} );\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/jquery-validation/LICENSE.md",
    "content": "The MIT License (MIT)\n=====================\n\nCopyright Jörn Zaefferer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/jquery-validation/dist/additional-methods.js",
    "content": "/*!\n * jQuery Validation Plugin v1.17.0\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2017 Jörn Zaefferer\n * Released under the MIT license\n */\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( [\"jquery\", \"./jquery.validate\"], factory );\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t} else {\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n( function() {\n\n\tfunction stripHtml( value ) {\n\n\t\t// Remove html tags and space chars\n\t\treturn value.replace( /<.[^<>]*?>/g, \" \" ).replace( /&nbsp;|&#160;/gi, \" \" )\n\n\t\t// Remove punctuation\n\t\t.replace( /[.(),;:!?%#$'\\\"_+=\\/\\-“”’]*/g, \"\" );\n\t}\n\n\t$.validator.addMethod( \"maxWords\", function( value, element, params ) {\n\t\treturn this.optional( element ) || stripHtml( value ).match( /\\b\\w+\\b/g ).length <= params;\n\t}, $.validator.format( \"Please enter {0} words or less.\" ) );\n\n\t$.validator.addMethod( \"minWords\", function( value, element, params ) {\n\t\treturn this.optional( element ) || stripHtml( value ).match( /\\b\\w+\\b/g ).length >= params;\n\t}, $.validator.format( \"Please enter at least {0} words.\" ) );\n\n\t$.validator.addMethod( \"rangeWords\", function( value, element, params ) {\n\t\tvar valueStripped = stripHtml( value ),\n\t\t\tregex = /\\b\\w+\\b/g;\n\t\treturn this.optional( element ) || valueStripped.match( regex ).length >= params[ 0 ] && valueStripped.match( regex ).length <= params[ 1 ];\n\t}, $.validator.format( \"Please enter between {0} and {1} words.\" ) );\n\n}() );\n\n// Accept a value from a file input based on a required mimetype\n$.validator.addMethod( \"accept\", function( value, element, param ) {\n\n\t// Split mime on commas in case we have multiple types we can accept\n\tvar typeParam = typeof param === \"string\" ? param.replace( /\\s/g, \"\" ) : \"image/*\",\n\t\toptionalValue = this.optional( element ),\n\t\ti, file, regex;\n\n\t// Element is optional\n\tif ( optionalValue ) {\n\t\treturn optionalValue;\n\t}\n\n\tif ( $( element ).attr( \"type\" ) === \"file\" ) {\n\n\t\t// Escape string to be used in the regex\n\t\t// see: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\n\t\t// Escape also \"/*\" as \"/.*\" as a wildcard\n\t\ttypeParam = typeParam\n\t\t\t\t.replace( /[\\-\\[\\]\\/\\{\\}\\(\\)\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\" )\n\t\t\t\t.replace( /,/g, \"|\" )\n\t\t\t\t.replace( /\\/\\*/g, \"/.*\" );\n\n\t\t// Check if the element has a FileList before checking each file\n\t\tif ( element.files && element.files.length ) {\n\t\t\tregex = new RegExp( \".?(\" + typeParam + \")$\", \"i\" );\n\t\t\tfor ( i = 0; i < element.files.length; i++ ) {\n\t\t\t\tfile = element.files[ i ];\n\n\t\t\t\t// Grab the mimetype from the loaded file, verify it matches\n\t\t\t\tif ( !file.type.match( regex ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Either return true because we've validated each file, or because the\n\t// browser does not support element.files and the FileList feature\n\treturn true;\n}, $.validator.format( \"Please enter a value with a valid mimetype.\" ) );\n\n$.validator.addMethod( \"alphanumeric\", function( value, element ) {\n\treturn this.optional( element ) || /^\\w+$/i.test( value );\n}, \"Letters, numbers, and underscores only please\" );\n\n/*\n * Dutch bank account numbers (not 'giro' numbers) have 9 digits\n * and pass the '11 check'.\n * We accept the notation with spaces, as that is common.\n * acceptable: 123456789 or 12 34 56 789\n */\n$.validator.addMethod( \"bankaccountNL\", function( value, element ) {\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\tif ( !( /^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test( value ) ) ) {\n\t\treturn false;\n\t}\n\n\t// Now '11 check'\n\tvar account = value.replace( / /g, \"\" ), // Remove spaces\n\t\tsum = 0,\n\t\tlen = account.length,\n\t\tpos, factor, digit;\n\tfor ( pos = 0; pos < len; pos++ ) {\n\t\tfactor = len - pos;\n\t\tdigit = account.substring( pos, pos + 1 );\n\t\tsum = sum + factor * digit;\n\t}\n\treturn sum % 11 === 0;\n}, \"Please specify a valid bank account number\" );\n\n$.validator.addMethod( \"bankorgiroaccountNL\", function( value, element ) {\n\treturn this.optional( element ) ||\n\t\t\t( $.validator.methods.bankaccountNL.call( this, value, element ) ) ||\n\t\t\t( $.validator.methods.giroaccountNL.call( this, value, element ) );\n}, \"Please specify a valid bank or giro account number\" );\n\n/**\n * BIC is the business identifier code (ISO 9362). This BIC check is not a guarantee for authenticity.\n *\n * BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional)\n *\n * Validation is case-insensitive. Please make sure to normalize input yourself.\n *\n * BIC definition in detail:\n * - First 4 characters - bank code (only letters)\n * - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters)\n * - Next 2 characters - location code (letters and digits)\n *   a. shall not start with '0' or '1'\n *   b. second character must be a letter ('O' is not allowed) or digit ('0' for test (therefore not allowed), '1' denoting passive participant, '2' typically reverse-billing)\n * - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits)\n */\n$.validator.addMethod( \"bic\", function( value, element ) {\n    return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value.toUpperCase() );\n}, \"Please specify a valid BIC code\" );\n\n/*\n * Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities\n * Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal\n *\n * Spanish CIF structure:\n *\n * [ T ][ P ][ P ][ N ][ N ][ N ][ N ][ N ][ C ]\n *\n * Where:\n *\n * T: 1 character. Kind of Organization Letter: [ABCDEFGHJKLMNPQRSUVW]\n * P: 2 characters. Province.\n * N: 5 characters. Secuencial Number within the province.\n * C: 1 character. Control Digit: [0-9A-J].\n *\n * [ T ]: Kind of Organizations. Possible values:\n *\n *   A. Corporations\n *   B. LLCs\n *   C. General partnerships\n *   D. Companies limited partnerships\n *   E. Communities of goods\n *   F. Cooperative Societies\n *   G. Associations\n *   H. Communities of homeowners in horizontal property regime\n *   J. Civil Societies\n *   K. Old format\n *   L. Old format\n *   M. Old format\n *   N. Nonresident entities\n *   P. Local authorities\n *   Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions\n *   R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)\n *   S. Organs of State Administration and regions\n *   V. Agrarian Transformation\n *   W. Permanent establishments of non-resident in Spain\n *\n * [ C ]: Control Digit. It can be a number or a letter depending on T value:\n * [ T ]  -->  [ C ]\n * ------    ----------\n *   A         Number\n *   B         Number\n *   E         Number\n *   H         Number\n *   K         Letter\n *   P         Letter\n *   Q         Letter\n *   S         Letter\n *\n */\n$.validator.addMethod( \"cifES\", function( value, element ) {\n\t\"use strict\";\n\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\n\tvar cifRegEx = new RegExp( /^([ABCDEFGHJKLMNPQRSUVW])(\\d{7})([0-9A-J])$/gi );\n\tvar letter  = value.substring( 0, 1 ), // [ T ]\n\t\tnumber  = value.substring( 1, 8 ), // [ P ][ P ][ N ][ N ][ N ][ N ][ N ]\n\t\tcontrol = value.substring( 8, 9 ), // [ C ]\n\t\tall_sum = 0,\n\t\teven_sum = 0,\n\t\todd_sum = 0,\n\t\ti, n,\n\t\tcontrol_digit,\n\t\tcontrol_letter;\n\n\tfunction isOdd( n ) {\n\t\treturn n % 2 === 0;\n\t}\n\n\t// Quick format test\n\tif ( value.length !== 9 || !cifRegEx.test( value ) ) {\n\t\treturn false;\n\t}\n\n\tfor ( i = 0; i < number.length; i++ ) {\n\t\tn = parseInt( number[ i ], 10 );\n\n\t\t// Odd positions\n\t\tif ( isOdd( i ) ) {\n\n\t\t\t// Odd positions are multiplied first.\n\t\t\tn *= 2;\n\n\t\t\t// If the multiplication is bigger than 10 we need to adjust\n\t\t\todd_sum += n < 10 ? n : n - 9;\n\n\t\t// Even positions\n\t\t// Just sum them\n\t\t} else {\n\t\t\teven_sum += n;\n\t\t}\n\t}\n\n\tall_sum = even_sum + odd_sum;\n\tcontrol_digit = ( 10 - ( all_sum ).toString().substr( -1 ) ).toString();\n\tcontrol_digit = parseInt( control_digit, 10 ) > 9 ? \"0\" : control_digit;\n\tcontrol_letter = \"JABCDEFGHI\".substr( control_digit, 1 ).toString();\n\n\t// Control must be a digit\n\tif ( letter.match( /[ABEH]/ ) ) {\n\t\treturn control === control_digit;\n\n\t// Control must be a letter\n\t} else if ( letter.match( /[KPQS]/ ) ) {\n\t\treturn control === control_letter;\n\t}\n\n\t// Can be either\n\treturn control === control_digit || control === control_letter;\n\n}, \"Please specify a valid CIF number.\" );\n\n/*\n * Brazillian CPF number (Cadastrado de Pessoas Físicas) is the equivalent of a Brazilian tax registration number.\n * CPF numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.\n */\n$.validator.addMethod( \"cpfBR\", function( value ) {\n\n\t// Removing special characters from value\n\tvalue = value.replace( /([~!@#$%^&*()_+=`{}\\[\\]\\-|\\\\:;'<>,.\\/? ])+/g, \"\" );\n\n\t// Checking value to have 11 digits only\n\tif ( value.length !== 11 ) {\n\t\treturn false;\n\t}\n\n\tvar sum = 0,\n\t\tfirstCN, secondCN, checkResult, i;\n\n\tfirstCN = parseInt( value.substring( 9, 10 ), 10 );\n\tsecondCN = parseInt( value.substring( 10, 11 ), 10 );\n\n\tcheckResult = function( sum, cn ) {\n\t\tvar result = ( sum * 10 ) % 11;\n\t\tif ( ( result === 10 ) || ( result === 11 ) ) {\n\t\t\tresult = 0;\n\t\t}\n\t\treturn ( result === cn );\n\t};\n\n\t// Checking for dump data\n\tif ( value === \"\" ||\n\t\tvalue === \"00000000000\" ||\n\t\tvalue === \"11111111111\" ||\n\t\tvalue === \"22222222222\" ||\n\t\tvalue === \"33333333333\" ||\n\t\tvalue === \"44444444444\" ||\n\t\tvalue === \"55555555555\" ||\n\t\tvalue === \"66666666666\" ||\n\t\tvalue === \"77777777777\" ||\n\t\tvalue === \"88888888888\" ||\n\t\tvalue === \"99999999999\"\n\t) {\n\t\treturn false;\n\t}\n\n\t// Step 1 - using first Check Number:\n\tfor ( i = 1; i <= 9; i++ ) {\n\t\tsum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 11 - i );\n\t}\n\n\t// If first Check Number (CN) is valid, move to Step 2 - using second Check Number:\n\tif ( checkResult( sum, firstCN ) ) {\n\t\tsum = 0;\n\t\tfor ( i = 1; i <= 10; i++ ) {\n\t\t\tsum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 12 - i );\n\t\t}\n\t\treturn checkResult( sum, secondCN );\n\t}\n\treturn false;\n\n}, \"Please specify a valid CPF number\" );\n\n// https://jqueryvalidation.org/creditcard-method/\n// based on https://en.wikipedia.org/wiki/Luhn_algorithm\n$.validator.addMethod( \"creditcard\", function( value, element ) {\n\tif ( this.optional( element ) ) {\n\t\treturn \"dependency-mismatch\";\n\t}\n\n\t// Accept only spaces, digits and dashes\n\tif ( /[^0-9 \\-]+/.test( value ) ) {\n\t\treturn false;\n\t}\n\n\tvar nCheck = 0,\n\t\tnDigit = 0,\n\t\tbEven = false,\n\t\tn, cDigit;\n\n\tvalue = value.replace( /\\D/g, \"\" );\n\n\t// Basing min and max length on\n\t// https://developer.ean.com/general_info/Valid_Credit_Card_Types\n\tif ( value.length < 13 || value.length > 19 ) {\n\t\treturn false;\n\t}\n\n\tfor ( n = value.length - 1; n >= 0; n-- ) {\n\t\tcDigit = value.charAt( n );\n\t\tnDigit = parseInt( cDigit, 10 );\n\t\tif ( bEven ) {\n\t\t\tif ( ( nDigit *= 2 ) > 9 ) {\n\t\t\t\tnDigit -= 9;\n\t\t\t}\n\t\t}\n\n\t\tnCheck += nDigit;\n\t\tbEven = !bEven;\n\t}\n\n\treturn ( nCheck % 10 ) === 0;\n}, \"Please enter a valid credit card number.\" );\n\n/* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator\n * Redistributed under the the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0\n * Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)\n */\n$.validator.addMethod( \"creditcardtypes\", function( value, element, param ) {\n\tif ( /[^0-9\\-]+/.test( value ) ) {\n\t\treturn false;\n\t}\n\n\tvalue = value.replace( /\\D/g, \"\" );\n\n\tvar validTypes = 0x0000;\n\n\tif ( param.mastercard ) {\n\t\tvalidTypes |= 0x0001;\n\t}\n\tif ( param.visa ) {\n\t\tvalidTypes |= 0x0002;\n\t}\n\tif ( param.amex ) {\n\t\tvalidTypes |= 0x0004;\n\t}\n\tif ( param.dinersclub ) {\n\t\tvalidTypes |= 0x0008;\n\t}\n\tif ( param.enroute ) {\n\t\tvalidTypes |= 0x0010;\n\t}\n\tif ( param.discover ) {\n\t\tvalidTypes |= 0x0020;\n\t}\n\tif ( param.jcb ) {\n\t\tvalidTypes |= 0x0040;\n\t}\n\tif ( param.unknown ) {\n\t\tvalidTypes |= 0x0080;\n\t}\n\tif ( param.all ) {\n\t\tvalidTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;\n\t}\n\tif ( validTypes & 0x0001 && /^(5[12345])/.test( value ) ) { // Mastercard\n\t\treturn value.length === 16;\n\t}\n\tif ( validTypes & 0x0002 && /^(4)/.test( value ) ) { // Visa\n\t\treturn value.length === 16;\n\t}\n\tif ( validTypes & 0x0004 && /^(3[47])/.test( value ) ) { // Amex\n\t\treturn value.length === 15;\n\t}\n\tif ( validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test( value ) ) { // Dinersclub\n\t\treturn value.length === 14;\n\t}\n\tif ( validTypes & 0x0010 && /^(2(014|149))/.test( value ) ) { // Enroute\n\t\treturn value.length === 15;\n\t}\n\tif ( validTypes & 0x0020 && /^(6011)/.test( value ) ) { // Discover\n\t\treturn value.length === 16;\n\t}\n\tif ( validTypes & 0x0040 && /^(3)/.test( value ) ) { // Jcb\n\t\treturn value.length === 16;\n\t}\n\tif ( validTypes & 0x0040 && /^(2131|1800)/.test( value ) ) { // Jcb\n\t\treturn value.length === 15;\n\t}\n\tif ( validTypes & 0x0080 ) { // Unknown\n\t\treturn true;\n\t}\n\treturn false;\n}, \"Please enter a valid credit card number.\" );\n\n/**\n * Validates currencies with any given symbols by @jameslouiz\n * Symbols can be optional or required. Symbols required by default\n *\n * Usage examples:\n *  currency: [\"£\", false] - Use false for soft currency validation\n *  currency: [\"$\", false]\n *  currency: [\"RM\", false] - also works with text based symbols such as \"RM\" - Malaysia Ringgit etc\n *\n *  <input class=\"currencyInput\" name=\"currencyInput\">\n *\n * Soft symbol checking\n *  currencyInput: {\n *     currency: [\"$\", false]\n *  }\n *\n * Strict symbol checking (default)\n *  currencyInput: {\n *     currency: \"$\"\n *     //OR\n *     currency: [\"$\", true]\n *  }\n *\n * Multiple Symbols\n *  currencyInput: {\n *     currency: \"$,£,¢\"\n *  }\n */\n$.validator.addMethod( \"currency\", function( value, element, param ) {\n    var isParamString = typeof param === \"string\",\n        symbol = isParamString ? param : param[ 0 ],\n        soft = isParamString ? true : param[ 1 ],\n        regex;\n\n    symbol = symbol.replace( /,/g, \"\" );\n    symbol = soft ? symbol + \"]\" : symbol + \"]?\";\n    regex = \"^[\" + symbol + \"([1-9]{1}[0-9]{0,2}(\\\\,[0-9]{3})*(\\\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\\\.[0-9]{0,2})?|0(\\\\.[0-9]{0,2})?|(\\\\.[0-9]{1,2})?)$\";\n    regex = new RegExp( regex );\n    return this.optional( element ) || regex.test( value );\n\n}, \"Please specify a valid currency\" );\n\n$.validator.addMethod( \"dateFA\", function( value, element ) {\n\treturn this.optional( element ) || /^[1-4]\\d{3}\\/((0?[1-6]\\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\\/(30|([1-2][0-9])|(0?[1-9]))))$/.test( value );\n}, $.validator.messages.date );\n\n/**\n * Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.\n *\n * @example $.validator.methods.date(\"01/01/1900\")\n * @result true\n *\n * @example $.validator.methods.date(\"01/13/1990\")\n * @result false\n *\n * @example $.validator.methods.date(\"01.01.1900\")\n * @result false\n *\n * @example <input name=\"pippo\" class=\"{dateITA:true}\" />\n * @desc Declares an optional input element whose value must be a valid date.\n *\n * @name $.validator.methods.dateITA\n * @type Boolean\n * @cat Plugins/Validate/Methods\n */\n$.validator.addMethod( \"dateITA\", function( value, element ) {\n\tvar check = false,\n\t\tre = /^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/,\n\t\tadata, gg, mm, aaaa, xdata;\n\tif ( re.test( value ) ) {\n\t\tadata = value.split( \"/\" );\n\t\tgg = parseInt( adata[ 0 ], 10 );\n\t\tmm = parseInt( adata[ 1 ], 10 );\n\t\taaaa = parseInt( adata[ 2 ], 10 );\n\t\txdata = new Date( Date.UTC( aaaa, mm - 1, gg, 12, 0, 0, 0 ) );\n\t\tif ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth() === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {\n\t\t\tcheck = true;\n\t\t} else {\n\t\t\tcheck = false;\n\t\t}\n\t} else {\n\t\tcheck = false;\n\t}\n\treturn this.optional( element ) || check;\n}, $.validator.messages.date );\n\n$.validator.addMethod( \"dateNL\", function( value, element ) {\n\treturn this.optional( element ) || /^(0?[1-9]|[12]\\d|3[01])[\\.\\/\\-](0?[1-9]|1[012])[\\.\\/\\-]([12]\\d)?(\\d\\d)$/.test( value );\n}, $.validator.messages.date );\n\n// Older \"accept\" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept\n$.validator.addMethod( \"extension\", function( value, element, param ) {\n\tparam = typeof param === \"string\" ? param.replace( /,/g, \"|\" ) : \"png|jpe?g|gif\";\n\treturn this.optional( element ) || value.match( new RegExp( \"\\\\.(\" + param + \")$\", \"i\" ) );\n}, $.validator.format( \"Please enter a value with a valid extension.\" ) );\n\n/**\n * Dutch giro account numbers (not bank numbers) have max 7 digits\n */\n$.validator.addMethod( \"giroaccountNL\", function( value, element ) {\n\treturn this.optional( element ) || /^[0-9]{1,7}$/.test( value );\n}, \"Please specify a valid giro account number\" );\n\n/**\n * IBAN is the international bank account number.\n * It has a country - specific format, that is checked here too\n *\n * Validation is case-insensitive. Please make sure to normalize input yourself.\n */\n$.validator.addMethod( \"iban\", function( value, element ) {\n\n\t// Some quick simple tests to prevent needless work\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\n\t// Remove spaces and to upper case\n\tvar iban = value.replace( / /g, \"\" ).toUpperCase(),\n\t\tibancheckdigits = \"\",\n\t\tleadingZeroes = true,\n\t\tcRest = \"\",\n\t\tcOperator = \"\",\n\t\tcountrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p;\n\n\t// Check for IBAN code length.\n\t// It contains:\n\t// country code ISO 3166-1 - two letters,\n\t// two check digits,\n\t// Basic Bank Account Number (BBAN) - up to 30 chars\n\tvar minimalIBANlength = 5;\n\tif ( iban.length < minimalIBANlength ) {\n\t\treturn false;\n\t}\n\n\t// Check the country code and find the country specific format\n\tcountrycode = iban.substring( 0, 2 );\n\tbbancountrypatterns = {\n\t\t\"AL\": \"\\\\d{8}[\\\\dA-Z]{16}\",\n\t\t\"AD\": \"\\\\d{8}[\\\\dA-Z]{12}\",\n\t\t\"AT\": \"\\\\d{16}\",\n\t\t\"AZ\": \"[\\\\dA-Z]{4}\\\\d{20}\",\n\t\t\"BE\": \"\\\\d{12}\",\n\t\t\"BH\": \"[A-Z]{4}[\\\\dA-Z]{14}\",\n\t\t\"BA\": \"\\\\d{16}\",\n\t\t\"BR\": \"\\\\d{23}[A-Z][\\\\dA-Z]\",\n\t\t\"BG\": \"[A-Z]{4}\\\\d{6}[\\\\dA-Z]{8}\",\n\t\t\"CR\": \"\\\\d{17}\",\n\t\t\"HR\": \"\\\\d{17}\",\n\t\t\"CY\": \"\\\\d{8}[\\\\dA-Z]{16}\",\n\t\t\"CZ\": \"\\\\d{20}\",\n\t\t\"DK\": \"\\\\d{14}\",\n\t\t\"DO\": \"[A-Z]{4}\\\\d{20}\",\n\t\t\"EE\": \"\\\\d{16}\",\n\t\t\"FO\": \"\\\\d{14}\",\n\t\t\"FI\": \"\\\\d{14}\",\n\t\t\"FR\": \"\\\\d{10}[\\\\dA-Z]{11}\\\\d{2}\",\n\t\t\"GE\": \"[\\\\dA-Z]{2}\\\\d{16}\",\n\t\t\"DE\": \"\\\\d{18}\",\n\t\t\"GI\": \"[A-Z]{4}[\\\\dA-Z]{15}\",\n\t\t\"GR\": \"\\\\d{7}[\\\\dA-Z]{16}\",\n\t\t\"GL\": \"\\\\d{14}\",\n\t\t\"GT\": \"[\\\\dA-Z]{4}[\\\\dA-Z]{20}\",\n\t\t\"HU\": \"\\\\d{24}\",\n\t\t\"IS\": \"\\\\d{22}\",\n\t\t\"IE\": \"[\\\\dA-Z]{4}\\\\d{14}\",\n\t\t\"IL\": \"\\\\d{19}\",\n\t\t\"IT\": \"[A-Z]\\\\d{10}[\\\\dA-Z]{12}\",\n\t\t\"KZ\": \"\\\\d{3}[\\\\dA-Z]{13}\",\n\t\t\"KW\": \"[A-Z]{4}[\\\\dA-Z]{22}\",\n\t\t\"LV\": \"[A-Z]{4}[\\\\dA-Z]{13}\",\n\t\t\"LB\": \"\\\\d{4}[\\\\dA-Z]{20}\",\n\t\t\"LI\": \"\\\\d{5}[\\\\dA-Z]{12}\",\n\t\t\"LT\": \"\\\\d{16}\",\n\t\t\"LU\": \"\\\\d{3}[\\\\dA-Z]{13}\",\n\t\t\"MK\": \"\\\\d{3}[\\\\dA-Z]{10}\\\\d{2}\",\n\t\t\"MT\": \"[A-Z]{4}\\\\d{5}[\\\\dA-Z]{18}\",\n\t\t\"MR\": \"\\\\d{23}\",\n\t\t\"MU\": \"[A-Z]{4}\\\\d{19}[A-Z]{3}\",\n\t\t\"MC\": \"\\\\d{10}[\\\\dA-Z]{11}\\\\d{2}\",\n\t\t\"MD\": \"[\\\\dA-Z]{2}\\\\d{18}\",\n\t\t\"ME\": \"\\\\d{18}\",\n\t\t\"NL\": \"[A-Z]{4}\\\\d{10}\",\n\t\t\"NO\": \"\\\\d{11}\",\n\t\t\"PK\": \"[\\\\dA-Z]{4}\\\\d{16}\",\n\t\t\"PS\": \"[\\\\dA-Z]{4}\\\\d{21}\",\n\t\t\"PL\": \"\\\\d{24}\",\n\t\t\"PT\": \"\\\\d{21}\",\n\t\t\"RO\": \"[A-Z]{4}[\\\\dA-Z]{16}\",\n\t\t\"SM\": \"[A-Z]\\\\d{10}[\\\\dA-Z]{12}\",\n\t\t\"SA\": \"\\\\d{2}[\\\\dA-Z]{18}\",\n\t\t\"RS\": \"\\\\d{18}\",\n\t\t\"SK\": \"\\\\d{20}\",\n\t\t\"SI\": \"\\\\d{15}\",\n\t\t\"ES\": \"\\\\d{20}\",\n\t\t\"SE\": \"\\\\d{20}\",\n\t\t\"CH\": \"\\\\d{5}[\\\\dA-Z]{12}\",\n\t\t\"TN\": \"\\\\d{20}\",\n\t\t\"TR\": \"\\\\d{5}[\\\\dA-Z]{17}\",\n\t\t\"AE\": \"\\\\d{3}\\\\d{16}\",\n\t\t\"GB\": \"[A-Z]{4}\\\\d{14}\",\n\t\t\"VG\": \"[\\\\dA-Z]{4}\\\\d{16}\"\n\t};\n\n\tbbanpattern = bbancountrypatterns[ countrycode ];\n\n\t// As new countries will start using IBAN in the\n\t// future, we only check if the countrycode is known.\n\t// This prevents false negatives, while almost all\n\t// false positives introduced by this, will be caught\n\t// by the checksum validation below anyway.\n\t// Strict checking should return FALSE for unknown\n\t// countries.\n\tif ( typeof bbanpattern !== \"undefined\" ) {\n\t\tibanregexp = new RegExp( \"^[A-Z]{2}\\\\d{2}\" + bbanpattern + \"$\", \"\" );\n\t\tif ( !( ibanregexp.test( iban ) ) ) {\n\t\t\treturn false; // Invalid country specific format\n\t\t}\n\t}\n\n\t// Now check the checksum, first convert to digits\n\tibancheck = iban.substring( 4, iban.length ) + iban.substring( 0, 4 );\n\tfor ( i = 0; i < ibancheck.length; i++ ) {\n\t\tcharAt = ibancheck.charAt( i );\n\t\tif ( charAt !== \"0\" ) {\n\t\t\tleadingZeroes = false;\n\t\t}\n\t\tif ( !leadingZeroes ) {\n\t\t\tibancheckdigits += \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\".indexOf( charAt );\n\t\t}\n\t}\n\n\t// Calculate the result of: ibancheckdigits % 97\n\tfor ( p = 0; p < ibancheckdigits.length; p++ ) {\n\t\tcChar = ibancheckdigits.charAt( p );\n\t\tcOperator = \"\" + cRest + \"\" + cChar;\n\t\tcRest = cOperator % 97;\n\t}\n\treturn cRest === 1;\n}, \"Please specify a valid IBAN\" );\n\n$.validator.addMethod( \"integer\", function( value, element ) {\n\treturn this.optional( element ) || /^-?\\d+$/.test( value );\n}, \"A positive or negative non-decimal number please\" );\n\n$.validator.addMethod( \"ipv4\", function( value, element ) {\n\treturn this.optional( element ) || /^(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/i.test( value );\n}, \"Please enter a valid IP v4 address.\" );\n\n$.validator.addMethod( \"ipv6\", function( value, element ) {\n\treturn this.optional( element ) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test( value );\n}, \"Please enter a valid IP v6 address.\" );\n\n$.validator.addMethod( \"lettersonly\", function( value, element ) {\n\treturn this.optional( element ) || /^[a-z]+$/i.test( value );\n}, \"Letters only please\" );\n\n$.validator.addMethod( \"letterswithbasicpunc\", function( value, element ) {\n\treturn this.optional( element ) || /^[a-z\\-.,()'\"\\s]+$/i.test( value );\n}, \"Letters or punctuation only please\" );\n\n$.validator.addMethod( \"mobileNL\", function( value, element ) {\n\treturn this.optional( element ) || /^((\\+|00(\\s|\\s?\\-\\s?)?)31(\\s|\\s?\\-\\s?)?(\\(0\\)[\\-\\s]?)?|0)6((\\s|\\s?\\-\\s?)?[0-9]){8}$/.test( value );\n}, \"Please specify a valid mobile number\" );\n\n/* For UK phone functions, do the following server side processing:\n * Compare original input with this RegEx pattern:\n * ^\\(?(?:(?:00\\)?[\\s\\-]?\\(?|\\+)(44)\\)?[\\s\\-]?\\(?(?:0\\)?[\\s\\-]?\\(?)?|0)([1-9]\\d{1,4}\\)?[\\s\\d\\-]+)$\n * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'\n * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.\n * A number of very detailed GB telephone number RegEx patterns can also be found at:\n * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers\n */\n$.validator.addMethod( \"mobileUK\", function( phone_number, element ) {\n\tphone_number = phone_number.replace( /\\(|\\)|\\s+|-/g, \"\" );\n\treturn this.optional( element ) || phone_number.length > 9 &&\n\t\tphone_number.match( /^(?:(?:(?:00\\s?|\\+)44\\s?|0)7(?:[1345789]\\d{2}|624)\\s?\\d{3}\\s?\\d{3})$/ );\n}, \"Please specify a valid mobile number\" );\n\n$.validator.addMethod( \"netmask\", function( value, element ) {\n    return this.optional( element ) || /^(254|252|248|240|224|192|128)\\.0\\.0\\.0|255\\.(254|252|248|240|224|192|128|0)\\.0\\.0|255\\.255\\.(254|252|248|240|224|192|128|0)\\.0|255\\.255\\.255\\.(254|252|248|240|224|192|128|0)/i.test( value );\n}, \"Please enter a valid netmask.\" );\n\n/*\n * The NIE (Número de Identificación de Extranjero) is a Spanish tax identification number assigned by the Spanish\n * authorities to any foreigner.\n *\n * The NIE is the equivalent of a Spaniards Número de Identificación Fiscal (NIF) which serves as a fiscal\n * identification number. The CIF number (Certificado de Identificación Fiscal) is equivalent to the NIF, but applies to\n * companies rather than individuals. The NIE consists of an 'X' or 'Y' followed by 7 or 8 digits then another letter.\n */\n$.validator.addMethod( \"nieES\", function( value, element ) {\n\t\"use strict\";\n\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\n\tvar nieRegEx = new RegExp( /^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi );\n\tvar validChars = \"TRWAGMYFPDXBNJZSQVHLCKET\",\n\t\tletter = value.substr( value.length - 1 ).toUpperCase(),\n\t\tnumber;\n\n\tvalue = value.toString().toUpperCase();\n\n\t// Quick format test\n\tif ( value.length > 10 || value.length < 9 || !nieRegEx.test( value ) ) {\n\t\treturn false;\n\t}\n\n\t// X means same number\n\t// Y means number + 10000000\n\t// Z means number + 20000000\n\tvalue = value.replace( /^[X]/, \"0\" )\n\t\t.replace( /^[Y]/, \"1\" )\n\t\t.replace( /^[Z]/, \"2\" );\n\n\tnumber = value.length === 9 ? value.substr( 0, 8 ) : value.substr( 0, 9 );\n\n\treturn validChars.charAt( parseInt( number, 10 ) % 23 ) === letter;\n\n}, \"Please specify a valid NIE number.\" );\n\n/*\n * The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals\n */\n$.validator.addMethod( \"nifES\", function( value, element ) {\n\t\"use strict\";\n\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\n\tvalue = value.toUpperCase();\n\n\t// Basic format test\n\tif ( !value.match( \"((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)\" ) ) {\n\t\treturn false;\n\t}\n\n\t// Test NIF\n\tif ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) {\n\t\treturn ( \"TRWAGMYFPDXBNJZSQVHLCKE\".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) );\n\t}\n\n\t// Test specials NIF (starts with K, L or M)\n\tif ( /^[KLM]{1}/.test( value ) ) {\n\t\treturn ( value[ 8 ] === \"TRWAGMYFPDXBNJZSQVHLCKE\".charAt( value.substring( 8, 1 ) % 23 ) );\n\t}\n\n\treturn false;\n\n}, \"Please specify a valid NIF number.\" );\n\n/*\n * Numer identyfikacji podatkowej ( NIP ) is the way tax identification used in Poland for companies\n */\n$.validator.addMethod( \"nipPL\", function( value ) {\n\t\"use strict\";\n\n\tvalue = value.replace( /[^0-9]/g, \"\" );\n\n\tif ( value.length !== 10 ) {\n\t\treturn false;\n\t}\n\n\tvar arrSteps = [ 6, 5, 7, 2, 3, 4, 5, 6, 7 ];\n\tvar intSum = 0;\n\tfor ( var i = 0; i < 9; i++ ) {\n\t\tintSum += arrSteps[ i ] * value[ i ];\n\t}\n\tvar int2 = intSum % 11;\n\tvar intControlNr = ( int2 === 10 ) ? 0 : int2;\n\n\treturn ( intControlNr === parseInt( value[ 9 ], 10 ) );\n}, \"Please specify a valid NIP number.\" );\n\n$.validator.addMethod( \"notEqualTo\", function( value, element, param ) {\n\treturn this.optional( element ) || !$.validator.methods.equalTo.call( this, value, element, param );\n}, \"Please enter a different value, values must not be the same.\" );\n\n$.validator.addMethod( \"nowhitespace\", function( value, element ) {\n\treturn this.optional( element ) || /^\\S+$/i.test( value );\n}, \"No white space please\" );\n\n/**\n* Return true if the field value matches the given format RegExp\n*\n* @example $.validator.methods.pattern(\"AR1004\",element,/^AR\\d{4}$/)\n* @result true\n*\n* @example $.validator.methods.pattern(\"BR1004\",element,/^AR\\d{4}$/)\n* @result false\n*\n* @name $.validator.methods.pattern\n* @type Boolean\n* @cat Plugins/Validate/Methods\n*/\n$.validator.addMethod( \"pattern\", function( value, element, param ) {\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\tif ( typeof param === \"string\" ) {\n\t\tparam = new RegExp( \"^(?:\" + param + \")$\" );\n\t}\n\treturn param.test( value );\n}, \"Invalid format.\" );\n\n/**\n * Dutch phone numbers have 10 digits (or 11 and start with +31).\n */\n$.validator.addMethod( \"phoneNL\", function( value, element ) {\n\treturn this.optional( element ) || /^((\\+|00(\\s|\\s?\\-\\s?)?)31(\\s|\\s?\\-\\s?)?(\\(0\\)[\\-\\s]?)?|0)[1-9]((\\s|\\s?\\-\\s?)?[0-9]){8}$/.test( value );\n}, \"Please specify a valid phone number.\" );\n\n/* For UK phone functions, do the following server side processing:\n * Compare original input with this RegEx pattern:\n * ^\\(?(?:(?:00\\)?[\\s\\-]?\\(?|\\+)(44)\\)?[\\s\\-]?\\(?(?:0\\)?[\\s\\-]?\\(?)?|0)([1-9]\\d{1,4}\\)?[\\s\\d\\-]+)$\n * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'\n * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.\n * A number of very detailed GB telephone number RegEx patterns can also be found at:\n * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers\n */\n\n// Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers\n$.validator.addMethod( \"phonesUK\", function( phone_number, element ) {\n\tphone_number = phone_number.replace( /\\(|\\)|\\s+|-/g, \"\" );\n\treturn this.optional( element ) || phone_number.length > 9 &&\n\t\tphone_number.match( /^(?:(?:(?:00\\s?|\\+)44\\s?|0)(?:1\\d{8,9}|[23]\\d{9}|7(?:[1345789]\\d{8}|624\\d{6})))$/ );\n}, \"Please specify a valid uk phone number\" );\n\n/* For UK phone functions, do the following server side processing:\n * Compare original input with this RegEx pattern:\n * ^\\(?(?:(?:00\\)?[\\s\\-]?\\(?|\\+)(44)\\)?[\\s\\-]?\\(?(?:0\\)?[\\s\\-]?\\(?)?|0)([1-9]\\d{1,4}\\)?[\\s\\d\\-]+)$\n * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'\n * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.\n * A number of very detailed GB telephone number RegEx patterns can also be found at:\n * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers\n */\n$.validator.addMethod( \"phoneUK\", function( phone_number, element ) {\n\tphone_number = phone_number.replace( /\\(|\\)|\\s+|-/g, \"\" );\n\treturn this.optional( element ) || phone_number.length > 9 &&\n\t\tphone_number.match( /^(?:(?:(?:00\\s?|\\+)44\\s?)|(?:\\(?0))(?:\\d{2}\\)?\\s?\\d{4}\\s?\\d{4}|\\d{3}\\)?\\s?\\d{3}\\s?\\d{3,4}|\\d{4}\\)?\\s?(?:\\d{5}|\\d{3}\\s?\\d{3})|\\d{5}\\)?\\s?\\d{4,5})$/ );\n}, \"Please specify a valid phone number\" );\n\n/**\n * Matches US phone number format\n *\n * where the area code may not start with 1 and the prefix may not start with 1\n * allows '-' or ' ' as a separator and allows parens around area code\n * some people may want to put a '1' in front of their number\n *\n * 1(212)-999-2345 or\n * 212 999 2344 or\n * 212-999-0983\n *\n * but not\n * 111-123-5434\n * and not\n * 212 123 4567\n */\n$.validator.addMethod( \"phoneUS\", function( phone_number, element ) {\n\tphone_number = phone_number.replace( /\\s+/g, \"\" );\n\treturn this.optional( element ) || phone_number.length > 9 &&\n\t\tphone_number.match( /^(\\+?1-?)?(\\([2-9]([02-9]\\d|1[02-9])\\)|[2-9]([02-9]\\d|1[02-9]))-?[2-9]([02-9]\\d|1[02-9])-?\\d{4}$/ );\n}, \"Please specify a valid phone number\" );\n\n/*\n* Valida CEPs do brasileiros:\n*\n* Formatos aceitos:\n* 99999-999\n* 99.999-999\n* 99999999\n*/\n$.validator.addMethod( \"postalcodeBR\", function( cep_value, element ) {\n\treturn this.optional( element ) || /^\\d{2}.\\d{3}-\\d{3}?$|^\\d{5}-?\\d{3}?$/.test( cep_value );\n}, \"Informe um CEP válido.\" );\n\n/**\n * Matches a valid Canadian Postal Code\n *\n * @example jQuery.validator.methods.postalCodeCA( \"H0H 0H0\", element )\n * @result true\n *\n * @example jQuery.validator.methods.postalCodeCA( \"H0H0H0\", element )\n * @result false\n *\n * @name jQuery.validator.methods.postalCodeCA\n * @type Boolean\n * @cat Plugins/Validate/Methods\n */\n$.validator.addMethod( \"postalCodeCA\", function( value, element ) {\n\treturn this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJKLMNPRSTVWXYZ] *\\d[ABCEGHJKLMNPRSTVWXYZ]\\d$/i.test( value );\n}, \"Please specify a valid postal code\" );\n\n/* Matches Italian postcode (CAP) */\n$.validator.addMethod( \"postalcodeIT\", function( value, element ) {\n\treturn this.optional( element ) || /^\\d{5}$/.test( value );\n}, \"Please specify a valid postal code\" );\n\n$.validator.addMethod( \"postalcodeNL\", function( value, element ) {\n\treturn this.optional( element ) || /^[1-9][0-9]{3}\\s?[a-zA-Z]{2}$/.test( value );\n}, \"Please specify a valid postal code\" );\n\n// Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK)\n$.validator.addMethod( \"postcodeUK\", function( value, element ) {\n\treturn this.optional( element ) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\\s?(0AA))$/i.test( value );\n}, \"Please specify a valid UK postcode\" );\n\n/*\n * Lets you say \"at least X inputs that match selector Y must be filled.\"\n *\n * The end result is that neither of these inputs:\n *\n *\t<input class=\"productinfo\" name=\"partnumber\">\n *\t<input class=\"productinfo\" name=\"description\">\n *\n *\t...will validate unless at least one of them is filled.\n *\n * partnumber:\t{require_from_group: [1,\".productinfo\"]},\n * description: {require_from_group: [1,\".productinfo\"]}\n *\n * options[0]: number of fields that must be filled in the group\n * options[1]: CSS selector that defines the group of conditionally required fields\n */\n$.validator.addMethod( \"require_from_group\", function( value, element, options ) {\n\tvar $fields = $( options[ 1 ], element.form ),\n\t\t$fieldsFirst = $fields.eq( 0 ),\n\t\tvalidator = $fieldsFirst.data( \"valid_req_grp\" ) ? $fieldsFirst.data( \"valid_req_grp\" ) : $.extend( {}, this ),\n\t\tisValid = $fields.filter( function() {\n\t\t\treturn validator.elementValue( this );\n\t\t} ).length >= options[ 0 ];\n\n\t// Store the cloned validator for future validation\n\t$fieldsFirst.data( \"valid_req_grp\", validator );\n\n\t// If element isn't being validated, run each require_from_group field's validation rules\n\tif ( !$( element ).data( \"being_validated\" ) ) {\n\t\t$fields.data( \"being_validated\", true );\n\t\t$fields.each( function() {\n\t\t\tvalidator.element( this );\n\t\t} );\n\t\t$fields.data( \"being_validated\", false );\n\t}\n\treturn isValid;\n}, $.validator.format( \"Please fill at least {0} of these fields.\" ) );\n\n/*\n * Lets you say \"either at least X inputs that match selector Y must be filled,\n * OR they must all be skipped (left blank).\"\n *\n * The end result, is that none of these inputs:\n *\n *\t<input class=\"productinfo\" name=\"partnumber\">\n *\t<input class=\"productinfo\" name=\"description\">\n *\t<input class=\"productinfo\" name=\"color\">\n *\n *\t...will validate unless either at least two of them are filled,\n *\tOR none of them are.\n *\n * partnumber:\t{skip_or_fill_minimum: [2,\".productinfo\"]},\n * description: {skip_or_fill_minimum: [2,\".productinfo\"]},\n * color:\t\t{skip_or_fill_minimum: [2,\".productinfo\"]}\n *\n * options[0]: number of fields that must be filled in the group\n * options[1]: CSS selector that defines the group of conditionally required fields\n *\n */\n$.validator.addMethod( \"skip_or_fill_minimum\", function( value, element, options ) {\n\tvar $fields = $( options[ 1 ], element.form ),\n\t\t$fieldsFirst = $fields.eq( 0 ),\n\t\tvalidator = $fieldsFirst.data( \"valid_skip\" ) ? $fieldsFirst.data( \"valid_skip\" ) : $.extend( {}, this ),\n\t\tnumberFilled = $fields.filter( function() {\n\t\t\treturn validator.elementValue( this );\n\t\t} ).length,\n\t\tisValid = numberFilled === 0 || numberFilled >= options[ 0 ];\n\n\t// Store the cloned validator for future validation\n\t$fieldsFirst.data( \"valid_skip\", validator );\n\n\t// If element isn't being validated, run each skip_or_fill_minimum field's validation rules\n\tif ( !$( element ).data( \"being_validated\" ) ) {\n\t\t$fields.data( \"being_validated\", true );\n\t\t$fields.each( function() {\n\t\t\tvalidator.element( this );\n\t\t} );\n\t\t$fields.data( \"being_validated\", false );\n\t}\n\treturn isValid;\n}, $.validator.format( \"Please either skip these fields or fill at least {0} of them.\" ) );\n\n/* Validates US States and/or Territories by @jdforsythe\n * Can be case insensitive or require capitalization - default is case insensitive\n * Can include US Territories or not - default does not\n * Can include US Military postal abbreviations (AA, AE, AP) - default does not\n *\n * Note: \"States\" always includes DC (District of Colombia)\n *\n * Usage examples:\n *\n *  This is the default - case insensitive, no territories, no military zones\n *  stateInput: {\n *     caseSensitive: false,\n *     includeTerritories: false,\n *     includeMilitary: false\n *  }\n *\n *  Only allow capital letters, no territories, no military zones\n *  stateInput: {\n *     caseSensitive: false\n *  }\n *\n *  Case insensitive, include territories but not military zones\n *  stateInput: {\n *     includeTerritories: true\n *  }\n *\n *  Only allow capital letters, include territories and military zones\n *  stateInput: {\n *     caseSensitive: true,\n *     includeTerritories: true,\n *     includeMilitary: true\n *  }\n *\n */\n$.validator.addMethod( \"stateUS\", function( value, element, options ) {\n\tvar isDefault = typeof options === \"undefined\",\n\t\tcaseSensitive = ( isDefault || typeof options.caseSensitive === \"undefined\" ) ? false : options.caseSensitive,\n\t\tincludeTerritories = ( isDefault || typeof options.includeTerritories === \"undefined\" ) ? false : options.includeTerritories,\n\t\tincludeMilitary = ( isDefault || typeof options.includeMilitary === \"undefined\" ) ? false : options.includeMilitary,\n\t\tregex;\n\n\tif ( !includeTerritories && !includeMilitary ) {\n\t\tregex = \"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$\";\n\t} else if ( includeTerritories && includeMilitary ) {\n\t\tregex = \"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$\";\n\t} else if ( includeTerritories ) {\n\t\tregex = \"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$\";\n\t} else {\n\t\tregex = \"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$\";\n\t}\n\n\tregex = caseSensitive ? new RegExp( regex ) : new RegExp( regex, \"i\" );\n\treturn this.optional( element ) || regex.test( value );\n}, \"Please specify a valid state\" );\n\n// TODO check if value starts with <, otherwise don't try stripping anything\n$.validator.addMethod( \"strippedminlength\", function( value, element, param ) {\n\treturn $( value ).text().length >= param;\n}, $.validator.format( \"Please enter at least {0} characters\" ) );\n\n$.validator.addMethod( \"time\", function( value, element ) {\n\treturn this.optional( element ) || /^([01]\\d|2[0-3]|[0-9])(:[0-5]\\d){1,2}$/.test( value );\n}, \"Please enter a valid time, between 00:00 and 23:59\" );\n\n$.validator.addMethod( \"time12h\", function( value, element ) {\n\treturn this.optional( element ) || /^((0?[1-9]|1[012])(:[0-5]\\d){1,2}(\\ ?[AP]M))$/i.test( value );\n}, \"Please enter a valid time in 12-hour am/pm format\" );\n\n// Same as url, but TLD is optional\n$.validator.addMethod( \"url2\", function( value, element ) {\n\treturn this.optional( element ) || /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)*(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i.test( value );\n}, $.validator.messages.url );\n\n/**\n * Return true, if the value is a valid vehicle identification number (VIN).\n *\n * Works with all kind of text inputs.\n *\n * @example <input type=\"text\" size=\"20\" name=\"VehicleID\" class=\"{required:true,vinUS:true}\" />\n * @desc Declares a required input element whose value must be a valid vehicle identification number.\n *\n * @name $.validator.methods.vinUS\n * @type Boolean\n * @cat Plugins/Validate/Methods\n */\n$.validator.addMethod( \"vinUS\", function( v ) {\n\tif ( v.length !== 17 ) {\n\t\treturn false;\n\t}\n\n\tvar LL = [ \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"J\", \"K\", \"L\", \"M\", \"N\", \"P\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\" ],\n\t\tVL = [ 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9 ],\n\t\tFL = [ 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 ],\n\t\trs = 0,\n\t\ti, n, d, f, cd, cdv;\n\n\tfor ( i = 0; i < 17; i++ ) {\n\t\tf = FL[ i ];\n\t\td = v.slice( i, i + 1 );\n\t\tif ( i === 8 ) {\n\t\t\tcdv = d;\n\t\t}\n\t\tif ( !isNaN( d ) ) {\n\t\t\td *= f;\n\t\t} else {\n\t\t\tfor ( n = 0; n < LL.length; n++ ) {\n\t\t\t\tif ( d.toUpperCase() === LL[ n ] ) {\n\t\t\t\t\td = VL[ n ];\n\t\t\t\t\td *= f;\n\t\t\t\t\tif ( isNaN( cdv ) && n === 8 ) {\n\t\t\t\t\t\tcdv = LL[ n ];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\trs += d;\n\t}\n\tcd = rs % 11;\n\tif ( cd === 10 ) {\n\t\tcd = \"X\";\n\t}\n\tif ( cd === cdv ) {\n\t\treturn true;\n\t}\n\treturn false;\n}, \"The specified vehicle identification number (VIN) is invalid.\" );\n\n$.validator.addMethod( \"zipcodeUS\", function( value, element ) {\n\treturn this.optional( element ) || /^\\d{5}(-\\d{4})?$/.test( value );\n}, \"The specified US ZIP Code is invalid\" );\n\n$.validator.addMethod( \"ziprange\", function( value, element ) {\n\treturn this.optional( element ) || /^90[2-5]\\d\\{2\\}-\\d{4}$/.test( value );\n}, \"Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx\" );\nreturn $;\n}));"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/jquery-validation/dist/jquery.validate.js",
    "content": "/*!\n * jQuery Validation Plugin v1.17.0\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2017 Jörn Zaefferer\n * Released under the MIT license\n */\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( [\"jquery\"], factory );\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t} else {\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.extend( $.fn, {\n\n\t// https://jqueryvalidation.org/validate/\n\tvalidate: function( options ) {\n\n\t\t// If nothing is selected, return nothing; can't chain anyway\n\t\tif ( !this.length ) {\n\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if a validator for this form was already created\n\t\tvar validator = $.data( this[ 0 ], \"validator\" );\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\n\t\t// Add novalidate tag if HTML5.\n\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\n\t\tvalidator = new $.validator( options, this[ 0 ] );\n\t\t$.data( this[ 0 ], \"validator\", validator );\n\n\t\tif ( validator.settings.onsubmit ) {\n\n\t\t\tthis.on( \"click.validate\", \":submit\", function( event ) {\n\n\t\t\t\t// Track the used submit button to properly handle scripted\n\t\t\t\t// submits later.\n\t\t\t\tvalidator.submitButton = event.currentTarget;\n\n\t\t\t\t// Allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\tif ( $( this ).hasClass( \"cancel\" ) ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\tif ( $( this ).attr( \"formnovalidate\" ) !== undefined ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Validate the form on submit\n\t\t\tthis.on( \"submit.validate\", function( event ) {\n\t\t\t\tif ( validator.settings.debug ) {\n\n\t\t\t\t\t// Prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t\tfunction handle() {\n\t\t\t\t\tvar hidden, result;\n\n\t\t\t\t\t// Insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t// The hidden input is inserted in two cases:\n\t\t\t\t\t//   - A user defined a `submitHandler`\n\t\t\t\t\t//   - There was a pending request due to `remote` method and `stopRequest()`\n\t\t\t\t\t//     was called to submit the form in case it's valid\n\t\t\t\t\tif ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {\n\t\t\t\t\t\thidden = $( \"<input type='hidden'/>\" )\n\t\t\t\t\t\t\t.attr( \"name\", validator.submitButton.name )\n\t\t\t\t\t\t\t.val( $( validator.submitButton ).val() )\n\t\t\t\t\t\t\t.appendTo( validator.currentForm );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( validator.settings.submitHandler ) {\n\t\t\t\t\t\tresult = validator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\tif ( hidden ) {\n\n\t\t\t\t\t\t\t// And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn validator;\n\t},\n\n\t// https://jqueryvalidation.org/valid/\n\tvalid: function() {\n\t\tvar valid, validator, errorList;\n\n\t\tif ( $( this[ 0 ] ).is( \"form\" ) ) {\n\t\t\tvalid = this.validate().form();\n\t\t} else {\n\t\t\terrorList = [];\n\t\t\tvalid = true;\n\t\t\tvalidator = $( this[ 0 ].form ).validate();\n\t\t\tthis.each( function() {\n\t\t\t\tvalid = validator.element( this ) && valid;\n\t\t\t\tif ( !valid ) {\n\t\t\t\t\terrorList = errorList.concat( validator.errorList );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvalidator.errorList = errorList;\n\t\t}\n\t\treturn valid;\n\t},\n\n\t// https://jqueryvalidation.org/rules/\n\trules: function( command, argument ) {\n\t\tvar element = this[ 0 ],\n\t\t\tsettings, staticRules, existingRules, data, param, filtered;\n\n\t\t// If nothing is selected, return empty object; can't chain anyway\n\t\tif ( element == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !element.form && element.hasAttribute( \"contenteditable\" ) ) {\n\t\t\telement.form = this.closest( \"form\" )[ 0 ];\n\t\t\telement.name = this.attr( \"name\" );\n\t\t}\n\n\t\tif ( element.form == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( command ) {\n\t\t\tsettings = $.data( element.form, \"validator\" ).settings;\n\t\t\tstaticRules = settings.rules;\n\t\t\texistingRules = $.validator.staticRules( element );\n\t\t\tswitch ( command ) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend( existingRules, $.validator.normalizeRule( argument ) );\n\n\t\t\t\t// Remove messages from rules, but allow them to be set separately\n\t\t\t\tdelete existingRules.messages;\n\t\t\t\tstaticRules[ element.name ] = existingRules;\n\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\tsettings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif ( !argument ) {\n\t\t\t\t\tdelete staticRules[ element.name ];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tfiltered = {};\n\t\t\t\t$.each( argument.split( /\\s/ ), function( index, method ) {\n\t\t\t\t\tfiltered[ method ] = existingRules[ method ];\n\t\t\t\t\tdelete existingRules[ method ];\n\t\t\t\t} );\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\n\t\tdata = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.classRules( element ),\n\t\t\t$.validator.attributeRules( element ),\n\t\t\t$.validator.dataRules( element ),\n\t\t\t$.validator.staticRules( element )\n\t\t), element );\n\n\t\t// Make sure required is at front\n\t\tif ( data.required ) {\n\t\t\tparam = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend( { required: param }, data );\n\t\t}\n\n\t\t// Make sure remote is at back\n\t\tif ( data.remote ) {\n\t\t\tparam = data.remote;\n\t\t\tdelete data.remote;\n\t\t\tdata = $.extend( data, { remote: param } );\n\t\t}\n\n\t\treturn data;\n\t}\n} );\n\n// Custom selectors\n$.extend( $.expr.pseudos || $.expr[ \":\" ], {\t\t// '|| $.expr[ \":\" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support\n\n\t// https://jqueryvalidation.org/blank-selector/\n\tblank: function( a ) {\n\t\treturn !$.trim( \"\" + $( a ).val() );\n\t},\n\n\t// https://jqueryvalidation.org/filled-selector/\n\tfilled: function( a ) {\n\t\tvar val = $( a ).val();\n\t\treturn val !== null && !!$.trim( \"\" + val );\n\t},\n\n\t// https://jqueryvalidation.org/unchecked-selector/\n\tunchecked: function( a ) {\n\t\treturn !$( a ).prop( \"checked\" );\n\t}\n} );\n\n// Constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n// https://jqueryvalidation.org/jQuery.validator.format/\n$.validator.format = function( source, params ) {\n\tif ( arguments.length === 1 ) {\n\t\treturn function() {\n\t\t\tvar args = $.makeArray( arguments );\n\t\t\targs.unshift( source );\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\t}\n\tif ( params === undefined ) {\n\t\treturn source;\n\t}\n\tif ( arguments.length > 2 && params.constructor !== Array  ) {\n\t\tparams = $.makeArray( arguments ).slice( 1 );\n\t}\n\tif ( params.constructor !== Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each( params, function( i, n ) {\n\t\tsource = source.replace( new RegExp( \"\\\\{\" + i + \"\\\\}\", \"g\" ), function() {\n\t\t\treturn n;\n\t\t} );\n\t} );\n\treturn source;\n};\n\n$.extend( $.validator, {\n\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tpendingClass: \"pending\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusCleanup: false,\n\t\tfocusInvalid: true,\n\t\terrorContainer: $( [] ),\n\t\terrorLabelContainer: $( [] ),\n\t\tonsubmit: true,\n\t\tignore: \":hidden\",\n\t\tignoreTitle: false,\n\t\tonfocusin: function( element ) {\n\t\t\tthis.lastActive = element;\n\n\t\t\t// Hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup ) {\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.hideThese( this.errorsFor( element ) );\n\t\t\t}\n\t\t},\n\t\tonfocusout: function( element ) {\n\t\t\tif ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonkeyup: function( element, event ) {\n\n\t\t\t// Avoid revalidate the field when pressing one of the following keys\n\t\t\t// Shift       => 16\n\t\t\t// Ctrl        => 17\n\t\t\t// Alt         => 18\n\t\t\t// Caps lock   => 20\n\t\t\t// End         => 35\n\t\t\t// Home        => 36\n\t\t\t// Left arrow  => 37\n\t\t\t// Up arrow    => 38\n\t\t\t// Right arrow => 39\n\t\t\t// Down arrow  => 40\n\t\t\t// Insert      => 45\n\t\t\t// Num lock    => 144\n\t\t\t// AltGr key   => 225\n\t\t\tvar excludedKeys = [\n\t\t\t\t16, 17, 18, 20, 35, 36, 37,\n\t\t\t\t38, 39, 40, 45, 144, 225\n\t\t\t];\n\n\t\t\tif ( event.which === 9 && this.elementValue( element ) === \"\" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t} else if ( element.name in this.submitted || element.name in this.invalid ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonclick: function( element ) {\n\n\t\t\t// Click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\tthis.element( element );\n\n\t\t\t// Or option elements, check parent select in that case\n\t\t\t} else if ( element.parentNode.name in this.submitted ) {\n\t\t\t\tthis.element( element.parentNode );\n\t\t\t}\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).addClass( errorClass ).removeClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).addClass( errorClass ).removeClass( validClass );\n\t\t\t}\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).removeClass( errorClass ).addClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).removeClass( errorClass ).addClass( validClass );\n\t\t\t}\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.setDefaults/\n\tsetDefaults: function( settings ) {\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\tmaxlength: $.validator.format( \"Please enter no more than {0} characters.\" ),\n\t\tminlength: $.validator.format( \"Please enter at least {0} characters.\" ),\n\t\trangelength: $.validator.format( \"Please enter a value between {0} and {1} characters long.\" ),\n\t\trange: $.validator.format( \"Please enter a value between {0} and {1}.\" ),\n\t\tmax: $.validator.format( \"Please enter a value less than or equal to {0}.\" ),\n\t\tmin: $.validator.format( \"Please enter a value greater than or equal to {0}.\" ),\n\t\tstep: $.validator.format( \"Please enter a multiple of {0}.\" )\n\t},\n\n\tautoCreateRanges: false,\n\n\tprototype: {\n\n\t\tinit: function() {\n\t\t\tthis.labelContainer = $( this.settings.errorLabelContainer );\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );\n\t\t\tthis.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\n\t\t\tvar groups = ( this.groups = {} ),\n\t\t\t\trules;\n\t\t\t$.each( this.settings.groups, function( key, value ) {\n\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\tvalue = value.split( /\\s/ );\n\t\t\t\t}\n\t\t\t\t$.each( value, function( index, name ) {\n\t\t\t\t\tgroups[ name ] = key;\n\t\t\t\t} );\n\t\t\t} );\n\t\t\trules = this.settings.rules;\n\t\t\t$.each( rules, function( key, value ) {\n\t\t\t\trules[ key ] = $.validator.normalizeRule( value );\n\t\t\t} );\n\n\t\t\tfunction delegate( event ) {\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( !this.form && this.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = $( this ).attr( \"name\" );\n\t\t\t\t}\n\n\t\t\t\tvar validator = $.data( this.form, \"validator\" ),\n\t\t\t\t\teventType = \"on\" + event.type.replace( /^validate/, \"\" ),\n\t\t\t\t\tsettings = validator.settings;\n\t\t\t\tif ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {\n\t\t\t\t\tsettings[ eventType ].call( validator, this, event );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.on( \"focusin.validate focusout.validate keyup.validate\",\n\t\t\t\t\t\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], \" +\n\t\t\t\t\t\"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], \" +\n\t\t\t\t\t\"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], \" +\n\t\t\t\t\t\"[type='radio'], [type='checkbox'], [contenteditable], [type='button']\", delegate )\n\n\t\t\t\t// Support: Chrome, oldIE\n\t\t\t\t// \"select\" is provided as event.target when clicking a option\n\t\t\t\t.on( \"click.validate\", \"select, option, [type='radio'], [type='checkbox']\", delegate );\n\n\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t$( this.currentForm ).on( \"invalid-form.validate\", this.settings.invalidHandler );\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.form/\n\t\tform: function() {\n\t\t\tthis.checkForm();\n\t\t\t$.extend( this.submitted, this.errorMap );\n\t\t\tthis.invalid = $.extend( {}, this.errorMap );\n\t\t\tif ( !this.valid() ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {\n\t\t\t\tthis.check( elements[ i ] );\n\t\t\t}\n\t\t\treturn this.valid();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.element/\n\t\telement: function( element ) {\n\t\t\tvar cleanElement = this.clean( element ),\n\t\t\t\tcheckElement = this.validationTargetFor( cleanElement ),\n\t\t\t\tv = this,\n\t\t\t\tresult = true,\n\t\t\t\trs, group;\n\n\t\t\tif ( checkElement === undefined ) {\n\t\t\t\tdelete this.invalid[ cleanElement.name ];\n\t\t\t} else {\n\t\t\t\tthis.prepareElement( checkElement );\n\t\t\t\tthis.currentElements = $( checkElement );\n\n\t\t\t\t// If this element is grouped, then validate all group elements already\n\t\t\t\t// containing a value\n\t\t\t\tgroup = this.groups[ checkElement.name ];\n\t\t\t\tif ( group ) {\n\t\t\t\t\t$.each( this.groups, function( name, testgroup ) {\n\t\t\t\t\t\tif ( testgroup === group && name !== checkElement.name ) {\n\t\t\t\t\t\t\tcleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );\n\t\t\t\t\t\t\tif ( cleanElement && cleanElement.name in v.invalid ) {\n\t\t\t\t\t\t\t\tv.currentElements.push( cleanElement );\n\t\t\t\t\t\t\t\tresult = v.check( cleanElement ) && result;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\trs = this.check( checkElement ) !== false;\n\t\t\t\tresult = result && rs;\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = true;\n\t\t\t\t}\n\n\t\t\t\tif ( !this.numberOfInvalids() ) {\n\n\t\t\t\t\t// Hide error containers on last error\n\t\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t\t}\n\t\t\t\tthis.showErrors();\n\n\t\t\t\t// Add aria-invalid status for screen readers\n\t\t\t\t$( element ).attr( \"aria-invalid\", !rs );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.showErrors/\n\t\tshowErrors: function( errors ) {\n\t\t\tif ( errors ) {\n\t\t\t\tvar validator = this;\n\n\t\t\t\t// Add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = $.map( this.errorMap, function( message, name ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\telement: validator.findByName( name )[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t} );\n\n\t\t\t\t// Remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\treturn !( element.name in errors );\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t} else {\n\t\t\t\tthis.defaultShowErrors();\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.resetForm/\n\t\tresetForm: function() {\n\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\t}\n\t\t\tthis.invalid = {};\n\t\t\tthis.submitted = {};\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tvar elements = this.elements()\n\t\t\t\t.removeData( \"previousValue\" )\n\t\t\t\t.removeAttr( \"aria-invalid\" );\n\n\t\t\tthis.resetElements( elements );\n\t\t},\n\n\t\tresetElements: function( elements ) {\n\t\t\tvar i;\n\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0; elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ],\n\t\t\t\t\t\tthis.settings.errorClass, \"\" );\n\t\t\t\t\tthis.findByName( elements[ i ].name ).removeClass( this.settings.validClass );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telements\n\t\t\t\t\t.removeClass( this.settings.errorClass )\n\t\t\t\t\t.removeClass( this.settings.validClass );\n\t\t\t}\n\t\t},\n\n\t\tnumberOfInvalids: function() {\n\t\t\treturn this.objectLength( this.invalid );\n\t\t},\n\n\t\tobjectLength: function( obj ) {\n\t\t\t/* jshint unused: false */\n\t\t\tvar count = 0,\n\t\t\t\ti;\n\t\t\tfor ( i in obj ) {\n\n\t\t\t\t// This check allows counting elements with empty error\n\t\t\t\t// message as invalid elements\n\t\t\t\tif ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\thideErrors: function() {\n\t\t\tthis.hideThese( this.toHide );\n\t\t},\n\n\t\thideThese: function( errors ) {\n\t\t\terrors.not( this.containers ).text( \"\" );\n\t\t\tthis.addWrapper( errors ).hide();\n\t\t},\n\n\t\tvalid: function() {\n\t\t\treturn this.size() === 0;\n\t\t},\n\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\n\t\tfocusInvalid: function() {\n\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )\n\t\t\t\t\t.filter( \":visible\" )\n\t\t\t\t\t.focus()\n\n\t\t\t\t\t// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger( \"focusin\" );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore IE throwing errors when focusing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep( this.errorList, function( n ) {\n\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t} ).length === 1 && lastActive;\n\t\t},\n\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {};\n\n\t\t\t// Select all valid inputs inside the form (no submit or reset buttons)\n\t\t\treturn $( this.currentForm )\n\t\t\t.find( \"input, select, textarea, [contenteditable]\" )\n\t\t\t.not( \":submit, :reset, :image, :disabled\" )\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter( function() {\n\t\t\t\tvar name = this.name || $( this ).attr( \"name\" ); // For contenteditable\n\t\t\t\tif ( !name && validator.settings.debug && window.console ) {\n\t\t\t\t\tconsole.error( \"%o has no name assigned\", this );\n\t\t\t\t}\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( this.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = name;\n\t\t\t\t}\n\n\t\t\t\t// Select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trulesCache[ name ] = true;\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t},\n\n\t\tclean: function( selector ) {\n\t\t\treturn $( selector )[ 0 ];\n\t\t},\n\n\t\terrors: function() {\n\t\t\tvar errorClass = this.settings.errorClass.split( \" \" ).join( \".\" );\n\t\t\treturn $( this.settings.errorElement + \".\" + errorClass, this.errorContext );\n\t\t},\n\n\t\tresetInternals: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $( [] );\n\t\t\tthis.toHide = $( [] );\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.resetInternals();\n\t\t\tthis.currentElements = $( [] );\n\t\t},\n\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor( element );\n\t\t},\n\n\t\telementValue: function( element ) {\n\t\t\tvar $element = $( element ),\n\t\t\t\ttype = element.type,\n\t\t\t\tval, idx;\n\n\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).val();\n\t\t\t} else if ( type === \"number\" && typeof element.validity !== \"undefined\" ) {\n\t\t\t\treturn element.validity.badInput ? \"NaN\" : $element.val();\n\t\t\t}\n\n\t\t\tif ( element.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\tval = $element.text();\n\t\t\t} else {\n\t\t\t\tval = $element.val();\n\t\t\t}\n\n\t\t\tif ( type === \"file\" ) {\n\n\t\t\t\t// Modern browser (chrome & safari)\n\t\t\t\tif ( val.substr( 0, 12 ) === \"C:\\\\fakepath\\\\\" ) {\n\t\t\t\t\treturn val.substr( 12 );\n\t\t\t\t}\n\n\t\t\t\t// Legacy browsers\n\t\t\t\t// Unix-based path\n\t\t\t\tidx = val.lastIndexOf( \"/\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Windows-based path\n\t\t\t\tidx = val.lastIndexOf( \"\\\\\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Just the file name\n\t\t\t\treturn val;\n\t\t\t}\n\n\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\treturn val.replace( /\\r/g, \"\" );\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\tcheck: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\n\t\t\tvar rules = $( element ).rules(),\n\t\t\t\trulesCount = $.map( rules, function( n, i ) {\n\t\t\t\t\treturn i;\n\t\t\t\t} ).length,\n\t\t\t\tdependencyMismatch = false,\n\t\t\t\tval = this.elementValue( element ),\n\t\t\t\tresult, method, rule, normalizer;\n\n\t\t\t// Prioritize the local normalizer defined for this element over the global one\n\t\t\t// if the former exists, otherwise user the global one in case it exists.\n\t\t\tif ( typeof rules.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = rules.normalizer;\n\t\t\t} else if (\ttypeof this.settings.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = this.settings.normalizer;\n\t\t\t}\n\n\t\t\t// If normalizer is defined, then call it to retreive the changed value instead\n\t\t\t// of using the real one.\n\t\t\t// Note that `this` in the normalizer is `element`.\n\t\t\tif ( normalizer ) {\n\t\t\t\tval = normalizer.call( element, val );\n\n\t\t\t\tif ( typeof val !== \"string\" ) {\n\t\t\t\t\tthrow new TypeError( \"The normalizer should return a string value.\" );\n\t\t\t\t}\n\n\t\t\t\t// Delete the normalizer from rules to avoid treating it as a pre-defined method.\n\t\t\t\tdelete rules.normalizer;\n\t\t\t}\n\n\t\t\tfor ( method in rules ) {\n\t\t\t\trule = { method: method, parameters: rules[ method ] };\n\t\t\t\ttry {\n\t\t\t\t\tresult = $.validator.methods[ method ].call( this, val, element, rule.parameters );\n\n\t\t\t\t\t// If a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result === \"dependency-mismatch\" && rulesCount === 1 ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\n\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor( element ) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t}\n\t\t\t\t\tif ( e instanceof TypeError ) {\n\t\t\t\t\t\te.message += \".  Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( dependencyMismatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.objectLength( rules ) ) {\n\t\t\t\tthis.successList.push( element );\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t// Return the custom message for the given element and validation method\n\t\t// specified in the element's HTML5 data attribute\n\t\t// return the generic message if present and no method specific message is present\n\t\tcustomDataMessage: function( element, method ) {\n\t\t\treturn $( element ).data( \"msg\" + method.charAt( 0 ).toUpperCase() +\n\t\t\t\tmethod.substring( 1 ).toLowerCase() ) || $( element ).data( \"msg\" );\n\t\t},\n\n\t\t// Return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[ name ];\n\t\t\treturn m && ( m.constructor === String ? m : m[ method ] );\n\t\t},\n\n\t\t// Return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor ( var i = 0; i < arguments.length; i++ ) {\n\t\t\t\tif ( arguments[ i ] !== undefined ) {\n\t\t\t\t\treturn arguments[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\n\t\t// The second parameter 'rule' used to be a string, and extended to an object literal\n\t\t// of the following form:\n\t\t// rule = {\n\t\t//     method: \"method name\",\n\t\t//     parameters: \"the given method parameters\"\n\t\t// }\n\t\t//\n\t\t// The old behavior still supported, kept to maintain backward compatibility with\n\t\t// old code, and will be removed in the next major release.\n\t\tdefaultMessage: function( element, rule ) {\n\t\t\tif ( typeof rule === \"string\" ) {\n\t\t\t\trule = { method: rule };\n\t\t\t}\n\n\t\t\tvar message = this.findDefined(\n\t\t\t\t\tthis.customMessage( element.name, rule.method ),\n\t\t\t\t\tthis.customDataMessage( element, rule.method ),\n\n\t\t\t\t\t// 'title' is never undefined, so handle empty string as undefined\n\t\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t\t$.validator.messages[ rule.method ],\n\t\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t\t),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\tmessage = message.call( this, rule.parameters, element );\n\t\t\t} else if ( theregex.test( message ) ) {\n\t\t\t\tmessage = $.validator.format( message.replace( theregex, \"{$1}\" ), rule.parameters );\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule );\n\n\t\t\tthis.errorList.push( {\n\t\t\t\tmessage: message,\n\t\t\t\telement: element,\n\t\t\t\tmethod: rule.method\n\t\t\t} );\n\n\t\t\tthis.errorMap[ element.name ] = message;\n\t\t\tthis.submitted[ element.name ] = message;\n\t\t},\n\n\t\taddWrapper: function( toToggle ) {\n\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t}\n\t\t\treturn toToggle;\n\t\t},\n\n\t\tdefaultShowErrors: function() {\n\t\t\tvar i, elements, error;\n\t\t\tfor ( i = 0; this.errorList[ i ]; i++ ) {\n\t\t\t\terror = this.errorList[ i ];\n\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif ( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif ( this.settings.success ) {\n\t\t\t\tfor ( i = 0; this.successList[ i ]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not( this.invalidElements() );\n\t\t},\n\n\t\tinvalidElements: function() {\n\t\t\treturn $( this.errorList ).map( function() {\n\t\t\t\treturn this.element;\n\t\t\t} );\n\t\t},\n\n\t\tshowLabel: function( element, message ) {\n\t\t\tvar place, group, errorID, v,\n\t\t\t\terror = this.errorsFor( element ),\n\t\t\t\telementID = this.idOrName( element ),\n\t\t\t\tdescribedBy = $( element ).attr( \"aria-describedby\" );\n\n\t\t\tif ( error.length ) {\n\n\t\t\t\t// Refresh error/success class\n\t\t\t\terror.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\n\t\t\t\t// Replace message on existing label\n\t\t\t\terror.html( message );\n\t\t\t} else {\n\n\t\t\t\t// Create error element\n\t\t\t\terror = $( \"<\" + this.settings.errorElement + \">\" )\n\t\t\t\t\t.attr( \"id\", elementID + \"-error\" )\n\t\t\t\t\t.addClass( this.settings.errorClass )\n\t\t\t\t\t.html( message || \"\" );\n\n\t\t\t\t// Maintain reference to the element to be placed into the DOM\n\t\t\t\tplace = error;\n\t\t\t\tif ( this.settings.wrapper ) {\n\n\t\t\t\t\t// Make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tplace = error.hide().show().wrap( \"<\" + this.settings.wrapper + \"/>\" ).parent();\n\t\t\t\t}\n\t\t\t\tif ( this.labelContainer.length ) {\n\t\t\t\t\tthis.labelContainer.append( place );\n\t\t\t\t} else if ( this.settings.errorPlacement ) {\n\t\t\t\t\tthis.settings.errorPlacement.call( this, place, $( element ) );\n\t\t\t\t} else {\n\t\t\t\t\tplace.insertAfter( element );\n\t\t\t\t}\n\n\t\t\t\t// Link error back to the element\n\t\t\t\tif ( error.is( \"label\" ) ) {\n\n\t\t\t\t\t// If the error is a label, then associate using 'for'\n\t\t\t\t\terror.attr( \"for\", elementID );\n\n\t\t\t\t\t// If the element is not a child of an associated label, then it's necessary\n\t\t\t\t\t// to explicitly apply aria-describedby\n\t\t\t\t} else if ( error.parents( \"label[for='\" + this.escapeCssMeta( elementID ) + \"']\" ).length === 0 ) {\n\t\t\t\t\terrorID = error.attr( \"id\" );\n\n\t\t\t\t\t// Respect existing non-error aria-describedby\n\t\t\t\t\tif ( !describedBy ) {\n\t\t\t\t\t\tdescribedBy = errorID;\n\t\t\t\t\t} else if ( !describedBy.match( new RegExp( \"\\\\b\" + this.escapeCssMeta( errorID ) + \"\\\\b\" ) ) ) {\n\n\t\t\t\t\t\t// Add to end of list if not already present\n\t\t\t\t\t\tdescribedBy += \" \" + errorID;\n\t\t\t\t\t}\n\t\t\t\t\t$( element ).attr( \"aria-describedby\", describedBy );\n\n\t\t\t\t\t// If this element is grouped, then assign to all elements in the same group\n\t\t\t\t\tgroup = this.groups[ element.name ];\n\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\tv = this;\n\t\t\t\t\t\t$.each( v.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\tif ( testgroup === group ) {\n\t\t\t\t\t\t\t\t$( \"[name='\" + v.escapeCssMeta( name ) + \"']\", v.currentForm )\n\t\t\t\t\t\t\t\t\t.attr( \"aria-describedby\", error.attr( \"id\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\terror.text( \"\" );\n\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\terror.addClass( this.settings.success );\n\t\t\t\t} else {\n\t\t\t\t\tthis.settings.success( error, element );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add( error );\n\t\t},\n\n\t\terrorsFor: function( element ) {\n\t\t\tvar name = this.escapeCssMeta( this.idOrName( element ) ),\n\t\t\t\tdescriber = $( element ).attr( \"aria-describedby\" ),\n\t\t\t\tselector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\";\n\n\t\t\t// 'aria-describedby' should directly reference the error element\n\t\t\tif ( describer ) {\n\t\t\t\tselector = selector + \", #\" + this.escapeCssMeta( describer )\n\t\t\t\t\t.replace( /\\s+/g, \", #\" );\n\t\t\t}\n\n\t\t\treturn this\n\t\t\t\t.errors()\n\t\t\t\t.filter( selector );\n\t\t},\n\n\t\t// See https://api.jquery.com/category/selectors/, for CSS\n\t\t// meta-characters that should be escaped in order to be used with JQuery\n\t\t// as a literal part of a name/id or any selector.\n\t\tescapeCssMeta: function( string ) {\n\t\t\treturn string.replace( /([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t},\n\n\t\tidOrName: function( element ) {\n\t\t\treturn this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );\n\t\t},\n\n\t\tvalidationTargetFor: function( element ) {\n\n\t\t\t// If radio/checkbox, validate first element in group instead\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\telement = this.findByName( element.name );\n\t\t\t}\n\n\t\t\t// Always apply ignore filter\n\t\t\treturn $( element ).not( this.settings.ignore )[ 0 ];\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn ( /radio|checkbox/i ).test( element.type );\n\t\t},\n\n\t\tfindByName: function( name ) {\n\t\t\treturn $( this.currentForm ).find( \"[name='\" + this.escapeCssMeta( name ) + \"']\" );\n\t\t},\n\n\t\tgetLength: function( value, element ) {\n\t\t\tswitch ( element.nodeName.toLowerCase() ) {\n\t\t\tcase \"select\":\n\t\t\t\treturn $( \"option:selected\", element ).length;\n\t\t\tcase \"input\":\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\n\t\tdepend: function( param, element ) {\n\t\t\treturn this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;\n\t\t},\n\n\t\tdependTypes: {\n\t\t\t\"boolean\": function( param ) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function( param, element ) {\n\t\t\t\treturn !!$( param, element.form ).length;\n\t\t\t},\n\t\t\t\"function\": function( param, element ) {\n\t\t\t\treturn param( element );\n\t\t\t}\n\t\t},\n\n\t\toptional: function( element ) {\n\t\t\tvar val = this.elementValue( element );\n\t\t\treturn !$.validator.methods.required.call( this, val, element ) && \"dependency-mismatch\";\n\t\t},\n\n\t\tstartRequest: function( element ) {\n\t\t\tif ( !this.pending[ element.name ] ) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\t$( element ).addClass( this.settings.pendingClass );\n\t\t\t\tthis.pending[ element.name ] = true;\n\t\t\t}\n\t\t},\n\n\t\tstopRequest: function( element, valid ) {\n\t\t\tthis.pendingRequest--;\n\n\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t}\n\t\t\tdelete this.pending[ element.name ];\n\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {\n\t\t\t\t$( this.currentForm ).submit();\n\n\t\t\t\t// Remove the hidden input that was used as a replacement for the\n\t\t\t\t// missing submit button. The hidden input is added by `handle()`\n\t\t\t\t// to ensure that the value of the used submit button is passed on\n\t\t\t\t// for scripted submits triggered by this method\n\t\t\t\tif ( this.submitButton ) {\n\t\t\t\t\t$( \"input:hidden[name='\" + this.submitButton.name + \"']\", this.currentForm ).remove();\n\t\t\t\t}\n\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\n\t\tpreviousValue: function( element, method ) {\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\treturn $.data( element, \"previousValue\" ) || $.data( element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, { method: method } )\n\t\t\t} );\n\t\t},\n\n\t\t// Cleans up all forms and elements, removes validator-specific events\n\t\tdestroy: function() {\n\t\t\tthis.resetForm();\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.off( \".validate\" )\n\t\t\t\t.removeData( \"validator\" )\n\t\t\t\t.find( \".validate-equalTo-blur\" )\n\t\t\t\t\t.off( \".validate-equalTo\" )\n\t\t\t\t\t.removeClass( \"validate-equalTo-blur\" );\n\t\t}\n\n\t},\n\n\tclassRuleSettings: {\n\t\trequired: { required: true },\n\t\temail: { email: true },\n\t\turl: { url: true },\n\t\tdate: { date: true },\n\t\tdateISO: { dateISO: true },\n\t\tnumber: { number: true },\n\t\tdigits: { digits: true },\n\t\tcreditcard: { creditcard: true }\n\t},\n\n\taddClassRules: function( className, rules ) {\n\t\tif ( className.constructor === String ) {\n\t\t\tthis.classRuleSettings[ className ] = rules;\n\t\t} else {\n\t\t\t$.extend( this.classRuleSettings, className );\n\t\t}\n\t},\n\n\tclassRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tclasses = $( element ).attr( \"class\" );\n\n\t\tif ( classes ) {\n\t\t\t$.each( classes.split( \" \" ), function() {\n\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t$.extend( rules, $.validator.classRuleSettings[ this ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeAttributeRule: function( rules, type, method, value ) {\n\n\t\t// Convert the value to a number for number inputs, and for text for backwards compability\n\t\t// allows type=\"date\" and others to be compared as strings\n\t\tif ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\tvalue = Number( value );\n\n\t\t\t// Support Opera Mini, which returns NaN for undefined minlength\n\t\t\tif ( isNaN( value ) ) {\n\t\t\t\tvalue = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif ( value || value === 0 ) {\n\t\t\trules[ method ] = value;\n\t\t} else if ( type === method && type !== \"range\" ) {\n\n\t\t\t// Exception: the jquery validate 'range' method\n\t\t\t// does not test for the html5 'range' type\n\t\t\trules[ method ] = true;\n\t\t}\n\t},\n\n\tattributeRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\n\t\t\t// Support for <input required> in both html5 and older browsers\n\t\t\tif ( method === \"required\" ) {\n\t\t\t\tvalue = element.getAttribute( method );\n\n\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\n\t\t\t\t// Force non-HTML5 browsers to return bool\n\t\t\t\tvalue = !!value;\n\t\t\t} else {\n\t\t\t\tvalue = $element.attr( method );\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\n\t\t// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\t\tif ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\tdataRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\t\t\tvalue = $element.data( \"rule\" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tstaticRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tvalidator = $.data( element.form, \"validator\" );\n\n\t\tif ( validator.settings.rules ) {\n\t\t\trules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeRules: function( rules, element ) {\n\n\t\t// Handle dependency check\n\t\t$.each( rules, function( prop, val ) {\n\n\t\t\t// Ignore rule when param is explicitly false, eg. required:false\n\t\t\tif ( val === false ) {\n\t\t\t\tdelete rules[ prop ];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( val.param || val.depends ) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch ( typeof val.depends ) {\n\t\t\t\tcase \"string\":\n\t\t\t\t\tkeepRule = !!$( val.depends, element.form ).length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"function\":\n\t\t\t\t\tkeepRule = val.depends.call( element, element );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( keepRule ) {\n\t\t\t\t\trules[ prop ] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\t$.data( element.form, \"validator\" ).resetElements( $( element ) );\n\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Evaluate parameters\n\t\t$.each( rules, function( rule, parameter ) {\n\t\t\trules[ rule ] = $.isFunction( parameter ) && rule !== \"normalizer\" ? parameter( element ) : parameter;\n\t\t} );\n\n\t\t// Clean number parameters\n\t\t$.each( [ \"minlength\", \"maxlength\" ], function() {\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\trules[ this ] = Number( rules[ this ] );\n\t\t\t}\n\t\t} );\n\t\t$.each( [ \"rangelength\", \"range\" ], function() {\n\t\t\tvar parts;\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\tif ( $.isArray( rules[ this ] ) ) {\n\t\t\t\t\trules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];\n\t\t\t\t} else if ( typeof rules[ this ] === \"string\" ) {\n\t\t\t\t\tparts = rules[ this ].replace( /[\\[\\]]/g, \"\" ).split( /[\\s,]+/ );\n\t\t\t\t\trules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tif ( $.validator.autoCreateRanges ) {\n\n\t\t\t// Auto-create ranges\n\t\t\tif ( rules.min != null && rules.max != null ) {\n\t\t\t\trules.range = [ rules.min, rules.max ];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif ( rules.minlength != null && rules.maxlength != null ) {\n\t\t\t\trules.rangelength = [ rules.minlength, rules.maxlength ];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function( data ) {\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each( data.split( /\\s/ ), function() {\n\t\t\t\ttransformed[ this ] = true;\n\t\t\t} );\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.addMethod/\n\taddMethod: function( name, method, message ) {\n\t\t$.validator.methods[ name ] = method;\n\t\t$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];\n\t\tif ( method.length < 3 ) {\n\t\t\t$.validator.addClassRules( name, $.validator.normalizeRule( name ) );\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.methods/\n\tmethods: {\n\n\t\t// https://jqueryvalidation.org/required-method/\n\t\trequired: function( value, element, param ) {\n\n\t\t\t// Check if dependency is met\n\t\t\tif ( !this.depend( param, element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\n\t\t\t\t// Could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $( element ).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\t}\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\treturn this.getLength( value, element ) > 0;\n\t\t\t}\n\t\t\treturn value.length > 0;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/email-method/\n\t\temail: function( value, element ) {\n\n\t\t\t// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n\t\t\t// Retrieved 2014-01-14\n\t\t\t// If you have a problem with this implementation, report a bug against the above spec\n\t\t\t// Or use custom methods to implement your own email validation\n\t\t\treturn this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/url-method/\n\t\turl: function( value, element ) {\n\n\t\t\t// Copyright (c) 2010-2013 Diego Perini, MIT licensed\n\t\t\t// https://gist.github.com/dperini/729294\n\t\t\t// see also https://mathiasbynens.be/demo/url-regex\n\t\t\t// modified to allow protocol-relative URLs\n\t\t\treturn this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})).?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/date-method/\n\t\tdate: function( value, element ) {\n\t\t\treturn this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/dateISO-method/\n\t\tdateISO: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/number-method/\n\t\tnumber: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/digits-method/\n\t\tdigits: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d+$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/minlength-method/\n\t\tminlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/maxlength-method/\n\t\tmaxlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/rangelength-method/\n\t\trangelength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/min-method/\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/max-method/\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/range-method/\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/step-method/\n\t\tstep: function( value, element, param ) {\n\t\t\tvar type = $( element ).attr( \"type\" ),\n\t\t\t\terrorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n\t\t\t\tsupportedTypes = [ \"text\", \"number\", \"range\" ],\n\t\t\t\tre = new RegExp( \"\\\\b\" + type + \"\\\\b\" ),\n\t\t\t\tnotSupported = type && !re.test( supportedTypes.join() ),\n\t\t\t\tdecimalPlaces = function( num ) {\n\t\t\t\t\tvar match = ( \"\" + num ).match( /(?:\\.(\\d+))?$/ );\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Number of digits right of decimal point.\n\t\t\t\t\treturn match[ 1 ] ? match[ 1 ].length : 0;\n\t\t\t\t},\n\t\t\t\ttoInt = function( num ) {\n\t\t\t\t\treturn Math.round( num * Math.pow( 10, decimals ) );\n\t\t\t\t},\n\t\t\t\tvalid = true,\n\t\t\t\tdecimals;\n\n\t\t\t// Works only for text, number and range input types\n\t\t\t// TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\t\t\tif ( notSupported ) {\n\t\t\t\tthrow new Error( errorMessage );\n\t\t\t}\n\n\t\t\tdecimals = decimalPlaces( param );\n\n\t\t\t// Value can't have too many decimals\n\t\t\tif ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {\n\t\t\t\tvalid = false;\n\t\t\t}\n\n\t\t\treturn this.optional( element ) || valid;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/equalTo-method/\n\t\tequalTo: function( value, element, param ) {\n\n\t\t\t// Bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\tvar target = $( param );\n\t\t\tif ( this.settings.onfocusout && target.not( \".validate-equalTo-blur\" ).length ) {\n\t\t\t\ttarget.addClass( \"validate-equalTo-blur\" ).on( \"blur.validate-equalTo\", function() {\n\t\t\t\t\t$( element ).valid();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn value === target.val();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/remote-method/\n\t\tremote: function( value, element, param, method ) {\n\t\t\tif ( this.optional( element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\tvar previous = this.previousValue( element, method ),\n\t\t\t\tvalidator, data, optionDataString;\n\n\t\t\tif ( !this.settings.messages[ element.name ] ) {\n\t\t\t\tthis.settings.messages[ element.name ] = {};\n\t\t\t}\n\t\t\tprevious.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];\n\t\t\tthis.settings.messages[ element.name ][ method ] = previous.message;\n\n\t\t\tparam = typeof param === \"string\" && { url: param } || param;\n\t\t\toptionDataString = $.param( $.extend( { data: value }, param.data ) );\n\t\t\tif ( previous.old === optionDataString ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = optionDataString;\n\t\t\tvalidator = this;\n\t\t\tthis.startRequest( element );\n\t\t\tdata = {};\n\t\t\tdata[ element.name ] = value;\n\t\t\t$.ajax( $.extend( true, {\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: \"validate\" + element.name,\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tcontext: validator.currentForm,\n\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\tvar valid = response === true || response === \"true\",\n\t\t\t\t\t\terrors, message, submitted;\n\n\t\t\t\t\tvalidator.settings.messages[ element.name ][ method ] = previous.originalMessage;\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tsubmitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.resetInternals();\n\t\t\t\t\t\tvalidator.toHide = validator.errorsFor( element );\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push( element );\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = false;\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors = {};\n\t\t\t\t\t\tmessage = response || validator.defaultMessage( element, { method: method, parameters: value } );\n\t\t\t\t\t\terrors[ element.name ] = previous.message = message;\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = true;\n\t\t\t\t\t\tvalidator.showErrors( errors );\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest( element, valid );\n\t\t\t\t}\n\t\t\t}, param ) );\n\t\t\treturn \"pending\";\n\t\t}\n\t}\n\n} );\n\n// Ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\nvar pendingRequests = {},\n\tajax;\n\n// Use a prefilter if available (1.5+)\nif ( $.ajaxPrefilter ) {\n\t$.ajaxPrefilter( function( settings, _, xhr ) {\n\t\tvar port = settings.port;\n\t\tif ( settings.mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = xhr;\n\t\t}\n\t} );\n} else {\n\n\t// Proxy ajax\n\tajax = $.ajax;\n\t$.ajax = function( settings ) {\n\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\tif ( mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = ajax.apply( this, arguments );\n\t\t\treturn pendingRequests[ port ];\n\t\t}\n\t\treturn ajax.apply( this, arguments );\n\t};\n}\nreturn $;\n}));"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt",
    "content": "Copyright (c) .NET Foundation. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthese files except in compliance with the License. You may obtain a copy of the\nLicense at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed\nunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the License for the\nspecific language governing permissions and limitations under the License.\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication1/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js",
    "content": "// Unobtrusive validation support library for jQuery and jQuery Validate\n// Copyright (c) .NET Foundation. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\n// @version v3.2.11\n\n/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */\n/*global document: false, jQuery: false */\n\n(function (factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(\"jquery.validate.unobtrusive\", ['jquery-validation'], factory);\n    } else if (typeof module === 'object' && module.exports) {\n        // CommonJS-like environments that support module.exports     \n        module.exports = factory(require('jquery-validation'));\n    } else {\n        // Browser global\n        jQuery.validator.unobtrusive = factory(jQuery);\n    }\n}(function ($) {\n    var $jQval = $.validator,\n        adapters,\n        data_validation = \"unobtrusiveValidation\";\n\n    function setValidationValues(options, ruleName, value) {\n        options.rules[ruleName] = value;\n        if (options.message) {\n            options.messages[ruleName] = options.message;\n        }\n    }\n\n    function splitAndTrim(value) {\n        return value.replace(/^\\s+|\\s+$/g, \"\").split(/\\s*,\\s*/g);\n    }\n\n    function escapeAttributeValue(value) {\n        // As mentioned on http://api.jquery.com/category/selectors/\n        return value.replace(/([!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n    }\n\n    function getModelPrefix(fieldName) {\n        return fieldName.substr(0, fieldName.lastIndexOf(\".\") + 1);\n    }\n\n    function appendModelPrefix(value, prefix) {\n        if (value.indexOf(\"*.\") === 0) {\n            value = value.replace(\"*.\", prefix);\n        }\n        return value;\n    }\n\n    function onError(error, inputElement) {  // 'this' is the form element\n        var container = $(this).find(\"[data-valmsg-for='\" + escapeAttributeValue(inputElement[0].name) + \"']\"),\n            replaceAttrValue = container.attr(\"data-valmsg-replace\"),\n            replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;\n\n        container.removeClass(\"field-validation-valid\").addClass(\"field-validation-error\");\n        error.data(\"unobtrusiveContainer\", container);\n\n        if (replace) {\n            container.empty();\n            error.removeClass(\"input-validation-error\").appendTo(container);\n        }\n        else {\n            error.hide();\n        }\n    }\n\n    function onErrors(event, validator) {  // 'this' is the form element\n        var container = $(this).find(\"[data-valmsg-summary=true]\"),\n            list = container.find(\"ul\");\n\n        if (list && list.length && validator.errorList.length) {\n            list.empty();\n            container.addClass(\"validation-summary-errors\").removeClass(\"validation-summary-valid\");\n\n            $.each(validator.errorList, function () {\n                $(\"<li />\").html(this.message).appendTo(list);\n            });\n        }\n    }\n\n    function onSuccess(error) {  // 'this' is the form element\n        var container = error.data(\"unobtrusiveContainer\");\n\n        if (container) {\n            var replaceAttrValue = container.attr(\"data-valmsg-replace\"),\n                replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;\n\n            container.addClass(\"field-validation-valid\").removeClass(\"field-validation-error\");\n            error.removeData(\"unobtrusiveContainer\");\n\n            if (replace) {\n                container.empty();\n            }\n        }\n    }\n\n    function onReset(event) {  // 'this' is the form element\n        var $form = $(this),\n            key = '__jquery_unobtrusive_validation_form_reset';\n        if ($form.data(key)) {\n            return;\n        }\n        // Set a flag that indicates we're currently resetting the form.\n        $form.data(key, true);\n        try {\n            $form.data(\"validator\").resetForm();\n        } finally {\n            $form.removeData(key);\n        }\n\n        $form.find(\".validation-summary-errors\")\n            .addClass(\"validation-summary-valid\")\n            .removeClass(\"validation-summary-errors\");\n        $form.find(\".field-validation-error\")\n            .addClass(\"field-validation-valid\")\n            .removeClass(\"field-validation-error\")\n            .removeData(\"unobtrusiveContainer\")\n            .find(\">*\")  // If we were using valmsg-replace, get the underlying error\n            .removeData(\"unobtrusiveContainer\");\n    }\n\n    function validationInfo(form) {\n        var $form = $(form),\n            result = $form.data(data_validation),\n            onResetProxy = $.proxy(onReset, form),\n            defaultOptions = $jQval.unobtrusive.options || {},\n            execInContext = function (name, args) {\n                var func = defaultOptions[name];\n                func && $.isFunction(func) && func.apply(form, args);\n            };\n\n        if (!result) {\n            result = {\n                options: {  // options structure passed to jQuery Validate's validate() method\n                    errorClass: defaultOptions.errorClass || \"input-validation-error\",\n                    errorElement: defaultOptions.errorElement || \"span\",\n                    errorPlacement: function () {\n                        onError.apply(form, arguments);\n                        execInContext(\"errorPlacement\", arguments);\n                    },\n                    invalidHandler: function () {\n                        onErrors.apply(form, arguments);\n                        execInContext(\"invalidHandler\", arguments);\n                    },\n                    messages: {},\n                    rules: {},\n                    success: function () {\n                        onSuccess.apply(form, arguments);\n                        execInContext(\"success\", arguments);\n                    }\n                },\n                attachValidation: function () {\n                    $form\n                        .off(\"reset.\" + data_validation, onResetProxy)\n                        .on(\"reset.\" + data_validation, onResetProxy)\n                        .validate(this.options);\n                },\n                validate: function () {  // a validation function that is called by unobtrusive Ajax\n                    $form.validate();\n                    return $form.valid();\n                }\n            };\n            $form.data(data_validation, result);\n        }\n\n        return result;\n    }\n\n    $jQval.unobtrusive = {\n        adapters: [],\n\n        parseElement: function (element, skipAttach) {\n            /// <summary>\n            /// Parses a single HTML element for unobtrusive validation attributes.\n            /// </summary>\n            /// <param name=\"element\" domElement=\"true\">The HTML element to be parsed.</param>\n            /// <param name=\"skipAttach\" type=\"Boolean\">[Optional] true to skip attaching the\n            /// validation to the form. If parsing just this single element, you should specify true.\n            /// If parsing several elements, you should specify false, and manually attach the validation\n            /// to the form when you are finished. The default is false.</param>\n            var $element = $(element),\n                form = $element.parents(\"form\")[0],\n                valInfo, rules, messages;\n\n            if (!form) {  // Cannot do client-side validation without a form\n                return;\n            }\n\n            valInfo = validationInfo(form);\n            valInfo.options.rules[element.name] = rules = {};\n            valInfo.options.messages[element.name] = messages = {};\n\n            $.each(this.adapters, function () {\n                var prefix = \"data-val-\" + this.name,\n                    message = $element.attr(prefix),\n                    paramValues = {};\n\n                if (message !== undefined) {  // Compare against undefined, because an empty message is legal (and falsy)\n                    prefix += \"-\";\n\n                    $.each(this.params, function () {\n                        paramValues[this] = $element.attr(prefix + this);\n                    });\n\n                    this.adapt({\n                        element: element,\n                        form: form,\n                        message: message,\n                        params: paramValues,\n                        rules: rules,\n                        messages: messages\n                    });\n                }\n            });\n\n            $.extend(rules, { \"__dummy__\": true });\n\n            if (!skipAttach) {\n                valInfo.attachValidation();\n            }\n        },\n\n        parse: function (selector) {\n            /// <summary>\n            /// Parses all the HTML elements in the specified selector. It looks for input elements decorated\n            /// with the [data-val=true] attribute value and enables validation according to the data-val-*\n            /// attribute values.\n            /// </summary>\n            /// <param name=\"selector\" type=\"String\">Any valid jQuery selector.</param>\n\n            // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one\n            // element with data-val=true\n            var $selector = $(selector),\n                $forms = $selector.parents()\n                    .addBack()\n                    .filter(\"form\")\n                    .add($selector.find(\"form\"))\n                    .has(\"[data-val=true]\");\n\n            $selector.find(\"[data-val=true]\").each(function () {\n                $jQval.unobtrusive.parseElement(this, true);\n            });\n\n            $forms.each(function () {\n                var info = validationInfo(this);\n                if (info) {\n                    info.attachValidation();\n                }\n            });\n        }\n    };\n\n    adapters = $jQval.unobtrusive.adapters;\n\n    adapters.add = function (adapterName, params, fn) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\n        /// <param name=\"params\" type=\"Array\" optional=\"true\">[Optional] An array of parameter names (strings) that will\n        /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and\n        /// mmmm is the parameter name).</param>\n        /// <param name=\"fn\" type=\"Function\">The function to call, which adapts the values from the HTML\n        /// attributes into jQuery Validate rules and/or messages.</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        if (!fn) {  // Called with no params, just a function\n            fn = params;\n            params = [];\n        }\n        this.push({ name: adapterName, params: params, adapt: fn });\n        return this;\n    };\n\n    adapters.addBool = function (adapterName, ruleName) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\n        /// the jQuery Validate validation rule has no parameter values.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\n        /// <param name=\"ruleName\" type=\"String\" optional=\"true\">[Optional] The name of the jQuery Validate rule. If not provided, the value\n        /// of adapterName will be used instead.</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        return this.add(adapterName, function (options) {\n            setValidationValues(options, ruleName || adapterName, true);\n        });\n    };\n\n    adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\n        /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and\n        /// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\n        /// <param name=\"minRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you only\n        /// have a minimum value.</param>\n        /// <param name=\"maxRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you only\n        /// have a maximum value.</param>\n        /// <param name=\"minMaxRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you\n        /// have both a minimum and maximum value.</param>\n        /// <param name=\"minAttribute\" type=\"String\" optional=\"true\">[Optional] The name of the HTML attribute that\n        /// contains the minimum value. The default is \"min\".</param>\n        /// <param name=\"maxAttribute\" type=\"String\" optional=\"true\">[Optional] The name of the HTML attribute that\n        /// contains the maximum value. The default is \"max\".</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        return this.add(adapterName, [minAttribute || \"min\", maxAttribute || \"max\"], function (options) {\n            var min = options.params.min,\n                max = options.params.max;\n\n            if (min && max) {\n                setValidationValues(options, minMaxRuleName, [min, max]);\n            }\n            else if (min) {\n                setValidationValues(options, minRuleName, min);\n            }\n            else if (max) {\n                setValidationValues(options, maxRuleName, max);\n            }\n        });\n    };\n\n    adapters.addSingleVal = function (adapterName, attribute, ruleName) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\n        /// the jQuery Validate validation rule has a single value.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>\n        /// <param name=\"attribute\" type=\"String\">[Optional] The name of the HTML attribute that contains the value.\n        /// The default is \"val\".</param>\n        /// <param name=\"ruleName\" type=\"String\" optional=\"true\">[Optional] The name of the jQuery Validate rule. If not provided, the value\n        /// of adapterName will be used instead.</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        return this.add(adapterName, [attribute || \"val\"], function (options) {\n            setValidationValues(options, ruleName || adapterName, options.params[attribute]);\n        });\n    };\n\n    $jQval.addMethod(\"__dummy__\", function (value, element, params) {\n        return true;\n    });\n\n    $jQval.addMethod(\"regex\", function (value, element, params) {\n        var match;\n        if (this.optional(element)) {\n            return true;\n        }\n\n        match = new RegExp(params).exec(value);\n        return (match && (match.index === 0) && (match[0].length === value.length));\n    });\n\n    $jQval.addMethod(\"nonalphamin\", function (value, element, nonalphamin) {\n        var match;\n        if (nonalphamin) {\n            match = value.match(/\\W/g);\n            match = match && match.length >= nonalphamin;\n        }\n        return match;\n    });\n\n    if ($jQval.methods.extension) {\n        adapters.addSingleVal(\"accept\", \"mimtype\");\n        adapters.addSingleVal(\"extension\", \"extension\");\n    } else {\n        // for backward compatibility, when the 'extension' validation method does not exist, such as with versions\n        // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for\n        // validating the extension, and ignore mime-type validations as they are not supported.\n        adapters.addSingleVal(\"extension\", \"extension\", \"accept\");\n    }\n\n    adapters.addSingleVal(\"regex\", \"pattern\");\n    adapters.addBool(\"creditcard\").addBool(\"date\").addBool(\"digits\").addBool(\"email\").addBool(\"number\").addBool(\"url\");\n    adapters.addMinMax(\"length\", \"minlength\", \"maxlength\", \"rangelength\").addMinMax(\"range\", \"min\", \"max\", \"range\");\n    adapters.addMinMax(\"minlength\", \"minlength\").addMinMax(\"maxlength\", \"minlength\", \"maxlength\");\n    adapters.add(\"equalto\", [\"other\"], function (options) {\n        var prefix = getModelPrefix(options.element.name),\n            other = options.params.other,\n            fullOtherName = appendModelPrefix(other, prefix),\n            element = $(options.form).find(\":input\").filter(\"[name='\" + escapeAttributeValue(fullOtherName) + \"']\")[0];\n\n        setValidationValues(options, \"equalTo\", element);\n    });\n    adapters.add(\"required\", function (options) {\n        // jQuery Validate equates \"required\" with \"mandatory\" for checkbox elements\n        if (options.element.tagName.toUpperCase() !== \"INPUT\" || options.element.type.toUpperCase() !== \"CHECKBOX\") {\n            setValidationValues(options, \"required\", true);\n        }\n    });\n    adapters.add(\"remote\", [\"url\", \"type\", \"additionalfields\"], function (options) {\n        var value = {\n            url: options.params.url,\n            type: options.params.type || \"GET\",\n            data: {}\n        },\n            prefix = getModelPrefix(options.element.name);\n\n        $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {\n            var paramName = appendModelPrefix(fieldName, prefix);\n            value.data[paramName] = function () {\n                var field = $(options.form).find(\":input\").filter(\"[name='\" + escapeAttributeValue(paramName) + \"']\");\n                // For checkboxes and radio buttons, only pick up values from checked fields.\n                if (field.is(\":checkbox\")) {\n                    return field.filter(\":checked\").val() || field.filter(\":hidden\").val() || '';\n                }\n                else if (field.is(\":radio\")) {\n                    return field.filter(\":checked\").val() || '';\n                }\n                return field.val();\n            };\n        });\n\n        setValidationValues(options, \"remote\", value);\n    });\n    adapters.add(\"password\", [\"min\", \"nonalphamin\", \"regex\"], function (options) {\n        if (options.params.min) {\n            setValidationValues(options, \"minlength\", options.params.min);\n        }\n        if (options.params.nonalphamin) {\n            setValidationValues(options, \"nonalphamin\", options.params.nonalphamin);\n        }\n        if (options.params.regex) {\n            setValidationValues(options, \"regex\", options.params.regex);\n        }\n    });\n    adapters.add(\"fileextensions\", [\"extensions\"], function (options) {\n        setValidationValues(options, \"extension\", options.params.extensions);\n    });\n\n    $(function () {\n        $jQval.unobtrusive.parse(document);\n    });\n\n    return $jQval.unobtrusive;\n}));\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/Controllers/HomeController.cs",
    "content": "﻿using Microsoft.AspNetCore.Mvc;\nusing System.Diagnostics;\nusing WebApplication2.Models;\n\nnamespace WebApplication2.Controllers;\npublic class HomeController : Controller\n{\n    private readonly ILogger<HomeController> _logger;\n\n    public HomeController(ILogger<HomeController> logger)\n    {\n        _logger = logger;\n    }\n\n    public IActionResult Index()\n    {\n        return View();\n    }\n\n    public IActionResult Privacy()\n    {\n        return View();\n    }\n\n    [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]\n    public IActionResult Error()\n    {\n        return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });\n    }\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/Models/ErrorViewModel.cs",
    "content": "\nnamespace WebApplication2.Models;\npublic class ErrorViewModel\n{\n    public string? RequestId { get; set; }\n\n    public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/Program.cs",
    "content": "\nvar builder = WebApplication.CreateBuilder(args);\n\n// Add services to the container.\nbuilder.Services.AddControllersWithViews();\n\nvar app = builder.Build();\n\n// Configure the HTTP request pipeline.\nif (app.Environment.IsDevelopment())\n{\n    app.UseDeveloperExceptionPage();\n}\nelse\n{\n    app.UseExceptionHandler(\"/Home/Error\");\n    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.\n    app.UseHsts();\n}\n\napp.UseHttpsRedirection();\napp.UseStaticFiles();\n\napp.UseRouting();\n\napp.UseAuthorization();\n\napp.MapControllerRoute(\n    name: \"default\",\n    pattern: \"{controller=Home}/{action=Index}/{id?}\");\n\napp.Run();\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/Properties/launchSettings.json",
    "content": "﻿{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:20821\",\n      \"sslPort\": 44330\n    }\n  },\n  \"profiles\": {\n    \"WebApplication2\": {\n      \"commandName\": \"Project\",\n      \"dotnetRunMessages\": true,\n      \"launchBrowser\": true,\n      \"applicationUrl\": \"https://localhost:5001;http://localhost:5000\",\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/Views/Home/Index.cshtml",
    "content": "﻿@{\n    ViewData[\"Title\"] = \"Home Page\";\n}\n\n<div class=\"text-center\">\n    <h1 class=\"display-4\">Welcome</h1>\n    <p>Learn about <a href=\"https://docs.microsoft.com/aspnet/core\">building Web apps with ASP.NET Core</a>.</p>\n</div>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/Views/Home/Privacy.cshtml",
    "content": "﻿@{\n    ViewData[\"Title\"] = \"Privacy Policy\";\n}\n<h1>@ViewData[\"Title\"]</h1>\n\n<p>Use this page to detail your site's privacy policy.</p>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/Views/Shared/Error.cshtml",
    "content": "﻿@model ErrorViewModel\n@{\n    ViewData[\"Title\"] = \"Error\";\n}\n\n<h1 class=\"text-danger\">Error.</h1>\n<h2 class=\"text-danger\">An error occurred while processing your request.</h2>\n\n@if (Model?.ShowRequestId ?? false)\n{\n    <p>\n        <strong>Request ID:</strong> <code>@Model?.RequestId</code>\n    </p>\n}\n\n<h3>Development Mode</h3>\n<p>\n    Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.\n</p>\n<p>\n    <strong>The Development environment shouldn't be enabled for deployed applications.</strong>\n    It can result in displaying sensitive information from exceptions to end users.\n    For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>\n    and restarting the app.\n</p>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/Views/Shared/_Layout.cshtml",
    "content": "﻿<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <title>@ViewData[\"Title\"] - WebApplication2</title>\n    <link rel=\"stylesheet\" href=\"~/lib/bootstrap/dist/css/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" href=\"~/css/site.css\" asp-append-version=\"true\" />\n</head>\n<body>\n    <header>\n        <nav class=\"navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3\">\n            <div class=\"container\">\n                <a class=\"navbar-brand\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Index\">WebApplication2</a>\n                <button class=\"navbar-toggler\" type=\"button\" data-toggle=\"collapse\" data-target=\".navbar-collapse\" aria-controls=\"navbarSupportedContent\"\n                        aria-expanded=\"false\" aria-label=\"Toggle navigation\">\n                    <span class=\"navbar-toggler-icon\"></span>\n                </button>\n                <div class=\"navbar-collapse collapse d-sm-inline-flex justify-content-between\">\n                    <ul class=\"navbar-nav flex-grow-1\">\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Index\">Home</a>\n                        </li>\n                        <li class=\"nav-item\">\n                            <a class=\"nav-link text-dark\" asp-area=\"\" asp-controller=\"Home\" asp-action=\"Privacy\">Privacy</a>\n                        </li>\n                    </ul>\n                </div>\n            </div>\n        </nav>\n    </header>\n    <div class=\"container\">\n        <main role=\"main\" class=\"pb-3\">\n            @RenderBody()\n        </main>\n    </div>\n\n    <footer class=\"border-top footer text-muted\">\n        <div class=\"container\">\n            &copy; 2021 - WebApplication2 - <a asp-area=\"\" asp-controller=\"Home\" asp-action=\"Privacy\">Privacy</a>\n        </div>\n    </footer>\n    <script src=\"~/lib/jquery/dist/jquery.min.js\"></script>\n    <script src=\"~/lib/bootstrap/dist/js/bootstrap.bundle.min.js\"></script>\n    <script src=\"~/js/site.js\" asp-append-version=\"true\"></script>\n    @await RenderSectionAsync(\"Scripts\", required: false)\n</body>\n</html>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/Views/Shared/_ValidationScriptsPartial.cshtml",
    "content": "﻿<script src=\"~/lib/jquery-validation/dist/jquery.validate.min.js\"></script>\n<script src=\"~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js\"></script>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/Views/_ViewImports.cshtml",
    "content": "﻿@using WebApplication2\n@using WebApplication2.Models\n@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/Views/_ViewStart.cshtml",
    "content": "﻿@{\n    Layout = \"_Layout\";\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/WebApplication2.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n\n  <PropertyGroup>\n    <TargetFramework>net6.0</TargetFramework>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/appsettings.Development.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Warning\",\n      \"Microsoft.Hosting.Lifetime\": \"Information\"\n    }\n  }\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/appsettings.json",
    "content": "{\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft\": \"Warning\",\n      \"Microsoft.Hosting.Lifetime\": \"Information\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/css/site.css",
    "content": "﻿/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\nfor details on configuring this project to bundle and minify static web assets. */\n\na.navbar-brand {\n  white-space: normal;\n  text-align: center;\n  word-break: break-all;\n}\n\na {\n  color: #0077cc;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #1b6ec2;\n  border-color: #1861ac;\n}\n\n.nav-pills .nav-link.active, .nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #1b6ec2;\n  border-color: #1861ac;\n}\n\nhtml {\n  font-size: 14px;\n}\n@media (min-width: 768px) {\n  html {\n    font-size: 16px;\n  }\n}\n\n.border-top {\n  border-top: 1px solid #e5e5e5;\n}\n.border-bottom {\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.box-shadow {\n  box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);\n}\n\nbutton.accept-policy {\n  font-size: 1rem;\n  line-height: inherit;\n}\n\nhtml {\n  position: relative;\n  min-height: 100%;\n}\n\nbody {\n  margin-bottom: 60px;\n}\n.footer {\n  position: absolute;\n  bottom: 0;\n  width: 100%;\n  white-space: nowrap;\n  line-height: 60px;\n}\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/js/site.js",
    "content": "﻿// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification\n// for details on configuring this project to bundle and minify static web assets.\n\n// Write your JavaScript code.\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/bootstrap/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2011-2018 Twitter, Inc.\nCopyright (c) 2011-2018 The Bootstrap Authors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/bootstrap/dist/css/bootstrap-grid.css",
    "content": "/*!\n * Bootstrap Grid v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\nhtml {\n  box-sizing: border-box;\n  -ms-overflow-style: scrollbar;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: inherit;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  -ms-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: auto;\n  max-width: 100%;\n}\n\n.col-1 {\n  -ms-flex: 0 0 8.333333%;\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  -ms-flex: 0 0 16.666667%;\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  -ms-flex: 0 0 25%;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -ms-flex: 0 0 33.333333%;\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  -ms-flex: 0 0 41.666667%;\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  -ms-flex: 0 0 50%;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -ms-flex: 0 0 58.333333%;\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  -ms-flex: 0 0 66.666667%;\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  -ms-flex: 0 0 75%;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -ms-flex: 0 0 83.333333%;\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  -ms-flex: 0 0 91.666667%;\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  -ms-flex: 0 0 100%;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -ms-flex-order: -1;\n  order: -1;\n}\n\n.order-last {\n  -ms-flex-order: 13;\n  order: 13;\n}\n\n.order-0 {\n  -ms-flex-order: 0;\n  order: 0;\n}\n\n.order-1 {\n  -ms-flex-order: 1;\n  order: 1;\n}\n\n.order-2 {\n  -ms-flex-order: 2;\n  order: 2;\n}\n\n.order-3 {\n  -ms-flex-order: 3;\n  order: 3;\n}\n\n.order-4 {\n  -ms-flex-order: 4;\n  order: 4;\n}\n\n.order-5 {\n  -ms-flex-order: 5;\n  order: 5;\n}\n\n.order-6 {\n  -ms-flex-order: 6;\n  order: 6;\n}\n\n.order-7 {\n  -ms-flex-order: 7;\n  order: 7;\n}\n\n.order-8 {\n  -ms-flex-order: 8;\n  order: 8;\n}\n\n.order-9 {\n  -ms-flex-order: 9;\n  order: 9;\n}\n\n.order-10 {\n  -ms-flex-order: 10;\n  order: 10;\n}\n\n.order-11 {\n  -ms-flex-order: 11;\n  order: 11;\n}\n\n.order-12 {\n  -ms-flex-order: 12;\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-sm-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-sm-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-sm-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-sm-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-sm-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-sm-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-sm-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-sm-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-sm-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-sm-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-sm-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-sm-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-sm-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-sm-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-sm-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-md-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-md-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-md-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-md-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-md-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-md-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-md-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-md-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-md-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-md-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-md-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-md-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-md-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-md-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-md-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-lg-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-lg-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-lg-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-lg-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-lg-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-lg-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-lg-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-lg-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-lg-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-lg-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-lg-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-lg-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-lg-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-lg-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-lg-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-xl-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-xl-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-xl-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-xl-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-xl-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-xl-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-xl-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-xl-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-xl-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-xl-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-xl-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-xl-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-xl-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-xl-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-xl-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: -ms-flexbox !important;\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: -ms-inline-flexbox !important;\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n.flex-row {\n  -ms-flex-direction: row !important;\n  flex-direction: row !important;\n}\n\n.flex-column {\n  -ms-flex-direction: column !important;\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -ms-flex-direction: row-reverse !important;\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -ms-flex-direction: column-reverse !important;\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n  flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n  -ms-flex: 1 1 auto !important;\n  flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n  -ms-flex-positive: 0 !important;\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  -ms-flex-positive: 1 !important;\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  -ms-flex-negative: 0 !important;\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  -ms-flex-negative: 1 !important;\n  flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n  -ms-flex-pack: start !important;\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -ms-flex-pack: end !important;\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -ms-flex-pack: center !important;\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  -ms-flex-pack: justify !important;\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  -ms-flex-align: start !important;\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  -ms-flex-align: end !important;\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  -ms-flex-align: center !important;\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  -ms-flex-align: baseline !important;\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -ms-flex-align: stretch !important;\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n  align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n  align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n\n.m-n1 {\n  margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n  margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n  margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n  margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n  margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n  margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n  margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n  margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n  margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n  margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n  margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n  margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n  margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n  margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n  margin-left: -1rem !important;\n}\n\n.m-n4 {\n  margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n  margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n  margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n  margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n  margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n  margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n  margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n  margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n  margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n  margin-left: -3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-sm-n1,\n  .my-sm-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-sm-n1,\n  .mx-sm-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-sm-n1,\n  .my-sm-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-sm-n1,\n  .mx-sm-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-sm-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-sm-n2,\n  .my-sm-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-sm-n2,\n  .mx-sm-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-sm-n2,\n  .my-sm-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-sm-n2,\n  .mx-sm-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-sm-n3 {\n    margin: -1rem !important;\n  }\n  .mt-sm-n3,\n  .my-sm-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-sm-n3,\n  .mx-sm-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-sm-n3,\n  .my-sm-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-sm-n3,\n  .mx-sm-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-sm-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-sm-n4,\n  .my-sm-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-sm-n4,\n  .mx-sm-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-sm-n4,\n  .my-sm-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-sm-n4,\n  .mx-sm-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-sm-n5 {\n    margin: -3rem !important;\n  }\n  .mt-sm-n5,\n  .my-sm-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-sm-n5,\n  .mx-sm-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-sm-n5,\n  .my-sm-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-sm-n5,\n  .mx-sm-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-md-n1,\n  .my-md-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-md-n1,\n  .mx-md-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-md-n1,\n  .my-md-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-md-n1,\n  .mx-md-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-md-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-md-n2,\n  .my-md-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-md-n2,\n  .mx-md-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-md-n2,\n  .my-md-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-md-n2,\n  .mx-md-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-md-n3 {\n    margin: -1rem !important;\n  }\n  .mt-md-n3,\n  .my-md-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-md-n3,\n  .mx-md-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-md-n3,\n  .my-md-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-md-n3,\n  .mx-md-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-md-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-md-n4,\n  .my-md-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-md-n4,\n  .mx-md-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-md-n4,\n  .my-md-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-md-n4,\n  .mx-md-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-md-n5 {\n    margin: -3rem !important;\n  }\n  .mt-md-n5,\n  .my-md-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-md-n5,\n  .mx-md-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-md-n5,\n  .my-md-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-md-n5,\n  .mx-md-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-lg-n1,\n  .my-lg-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-lg-n1,\n  .mx-lg-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-lg-n1,\n  .my-lg-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-lg-n1,\n  .mx-lg-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-lg-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-lg-n2,\n  .my-lg-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-lg-n2,\n  .mx-lg-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-lg-n2,\n  .my-lg-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-lg-n2,\n  .mx-lg-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-lg-n3 {\n    margin: -1rem !important;\n  }\n  .mt-lg-n3,\n  .my-lg-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-lg-n3,\n  .mx-lg-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-lg-n3,\n  .my-lg-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-lg-n3,\n  .mx-lg-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-lg-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-lg-n4,\n  .my-lg-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-lg-n4,\n  .mx-lg-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-lg-n4,\n  .my-lg-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-lg-n4,\n  .mx-lg-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-lg-n5 {\n    margin: -3rem !important;\n  }\n  .mt-lg-n5,\n  .my-lg-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-lg-n5,\n  .mx-lg-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-lg-n5,\n  .my-lg-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-lg-n5,\n  .mx-lg-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-xl-n1,\n  .my-xl-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-xl-n1,\n  .mx-xl-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-xl-n1,\n  .my-xl-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-xl-n1,\n  .mx-xl-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-xl-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-xl-n2,\n  .my-xl-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-xl-n2,\n  .mx-xl-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-xl-n2,\n  .my-xl-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-xl-n2,\n  .mx-xl-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-xl-n3 {\n    margin: -1rem !important;\n  }\n  .mt-xl-n3,\n  .my-xl-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-xl-n3,\n  .mx-xl-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-xl-n3,\n  .my-xl-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-xl-n3,\n  .mx-xl-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-xl-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-xl-n4,\n  .my-xl-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-xl-n4,\n  .mx-xl-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-xl-n4,\n  .my-xl-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-xl-n4,\n  .mx-xl-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-xl-n5 {\n    margin: -3rem !important;\n  }\n  .mt-xl-n5,\n  .my-xl-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-xl-n5,\n  .mx-xl-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-xl-n5,\n  .my-xl-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-xl-n5,\n  .mx-xl-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n/*# sourceMappingURL=bootstrap-grid.css.map */"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/bootstrap/dist/css/bootstrap-reboot.css",
    "content": "/*!\n * Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)\n */\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg {\n  overflow: hidden;\n  vertical-align: middle;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #6c757d;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nselect {\n  word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n  cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n/*# sourceMappingURL=bootstrap-reboot.css.map */"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/bootstrap/dist/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v4.3.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 The Bootstrap Authors\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n:root {\n  --blue: #007bff;\n  --indigo: #6610f2;\n  --purple: #6f42c1;\n  --pink: #e83e8c;\n  --red: #dc3545;\n  --orange: #fd7e14;\n  --yellow: #ffc107;\n  --green: #28a745;\n  --teal: #20c997;\n  --cyan: #17a2b8;\n  --white: #fff;\n  --gray: #6c757d;\n  --gray-dark: #343a40;\n  --primary: #007bff;\n  --secondary: #6c757d;\n  --success: #28a745;\n  --info: #17a2b8;\n  --warning: #ffc107;\n  --danger: #dc3545;\n  --light: #f8f9fa;\n  --dark: #343a40;\n  --breakpoint-xs: 0;\n  --breakpoint-sm: 576px;\n  --breakpoint-md: 768px;\n  --breakpoint-lg: 992px;\n  --breakpoint-xl: 1200px;\n  --font-family-sans-serif: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n}\n\n*,\n*::before,\n*::after {\n  box-sizing: border-box;\n}\n\nhtml {\n  font-family: sans-serif;\n  line-height: 1.15;\n  -webkit-text-size-adjust: 100%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\narticle, aside, figcaption, figure, footer, header, hgroup, main, nav, section {\n  display: block;\n}\n\nbody {\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #212529;\n  text-align: left;\n  background-color: #fff;\n}\n\n[tabindex=\"-1\"]:focus {\n  outline: 0 !important;\n}\n\nhr {\n  box-sizing: content-box;\n  height: 0;\n  overflow: visible;\n}\n\nh1, h2, h3, h4, h5, h6 {\n  margin-top: 0;\n  margin-bottom: 0.5rem;\n}\n\np {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nabbr[title],\nabbr[data-original-title] {\n  text-decoration: underline;\n  -webkit-text-decoration: underline dotted;\n  text-decoration: underline dotted;\n  cursor: help;\n  border-bottom: 0;\n  -webkit-text-decoration-skip-ink: none;\n  text-decoration-skip-ink: none;\n}\n\naddress {\n  margin-bottom: 1rem;\n  font-style: normal;\n  line-height: inherit;\n}\n\nol,\nul,\ndl {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n  margin-bottom: 0;\n}\n\ndt {\n  font-weight: 700;\n}\n\ndd {\n  margin-bottom: .5rem;\n  margin-left: 0;\n}\n\nblockquote {\n  margin: 0 0 1rem;\n}\n\nb,\nstrong {\n  font-weight: bolder;\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsub {\n  bottom: -.25em;\n}\n\nsup {\n  top: -.5em;\n}\n\na {\n  color: #007bff;\n  text-decoration: none;\n  background-color: transparent;\n}\n\na:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\na:not([href]):not([tabindex]) {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {\n  color: inherit;\n  text-decoration: none;\n}\n\na:not([href]):not([tabindex]):focus {\n  outline: 0;\n}\n\npre,\ncode,\nkbd,\nsamp {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n  font-size: 1em;\n}\n\npre {\n  margin-top: 0;\n  margin-bottom: 1rem;\n  overflow: auto;\n}\n\nfigure {\n  margin: 0 0 1rem;\n}\n\nimg {\n  vertical-align: middle;\n  border-style: none;\n}\n\nsvg {\n  overflow: hidden;\n  vertical-align: middle;\n}\n\ntable {\n  border-collapse: collapse;\n}\n\ncaption {\n  padding-top: 0.75rem;\n  padding-bottom: 0.75rem;\n  color: #6c757d;\n  text-align: left;\n  caption-side: bottom;\n}\n\nth {\n  text-align: inherit;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 0.5rem;\n}\n\nbutton {\n  border-radius: 0;\n}\n\nbutton:focus {\n  outline: 1px dotted;\n  outline: 5px auto -webkit-focus-ring-color;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput {\n  overflow: visible;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nselect {\n  word-wrap: normal;\n}\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n  -webkit-appearance: button;\n}\n\nbutton:not(:disabled),\n[type=\"button\"]:not(:disabled),\n[type=\"reset\"]:not(:disabled),\n[type=\"submit\"]:not(:disabled) {\n  cursor: pointer;\n}\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n  padding: 0;\n  border-style: none;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  box-sizing: border-box;\n  padding: 0;\n}\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n  -webkit-appearance: listbox;\n}\n\ntextarea {\n  overflow: auto;\n  resize: vertical;\n}\n\nfieldset {\n  min-width: 0;\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  padding: 0;\n  margin-bottom: .5rem;\n  font-size: 1.5rem;\n  line-height: inherit;\n  color: inherit;\n  white-space: normal;\n}\n\nprogress {\n  vertical-align: baseline;\n}\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n[type=\"search\"] {\n  outline-offset: -2px;\n  -webkit-appearance: none;\n}\n\n[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n::-webkit-file-upload-button {\n  font: inherit;\n  -webkit-appearance: button;\n}\n\noutput {\n  display: inline-block;\n}\n\nsummary {\n  display: list-item;\n  cursor: pointer;\n}\n\ntemplate {\n  display: none;\n}\n\n[hidden] {\n  display: none !important;\n}\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  margin-bottom: 0.5rem;\n  font-weight: 500;\n  line-height: 1.2;\n}\n\nh1, .h1 {\n  font-size: 2.5rem;\n}\n\nh2, .h2 {\n  font-size: 2rem;\n}\n\nh3, .h3 {\n  font-size: 1.75rem;\n}\n\nh4, .h4 {\n  font-size: 1.5rem;\n}\n\nh5, .h5 {\n  font-size: 1.25rem;\n}\n\nh6, .h6 {\n  font-size: 1rem;\n}\n\n.lead {\n  font-size: 1.25rem;\n  font-weight: 300;\n}\n\n.display-1 {\n  font-size: 6rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-2 {\n  font-size: 5.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-3 {\n  font-size: 4.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\n.display-4 {\n  font-size: 3.5rem;\n  font-weight: 300;\n  line-height: 1.2;\n}\n\nhr {\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n  border: 0;\n  border-top: 1px solid rgba(0, 0, 0, 0.1);\n}\n\nsmall,\n.small {\n  font-size: 80%;\n  font-weight: 400;\n}\n\nmark,\n.mark {\n  padding: 0.2em;\n  background-color: #fcf8e3;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline-item {\n  display: inline-block;\n}\n\n.list-inline-item:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n.blockquote {\n  margin-bottom: 1rem;\n  font-size: 1.25rem;\n}\n\n.blockquote-footer {\n  display: block;\n  font-size: 80%;\n  color: #6c757d;\n}\n\n.blockquote-footer::before {\n  content: \"\\2014\\00A0\";\n}\n\n.img-fluid {\n  max-width: 100%;\n  height: auto;\n}\n\n.img-thumbnail {\n  padding: 0.25rem;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n  border-radius: 0.25rem;\n  max-width: 100%;\n  height: auto;\n}\n\n.figure {\n  display: inline-block;\n}\n\n.figure-img {\n  margin-bottom: 0.5rem;\n  line-height: 1;\n}\n\n.figure-caption {\n  font-size: 90%;\n  color: #6c757d;\n}\n\ncode {\n  font-size: 87.5%;\n  color: #e83e8c;\n  word-break: break-word;\n}\n\na > code {\n  color: inherit;\n}\n\nkbd {\n  padding: 0.2rem 0.4rem;\n  font-size: 87.5%;\n  color: #fff;\n  background-color: #212529;\n  border-radius: 0.2rem;\n}\n\nkbd kbd {\n  padding: 0;\n  font-size: 100%;\n  font-weight: 700;\n}\n\npre {\n  display: block;\n  font-size: 87.5%;\n  color: #212529;\n}\n\npre code {\n  font-size: inherit;\n  color: inherit;\n  word-break: normal;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n@media (min-width: 576px) {\n  .container {\n    max-width: 540px;\n  }\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 720px;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 960px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1140px;\n  }\n}\n\n.container-fluid {\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.no-gutters {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.no-gutters > .col,\n.no-gutters > [class*=\"col-\"] {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col,\n.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm,\n.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md,\n.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg,\n.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl,\n.col-xl-auto {\n  position: relative;\n  width: 100%;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  max-width: 100%;\n}\n\n.col-auto {\n  -ms-flex: 0 0 auto;\n  flex: 0 0 auto;\n  width: auto;\n  max-width: 100%;\n}\n\n.col-1 {\n  -ms-flex: 0 0 8.333333%;\n  flex: 0 0 8.333333%;\n  max-width: 8.333333%;\n}\n\n.col-2 {\n  -ms-flex: 0 0 16.666667%;\n  flex: 0 0 16.666667%;\n  max-width: 16.666667%;\n}\n\n.col-3 {\n  -ms-flex: 0 0 25%;\n  flex: 0 0 25%;\n  max-width: 25%;\n}\n\n.col-4 {\n  -ms-flex: 0 0 33.333333%;\n  flex: 0 0 33.333333%;\n  max-width: 33.333333%;\n}\n\n.col-5 {\n  -ms-flex: 0 0 41.666667%;\n  flex: 0 0 41.666667%;\n  max-width: 41.666667%;\n}\n\n.col-6 {\n  -ms-flex: 0 0 50%;\n  flex: 0 0 50%;\n  max-width: 50%;\n}\n\n.col-7 {\n  -ms-flex: 0 0 58.333333%;\n  flex: 0 0 58.333333%;\n  max-width: 58.333333%;\n}\n\n.col-8 {\n  -ms-flex: 0 0 66.666667%;\n  flex: 0 0 66.666667%;\n  max-width: 66.666667%;\n}\n\n.col-9 {\n  -ms-flex: 0 0 75%;\n  flex: 0 0 75%;\n  max-width: 75%;\n}\n\n.col-10 {\n  -ms-flex: 0 0 83.333333%;\n  flex: 0 0 83.333333%;\n  max-width: 83.333333%;\n}\n\n.col-11 {\n  -ms-flex: 0 0 91.666667%;\n  flex: 0 0 91.666667%;\n  max-width: 91.666667%;\n}\n\n.col-12 {\n  -ms-flex: 0 0 100%;\n  flex: 0 0 100%;\n  max-width: 100%;\n}\n\n.order-first {\n  -ms-flex-order: -1;\n  order: -1;\n}\n\n.order-last {\n  -ms-flex-order: 13;\n  order: 13;\n}\n\n.order-0 {\n  -ms-flex-order: 0;\n  order: 0;\n}\n\n.order-1 {\n  -ms-flex-order: 1;\n  order: 1;\n}\n\n.order-2 {\n  -ms-flex-order: 2;\n  order: 2;\n}\n\n.order-3 {\n  -ms-flex-order: 3;\n  order: 3;\n}\n\n.order-4 {\n  -ms-flex-order: 4;\n  order: 4;\n}\n\n.order-5 {\n  -ms-flex-order: 5;\n  order: 5;\n}\n\n.order-6 {\n  -ms-flex-order: 6;\n  order: 6;\n}\n\n.order-7 {\n  -ms-flex-order: 7;\n  order: 7;\n}\n\n.order-8 {\n  -ms-flex-order: 8;\n  order: 8;\n}\n\n.order-9 {\n  -ms-flex-order: 9;\n  order: 9;\n}\n\n.order-10 {\n  -ms-flex-order: 10;\n  order: 10;\n}\n\n.order-11 {\n  -ms-flex-order: 11;\n  order: 11;\n}\n\n.order-12 {\n  -ms-flex-order: 12;\n  order: 12;\n}\n\n.offset-1 {\n  margin-left: 8.333333%;\n}\n\n.offset-2 {\n  margin-left: 16.666667%;\n}\n\n.offset-3 {\n  margin-left: 25%;\n}\n\n.offset-4 {\n  margin-left: 33.333333%;\n}\n\n.offset-5 {\n  margin-left: 41.666667%;\n}\n\n.offset-6 {\n  margin-left: 50%;\n}\n\n.offset-7 {\n  margin-left: 58.333333%;\n}\n\n.offset-8 {\n  margin-left: 66.666667%;\n}\n\n.offset-9 {\n  margin-left: 75%;\n}\n\n.offset-10 {\n  margin-left: 83.333333%;\n}\n\n.offset-11 {\n  margin-left: 91.666667%;\n}\n\n@media (min-width: 576px) {\n  .col-sm {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-sm-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-sm-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-sm-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-sm-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-sm-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-sm-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-sm-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-sm-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-sm-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-sm-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-sm-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-sm-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-sm-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-sm-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-sm-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-sm-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-sm-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-sm-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-sm-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-sm-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-sm-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-sm-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-sm-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-sm-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-sm-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-sm-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-sm-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-sm-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-sm-0 {\n    margin-left: 0;\n  }\n  .offset-sm-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-sm-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-sm-3 {\n    margin-left: 25%;\n  }\n  .offset-sm-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-sm-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-sm-6 {\n    margin-left: 50%;\n  }\n  .offset-sm-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-sm-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-sm-9 {\n    margin-left: 75%;\n  }\n  .offset-sm-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-sm-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 768px) {\n  .col-md {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-md-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-md-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-md-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-md-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-md-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-md-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-md-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-md-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-md-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-md-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-md-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-md-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-md-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-md-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-md-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-md-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-md-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-md-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-md-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-md-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-md-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-md-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-md-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-md-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-md-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-md-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-md-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-md-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-md-0 {\n    margin-left: 0;\n  }\n  .offset-md-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-md-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-md-3 {\n    margin-left: 25%;\n  }\n  .offset-md-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-md-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-md-6 {\n    margin-left: 50%;\n  }\n  .offset-md-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-md-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-md-9 {\n    margin-left: 75%;\n  }\n  .offset-md-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-md-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 992px) {\n  .col-lg {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-lg-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-lg-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-lg-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-lg-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-lg-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-lg-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-lg-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-lg-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-lg-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-lg-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-lg-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-lg-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-lg-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-lg-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-lg-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-lg-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-lg-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-lg-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-lg-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-lg-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-lg-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-lg-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-lg-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-lg-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-lg-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-lg-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-lg-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-lg-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-lg-0 {\n    margin-left: 0;\n  }\n  .offset-lg-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-lg-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-lg-3 {\n    margin-left: 25%;\n  }\n  .offset-lg-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-lg-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-lg-6 {\n    margin-left: 50%;\n  }\n  .offset-lg-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-lg-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-lg-9 {\n    margin-left: 75%;\n  }\n  .offset-lg-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-lg-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .col-xl {\n    -ms-flex-preferred-size: 0;\n    flex-basis: 0;\n    -ms-flex-positive: 1;\n    flex-grow: 1;\n    max-width: 100%;\n  }\n  .col-xl-auto {\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    width: auto;\n    max-width: 100%;\n  }\n  .col-xl-1 {\n    -ms-flex: 0 0 8.333333%;\n    flex: 0 0 8.333333%;\n    max-width: 8.333333%;\n  }\n  .col-xl-2 {\n    -ms-flex: 0 0 16.666667%;\n    flex: 0 0 16.666667%;\n    max-width: 16.666667%;\n  }\n  .col-xl-3 {\n    -ms-flex: 0 0 25%;\n    flex: 0 0 25%;\n    max-width: 25%;\n  }\n  .col-xl-4 {\n    -ms-flex: 0 0 33.333333%;\n    flex: 0 0 33.333333%;\n    max-width: 33.333333%;\n  }\n  .col-xl-5 {\n    -ms-flex: 0 0 41.666667%;\n    flex: 0 0 41.666667%;\n    max-width: 41.666667%;\n  }\n  .col-xl-6 {\n    -ms-flex: 0 0 50%;\n    flex: 0 0 50%;\n    max-width: 50%;\n  }\n  .col-xl-7 {\n    -ms-flex: 0 0 58.333333%;\n    flex: 0 0 58.333333%;\n    max-width: 58.333333%;\n  }\n  .col-xl-8 {\n    -ms-flex: 0 0 66.666667%;\n    flex: 0 0 66.666667%;\n    max-width: 66.666667%;\n  }\n  .col-xl-9 {\n    -ms-flex: 0 0 75%;\n    flex: 0 0 75%;\n    max-width: 75%;\n  }\n  .col-xl-10 {\n    -ms-flex: 0 0 83.333333%;\n    flex: 0 0 83.333333%;\n    max-width: 83.333333%;\n  }\n  .col-xl-11 {\n    -ms-flex: 0 0 91.666667%;\n    flex: 0 0 91.666667%;\n    max-width: 91.666667%;\n  }\n  .col-xl-12 {\n    -ms-flex: 0 0 100%;\n    flex: 0 0 100%;\n    max-width: 100%;\n  }\n  .order-xl-first {\n    -ms-flex-order: -1;\n    order: -1;\n  }\n  .order-xl-last {\n    -ms-flex-order: 13;\n    order: 13;\n  }\n  .order-xl-0 {\n    -ms-flex-order: 0;\n    order: 0;\n  }\n  .order-xl-1 {\n    -ms-flex-order: 1;\n    order: 1;\n  }\n  .order-xl-2 {\n    -ms-flex-order: 2;\n    order: 2;\n  }\n  .order-xl-3 {\n    -ms-flex-order: 3;\n    order: 3;\n  }\n  .order-xl-4 {\n    -ms-flex-order: 4;\n    order: 4;\n  }\n  .order-xl-5 {\n    -ms-flex-order: 5;\n    order: 5;\n  }\n  .order-xl-6 {\n    -ms-flex-order: 6;\n    order: 6;\n  }\n  .order-xl-7 {\n    -ms-flex-order: 7;\n    order: 7;\n  }\n  .order-xl-8 {\n    -ms-flex-order: 8;\n    order: 8;\n  }\n  .order-xl-9 {\n    -ms-flex-order: 9;\n    order: 9;\n  }\n  .order-xl-10 {\n    -ms-flex-order: 10;\n    order: 10;\n  }\n  .order-xl-11 {\n    -ms-flex-order: 11;\n    order: 11;\n  }\n  .order-xl-12 {\n    -ms-flex-order: 12;\n    order: 12;\n  }\n  .offset-xl-0 {\n    margin-left: 0;\n  }\n  .offset-xl-1 {\n    margin-left: 8.333333%;\n  }\n  .offset-xl-2 {\n    margin-left: 16.666667%;\n  }\n  .offset-xl-3 {\n    margin-left: 25%;\n  }\n  .offset-xl-4 {\n    margin-left: 33.333333%;\n  }\n  .offset-xl-5 {\n    margin-left: 41.666667%;\n  }\n  .offset-xl-6 {\n    margin-left: 50%;\n  }\n  .offset-xl-7 {\n    margin-left: 58.333333%;\n  }\n  .offset-xl-8 {\n    margin-left: 66.666667%;\n  }\n  .offset-xl-9 {\n    margin-left: 75%;\n  }\n  .offset-xl-10 {\n    margin-left: 83.333333%;\n  }\n  .offset-xl-11 {\n    margin-left: 91.666667%;\n  }\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 1rem;\n  color: #212529;\n}\n\n.table th,\n.table td {\n  padding: 0.75rem;\n  vertical-align: top;\n  border-top: 1px solid #dee2e6;\n}\n\n.table thead th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dee2e6;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dee2e6;\n}\n\n.table-sm th,\n.table-sm td {\n  padding: 0.3rem;\n}\n\n.table-bordered {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered th,\n.table-bordered td {\n  border: 1px solid #dee2e6;\n}\n\n.table-bordered thead th,\n.table-bordered thead td {\n  border-bottom-width: 2px;\n}\n\n.table-borderless th,\n.table-borderless td,\n.table-borderless thead th,\n.table-borderless tbody + tbody {\n  border: 0;\n}\n\n.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.table-hover tbody tr:hover {\n  color: #212529;\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-primary,\n.table-primary > th,\n.table-primary > td {\n  background-color: #b8daff;\n}\n\n.table-primary th,\n.table-primary td,\n.table-primary thead th,\n.table-primary tbody + tbody {\n  border-color: #7abaff;\n}\n\n.table-hover .table-primary:hover {\n  background-color: #9fcdff;\n}\n\n.table-hover .table-primary:hover > td,\n.table-hover .table-primary:hover > th {\n  background-color: #9fcdff;\n}\n\n.table-secondary,\n.table-secondary > th,\n.table-secondary > td {\n  background-color: #d6d8db;\n}\n\n.table-secondary th,\n.table-secondary td,\n.table-secondary thead th,\n.table-secondary tbody + tbody {\n  border-color: #b3b7bb;\n}\n\n.table-hover .table-secondary:hover {\n  background-color: #c8cbcf;\n}\n\n.table-hover .table-secondary:hover > td,\n.table-hover .table-secondary:hover > th {\n  background-color: #c8cbcf;\n}\n\n.table-success,\n.table-success > th,\n.table-success > td {\n  background-color: #c3e6cb;\n}\n\n.table-success th,\n.table-success td,\n.table-success thead th,\n.table-success tbody + tbody {\n  border-color: #8fd19e;\n}\n\n.table-hover .table-success:hover {\n  background-color: #b1dfbb;\n}\n\n.table-hover .table-success:hover > td,\n.table-hover .table-success:hover > th {\n  background-color: #b1dfbb;\n}\n\n.table-info,\n.table-info > th,\n.table-info > td {\n  background-color: #bee5eb;\n}\n\n.table-info th,\n.table-info td,\n.table-info thead th,\n.table-info tbody + tbody {\n  border-color: #86cfda;\n}\n\n.table-hover .table-info:hover {\n  background-color: #abdde5;\n}\n\n.table-hover .table-info:hover > td,\n.table-hover .table-info:hover > th {\n  background-color: #abdde5;\n}\n\n.table-warning,\n.table-warning > th,\n.table-warning > td {\n  background-color: #ffeeba;\n}\n\n.table-warning th,\n.table-warning td,\n.table-warning thead th,\n.table-warning tbody + tbody {\n  border-color: #ffdf7e;\n}\n\n.table-hover .table-warning:hover {\n  background-color: #ffe8a1;\n}\n\n.table-hover .table-warning:hover > td,\n.table-hover .table-warning:hover > th {\n  background-color: #ffe8a1;\n}\n\n.table-danger,\n.table-danger > th,\n.table-danger > td {\n  background-color: #f5c6cb;\n}\n\n.table-danger th,\n.table-danger td,\n.table-danger thead th,\n.table-danger tbody + tbody {\n  border-color: #ed969e;\n}\n\n.table-hover .table-danger:hover {\n  background-color: #f1b0b7;\n}\n\n.table-hover .table-danger:hover > td,\n.table-hover .table-danger:hover > th {\n  background-color: #f1b0b7;\n}\n\n.table-light,\n.table-light > th,\n.table-light > td {\n  background-color: #fdfdfe;\n}\n\n.table-light th,\n.table-light td,\n.table-light thead th,\n.table-light tbody + tbody {\n  border-color: #fbfcfc;\n}\n\n.table-hover .table-light:hover {\n  background-color: #ececf6;\n}\n\n.table-hover .table-light:hover > td,\n.table-hover .table-light:hover > th {\n  background-color: #ececf6;\n}\n\n.table-dark,\n.table-dark > th,\n.table-dark > td {\n  background-color: #c6c8ca;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th,\n.table-dark tbody + tbody {\n  border-color: #95999c;\n}\n\n.table-hover .table-dark:hover {\n  background-color: #b9bbbe;\n}\n\n.table-hover .table-dark:hover > td,\n.table-hover .table-dark:hover > th {\n  background-color: #b9bbbe;\n}\n\n.table-active,\n.table-active > th,\n.table-active > td {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table-hover .table-active:hover > td,\n.table-hover .table-active:hover > th {\n  background-color: rgba(0, 0, 0, 0.075);\n}\n\n.table .thead-dark th {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #454d55;\n}\n\n.table .thead-light th {\n  color: #495057;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.table-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n\n.table-dark th,\n.table-dark td,\n.table-dark thead th {\n  border-color: #454d55;\n}\n\n.table-dark.table-bordered {\n  border: 0;\n}\n\n.table-dark.table-striped tbody tr:nth-of-type(odd) {\n  background-color: rgba(255, 255, 255, 0.05);\n}\n\n.table-dark.table-hover tbody tr:hover {\n  color: #fff;\n  background-color: rgba(255, 255, 255, 0.075);\n}\n\n@media (max-width: 575.98px) {\n  .table-responsive-sm {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-sm > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .table-responsive-md {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-md > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .table-responsive-lg {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-lg > .table-bordered {\n    border: 0;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .table-responsive-xl {\n    display: block;\n    width: 100%;\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  .table-responsive-xl > .table-bordered {\n    border: 0;\n  }\n}\n\n.table-responsive {\n  display: block;\n  width: 100%;\n  overflow-x: auto;\n  -webkit-overflow-scrolling: touch;\n}\n\n.table-responsive > .table-bordered {\n  border: 0;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .form-control {\n    transition: none;\n  }\n}\n\n.form-control::-ms-expand {\n  background-color: transparent;\n  border: 0;\n}\n\n.form-control:focus {\n  color: #495057;\n  background-color: #fff;\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::-moz-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::-ms-input-placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control::placeholder {\n  color: #6c757d;\n  opacity: 1;\n}\n\n.form-control:disabled, .form-control[readonly] {\n  background-color: #e9ecef;\n  opacity: 1;\n}\n\nselect.form-control:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.form-control-file,\n.form-control-range {\n  display: block;\n  width: 100%;\n}\n\n.col-form-label {\n  padding-top: calc(0.375rem + 1px);\n  padding-bottom: calc(0.375rem + 1px);\n  margin-bottom: 0;\n  font-size: inherit;\n  line-height: 1.5;\n}\n\n.col-form-label-lg {\n  padding-top: calc(0.5rem + 1px);\n  padding-bottom: calc(0.5rem + 1px);\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.col-form-label-sm {\n  padding-top: calc(0.25rem + 1px);\n  padding-bottom: calc(0.25rem + 1px);\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.form-control-plaintext {\n  display: block;\n  width: 100%;\n  padding-top: 0.375rem;\n  padding-bottom: 0.375rem;\n  margin-bottom: 0;\n  line-height: 1.5;\n  color: #212529;\n  background-color: transparent;\n  border: solid transparent;\n  border-width: 1px 0;\n}\n\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.form-control-sm {\n  height: calc(1.5em + 0.5rem + 2px);\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.form-control-lg {\n  height: calc(1.5em + 1rem + 2px);\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\nselect.form-control[size], select.form-control[multiple] {\n  height: auto;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 1rem;\n}\n\n.form-text {\n  display: block;\n  margin-top: 0.25rem;\n}\n\n.form-row {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  margin-right: -5px;\n  margin-left: -5px;\n}\n\n.form-row > .col,\n.form-row > [class*=\"col-\"] {\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\n.form-check {\n  position: relative;\n  display: block;\n  padding-left: 1.25rem;\n}\n\n.form-check-input {\n  position: absolute;\n  margin-top: 0.3rem;\n  margin-left: -1.25rem;\n}\n\n.form-check-input:disabled ~ .form-check-label {\n  color: #6c757d;\n}\n\n.form-check-label {\n  margin-bottom: 0;\n}\n\n.form-check-inline {\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding-left: 0;\n  margin-right: 0.75rem;\n}\n\n.form-check-inline .form-check-input {\n  position: static;\n  margin-top: 0;\n  margin-right: 0.3125rem;\n  margin-left: 0;\n}\n\n.valid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #28a745;\n}\n\n.valid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: .1rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  color: #fff;\n  background-color: rgba(40, 167, 69, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n  border-color: #28a745;\n  padding-right: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\");\n  background-repeat: no-repeat;\n  background-position: center right calc(0.375em + 0.1875rem);\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .form-control:valid ~ .valid-feedback,\n.was-validated .form-control:valid ~ .valid-tooltip, .form-control.is-valid ~ .valid-feedback,\n.form-control.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n  padding-right: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:valid, .custom-select.is-valid {\n  border-color: #28a745;\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:valid:focus, .custom-select.is-valid:focus {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-select:valid ~ .valid-feedback,\n.was-validated .custom-select:valid ~ .valid-tooltip, .custom-select.is-valid ~ .valid-feedback,\n.custom-select.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control-file:valid ~ .valid-feedback,\n.was-validated .form-control-file:valid ~ .valid-tooltip, .form-control-file.is-valid ~ .valid-feedback,\n.form-control-file.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n  color: #28a745;\n}\n\n.was-validated .form-check-input:valid ~ .valid-feedback,\n.was-validated .form-check-input:valid ~ .valid-tooltip, .form-check-input.is-valid ~ .valid-feedback,\n.form-check-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label, .custom-control-input.is-valid ~ .custom-control-label {\n  color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .custom-control-label::before, .custom-control-input.is-valid ~ .custom-control-label::before {\n  border-color: #28a745;\n}\n\n.was-validated .custom-control-input:valid ~ .valid-feedback,\n.was-validated .custom-control-input:valid ~ .valid-tooltip, .custom-control-input.is-valid ~ .valid-feedback,\n.custom-control-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before, .custom-control-input.is-valid:checked ~ .custom-control-label::before {\n  border-color: #34ce57;\n  background-color: #34ce57;\n}\n\n.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before, .custom-control-input.is-valid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .custom-file-label, .custom-file-input.is-valid ~ .custom-file-label {\n  border-color: #28a745;\n}\n\n.was-validated .custom-file-input:valid ~ .valid-feedback,\n.was-validated .custom-file-input:valid ~ .valid-tooltip, .custom-file-input.is-valid ~ .valid-feedback,\n.custom-file-input.is-valid ~ .valid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:valid:focus ~ .custom-file-label, .custom-file-input.is-valid:focus ~ .custom-file-label {\n  border-color: #28a745;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);\n}\n\n.invalid-feedback {\n  display: none;\n  width: 100%;\n  margin-top: 0.25rem;\n  font-size: 80%;\n  color: #dc3545;\n}\n\n.invalid-tooltip {\n  position: absolute;\n  top: 100%;\n  z-index: 5;\n  display: none;\n  max-width: 100%;\n  padding: 0.25rem 0.5rem;\n  margin-top: .1rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  color: #fff;\n  background-color: rgba(220, 53, 69, 0.9);\n  border-radius: 0.25rem;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n  border-color: #dc3545;\n  padding-right: calc(1.5em + 0.75rem);\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\");\n  background-repeat: no-repeat;\n  background-position: center right calc(0.375em + 0.1875rem);\n  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .form-control:invalid ~ .invalid-feedback,\n.was-validated .form-control:invalid ~ .invalid-tooltip, .form-control.is-invalid ~ .invalid-feedback,\n.form-control.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n  padding-right: calc(1.5em + 0.75rem);\n  background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .custom-select:invalid, .custom-select.is-invalid {\n  border-color: #dc3545;\n  padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px, url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E\") #fff no-repeat center right 1.75rem/calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n\n.was-validated .custom-select:invalid:focus, .custom-select.is-invalid:focus {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-select:invalid ~ .invalid-feedback,\n.was-validated .custom-select:invalid ~ .invalid-tooltip, .custom-select.is-invalid ~ .invalid-feedback,\n.custom-select.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-control-file:invalid ~ .invalid-feedback,\n.was-validated .form-control-file:invalid ~ .invalid-tooltip, .form-control-file.is-invalid ~ .invalid-feedback,\n.form-control-file.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n  color: #dc3545;\n}\n\n.was-validated .form-check-input:invalid ~ .invalid-feedback,\n.was-validated .form-check-input:invalid ~ .invalid-tooltip, .form-check-input.is-invalid ~ .invalid-feedback,\n.form-check-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label, .custom-control-input.is-invalid ~ .custom-control-label {\n  color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .custom-control-label::before, .custom-control-input.is-invalid ~ .custom-control-label::before {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-control-input:invalid ~ .invalid-feedback,\n.was-validated .custom-control-input:invalid ~ .invalid-tooltip, .custom-control-input.is-invalid ~ .invalid-feedback,\n.custom-control-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before, .custom-control-input.is-invalid:checked ~ .custom-control-label::before {\n  border-color: #e4606d;\n  background-color: #e4606d;\n}\n\n.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before, .custom-control-input.is-invalid:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before, .custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .custom-file-label, .custom-file-input.is-invalid ~ .custom-file-label {\n  border-color: #dc3545;\n}\n\n.was-validated .custom-file-input:invalid ~ .invalid-feedback,\n.was-validated .custom-file-input:invalid ~ .invalid-tooltip, .custom-file-input.is-invalid ~ .invalid-feedback,\n.custom-file-input.is-invalid ~ .invalid-tooltip {\n  display: block;\n}\n\n.was-validated .custom-file-input:invalid:focus ~ .custom-file-label, .custom-file-input.is-invalid:focus ~ .custom-file-label {\n  border-color: #dc3545;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);\n}\n\n.form-inline {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-flow: row wrap;\n  flex-flow: row wrap;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.form-inline .form-check {\n  width: 100%;\n}\n\n@media (min-width: 576px) {\n  .form-inline label {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-group {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex: 0 0 auto;\n    flex: 0 0 auto;\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n    -ms-flex-align: center;\n    align-items: center;\n    margin-bottom: 0;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n    width: auto;\n    vertical-align: middle;\n  }\n  .form-inline .form-control-plaintext {\n    display: inline-block;\n  }\n  .form-inline .input-group,\n  .form-inline .custom-select {\n    width: auto;\n  }\n  .form-inline .form-check {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n    width: auto;\n    padding-left: 0;\n  }\n  .form-inline .form-check-input {\n    position: relative;\n    -ms-flex-negative: 0;\n    flex-shrink: 0;\n    margin-top: 0;\n    margin-right: 0.25rem;\n    margin-left: 0;\n  }\n  .form-inline .custom-control {\n    -ms-flex-align: center;\n    align-items: center;\n    -ms-flex-pack: center;\n    justify-content: center;\n  }\n  .form-inline .custom-control-label {\n    margin-bottom: 0;\n  }\n}\n\n.btn {\n  display: inline-block;\n  font-weight: 400;\n  color: #212529;\n  text-align: center;\n  vertical-align: middle;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n  background-color: transparent;\n  border: 1px solid transparent;\n  padding: 0.375rem 0.75rem;\n  font-size: 1rem;\n  line-height: 1.5;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .btn {\n    transition: none;\n  }\n}\n\n.btn:hover {\n  color: #212529;\n  text-decoration: none;\n}\n\n.btn:focus, .btn.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.btn.disabled, .btn:disabled {\n  opacity: 0.65;\n}\n\na.btn.disabled,\nfieldset:disabled a.btn {\n  pointer-events: none;\n}\n\n.btn-primary {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:hover {\n  color: #fff;\n  background-color: #0069d9;\n  border-color: #0062cc;\n}\n\n.btn-primary:focus, .btn-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-primary.disabled, .btn-primary:disabled {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active,\n.show > .btn-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #0062cc;\n  border-color: #005cbf;\n}\n\n.btn-primary:not(:disabled):not(.disabled):active:focus, .btn-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(38, 143, 255, 0.5);\n}\n\n.btn-secondary {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-secondary:hover {\n  color: #fff;\n  background-color: #5a6268;\n  border-color: #545b62;\n}\n\n.btn-secondary:focus, .btn-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-secondary.disabled, .btn-secondary:disabled {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active, .btn-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #545b62;\n  border-color: #4e555b;\n}\n\n.btn-secondary:not(:disabled):not(.disabled):active:focus, .btn-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);\n}\n\n.btn-success {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:hover {\n  color: #fff;\n  background-color: #218838;\n  border-color: #1e7e34;\n}\n\n.btn-success:focus, .btn-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-success.disabled, .btn-success:disabled {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-success:not(:disabled):not(.disabled):active, .btn-success:not(:disabled):not(.disabled).active,\n.show > .btn-success.dropdown-toggle {\n  color: #fff;\n  background-color: #1e7e34;\n  border-color: #1c7430;\n}\n\n.btn-success:not(:disabled):not(.disabled):active:focus, .btn-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);\n}\n\n.btn-info {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:hover {\n  color: #fff;\n  background-color: #138496;\n  border-color: #117a8b;\n}\n\n.btn-info:focus, .btn-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-info.disabled, .btn-info:disabled {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-info:not(:disabled):not(.disabled):active, .btn-info:not(:disabled):not(.disabled).active,\n.show > .btn-info.dropdown-toggle {\n  color: #fff;\n  background-color: #117a8b;\n  border-color: #10707f;\n}\n\n.btn-info:not(:disabled):not(.disabled):active:focus, .btn-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);\n}\n\n.btn-warning {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:hover {\n  color: #212529;\n  background-color: #e0a800;\n  border-color: #d39e00;\n}\n\n.btn-warning:focus, .btn-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-warning.disabled, .btn-warning:disabled {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active, .btn-warning:not(:disabled):not(.disabled).active,\n.show > .btn-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #d39e00;\n  border-color: #c69500;\n}\n\n.btn-warning:not(:disabled):not(.disabled):active:focus, .btn-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);\n}\n\n.btn-danger {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:hover {\n  color: #fff;\n  background-color: #c82333;\n  border-color: #bd2130;\n}\n\n.btn-danger:focus, .btn-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-danger.disabled, .btn-danger:disabled {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active, .btn-danger:not(:disabled):not(.disabled).active,\n.show > .btn-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #bd2130;\n  border-color: #b21f2d;\n}\n\n.btn-danger:not(:disabled):not(.disabled):active:focus, .btn-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);\n}\n\n.btn-light {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:hover {\n  color: #212529;\n  background-color: #e2e6ea;\n  border-color: #dae0e5;\n}\n\n.btn-light:focus, .btn-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-light.disabled, .btn-light:disabled {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-light:not(:disabled):not(.disabled):active, .btn-light:not(:disabled):not(.disabled).active,\n.show > .btn-light.dropdown-toggle {\n  color: #212529;\n  background-color: #dae0e5;\n  border-color: #d3d9df;\n}\n\n.btn-light:not(:disabled):not(.disabled):active:focus, .btn-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);\n}\n\n.btn-dark {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:hover {\n  color: #fff;\n  background-color: #23272b;\n  border-color: #1d2124;\n}\n\n.btn-dark:focus, .btn-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-dark.disabled, .btn-dark:disabled {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active, .btn-dark:not(:disabled):not(.disabled).active,\n.show > .btn-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #1d2124;\n  border-color: #171a1d;\n}\n\n.btn-dark:not(:disabled):not(.disabled):active:focus, .btn-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);\n}\n\n.btn-outline-primary {\n  color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:hover {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:focus, .btn-outline-primary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-primary.disabled, .btn-outline-primary:disabled {\n  color: #007bff;\n  background-color: transparent;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active, .btn-outline-primary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-primary.dropdown-toggle {\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.btn-outline-primary:not(:disabled):not(.disabled):active:focus, .btn-outline-primary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-primary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.btn-outline-secondary {\n  color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:hover {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:focus, .btn-outline-secondary.focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-secondary.disabled, .btn-outline-secondary:disabled {\n  color: #6c757d;\n  background-color: transparent;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active, .btn-outline-secondary:not(:disabled):not(.disabled).active,\n.show > .btn-outline-secondary.dropdown-toggle {\n  color: #fff;\n  background-color: #6c757d;\n  border-color: #6c757d;\n}\n\n.btn-outline-secondary:not(:disabled):not(.disabled):active:focus, .btn-outline-secondary:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-secondary.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.btn-outline-success {\n  color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:hover {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:focus, .btn-outline-success.focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-success.disabled, .btn-outline-success:disabled {\n  color: #28a745;\n  background-color: transparent;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active, .btn-outline-success:not(:disabled):not(.disabled).active,\n.show > .btn-outline-success.dropdown-toggle {\n  color: #fff;\n  background-color: #28a745;\n  border-color: #28a745;\n}\n\n.btn-outline-success:not(:disabled):not(.disabled):active:focus, .btn-outline-success:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-success.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.btn-outline-info {\n  color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:hover {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:focus, .btn-outline-info.focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-info.disabled, .btn-outline-info:disabled {\n  color: #17a2b8;\n  background-color: transparent;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active, .btn-outline-info:not(:disabled):not(.disabled).active,\n.show > .btn-outline-info.dropdown-toggle {\n  color: #fff;\n  background-color: #17a2b8;\n  border-color: #17a2b8;\n}\n\n.btn-outline-info:not(:disabled):not(.disabled):active:focus, .btn-outline-info:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-info.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.btn-outline-warning {\n  color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:hover {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:focus, .btn-outline-warning.focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-warning.disabled, .btn-outline-warning:disabled {\n  color: #ffc107;\n  background-color: transparent;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active, .btn-outline-warning:not(:disabled):not(.disabled).active,\n.show > .btn-outline-warning.dropdown-toggle {\n  color: #212529;\n  background-color: #ffc107;\n  border-color: #ffc107;\n}\n\n.btn-outline-warning:not(:disabled):not(.disabled):active:focus, .btn-outline-warning:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-warning.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.btn-outline-danger {\n  color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:hover {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:focus, .btn-outline-danger.focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-danger.disabled, .btn-outline-danger:disabled {\n  color: #dc3545;\n  background-color: transparent;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active, .btn-outline-danger:not(:disabled):not(.disabled).active,\n.show > .btn-outline-danger.dropdown-toggle {\n  color: #fff;\n  background-color: #dc3545;\n  border-color: #dc3545;\n}\n\n.btn-outline-danger:not(:disabled):not(.disabled):active:focus, .btn-outline-danger:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-danger.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.btn-outline-light {\n  color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:hover {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:focus, .btn-outline-light.focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-light.disabled, .btn-outline-light:disabled {\n  color: #f8f9fa;\n  background-color: transparent;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active, .btn-outline-light:not(:disabled):not(.disabled).active,\n.show > .btn-outline-light.dropdown-toggle {\n  color: #212529;\n  background-color: #f8f9fa;\n  border-color: #f8f9fa;\n}\n\n.btn-outline-light:not(:disabled):not(.disabled):active:focus, .btn-outline-light:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-light.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.btn-outline-dark {\n  color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:hover {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:focus, .btn-outline-dark.focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-outline-dark.disabled, .btn-outline-dark:disabled {\n  color: #343a40;\n  background-color: transparent;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active, .btn-outline-dark:not(:disabled):not(.disabled).active,\n.show > .btn-outline-dark.dropdown-toggle {\n  color: #fff;\n  background-color: #343a40;\n  border-color: #343a40;\n}\n\n.btn-outline-dark:not(:disabled):not(.disabled):active:focus, .btn-outline-dark:not(:disabled):not(.disabled).active:focus,\n.show > .btn-outline-dark.dropdown-toggle:focus {\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.btn-link {\n  font-weight: 400;\n  color: #007bff;\n  text-decoration: none;\n}\n\n.btn-link:hover {\n  color: #0056b3;\n  text-decoration: underline;\n}\n\n.btn-link:focus, .btn-link.focus {\n  text-decoration: underline;\n  box-shadow: none;\n}\n\n.btn-link:disabled, .btn-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n}\n\n.btn-lg, .btn-group-lg > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.btn-sm, .btn-group-sm > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n.btn-block + .btn-block {\n  margin-top: 0.5rem;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  transition: opacity 0.15s linear;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .fade {\n    transition: none;\n  }\n}\n\n.fade:not(.show) {\n  opacity: 0;\n}\n\n.collapse:not(.show) {\n  display: none;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  transition: height 0.35s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .collapsing {\n    transition: none;\n  }\n}\n\n.dropup,\n.dropright,\n.dropdown,\n.dropleft {\n  position: relative;\n}\n\n.dropdown-toggle {\n  white-space: nowrap;\n}\n\n.dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0;\n  border-left: 0.3em solid transparent;\n}\n\n.dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 10rem;\n  padding: 0.5rem 0;\n  margin: 0.125rem 0 0;\n  font-size: 1rem;\n  color: #212529;\n  text-align: left;\n  list-style: none;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 0.25rem;\n}\n\n.dropdown-menu-left {\n  right: auto;\n  left: 0;\n}\n\n.dropdown-menu-right {\n  right: 0;\n  left: auto;\n}\n\n@media (min-width: 576px) {\n  .dropdown-menu-sm-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-sm-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 768px) {\n  .dropdown-menu-md-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-md-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 992px) {\n  .dropdown-menu-lg-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-lg-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n@media (min-width: 1200px) {\n  .dropdown-menu-xl-left {\n    right: auto;\n    left: 0;\n  }\n  .dropdown-menu-xl-right {\n    right: 0;\n    left: auto;\n  }\n}\n\n.dropup .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-top: 0;\n  margin-bottom: 0.125rem;\n}\n\n.dropup .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0;\n  border-right: 0.3em solid transparent;\n  border-bottom: 0.3em solid;\n  border-left: 0.3em solid transparent;\n}\n\n.dropup .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-menu {\n  top: 0;\n  right: auto;\n  left: 100%;\n  margin-top: 0;\n  margin-left: 0.125rem;\n}\n\n.dropright .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0;\n  border-bottom: 0.3em solid transparent;\n  border-left: 0.3em solid;\n}\n\n.dropright .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropright .dropdown-toggle::after {\n  vertical-align: 0;\n}\n\n.dropleft .dropdown-menu {\n  top: 0;\n  right: 100%;\n  left: auto;\n  margin-top: 0;\n  margin-right: 0.125rem;\n}\n\n.dropleft .dropdown-toggle::after {\n  display: inline-block;\n  margin-left: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n}\n\n.dropleft .dropdown-toggle::after {\n  display: none;\n}\n\n.dropleft .dropdown-toggle::before {\n  display: inline-block;\n  margin-right: 0.255em;\n  vertical-align: 0.255em;\n  content: \"\";\n  border-top: 0.3em solid transparent;\n  border-right: 0.3em solid;\n  border-bottom: 0.3em solid transparent;\n}\n\n.dropleft .dropdown-toggle:empty::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle::before {\n  vertical-align: 0;\n}\n\n.dropdown-menu[x-placement^=\"top\"], .dropdown-menu[x-placement^=\"right\"], .dropdown-menu[x-placement^=\"bottom\"], .dropdown-menu[x-placement^=\"left\"] {\n  right: auto;\n  bottom: auto;\n}\n\n.dropdown-divider {\n  height: 0;\n  margin: 0.5rem 0;\n  overflow: hidden;\n  border-top: 1px solid #e9ecef;\n}\n\n.dropdown-item {\n  display: block;\n  width: 100%;\n  padding: 0.25rem 1.5rem;\n  clear: both;\n  font-weight: 400;\n  color: #212529;\n  text-align: inherit;\n  white-space: nowrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.dropdown-item:hover, .dropdown-item:focus {\n  color: #16181b;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.dropdown-item.active, .dropdown-item:active {\n  color: #fff;\n  text-decoration: none;\n  background-color: #007bff;\n}\n\n.dropdown-item.disabled, .dropdown-item:disabled {\n  color: #6c757d;\n  pointer-events: none;\n  background-color: transparent;\n}\n\n.dropdown-menu.show {\n  display: block;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 0.5rem 1.5rem;\n  margin-bottom: 0;\n  font-size: 0.875rem;\n  color: #6c757d;\n  white-space: nowrap;\n}\n\n.dropdown-item-text {\n  display: block;\n  padding: 0.25rem 1.5rem;\n  color: #212529;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover {\n  z-index: 1;\n}\n\n.btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n  z-index: 1;\n}\n\n.btn-toolbar {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n}\n\n.btn-toolbar .input-group {\n  width: auto;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) {\n  margin-left: -1px;\n}\n\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn-group:not(:last-child) > .btn {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:not(:first-child),\n.btn-group > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n  padding-right: 0.5625rem;\n  padding-left: 0.5625rem;\n}\n\n.dropdown-toggle-split::after,\n.dropup .dropdown-toggle-split::after,\n.dropright .dropdown-toggle-split::after {\n  margin-left: 0;\n}\n\n.dropleft .dropdown-toggle-split::before {\n  margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n  padding-right: 0.375rem;\n  padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n  padding-right: 0.75rem;\n  padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-align: start;\n  align-items: flex-start;\n  -ms-flex-pack: center;\n  justify-content: center;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  width: 100%;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n  margin-top: -1px;\n}\n\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.btn-group-toggle > .btn,\n.btn-group-toggle > .btn-group > .btn {\n  margin-bottom: 0;\n}\n\n.btn-group-toggle > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn input[type=\"checkbox\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"radio\"],\n.btn-group-toggle > .btn-group > .btn input[type=\"checkbox\"] {\n  position: absolute;\n  clip: rect(0, 0, 0, 0);\n  pointer-events: none;\n}\n\n.input-group {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: stretch;\n  align-items: stretch;\n  width: 100%;\n}\n\n.input-group > .form-control,\n.input-group > .form-control-plaintext,\n.input-group > .custom-select,\n.input-group > .custom-file {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  width: 1%;\n  margin-bottom: 0;\n}\n\n.input-group > .form-control + .form-control,\n.input-group > .form-control + .custom-select,\n.input-group > .form-control + .custom-file,\n.input-group > .form-control-plaintext + .form-control,\n.input-group > .form-control-plaintext + .custom-select,\n.input-group > .form-control-plaintext + .custom-file,\n.input-group > .custom-select + .form-control,\n.input-group > .custom-select + .custom-select,\n.input-group > .custom-select + .custom-file,\n.input-group > .custom-file + .form-control,\n.input-group > .custom-file + .custom-select,\n.input-group > .custom-file + .custom-file {\n  margin-left: -1px;\n}\n\n.input-group > .form-control:focus,\n.input-group > .custom-select:focus,\n.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {\n  z-index: 3;\n}\n\n.input-group > .custom-file .custom-file-input:focus {\n  z-index: 4;\n}\n\n.input-group > .form-control:not(:last-child),\n.input-group > .custom-select:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .form-control:not(:first-child),\n.input-group > .custom-select:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group > .custom-file {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.input-group > .custom-file:not(:last-child) .custom-file-label,\n.input-group > .custom-file:not(:last-child) .custom-file-label::after {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .custom-file:not(:first-child) .custom-file-label {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.input-group-prepend,\n.input-group-append {\n  display: -ms-flexbox;\n  display: flex;\n}\n\n.input-group-prepend .btn,\n.input-group-append .btn {\n  position: relative;\n  z-index: 2;\n}\n\n.input-group-prepend .btn:focus,\n.input-group-append .btn:focus {\n  z-index: 3;\n}\n\n.input-group-prepend .btn + .btn,\n.input-group-prepend .btn + .input-group-text,\n.input-group-prepend .input-group-text + .input-group-text,\n.input-group-prepend .input-group-text + .btn,\n.input-group-append .btn + .btn,\n.input-group-append .btn + .input-group-text,\n.input-group-append .input-group-text + .input-group-text,\n.input-group-append .input-group-text + .btn {\n  margin-left: -1px;\n}\n\n.input-group-prepend {\n  margin-right: -1px;\n}\n\n.input-group-append {\n  margin-left: -1px;\n}\n\n.input-group-text {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding: 0.375rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #e9ecef;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.input-group-text input[type=\"radio\"],\n.input-group-text input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group-lg > .form-control:not(textarea),\n.input-group-lg > .custom-select {\n  height: calc(1.5em + 1rem + 2px);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .custom-select,\n.input-group-lg > .input-group-prepend > .input-group-text,\n.input-group-lg > .input-group-append > .input-group-text,\n.input-group-lg > .input-group-prepend > .btn,\n.input-group-lg > .input-group-append > .btn {\n  padding: 0.5rem 1rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n  border-radius: 0.3rem;\n}\n\n.input-group-sm > .form-control:not(textarea),\n.input-group-sm > .custom-select {\n  height: calc(1.5em + 0.5rem + 2px);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .custom-select,\n.input-group-sm > .input-group-prepend > .input-group-text,\n.input-group-sm > .input-group-append > .input-group-text,\n.input-group-sm > .input-group-prepend > .btn,\n.input-group-sm > .input-group-append > .btn {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n  border-radius: 0.2rem;\n}\n\n.input-group-lg > .custom-select,\n.input-group-sm > .custom-select {\n  padding-right: 1.75rem;\n}\n\n.input-group > .input-group-prepend > .btn,\n.input-group > .input-group-prepend > .input-group-text,\n.input-group > .input-group-append:not(:last-child) > .btn,\n.input-group > .input-group-append:not(:last-child) > .input-group-text,\n.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group > .input-group-append > .btn,\n.input-group > .input-group-append > .input-group-text,\n.input-group > .input-group-prepend:not(:first-child) > .btn,\n.input-group > .input-group-prepend:not(:first-child) > .input-group-text,\n.input-group > .input-group-prepend:first-child > .btn:not(:first-child),\n.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {\n  border-top-left-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.custom-control {\n  position: relative;\n  display: block;\n  min-height: 1.5rem;\n  padding-left: 1.5rem;\n}\n\n.custom-control-inline {\n  display: -ms-inline-flexbox;\n  display: inline-flex;\n  margin-right: 1rem;\n}\n\n.custom-control-input {\n  position: absolute;\n  z-index: -1;\n  opacity: 0;\n}\n\n.custom-control-input:checked ~ .custom-control-label::before {\n  color: #fff;\n  border-color: #007bff;\n  background-color: #007bff;\n}\n\n.custom-control-input:focus ~ .custom-control-label::before {\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {\n  border-color: #80bdff;\n}\n\n.custom-control-input:not(:disabled):active ~ .custom-control-label::before {\n  color: #fff;\n  background-color: #b3d7ff;\n  border-color: #b3d7ff;\n}\n\n.custom-control-input:disabled ~ .custom-control-label {\n  color: #6c757d;\n}\n\n.custom-control-input:disabled ~ .custom-control-label::before {\n  background-color: #e9ecef;\n}\n\n.custom-control-label {\n  position: relative;\n  margin-bottom: 0;\n  vertical-align: top;\n}\n\n.custom-control-label::before {\n  position: absolute;\n  top: 0.25rem;\n  left: -1.5rem;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  pointer-events: none;\n  content: \"\";\n  background-color: #fff;\n  border: #adb5bd solid 1px;\n}\n\n.custom-control-label::after {\n  position: absolute;\n  top: 0.25rem;\n  left: -1.5rem;\n  display: block;\n  width: 1rem;\n  height: 1rem;\n  content: \"\";\n  background: no-repeat 50% / 50% 50%;\n}\n\n.custom-checkbox .custom-control-label::before {\n  border-radius: 0.25rem;\n}\n\n.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {\n  border-color: #007bff;\n  background-color: #007bff;\n}\n\n.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e\");\n}\n\n.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-radio .custom-control-label::before {\n  border-radius: 50%;\n}\n\n.custom-radio .custom-control-input:checked ~ .custom-control-label::after {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e\");\n}\n\n.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-switch {\n  padding-left: 2.25rem;\n}\n\n.custom-switch .custom-control-label::before {\n  left: -2.25rem;\n  width: 1.75rem;\n  pointer-events: all;\n  border-radius: 0.5rem;\n}\n\n.custom-switch .custom-control-label::after {\n  top: calc(0.25rem + 2px);\n  left: calc(-2.25rem + 2px);\n  width: calc(1rem - 4px);\n  height: calc(1rem - 4px);\n  background-color: #adb5bd;\n  border-radius: 0.5rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-switch .custom-control-label::after {\n    transition: none;\n  }\n}\n\n.custom-switch .custom-control-input:checked ~ .custom-control-label::after {\n  background-color: #fff;\n  -webkit-transform: translateX(0.75rem);\n  transform: translateX(0.75rem);\n}\n\n.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {\n  background-color: rgba(0, 123, 255, 0.5);\n}\n\n.custom-select {\n  display: inline-block;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 1.75rem 0.375rem 0.75rem;\n  font-size: 1rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  vertical-align: middle;\n  background: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e\") no-repeat right 0.75rem center/8px 10px;\n  background-color: #fff;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n.custom-select:focus {\n  border-color: #80bdff;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-select:focus::-ms-value {\n  color: #495057;\n  background-color: #fff;\n}\n\n.custom-select[multiple], .custom-select[size]:not([size=\"1\"]) {\n  height: auto;\n  padding-right: 0.75rem;\n  background-image: none;\n}\n\n.custom-select:disabled {\n  color: #6c757d;\n  background-color: #e9ecef;\n}\n\n.custom-select::-ms-expand {\n  display: none;\n}\n\n.custom-select-sm {\n  height: calc(1.5em + 0.5rem + 2px);\n  padding-top: 0.25rem;\n  padding-bottom: 0.25rem;\n  padding-left: 0.5rem;\n  font-size: 0.875rem;\n}\n\n.custom-select-lg {\n  height: calc(1.5em + 1rem + 2px);\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n  padding-left: 1rem;\n  font-size: 1.25rem;\n}\n\n.custom-file {\n  position: relative;\n  display: inline-block;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  margin-bottom: 0;\n}\n\n.custom-file-input {\n  position: relative;\n  z-index: 2;\n  width: 100%;\n  height: calc(1.5em + 0.75rem + 2px);\n  margin: 0;\n  opacity: 0;\n}\n\n.custom-file-input:focus ~ .custom-file-label {\n  border-color: #80bdff;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-file-input:disabled ~ .custom-file-label {\n  background-color: #e9ecef;\n}\n\n.custom-file-input:lang(en) ~ .custom-file-label::after {\n  content: \"Browse\";\n}\n\n.custom-file-input ~ .custom-file-label[data-browse]::after {\n  content: attr(data-browse);\n}\n\n.custom-file-label {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1;\n  height: calc(1.5em + 0.75rem + 2px);\n  padding: 0.375rem 0.75rem;\n  font-weight: 400;\n  line-height: 1.5;\n  color: #495057;\n  background-color: #fff;\n  border: 1px solid #ced4da;\n  border-radius: 0.25rem;\n}\n\n.custom-file-label::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 3;\n  display: block;\n  height: calc(1.5em + 0.75rem);\n  padding: 0.375rem 0.75rem;\n  line-height: 1.5;\n  color: #495057;\n  content: \"Browse\";\n  background-color: #e9ecef;\n  border-left: inherit;\n  border-radius: 0 0.25rem 0.25rem 0;\n}\n\n.custom-range {\n  width: 100%;\n  height: calc(1rem + 0.4rem);\n  padding: 0;\n  background-color: transparent;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n.custom-range:focus {\n  outline: none;\n}\n\n.custom-range:focus::-webkit-slider-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-moz-range-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range:focus::-ms-thumb {\n  box-shadow: 0 0 0 1px #fff, 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.custom-range::-moz-focus-outer {\n  border: 0;\n}\n\n.custom-range::-webkit-slider-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: -0.25rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -webkit-appearance: none;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-webkit-slider-thumb {\n    transition: none;\n  }\n}\n\n.custom-range::-webkit-slider-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-webkit-slider-runnable-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n\n.custom-range::-moz-range-thumb {\n  width: 1rem;\n  height: 1rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  -moz-appearance: none;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-moz-range-thumb {\n    transition: none;\n  }\n}\n\n.custom-range::-moz-range-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-moz-range-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: #dee2e6;\n  border-color: transparent;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-thumb {\n  width: 1rem;\n  height: 1rem;\n  margin-top: 0;\n  margin-right: 0.2rem;\n  margin-left: 0.2rem;\n  background-color: #007bff;\n  border: 0;\n  border-radius: 1rem;\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n  appearance: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-range::-ms-thumb {\n    transition: none;\n  }\n}\n\n.custom-range::-ms-thumb:active {\n  background-color: #b3d7ff;\n}\n\n.custom-range::-ms-track {\n  width: 100%;\n  height: 0.5rem;\n  color: transparent;\n  cursor: pointer;\n  background-color: transparent;\n  border-color: transparent;\n  border-width: 0.5rem;\n}\n\n.custom-range::-ms-fill-lower {\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n\n.custom-range::-ms-fill-upper {\n  margin-right: 15px;\n  background-color: #dee2e6;\n  border-radius: 1rem;\n}\n\n.custom-range:disabled::-webkit-slider-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-range:disabled::-webkit-slider-runnable-track {\n  cursor: default;\n}\n\n.custom-range:disabled::-moz-range-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-range:disabled::-moz-range-track {\n  cursor: default;\n}\n\n.custom-range:disabled::-ms-thumb {\n  background-color: #adb5bd;\n}\n\n.custom-control-label::before,\n.custom-file-label,\n.custom-select {\n  transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .custom-control-label::before,\n  .custom-file-label,\n  .custom-select {\n    transition: none;\n  }\n}\n\n.nav {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav-link {\n  display: block;\n  padding: 0.5rem 1rem;\n}\n\n.nav-link:hover, .nav-link:focus {\n  text-decoration: none;\n}\n\n.nav-link.disabled {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: default;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dee2e6;\n}\n\n.nav-tabs .nav-item {\n  margin-bottom: -1px;\n}\n\n.nav-tabs .nav-link {\n  border: 1px solid transparent;\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n  border-color: #e9ecef #e9ecef #dee2e6;\n}\n\n.nav-tabs .nav-link.disabled {\n  color: #6c757d;\n  background-color: transparent;\n  border-color: transparent;\n}\n\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n  color: #495057;\n  background-color: #fff;\n  border-color: #dee2e6 #dee2e6 #fff;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.nav-pills .nav-link {\n  border-radius: 0.25rem;\n}\n\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n  color: #fff;\n  background-color: #007bff;\n}\n\n.nav-fill .nav-item {\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  text-align: center;\n}\n\n.nav-justified .nav-item {\n  -ms-flex-preferred-size: 0;\n  flex-basis: 0;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  text-align: center;\n}\n\n.tab-content > .tab-pane {\n  display: none;\n}\n\n.tab-content > .active {\n  display: block;\n}\n\n.navbar {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n  padding: 0.5rem 1rem;\n}\n\n.navbar > .container,\n.navbar > .container-fluid {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n}\n\n.navbar-brand {\n  display: inline-block;\n  padding-top: 0.3125rem;\n  padding-bottom: 0.3125rem;\n  margin-right: 1rem;\n  font-size: 1.25rem;\n  line-height: inherit;\n  white-space: nowrap;\n}\n\n.navbar-brand:hover, .navbar-brand:focus {\n  text-decoration: none;\n}\n\n.navbar-nav {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.navbar-nav .nav-link {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-nav .dropdown-menu {\n  position: static;\n  float: none;\n}\n\n.navbar-text {\n  display: inline-block;\n  padding-top: 0.5rem;\n  padding-bottom: 0.5rem;\n}\n\n.navbar-collapse {\n  -ms-flex-preferred-size: 100%;\n  flex-basis: 100%;\n  -ms-flex-positive: 1;\n  flex-grow: 1;\n  -ms-flex-align: center;\n  align-items: center;\n}\n\n.navbar-toggler {\n  padding: 0.25rem 0.75rem;\n  font-size: 1.25rem;\n  line-height: 1;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.navbar-toggler:hover, .navbar-toggler:focus {\n  text-decoration: none;\n}\n\n.navbar-toggler-icon {\n  display: inline-block;\n  width: 1.5em;\n  height: 1.5em;\n  vertical-align: middle;\n  content: \"\";\n  background: no-repeat center center;\n  background-size: 100% 100%;\n}\n\n@media (max-width: 575.98px) {\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 576px) {\n  .navbar-expand-sm {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-sm .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-sm .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-sm .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-sm > .container,\n  .navbar-expand-sm > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-sm .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-sm .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 767.98px) {\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-expand-md {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-md .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-md .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-md .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-md > .container,\n  .navbar-expand-md > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-md .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-md .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 991.98px) {\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .navbar-expand-lg {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-lg .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-lg .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-lg .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-lg > .container,\n  .navbar-expand-lg > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-lg .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-lg .navbar-toggler {\n    display: none;\n  }\n}\n\n@media (max-width: 1199.98px) {\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    padding-right: 0;\n    padding-left: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .navbar-expand-xl {\n    -ms-flex-flow: row nowrap;\n    flex-flow: row nowrap;\n    -ms-flex-pack: start;\n    justify-content: flex-start;\n  }\n  .navbar-expand-xl .navbar-nav {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .navbar-expand-xl .navbar-nav .dropdown-menu {\n    position: absolute;\n  }\n  .navbar-expand-xl .navbar-nav .nav-link {\n    padding-right: 0.5rem;\n    padding-left: 0.5rem;\n  }\n  .navbar-expand-xl > .container,\n  .navbar-expand-xl > .container-fluid {\n    -ms-flex-wrap: nowrap;\n    flex-wrap: nowrap;\n  }\n  .navbar-expand-xl .navbar-collapse {\n    display: -ms-flexbox !important;\n    display: flex !important;\n    -ms-flex-preferred-size: auto;\n    flex-basis: auto;\n  }\n  .navbar-expand-xl .navbar-toggler {\n    display: none;\n  }\n}\n\n.navbar-expand {\n  -ms-flex-flow: row nowrap;\n  flex-flow: row nowrap;\n  -ms-flex-pack: start;\n  justify-content: flex-start;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.navbar-expand .navbar-nav {\n  -ms-flex-direction: row;\n  flex-direction: row;\n}\n\n.navbar-expand .navbar-nav .dropdown-menu {\n  position: absolute;\n}\n\n.navbar-expand .navbar-nav .nav-link {\n  padding-right: 0.5rem;\n  padding-left: 0.5rem;\n}\n\n.navbar-expand > .container,\n.navbar-expand > .container-fluid {\n  -ms-flex-wrap: nowrap;\n  flex-wrap: nowrap;\n}\n\n.navbar-expand .navbar-collapse {\n  display: -ms-flexbox !important;\n  display: flex !important;\n  -ms-flex-preferred-size: auto;\n  flex-basis: auto;\n}\n\n.navbar-expand .navbar-toggler {\n  display: none;\n}\n\n.navbar-light .navbar-brand {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-brand:hover, .navbar-light .navbar-brand:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-nav .nav-link {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-nav .nav-link:hover, .navbar-light .navbar-nav .nav-link:focus {\n  color: rgba(0, 0, 0, 0.7);\n}\n\n.navbar-light .navbar-nav .nav-link.disabled {\n  color: rgba(0, 0, 0, 0.3);\n}\n\n.navbar-light .navbar-nav .show > .nav-link,\n.navbar-light .navbar-nav .active > .nav-link,\n.navbar-light .navbar-nav .nav-link.show,\n.navbar-light .navbar-nav .nav-link.active {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-toggler {\n  color: rgba(0, 0, 0, 0.5);\n  border-color: rgba(0, 0, 0, 0.1);\n}\n\n.navbar-light .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-light .navbar-text {\n  color: rgba(0, 0, 0, 0.5);\n}\n\n.navbar-light .navbar-text a {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-light .navbar-text a:hover, .navbar-light .navbar-text a:focus {\n  color: rgba(0, 0, 0, 0.9);\n}\n\n.navbar-dark .navbar-brand {\n  color: #fff;\n}\n\n.navbar-dark .navbar-brand:hover, .navbar-dark .navbar-brand:focus {\n  color: #fff;\n}\n\n.navbar-dark .navbar-nav .nav-link {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-nav .nav-link:hover, .navbar-dark .navbar-nav .nav-link:focus {\n  color: rgba(255, 255, 255, 0.75);\n}\n\n.navbar-dark .navbar-nav .nav-link.disabled {\n  color: rgba(255, 255, 255, 0.25);\n}\n\n.navbar-dark .navbar-nav .show > .nav-link,\n.navbar-dark .navbar-nav .active > .nav-link,\n.navbar-dark .navbar-nav .nav-link.show,\n.navbar-dark .navbar-nav .nav-link.active {\n  color: #fff;\n}\n\n.navbar-dark .navbar-toggler {\n  color: rgba(255, 255, 255, 0.5);\n  border-color: rgba(255, 255, 255, 0.1);\n}\n\n.navbar-dark .navbar-toggler-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.navbar-dark .navbar-text {\n  color: rgba(255, 255, 255, 0.5);\n}\n\n.navbar-dark .navbar-text a {\n  color: #fff;\n}\n\n.navbar-dark .navbar-text a:hover, .navbar-dark .navbar-text a:focus {\n  color: #fff;\n}\n\n.card {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  min-width: 0;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: border-box;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n  border-radius: 0.25rem;\n}\n\n.card > hr {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n.card > .list-group:first-child .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.card > .list-group:last-child .list-group-item:last-child {\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.card-body {\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  padding: 1.25rem;\n}\n\n.card-title {\n  margin-bottom: 0.75rem;\n}\n\n.card-subtitle {\n  margin-top: -0.375rem;\n  margin-bottom: 0;\n}\n\n.card-text:last-child {\n  margin-bottom: 0;\n}\n\n.card-link:hover {\n  text-decoration: none;\n}\n\n.card-link + .card-link {\n  margin-left: 1.25rem;\n}\n\n.card-header {\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 0;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-bottom: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-header:first-child {\n  border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0;\n}\n\n.card-header + .list-group .list-group-item:first-child {\n  border-top: 0;\n}\n\n.card-footer {\n  padding: 0.75rem 1.25rem;\n  background-color: rgba(0, 0, 0, 0.03);\n  border-top: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.card-footer:last-child {\n  border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px);\n}\n\n.card-header-tabs {\n  margin-right: -0.625rem;\n  margin-bottom: -0.75rem;\n  margin-left: -0.625rem;\n  border-bottom: 0;\n}\n\n.card-header-pills {\n  margin-right: -0.625rem;\n  margin-left: -0.625rem;\n}\n\n.card-img-overlay {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  padding: 1.25rem;\n}\n\n.card-img {\n  width: 100%;\n  border-radius: calc(0.25rem - 1px);\n}\n\n.card-img-top {\n  width: 100%;\n  border-top-left-radius: calc(0.25rem - 1px);\n  border-top-right-radius: calc(0.25rem - 1px);\n}\n\n.card-img-bottom {\n  width: 100%;\n  border-bottom-right-radius: calc(0.25rem - 1px);\n  border-bottom-left-radius: calc(0.25rem - 1px);\n}\n\n.card-deck {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.card-deck .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-deck {\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n    margin-right: -15px;\n    margin-left: -15px;\n  }\n  .card-deck .card {\n    display: -ms-flexbox;\n    display: flex;\n    -ms-flex: 1 0 0%;\n    flex: 1 0 0%;\n    -ms-flex-direction: column;\n    flex-direction: column;\n    margin-right: 15px;\n    margin-bottom: 0;\n    margin-left: 15px;\n  }\n}\n\n.card-group {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n}\n\n.card-group > .card {\n  margin-bottom: 15px;\n}\n\n@media (min-width: 576px) {\n  .card-group {\n    -ms-flex-flow: row wrap;\n    flex-flow: row wrap;\n  }\n  .card-group > .card {\n    -ms-flex: 1 0 0%;\n    flex: 1 0 0%;\n    margin-bottom: 0;\n  }\n  .card-group > .card + .card {\n    margin-left: 0;\n    border-left: 0;\n  }\n  .card-group > .card:not(:last-child) {\n    border-top-right-radius: 0;\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-top,\n  .card-group > .card:not(:last-child) .card-header {\n    border-top-right-radius: 0;\n  }\n  .card-group > .card:not(:last-child) .card-img-bottom,\n  .card-group > .card:not(:last-child) .card-footer {\n    border-bottom-right-radius: 0;\n  }\n  .card-group > .card:not(:first-child) {\n    border-top-left-radius: 0;\n    border-bottom-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-top,\n  .card-group > .card:not(:first-child) .card-header {\n    border-top-left-radius: 0;\n  }\n  .card-group > .card:not(:first-child) .card-img-bottom,\n  .card-group > .card:not(:first-child) .card-footer {\n    border-bottom-left-radius: 0;\n  }\n}\n\n.card-columns .card {\n  margin-bottom: 0.75rem;\n}\n\n@media (min-width: 576px) {\n  .card-columns {\n    -webkit-column-count: 3;\n    -moz-column-count: 3;\n    column-count: 3;\n    -webkit-column-gap: 1.25rem;\n    -moz-column-gap: 1.25rem;\n    column-gap: 1.25rem;\n    orphans: 1;\n    widows: 1;\n  }\n  .card-columns .card {\n    display: inline-block;\n    width: 100%;\n  }\n}\n\n.accordion > .card {\n  overflow: hidden;\n}\n\n.accordion > .card:not(:first-of-type) .card-header:first-child {\n  border-radius: 0;\n}\n\n.accordion > .card:not(:first-of-type):not(:last-of-type) {\n  border-bottom: 0;\n  border-radius: 0;\n}\n\n.accordion > .card:first-of-type {\n  border-bottom: 0;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.accordion > .card:last-of-type {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}\n\n.accordion > .card .card-header {\n  margin-bottom: -1px;\n}\n\n.breadcrumb {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-wrap: wrap;\n  flex-wrap: wrap;\n  padding: 0.75rem 1rem;\n  margin-bottom: 1rem;\n  list-style: none;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.breadcrumb-item + .breadcrumb-item {\n  padding-left: 0.5rem;\n}\n\n.breadcrumb-item + .breadcrumb-item::before {\n  display: inline-block;\n  padding-right: 0.5rem;\n  color: #6c757d;\n  content: \"/\";\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: underline;\n}\n\n.breadcrumb-item + .breadcrumb-item:hover::before {\n  text-decoration: none;\n}\n\n.breadcrumb-item.active {\n  color: #6c757d;\n}\n\n.pagination {\n  display: -ms-flexbox;\n  display: flex;\n  padding-left: 0;\n  list-style: none;\n  border-radius: 0.25rem;\n}\n\n.page-link {\n  position: relative;\n  display: block;\n  padding: 0.5rem 0.75rem;\n  margin-left: -1px;\n  line-height: 1.25;\n  color: #007bff;\n  background-color: #fff;\n  border: 1px solid #dee2e6;\n}\n\n.page-link:hover {\n  z-index: 2;\n  color: #0056b3;\n  text-decoration: none;\n  background-color: #e9ecef;\n  border-color: #dee2e6;\n}\n\n.page-link:focus {\n  z-index: 2;\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);\n}\n\n.page-item:first-child .page-link {\n  margin-left: 0;\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.page-item:last-child .page-link {\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n}\n\n.page-item.active .page-link {\n  z-index: 1;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.page-item.disabled .page-link {\n  color: #6c757d;\n  pointer-events: none;\n  cursor: auto;\n  background-color: #fff;\n  border-color: #dee2e6;\n}\n\n.pagination-lg .page-link {\n  padding: 0.75rem 1.5rem;\n  font-size: 1.25rem;\n  line-height: 1.5;\n}\n\n.pagination-lg .page-item:first-child .page-link {\n  border-top-left-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.pagination-lg .page-item:last-child .page-link {\n  border-top-right-radius: 0.3rem;\n  border-bottom-right-radius: 0.3rem;\n}\n\n.pagination-sm .page-link {\n  padding: 0.25rem 0.5rem;\n  font-size: 0.875rem;\n  line-height: 1.5;\n}\n\n.pagination-sm .page-item:first-child .page-link {\n  border-top-left-radius: 0.2rem;\n  border-bottom-left-radius: 0.2rem;\n}\n\n.pagination-sm .page-item:last-child .page-link {\n  border-top-right-radius: 0.2rem;\n  border-bottom-right-radius: 0.2rem;\n}\n\n.badge {\n  display: inline-block;\n  padding: 0.25em 0.4em;\n  font-size: 75%;\n  font-weight: 700;\n  line-height: 1;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: 0.25rem;\n  transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .badge {\n    transition: none;\n  }\n}\n\na.badge:hover, a.badge:focus {\n  text-decoration: none;\n}\n\n.badge:empty {\n  display: none;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n.badge-pill {\n  padding-right: 0.6em;\n  padding-left: 0.6em;\n  border-radius: 10rem;\n}\n\n.badge-primary {\n  color: #fff;\n  background-color: #007bff;\n}\n\na.badge-primary:hover, a.badge-primary:focus {\n  color: #fff;\n  background-color: #0062cc;\n}\n\na.badge-primary:focus, a.badge-primary.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.5);\n}\n\n.badge-secondary {\n  color: #fff;\n  background-color: #6c757d;\n}\n\na.badge-secondary:hover, a.badge-secondary:focus {\n  color: #fff;\n  background-color: #545b62;\n}\n\na.badge-secondary:focus, a.badge-secondary.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);\n}\n\n.badge-success {\n  color: #fff;\n  background-color: #28a745;\n}\n\na.badge-success:hover, a.badge-success:focus {\n  color: #fff;\n  background-color: #1e7e34;\n}\n\na.badge-success:focus, a.badge-success.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);\n}\n\n.badge-info {\n  color: #fff;\n  background-color: #17a2b8;\n}\n\na.badge-info:hover, a.badge-info:focus {\n  color: #fff;\n  background-color: #117a8b;\n}\n\na.badge-info:focus, a.badge-info.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);\n}\n\n.badge-warning {\n  color: #212529;\n  background-color: #ffc107;\n}\n\na.badge-warning:hover, a.badge-warning:focus {\n  color: #212529;\n  background-color: #d39e00;\n}\n\na.badge-warning:focus, a.badge-warning.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);\n}\n\n.badge-danger {\n  color: #fff;\n  background-color: #dc3545;\n}\n\na.badge-danger:hover, a.badge-danger:focus {\n  color: #fff;\n  background-color: #bd2130;\n}\n\na.badge-danger:focus, a.badge-danger.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);\n}\n\n.badge-light {\n  color: #212529;\n  background-color: #f8f9fa;\n}\n\na.badge-light:hover, a.badge-light:focus {\n  color: #212529;\n  background-color: #dae0e5;\n}\n\na.badge-light:focus, a.badge-light.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);\n}\n\n.badge-dark {\n  color: #fff;\n  background-color: #343a40;\n}\n\na.badge-dark:hover, a.badge-dark:focus {\n  color: #fff;\n  background-color: #1d2124;\n}\n\na.badge-dark:focus, a.badge-dark.focus {\n  outline: 0;\n  box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);\n}\n\n.jumbotron {\n  padding: 2rem 1rem;\n  margin-bottom: 2rem;\n  background-color: #e9ecef;\n  border-radius: 0.3rem;\n}\n\n@media (min-width: 576px) {\n  .jumbotron {\n    padding: 4rem 2rem;\n  }\n}\n\n.jumbotron-fluid {\n  padding-right: 0;\n  padding-left: 0;\n  border-radius: 0;\n}\n\n.alert {\n  position: relative;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: 1rem;\n  border: 1px solid transparent;\n  border-radius: 0.25rem;\n}\n\n.alert-heading {\n  color: inherit;\n}\n\n.alert-link {\n  font-weight: 700;\n}\n\n.alert-dismissible {\n  padding-right: 4rem;\n}\n\n.alert-dismissible .close {\n  position: absolute;\n  top: 0;\n  right: 0;\n  padding: 0.75rem 1.25rem;\n  color: inherit;\n}\n\n.alert-primary {\n  color: #004085;\n  background-color: #cce5ff;\n  border-color: #b8daff;\n}\n\n.alert-primary hr {\n  border-top-color: #9fcdff;\n}\n\n.alert-primary .alert-link {\n  color: #002752;\n}\n\n.alert-secondary {\n  color: #383d41;\n  background-color: #e2e3e5;\n  border-color: #d6d8db;\n}\n\n.alert-secondary hr {\n  border-top-color: #c8cbcf;\n}\n\n.alert-secondary .alert-link {\n  color: #202326;\n}\n\n.alert-success {\n  color: #155724;\n  background-color: #d4edda;\n  border-color: #c3e6cb;\n}\n\n.alert-success hr {\n  border-top-color: #b1dfbb;\n}\n\n.alert-success .alert-link {\n  color: #0b2e13;\n}\n\n.alert-info {\n  color: #0c5460;\n  background-color: #d1ecf1;\n  border-color: #bee5eb;\n}\n\n.alert-info hr {\n  border-top-color: #abdde5;\n}\n\n.alert-info .alert-link {\n  color: #062c33;\n}\n\n.alert-warning {\n  color: #856404;\n  background-color: #fff3cd;\n  border-color: #ffeeba;\n}\n\n.alert-warning hr {\n  border-top-color: #ffe8a1;\n}\n\n.alert-warning .alert-link {\n  color: #533f03;\n}\n\n.alert-danger {\n  color: #721c24;\n  background-color: #f8d7da;\n  border-color: #f5c6cb;\n}\n\n.alert-danger hr {\n  border-top-color: #f1b0b7;\n}\n\n.alert-danger .alert-link {\n  color: #491217;\n}\n\n.alert-light {\n  color: #818182;\n  background-color: #fefefe;\n  border-color: #fdfdfe;\n}\n\n.alert-light hr {\n  border-top-color: #ececf6;\n}\n\n.alert-light .alert-link {\n  color: #686868;\n}\n\n.alert-dark {\n  color: #1b1e21;\n  background-color: #d6d8d9;\n  border-color: #c6c8ca;\n}\n\n.alert-dark hr {\n  border-top-color: #b9bbbe;\n}\n\n.alert-dark .alert-link {\n  color: #040505;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 1rem 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  display: -ms-flexbox;\n  display: flex;\n  height: 1rem;\n  overflow: hidden;\n  font-size: 0.75rem;\n  background-color: #e9ecef;\n  border-radius: 0.25rem;\n}\n\n.progress-bar {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-pack: center;\n  justify-content: center;\n  color: #fff;\n  text-align: center;\n  white-space: nowrap;\n  background-color: #007bff;\n  transition: width 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar {\n    transition: none;\n  }\n}\n\n.progress-bar-striped {\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 1rem 1rem;\n}\n\n.progress-bar-animated {\n  -webkit-animation: progress-bar-stripes 1s linear infinite;\n  animation: progress-bar-stripes 1s linear infinite;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .progress-bar-animated {\n    -webkit-animation: none;\n    animation: none;\n  }\n}\n\n.media {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: start;\n  align-items: flex-start;\n}\n\n.media-body {\n  -ms-flex: 1;\n  flex: 1;\n}\n\n.list-group {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  padding-left: 0;\n  margin-bottom: 0;\n}\n\n.list-group-item-action {\n  width: 100%;\n  color: #495057;\n  text-align: inherit;\n}\n\n.list-group-item-action:hover, .list-group-item-action:focus {\n  z-index: 1;\n  color: #495057;\n  text-decoration: none;\n  background-color: #f8f9fa;\n}\n\n.list-group-item-action:active {\n  color: #212529;\n  background-color: #e9ecef;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 0.75rem 1.25rem;\n  margin-bottom: -1px;\n  background-color: #fff;\n  border: 1px solid rgba(0, 0, 0, 0.125);\n}\n\n.list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-top-right-radius: 0.25rem;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n}\n\n.list-group-item.disabled, .list-group-item:disabled {\n  color: #6c757d;\n  pointer-events: none;\n  background-color: #fff;\n}\n\n.list-group-item.active {\n  z-index: 2;\n  color: #fff;\n  background-color: #007bff;\n  border-color: #007bff;\n}\n\n.list-group-horizontal {\n  -ms-flex-direction: row;\n  flex-direction: row;\n}\n\n.list-group-horizontal .list-group-item {\n  margin-right: -1px;\n  margin-bottom: 0;\n}\n\n.list-group-horizontal .list-group-item:first-child {\n  border-top-left-radius: 0.25rem;\n  border-bottom-left-radius: 0.25rem;\n  border-top-right-radius: 0;\n}\n\n.list-group-horizontal .list-group-item:last-child {\n  margin-right: 0;\n  border-top-right-radius: 0.25rem;\n  border-bottom-right-radius: 0.25rem;\n  border-bottom-left-radius: 0;\n}\n\n@media (min-width: 576px) {\n  .list-group-horizontal-sm {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-sm .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-sm .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-sm .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n@media (min-width: 768px) {\n  .list-group-horizontal-md {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-md .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-md .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-md .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n@media (min-width: 992px) {\n  .list-group-horizontal-lg {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-lg .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-lg .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-lg .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n@media (min-width: 1200px) {\n  .list-group-horizontal-xl {\n    -ms-flex-direction: row;\n    flex-direction: row;\n  }\n  .list-group-horizontal-xl .list-group-item {\n    margin-right: -1px;\n    margin-bottom: 0;\n  }\n  .list-group-horizontal-xl .list-group-item:first-child {\n    border-top-left-radius: 0.25rem;\n    border-bottom-left-radius: 0.25rem;\n    border-top-right-radius: 0;\n  }\n  .list-group-horizontal-xl .list-group-item:last-child {\n    margin-right: 0;\n    border-top-right-radius: 0.25rem;\n    border-bottom-right-radius: 0.25rem;\n    border-bottom-left-radius: 0;\n  }\n}\n\n.list-group-flush .list-group-item {\n  border-right: 0;\n  border-left: 0;\n  border-radius: 0;\n}\n\n.list-group-flush .list-group-item:last-child {\n  margin-bottom: -1px;\n}\n\n.list-group-flush:first-child .list-group-item:first-child {\n  border-top: 0;\n}\n\n.list-group-flush:last-child .list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom: 0;\n}\n\n.list-group-item-primary {\n  color: #004085;\n  background-color: #b8daff;\n}\n\n.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus {\n  color: #004085;\n  background-color: #9fcdff;\n}\n\n.list-group-item-primary.list-group-item-action.active {\n  color: #fff;\n  background-color: #004085;\n  border-color: #004085;\n}\n\n.list-group-item-secondary {\n  color: #383d41;\n  background-color: #d6d8db;\n}\n\n.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus {\n  color: #383d41;\n  background-color: #c8cbcf;\n}\n\n.list-group-item-secondary.list-group-item-action.active {\n  color: #fff;\n  background-color: #383d41;\n  border-color: #383d41;\n}\n\n.list-group-item-success {\n  color: #155724;\n  background-color: #c3e6cb;\n}\n\n.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus {\n  color: #155724;\n  background-color: #b1dfbb;\n}\n\n.list-group-item-success.list-group-item-action.active {\n  color: #fff;\n  background-color: #155724;\n  border-color: #155724;\n}\n\n.list-group-item-info {\n  color: #0c5460;\n  background-color: #bee5eb;\n}\n\n.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus {\n  color: #0c5460;\n  background-color: #abdde5;\n}\n\n.list-group-item-info.list-group-item-action.active {\n  color: #fff;\n  background-color: #0c5460;\n  border-color: #0c5460;\n}\n\n.list-group-item-warning {\n  color: #856404;\n  background-color: #ffeeba;\n}\n\n.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus {\n  color: #856404;\n  background-color: #ffe8a1;\n}\n\n.list-group-item-warning.list-group-item-action.active {\n  color: #fff;\n  background-color: #856404;\n  border-color: #856404;\n}\n\n.list-group-item-danger {\n  color: #721c24;\n  background-color: #f5c6cb;\n}\n\n.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus {\n  color: #721c24;\n  background-color: #f1b0b7;\n}\n\n.list-group-item-danger.list-group-item-action.active {\n  color: #fff;\n  background-color: #721c24;\n  border-color: #721c24;\n}\n\n.list-group-item-light {\n  color: #818182;\n  background-color: #fdfdfe;\n}\n\n.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus {\n  color: #818182;\n  background-color: #ececf6;\n}\n\n.list-group-item-light.list-group-item-action.active {\n  color: #fff;\n  background-color: #818182;\n  border-color: #818182;\n}\n\n.list-group-item-dark {\n  color: #1b1e21;\n  background-color: #c6c8ca;\n}\n\n.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus {\n  color: #1b1e21;\n  background-color: #b9bbbe;\n}\n\n.list-group-item-dark.list-group-item-action.active {\n  color: #fff;\n  background-color: #1b1e21;\n  border-color: #1b1e21;\n}\n\n.close {\n  float: right;\n  font-size: 1.5rem;\n  font-weight: 700;\n  line-height: 1;\n  color: #000;\n  text-shadow: 0 1px 0 #fff;\n  opacity: .5;\n}\n\n.close:hover {\n  color: #000;\n  text-decoration: none;\n}\n\n.close:not(:disabled):not(.disabled):hover, .close:not(:disabled):not(.disabled):focus {\n  opacity: .75;\n}\n\nbutton.close {\n  padding: 0;\n  background-color: transparent;\n  border: 0;\n  -webkit-appearance: none;\n  -moz-appearance: none;\n  appearance: none;\n}\n\na.close.disabled {\n  pointer-events: none;\n}\n\n.toast {\n  max-width: 350px;\n  overflow: hidden;\n  font-size: 0.875rem;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.1);\n  box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);\n  -webkit-backdrop-filter: blur(10px);\n  backdrop-filter: blur(10px);\n  opacity: 0;\n  border-radius: 0.25rem;\n}\n\n.toast:not(:last-child) {\n  margin-bottom: 0.75rem;\n}\n\n.toast.showing {\n  opacity: 1;\n}\n\n.toast.show {\n  display: block;\n  opacity: 1;\n}\n\n.toast.hide {\n  display: none;\n}\n\n.toast-header {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  padding: 0.25rem 0.75rem;\n  color: #6c757d;\n  background-color: rgba(255, 255, 255, 0.85);\n  background-clip: padding-box;\n  border-bottom: 1px solid rgba(0, 0, 0, 0.05);\n}\n\n.toast-body {\n  padding: 0.75rem;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1050;\n  display: none;\n  width: 100%;\n  height: 100%;\n  overflow: hidden;\n  outline: 0;\n}\n\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 0.5rem;\n  pointer-events: none;\n}\n\n.modal.fade .modal-dialog {\n  transition: -webkit-transform 0.3s ease-out;\n  transition: transform 0.3s ease-out;\n  transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;\n  -webkit-transform: translate(0, -50px);\n  transform: translate(0, -50px);\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .modal.fade .modal-dialog {\n    transition: none;\n  }\n}\n\n.modal.show .modal-dialog {\n  -webkit-transform: none;\n  transform: none;\n}\n\n.modal-dialog-scrollable {\n  display: -ms-flexbox;\n  display: flex;\n  max-height: calc(100% - 1rem);\n}\n\n.modal-dialog-scrollable .modal-content {\n  max-height: calc(100vh - 1rem);\n  overflow: hidden;\n}\n\n.modal-dialog-scrollable .modal-header,\n.modal-dialog-scrollable .modal-footer {\n  -ms-flex-negative: 0;\n  flex-shrink: 0;\n}\n\n.modal-dialog-scrollable .modal-body {\n  overflow-y: auto;\n}\n\n.modal-dialog-centered {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  min-height: calc(100% - 1rem);\n}\n\n.modal-dialog-centered::before {\n  display: block;\n  height: calc(100vh - 1rem);\n  content: \"\";\n}\n\n.modal-dialog-centered.modal-dialog-scrollable {\n  -ms-flex-direction: column;\n  flex-direction: column;\n  -ms-flex-pack: center;\n  justify-content: center;\n  height: 100%;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable .modal-content {\n  max-height: none;\n}\n\n.modal-dialog-centered.modal-dialog-scrollable::before {\n  content: none;\n}\n\n.modal-content {\n  position: relative;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-direction: column;\n  flex-direction: column;\n  width: 100%;\n  pointer-events: auto;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n  outline: 0;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  left: 0;\n  z-index: 1040;\n  width: 100vw;\n  height: 100vh;\n  background-color: #000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n}\n\n.modal-backdrop.show {\n  opacity: 0.5;\n}\n\n.modal-header {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: start;\n  align-items: flex-start;\n  -ms-flex-pack: justify;\n  justify-content: space-between;\n  padding: 1rem 1rem;\n  border-bottom: 1px solid #dee2e6;\n  border-top-left-radius: 0.3rem;\n  border-top-right-radius: 0.3rem;\n}\n\n.modal-header .close {\n  padding: 1rem 1rem;\n  margin: -1rem -1rem -1rem auto;\n}\n\n.modal-title {\n  margin-bottom: 0;\n  line-height: 1.5;\n}\n\n.modal-body {\n  position: relative;\n  -ms-flex: 1 1 auto;\n  flex: 1 1 auto;\n  padding: 1rem;\n}\n\n.modal-footer {\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: end;\n  justify-content: flex-end;\n  padding: 1rem;\n  border-top: 1px solid #dee2e6;\n  border-bottom-right-radius: 0.3rem;\n  border-bottom-left-radius: 0.3rem;\n}\n\n.modal-footer > :not(:first-child) {\n  margin-left: .25rem;\n}\n\n.modal-footer > :not(:last-child) {\n  margin-right: .25rem;\n}\n\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n@media (min-width: 576px) {\n  .modal-dialog {\n    max-width: 500px;\n    margin: 1.75rem auto;\n  }\n  .modal-dialog-scrollable {\n    max-height: calc(100% - 3.5rem);\n  }\n  .modal-dialog-scrollable .modal-content {\n    max-height: calc(100vh - 3.5rem);\n  }\n  .modal-dialog-centered {\n    min-height: calc(100% - 3.5rem);\n  }\n  .modal-dialog-centered::before {\n    height: calc(100vh - 3.5rem);\n  }\n  .modal-sm {\n    max-width: 300px;\n  }\n}\n\n@media (min-width: 992px) {\n  .modal-lg,\n  .modal-xl {\n    max-width: 800px;\n  }\n}\n\n@media (min-width: 1200px) {\n  .modal-xl {\n    max-width: 1140px;\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1070;\n  display: block;\n  margin: 0;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  opacity: 0;\n}\n\n.tooltip.show {\n  opacity: 0.9;\n}\n\n.tooltip .arrow {\n  position: absolute;\n  display: block;\n  width: 0.8rem;\n  height: 0.4rem;\n}\n\n.tooltip .arrow::before {\n  position: absolute;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-tooltip-top, .bs-tooltip-auto[x-placement^=\"top\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-top .arrow, .bs-tooltip-auto[x-placement^=\"top\"] .arrow {\n  bottom: 0;\n}\n\n.bs-tooltip-top .arrow::before, .bs-tooltip-auto[x-placement^=\"top\"] .arrow::before {\n  top: 0;\n  border-width: 0.4rem 0.4rem 0;\n  border-top-color: #000;\n}\n\n.bs-tooltip-right, .bs-tooltip-auto[x-placement^=\"right\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-right .arrow, .bs-tooltip-auto[x-placement^=\"right\"] .arrow {\n  left: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-right .arrow::before, .bs-tooltip-auto[x-placement^=\"right\"] .arrow::before {\n  right: 0;\n  border-width: 0.4rem 0.4rem 0.4rem 0;\n  border-right-color: #000;\n}\n\n.bs-tooltip-bottom, .bs-tooltip-auto[x-placement^=\"bottom\"] {\n  padding: 0.4rem 0;\n}\n\n.bs-tooltip-bottom .arrow, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow {\n  top: 0;\n}\n\n.bs-tooltip-bottom .arrow::before, .bs-tooltip-auto[x-placement^=\"bottom\"] .arrow::before {\n  bottom: 0;\n  border-width: 0 0.4rem 0.4rem;\n  border-bottom-color: #000;\n}\n\n.bs-tooltip-left, .bs-tooltip-auto[x-placement^=\"left\"] {\n  padding: 0 0.4rem;\n}\n\n.bs-tooltip-left .arrow, .bs-tooltip-auto[x-placement^=\"left\"] .arrow {\n  right: 0;\n  width: 0.4rem;\n  height: 0.8rem;\n}\n\n.bs-tooltip-left .arrow::before, .bs-tooltip-auto[x-placement^=\"left\"] .arrow::before {\n  left: 0;\n  border-width: 0.4rem 0 0.4rem 0.4rem;\n  border-left-color: #000;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 0.25rem 0.5rem;\n  color: #fff;\n  text-align: center;\n  background-color: #000;\n  border-radius: 0.25rem;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1060;\n  display: block;\n  max-width: 276px;\n  font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n  font-style: normal;\n  font-weight: 400;\n  line-height: 1.5;\n  text-align: left;\n  text-align: start;\n  text-decoration: none;\n  text-shadow: none;\n  text-transform: none;\n  letter-spacing: normal;\n  word-break: normal;\n  word-spacing: normal;\n  white-space: normal;\n  line-break: auto;\n  font-size: 0.875rem;\n  word-wrap: break-word;\n  background-color: #fff;\n  background-clip: padding-box;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 0.3rem;\n}\n\n.popover .arrow {\n  position: absolute;\n  display: block;\n  width: 1rem;\n  height: 0.5rem;\n  margin: 0 0.3rem;\n}\n\n.popover .arrow::before, .popover .arrow::after {\n  position: absolute;\n  display: block;\n  content: \"\";\n  border-color: transparent;\n  border-style: solid;\n}\n\n.bs-popover-top, .bs-popover-auto[x-placement^=\"top\"] {\n  margin-bottom: 0.5rem;\n}\n\n.bs-popover-top > .arrow, .bs-popover-auto[x-placement^=\"top\"] > .arrow {\n  bottom: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-top > .arrow::before, .bs-popover-auto[x-placement^=\"top\"] > .arrow::before {\n  bottom: 0;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-top > .arrow::after, .bs-popover-auto[x-placement^=\"top\"] > .arrow::after {\n  bottom: 1px;\n  border-width: 0.5rem 0.5rem 0;\n  border-top-color: #fff;\n}\n\n.bs-popover-right, .bs-popover-auto[x-placement^=\"right\"] {\n  margin-left: 0.5rem;\n}\n\n.bs-popover-right > .arrow, .bs-popover-auto[x-placement^=\"right\"] > .arrow {\n  left: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-right > .arrow::before, .bs-popover-auto[x-placement^=\"right\"] > .arrow::before {\n  left: 0;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-right > .arrow::after, .bs-popover-auto[x-placement^=\"right\"] > .arrow::after {\n  left: 1px;\n  border-width: 0.5rem 0.5rem 0.5rem 0;\n  border-right-color: #fff;\n}\n\n.bs-popover-bottom, .bs-popover-auto[x-placement^=\"bottom\"] {\n  margin-top: 0.5rem;\n}\n\n.bs-popover-bottom > .arrow, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow {\n  top: calc((0.5rem + 1px) * -1);\n}\n\n.bs-popover-bottom > .arrow::before, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::before {\n  top: 0;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-bottom > .arrow::after, .bs-popover-auto[x-placement^=\"bottom\"] > .arrow::after {\n  top: 1px;\n  border-width: 0 0.5rem 0.5rem 0.5rem;\n  border-bottom-color: #fff;\n}\n\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[x-placement^=\"bottom\"] .popover-header::before {\n  position: absolute;\n  top: 0;\n  left: 50%;\n  display: block;\n  width: 1rem;\n  margin-left: -0.5rem;\n  content: \"\";\n  border-bottom: 1px solid #f7f7f7;\n}\n\n.bs-popover-left, .bs-popover-auto[x-placement^=\"left\"] {\n  margin-right: 0.5rem;\n}\n\n.bs-popover-left > .arrow, .bs-popover-auto[x-placement^=\"left\"] > .arrow {\n  right: calc((0.5rem + 1px) * -1);\n  width: 0.5rem;\n  height: 1rem;\n  margin: 0.3rem 0;\n}\n\n.bs-popover-left > .arrow::before, .bs-popover-auto[x-placement^=\"left\"] > .arrow::before {\n  right: 0;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: rgba(0, 0, 0, 0.25);\n}\n\n.bs-popover-left > .arrow::after, .bs-popover-auto[x-placement^=\"left\"] > .arrow::after {\n  right: 1px;\n  border-width: 0.5rem 0 0.5rem 0.5rem;\n  border-left-color: #fff;\n}\n\n.popover-header {\n  padding: 0.5rem 0.75rem;\n  margin-bottom: 0;\n  font-size: 1rem;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-top-left-radius: calc(0.3rem - 1px);\n  border-top-right-radius: calc(0.3rem - 1px);\n}\n\n.popover-header:empty {\n  display: none;\n}\n\n.popover-body {\n  padding: 0.5rem 0.75rem;\n  color: #212529;\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel.pointer-event {\n  -ms-touch-action: pan-y;\n  touch-action: pan-y;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.carousel-item {\n  position: relative;\n  display: none;\n  float: left;\n  width: 100%;\n  margin-right: -100%;\n  -webkit-backface-visibility: hidden;\n  backface-visibility: hidden;\n  transition: -webkit-transform 0.6s ease-in-out;\n  transition: transform 0.6s ease-in-out;\n  transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-item {\n    transition: none;\n  }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n  display: block;\n}\n\n.carousel-item-next:not(.carousel-item-left),\n.active.carousel-item-right {\n  -webkit-transform: translateX(100%);\n  transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-right),\n.active.carousel-item-left {\n  -webkit-transform: translateX(-100%);\n  transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n  opacity: 0;\n  transition-property: opacity;\n  -webkit-transform: none;\n  transform: none;\n}\n\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-left,\n.carousel-fade .carousel-item-prev.carousel-item-right {\n  z-index: 1;\n  opacity: 1;\n}\n\n.carousel-fade .active.carousel-item-left,\n.carousel-fade .active.carousel-item-right {\n  z-index: 0;\n  opacity: 0;\n  transition: 0s 0.6s opacity;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-fade .active.carousel-item-left,\n  .carousel-fade .active.carousel-item-right {\n    transition: none;\n  }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  z-index: 1;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-align: center;\n  align-items: center;\n  -ms-flex-pack: center;\n  justify-content: center;\n  width: 15%;\n  color: #fff;\n  text-align: center;\n  opacity: 0.5;\n  transition: opacity 0.15s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-control-prev,\n  .carousel-control-next {\n    transition: none;\n  }\n}\n\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n  color: #fff;\n  text-decoration: none;\n  outline: 0;\n  opacity: 0.9;\n}\n\n.carousel-control-prev {\n  left: 0;\n}\n\n.carousel-control-next {\n  right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n  display: inline-block;\n  width: 20px;\n  height: 20px;\n  background: no-repeat 50% / 100% 100%;\n}\n\n.carousel-control-prev-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e\");\n}\n\n.carousel-control-next-icon {\n  background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e\");\n}\n\n.carousel-indicators {\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 15;\n  display: -ms-flexbox;\n  display: flex;\n  -ms-flex-pack: center;\n  justify-content: center;\n  padding-left: 0;\n  margin-right: 15%;\n  margin-left: 15%;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  box-sizing: content-box;\n  -ms-flex: 0 1 auto;\n  flex: 0 1 auto;\n  width: 30px;\n  height: 3px;\n  margin-right: 3px;\n  margin-left: 3px;\n  text-indent: -999px;\n  cursor: pointer;\n  background-color: #fff;\n  background-clip: padding-box;\n  border-top: 10px solid transparent;\n  border-bottom: 10px solid transparent;\n  opacity: .5;\n  transition: opacity 0.6s ease;\n}\n\n@media (prefers-reduced-motion: reduce) {\n  .carousel-indicators li {\n    transition: none;\n  }\n}\n\n.carousel-indicators .active {\n  opacity: 1;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #fff;\n  text-align: center;\n}\n\n@-webkit-keyframes spinner-border {\n  to {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n@keyframes spinner-border {\n  to {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n.spinner-border {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: text-bottom;\n  border: 0.25em solid currentColor;\n  border-right-color: transparent;\n  border-radius: 50%;\n  -webkit-animation: spinner-border .75s linear infinite;\n  animation: spinner-border .75s linear infinite;\n}\n\n.spinner-border-sm {\n  width: 1rem;\n  height: 1rem;\n  border-width: 0.2em;\n}\n\n@-webkit-keyframes spinner-grow {\n  0% {\n    -webkit-transform: scale(0);\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n\n@keyframes spinner-grow {\n  0% {\n    -webkit-transform: scale(0);\n    transform: scale(0);\n  }\n  50% {\n    opacity: 1;\n  }\n}\n\n.spinner-grow {\n  display: inline-block;\n  width: 2rem;\n  height: 2rem;\n  vertical-align: text-bottom;\n  background-color: currentColor;\n  border-radius: 50%;\n  opacity: 0;\n  -webkit-animation: spinner-grow .75s linear infinite;\n  animation: spinner-grow .75s linear infinite;\n}\n\n.spinner-grow-sm {\n  width: 1rem;\n  height: 1rem;\n}\n\n.align-baseline {\n  vertical-align: baseline !important;\n}\n\n.align-top {\n  vertical-align: top !important;\n}\n\n.align-middle {\n  vertical-align: middle !important;\n}\n\n.align-bottom {\n  vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n  vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n  vertical-align: text-top !important;\n}\n\n.bg-primary {\n  background-color: #007bff !important;\n}\n\na.bg-primary:hover, a.bg-primary:focus,\nbutton.bg-primary:hover,\nbutton.bg-primary:focus {\n  background-color: #0062cc !important;\n}\n\n.bg-secondary {\n  background-color: #6c757d !important;\n}\n\na.bg-secondary:hover, a.bg-secondary:focus,\nbutton.bg-secondary:hover,\nbutton.bg-secondary:focus {\n  background-color: #545b62 !important;\n}\n\n.bg-success {\n  background-color: #28a745 !important;\n}\n\na.bg-success:hover, a.bg-success:focus,\nbutton.bg-success:hover,\nbutton.bg-success:focus {\n  background-color: #1e7e34 !important;\n}\n\n.bg-info {\n  background-color: #17a2b8 !important;\n}\n\na.bg-info:hover, a.bg-info:focus,\nbutton.bg-info:hover,\nbutton.bg-info:focus {\n  background-color: #117a8b !important;\n}\n\n.bg-warning {\n  background-color: #ffc107 !important;\n}\n\na.bg-warning:hover, a.bg-warning:focus,\nbutton.bg-warning:hover,\nbutton.bg-warning:focus {\n  background-color: #d39e00 !important;\n}\n\n.bg-danger {\n  background-color: #dc3545 !important;\n}\n\na.bg-danger:hover, a.bg-danger:focus,\nbutton.bg-danger:hover,\nbutton.bg-danger:focus {\n  background-color: #bd2130 !important;\n}\n\n.bg-light {\n  background-color: #f8f9fa !important;\n}\n\na.bg-light:hover, a.bg-light:focus,\nbutton.bg-light:hover,\nbutton.bg-light:focus {\n  background-color: #dae0e5 !important;\n}\n\n.bg-dark {\n  background-color: #343a40 !important;\n}\n\na.bg-dark:hover, a.bg-dark:focus,\nbutton.bg-dark:hover,\nbutton.bg-dark:focus {\n  background-color: #1d2124 !important;\n}\n\n.bg-white {\n  background-color: #fff !important;\n}\n\n.bg-transparent {\n  background-color: transparent !important;\n}\n\n.border {\n  border: 1px solid #dee2e6 !important;\n}\n\n.border-top {\n  border-top: 1px solid #dee2e6 !important;\n}\n\n.border-right {\n  border-right: 1px solid #dee2e6 !important;\n}\n\n.border-bottom {\n  border-bottom: 1px solid #dee2e6 !important;\n}\n\n.border-left {\n  border-left: 1px solid #dee2e6 !important;\n}\n\n.border-0 {\n  border: 0 !important;\n}\n\n.border-top-0 {\n  border-top: 0 !important;\n}\n\n.border-right-0 {\n  border-right: 0 !important;\n}\n\n.border-bottom-0 {\n  border-bottom: 0 !important;\n}\n\n.border-left-0 {\n  border-left: 0 !important;\n}\n\n.border-primary {\n  border-color: #007bff !important;\n}\n\n.border-secondary {\n  border-color: #6c757d !important;\n}\n\n.border-success {\n  border-color: #28a745 !important;\n}\n\n.border-info {\n  border-color: #17a2b8 !important;\n}\n\n.border-warning {\n  border-color: #ffc107 !important;\n}\n\n.border-danger {\n  border-color: #dc3545 !important;\n}\n\n.border-light {\n  border-color: #f8f9fa !important;\n}\n\n.border-dark {\n  border-color: #343a40 !important;\n}\n\n.border-white {\n  border-color: #fff !important;\n}\n\n.rounded-sm {\n  border-radius: 0.2rem !important;\n}\n\n.rounded {\n  border-radius: 0.25rem !important;\n}\n\n.rounded-top {\n  border-top-left-radius: 0.25rem !important;\n  border-top-right-radius: 0.25rem !important;\n}\n\n.rounded-right {\n  border-top-right-radius: 0.25rem !important;\n  border-bottom-right-radius: 0.25rem !important;\n}\n\n.rounded-bottom {\n  border-bottom-right-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-left {\n  border-top-left-radius: 0.25rem !important;\n  border-bottom-left-radius: 0.25rem !important;\n}\n\n.rounded-lg {\n  border-radius: 0.3rem !important;\n}\n\n.rounded-circle {\n  border-radius: 50% !important;\n}\n\n.rounded-pill {\n  border-radius: 50rem !important;\n}\n\n.rounded-0 {\n  border-radius: 0 !important;\n}\n\n.clearfix::after {\n  display: block;\n  clear: both;\n  content: \"\";\n}\n\n.d-none {\n  display: none !important;\n}\n\n.d-inline {\n  display: inline !important;\n}\n\n.d-inline-block {\n  display: inline-block !important;\n}\n\n.d-block {\n  display: block !important;\n}\n\n.d-table {\n  display: table !important;\n}\n\n.d-table-row {\n  display: table-row !important;\n}\n\n.d-table-cell {\n  display: table-cell !important;\n}\n\n.d-flex {\n  display: -ms-flexbox !important;\n  display: flex !important;\n}\n\n.d-inline-flex {\n  display: -ms-inline-flexbox !important;\n  display: inline-flex !important;\n}\n\n@media (min-width: 576px) {\n  .d-sm-none {\n    display: none !important;\n  }\n  .d-sm-inline {\n    display: inline !important;\n  }\n  .d-sm-inline-block {\n    display: inline-block !important;\n  }\n  .d-sm-block {\n    display: block !important;\n  }\n  .d-sm-table {\n    display: table !important;\n  }\n  .d-sm-table-row {\n    display: table-row !important;\n  }\n  .d-sm-table-cell {\n    display: table-cell !important;\n  }\n  .d-sm-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-sm-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .d-md-none {\n    display: none !important;\n  }\n  .d-md-inline {\n    display: inline !important;\n  }\n  .d-md-inline-block {\n    display: inline-block !important;\n  }\n  .d-md-block {\n    display: block !important;\n  }\n  .d-md-table {\n    display: table !important;\n  }\n  .d-md-table-row {\n    display: table-row !important;\n  }\n  .d-md-table-cell {\n    display: table-cell !important;\n  }\n  .d-md-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-md-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .d-lg-none {\n    display: none !important;\n  }\n  .d-lg-inline {\n    display: inline !important;\n  }\n  .d-lg-inline-block {\n    display: inline-block !important;\n  }\n  .d-lg-block {\n    display: block !important;\n  }\n  .d-lg-table {\n    display: table !important;\n  }\n  .d-lg-table-row {\n    display: table-row !important;\n  }\n  .d-lg-table-cell {\n    display: table-cell !important;\n  }\n  .d-lg-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-lg-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .d-xl-none {\n    display: none !important;\n  }\n  .d-xl-inline {\n    display: inline !important;\n  }\n  .d-xl-inline-block {\n    display: inline-block !important;\n  }\n  .d-xl-block {\n    display: block !important;\n  }\n  .d-xl-table {\n    display: table !important;\n  }\n  .d-xl-table-row {\n    display: table-row !important;\n  }\n  .d-xl-table-cell {\n    display: table-cell !important;\n  }\n  .d-xl-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-xl-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n@media print {\n  .d-print-none {\n    display: none !important;\n  }\n  .d-print-inline {\n    display: inline !important;\n  }\n  .d-print-inline-block {\n    display: inline-block !important;\n  }\n  .d-print-block {\n    display: block !important;\n  }\n  .d-print-table {\n    display: table !important;\n  }\n  .d-print-table-row {\n    display: table-row !important;\n  }\n  .d-print-table-cell {\n    display: table-cell !important;\n  }\n  .d-print-flex {\n    display: -ms-flexbox !important;\n    display: flex !important;\n  }\n  .d-print-inline-flex {\n    display: -ms-inline-flexbox !important;\n    display: inline-flex !important;\n  }\n}\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  width: 100%;\n  padding: 0;\n  overflow: hidden;\n}\n\n.embed-responsive::before {\n  display: block;\n  content: \"\";\n}\n\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n\n.embed-responsive-21by9::before {\n  padding-top: 42.857143%;\n}\n\n.embed-responsive-16by9::before {\n  padding-top: 56.25%;\n}\n\n.embed-responsive-4by3::before {\n  padding-top: 75%;\n}\n\n.embed-responsive-1by1::before {\n  padding-top: 100%;\n}\n\n.flex-row {\n  -ms-flex-direction: row !important;\n  flex-direction: row !important;\n}\n\n.flex-column {\n  -ms-flex-direction: column !important;\n  flex-direction: column !important;\n}\n\n.flex-row-reverse {\n  -ms-flex-direction: row-reverse !important;\n  flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n  -ms-flex-direction: column-reverse !important;\n  flex-direction: column-reverse !important;\n}\n\n.flex-wrap {\n  -ms-flex-wrap: wrap !important;\n  flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n  -ms-flex-wrap: nowrap !important;\n  flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n  -ms-flex-wrap: wrap-reverse !important;\n  flex-wrap: wrap-reverse !important;\n}\n\n.flex-fill {\n  -ms-flex: 1 1 auto !important;\n  flex: 1 1 auto !important;\n}\n\n.flex-grow-0 {\n  -ms-flex-positive: 0 !important;\n  flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n  -ms-flex-positive: 1 !important;\n  flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n  -ms-flex-negative: 0 !important;\n  flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n  -ms-flex-negative: 1 !important;\n  flex-shrink: 1 !important;\n}\n\n.justify-content-start {\n  -ms-flex-pack: start !important;\n  justify-content: flex-start !important;\n}\n\n.justify-content-end {\n  -ms-flex-pack: end !important;\n  justify-content: flex-end !important;\n}\n\n.justify-content-center {\n  -ms-flex-pack: center !important;\n  justify-content: center !important;\n}\n\n.justify-content-between {\n  -ms-flex-pack: justify !important;\n  justify-content: space-between !important;\n}\n\n.justify-content-around {\n  -ms-flex-pack: distribute !important;\n  justify-content: space-around !important;\n}\n\n.align-items-start {\n  -ms-flex-align: start !important;\n  align-items: flex-start !important;\n}\n\n.align-items-end {\n  -ms-flex-align: end !important;\n  align-items: flex-end !important;\n}\n\n.align-items-center {\n  -ms-flex-align: center !important;\n  align-items: center !important;\n}\n\n.align-items-baseline {\n  -ms-flex-align: baseline !important;\n  align-items: baseline !important;\n}\n\n.align-items-stretch {\n  -ms-flex-align: stretch !important;\n  align-items: stretch !important;\n}\n\n.align-content-start {\n  -ms-flex-line-pack: start !important;\n  align-content: flex-start !important;\n}\n\n.align-content-end {\n  -ms-flex-line-pack: end !important;\n  align-content: flex-end !important;\n}\n\n.align-content-center {\n  -ms-flex-line-pack: center !important;\n  align-content: center !important;\n}\n\n.align-content-between {\n  -ms-flex-line-pack: justify !important;\n  align-content: space-between !important;\n}\n\n.align-content-around {\n  -ms-flex-line-pack: distribute !important;\n  align-content: space-around !important;\n}\n\n.align-content-stretch {\n  -ms-flex-line-pack: stretch !important;\n  align-content: stretch !important;\n}\n\n.align-self-auto {\n  -ms-flex-item-align: auto !important;\n  align-self: auto !important;\n}\n\n.align-self-start {\n  -ms-flex-item-align: start !important;\n  align-self: flex-start !important;\n}\n\n.align-self-end {\n  -ms-flex-item-align: end !important;\n  align-self: flex-end !important;\n}\n\n.align-self-center {\n  -ms-flex-item-align: center !important;\n  align-self: center !important;\n}\n\n.align-self-baseline {\n  -ms-flex-item-align: baseline !important;\n  align-self: baseline !important;\n}\n\n.align-self-stretch {\n  -ms-flex-item-align: stretch !important;\n  align-self: stretch !important;\n}\n\n@media (min-width: 576px) {\n  .flex-sm-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-sm-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-sm-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-sm-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-sm-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-sm-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-sm-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-sm-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-sm-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-sm-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-sm-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-sm-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-sm-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-sm-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-sm-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-sm-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-sm-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-sm-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-sm-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-sm-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-sm-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-sm-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-sm-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-sm-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-sm-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-sm-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-sm-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-sm-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-sm-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-sm-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-sm-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-sm-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-sm-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-sm-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .flex-md-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-md-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-md-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-md-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-md-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-md-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-md-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-md-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-md-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-md-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-md-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-md-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-md-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-md-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-md-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-md-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-md-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-md-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-md-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-md-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-md-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-md-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-md-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-md-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-md-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-md-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-md-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-md-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-md-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-md-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-md-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-md-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-md-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-md-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .flex-lg-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-lg-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-lg-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-lg-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-lg-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-lg-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-lg-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-lg-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-lg-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-lg-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-lg-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-lg-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-lg-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-lg-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-lg-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-lg-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-lg-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-lg-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-lg-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-lg-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-lg-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-lg-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-lg-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-lg-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-lg-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-lg-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-lg-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-lg-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-lg-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-lg-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-lg-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-lg-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-lg-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-lg-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .flex-xl-row {\n    -ms-flex-direction: row !important;\n    flex-direction: row !important;\n  }\n  .flex-xl-column {\n    -ms-flex-direction: column !important;\n    flex-direction: column !important;\n  }\n  .flex-xl-row-reverse {\n    -ms-flex-direction: row-reverse !important;\n    flex-direction: row-reverse !important;\n  }\n  .flex-xl-column-reverse {\n    -ms-flex-direction: column-reverse !important;\n    flex-direction: column-reverse !important;\n  }\n  .flex-xl-wrap {\n    -ms-flex-wrap: wrap !important;\n    flex-wrap: wrap !important;\n  }\n  .flex-xl-nowrap {\n    -ms-flex-wrap: nowrap !important;\n    flex-wrap: nowrap !important;\n  }\n  .flex-xl-wrap-reverse {\n    -ms-flex-wrap: wrap-reverse !important;\n    flex-wrap: wrap-reverse !important;\n  }\n  .flex-xl-fill {\n    -ms-flex: 1 1 auto !important;\n    flex: 1 1 auto !important;\n  }\n  .flex-xl-grow-0 {\n    -ms-flex-positive: 0 !important;\n    flex-grow: 0 !important;\n  }\n  .flex-xl-grow-1 {\n    -ms-flex-positive: 1 !important;\n    flex-grow: 1 !important;\n  }\n  .flex-xl-shrink-0 {\n    -ms-flex-negative: 0 !important;\n    flex-shrink: 0 !important;\n  }\n  .flex-xl-shrink-1 {\n    -ms-flex-negative: 1 !important;\n    flex-shrink: 1 !important;\n  }\n  .justify-content-xl-start {\n    -ms-flex-pack: start !important;\n    justify-content: flex-start !important;\n  }\n  .justify-content-xl-end {\n    -ms-flex-pack: end !important;\n    justify-content: flex-end !important;\n  }\n  .justify-content-xl-center {\n    -ms-flex-pack: center !important;\n    justify-content: center !important;\n  }\n  .justify-content-xl-between {\n    -ms-flex-pack: justify !important;\n    justify-content: space-between !important;\n  }\n  .justify-content-xl-around {\n    -ms-flex-pack: distribute !important;\n    justify-content: space-around !important;\n  }\n  .align-items-xl-start {\n    -ms-flex-align: start !important;\n    align-items: flex-start !important;\n  }\n  .align-items-xl-end {\n    -ms-flex-align: end !important;\n    align-items: flex-end !important;\n  }\n  .align-items-xl-center {\n    -ms-flex-align: center !important;\n    align-items: center !important;\n  }\n  .align-items-xl-baseline {\n    -ms-flex-align: baseline !important;\n    align-items: baseline !important;\n  }\n  .align-items-xl-stretch {\n    -ms-flex-align: stretch !important;\n    align-items: stretch !important;\n  }\n  .align-content-xl-start {\n    -ms-flex-line-pack: start !important;\n    align-content: flex-start !important;\n  }\n  .align-content-xl-end {\n    -ms-flex-line-pack: end !important;\n    align-content: flex-end !important;\n  }\n  .align-content-xl-center {\n    -ms-flex-line-pack: center !important;\n    align-content: center !important;\n  }\n  .align-content-xl-between {\n    -ms-flex-line-pack: justify !important;\n    align-content: space-between !important;\n  }\n  .align-content-xl-around {\n    -ms-flex-line-pack: distribute !important;\n    align-content: space-around !important;\n  }\n  .align-content-xl-stretch {\n    -ms-flex-line-pack: stretch !important;\n    align-content: stretch !important;\n  }\n  .align-self-xl-auto {\n    -ms-flex-item-align: auto !important;\n    align-self: auto !important;\n  }\n  .align-self-xl-start {\n    -ms-flex-item-align: start !important;\n    align-self: flex-start !important;\n  }\n  .align-self-xl-end {\n    -ms-flex-item-align: end !important;\n    align-self: flex-end !important;\n  }\n  .align-self-xl-center {\n    -ms-flex-item-align: center !important;\n    align-self: center !important;\n  }\n  .align-self-xl-baseline {\n    -ms-flex-item-align: baseline !important;\n    align-self: baseline !important;\n  }\n  .align-self-xl-stretch {\n    -ms-flex-item-align: stretch !important;\n    align-self: stretch !important;\n  }\n}\n\n.float-left {\n  float: left !important;\n}\n\n.float-right {\n  float: right !important;\n}\n\n.float-none {\n  float: none !important;\n}\n\n@media (min-width: 576px) {\n  .float-sm-left {\n    float: left !important;\n  }\n  .float-sm-right {\n    float: right !important;\n  }\n  .float-sm-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .float-md-left {\n    float: left !important;\n  }\n  .float-md-right {\n    float: right !important;\n  }\n  .float-md-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .float-lg-left {\n    float: left !important;\n  }\n  .float-lg-right {\n    float: right !important;\n  }\n  .float-lg-none {\n    float: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .float-xl-left {\n    float: left !important;\n  }\n  .float-xl-right {\n    float: right !important;\n  }\n  .float-xl-none {\n    float: none !important;\n  }\n}\n\n.overflow-auto {\n  overflow: auto !important;\n}\n\n.overflow-hidden {\n  overflow: hidden !important;\n}\n\n.position-static {\n  position: static !important;\n}\n\n.position-relative {\n  position: relative !important;\n}\n\n.position-absolute {\n  position: absolute !important;\n}\n\n.position-fixed {\n  position: fixed !important;\n}\n\n.position-sticky {\n  position: -webkit-sticky !important;\n  position: sticky !important;\n}\n\n.fixed-top {\n  position: fixed;\n  top: 0;\n  right: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n.fixed-bottom {\n  position: fixed;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n}\n\n@supports ((position: -webkit-sticky) or (position: sticky)) {\n  .sticky-top {\n    position: -webkit-sticky;\n    position: sticky;\n    top: 0;\n    z-index: 1020;\n  }\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border: 0;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  position: static;\n  width: auto;\n  height: auto;\n  overflow: visible;\n  clip: auto;\n  white-space: normal;\n}\n\n.shadow-sm {\n  box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow {\n  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-lg {\n  box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n  box-shadow: none !important;\n}\n\n.w-25 {\n  width: 25% !important;\n}\n\n.w-50 {\n  width: 50% !important;\n}\n\n.w-75 {\n  width: 75% !important;\n}\n\n.w-100 {\n  width: 100% !important;\n}\n\n.w-auto {\n  width: auto !important;\n}\n\n.h-25 {\n  height: 25% !important;\n}\n\n.h-50 {\n  height: 50% !important;\n}\n\n.h-75 {\n  height: 75% !important;\n}\n\n.h-100 {\n  height: 100% !important;\n}\n\n.h-auto {\n  height: auto !important;\n}\n\n.mw-100 {\n  max-width: 100% !important;\n}\n\n.mh-100 {\n  max-height: 100% !important;\n}\n\n.min-vw-100 {\n  min-width: 100vw !important;\n}\n\n.min-vh-100 {\n  min-height: 100vh !important;\n}\n\n.vw-100 {\n  width: 100vw !important;\n}\n\n.vh-100 {\n  height: 100vh !important;\n}\n\n.stretched-link::after {\n  position: absolute;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1;\n  pointer-events: auto;\n  content: \"\";\n  background-color: rgba(0, 0, 0, 0);\n}\n\n.m-0 {\n  margin: 0 !important;\n}\n\n.mt-0,\n.my-0 {\n  margin-top: 0 !important;\n}\n\n.mr-0,\n.mx-0 {\n  margin-right: 0 !important;\n}\n\n.mb-0,\n.my-0 {\n  margin-bottom: 0 !important;\n}\n\n.ml-0,\n.mx-0 {\n  margin-left: 0 !important;\n}\n\n.m-1 {\n  margin: 0.25rem !important;\n}\n\n.mt-1,\n.my-1 {\n  margin-top: 0.25rem !important;\n}\n\n.mr-1,\n.mx-1 {\n  margin-right: 0.25rem !important;\n}\n\n.mb-1,\n.my-1 {\n  margin-bottom: 0.25rem !important;\n}\n\n.ml-1,\n.mx-1 {\n  margin-left: 0.25rem !important;\n}\n\n.m-2 {\n  margin: 0.5rem !important;\n}\n\n.mt-2,\n.my-2 {\n  margin-top: 0.5rem !important;\n}\n\n.mr-2,\n.mx-2 {\n  margin-right: 0.5rem !important;\n}\n\n.mb-2,\n.my-2 {\n  margin-bottom: 0.5rem !important;\n}\n\n.ml-2,\n.mx-2 {\n  margin-left: 0.5rem !important;\n}\n\n.m-3 {\n  margin: 1rem !important;\n}\n\n.mt-3,\n.my-3 {\n  margin-top: 1rem !important;\n}\n\n.mr-3,\n.mx-3 {\n  margin-right: 1rem !important;\n}\n\n.mb-3,\n.my-3 {\n  margin-bottom: 1rem !important;\n}\n\n.ml-3,\n.mx-3 {\n  margin-left: 1rem !important;\n}\n\n.m-4 {\n  margin: 1.5rem !important;\n}\n\n.mt-4,\n.my-4 {\n  margin-top: 1.5rem !important;\n}\n\n.mr-4,\n.mx-4 {\n  margin-right: 1.5rem !important;\n}\n\n.mb-4,\n.my-4 {\n  margin-bottom: 1.5rem !important;\n}\n\n.ml-4,\n.mx-4 {\n  margin-left: 1.5rem !important;\n}\n\n.m-5 {\n  margin: 3rem !important;\n}\n\n.mt-5,\n.my-5 {\n  margin-top: 3rem !important;\n}\n\n.mr-5,\n.mx-5 {\n  margin-right: 3rem !important;\n}\n\n.mb-5,\n.my-5 {\n  margin-bottom: 3rem !important;\n}\n\n.ml-5,\n.mx-5 {\n  margin-left: 3rem !important;\n}\n\n.p-0 {\n  padding: 0 !important;\n}\n\n.pt-0,\n.py-0 {\n  padding-top: 0 !important;\n}\n\n.pr-0,\n.px-0 {\n  padding-right: 0 !important;\n}\n\n.pb-0,\n.py-0 {\n  padding-bottom: 0 !important;\n}\n\n.pl-0,\n.px-0 {\n  padding-left: 0 !important;\n}\n\n.p-1 {\n  padding: 0.25rem !important;\n}\n\n.pt-1,\n.py-1 {\n  padding-top: 0.25rem !important;\n}\n\n.pr-1,\n.px-1 {\n  padding-right: 0.25rem !important;\n}\n\n.pb-1,\n.py-1 {\n  padding-bottom: 0.25rem !important;\n}\n\n.pl-1,\n.px-1 {\n  padding-left: 0.25rem !important;\n}\n\n.p-2 {\n  padding: 0.5rem !important;\n}\n\n.pt-2,\n.py-2 {\n  padding-top: 0.5rem !important;\n}\n\n.pr-2,\n.px-2 {\n  padding-right: 0.5rem !important;\n}\n\n.pb-2,\n.py-2 {\n  padding-bottom: 0.5rem !important;\n}\n\n.pl-2,\n.px-2 {\n  padding-left: 0.5rem !important;\n}\n\n.p-3 {\n  padding: 1rem !important;\n}\n\n.pt-3,\n.py-3 {\n  padding-top: 1rem !important;\n}\n\n.pr-3,\n.px-3 {\n  padding-right: 1rem !important;\n}\n\n.pb-3,\n.py-3 {\n  padding-bottom: 1rem !important;\n}\n\n.pl-3,\n.px-3 {\n  padding-left: 1rem !important;\n}\n\n.p-4 {\n  padding: 1.5rem !important;\n}\n\n.pt-4,\n.py-4 {\n  padding-top: 1.5rem !important;\n}\n\n.pr-4,\n.px-4 {\n  padding-right: 1.5rem !important;\n}\n\n.pb-4,\n.py-4 {\n  padding-bottom: 1.5rem !important;\n}\n\n.pl-4,\n.px-4 {\n  padding-left: 1.5rem !important;\n}\n\n.p-5 {\n  padding: 3rem !important;\n}\n\n.pt-5,\n.py-5 {\n  padding-top: 3rem !important;\n}\n\n.pr-5,\n.px-5 {\n  padding-right: 3rem !important;\n}\n\n.pb-5,\n.py-5 {\n  padding-bottom: 3rem !important;\n}\n\n.pl-5,\n.px-5 {\n  padding-left: 3rem !important;\n}\n\n.m-n1 {\n  margin: -0.25rem !important;\n}\n\n.mt-n1,\n.my-n1 {\n  margin-top: -0.25rem !important;\n}\n\n.mr-n1,\n.mx-n1 {\n  margin-right: -0.25rem !important;\n}\n\n.mb-n1,\n.my-n1 {\n  margin-bottom: -0.25rem !important;\n}\n\n.ml-n1,\n.mx-n1 {\n  margin-left: -0.25rem !important;\n}\n\n.m-n2 {\n  margin: -0.5rem !important;\n}\n\n.mt-n2,\n.my-n2 {\n  margin-top: -0.5rem !important;\n}\n\n.mr-n2,\n.mx-n2 {\n  margin-right: -0.5rem !important;\n}\n\n.mb-n2,\n.my-n2 {\n  margin-bottom: -0.5rem !important;\n}\n\n.ml-n2,\n.mx-n2 {\n  margin-left: -0.5rem !important;\n}\n\n.m-n3 {\n  margin: -1rem !important;\n}\n\n.mt-n3,\n.my-n3 {\n  margin-top: -1rem !important;\n}\n\n.mr-n3,\n.mx-n3 {\n  margin-right: -1rem !important;\n}\n\n.mb-n3,\n.my-n3 {\n  margin-bottom: -1rem !important;\n}\n\n.ml-n3,\n.mx-n3 {\n  margin-left: -1rem !important;\n}\n\n.m-n4 {\n  margin: -1.5rem !important;\n}\n\n.mt-n4,\n.my-n4 {\n  margin-top: -1.5rem !important;\n}\n\n.mr-n4,\n.mx-n4 {\n  margin-right: -1.5rem !important;\n}\n\n.mb-n4,\n.my-n4 {\n  margin-bottom: -1.5rem !important;\n}\n\n.ml-n4,\n.mx-n4 {\n  margin-left: -1.5rem !important;\n}\n\n.m-n5 {\n  margin: -3rem !important;\n}\n\n.mt-n5,\n.my-n5 {\n  margin-top: -3rem !important;\n}\n\n.mr-n5,\n.mx-n5 {\n  margin-right: -3rem !important;\n}\n\n.mb-n5,\n.my-n5 {\n  margin-bottom: -3rem !important;\n}\n\n.ml-n5,\n.mx-n5 {\n  margin-left: -3rem !important;\n}\n\n.m-auto {\n  margin: auto !important;\n}\n\n.mt-auto,\n.my-auto {\n  margin-top: auto !important;\n}\n\n.mr-auto,\n.mx-auto {\n  margin-right: auto !important;\n}\n\n.mb-auto,\n.my-auto {\n  margin-bottom: auto !important;\n}\n\n.ml-auto,\n.mx-auto {\n  margin-left: auto !important;\n}\n\n@media (min-width: 576px) {\n  .m-sm-0 {\n    margin: 0 !important;\n  }\n  .mt-sm-0,\n  .my-sm-0 {\n    margin-top: 0 !important;\n  }\n  .mr-sm-0,\n  .mx-sm-0 {\n    margin-right: 0 !important;\n  }\n  .mb-sm-0,\n  .my-sm-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-sm-0,\n  .mx-sm-0 {\n    margin-left: 0 !important;\n  }\n  .m-sm-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-sm-1,\n  .my-sm-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-sm-1,\n  .mx-sm-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-sm-1,\n  .my-sm-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-sm-1,\n  .mx-sm-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-sm-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-sm-2,\n  .my-sm-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-sm-2,\n  .mx-sm-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-sm-2,\n  .my-sm-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-sm-2,\n  .mx-sm-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-sm-3 {\n    margin: 1rem !important;\n  }\n  .mt-sm-3,\n  .my-sm-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-sm-3,\n  .mx-sm-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-sm-3,\n  .my-sm-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-sm-3,\n  .mx-sm-3 {\n    margin-left: 1rem !important;\n  }\n  .m-sm-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-sm-4,\n  .my-sm-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-sm-4,\n  .mx-sm-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-sm-4,\n  .my-sm-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-sm-4,\n  .mx-sm-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-sm-5 {\n    margin: 3rem !important;\n  }\n  .mt-sm-5,\n  .my-sm-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-sm-5,\n  .mx-sm-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-sm-5,\n  .my-sm-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-sm-5,\n  .mx-sm-5 {\n    margin-left: 3rem !important;\n  }\n  .p-sm-0 {\n    padding: 0 !important;\n  }\n  .pt-sm-0,\n  .py-sm-0 {\n    padding-top: 0 !important;\n  }\n  .pr-sm-0,\n  .px-sm-0 {\n    padding-right: 0 !important;\n  }\n  .pb-sm-0,\n  .py-sm-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-sm-0,\n  .px-sm-0 {\n    padding-left: 0 !important;\n  }\n  .p-sm-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-sm-1,\n  .py-sm-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-sm-1,\n  .px-sm-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-sm-1,\n  .py-sm-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-sm-1,\n  .px-sm-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-sm-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-sm-2,\n  .py-sm-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-sm-2,\n  .px-sm-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-sm-2,\n  .py-sm-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-sm-2,\n  .px-sm-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-sm-3 {\n    padding: 1rem !important;\n  }\n  .pt-sm-3,\n  .py-sm-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-sm-3,\n  .px-sm-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-sm-3,\n  .py-sm-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-sm-3,\n  .px-sm-3 {\n    padding-left: 1rem !important;\n  }\n  .p-sm-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-sm-4,\n  .py-sm-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-sm-4,\n  .px-sm-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-sm-4,\n  .py-sm-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-sm-4,\n  .px-sm-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-sm-5 {\n    padding: 3rem !important;\n  }\n  .pt-sm-5,\n  .py-sm-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-sm-5,\n  .px-sm-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-sm-5,\n  .py-sm-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-sm-5,\n  .px-sm-5 {\n    padding-left: 3rem !important;\n  }\n  .m-sm-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-sm-n1,\n  .my-sm-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-sm-n1,\n  .mx-sm-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-sm-n1,\n  .my-sm-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-sm-n1,\n  .mx-sm-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-sm-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-sm-n2,\n  .my-sm-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-sm-n2,\n  .mx-sm-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-sm-n2,\n  .my-sm-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-sm-n2,\n  .mx-sm-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-sm-n3 {\n    margin: -1rem !important;\n  }\n  .mt-sm-n3,\n  .my-sm-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-sm-n3,\n  .mx-sm-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-sm-n3,\n  .my-sm-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-sm-n3,\n  .mx-sm-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-sm-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-sm-n4,\n  .my-sm-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-sm-n4,\n  .mx-sm-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-sm-n4,\n  .my-sm-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-sm-n4,\n  .mx-sm-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-sm-n5 {\n    margin: -3rem !important;\n  }\n  .mt-sm-n5,\n  .my-sm-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-sm-n5,\n  .mx-sm-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-sm-n5,\n  .my-sm-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-sm-n5,\n  .mx-sm-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-sm-auto {\n    margin: auto !important;\n  }\n  .mt-sm-auto,\n  .my-sm-auto {\n    margin-top: auto !important;\n  }\n  .mr-sm-auto,\n  .mx-sm-auto {\n    margin-right: auto !important;\n  }\n  .mb-sm-auto,\n  .my-sm-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-sm-auto,\n  .mx-sm-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .m-md-0 {\n    margin: 0 !important;\n  }\n  .mt-md-0,\n  .my-md-0 {\n    margin-top: 0 !important;\n  }\n  .mr-md-0,\n  .mx-md-0 {\n    margin-right: 0 !important;\n  }\n  .mb-md-0,\n  .my-md-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-md-0,\n  .mx-md-0 {\n    margin-left: 0 !important;\n  }\n  .m-md-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-md-1,\n  .my-md-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-md-1,\n  .mx-md-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-md-1,\n  .my-md-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-md-1,\n  .mx-md-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-md-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-md-2,\n  .my-md-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-md-2,\n  .mx-md-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-md-2,\n  .my-md-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-md-2,\n  .mx-md-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-md-3 {\n    margin: 1rem !important;\n  }\n  .mt-md-3,\n  .my-md-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-md-3,\n  .mx-md-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-md-3,\n  .my-md-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-md-3,\n  .mx-md-3 {\n    margin-left: 1rem !important;\n  }\n  .m-md-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-md-4,\n  .my-md-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-md-4,\n  .mx-md-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-md-4,\n  .my-md-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-md-4,\n  .mx-md-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-md-5 {\n    margin: 3rem !important;\n  }\n  .mt-md-5,\n  .my-md-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-md-5,\n  .mx-md-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-md-5,\n  .my-md-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-md-5,\n  .mx-md-5 {\n    margin-left: 3rem !important;\n  }\n  .p-md-0 {\n    padding: 0 !important;\n  }\n  .pt-md-0,\n  .py-md-0 {\n    padding-top: 0 !important;\n  }\n  .pr-md-0,\n  .px-md-0 {\n    padding-right: 0 !important;\n  }\n  .pb-md-0,\n  .py-md-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-md-0,\n  .px-md-0 {\n    padding-left: 0 !important;\n  }\n  .p-md-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-md-1,\n  .py-md-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-md-1,\n  .px-md-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-md-1,\n  .py-md-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-md-1,\n  .px-md-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-md-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-md-2,\n  .py-md-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-md-2,\n  .px-md-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-md-2,\n  .py-md-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-md-2,\n  .px-md-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-md-3 {\n    padding: 1rem !important;\n  }\n  .pt-md-3,\n  .py-md-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-md-3,\n  .px-md-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-md-3,\n  .py-md-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-md-3,\n  .px-md-3 {\n    padding-left: 1rem !important;\n  }\n  .p-md-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-md-4,\n  .py-md-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-md-4,\n  .px-md-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-md-4,\n  .py-md-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-md-4,\n  .px-md-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-md-5 {\n    padding: 3rem !important;\n  }\n  .pt-md-5,\n  .py-md-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-md-5,\n  .px-md-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-md-5,\n  .py-md-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-md-5,\n  .px-md-5 {\n    padding-left: 3rem !important;\n  }\n  .m-md-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-md-n1,\n  .my-md-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-md-n1,\n  .mx-md-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-md-n1,\n  .my-md-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-md-n1,\n  .mx-md-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-md-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-md-n2,\n  .my-md-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-md-n2,\n  .mx-md-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-md-n2,\n  .my-md-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-md-n2,\n  .mx-md-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-md-n3 {\n    margin: -1rem !important;\n  }\n  .mt-md-n3,\n  .my-md-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-md-n3,\n  .mx-md-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-md-n3,\n  .my-md-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-md-n3,\n  .mx-md-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-md-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-md-n4,\n  .my-md-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-md-n4,\n  .mx-md-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-md-n4,\n  .my-md-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-md-n4,\n  .mx-md-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-md-n5 {\n    margin: -3rem !important;\n  }\n  .mt-md-n5,\n  .my-md-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-md-n5,\n  .mx-md-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-md-n5,\n  .my-md-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-md-n5,\n  .mx-md-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-md-auto {\n    margin: auto !important;\n  }\n  .mt-md-auto,\n  .my-md-auto {\n    margin-top: auto !important;\n  }\n  .mr-md-auto,\n  .mx-md-auto {\n    margin-right: auto !important;\n  }\n  .mb-md-auto,\n  .my-md-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-md-auto,\n  .mx-md-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .m-lg-0 {\n    margin: 0 !important;\n  }\n  .mt-lg-0,\n  .my-lg-0 {\n    margin-top: 0 !important;\n  }\n  .mr-lg-0,\n  .mx-lg-0 {\n    margin-right: 0 !important;\n  }\n  .mb-lg-0,\n  .my-lg-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-lg-0,\n  .mx-lg-0 {\n    margin-left: 0 !important;\n  }\n  .m-lg-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-lg-1,\n  .my-lg-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-lg-1,\n  .mx-lg-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-lg-1,\n  .my-lg-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-lg-1,\n  .mx-lg-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-lg-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-lg-2,\n  .my-lg-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-lg-2,\n  .mx-lg-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-lg-2,\n  .my-lg-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-lg-2,\n  .mx-lg-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-lg-3 {\n    margin: 1rem !important;\n  }\n  .mt-lg-3,\n  .my-lg-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-lg-3,\n  .mx-lg-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-lg-3,\n  .my-lg-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-lg-3,\n  .mx-lg-3 {\n    margin-left: 1rem !important;\n  }\n  .m-lg-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-lg-4,\n  .my-lg-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-lg-4,\n  .mx-lg-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-lg-4,\n  .my-lg-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-lg-4,\n  .mx-lg-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-lg-5 {\n    margin: 3rem !important;\n  }\n  .mt-lg-5,\n  .my-lg-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-lg-5,\n  .mx-lg-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-lg-5,\n  .my-lg-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-lg-5,\n  .mx-lg-5 {\n    margin-left: 3rem !important;\n  }\n  .p-lg-0 {\n    padding: 0 !important;\n  }\n  .pt-lg-0,\n  .py-lg-0 {\n    padding-top: 0 !important;\n  }\n  .pr-lg-0,\n  .px-lg-0 {\n    padding-right: 0 !important;\n  }\n  .pb-lg-0,\n  .py-lg-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-lg-0,\n  .px-lg-0 {\n    padding-left: 0 !important;\n  }\n  .p-lg-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-lg-1,\n  .py-lg-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-lg-1,\n  .px-lg-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-lg-1,\n  .py-lg-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-lg-1,\n  .px-lg-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-lg-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-lg-2,\n  .py-lg-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-lg-2,\n  .px-lg-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-lg-2,\n  .py-lg-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-lg-2,\n  .px-lg-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-lg-3 {\n    padding: 1rem !important;\n  }\n  .pt-lg-3,\n  .py-lg-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-lg-3,\n  .px-lg-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-lg-3,\n  .py-lg-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-lg-3,\n  .px-lg-3 {\n    padding-left: 1rem !important;\n  }\n  .p-lg-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-lg-4,\n  .py-lg-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-lg-4,\n  .px-lg-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-lg-4,\n  .py-lg-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-lg-4,\n  .px-lg-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-lg-5 {\n    padding: 3rem !important;\n  }\n  .pt-lg-5,\n  .py-lg-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-lg-5,\n  .px-lg-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-lg-5,\n  .py-lg-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-lg-5,\n  .px-lg-5 {\n    padding-left: 3rem !important;\n  }\n  .m-lg-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-lg-n1,\n  .my-lg-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-lg-n1,\n  .mx-lg-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-lg-n1,\n  .my-lg-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-lg-n1,\n  .mx-lg-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-lg-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-lg-n2,\n  .my-lg-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-lg-n2,\n  .mx-lg-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-lg-n2,\n  .my-lg-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-lg-n2,\n  .mx-lg-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-lg-n3 {\n    margin: -1rem !important;\n  }\n  .mt-lg-n3,\n  .my-lg-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-lg-n3,\n  .mx-lg-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-lg-n3,\n  .my-lg-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-lg-n3,\n  .mx-lg-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-lg-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-lg-n4,\n  .my-lg-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-lg-n4,\n  .mx-lg-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-lg-n4,\n  .my-lg-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-lg-n4,\n  .mx-lg-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-lg-n5 {\n    margin: -3rem !important;\n  }\n  .mt-lg-n5,\n  .my-lg-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-lg-n5,\n  .mx-lg-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-lg-n5,\n  .my-lg-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-lg-n5,\n  .mx-lg-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-lg-auto {\n    margin: auto !important;\n  }\n  .mt-lg-auto,\n  .my-lg-auto {\n    margin-top: auto !important;\n  }\n  .mr-lg-auto,\n  .mx-lg-auto {\n    margin-right: auto !important;\n  }\n  .mb-lg-auto,\n  .my-lg-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-lg-auto,\n  .mx-lg-auto {\n    margin-left: auto !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .m-xl-0 {\n    margin: 0 !important;\n  }\n  .mt-xl-0,\n  .my-xl-0 {\n    margin-top: 0 !important;\n  }\n  .mr-xl-0,\n  .mx-xl-0 {\n    margin-right: 0 !important;\n  }\n  .mb-xl-0,\n  .my-xl-0 {\n    margin-bottom: 0 !important;\n  }\n  .ml-xl-0,\n  .mx-xl-0 {\n    margin-left: 0 !important;\n  }\n  .m-xl-1 {\n    margin: 0.25rem !important;\n  }\n  .mt-xl-1,\n  .my-xl-1 {\n    margin-top: 0.25rem !important;\n  }\n  .mr-xl-1,\n  .mx-xl-1 {\n    margin-right: 0.25rem !important;\n  }\n  .mb-xl-1,\n  .my-xl-1 {\n    margin-bottom: 0.25rem !important;\n  }\n  .ml-xl-1,\n  .mx-xl-1 {\n    margin-left: 0.25rem !important;\n  }\n  .m-xl-2 {\n    margin: 0.5rem !important;\n  }\n  .mt-xl-2,\n  .my-xl-2 {\n    margin-top: 0.5rem !important;\n  }\n  .mr-xl-2,\n  .mx-xl-2 {\n    margin-right: 0.5rem !important;\n  }\n  .mb-xl-2,\n  .my-xl-2 {\n    margin-bottom: 0.5rem !important;\n  }\n  .ml-xl-2,\n  .mx-xl-2 {\n    margin-left: 0.5rem !important;\n  }\n  .m-xl-3 {\n    margin: 1rem !important;\n  }\n  .mt-xl-3,\n  .my-xl-3 {\n    margin-top: 1rem !important;\n  }\n  .mr-xl-3,\n  .mx-xl-3 {\n    margin-right: 1rem !important;\n  }\n  .mb-xl-3,\n  .my-xl-3 {\n    margin-bottom: 1rem !important;\n  }\n  .ml-xl-3,\n  .mx-xl-3 {\n    margin-left: 1rem !important;\n  }\n  .m-xl-4 {\n    margin: 1.5rem !important;\n  }\n  .mt-xl-4,\n  .my-xl-4 {\n    margin-top: 1.5rem !important;\n  }\n  .mr-xl-4,\n  .mx-xl-4 {\n    margin-right: 1.5rem !important;\n  }\n  .mb-xl-4,\n  .my-xl-4 {\n    margin-bottom: 1.5rem !important;\n  }\n  .ml-xl-4,\n  .mx-xl-4 {\n    margin-left: 1.5rem !important;\n  }\n  .m-xl-5 {\n    margin: 3rem !important;\n  }\n  .mt-xl-5,\n  .my-xl-5 {\n    margin-top: 3rem !important;\n  }\n  .mr-xl-5,\n  .mx-xl-5 {\n    margin-right: 3rem !important;\n  }\n  .mb-xl-5,\n  .my-xl-5 {\n    margin-bottom: 3rem !important;\n  }\n  .ml-xl-5,\n  .mx-xl-5 {\n    margin-left: 3rem !important;\n  }\n  .p-xl-0 {\n    padding: 0 !important;\n  }\n  .pt-xl-0,\n  .py-xl-0 {\n    padding-top: 0 !important;\n  }\n  .pr-xl-0,\n  .px-xl-0 {\n    padding-right: 0 !important;\n  }\n  .pb-xl-0,\n  .py-xl-0 {\n    padding-bottom: 0 !important;\n  }\n  .pl-xl-0,\n  .px-xl-0 {\n    padding-left: 0 !important;\n  }\n  .p-xl-1 {\n    padding: 0.25rem !important;\n  }\n  .pt-xl-1,\n  .py-xl-1 {\n    padding-top: 0.25rem !important;\n  }\n  .pr-xl-1,\n  .px-xl-1 {\n    padding-right: 0.25rem !important;\n  }\n  .pb-xl-1,\n  .py-xl-1 {\n    padding-bottom: 0.25rem !important;\n  }\n  .pl-xl-1,\n  .px-xl-1 {\n    padding-left: 0.25rem !important;\n  }\n  .p-xl-2 {\n    padding: 0.5rem !important;\n  }\n  .pt-xl-2,\n  .py-xl-2 {\n    padding-top: 0.5rem !important;\n  }\n  .pr-xl-2,\n  .px-xl-2 {\n    padding-right: 0.5rem !important;\n  }\n  .pb-xl-2,\n  .py-xl-2 {\n    padding-bottom: 0.5rem !important;\n  }\n  .pl-xl-2,\n  .px-xl-2 {\n    padding-left: 0.5rem !important;\n  }\n  .p-xl-3 {\n    padding: 1rem !important;\n  }\n  .pt-xl-3,\n  .py-xl-3 {\n    padding-top: 1rem !important;\n  }\n  .pr-xl-3,\n  .px-xl-3 {\n    padding-right: 1rem !important;\n  }\n  .pb-xl-3,\n  .py-xl-3 {\n    padding-bottom: 1rem !important;\n  }\n  .pl-xl-3,\n  .px-xl-3 {\n    padding-left: 1rem !important;\n  }\n  .p-xl-4 {\n    padding: 1.5rem !important;\n  }\n  .pt-xl-4,\n  .py-xl-4 {\n    padding-top: 1.5rem !important;\n  }\n  .pr-xl-4,\n  .px-xl-4 {\n    padding-right: 1.5rem !important;\n  }\n  .pb-xl-4,\n  .py-xl-4 {\n    padding-bottom: 1.5rem !important;\n  }\n  .pl-xl-4,\n  .px-xl-4 {\n    padding-left: 1.5rem !important;\n  }\n  .p-xl-5 {\n    padding: 3rem !important;\n  }\n  .pt-xl-5,\n  .py-xl-5 {\n    padding-top: 3rem !important;\n  }\n  .pr-xl-5,\n  .px-xl-5 {\n    padding-right: 3rem !important;\n  }\n  .pb-xl-5,\n  .py-xl-5 {\n    padding-bottom: 3rem !important;\n  }\n  .pl-xl-5,\n  .px-xl-5 {\n    padding-left: 3rem !important;\n  }\n  .m-xl-n1 {\n    margin: -0.25rem !important;\n  }\n  .mt-xl-n1,\n  .my-xl-n1 {\n    margin-top: -0.25rem !important;\n  }\n  .mr-xl-n1,\n  .mx-xl-n1 {\n    margin-right: -0.25rem !important;\n  }\n  .mb-xl-n1,\n  .my-xl-n1 {\n    margin-bottom: -0.25rem !important;\n  }\n  .ml-xl-n1,\n  .mx-xl-n1 {\n    margin-left: -0.25rem !important;\n  }\n  .m-xl-n2 {\n    margin: -0.5rem !important;\n  }\n  .mt-xl-n2,\n  .my-xl-n2 {\n    margin-top: -0.5rem !important;\n  }\n  .mr-xl-n2,\n  .mx-xl-n2 {\n    margin-right: -0.5rem !important;\n  }\n  .mb-xl-n2,\n  .my-xl-n2 {\n    margin-bottom: -0.5rem !important;\n  }\n  .ml-xl-n2,\n  .mx-xl-n2 {\n    margin-left: -0.5rem !important;\n  }\n  .m-xl-n3 {\n    margin: -1rem !important;\n  }\n  .mt-xl-n3,\n  .my-xl-n3 {\n    margin-top: -1rem !important;\n  }\n  .mr-xl-n3,\n  .mx-xl-n3 {\n    margin-right: -1rem !important;\n  }\n  .mb-xl-n3,\n  .my-xl-n3 {\n    margin-bottom: -1rem !important;\n  }\n  .ml-xl-n3,\n  .mx-xl-n3 {\n    margin-left: -1rem !important;\n  }\n  .m-xl-n4 {\n    margin: -1.5rem !important;\n  }\n  .mt-xl-n4,\n  .my-xl-n4 {\n    margin-top: -1.5rem !important;\n  }\n  .mr-xl-n4,\n  .mx-xl-n4 {\n    margin-right: -1.5rem !important;\n  }\n  .mb-xl-n4,\n  .my-xl-n4 {\n    margin-bottom: -1.5rem !important;\n  }\n  .ml-xl-n4,\n  .mx-xl-n4 {\n    margin-left: -1.5rem !important;\n  }\n  .m-xl-n5 {\n    margin: -3rem !important;\n  }\n  .mt-xl-n5,\n  .my-xl-n5 {\n    margin-top: -3rem !important;\n  }\n  .mr-xl-n5,\n  .mx-xl-n5 {\n    margin-right: -3rem !important;\n  }\n  .mb-xl-n5,\n  .my-xl-n5 {\n    margin-bottom: -3rem !important;\n  }\n  .ml-xl-n5,\n  .mx-xl-n5 {\n    margin-left: -3rem !important;\n  }\n  .m-xl-auto {\n    margin: auto !important;\n  }\n  .mt-xl-auto,\n  .my-xl-auto {\n    margin-top: auto !important;\n  }\n  .mr-xl-auto,\n  .mx-xl-auto {\n    margin-right: auto !important;\n  }\n  .mb-xl-auto,\n  .my-xl-auto {\n    margin-bottom: auto !important;\n  }\n  .ml-xl-auto,\n  .mx-xl-auto {\n    margin-left: auto !important;\n  }\n}\n\n.text-monospace {\n  font-family: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !important;\n}\n\n.text-justify {\n  text-align: justify !important;\n}\n\n.text-wrap {\n  white-space: normal !important;\n}\n\n.text-nowrap {\n  white-space: nowrap !important;\n}\n\n.text-truncate {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.text-left {\n  text-align: left !important;\n}\n\n.text-right {\n  text-align: right !important;\n}\n\n.text-center {\n  text-align: center !important;\n}\n\n@media (min-width: 576px) {\n  .text-sm-left {\n    text-align: left !important;\n  }\n  .text-sm-right {\n    text-align: right !important;\n  }\n  .text-sm-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 768px) {\n  .text-md-left {\n    text-align: left !important;\n  }\n  .text-md-right {\n    text-align: right !important;\n  }\n  .text-md-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 992px) {\n  .text-lg-left {\n    text-align: left !important;\n  }\n  .text-lg-right {\n    text-align: right !important;\n  }\n  .text-lg-center {\n    text-align: center !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .text-xl-left {\n    text-align: left !important;\n  }\n  .text-xl-right {\n    text-align: right !important;\n  }\n  .text-xl-center {\n    text-align: center !important;\n  }\n}\n\n.text-lowercase {\n  text-transform: lowercase !important;\n}\n\n.text-uppercase {\n  text-transform: uppercase !important;\n}\n\n.text-capitalize {\n  text-transform: capitalize !important;\n}\n\n.font-weight-light {\n  font-weight: 300 !important;\n}\n\n.font-weight-lighter {\n  font-weight: lighter !important;\n}\n\n.font-weight-normal {\n  font-weight: 400 !important;\n}\n\n.font-weight-bold {\n  font-weight: 700 !important;\n}\n\n.font-weight-bolder {\n  font-weight: bolder !important;\n}\n\n.font-italic {\n  font-style: italic !important;\n}\n\n.text-white {\n  color: #fff !important;\n}\n\n.text-primary {\n  color: #007bff !important;\n}\n\na.text-primary:hover, a.text-primary:focus {\n  color: #0056b3 !important;\n}\n\n.text-secondary {\n  color: #6c757d !important;\n}\n\na.text-secondary:hover, a.text-secondary:focus {\n  color: #494f54 !important;\n}\n\n.text-success {\n  color: #28a745 !important;\n}\n\na.text-success:hover, a.text-success:focus {\n  color: #19692c !important;\n}\n\n.text-info {\n  color: #17a2b8 !important;\n}\n\na.text-info:hover, a.text-info:focus {\n  color: #0f6674 !important;\n}\n\n.text-warning {\n  color: #ffc107 !important;\n}\n\na.text-warning:hover, a.text-warning:focus {\n  color: #ba8b00 !important;\n}\n\n.text-danger {\n  color: #dc3545 !important;\n}\n\na.text-danger:hover, a.text-danger:focus {\n  color: #a71d2a !important;\n}\n\n.text-light {\n  color: #f8f9fa !important;\n}\n\na.text-light:hover, a.text-light:focus {\n  color: #cbd3da !important;\n}\n\n.text-dark {\n  color: #343a40 !important;\n}\n\na.text-dark:hover, a.text-dark:focus {\n  color: #121416 !important;\n}\n\n.text-body {\n  color: #212529 !important;\n}\n\n.text-muted {\n  color: #6c757d !important;\n}\n\n.text-black-50 {\n  color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n  color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.text-decoration-none {\n  text-decoration: none !important;\n}\n\n.text-break {\n  word-break: break-word !important;\n  overflow-wrap: break-word !important;\n}\n\n.text-reset {\n  color: inherit !important;\n}\n\n.visible {\n  visibility: visible !important;\n}\n\n.invisible {\n  visibility: hidden !important;\n}\n\n@media print {\n  *,\n  *::before,\n  *::after {\n    text-shadow: none !important;\n    box-shadow: none !important;\n  }\n  a:not(.btn) {\n    text-decoration: underline;\n  }\n  abbr[title]::after {\n    content: \" (\" attr(title) \")\";\n  }\n  pre {\n    white-space: pre-wrap !important;\n  }\n  pre,\n  blockquote {\n    border: 1px solid #adb5bd;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  @page {\n    size: a3;\n  }\n  body {\n    min-width: 992px !important;\n  }\n  .container {\n    min-width: 992px !important;\n  }\n  .navbar {\n    display: none;\n  }\n  .badge {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #dee2e6 !important;\n  }\n  .table-dark {\n    color: inherit;\n  }\n  .table-dark th,\n  .table-dark td,\n  .table-dark thead th,\n  .table-dark tbody + tbody {\n    border-color: #dee2e6;\n  }\n  .table .thead-dark th {\n    color: inherit;\n    border-color: #dee2e6;\n  }\n}\n/*# sourceMappingURL=bootstrap.css.map */"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/bootstrap/dist/js/bootstrap.bundle.js",
    "content": "/*!\n  * Bootstrap v4.3.1 (https://getbootstrap.com/)\n  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'jquery'], factory) :\n  (global = global || self, factory(global.bootstrap = {}, global.jQuery));\n}(this, function (exports, $) { 'use strict';\n\n  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function _objectSpread(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n      var ownKeys = Object.keys(source);\n\n      if (typeof Object.getOwnPropertySymbols === 'function') {\n        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n          return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n        }));\n      }\n\n      ownKeys.forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    }\n\n    return target;\n  }\n\n  function _inheritsLoose(subClass, superClass) {\n    subClass.prototype = Object.create(superClass.prototype);\n    subClass.prototype.constructor = subClass;\n    subClass.__proto__ = superClass;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): util.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Private TransitionEnd Helpers\n   * ------------------------------------------------------------------------\n   */\n\n  var TRANSITION_END = 'transitionend';\n  var MAX_UID = 1000000;\n  var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  function toType(obj) {\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  }\n\n  function getSpecialTransitionEndEvent() {\n    return {\n      bindType: TRANSITION_END,\n      delegateType: TRANSITION_END,\n      handle: function handle(event) {\n        if ($(event.target).is(this)) {\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n        }\n\n        return undefined; // eslint-disable-line no-undefined\n      }\n    };\n  }\n\n  function transitionEndEmulator(duration) {\n    var _this = this;\n\n    var called = false;\n    $(this).one(Util.TRANSITION_END, function () {\n      called = true;\n    });\n    setTimeout(function () {\n      if (!called) {\n        Util.triggerTransitionEnd(_this);\n      }\n    }, duration);\n    return this;\n  }\n\n  function setTransitionEndSupport() {\n    $.fn.emulateTransitionEnd = transitionEndEmulator;\n    $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n  }\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  var Util = {\n    TRANSITION_END: 'bsTransitionEnd',\n    getUID: function getUID(prefix) {\n      do {\n        // eslint-disable-next-line no-bitwise\n        prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n      } while (document.getElementById(prefix));\n\n      return prefix;\n    },\n    getSelectorFromElement: function getSelectorFromElement(element) {\n      var selector = element.getAttribute('data-target');\n\n      if (!selector || selector === '#') {\n        var hrefAttr = element.getAttribute('href');\n        selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';\n      }\n\n      try {\n        return document.querySelector(selector) ? selector : null;\n      } catch (err) {\n        return null;\n      }\n    },\n    getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n      if (!element) {\n        return 0;\n      } // Get transition-duration of the element\n\n\n      var transitionDuration = $(element).css('transition-duration');\n      var transitionDelay = $(element).css('transition-delay');\n      var floatTransitionDuration = parseFloat(transitionDuration);\n      var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n      if (!floatTransitionDuration && !floatTransitionDelay) {\n        return 0;\n      } // If multiple durations are defined, take the first\n\n\n      transitionDuration = transitionDuration.split(',')[0];\n      transitionDelay = transitionDelay.split(',')[0];\n      return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n    },\n    reflow: function reflow(element) {\n      return element.offsetHeight;\n    },\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\n      $(element).trigger(TRANSITION_END);\n    },\n    // TODO: Remove in v5\n    supportsTransitionEnd: function supportsTransitionEnd() {\n      return Boolean(TRANSITION_END);\n    },\n    isElement: function isElement(obj) {\n      return (obj[0] || obj).nodeType;\n    },\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n      for (var property in configTypes) {\n        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n          var expectedTypes = configTypes[property];\n          var value = config[property];\n          var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n          if (!new RegExp(expectedTypes).test(valueType)) {\n            throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n          }\n        }\n      }\n    },\n    findShadowRoot: function findShadowRoot(element) {\n      if (!document.documentElement.attachShadow) {\n        return null;\n      } // Can find the shadow root otherwise it'll return the document\n\n\n      if (typeof element.getRootNode === 'function') {\n        var root = element.getRootNode();\n        return root instanceof ShadowRoot ? root : null;\n      }\n\n      if (element instanceof ShadowRoot) {\n        return element;\n      } // when we don't find a shadow root\n\n\n      if (!element.parentNode) {\n        return null;\n      }\n\n      return Util.findShadowRoot(element.parentNode);\n    }\n  };\n  setTransitionEndSupport();\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME = 'alert';\n  var VERSION = '4.3.1';\n  var DATA_KEY = 'bs.alert';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n  var Selector = {\n    DISMISS: '[data-dismiss=\"alert\"]'\n  };\n  var Event = {\n    CLOSE: \"close\" + EVENT_KEY,\n    CLOSED: \"closed\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    ALERT: 'alert',\n    FADE: 'fade',\n    SHOW: 'show'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Alert =\n  /*#__PURE__*/\n  function () {\n    function Alert(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Alert.prototype;\n\n    // Public\n    _proto.close = function close(element) {\n      var rootElement = this._element;\n\n      if (element) {\n        rootElement = this._getRootElement(element);\n      }\n\n      var customEvent = this._triggerCloseEvent(rootElement);\n\n      if (customEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._removeElement(rootElement);\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._getRootElement = function _getRootElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      var parent = false;\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      if (!parent) {\n        parent = $(element).closest(\".\" + ClassName.ALERT)[0];\n      }\n\n      return parent;\n    };\n\n    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n      var closeEvent = $.Event(Event.CLOSE);\n      $(element).trigger(closeEvent);\n      return closeEvent;\n    };\n\n    _proto._removeElement = function _removeElement(element) {\n      var _this = this;\n\n      $(element).removeClass(ClassName.SHOW);\n\n      if (!$(element).hasClass(ClassName.FADE)) {\n        this._destroyElement(element);\n\n        return;\n      }\n\n      var transitionDuration = Util.getTransitionDurationFromElement(element);\n      $(element).one(Util.TRANSITION_END, function (event) {\n        return _this._destroyElement(element, event);\n      }).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto._destroyElement = function _destroyElement(element) {\n      $(element).detach().trigger(Event.CLOSED).remove();\n    } // Static\n    ;\n\n    Alert._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY);\n\n        if (!data) {\n          data = new Alert(this);\n          $element.data(DATA_KEY, data);\n        }\n\n        if (config === 'close') {\n          data[config](this);\n        }\n      });\n    };\n\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\n      return function (event) {\n        if (event) {\n          event.preventDefault();\n        }\n\n        alertInstance.close(this);\n      };\n    };\n\n    _createClass(Alert, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n\n    return Alert;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME] = Alert._jQueryInterface;\n  $.fn[NAME].Constructor = Alert;\n\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Alert._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$1 = 'button';\n  var VERSION$1 = '4.3.1';\n  var DATA_KEY$1 = 'bs.button';\n  var EVENT_KEY$1 = \".\" + DATA_KEY$1;\n  var DATA_API_KEY$1 = '.data-api';\n  var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1];\n  var ClassName$1 = {\n    ACTIVE: 'active',\n    BUTTON: 'btn',\n    FOCUS: 'focus'\n  };\n  var Selector$1 = {\n    DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n    DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n    INPUT: 'input:not([type=\"hidden\"])',\n    ACTIVE: '.active',\n    BUTTON: '.btn'\n  };\n  var Event$1 = {\n    CLICK_DATA_API: \"click\" + EVENT_KEY$1 + DATA_API_KEY$1,\n    FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY$1 + DATA_API_KEY$1 + \" \" + (\"blur\" + EVENT_KEY$1 + DATA_API_KEY$1)\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Button =\n  /*#__PURE__*/\n  function () {\n    function Button(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Button.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      var triggerChangeEvent = true;\n      var addAriaPressed = true;\n      var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];\n\n      if (rootElement) {\n        var input = this._element.querySelector(Selector$1.INPUT);\n\n        if (input) {\n          if (input.type === 'radio') {\n            if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) {\n              triggerChangeEvent = false;\n            } else {\n              var activeElement = rootElement.querySelector(Selector$1.ACTIVE);\n\n              if (activeElement) {\n                $(activeElement).removeClass(ClassName$1.ACTIVE);\n              }\n            }\n          }\n\n          if (triggerChangeEvent) {\n            if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n              return;\n            }\n\n            input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);\n            $(input).trigger('change');\n          }\n\n          input.focus();\n          addAriaPressed = false;\n        }\n      }\n\n      if (addAriaPressed) {\n        this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));\n      }\n\n      if (triggerChangeEvent) {\n        $(this._element).toggleClass(ClassName$1.ACTIVE);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$1);\n      this._element = null;\n    } // Static\n    ;\n\n    Button._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$1);\n\n        if (!data) {\n          data = new Button(this);\n          $(this).data(DATA_KEY$1, data);\n        }\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Button, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$1;\n      }\n    }]);\n\n    return Button;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    event.preventDefault();\n    var button = event.target;\n\n    if (!$(button).hasClass(ClassName$1.BUTTON)) {\n      button = $(button).closest(Selector$1.BUTTON);\n    }\n\n    Button._jQueryInterface.call($(button), 'toggle');\n  }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    var button = $(event.target).closest(Selector$1.BUTTON)[0];\n    $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$1] = Button._jQueryInterface;\n  $.fn[NAME$1].Constructor = Button;\n\n  $.fn[NAME$1].noConflict = function () {\n    $.fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n    return Button._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$2 = 'carousel';\n  var VERSION$2 = '4.3.1';\n  var DATA_KEY$2 = 'bs.carousel';\n  var EVENT_KEY$2 = \".\" + DATA_KEY$2;\n  var DATA_API_KEY$2 = '.data-api';\n  var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2];\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  var SWIPE_THRESHOLD = 40;\n  var Default = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  var DefaultType = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  var Direction = {\n    NEXT: 'next',\n    PREV: 'prev',\n    LEFT: 'left',\n    RIGHT: 'right'\n  };\n  var Event$2 = {\n    SLIDE: \"slide\" + EVENT_KEY$2,\n    SLID: \"slid\" + EVENT_KEY$2,\n    KEYDOWN: \"keydown\" + EVENT_KEY$2,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$2,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$2,\n    TOUCHSTART: \"touchstart\" + EVENT_KEY$2,\n    TOUCHMOVE: \"touchmove\" + EVENT_KEY$2,\n    TOUCHEND: \"touchend\" + EVENT_KEY$2,\n    POINTERDOWN: \"pointerdown\" + EVENT_KEY$2,\n    POINTERUP: \"pointerup\" + EVENT_KEY$2,\n    DRAG_START: \"dragstart\" + EVENT_KEY$2,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$2 + DATA_API_KEY$2,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$2 + DATA_API_KEY$2\n  };\n  var ClassName$2 = {\n    CAROUSEL: 'carousel',\n    ACTIVE: 'active',\n    SLIDE: 'slide',\n    RIGHT: 'carousel-item-right',\n    LEFT: 'carousel-item-left',\n    NEXT: 'carousel-item-next',\n    PREV: 'carousel-item-prev',\n    ITEM: 'carousel-item',\n    POINTER_EVENT: 'pointer-event'\n  };\n  var Selector$2 = {\n    ACTIVE: '.active',\n    ACTIVE_ITEM: '.active.carousel-item',\n    ITEM: '.carousel-item',\n    ITEM_IMG: '.carousel-item img',\n    NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n    INDICATORS: '.carousel-indicators',\n    DATA_SLIDE: '[data-slide], [data-slide-to]',\n    DATA_RIDE: '[data-ride=\"carousel\"]'\n  };\n  var PointerType = {\n    TOUCH: 'touch',\n    PEN: 'pen'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Carousel =\n  /*#__PURE__*/\n  function () {\n    function Carousel(element, config) {\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Carousel.prototype;\n\n    // Public\n    _proto.next = function next() {\n      if (!this._isSliding) {\n        this._slide(Direction.NEXT);\n      }\n    };\n\n    _proto.nextWhenVisible = function nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {\n        this.next();\n      }\n    };\n\n    _proto.prev = function prev() {\n      if (!this._isSliding) {\n        this._slide(Direction.PREV);\n      }\n    };\n\n    _proto.pause = function pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (this._element.querySelector(Selector$2.NEXT_PREV)) {\n        Util.triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    };\n\n    _proto.cycle = function cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config.interval && !this._isPaused) {\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    };\n\n    _proto.to = function to(index) {\n      var _this = this;\n\n      this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        $(this._element).one(Event$2.SLID, function () {\n          return _this.to(index);\n        });\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n      this._slide(direction, this._items[index]);\n    };\n\n    _proto.dispose = function dispose() {\n      $(this._element).off(EVENT_KEY$2);\n      $.removeData(this._element, DATA_KEY$2);\n      this._items = null;\n      this._config = null;\n      this._element = null;\n      this._interval = null;\n      this._isPaused = null;\n      this._isSliding = null;\n      this._activeElement = null;\n      this._indicatorsElement = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default, config);\n      Util.typeCheckConfig(NAME$2, config, DefaultType);\n      return config;\n    };\n\n    _proto._handleSwipe = function _handleSwipe() {\n      var absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      var direction = absDeltax / this.touchDeltaX; // swipe left\n\n      if (direction > 0) {\n        this.prev();\n      } // swipe right\n\n\n      if (direction < 0) {\n        this.next();\n      }\n    };\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this2 = this;\n\n      if (this._config.keyboard) {\n        $(this._element).on(Event$2.KEYDOWN, function (event) {\n          return _this2._keydown(event);\n        });\n      }\n\n      if (this._config.pause === 'hover') {\n        $(this._element).on(Event$2.MOUSEENTER, function (event) {\n          return _this2.pause(event);\n        }).on(Event$2.MOUSELEAVE, function (event) {\n          return _this2.cycle(event);\n        });\n      }\n\n      if (this._config.touch) {\n        this._addTouchEventListeners();\n      }\n    };\n\n    _proto._addTouchEventListeners = function _addTouchEventListeners() {\n      var _this3 = this;\n\n      if (!this._touchSupported) {\n        return;\n      }\n\n      var start = function start(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchStartX = event.originalEvent.clientX;\n        } else if (!_this3._pointerEvent) {\n          _this3.touchStartX = event.originalEvent.touches[0].clientX;\n        }\n      };\n\n      var move = function move(event) {\n        // ensure swiping with one touch and not pinching\n        if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n          _this3.touchDeltaX = 0;\n        } else {\n          _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;\n        }\n      };\n\n      var end = function end(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;\n        }\n\n        _this3._handleSwipe();\n\n        if (_this3._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          _this3.pause();\n\n          if (_this3.touchTimeout) {\n            clearTimeout(_this3.touchTimeout);\n          }\n\n          _this3.touchTimeout = setTimeout(function (event) {\n            return _this3.cycle(event);\n          }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);\n        }\n      };\n\n      $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) {\n        return e.preventDefault();\n      });\n\n      if (this._pointerEvent) {\n        $(this._element).on(Event$2.POINTERDOWN, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.POINTERUP, function (event) {\n          return end(event);\n        });\n\n        this._element.classList.add(ClassName$2.POINTER_EVENT);\n      } else {\n        $(this._element).on(Event$2.TOUCHSTART, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.TOUCHMOVE, function (event) {\n          return move(event);\n        });\n        $(this._element).on(Event$2.TOUCHEND, function (event) {\n          return end(event);\n        });\n      }\n    };\n\n    _proto._keydown = function _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      switch (event.which) {\n        case ARROW_LEFT_KEYCODE:\n          event.preventDefault();\n          this.prev();\n          break;\n\n        case ARROW_RIGHT_KEYCODE:\n          event.preventDefault();\n          this.next();\n          break;\n\n        default:\n      }\n    };\n\n    _proto._getItemIndex = function _getItemIndex(element) {\n      this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : [];\n      return this._items.indexOf(element);\n    };\n\n    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n      var isNextDirection = direction === Direction.NEXT;\n      var isPrevDirection = direction === Direction.PREV;\n\n      var activeIndex = this._getItemIndex(activeElement);\n\n      var lastItemIndex = this._items.length - 1;\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n      if (isGoingToWrap && !this._config.wrap) {\n        return activeElement;\n      }\n\n      var delta = direction === Direction.PREV ? -1 : 1;\n      var itemIndex = (activeIndex + delta) % this._items.length;\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n    };\n\n    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      var targetIndex = this._getItemIndex(relatedTarget);\n\n      var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM));\n\n      var slideEvent = $.Event(Event$2.SLIDE, {\n        relatedTarget: relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n      $(this._element).trigger(slideEvent);\n      return slideEvent;\n    };\n\n    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE));\n        $(indicators).removeClass(ClassName$2.ACTIVE);\n\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n        if (nextIndicator) {\n          $(nextIndicator).addClass(ClassName$2.ACTIVE);\n        }\n      }\n    };\n\n    _proto._slide = function _slide(direction, element) {\n      var _this4 = this;\n\n      var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeElementIndex = this._getItemIndex(activeElement);\n\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n      var nextElementIndex = this._getItemIndex(nextElement);\n\n      var isCycling = Boolean(this._interval);\n      var directionalClassName;\n      var orderClassName;\n      var eventDirectionName;\n\n      if (direction === Direction.NEXT) {\n        directionalClassName = ClassName$2.LEFT;\n        orderClassName = ClassName$2.NEXT;\n        eventDirectionName = Direction.LEFT;\n      } else {\n        directionalClassName = ClassName$2.RIGHT;\n        orderClassName = ClassName$2.PREV;\n        eventDirectionName = Direction.RIGHT;\n      }\n\n      if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) {\n        this._isSliding = false;\n        return;\n      }\n\n      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      var slidEvent = $.Event(Event$2.SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      });\n\n      if ($(this._element).hasClass(ClassName$2.SLIDE)) {\n        $(nextElement).addClass(orderClassName);\n        Util.reflow(nextElement);\n        $(activeElement).addClass(directionalClassName);\n        $(nextElement).addClass(directionalClassName);\n        var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);\n\n        if (nextElementInterval) {\n          this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n          this._config.interval = nextElementInterval;\n        } else {\n          this._config.interval = this._config.defaultInterval || this._config.interval;\n        }\n\n        var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n        $(activeElement).one(Util.TRANSITION_END, function () {\n          $(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName$2.ACTIVE);\n          $(activeElement).removeClass(ClassName$2.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n          _this4._isSliding = false;\n          setTimeout(function () {\n            return $(_this4._element).trigger(slidEvent);\n          }, 0);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        $(activeElement).removeClass(ClassName$2.ACTIVE);\n        $(nextElement).addClass(ClassName$2.ACTIVE);\n        this._isSliding = false;\n        $(this._element).trigger(slidEvent);\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    } // Static\n    ;\n\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$2);\n\n        var _config = _objectSpread({}, Default, $(this).data());\n\n        if (typeof config === 'object') {\n          _config = _objectSpread({}, _config, config);\n        }\n\n        var action = typeof config === 'string' ? config : _config.slide;\n\n        if (!data) {\n          data = new Carousel(this, _config);\n          $(this).data(DATA_KEY$2, data);\n        }\n\n        if (typeof config === 'number') {\n          data.to(config);\n        } else if (typeof action === 'string') {\n          if (typeof data[action] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n          }\n\n          data[action]();\n        } else if (_config.interval && _config.ride) {\n          data.pause();\n          data.cycle();\n        }\n      });\n    };\n\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n      var selector = Util.getSelectorFromElement(this);\n\n      if (!selector) {\n        return;\n      }\n\n      var target = $(selector)[0];\n\n      if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) {\n        return;\n      }\n\n      var config = _objectSpread({}, $(target).data(), $(this).data());\n\n      var slideIndex = this.getAttribute('data-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel._jQueryInterface.call($(target), config);\n\n      if (slideIndex) {\n        $(target).data(DATA_KEY$2).to(slideIndex);\n      }\n\n      event.preventDefault();\n    };\n\n    _createClass(Carousel, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$2;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n\n    return Carousel;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler);\n  $(window).on(Event$2.LOAD_DATA_API, function () {\n    var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE));\n\n    for (var i = 0, len = carousels.length; i < len; i++) {\n      var $carousel = $(carousels[i]);\n\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$2] = Carousel._jQueryInterface;\n  $.fn[NAME$2].Constructor = Carousel;\n\n  $.fn[NAME$2].noConflict = function () {\n    $.fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n    return Carousel._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$3 = 'collapse';\n  var VERSION$3 = '4.3.1';\n  var DATA_KEY$3 = 'bs.collapse';\n  var EVENT_KEY$3 = \".\" + DATA_KEY$3;\n  var DATA_API_KEY$3 = '.data-api';\n  var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3];\n  var Default$1 = {\n    toggle: true,\n    parent: ''\n  };\n  var DefaultType$1 = {\n    toggle: 'boolean',\n    parent: '(string|element)'\n  };\n  var Event$3 = {\n    SHOW: \"show\" + EVENT_KEY$3,\n    SHOWN: \"shown\" + EVENT_KEY$3,\n    HIDE: \"hide\" + EVENT_KEY$3,\n    HIDDEN: \"hidden\" + EVENT_KEY$3,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$3 + DATA_API_KEY$3\n  };\n  var ClassName$3 = {\n    SHOW: 'show',\n    COLLAPSE: 'collapse',\n    COLLAPSING: 'collapsing',\n    COLLAPSED: 'collapsed'\n  };\n  var Dimension = {\n    WIDTH: 'width',\n    HEIGHT: 'height'\n  };\n  var Selector$3 = {\n    ACTIVES: '.show, .collapsing',\n    DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Collapse =\n  /*#__PURE__*/\n  function () {\n    function Collapse(element, config) {\n      this._isTransitioning = false;\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._triggerArray = [].slice.call(document.querySelectorAll(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n      var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE));\n\n      for (var i = 0, len = toggleList.length; i < len; i++) {\n        var elem = toggleList[i];\n        var selector = Util.getSelectorFromElement(elem);\n        var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {\n          return foundElem === element;\n        });\n\n        if (selector !== null && filterElement.length > 0) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._parent = this._config.parent ? this._getParent() : null;\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    var _proto = Collapse.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if ($(this._element).hasClass(ClassName$3.SHOW)) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var actives;\n      var activesData;\n\n      if (this._parent) {\n        actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) {\n          if (typeof _this._config.parent === 'string') {\n            return elem.getAttribute('data-parent') === _this._config.parent;\n          }\n\n          return elem.classList.contains(ClassName$3.COLLAPSE);\n        });\n\n        if (actives.length === 0) {\n          actives = null;\n        }\n      }\n\n      if (actives) {\n        activesData = $(actives).not(this._selector).data(DATA_KEY$3);\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      var startEvent = $.Event(Event$3.SHOW);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (actives) {\n        Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');\n\n        if (!activesData) {\n          $(actives).data(DATA_KEY$3, null);\n        }\n      }\n\n      var dimension = this._getDimension();\n\n      $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING);\n      this._element.style[dimension] = 0;\n\n      if (this._triggerArray.length) {\n        $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true);\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW);\n        _this._element.style[dimension] = '';\n\n        _this.setTransitioning(false);\n\n        $(_this._element).trigger(Event$3.SHOWN);\n      };\n\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      var scrollSize = \"scroll\" + capitalizedDimension;\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      this._element.style[dimension] = this._element[scrollSize] + \"px\";\n    };\n\n    _proto.hide = function hide() {\n      var _this2 = this;\n\n      if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var startEvent = $.Event(Event$3.HIDE);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      var dimension = this._getDimension();\n\n      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n      Util.reflow(this._element);\n      $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW);\n      var triggerArrayLength = this._triggerArray.length;\n\n      if (triggerArrayLength > 0) {\n        for (var i = 0; i < triggerArrayLength; i++) {\n          var trigger = this._triggerArray[i];\n          var selector = Util.getSelectorFromElement(trigger);\n\n          if (selector !== null) {\n            var $elem = $([].slice.call(document.querySelectorAll(selector)));\n\n            if (!$elem.hasClass(ClassName$3.SHOW)) {\n              $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false);\n            }\n          }\n        }\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        _this2.setTransitioning(false);\n\n        $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN);\n      };\n\n      this._element.style[dimension] = '';\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto.setTransitioning = function setTransitioning(isTransitioning) {\n      this._isTransitioning = isTransitioning;\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$3);\n      this._config = null;\n      this._parent = null;\n      this._element = null;\n      this._triggerArray = null;\n      this._isTransitioning = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$1, config);\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      Util.typeCheckConfig(NAME$3, config, DefaultType$1);\n      return config;\n    };\n\n    _proto._getDimension = function _getDimension() {\n      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n    };\n\n    _proto._getParent = function _getParent() {\n      var _this3 = this;\n\n      var parent;\n\n      if (Util.isElement(this._config.parent)) {\n        parent = this._config.parent; // It's a jQuery object\n\n        if (typeof this._config.parent.jquery !== 'undefined') {\n          parent = this._config.parent[0];\n        }\n      } else {\n        parent = document.querySelector(this._config.parent);\n      }\n\n      var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n      var children = [].slice.call(parent.querySelectorAll(selector));\n      $(children).each(function (i, element) {\n        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n      });\n      return parent;\n    };\n\n    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n      var isOpen = $(element).hasClass(ClassName$3.SHOW);\n\n      if (triggerArray.length) {\n        $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n      }\n    } // Static\n    ;\n\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      return selector ? document.querySelector(selector) : null;\n    };\n\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$3);\n\n        var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});\n\n        if (!data && _config.toggle && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        if (!data) {\n          data = new Collapse(this, _config);\n          $this.data(DATA_KEY$3, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Collapse, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$3;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$1;\n      }\n    }]);\n\n    return Collapse;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.currentTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    var $trigger = $(this);\n    var selector = Util.getSelectorFromElement(this);\n    var selectors = [].slice.call(document.querySelectorAll(selector));\n    $(selectors).each(function () {\n      var $target = $(this);\n      var data = $target.data(DATA_KEY$3);\n      var config = data ? 'toggle' : $trigger.data();\n\n      Collapse._jQueryInterface.call($target, config);\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$3] = Collapse._jQueryInterface;\n  $.fn[NAME$3].Constructor = Collapse;\n\n  $.fn[NAME$3].noConflict = function () {\n    $.fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n    return Collapse._jQueryInterface;\n  };\n\n  /**!\n   * @fileOverview Kickass library to create and place poppers near their reference elements.\n   * @version 1.14.7\n   * @license\n   * Copyright (c) 2016 Federico Zivolo and contributors\n   *\n   * Permission is hereby granted, free of charge, to any person obtaining a copy\n   * of this software and associated documentation files (the \"Software\"), to deal\n   * in the Software without restriction, including without limitation the rights\n   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n   * copies of the Software, and to permit persons to whom the Software is\n   * furnished to do so, subject to the following conditions:\n   *\n   * The above copyright notice and this permission notice shall be included in all\n   * copies or substantial portions of the Software.\n   *\n   * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n   * SOFTWARE.\n   */\n  var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\n\n  var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox'];\n  var timeoutDuration = 0;\n  for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) {\n    if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) {\n      timeoutDuration = 1;\n      break;\n    }\n  }\n\n  function microtaskDebounce(fn) {\n    var called = false;\n    return function () {\n      if (called) {\n        return;\n      }\n      called = true;\n      window.Promise.resolve().then(function () {\n        called = false;\n        fn();\n      });\n    };\n  }\n\n  function taskDebounce(fn) {\n    var scheduled = false;\n    return function () {\n      if (!scheduled) {\n        scheduled = true;\n        setTimeout(function () {\n          scheduled = false;\n          fn();\n        }, timeoutDuration);\n      }\n    };\n  }\n\n  var supportsMicroTasks = isBrowser && window.Promise;\n\n  /**\n  * Create a debounced version of a method, that's asynchronously deferred\n  * but called in the minimum time possible.\n  *\n  * @method\n  * @memberof Popper.Utils\n  * @argument {Function} fn\n  * @returns {Function}\n  */\n  var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce;\n\n  /**\n   * Check if the given variable is a function\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Any} functionToCheck - variable to check\n   * @returns {Boolean} answer to: is a function?\n   */\n  function isFunction(functionToCheck) {\n    var getType = {};\n    return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';\n  }\n\n  /**\n   * Get CSS computed property of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Eement} element\n   * @argument {String} property\n   */\n  function getStyleComputedProperty(element, property) {\n    if (element.nodeType !== 1) {\n      return [];\n    }\n    // NOTE: 1 DOM access here\n    var window = element.ownerDocument.defaultView;\n    var css = window.getComputedStyle(element, null);\n    return property ? css[property] : css;\n  }\n\n  /**\n   * Returns the parentNode or the host of the element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} parent\n   */\n  function getParentNode(element) {\n    if (element.nodeName === 'HTML') {\n      return element;\n    }\n    return element.parentNode || element.host;\n  }\n\n  /**\n   * Returns the scrolling parent of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} scroll parent\n   */\n  function getScrollParent(element) {\n    // Return body, `getScroll` will take care to get the correct `scrollTop` from it\n    if (!element) {\n      return document.body;\n    }\n\n    switch (element.nodeName) {\n      case 'HTML':\n      case 'BODY':\n        return element.ownerDocument.body;\n      case '#document':\n        return element.body;\n    }\n\n    // Firefox want us to check `-x` and `-y` variations as well\n\n    var _getStyleComputedProp = getStyleComputedProperty(element),\n        overflow = _getStyleComputedProp.overflow,\n        overflowX = _getStyleComputedProp.overflowX,\n        overflowY = _getStyleComputedProp.overflowY;\n\n    if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n      return element;\n    }\n\n    return getScrollParent(getParentNode(element));\n  }\n\n  var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode);\n  var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent);\n\n  /**\n   * Determines if the browser is Internet Explorer\n   * @method\n   * @memberof Popper.Utils\n   * @param {Number} version to check\n   * @returns {Boolean} isIE\n   */\n  function isIE(version) {\n    if (version === 11) {\n      return isIE11;\n    }\n    if (version === 10) {\n      return isIE10;\n    }\n    return isIE11 || isIE10;\n  }\n\n  /**\n   * Returns the offset parent of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} offset parent\n   */\n  function getOffsetParent(element) {\n    if (!element) {\n      return document.documentElement;\n    }\n\n    var noOffsetParent = isIE(10) ? document.body : null;\n\n    // NOTE: 1 DOM access here\n    var offsetParent = element.offsetParent || null;\n    // Skip hidden elements which don't have an offsetParent\n    while (offsetParent === noOffsetParent && element.nextElementSibling) {\n      offsetParent = (element = element.nextElementSibling).offsetParent;\n    }\n\n    var nodeName = offsetParent && offsetParent.nodeName;\n\n    if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') {\n      return element ? element.ownerDocument.documentElement : document.documentElement;\n    }\n\n    // .offsetParent will return the closest TH, TD or TABLE in case\n    // no offsetParent is present, I hate this job...\n    if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') {\n      return getOffsetParent(offsetParent);\n    }\n\n    return offsetParent;\n  }\n\n  function isOffsetContainer(element) {\n    var nodeName = element.nodeName;\n\n    if (nodeName === 'BODY') {\n      return false;\n    }\n    return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element;\n  }\n\n  /**\n   * Finds the root node (document, shadowDOM root) of the given element\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} node\n   * @returns {Element} root node\n   */\n  function getRoot(node) {\n    if (node.parentNode !== null) {\n      return getRoot(node.parentNode);\n    }\n\n    return node;\n  }\n\n  /**\n   * Finds the offset parent common to the two provided nodes\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element1\n   * @argument {Element} element2\n   * @returns {Element} common offset parent\n   */\n  function findCommonOffsetParent(element1, element2) {\n    // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n    if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) {\n      return document.documentElement;\n    }\n\n    // Here we make sure to give as \"start\" the element that comes first in the DOM\n    var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING;\n    var start = order ? element1 : element2;\n    var end = order ? element2 : element1;\n\n    // Get common ancestor container\n    var range = document.createRange();\n    range.setStart(start, 0);\n    range.setEnd(end, 0);\n    var commonAncestorContainer = range.commonAncestorContainer;\n\n    // Both nodes are inside #document\n\n    if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) {\n      if (isOffsetContainer(commonAncestorContainer)) {\n        return commonAncestorContainer;\n      }\n\n      return getOffsetParent(commonAncestorContainer);\n    }\n\n    // one of the nodes is inside shadowDOM, find which one\n    var element1root = getRoot(element1);\n    if (element1root.host) {\n      return findCommonOffsetParent(element1root.host, element2);\n    } else {\n      return findCommonOffsetParent(element1, getRoot(element2).host);\n    }\n  }\n\n  /**\n   * Gets the scroll value of the given element in the given side (top and left)\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @argument {String} side `top` or `left`\n   * @returns {number} amount of scrolled pixels\n   */\n  function getScroll(element) {\n    var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';\n\n    var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft';\n    var nodeName = element.nodeName;\n\n    if (nodeName === 'BODY' || nodeName === 'HTML') {\n      var html = element.ownerDocument.documentElement;\n      var scrollingElement = element.ownerDocument.scrollingElement || html;\n      return scrollingElement[upperSide];\n    }\n\n    return element[upperSide];\n  }\n\n  /*\n   * Sum or subtract the element scroll values (left and top) from a given rect object\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} rect - Rect object you want to change\n   * @param {HTMLElement} element - The element from the function reads the scroll values\n   * @param {Boolean} subtract - set to true if you want to subtract the scroll values\n   * @return {Object} rect - The modifier rect object\n   */\n  function includeScroll(rect, element) {\n    var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    var scrollTop = getScroll(element, 'top');\n    var scrollLeft = getScroll(element, 'left');\n    var modifier = subtract ? -1 : 1;\n    rect.top += scrollTop * modifier;\n    rect.bottom += scrollTop * modifier;\n    rect.left += scrollLeft * modifier;\n    rect.right += scrollLeft * modifier;\n    return rect;\n  }\n\n  /*\n   * Helper to detect borders of a given element\n   * @method\n   * @memberof Popper.Utils\n   * @param {CSSStyleDeclaration} styles\n   * Result of `getStyleComputedProperty` on the given element\n   * @param {String} axis - `x` or `y`\n   * @return {number} borders - The borders size of the given axis\n   */\n\n  function getBordersSize(styles, axis) {\n    var sideA = axis === 'x' ? 'Left' : 'Top';\n    var sideB = sideA === 'Left' ? 'Right' : 'Bottom';\n\n    return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10);\n  }\n\n  function getSize(axis, body, html, computedStyle) {\n    return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0);\n  }\n\n  function getWindowSizes(document) {\n    var body = document.body;\n    var html = document.documentElement;\n    var computedStyle = isIE(10) && getComputedStyle(html);\n\n    return {\n      height: getSize('Height', body, html, computedStyle),\n      width: getSize('Width', body, html, computedStyle)\n    };\n  }\n\n  var classCallCheck = function (instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  };\n\n  var createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n\n\n\n\n\n  var defineProperty = function (obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  };\n\n  var _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  /**\n   * Given element offsets, generate an output similar to getBoundingClientRect\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Object} offsets\n   * @returns {Object} ClientRect like output\n   */\n  function getClientRect(offsets) {\n    return _extends({}, offsets, {\n      right: offsets.left + offsets.width,\n      bottom: offsets.top + offsets.height\n    });\n  }\n\n  /**\n   * Get bounding client rect of given element\n   * @method\n   * @memberof Popper.Utils\n   * @param {HTMLElement} element\n   * @return {Object} client rect\n   */\n  function getBoundingClientRect(element) {\n    var rect = {};\n\n    // IE10 10 FIX: Please, don't ask, the element isn't\n    // considered in DOM in some circumstances...\n    // This isn't reproducible in IE10 compatibility mode of IE11\n    try {\n      if (isIE(10)) {\n        rect = element.getBoundingClientRect();\n        var scrollTop = getScroll(element, 'top');\n        var scrollLeft = getScroll(element, 'left');\n        rect.top += scrollTop;\n        rect.left += scrollLeft;\n        rect.bottom += scrollTop;\n        rect.right += scrollLeft;\n      } else {\n        rect = element.getBoundingClientRect();\n      }\n    } catch (e) {}\n\n    var result = {\n      left: rect.left,\n      top: rect.top,\n      width: rect.right - rect.left,\n      height: rect.bottom - rect.top\n    };\n\n    // subtract scrollbar size from sizes\n    var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {};\n    var width = sizes.width || element.clientWidth || result.right - result.left;\n    var height = sizes.height || element.clientHeight || result.bottom - result.top;\n\n    var horizScrollbar = element.offsetWidth - width;\n    var vertScrollbar = element.offsetHeight - height;\n\n    // if an hypothetical scrollbar is detected, we must be sure it's not a `border`\n    // we make this check conditional for performance reasons\n    if (horizScrollbar || vertScrollbar) {\n      var styles = getStyleComputedProperty(element);\n      horizScrollbar -= getBordersSize(styles, 'x');\n      vertScrollbar -= getBordersSize(styles, 'y');\n\n      result.width -= horizScrollbar;\n      result.height -= vertScrollbar;\n    }\n\n    return getClientRect(result);\n  }\n\n  function getOffsetRectRelativeToArbitraryNode(children, parent) {\n    var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n    var isIE10 = isIE(10);\n    var isHTML = parent.nodeName === 'HTML';\n    var childrenRect = getBoundingClientRect(children);\n    var parentRect = getBoundingClientRect(parent);\n    var scrollParent = getScrollParent(children);\n\n    var styles = getStyleComputedProperty(parent);\n    var borderTopWidth = parseFloat(styles.borderTopWidth, 10);\n    var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10);\n\n    // In cases where the parent is fixed, we must ignore negative scroll in offset calc\n    if (fixedPosition && isHTML) {\n      parentRect.top = Math.max(parentRect.top, 0);\n      parentRect.left = Math.max(parentRect.left, 0);\n    }\n    var offsets = getClientRect({\n      top: childrenRect.top - parentRect.top - borderTopWidth,\n      left: childrenRect.left - parentRect.left - borderLeftWidth,\n      width: childrenRect.width,\n      height: childrenRect.height\n    });\n    offsets.marginTop = 0;\n    offsets.marginLeft = 0;\n\n    // Subtract margins of documentElement in case it's being used as parent\n    // we do this only on HTML because it's the only element that behaves\n    // differently when margins are applied to it. The margins are included in\n    // the box of the documentElement, in the other cases not.\n    if (!isIE10 && isHTML) {\n      var marginTop = parseFloat(styles.marginTop, 10);\n      var marginLeft = parseFloat(styles.marginLeft, 10);\n\n      offsets.top -= borderTopWidth - marginTop;\n      offsets.bottom -= borderTopWidth - marginTop;\n      offsets.left -= borderLeftWidth - marginLeft;\n      offsets.right -= borderLeftWidth - marginLeft;\n\n      // Attach marginTop and marginLeft because in some circumstances we may need them\n      offsets.marginTop = marginTop;\n      offsets.marginLeft = marginLeft;\n    }\n\n    if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') {\n      offsets = includeScroll(offsets, parent);\n    }\n\n    return offsets;\n  }\n\n  function getViewportOffsetRectRelativeToArtbitraryNode(element) {\n    var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    var html = element.ownerDocument.documentElement;\n    var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html);\n    var width = Math.max(html.clientWidth, window.innerWidth || 0);\n    var height = Math.max(html.clientHeight, window.innerHeight || 0);\n\n    var scrollTop = !excludeScroll ? getScroll(html) : 0;\n    var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0;\n\n    var offset = {\n      top: scrollTop - relativeOffset.top + relativeOffset.marginTop,\n      left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft,\n      width: width,\n      height: height\n    };\n\n    return getClientRect(offset);\n  }\n\n  /**\n   * Check if the given element is fixed or is inside a fixed parent\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @argument {Element} customContainer\n   * @returns {Boolean} answer to \"isFixed?\"\n   */\n  function isFixed(element) {\n    var nodeName = element.nodeName;\n    if (nodeName === 'BODY' || nodeName === 'HTML') {\n      return false;\n    }\n    if (getStyleComputedProperty(element, 'position') === 'fixed') {\n      return true;\n    }\n    var parentNode = getParentNode(element);\n    if (!parentNode) {\n      return false;\n    }\n    return isFixed(parentNode);\n  }\n\n  /**\n   * Finds the first parent of an element that has a transformed property defined\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Element} first transformed parent or documentElement\n   */\n\n  function getFixedPositionOffsetParent(element) {\n    // This check is needed to avoid errors in case one of the elements isn't defined for any reason\n    if (!element || !element.parentElement || isIE()) {\n      return document.documentElement;\n    }\n    var el = element.parentElement;\n    while (el && getStyleComputedProperty(el, 'transform') === 'none') {\n      el = el.parentElement;\n    }\n    return el || document.documentElement;\n  }\n\n  /**\n   * Computed the boundaries limits and return them\n   * @method\n   * @memberof Popper.Utils\n   * @param {HTMLElement} popper\n   * @param {HTMLElement} reference\n   * @param {number} padding\n   * @param {HTMLElement} boundariesElement - Element used to define the boundaries\n   * @param {Boolean} fixedPosition - Is in fixed position mode\n   * @returns {Object} Coordinates of the boundaries\n   */\n  function getBoundaries(popper, reference, padding, boundariesElement) {\n    var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n    // NOTE: 1 DOM access here\n\n    var boundaries = { top: 0, left: 0 };\n    var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n\n    // Handle viewport case\n    if (boundariesElement === 'viewport') {\n      boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition);\n    } else {\n      // Handle other cases based on DOM element used as boundaries\n      var boundariesNode = void 0;\n      if (boundariesElement === 'scrollParent') {\n        boundariesNode = getScrollParent(getParentNode(reference));\n        if (boundariesNode.nodeName === 'BODY') {\n          boundariesNode = popper.ownerDocument.documentElement;\n        }\n      } else if (boundariesElement === 'window') {\n        boundariesNode = popper.ownerDocument.documentElement;\n      } else {\n        boundariesNode = boundariesElement;\n      }\n\n      var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition);\n\n      // In case of HTML, we need a different computation\n      if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) {\n        var _getWindowSizes = getWindowSizes(popper.ownerDocument),\n            height = _getWindowSizes.height,\n            width = _getWindowSizes.width;\n\n        boundaries.top += offsets.top - offsets.marginTop;\n        boundaries.bottom = height + offsets.top;\n        boundaries.left += offsets.left - offsets.marginLeft;\n        boundaries.right = width + offsets.left;\n      } else {\n        // for all the other DOM elements, this one is good\n        boundaries = offsets;\n      }\n    }\n\n    // Add paddings\n    padding = padding || 0;\n    var isPaddingNumber = typeof padding === 'number';\n    boundaries.left += isPaddingNumber ? padding : padding.left || 0;\n    boundaries.top += isPaddingNumber ? padding : padding.top || 0;\n    boundaries.right -= isPaddingNumber ? padding : padding.right || 0;\n    boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0;\n\n    return boundaries;\n  }\n\n  function getArea(_ref) {\n    var width = _ref.width,\n        height = _ref.height;\n\n    return width * height;\n  }\n\n  /**\n   * Utility used to transform the `auto` placement to the placement with more\n   * available space.\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) {\n    var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0;\n\n    if (placement.indexOf('auto') === -1) {\n      return placement;\n    }\n\n    var boundaries = getBoundaries(popper, reference, padding, boundariesElement);\n\n    var rects = {\n      top: {\n        width: boundaries.width,\n        height: refRect.top - boundaries.top\n      },\n      right: {\n        width: boundaries.right - refRect.right,\n        height: boundaries.height\n      },\n      bottom: {\n        width: boundaries.width,\n        height: boundaries.bottom - refRect.bottom\n      },\n      left: {\n        width: refRect.left - boundaries.left,\n        height: boundaries.height\n      }\n    };\n\n    var sortedAreas = Object.keys(rects).map(function (key) {\n      return _extends({\n        key: key\n      }, rects[key], {\n        area: getArea(rects[key])\n      });\n    }).sort(function (a, b) {\n      return b.area - a.area;\n    });\n\n    var filteredAreas = sortedAreas.filter(function (_ref2) {\n      var width = _ref2.width,\n          height = _ref2.height;\n      return width >= popper.clientWidth && height >= popper.clientHeight;\n    });\n\n    var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key;\n\n    var variation = placement.split('-')[1];\n\n    return computedPlacement + (variation ? '-' + variation : '');\n  }\n\n  /**\n   * Get offsets to the reference element\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} state\n   * @param {Element} popper - the popper element\n   * @param {Element} reference - the reference element (the popper will be relative to this)\n   * @param {Element} fixedPosition - is in fixed position mode\n   * @returns {Object} An object containing the offsets which will be applied to the popper\n   */\n  function getReferenceOffsets(state, popper, reference) {\n    var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n    var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference);\n    return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition);\n  }\n\n  /**\n   * Get the outer sizes of the given element (offset size + margins)\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element\n   * @returns {Object} object containing width and height properties\n   */\n  function getOuterSizes(element) {\n    var window = element.ownerDocument.defaultView;\n    var styles = window.getComputedStyle(element);\n    var x = parseFloat(styles.marginTop || 0) + parseFloat(styles.marginBottom || 0);\n    var y = parseFloat(styles.marginLeft || 0) + parseFloat(styles.marginRight || 0);\n    var result = {\n      width: element.offsetWidth + y,\n      height: element.offsetHeight + x\n    };\n    return result;\n  }\n\n  /**\n   * Get the opposite placement of the given one\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement\n   * @returns {String} flipped placement\n   */\n  function getOppositePlacement(placement) {\n    var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' };\n    return placement.replace(/left|right|bottom|top/g, function (matched) {\n      return hash[matched];\n    });\n  }\n\n  /**\n   * Get offsets to the popper\n   * @method\n   * @memberof Popper.Utils\n   * @param {Object} position - CSS position the Popper will get applied\n   * @param {HTMLElement} popper - the popper element\n   * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this)\n   * @param {String} placement - one of the valid placement options\n   * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper\n   */\n  function getPopperOffsets(popper, referenceOffsets, placement) {\n    placement = placement.split('-')[0];\n\n    // Get popper node sizes\n    var popperRect = getOuterSizes(popper);\n\n    // Add position, width and height to our offsets object\n    var popperOffsets = {\n      width: popperRect.width,\n      height: popperRect.height\n    };\n\n    // depending by the popper placement we have to compute its offsets slightly differently\n    var isHoriz = ['right', 'left'].indexOf(placement) !== -1;\n    var mainSide = isHoriz ? 'top' : 'left';\n    var secondarySide = isHoriz ? 'left' : 'top';\n    var measurement = isHoriz ? 'height' : 'width';\n    var secondaryMeasurement = !isHoriz ? 'height' : 'width';\n\n    popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2;\n    if (placement === secondarySide) {\n      popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement];\n    } else {\n      popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)];\n    }\n\n    return popperOffsets;\n  }\n\n  /**\n   * Mimics the `find` method of Array\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Array} arr\n   * @argument prop\n   * @argument value\n   * @returns index or -1\n   */\n  function find(arr, check) {\n    // use native find if supported\n    if (Array.prototype.find) {\n      return arr.find(check);\n    }\n\n    // use `filter` to obtain the same behavior of `find`\n    return arr.filter(check)[0];\n  }\n\n  /**\n   * Return the index of the matching object\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Array} arr\n   * @argument prop\n   * @argument value\n   * @returns index or -1\n   */\n  function findIndex(arr, prop, value) {\n    // use native findIndex if supported\n    if (Array.prototype.findIndex) {\n      return arr.findIndex(function (cur) {\n        return cur[prop] === value;\n      });\n    }\n\n    // use `find` + `indexOf` if `findIndex` isn't supported\n    var match = find(arr, function (obj) {\n      return obj[prop] === value;\n    });\n    return arr.indexOf(match);\n  }\n\n  /**\n   * Loop trough the list of modifiers and run them in order,\n   * each of them will then edit the data object.\n   * @method\n   * @memberof Popper.Utils\n   * @param {dataObject} data\n   * @param {Array} modifiers\n   * @param {String} ends - Optional modifier name used as stopper\n   * @returns {dataObject}\n   */\n  function runModifiers(modifiers, data, ends) {\n    var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends));\n\n    modifiersToRun.forEach(function (modifier) {\n      if (modifier['function']) {\n        // eslint-disable-line dot-notation\n        console.warn('`modifier.function` is deprecated, use `modifier.fn`!');\n      }\n      var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation\n      if (modifier.enabled && isFunction(fn)) {\n        // Add properties to offsets to make them a complete clientRect object\n        // we do this before each modifier to make sure the previous one doesn't\n        // mess with these values\n        data.offsets.popper = getClientRect(data.offsets.popper);\n        data.offsets.reference = getClientRect(data.offsets.reference);\n\n        data = fn(data, modifier);\n      }\n    });\n\n    return data;\n  }\n\n  /**\n   * Updates the position of the popper, computing the new offsets and applying\n   * the new style.<br />\n   * Prefer `scheduleUpdate` over `update` because of performance reasons.\n   * @method\n   * @memberof Popper\n   */\n  function update() {\n    // if popper is destroyed, don't perform any further update\n    if (this.state.isDestroyed) {\n      return;\n    }\n\n    var data = {\n      instance: this,\n      styles: {},\n      arrowStyles: {},\n      attributes: {},\n      flipped: false,\n      offsets: {}\n    };\n\n    // compute reference element offsets\n    data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed);\n\n    // compute auto placement, store placement inside the data object,\n    // modifiers will be able to edit `placement` if needed\n    // and refer to originalPlacement to know the original value\n    data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding);\n\n    // store the computed placement inside `originalPlacement`\n    data.originalPlacement = data.placement;\n\n    data.positionFixed = this.options.positionFixed;\n\n    // compute the popper offsets\n    data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement);\n\n    data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute';\n\n    // run the modifiers\n    data = runModifiers(this.modifiers, data);\n\n    // the first `update` will call `onCreate` callback\n    // the other ones will call `onUpdate` callback\n    if (!this.state.isCreated) {\n      this.state.isCreated = true;\n      this.options.onCreate(data);\n    } else {\n      this.options.onUpdate(data);\n    }\n  }\n\n  /**\n   * Helper used to know if the given modifier is enabled.\n   * @method\n   * @memberof Popper.Utils\n   * @returns {Boolean}\n   */\n  function isModifierEnabled(modifiers, modifierName) {\n    return modifiers.some(function (_ref) {\n      var name = _ref.name,\n          enabled = _ref.enabled;\n      return enabled && name === modifierName;\n    });\n  }\n\n  /**\n   * Get the prefixed supported property name\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} property (camelCase)\n   * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix)\n   */\n  function getSupportedPropertyName(property) {\n    var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O'];\n    var upperProp = property.charAt(0).toUpperCase() + property.slice(1);\n\n    for (var i = 0; i < prefixes.length; i++) {\n      var prefix = prefixes[i];\n      var toCheck = prefix ? '' + prefix + upperProp : property;\n      if (typeof document.body.style[toCheck] !== 'undefined') {\n        return toCheck;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Destroys the popper.\n   * @method\n   * @memberof Popper\n   */\n  function destroy() {\n    this.state.isDestroyed = true;\n\n    // touch DOM only if `applyStyle` modifier is enabled\n    if (isModifierEnabled(this.modifiers, 'applyStyle')) {\n      this.popper.removeAttribute('x-placement');\n      this.popper.style.position = '';\n      this.popper.style.top = '';\n      this.popper.style.left = '';\n      this.popper.style.right = '';\n      this.popper.style.bottom = '';\n      this.popper.style.willChange = '';\n      this.popper.style[getSupportedPropertyName('transform')] = '';\n    }\n\n    this.disableEventListeners();\n\n    // remove the popper if user explicity asked for the deletion on destroy\n    // do not use `remove` because IE11 doesn't support it\n    if (this.options.removeOnDestroy) {\n      this.popper.parentNode.removeChild(this.popper);\n    }\n    return this;\n  }\n\n  /**\n   * Get the window associated with the element\n   * @argument {Element} element\n   * @returns {Window}\n   */\n  function getWindow(element) {\n    var ownerDocument = element.ownerDocument;\n    return ownerDocument ? ownerDocument.defaultView : window;\n  }\n\n  function attachToScrollParents(scrollParent, event, callback, scrollParents) {\n    var isBody = scrollParent.nodeName === 'BODY';\n    var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent;\n    target.addEventListener(event, callback, { passive: true });\n\n    if (!isBody) {\n      attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents);\n    }\n    scrollParents.push(target);\n  }\n\n  /**\n   * Setup needed event listeners used to update the popper position\n   * @method\n   * @memberof Popper.Utils\n   * @private\n   */\n  function setupEventListeners(reference, options, state, updateBound) {\n    // Resize event listener on window\n    state.updateBound = updateBound;\n    getWindow(reference).addEventListener('resize', state.updateBound, { passive: true });\n\n    // Scroll event listener on scroll parents\n    var scrollElement = getScrollParent(reference);\n    attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents);\n    state.scrollElement = scrollElement;\n    state.eventsEnabled = true;\n\n    return state;\n  }\n\n  /**\n   * It will add resize/scroll events and start recalculating\n   * position of the popper element when they are triggered.\n   * @method\n   * @memberof Popper\n   */\n  function enableEventListeners() {\n    if (!this.state.eventsEnabled) {\n      this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate);\n    }\n  }\n\n  /**\n   * Remove event listeners used to update the popper position\n   * @method\n   * @memberof Popper.Utils\n   * @private\n   */\n  function removeEventListeners(reference, state) {\n    // Remove resize event listener on window\n    getWindow(reference).removeEventListener('resize', state.updateBound);\n\n    // Remove scroll event listener on scroll parents\n    state.scrollParents.forEach(function (target) {\n      target.removeEventListener('scroll', state.updateBound);\n    });\n\n    // Reset state\n    state.updateBound = null;\n    state.scrollParents = [];\n    state.scrollElement = null;\n    state.eventsEnabled = false;\n    return state;\n  }\n\n  /**\n   * It will remove resize/scroll events and won't recalculate popper position\n   * when they are triggered. It also won't trigger `onUpdate` callback anymore,\n   * unless you call `update` method manually.\n   * @method\n   * @memberof Popper\n   */\n  function disableEventListeners() {\n    if (this.state.eventsEnabled) {\n      cancelAnimationFrame(this.scheduleUpdate);\n      this.state = removeEventListeners(this.reference, this.state);\n    }\n  }\n\n  /**\n   * Tells if a given input is a number\n   * @method\n   * @memberof Popper.Utils\n   * @param {*} input to check\n   * @return {Boolean}\n   */\n  function isNumeric(n) {\n    return n !== '' && !isNaN(parseFloat(n)) && isFinite(n);\n  }\n\n  /**\n   * Set the style to the given popper\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element - Element to apply the style to\n   * @argument {Object} styles\n   * Object with a list of properties and values which will be applied to the element\n   */\n  function setStyles(element, styles) {\n    Object.keys(styles).forEach(function (prop) {\n      var unit = '';\n      // add unit if the value is numeric and is one of the following\n      if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) {\n        unit = 'px';\n      }\n      element.style[prop] = styles[prop] + unit;\n    });\n  }\n\n  /**\n   * Set the attributes to the given popper\n   * @method\n   * @memberof Popper.Utils\n   * @argument {Element} element - Element to apply the attributes to\n   * @argument {Object} styles\n   * Object with a list of properties and values which will be applied to the element\n   */\n  function setAttributes(element, attributes) {\n    Object.keys(attributes).forEach(function (prop) {\n      var value = attributes[prop];\n      if (value !== false) {\n        element.setAttribute(prop, attributes[prop]);\n      } else {\n        element.removeAttribute(prop);\n      }\n    });\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} data.styles - List of style properties - values to apply to popper element\n   * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The same data object\n   */\n  function applyStyle(data) {\n    // any property present in `data.styles` will be applied to the popper,\n    // in this way we can make the 3rd party modifiers add custom styles to it\n    // Be aware, modifiers could override the properties defined in the previous\n    // lines of this modifier!\n    setStyles(data.instance.popper, data.styles);\n\n    // any property present in `data.attributes` will be applied to the popper,\n    // they will be set as HTML attributes of the element\n    setAttributes(data.instance.popper, data.attributes);\n\n    // if arrowElement is defined and arrowStyles has some properties\n    if (data.arrowElement && Object.keys(data.arrowStyles).length) {\n      setStyles(data.arrowElement, data.arrowStyles);\n    }\n\n    return data;\n  }\n\n  /**\n   * Set the x-placement attribute before everything else because it could be used\n   * to add margins to the popper margins needs to be calculated to get the\n   * correct popper offsets.\n   * @method\n   * @memberof Popper.modifiers\n   * @param {HTMLElement} reference - The reference element used to position the popper\n   * @param {HTMLElement} popper - The HTML element used as popper\n   * @param {Object} options - Popper.js options\n   */\n  function applyStyleOnLoad(reference, popper, options, modifierOptions, state) {\n    // compute reference element offsets\n    var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed);\n\n    // compute auto placement, store placement inside the data object,\n    // modifiers will be able to edit `placement` if needed\n    // and refer to originalPlacement to know the original value\n    var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding);\n\n    popper.setAttribute('x-placement', placement);\n\n    // Apply `position` to popper before anything else because\n    // without the position applied we can't guarantee correct computations\n    setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' });\n\n    return options;\n  }\n\n  /**\n   * @function\n   * @memberof Popper.Utils\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Boolean} shouldRound - If the offsets should be rounded at all\n   * @returns {Object} The popper's position offsets rounded\n   *\n   * The tale of pixel-perfect positioning. It's still not 100% perfect, but as\n   * good as it can be within reason.\n   * Discussion here: https://github.com/FezVrasta/popper.js/pull/715\n   *\n   * Low DPI screens cause a popper to be blurry if not using full pixels (Safari\n   * as well on High DPI screens).\n   *\n   * Firefox prefers no rounding for positioning and does not have blurriness on\n   * high DPI screens.\n   *\n   * Only horizontal placement and left/right values need to be considered.\n   */\n  function getRoundedOffsets(data, shouldRound) {\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n    var round = Math.round,\n        floor = Math.floor;\n\n    var noRound = function noRound(v) {\n      return v;\n    };\n\n    var referenceWidth = round(reference.width);\n    var popperWidth = round(popper.width);\n\n    var isVertical = ['left', 'right'].indexOf(data.placement) !== -1;\n    var isVariation = data.placement.indexOf('-') !== -1;\n    var sameWidthParity = referenceWidth % 2 === popperWidth % 2;\n    var bothOddWidth = referenceWidth % 2 === 1 && popperWidth % 2 === 1;\n\n    var horizontalToInteger = !shouldRound ? noRound : isVertical || isVariation || sameWidthParity ? round : floor;\n    var verticalToInteger = !shouldRound ? noRound : round;\n\n    return {\n      left: horizontalToInteger(bothOddWidth && !isVariation && shouldRound ? popper.left - 1 : popper.left),\n      top: verticalToInteger(popper.top),\n      bottom: verticalToInteger(popper.bottom),\n      right: horizontalToInteger(popper.right)\n    };\n  }\n\n  var isFirefox = isBrowser && /Firefox/i.test(navigator.userAgent);\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function computeStyle(data, options) {\n    var x = options.x,\n        y = options.y;\n    var popper = data.offsets.popper;\n\n    // Remove this legacy support in Popper.js v2\n\n    var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) {\n      return modifier.name === 'applyStyle';\n    }).gpuAcceleration;\n    if (legacyGpuAccelerationOption !== undefined) {\n      console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');\n    }\n    var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration;\n\n    var offsetParent = getOffsetParent(data.instance.popper);\n    var offsetParentRect = getBoundingClientRect(offsetParent);\n\n    // Styles\n    var styles = {\n      position: popper.position\n    };\n\n    var offsets = getRoundedOffsets(data, window.devicePixelRatio < 2 || !isFirefox);\n\n    var sideA = x === 'bottom' ? 'top' : 'bottom';\n    var sideB = y === 'right' ? 'left' : 'right';\n\n    // if gpuAcceleration is set to `true` and transform is supported,\n    //  we use `translate3d` to apply the position to the popper we\n    // automatically use the supported prefixed version if needed\n    var prefixedProperty = getSupportedPropertyName('transform');\n\n    // now, let's make a step back and look at this code closely (wtf?)\n    // If the content of the popper grows once it's been positioned, it\n    // may happen that the popper gets misplaced because of the new content\n    // overflowing its reference element\n    // To avoid this problem, we provide two options (x and y), which allow\n    // the consumer to define the offset origin.\n    // If we position a popper on top of a reference element, we can set\n    // `x` to `top` to make the popper grow towards its top instead of\n    // its bottom.\n    var left = void 0,\n        top = void 0;\n    if (sideA === 'bottom') {\n      // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar)\n      // and not the bottom of the html element\n      if (offsetParent.nodeName === 'HTML') {\n        top = -offsetParent.clientHeight + offsets.bottom;\n      } else {\n        top = -offsetParentRect.height + offsets.bottom;\n      }\n    } else {\n      top = offsets.top;\n    }\n    if (sideB === 'right') {\n      if (offsetParent.nodeName === 'HTML') {\n        left = -offsetParent.clientWidth + offsets.right;\n      } else {\n        left = -offsetParentRect.width + offsets.right;\n      }\n    } else {\n      left = offsets.left;\n    }\n    if (gpuAcceleration && prefixedProperty) {\n      styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)';\n      styles[sideA] = 0;\n      styles[sideB] = 0;\n      styles.willChange = 'transform';\n    } else {\n      // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties\n      var invertTop = sideA === 'bottom' ? -1 : 1;\n      var invertLeft = sideB === 'right' ? -1 : 1;\n      styles[sideA] = top * invertTop;\n      styles[sideB] = left * invertLeft;\n      styles.willChange = sideA + ', ' + sideB;\n    }\n\n    // Attributes\n    var attributes = {\n      'x-placement': data.placement\n    };\n\n    // Update `data` attributes, styles and arrowStyles\n    data.attributes = _extends({}, attributes, data.attributes);\n    data.styles = _extends({}, styles, data.styles);\n    data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles);\n\n    return data;\n  }\n\n  /**\n   * Helper used to know if the given modifier depends from another one.<br />\n   * It checks if the needed modifier is listed and enabled.\n   * @method\n   * @memberof Popper.Utils\n   * @param {Array} modifiers - list of modifiers\n   * @param {String} requestingName - name of requesting modifier\n   * @param {String} requestedName - name of requested modifier\n   * @returns {Boolean}\n   */\n  function isModifierRequired(modifiers, requestingName, requestedName) {\n    var requesting = find(modifiers, function (_ref) {\n      var name = _ref.name;\n      return name === requestingName;\n    });\n\n    var isRequired = !!requesting && modifiers.some(function (modifier) {\n      return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order;\n    });\n\n    if (!isRequired) {\n      var _requesting = '`' + requestingName + '`';\n      var requested = '`' + requestedName + '`';\n      console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!');\n    }\n    return isRequired;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function arrow(data, options) {\n    var _data$offsets$arrow;\n\n    // arrow depends on keepTogether in order to work\n    if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) {\n      return data;\n    }\n\n    var arrowElement = options.element;\n\n    // if arrowElement is a string, suppose it's a CSS selector\n    if (typeof arrowElement === 'string') {\n      arrowElement = data.instance.popper.querySelector(arrowElement);\n\n      // if arrowElement is not found, don't run the modifier\n      if (!arrowElement) {\n        return data;\n      }\n    } else {\n      // if the arrowElement isn't a query selector we must check that the\n      // provided DOM node is child of its popper node\n      if (!data.instance.popper.contains(arrowElement)) {\n        console.warn('WARNING: `arrow.element` must be child of its popper element!');\n        return data;\n      }\n    }\n\n    var placement = data.placement.split('-')[0];\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var isVertical = ['left', 'right'].indexOf(placement) !== -1;\n\n    var len = isVertical ? 'height' : 'width';\n    var sideCapitalized = isVertical ? 'Top' : 'Left';\n    var side = sideCapitalized.toLowerCase();\n    var altSide = isVertical ? 'left' : 'top';\n    var opSide = isVertical ? 'bottom' : 'right';\n    var arrowElementSize = getOuterSizes(arrowElement)[len];\n\n    //\n    // extends keepTogether behavior making sure the popper and its\n    // reference have enough pixels in conjunction\n    //\n\n    // top/left side\n    if (reference[opSide] - arrowElementSize < popper[side]) {\n      data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize);\n    }\n    // bottom/right side\n    if (reference[side] + arrowElementSize > popper[opSide]) {\n      data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide];\n    }\n    data.offsets.popper = getClientRect(data.offsets.popper);\n\n    // compute center of the popper\n    var center = reference[side] + reference[len] / 2 - arrowElementSize / 2;\n\n    // Compute the sideValue using the updated popper offsets\n    // take popper margin in account because we don't have this info available\n    var css = getStyleComputedProperty(data.instance.popper);\n    var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10);\n    var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10);\n    var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide;\n\n    // prevent arrowElement from being placed not contiguously to its popper\n    sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0);\n\n    data.arrowElement = arrowElement;\n    data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow);\n\n    return data;\n  }\n\n  /**\n   * Get the opposite placement variation of the given one\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement variation\n   * @returns {String} flipped placement variation\n   */\n  function getOppositeVariation(variation) {\n    if (variation === 'end') {\n      return 'start';\n    } else if (variation === 'start') {\n      return 'end';\n    }\n    return variation;\n  }\n\n  /**\n   * List of accepted placements to use as values of the `placement` option.<br />\n   * Valid placements are:\n   * - `auto`\n   * - `top`\n   * - `right`\n   * - `bottom`\n   * - `left`\n   *\n   * Each placement can have a variation from this list:\n   * - `-start`\n   * - `-end`\n   *\n   * Variations are interpreted easily if you think of them as the left to right\n   * written languages. Horizontally (`top` and `bottom`), `start` is left and `end`\n   * is right.<br />\n   * Vertically (`left` and `right`), `start` is top and `end` is bottom.\n   *\n   * Some valid examples are:\n   * - `top-end` (on top of reference, right aligned)\n   * - `right-start` (on right of reference, top aligned)\n   * - `bottom` (on bottom, centered)\n   * - `auto-end` (on the side with more space available, alignment depends by placement)\n   *\n   * @static\n   * @type {Array}\n   * @enum {String}\n   * @readonly\n   * @method placements\n   * @memberof Popper\n   */\n  var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start'];\n\n  // Get rid of `auto` `auto-start` and `auto-end`\n  var validPlacements = placements.slice(3);\n\n  /**\n   * Given an initial placement, returns all the subsequent placements\n   * clockwise (or counter-clockwise).\n   *\n   * @method\n   * @memberof Popper.Utils\n   * @argument {String} placement - A valid placement (it accepts variations)\n   * @argument {Boolean} counter - Set to true to walk the placements counterclockwise\n   * @returns {Array} placements including their variations\n   */\n  function clockwise(placement) {\n    var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n    var index = validPlacements.indexOf(placement);\n    var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index));\n    return counter ? arr.reverse() : arr;\n  }\n\n  var BEHAVIORS = {\n    FLIP: 'flip',\n    CLOCKWISE: 'clockwise',\n    COUNTERCLOCKWISE: 'counterclockwise'\n  };\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function flip(data, options) {\n    // if `inner` modifier is enabled, we can't use the `flip` modifier\n    if (isModifierEnabled(data.instance.modifiers, 'inner')) {\n      return data;\n    }\n\n    if (data.flipped && data.placement === data.originalPlacement) {\n      // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides\n      return data;\n    }\n\n    var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed);\n\n    var placement = data.placement.split('-')[0];\n    var placementOpposite = getOppositePlacement(placement);\n    var variation = data.placement.split('-')[1] || '';\n\n    var flipOrder = [];\n\n    switch (options.behavior) {\n      case BEHAVIORS.FLIP:\n        flipOrder = [placement, placementOpposite];\n        break;\n      case BEHAVIORS.CLOCKWISE:\n        flipOrder = clockwise(placement);\n        break;\n      case BEHAVIORS.COUNTERCLOCKWISE:\n        flipOrder = clockwise(placement, true);\n        break;\n      default:\n        flipOrder = options.behavior;\n    }\n\n    flipOrder.forEach(function (step, index) {\n      if (placement !== step || flipOrder.length === index + 1) {\n        return data;\n      }\n\n      placement = data.placement.split('-')[0];\n      placementOpposite = getOppositePlacement(placement);\n\n      var popperOffsets = data.offsets.popper;\n      var refOffsets = data.offsets.reference;\n\n      // using floor because the reference offsets may contain decimals we are not going to consider here\n      var floor = Math.floor;\n      var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom);\n\n      var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left);\n      var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right);\n      var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top);\n      var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom);\n\n      var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom;\n\n      // flip the variation if required\n      var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n      var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom);\n\n      if (overlapsRef || overflowsBoundaries || flippedVariation) {\n        // this boolean to detect any flip loop\n        data.flipped = true;\n\n        if (overlapsRef || overflowsBoundaries) {\n          placement = flipOrder[index + 1];\n        }\n\n        if (flippedVariation) {\n          variation = getOppositeVariation(variation);\n        }\n\n        data.placement = placement + (variation ? '-' + variation : '');\n\n        // this object contains `position`, we want to preserve it along with\n        // any additional property we may add in the future\n        data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement));\n\n        data = runModifiers(data.instance.modifiers, data, 'flip');\n      }\n    });\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function keepTogether(data) {\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var placement = data.placement.split('-')[0];\n    var floor = Math.floor;\n    var isVertical = ['top', 'bottom'].indexOf(placement) !== -1;\n    var side = isVertical ? 'right' : 'bottom';\n    var opSide = isVertical ? 'left' : 'top';\n    var measurement = isVertical ? 'width' : 'height';\n\n    if (popper[side] < floor(reference[opSide])) {\n      data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement];\n    }\n    if (popper[opSide] > floor(reference[side])) {\n      data.offsets.popper[opSide] = floor(reference[side]);\n    }\n\n    return data;\n  }\n\n  /**\n   * Converts a string containing value + unit into a px value number\n   * @function\n   * @memberof {modifiers~offset}\n   * @private\n   * @argument {String} str - Value + unit string\n   * @argument {String} measurement - `height` or `width`\n   * @argument {Object} popperOffsets\n   * @argument {Object} referenceOffsets\n   * @returns {Number|String}\n   * Value in pixels, or original string if no values were extracted\n   */\n  function toValue(str, measurement, popperOffsets, referenceOffsets) {\n    // separate value from unit\n    var split = str.match(/((?:\\-|\\+)?\\d*\\.?\\d*)(.*)/);\n    var value = +split[1];\n    var unit = split[2];\n\n    // If it's not a number it's an operator, I guess\n    if (!value) {\n      return str;\n    }\n\n    if (unit.indexOf('%') === 0) {\n      var element = void 0;\n      switch (unit) {\n        case '%p':\n          element = popperOffsets;\n          break;\n        case '%':\n        case '%r':\n        default:\n          element = referenceOffsets;\n      }\n\n      var rect = getClientRect(element);\n      return rect[measurement] / 100 * value;\n    } else if (unit === 'vh' || unit === 'vw') {\n      // if is a vh or vw, we calculate the size based on the viewport\n      var size = void 0;\n      if (unit === 'vh') {\n        size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);\n      } else {\n        size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n      }\n      return size / 100 * value;\n    } else {\n      // if is an explicit pixel unit, we get rid of the unit and keep the value\n      // if is an implicit unit, it's px, and we return just the value\n      return value;\n    }\n  }\n\n  /**\n   * Parse an `offset` string to extrapolate `x` and `y` numeric offsets.\n   * @function\n   * @memberof {modifiers~offset}\n   * @private\n   * @argument {String} offset\n   * @argument {Object} popperOffsets\n   * @argument {Object} referenceOffsets\n   * @argument {String} basePlacement\n   * @returns {Array} a two cells array with x and y offsets in numbers\n   */\n  function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) {\n    var offsets = [0, 0];\n\n    // Use height if placement is left or right and index is 0 otherwise use width\n    // in this way the first offset will use an axis and the second one\n    // will use the other one\n    var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1;\n\n    // Split the offset string to obtain a list of values and operands\n    // The regex addresses values with the plus or minus sign in front (+10, -20, etc)\n    var fragments = offset.split(/(\\+|\\-)/).map(function (frag) {\n      return frag.trim();\n    });\n\n    // Detect if the offset string contains a pair of values or a single one\n    // they could be separated by comma or space\n    var divider = fragments.indexOf(find(fragments, function (frag) {\n      return frag.search(/,|\\s/) !== -1;\n    }));\n\n    if (fragments[divider] && fragments[divider].indexOf(',') === -1) {\n      console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');\n    }\n\n    // If divider is found, we divide the list of values and operands to divide\n    // them by ofset X and Y.\n    var splitRegex = /\\s*,\\s*|\\s+/;\n    var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments];\n\n    // Convert the values with units to absolute pixels to allow our computations\n    ops = ops.map(function (op, index) {\n      // Most of the units rely on the orientation of the popper\n      var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width';\n      var mergeWithPrevious = false;\n      return op\n      // This aggregates any `+` or `-` sign that aren't considered operators\n      // e.g.: 10 + +5 => [10, +, +5]\n      .reduce(function (a, b) {\n        if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) {\n          a[a.length - 1] = b;\n          mergeWithPrevious = true;\n          return a;\n        } else if (mergeWithPrevious) {\n          a[a.length - 1] += b;\n          mergeWithPrevious = false;\n          return a;\n        } else {\n          return a.concat(b);\n        }\n      }, [])\n      // Here we convert the string values into number values (in px)\n      .map(function (str) {\n        return toValue(str, measurement, popperOffsets, referenceOffsets);\n      });\n    });\n\n    // Loop trough the offsets arrays and execute the operations\n    ops.forEach(function (op, index) {\n      op.forEach(function (frag, index2) {\n        if (isNumeric(frag)) {\n          offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1);\n        }\n      });\n    });\n    return offsets;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @argument {Number|String} options.offset=0\n   * The offset value as described in the modifier description\n   * @returns {Object} The data object, properly modified\n   */\n  function offset(data, _ref) {\n    var offset = _ref.offset;\n    var placement = data.placement,\n        _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var basePlacement = placement.split('-')[0];\n\n    var offsets = void 0;\n    if (isNumeric(+offset)) {\n      offsets = [+offset, 0];\n    } else {\n      offsets = parseOffset(offset, popper, reference, basePlacement);\n    }\n\n    if (basePlacement === 'left') {\n      popper.top += offsets[0];\n      popper.left -= offsets[1];\n    } else if (basePlacement === 'right') {\n      popper.top += offsets[0];\n      popper.left += offsets[1];\n    } else if (basePlacement === 'top') {\n      popper.left += offsets[0];\n      popper.top -= offsets[1];\n    } else if (basePlacement === 'bottom') {\n      popper.left += offsets[0];\n      popper.top += offsets[1];\n    }\n\n    data.popper = popper;\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function preventOverflow(data, options) {\n    var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper);\n\n    // If offsetParent is the reference element, we really want to\n    // go one step up and use the next offsetParent as reference to\n    // avoid to make this modifier completely useless and look like broken\n    if (data.instance.reference === boundariesElement) {\n      boundariesElement = getOffsetParent(boundariesElement);\n    }\n\n    // NOTE: DOM access here\n    // resets the popper's position so that the document size can be calculated excluding\n    // the size of the popper element itself\n    var transformProp = getSupportedPropertyName('transform');\n    var popperStyles = data.instance.popper.style; // assignment to help minification\n    var top = popperStyles.top,\n        left = popperStyles.left,\n        transform = popperStyles[transformProp];\n\n    popperStyles.top = '';\n    popperStyles.left = '';\n    popperStyles[transformProp] = '';\n\n    var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed);\n\n    // NOTE: DOM access here\n    // restores the original style properties after the offsets have been computed\n    popperStyles.top = top;\n    popperStyles.left = left;\n    popperStyles[transformProp] = transform;\n\n    options.boundaries = boundaries;\n\n    var order = options.priority;\n    var popper = data.offsets.popper;\n\n    var check = {\n      primary: function primary(placement) {\n        var value = popper[placement];\n        if (popper[placement] < boundaries[placement] && !options.escapeWithReference) {\n          value = Math.max(popper[placement], boundaries[placement]);\n        }\n        return defineProperty({}, placement, value);\n      },\n      secondary: function secondary(placement) {\n        var mainSide = placement === 'right' ? 'left' : 'top';\n        var value = popper[mainSide];\n        if (popper[placement] > boundaries[placement] && !options.escapeWithReference) {\n          value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height));\n        }\n        return defineProperty({}, mainSide, value);\n      }\n    };\n\n    order.forEach(function (placement) {\n      var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary';\n      popper = _extends({}, popper, check[side](placement));\n    });\n\n    data.offsets.popper = popper;\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function shift(data) {\n    var placement = data.placement;\n    var basePlacement = placement.split('-')[0];\n    var shiftvariation = placement.split('-')[1];\n\n    // if shift shiftvariation is specified, run the modifier\n    if (shiftvariation) {\n      var _data$offsets = data.offsets,\n          reference = _data$offsets.reference,\n          popper = _data$offsets.popper;\n\n      var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1;\n      var side = isVertical ? 'left' : 'top';\n      var measurement = isVertical ? 'width' : 'height';\n\n      var shiftOffsets = {\n        start: defineProperty({}, side, reference[side]),\n        end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement])\n      };\n\n      data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]);\n    }\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by update method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function hide(data) {\n    if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) {\n      return data;\n    }\n\n    var refRect = data.offsets.reference;\n    var bound = find(data.instance.modifiers, function (modifier) {\n      return modifier.name === 'preventOverflow';\n    }).boundaries;\n\n    if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) {\n      // Avoid unnecessary DOM access if visibility hasn't changed\n      if (data.hide === true) {\n        return data;\n      }\n\n      data.hide = true;\n      data.attributes['x-out-of-boundaries'] = '';\n    } else {\n      // Avoid unnecessary DOM access if visibility hasn't changed\n      if (data.hide === false) {\n        return data;\n      }\n\n      data.hide = false;\n      data.attributes['x-out-of-boundaries'] = false;\n    }\n\n    return data;\n  }\n\n  /**\n   * @function\n   * @memberof Modifiers\n   * @argument {Object} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {Object} The data object, properly modified\n   */\n  function inner(data) {\n    var placement = data.placement;\n    var basePlacement = placement.split('-')[0];\n    var _data$offsets = data.offsets,\n        popper = _data$offsets.popper,\n        reference = _data$offsets.reference;\n\n    var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1;\n\n    var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1;\n\n    popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0);\n\n    data.placement = getOppositePlacement(placement);\n    data.offsets.popper = getClientRect(popper);\n\n    return data;\n  }\n\n  /**\n   * Modifier function, each modifier can have a function of this type assigned\n   * to its `fn` property.<br />\n   * These functions will be called on each update, this means that you must\n   * make sure they are performant enough to avoid performance bottlenecks.\n   *\n   * @function ModifierFn\n   * @argument {dataObject} data - The data object generated by `update` method\n   * @argument {Object} options - Modifiers configuration and options\n   * @returns {dataObject} The data object, properly modified\n   */\n\n  /**\n   * Modifiers are plugins used to alter the behavior of your poppers.<br />\n   * Popper.js uses a set of 9 modifiers to provide all the basic functionalities\n   * needed by the library.\n   *\n   * Usually you don't want to override the `order`, `fn` and `onLoad` props.\n   * All the other properties are configurations that could be tweaked.\n   * @namespace modifiers\n   */\n  var modifiers = {\n    /**\n     * Modifier used to shift the popper on the start or end of its reference\n     * element.<br />\n     * It will read the variation of the `placement` property.<br />\n     * It can be one either `-end` or `-start`.\n     * @memberof modifiers\n     * @inner\n     */\n    shift: {\n      /** @prop {number} order=100 - Index used to define the order of execution */\n      order: 100,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: shift\n    },\n\n    /**\n     * The `offset` modifier can shift your popper on both its axis.\n     *\n     * It accepts the following units:\n     * - `px` or unit-less, interpreted as pixels\n     * - `%` or `%r`, percentage relative to the length of the reference element\n     * - `%p`, percentage relative to the length of the popper element\n     * - `vw`, CSS viewport width unit\n     * - `vh`, CSS viewport height unit\n     *\n     * For length is intended the main axis relative to the placement of the popper.<br />\n     * This means that if the placement is `top` or `bottom`, the length will be the\n     * `width`. In case of `left` or `right`, it will be the `height`.\n     *\n     * You can provide a single value (as `Number` or `String`), or a pair of values\n     * as `String` divided by a comma or one (or more) white spaces.<br />\n     * The latter is a deprecated method because it leads to confusion and will be\n     * removed in v2.<br />\n     * Additionally, it accepts additions and subtractions between different units.\n     * Note that multiplications and divisions aren't supported.\n     *\n     * Valid examples are:\n     * ```\n     * 10\n     * '10%'\n     * '10, 10'\n     * '10%, 10'\n     * '10 + 10%'\n     * '10 - 5vh + 3%'\n     * '-10px + 5vh, 5px - 6%'\n     * ```\n     * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap\n     * > with their reference element, unfortunately, you will have to disable the `flip` modifier.\n     * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373).\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    offset: {\n      /** @prop {number} order=200 - Index used to define the order of execution */\n      order: 200,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: offset,\n      /** @prop {Number|String} offset=0\n       * The offset value as described in the modifier description\n       */\n      offset: 0\n    },\n\n    /**\n     * Modifier used to prevent the popper from being positioned outside the boundary.\n     *\n     * A scenario exists where the reference itself is not within the boundaries.<br />\n     * We can say it has \"escaped the boundaries\" — or just \"escaped\".<br />\n     * In this case we need to decide whether the popper should either:\n     *\n     * - detach from the reference and remain \"trapped\" in the boundaries, or\n     * - if it should ignore the boundary and \"escape with its reference\"\n     *\n     * When `escapeWithReference` is set to`true` and reference is completely\n     * outside its boundaries, the popper will overflow (or completely leave)\n     * the boundaries in order to remain attached to the edge of the reference.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    preventOverflow: {\n      /** @prop {number} order=300 - Index used to define the order of execution */\n      order: 300,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: preventOverflow,\n      /**\n       * @prop {Array} [priority=['left','right','top','bottom']]\n       * Popper will try to prevent overflow following these priorities by default,\n       * then, it could overflow on the left and on top of the `boundariesElement`\n       */\n      priority: ['left', 'right', 'top', 'bottom'],\n      /**\n       * @prop {number} padding=5\n       * Amount of pixel used to define a minimum distance between the boundaries\n       * and the popper. This makes sure the popper always has a little padding\n       * between the edges of its container\n       */\n      padding: 5,\n      /**\n       * @prop {String|HTMLElement} boundariesElement='scrollParent'\n       * Boundaries used by the modifier. Can be `scrollParent`, `window`,\n       * `viewport` or any DOM element.\n       */\n      boundariesElement: 'scrollParent'\n    },\n\n    /**\n     * Modifier used to make sure the reference and its popper stay near each other\n     * without leaving any gap between the two. Especially useful when the arrow is\n     * enabled and you want to ensure that it points to its reference element.\n     * It cares only about the first axis. You can still have poppers with margin\n     * between the popper and its reference element.\n     * @memberof modifiers\n     * @inner\n     */\n    keepTogether: {\n      /** @prop {number} order=400 - Index used to define the order of execution */\n      order: 400,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: keepTogether\n    },\n\n    /**\n     * This modifier is used to move the `arrowElement` of the popper to make\n     * sure it is positioned between the reference element and its popper element.\n     * It will read the outer size of the `arrowElement` node to detect how many\n     * pixels of conjunction are needed.\n     *\n     * It has no effect if no `arrowElement` is provided.\n     * @memberof modifiers\n     * @inner\n     */\n    arrow: {\n      /** @prop {number} order=500 - Index used to define the order of execution */\n      order: 500,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: arrow,\n      /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */\n      element: '[x-arrow]'\n    },\n\n    /**\n     * Modifier used to flip the popper's placement when it starts to overlap its\n     * reference element.\n     *\n     * Requires the `preventOverflow` modifier before it in order to work.\n     *\n     * **NOTE:** this modifier will interrupt the current update cycle and will\n     * restart it if it detects the need to flip the placement.\n     * @memberof modifiers\n     * @inner\n     */\n    flip: {\n      /** @prop {number} order=600 - Index used to define the order of execution */\n      order: 600,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: flip,\n      /**\n       * @prop {String|Array} behavior='flip'\n       * The behavior used to change the popper's placement. It can be one of\n       * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid\n       * placements (with optional variations)\n       */\n      behavior: 'flip',\n      /**\n       * @prop {number} padding=5\n       * The popper will flip if it hits the edges of the `boundariesElement`\n       */\n      padding: 5,\n      /**\n       * @prop {String|HTMLElement} boundariesElement='viewport'\n       * The element which will define the boundaries of the popper position.\n       * The popper will never be placed outside of the defined boundaries\n       * (except if `keepTogether` is enabled)\n       */\n      boundariesElement: 'viewport'\n    },\n\n    /**\n     * Modifier used to make the popper flow toward the inner of the reference element.\n     * By default, when this modifier is disabled, the popper will be placed outside\n     * the reference element.\n     * @memberof modifiers\n     * @inner\n     */\n    inner: {\n      /** @prop {number} order=700 - Index used to define the order of execution */\n      order: 700,\n      /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */\n      enabled: false,\n      /** @prop {ModifierFn} */\n      fn: inner\n    },\n\n    /**\n     * Modifier used to hide the popper when its reference element is outside of the\n     * popper boundaries. It will set a `x-out-of-boundaries` attribute which can\n     * be used to hide with a CSS selector the popper when its reference is\n     * out of boundaries.\n     *\n     * Requires the `preventOverflow` modifier before it in order to work.\n     * @memberof modifiers\n     * @inner\n     */\n    hide: {\n      /** @prop {number} order=800 - Index used to define the order of execution */\n      order: 800,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: hide\n    },\n\n    /**\n     * Computes the style that will be applied to the popper element to gets\n     * properly positioned.\n     *\n     * Note that this modifier will not touch the DOM, it just prepares the styles\n     * so that `applyStyle` modifier can apply it. This separation is useful\n     * in case you need to replace `applyStyle` with a custom implementation.\n     *\n     * This modifier has `850` as `order` value to maintain backward compatibility\n     * with previous versions of Popper.js. Expect the modifiers ordering method\n     * to change in future major versions of the library.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    computeStyle: {\n      /** @prop {number} order=850 - Index used to define the order of execution */\n      order: 850,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: computeStyle,\n      /**\n       * @prop {Boolean} gpuAcceleration=true\n       * If true, it uses the CSS 3D transformation to position the popper.\n       * Otherwise, it will use the `top` and `left` properties\n       */\n      gpuAcceleration: true,\n      /**\n       * @prop {string} [x='bottom']\n       * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin.\n       * Change this if your popper should grow in a direction different from `bottom`\n       */\n      x: 'bottom',\n      /**\n       * @prop {string} [x='left']\n       * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin.\n       * Change this if your popper should grow in a direction different from `right`\n       */\n      y: 'right'\n    },\n\n    /**\n     * Applies the computed styles to the popper element.\n     *\n     * All the DOM manipulations are limited to this modifier. This is useful in case\n     * you want to integrate Popper.js inside a framework or view library and you\n     * want to delegate all the DOM manipulations to it.\n     *\n     * Note that if you disable this modifier, you must make sure the popper element\n     * has its position set to `absolute` before Popper.js can do its work!\n     *\n     * Just disable this modifier and define your own to achieve the desired effect.\n     *\n     * @memberof modifiers\n     * @inner\n     */\n    applyStyle: {\n      /** @prop {number} order=900 - Index used to define the order of execution */\n      order: 900,\n      /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */\n      enabled: true,\n      /** @prop {ModifierFn} */\n      fn: applyStyle,\n      /** @prop {Function} */\n      onLoad: applyStyleOnLoad,\n      /**\n       * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier\n       * @prop {Boolean} gpuAcceleration=true\n       * If true, it uses the CSS 3D transformation to position the popper.\n       * Otherwise, it will use the `top` and `left` properties\n       */\n      gpuAcceleration: undefined\n    }\n  };\n\n  /**\n   * The `dataObject` is an object containing all the information used by Popper.js.\n   * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks.\n   * @name dataObject\n   * @property {Object} data.instance The Popper.js instance\n   * @property {String} data.placement Placement applied to popper\n   * @property {String} data.originalPlacement Placement originally defined on init\n   * @property {Boolean} data.flipped True if popper has been flipped by flip modifier\n   * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper\n   * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier\n   * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`)\n   * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`)\n   * @property {Object} data.boundaries Offsets of the popper boundaries\n   * @property {Object} data.offsets The measurements of popper, reference and arrow elements\n   * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values\n   * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values\n   * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0\n   */\n\n  /**\n   * Default options provided to Popper.js constructor.<br />\n   * These can be overridden using the `options` argument of Popper.js.<br />\n   * To override an option, simply pass an object with the same\n   * structure of the `options` object, as the 3rd argument. For example:\n   * ```\n   * new Popper(ref, pop, {\n   *   modifiers: {\n   *     preventOverflow: { enabled: false }\n   *   }\n   * })\n   * ```\n   * @type {Object}\n   * @static\n   * @memberof Popper\n   */\n  var Defaults = {\n    /**\n     * Popper's placement.\n     * @prop {Popper.placements} placement='bottom'\n     */\n    placement: 'bottom',\n\n    /**\n     * Set this to true if you want popper to position it self in 'fixed' mode\n     * @prop {Boolean} positionFixed=false\n     */\n    positionFixed: false,\n\n    /**\n     * Whether events (resize, scroll) are initially enabled.\n     * @prop {Boolean} eventsEnabled=true\n     */\n    eventsEnabled: true,\n\n    /**\n     * Set to true if you want to automatically remove the popper when\n     * you call the `destroy` method.\n     * @prop {Boolean} removeOnDestroy=false\n     */\n    removeOnDestroy: false,\n\n    /**\n     * Callback called when the popper is created.<br />\n     * By default, it is set to no-op.<br />\n     * Access Popper.js instance with `data.instance`.\n     * @prop {onCreate}\n     */\n    onCreate: function onCreate() {},\n\n    /**\n     * Callback called when the popper is updated. This callback is not called\n     * on the initialization/creation of the popper, but only on subsequent\n     * updates.<br />\n     * By default, it is set to no-op.<br />\n     * Access Popper.js instance with `data.instance`.\n     * @prop {onUpdate}\n     */\n    onUpdate: function onUpdate() {},\n\n    /**\n     * List of modifiers used to modify the offsets before they are applied to the popper.\n     * They provide most of the functionalities of Popper.js.\n     * @prop {modifiers}\n     */\n    modifiers: modifiers\n  };\n\n  /**\n   * @callback onCreate\n   * @param {dataObject} data\n   */\n\n  /**\n   * @callback onUpdate\n   * @param {dataObject} data\n   */\n\n  // Utils\n  // Methods\n  var Popper = function () {\n    /**\n     * Creates a new Popper.js instance.\n     * @class Popper\n     * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper\n     * @param {HTMLElement} popper - The HTML element used as the popper\n     * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults)\n     * @return {Object} instance - The generated Popper.js instance\n     */\n    function Popper(reference, popper) {\n      var _this = this;\n\n      var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      classCallCheck(this, Popper);\n\n      this.scheduleUpdate = function () {\n        return requestAnimationFrame(_this.update);\n      };\n\n      // make update() debounced, so that it only runs at most once-per-tick\n      this.update = debounce(this.update.bind(this));\n\n      // with {} we create a new object with the options inside it\n      this.options = _extends({}, Popper.Defaults, options);\n\n      // init state\n      this.state = {\n        isDestroyed: false,\n        isCreated: false,\n        scrollParents: []\n      };\n\n      // get reference and popper elements (allow jQuery wrappers)\n      this.reference = reference && reference.jquery ? reference[0] : reference;\n      this.popper = popper && popper.jquery ? popper[0] : popper;\n\n      // Deep merge modifiers options\n      this.options.modifiers = {};\n      Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) {\n        _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {});\n      });\n\n      // Refactoring modifiers' list (Object => Array)\n      this.modifiers = Object.keys(this.options.modifiers).map(function (name) {\n        return _extends({\n          name: name\n        }, _this.options.modifiers[name]);\n      })\n      // sort the modifiers by order\n      .sort(function (a, b) {\n        return a.order - b.order;\n      });\n\n      // modifiers have the ability to execute arbitrary code when Popper.js get inited\n      // such code is executed in the same order of its modifier\n      // they could add new properties to their options configuration\n      // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`!\n      this.modifiers.forEach(function (modifierOptions) {\n        if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) {\n          modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state);\n        }\n      });\n\n      // fire the first update to position the popper in the right place\n      this.update();\n\n      var eventsEnabled = this.options.eventsEnabled;\n      if (eventsEnabled) {\n        // setup event listeners, they will take care of update the position in specific situations\n        this.enableEventListeners();\n      }\n\n      this.state.eventsEnabled = eventsEnabled;\n    }\n\n    // We can't use class properties because they don't get listed in the\n    // class prototype and break stuff like Sinon stubs\n\n\n    createClass(Popper, [{\n      key: 'update',\n      value: function update$$1() {\n        return update.call(this);\n      }\n    }, {\n      key: 'destroy',\n      value: function destroy$$1() {\n        return destroy.call(this);\n      }\n    }, {\n      key: 'enableEventListeners',\n      value: function enableEventListeners$$1() {\n        return enableEventListeners.call(this);\n      }\n    }, {\n      key: 'disableEventListeners',\n      value: function disableEventListeners$$1() {\n        return disableEventListeners.call(this);\n      }\n\n      /**\n       * Schedules an update. It will run on the next UI update available.\n       * @method scheduleUpdate\n       * @memberof Popper\n       */\n\n\n      /**\n       * Collection of utilities useful when writing custom modifiers.\n       * Starting from version 1.7, this method is available only if you\n       * include `popper-utils.js` before `popper.js`.\n       *\n       * **DEPRECATION**: This way to access PopperUtils is deprecated\n       * and will be removed in v2! Use the PopperUtils module directly instead.\n       * Due to the high instability of the methods contained in Utils, we can't\n       * guarantee them to follow semver. Use them at your own risk!\n       * @static\n       * @private\n       * @type {Object}\n       * @deprecated since version 1.8\n       * @member Utils\n       * @memberof Popper\n       */\n\n    }]);\n    return Popper;\n  }();\n\n  /**\n   * The `referenceObject` is an object that provides an interface compatible with Popper.js\n   * and lets you use it as replacement of a real DOM node.<br />\n   * You can use this method to position a popper relatively to a set of coordinates\n   * in case you don't have a DOM node to use as reference.\n   *\n   * ```\n   * new Popper(referenceObject, popperNode);\n   * ```\n   *\n   * NB: This feature isn't supported in Internet Explorer 10.\n   * @name referenceObject\n   * @property {Function} data.getBoundingClientRect\n   * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method.\n   * @property {number} data.clientWidth\n   * An ES6 getter that will return the width of the virtual reference element.\n   * @property {number} data.clientHeight\n   * An ES6 getter that will return the height of the virtual reference element.\n   */\n\n\n  Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils;\n  Popper.placements = placements;\n  Popper.Defaults = Defaults;\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$4 = 'dropdown';\n  var VERSION$4 = '4.3.1';\n  var DATA_KEY$4 = 'bs.dropdown';\n  var EVENT_KEY$4 = \".\" + DATA_KEY$4;\n  var DATA_API_KEY$4 = '.data-api';\n  var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4];\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n  var Event$4 = {\n    HIDE: \"hide\" + EVENT_KEY$4,\n    HIDDEN: \"hidden\" + EVENT_KEY$4,\n    SHOW: \"show\" + EVENT_KEY$4,\n    SHOWN: \"shown\" + EVENT_KEY$4,\n    CLICK: \"click\" + EVENT_KEY$4,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYUP_DATA_API: \"keyup\" + EVENT_KEY$4 + DATA_API_KEY$4\n  };\n  var ClassName$4 = {\n    DISABLED: 'disabled',\n    SHOW: 'show',\n    DROPUP: 'dropup',\n    DROPRIGHT: 'dropright',\n    DROPLEFT: 'dropleft',\n    MENURIGHT: 'dropdown-menu-right',\n    MENULEFT: 'dropdown-menu-left',\n    POSITION_STATIC: 'position-static'\n  };\n  var Selector$4 = {\n    DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n    FORM_CHILD: '.dropdown form',\n    MENU: '.dropdown-menu',\n    NAVBAR_NAV: '.navbar-nav',\n    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n  };\n  var AttachmentMap = {\n    TOP: 'top-start',\n    TOPEND: 'top-end',\n    BOTTOM: 'bottom-start',\n    BOTTOMEND: 'bottom-end',\n    RIGHT: 'right-start',\n    RIGHTEND: 'right-end',\n    LEFT: 'left-start',\n    LEFTEND: 'left-end'\n  };\n  var Default$2 = {\n    offset: 0,\n    flip: true,\n    boundary: 'scrollParent',\n    reference: 'toggle',\n    display: 'dynamic'\n  };\n  var DefaultType$2 = {\n    offset: '(number|string|function)',\n    flip: 'boolean',\n    boundary: '(string|element)',\n    reference: '(string|element)',\n    display: 'string'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Dropdown =\n  /*#__PURE__*/\n  function () {\n    function Dropdown(element, config) {\n      this._element = element;\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Dropdown.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      var isActive = $(this._menu).hasClass(ClassName$4.SHOW);\n\n      Dropdown._clearMenus();\n\n      if (isActive) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      } // Disable totally Popper.js for Dropdown in Navbar\n\n\n      if (!this._inNavbar) {\n        /**\n         * Check for Popper dependency\n         * Popper - https://popper.js.org\n         */\n        if (typeof Popper === 'undefined') {\n          throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)');\n        }\n\n        var referenceElement = this._element;\n\n        if (this._config.reference === 'parent') {\n          referenceElement = parent;\n        } else if (Util.isElement(this._config.reference)) {\n          referenceElement = this._config.reference; // Check if it's jQuery element\n\n          if (typeof this._config.reference.jquery !== 'undefined') {\n            referenceElement = this._config.reference[0];\n          }\n        } // If boundary is not `scrollParent`, then set position to `static`\n        // to allow the menu to \"escape\" the scroll parent's boundaries\n        // https://github.com/twbs/bootstrap/issues/24251\n\n\n        if (this._config.boundary !== 'scrollParent') {\n          $(parent).addClass(ClassName$4.POSITION_STATIC);\n        }\n\n        this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) {\n        $(document.body).children().on('mouseover', null, $.noop);\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.show = function show() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.hide = function hide() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$4);\n      $(this._element).off(EVENT_KEY$4);\n      this._element = null;\n      this._menu = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    };\n\n    _proto.update = function update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Private\n    ;\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this = this;\n\n      $(this._element).on(Event$4.CLICK, function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        _this.toggle();\n      });\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);\n      Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getMenuElement = function _getMenuElement() {\n      if (!this._menu) {\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        if (parent) {\n          this._menu = parent.querySelector(Selector$4.MENU);\n        }\n      }\n\n      return this._menu;\n    };\n\n    _proto._getPlacement = function _getPlacement() {\n      var $parentDropdown = $(this._element.parentNode);\n      var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n      if ($parentDropdown.hasClass(ClassName$4.DROPUP)) {\n        placement = AttachmentMap.TOP;\n\n        if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n          placement = AttachmentMap.TOPEND;\n        }\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) {\n        placement = AttachmentMap.RIGHT;\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) {\n        placement = AttachmentMap.LEFT;\n      } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n        placement = AttachmentMap.BOTTOMEND;\n      }\n\n      return placement;\n    };\n\n    _proto._detectNavbar = function _detectNavbar() {\n      return $(this._element).closest('.navbar').length > 0;\n    };\n\n    _proto._getOffset = function _getOffset() {\n      var _this2 = this;\n\n      var offset = {};\n\n      if (typeof this._config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this._config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getPopperConfig = function _getPopperConfig() {\n      var popperConfig = {\n        placement: this._getPlacement(),\n        modifiers: {\n          offset: this._getOffset(),\n          flip: {\n            enabled: this._config.flip\n          },\n          preventOverflow: {\n            boundariesElement: this._config.boundary\n          }\n        } // Disable Popper.js if we have a static display\n\n      };\n\n      if (this._config.display === 'static') {\n        popperConfig.modifiers.applyStyle = {\n          enabled: false\n        };\n      }\n\n      return popperConfig;\n    } // Static\n    ;\n\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$4);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data) {\n          data = new Dropdown(this, _config);\n          $(this).data(DATA_KEY$4, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    Dropdown._clearMenus = function _clearMenus(event) {\n      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n        return;\n      }\n\n      var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE));\n\n      for (var i = 0, len = toggles.length; i < len; i++) {\n        var parent = Dropdown._getParentFromElement(toggles[i]);\n\n        var context = $(toggles[i]).data(DATA_KEY$4);\n        var relatedTarget = {\n          relatedTarget: toggles[i]\n        };\n\n        if (event && event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n\n        if (!context) {\n          continue;\n        }\n\n        var dropdownMenu = context._menu;\n\n        if (!$(parent).hasClass(ClassName$4.SHOW)) {\n          continue;\n        }\n\n        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {\n          continue;\n        }\n\n        var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n        $(parent).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          continue;\n        } // If this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().off('mouseover', null, $.noop);\n        }\n\n        toggles[i].setAttribute('aria-expanded', 'false');\n        $(dropdownMenu).removeClass(ClassName$4.SHOW);\n        $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n      }\n    };\n\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\n      var parent;\n      var selector = Util.getSelectorFromElement(element);\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      return parent || element.parentNode;\n    } // eslint-disable-next-line complexity\n    ;\n\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this);\n\n      var isActive = $(parent).hasClass(ClassName$4.SHOW);\n\n      if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n        if (event.which === ESCAPE_KEYCODE) {\n          var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);\n          $(toggle).trigger('focus');\n        }\n\n        $(this).trigger('click');\n        return;\n      }\n\n      var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));\n\n      if (items.length === 0) {\n        return;\n      }\n\n      var index = items.indexOf(event.target);\n\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\n        // Up\n        index--;\n      }\n\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n        // Down\n        index++;\n      }\n\n      if (index < 0) {\n        index = 0;\n      }\n\n      items[index].focus();\n    };\n\n    _createClass(Dropdown, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$4;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$2;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$2;\n      }\n    }]);\n\n    return Dropdown;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + \" \" + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    Dropdown._jQueryInterface.call($(this), 'toggle');\n  }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) {\n    e.stopPropagation();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$4] = Dropdown._jQueryInterface;\n  $.fn[NAME$4].Constructor = Dropdown;\n\n  $.fn[NAME$4].noConflict = function () {\n    $.fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n    return Dropdown._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$5 = 'modal';\n  var VERSION$5 = '4.3.1';\n  var DATA_KEY$5 = 'bs.modal';\n  var EVENT_KEY$5 = \".\" + DATA_KEY$5;\n  var DATA_API_KEY$5 = '.data-api';\n  var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5];\n  var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var Default$3 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true,\n    show: true\n  };\n  var DefaultType$3 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean',\n    show: 'boolean'\n  };\n  var Event$5 = {\n    HIDE: \"hide\" + EVENT_KEY$5,\n    HIDDEN: \"hidden\" + EVENT_KEY$5,\n    SHOW: \"show\" + EVENT_KEY$5,\n    SHOWN: \"shown\" + EVENT_KEY$5,\n    FOCUSIN: \"focusin\" + EVENT_KEY$5,\n    RESIZE: \"resize\" + EVENT_KEY$5,\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$5,\n    KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY$5,\n    MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY$5,\n    MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY$5,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$5 + DATA_API_KEY$5\n  };\n  var ClassName$5 = {\n    SCROLLABLE: 'modal-dialog-scrollable',\n    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n    BACKDROP: 'modal-backdrop',\n    OPEN: 'modal-open',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$5 = {\n    DIALOG: '.modal-dialog',\n    MODAL_BODY: '.modal-body',\n    DATA_TOGGLE: '[data-toggle=\"modal\"]',\n    DATA_DISMISS: '[data-dismiss=\"modal\"]',\n    FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n    STICKY_CONTENT: '.sticky-top'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Modal =\n  /*#__PURE__*/\n  function () {\n    function Modal(element, config) {\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._dialog = element.querySelector(Selector$5.DIALOG);\n      this._backdrop = null;\n      this._isShown = false;\n      this._isBodyOverflowing = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollbarWidth = 0;\n    } // Getters\n\n\n    var _proto = Modal.prototype;\n\n    // Public\n    _proto.toggle = function toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    };\n\n    _proto.show = function show(relatedTarget) {\n      var _this = this;\n\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      if ($(this._element).hasClass(ClassName$5.FADE)) {\n        this._isTransitioning = true;\n      }\n\n      var showEvent = $.Event(Event$5.SHOW, {\n        relatedTarget: relatedTarget\n      });\n      $(this._element).trigger(showEvent);\n\n      if (this._isShown || showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = true;\n\n      this._checkScrollbar();\n\n      this._setScrollbar();\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) {\n        return _this.hide(event);\n      });\n      $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () {\n        $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) {\n          if ($(event.target).is(_this._element)) {\n            _this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(function () {\n        return _this._showElement(relatedTarget);\n      });\n    };\n\n    _proto.hide = function hide(event) {\n      var _this2 = this;\n\n      if (event) {\n        event.preventDefault();\n      }\n\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      var hideEvent = $.Event(Event$5.HIDE);\n      $(this._element).trigger(hideEvent);\n\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = false;\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (transition) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(document).off(Event$5.FOCUSIN);\n      $(this._element).removeClass(ClassName$5.SHOW);\n      $(this._element).off(Event$5.CLICK_DISMISS);\n      $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS);\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, function (event) {\n          return _this2._hideModal(event);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        this._hideModal();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      [window, this._element, this._dialog].forEach(function (htmlElement) {\n        return $(htmlElement).off(EVENT_KEY$5);\n      });\n      /**\n       * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n       * Do not move `document` in `htmlElements` array\n       * It will remove `Event.CLICK_DATA_API` event that should remain\n       */\n\n      $(document).off(Event$5.FOCUSIN);\n      $.removeData(this._element, DATA_KEY$5);\n      this._config = null;\n      this._element = null;\n      this._dialog = null;\n      this._backdrop = null;\n      this._isShown = null;\n      this._isBodyOverflowing = null;\n      this._ignoreBackdropClick = null;\n      this._isTransitioning = null;\n      this._scrollbarWidth = null;\n    };\n\n    _proto.handleUpdate = function handleUpdate() {\n      this._adjustDialog();\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$3, config);\n      Util.typeCheckConfig(NAME$5, config, DefaultType$3);\n      return config;\n    };\n\n    _proto._showElement = function _showElement(relatedTarget) {\n      var _this3 = this;\n\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.appendChild(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {\n        this._dialog.querySelector(Selector$5.MODAL_BODY).scrollTop = 0;\n      } else {\n        this._element.scrollTop = 0;\n      }\n\n      if (transition) {\n        Util.reflow(this._element);\n      }\n\n      $(this._element).addClass(ClassName$5.SHOW);\n\n      if (this._config.focus) {\n        this._enforceFocus();\n      }\n\n      var shownEvent = $.Event(Event$5.SHOWN, {\n        relatedTarget: relatedTarget\n      });\n\n      var transitionComplete = function transitionComplete() {\n        if (_this3._config.focus) {\n          _this3._element.focus();\n        }\n\n        _this3._isTransitioning = false;\n        $(_this3._element).trigger(shownEvent);\n      };\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);\n        $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n      } else {\n        transitionComplete();\n      }\n    };\n\n    _proto._enforceFocus = function _enforceFocus() {\n      var _this4 = this;\n\n      $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop\n      .on(Event$5.FOCUSIN, function (event) {\n        if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {\n          _this4._element.focus();\n        }\n      });\n    };\n\n    _proto._setEscapeEvent = function _setEscapeEvent() {\n      var _this5 = this;\n\n      if (this._isShown && this._config.keyboard) {\n        $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {\n          if (event.which === ESCAPE_KEYCODE$1) {\n            event.preventDefault();\n\n            _this5.hide();\n          }\n        });\n      } else if (!this._isShown) {\n        $(this._element).off(Event$5.KEYDOWN_DISMISS);\n      }\n    };\n\n    _proto._setResizeEvent = function _setResizeEvent() {\n      var _this6 = this;\n\n      if (this._isShown) {\n        $(window).on(Event$5.RESIZE, function (event) {\n          return _this6.handleUpdate(event);\n        });\n      } else {\n        $(window).off(Event$5.RESIZE);\n      }\n    };\n\n    _proto._hideModal = function _hideModal() {\n      var _this7 = this;\n\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._isTransitioning = false;\n\n      this._showBackdrop(function () {\n        $(document.body).removeClass(ClassName$5.OPEN);\n\n        _this7._resetAdjustments();\n\n        _this7._resetScrollbar();\n\n        $(_this7._element).trigger(Event$5.HIDDEN);\n      });\n    };\n\n    _proto._removeBackdrop = function _removeBackdrop() {\n      if (this._backdrop) {\n        $(this._backdrop).remove();\n        this._backdrop = null;\n      }\n    };\n\n    _proto._showBackdrop = function _showBackdrop(callback) {\n      var _this8 = this;\n\n      var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';\n\n      if (this._isShown && this._config.backdrop) {\n        this._backdrop = document.createElement('div');\n        this._backdrop.className = ClassName$5.BACKDROP;\n\n        if (animate) {\n          this._backdrop.classList.add(animate);\n        }\n\n        $(this._backdrop).appendTo(document.body);\n        $(this._element).on(Event$5.CLICK_DISMISS, function (event) {\n          if (_this8._ignoreBackdropClick) {\n            _this8._ignoreBackdropClick = false;\n            return;\n          }\n\n          if (event.target !== event.currentTarget) {\n            return;\n          }\n\n          if (_this8._config.backdrop === 'static') {\n            _this8._element.focus();\n          } else {\n            _this8.hide();\n          }\n        });\n\n        if (animate) {\n          Util.reflow(this._backdrop);\n        }\n\n        $(this._backdrop).addClass(ClassName$5.SHOW);\n\n        if (!callback) {\n          return;\n        }\n\n        if (!animate) {\n          callback();\n          return;\n        }\n\n        var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n        $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n      } else if (!this._isShown && this._backdrop) {\n        $(this._backdrop).removeClass(ClassName$5.SHOW);\n\n        var callbackRemove = function callbackRemove() {\n          _this8._removeBackdrop();\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        if ($(this._element).hasClass(ClassName$5.FADE)) {\n          var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n          $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n        } else {\n          callbackRemove();\n        }\n      } else if (callback) {\n        callback();\n      }\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // todo (fat): these should probably be refactored out of modal.js\n    // ----------------------------------------------------------------------\n    ;\n\n    _proto._adjustDialog = function _adjustDialog() {\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      if (!this._isBodyOverflowing && isModalOverflowing) {\n        this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n      }\n\n      if (this._isBodyOverflowing && !isModalOverflowing) {\n        this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n      }\n    };\n\n    _proto._resetAdjustments = function _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    };\n\n    _proto._checkScrollbar = function _checkScrollbar() {\n      var rect = document.body.getBoundingClientRect();\n      this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n      this._scrollbarWidth = this._getScrollbarWidth();\n    };\n\n    _proto._setScrollbar = function _setScrollbar() {\n      var _this9 = this;\n\n      if (this._isBodyOverflowing) {\n        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n        var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n        var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding\n\n        $(fixedContent).each(function (index, element) {\n          var actualPadding = element.style.paddingRight;\n          var calculatedPadding = $(element).css('padding-right');\n          $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n        }); // Adjust sticky content margin\n\n        $(stickyContent).each(function (index, element) {\n          var actualMargin = element.style.marginRight;\n          var calculatedMargin = $(element).css('margin-right');\n          $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n        }); // Adjust body padding\n\n        var actualPadding = document.body.style.paddingRight;\n        var calculatedPadding = $(document.body).css('padding-right');\n        $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n      }\n\n      $(document.body).addClass(ClassName$5.OPEN);\n    };\n\n    _proto._resetScrollbar = function _resetScrollbar() {\n      // Restore fixed content padding\n      var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n      $(fixedContent).each(function (index, element) {\n        var padding = $(element).data('padding-right');\n        $(element).removeData('padding-right');\n        element.style.paddingRight = padding ? padding : '';\n      }); // Restore sticky content\n\n      var elements = [].slice.call(document.querySelectorAll(\"\" + Selector$5.STICKY_CONTENT));\n      $(elements).each(function (index, element) {\n        var margin = $(element).data('margin-right');\n\n        if (typeof margin !== 'undefined') {\n          $(element).css('margin-right', margin).removeData('margin-right');\n        }\n      }); // Restore body padding\n\n      var padding = $(document.body).data('padding-right');\n      $(document.body).removeData('padding-right');\n      document.body.style.paddingRight = padding ? padding : '';\n    };\n\n    _proto._getScrollbarWidth = function _getScrollbarWidth() {\n      // thx d.walsh\n      var scrollDiv = document.createElement('div');\n      scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER;\n      document.body.appendChild(scrollDiv);\n      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n      document.body.removeChild(scrollDiv);\n      return scrollbarWidth;\n    } // Static\n    ;\n\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$5);\n\n        var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});\n\n        if (!data) {\n          data = new Modal(this, _config);\n          $(this).data(DATA_KEY$5, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](relatedTarget);\n        } else if (_config.show) {\n          data.show(relatedTarget);\n        }\n      });\n    };\n\n    _createClass(Modal, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$5;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$3;\n      }\n    }]);\n\n    return Modal;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {\n    var _this10 = this;\n\n    var target;\n    var selector = Util.getSelectorFromElement(this);\n\n    if (selector) {\n      target = document.querySelector(selector);\n    }\n\n    var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());\n\n    if (this.tagName === 'A' || this.tagName === 'AREA') {\n      event.preventDefault();\n    }\n\n    var $target = $(target).one(Event$5.SHOW, function (showEvent) {\n      if (showEvent.isDefaultPrevented()) {\n        // Only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      $target.one(Event$5.HIDDEN, function () {\n        if ($(_this10).is(':visible')) {\n          _this10.focus();\n        }\n      });\n    });\n\n    Modal._jQueryInterface.call($(target), config, this);\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$5] = Modal._jQueryInterface;\n  $.fn[NAME$5].Constructor = Modal;\n\n  $.fn[NAME$5].noConflict = function () {\n    $.fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n    return Modal._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): tools/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];\n  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  var DefaultWhitelist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n    /**\n     * A pattern that recognizes a commonly useful subset of URLs that are safe.\n     *\n     * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n     */\n\n  };\n  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;\n\n  function allowedAttribute(attr, allowedAttributeList) {\n    var attrName = attr.nodeName.toLowerCase();\n\n    if (allowedAttributeList.indexOf(attrName) !== -1) {\n      if (uriAttrs.indexOf(attrName) !== -1) {\n        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));\n      }\n\n      return true;\n    }\n\n    var regExp = allowedAttributeList.filter(function (attrRegex) {\n      return attrRegex instanceof RegExp;\n    }); // Check if a regular expression validates the attribute.\n\n    for (var i = 0, l = regExp.length; i < l; i++) {\n      if (attrName.match(regExp[i])) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n    if (unsafeHtml.length === 0) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    var domParser = new window.DOMParser();\n    var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    var whitelistKeys = Object.keys(whiteList);\n    var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));\n\n    var _loop = function _loop(i, len) {\n      var el = elements[i];\n      var elName = el.nodeName.toLowerCase();\n\n      if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n        el.parentNode.removeChild(el);\n        return \"continue\";\n      }\n\n      var attributeList = [].slice.call(el.attributes);\n      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);\n      attributeList.forEach(function (attr) {\n        if (!allowedAttribute(attr, whitelistedAttributes)) {\n          el.removeAttribute(attr.nodeName);\n        }\n      });\n    };\n\n    for (var i = 0, len = elements.length; i < len; i++) {\n      var _ret = _loop(i, len);\n\n      if (_ret === \"continue\") continue;\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$6 = 'tooltip';\n  var VERSION$6 = '4.3.1';\n  var DATA_KEY$6 = 'bs.tooltip';\n  var EVENT_KEY$6 = \".\" + DATA_KEY$6;\n  var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];\n  var CLASS_PREFIX = 'bs-tooltip';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];\n  var DefaultType$4 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(number|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacement: '(string|array)',\n    boundary: '(string|element)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    whiteList: 'object'\n  };\n  var AttachmentMap$1 = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: 'right',\n    BOTTOM: 'bottom',\n    LEFT: 'left'\n  };\n  var Default$4 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: 0,\n    container: false,\n    fallbackPlacement: 'flip',\n    boundary: 'scrollParent',\n    sanitize: true,\n    sanitizeFn: null,\n    whiteList: DefaultWhitelist\n  };\n  var HoverState = {\n    SHOW: 'show',\n    OUT: 'out'\n  };\n  var Event$6 = {\n    HIDE: \"hide\" + EVENT_KEY$6,\n    HIDDEN: \"hidden\" + EVENT_KEY$6,\n    SHOW: \"show\" + EVENT_KEY$6,\n    SHOWN: \"shown\" + EVENT_KEY$6,\n    INSERTED: \"inserted\" + EVENT_KEY$6,\n    CLICK: \"click\" + EVENT_KEY$6,\n    FOCUSIN: \"focusin\" + EVENT_KEY$6,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$6,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$6,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$6\n  };\n  var ClassName$6 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$6 = {\n    TOOLTIP: '.tooltip',\n    TOOLTIP_INNER: '.tooltip-inner',\n    ARROW: '.arrow'\n  };\n  var Trigger = {\n    HOVER: 'hover',\n    FOCUS: 'focus',\n    CLICK: 'click',\n    MANUAL: 'manual'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tooltip =\n  /*#__PURE__*/\n  function () {\n    function Tooltip(element, config) {\n      /**\n       * Check for Popper dependency\n       * Popper - https://popper.js.org\n       */\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)');\n      } // private\n\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this.element = element;\n      this.config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Tooltip.prototype;\n\n    // Public\n    _proto.enable = function enable() {\n      this._isEnabled = true;\n    };\n\n    _proto.disable = function disable() {\n      this._isEnabled = false;\n    };\n\n    _proto.toggleEnabled = function toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    };\n\n    _proto.toggle = function toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        var dataKey = this.constructor.DATA_KEY;\n        var context = $(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $(event.currentTarget).data(dataKey, context);\n        }\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      $.removeData(this.element, this.constructor.DATA_KEY);\n      $(this.element).off(this.constructor.EVENT_KEY);\n      $(this.element).closest('.modal').off('hide.bs.modal');\n\n      if (this.tip) {\n        $(this.tip).remove();\n      }\n\n      this._isEnabled = null;\n      this._timeout = null;\n      this._hoverState = null;\n      this._activeTrigger = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n      }\n\n      this._popper = null;\n      this.element = null;\n      this.config = null;\n      this.tip = null;\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if ($(this.element).css('display') === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      var showEvent = $.Event(this.constructor.Event.SHOW);\n\n      if (this.isWithContent() && this._isEnabled) {\n        $(this.element).trigger(showEvent);\n        var shadowRoot = Util.findShadowRoot(this.element);\n        var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);\n\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\n          return;\n        }\n\n        var tip = this.getTipElement();\n        var tipId = Util.getUID(this.constructor.NAME);\n        tip.setAttribute('id', tipId);\n        this.element.setAttribute('aria-describedby', tipId);\n        this.setContent();\n\n        if (this.config.animation) {\n          $(tip).addClass(ClassName$6.FADE);\n        }\n\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n        var attachment = this._getAttachment(placement);\n\n        this.addAttachmentClass(attachment);\n\n        var container = this._getContainer();\n\n        $(tip).data(this.constructor.DATA_KEY, this);\n\n        if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n          $(tip).appendTo(container);\n        }\n\n        $(this.element).trigger(this.constructor.Event.INSERTED);\n        this._popper = new Popper(this.element, tip, {\n          placement: attachment,\n          modifiers: {\n            offset: this._getOffset(),\n            flip: {\n              behavior: this.config.fallbackPlacement\n            },\n            arrow: {\n              element: Selector$6.ARROW\n            },\n            preventOverflow: {\n              boundariesElement: this.config.boundary\n            }\n          },\n          onCreate: function onCreate(data) {\n            if (data.originalPlacement !== data.placement) {\n              _this._handlePopperPlacementChange(data);\n            }\n          },\n          onUpdate: function onUpdate(data) {\n            return _this._handlePopperPlacementChange(data);\n          }\n        });\n        $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().on('mouseover', null, $.noop);\n        }\n\n        var complete = function complete() {\n          if (_this.config.animation) {\n            _this._fixTransition();\n          }\n\n          var prevHoverState = _this._hoverState;\n          _this._hoverState = null;\n          $(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n          if (prevHoverState === HoverState.OUT) {\n            _this._leave(null, _this);\n          }\n        };\n\n        if ($(this.tip).hasClass(ClassName$6.FADE)) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n          $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n      }\n    };\n\n    _proto.hide = function hide(callback) {\n      var _this2 = this;\n\n      var tip = this.getTipElement();\n      var hideEvent = $.Event(this.constructor.Event.HIDE);\n\n      var complete = function complete() {\n        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n          tip.parentNode.removeChild(tip);\n        }\n\n        _this2._cleanTipClass();\n\n        _this2.element.removeAttribute('aria-describedby');\n\n        $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n        if (_this2._popper !== null) {\n          _this2._popper.destroy();\n        }\n\n        if (callback) {\n          callback();\n        }\n      };\n\n      $(this.element).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        $(document.body).children().off('mouseover', null, $.noop);\n      }\n\n      this._activeTrigger[Trigger.CLICK] = false;\n      this._activeTrigger[Trigger.FOCUS] = false;\n      this._activeTrigger[Trigger.HOVER] = false;\n\n      if ($(this.tip).hasClass(ClassName$6.FADE)) {\n        var transitionDuration = Util.getTransitionDurationFromElement(tip);\n        $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n\n      this._hoverState = '';\n    };\n\n    _proto.update = function update() {\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Protected\n    ;\n\n    _proto.isWithContent = function isWithContent() {\n      return Boolean(this.getTitle());\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var tip = this.getTipElement();\n      this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle());\n      $(tip).removeClass(ClassName$6.FADE + \" \" + ClassName$6.SHOW);\n    };\n\n    _proto.setElementContent = function setElementContent($element, content) {\n      if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n        // Content is a DOM node or a jQuery\n        if (this.config.html) {\n          if (!$(content).parent().is($element)) {\n            $element.empty().append(content);\n          }\n        } else {\n          $element.text($(content).text());\n        }\n\n        return;\n      }\n\n      if (this.config.html) {\n        if (this.config.sanitize) {\n          content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);\n        }\n\n        $element.html(content);\n      } else {\n        $element.text(content);\n      }\n    };\n\n    _proto.getTitle = function getTitle() {\n      var title = this.element.getAttribute('data-original-title');\n\n      if (!title) {\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n      }\n\n      return title;\n    } // Private\n    ;\n\n    _proto._getOffset = function _getOffset() {\n      var _this3 = this;\n\n      var offset = {};\n\n      if (typeof this.config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this.config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getContainer = function _getContainer() {\n      if (this.config.container === false) {\n        return document.body;\n      }\n\n      if (Util.isElement(this.config.container)) {\n        return $(this.config.container);\n      }\n\n      return $(document).find(this.config.container);\n    };\n\n    _proto._getAttachment = function _getAttachment(placement) {\n      return AttachmentMap$1[placement.toUpperCase()];\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this4 = this;\n\n      var triggers = this.config.trigger.split(' ');\n      triggers.forEach(function (trigger) {\n        if (trigger === 'click') {\n          $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {\n            return _this4.toggle(event);\n          });\n        } else if (trigger !== Trigger.MANUAL) {\n          var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;\n          var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;\n          $(_this4.element).on(eventIn, _this4.config.selector, function (event) {\n            return _this4._enter(event);\n          }).on(eventOut, _this4.config.selector, function (event) {\n            return _this4._leave(event);\n          });\n        }\n      });\n      $(this.element).closest('.modal').on('hide.bs.modal', function () {\n        if (_this4.element) {\n          _this4.hide();\n        }\n      });\n\n      if (this.config.selector) {\n        this.config = _objectSpread({}, this.config, {\n          trigger: 'manual',\n          selector: ''\n        });\n      } else {\n        this._fixTitle();\n      }\n    };\n\n    _proto._fixTitle = function _fixTitle() {\n      var titleType = typeof this.element.getAttribute('data-original-title');\n\n      if (this.element.getAttribute('title') || titleType !== 'string') {\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n        this.element.setAttribute('title', '');\n      }\n    };\n\n    _proto._enter = function _enter(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n      }\n\n      if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) {\n        context._hoverState = HoverState.SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.SHOW;\n\n      if (!context.config.delay || !context.config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.SHOW) {\n          context.show();\n        }\n      }, context.config.delay.show);\n    };\n\n    _proto._leave = function _leave(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.OUT;\n\n      if (!context.config.delay || !context.config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.OUT) {\n          context.hide();\n        }\n      }, context.config.delay.hide);\n    };\n\n    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n      for (var trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      var dataAttributes = $(this.element).data();\n      Object.keys(dataAttributes).forEach(function (dataAttr) {\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);\n      }\n\n      return config;\n    };\n\n    _proto._getDelegateConfig = function _getDelegateConfig() {\n      var config = {};\n\n      if (this.config) {\n        for (var key in this.config) {\n          if (this.constructor.Default[key] !== this.config[key]) {\n            config[key] = this.config[key];\n          }\n        }\n      }\n\n      return config;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    };\n\n    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {\n      var popperInstance = popperData.instance;\n      this.tip = popperInstance.popper;\n\n      this._cleanTipClass();\n\n      this.addAttachmentClass(this._getAttachment(popperData.placement));\n    };\n\n    _proto._fixTransition = function _fixTransition() {\n      var tip = this.getTipElement();\n      var initConfigAnimation = this.config.animation;\n\n      if (tip.getAttribute('x-placement') !== null) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.FADE);\n      this.config.animation = false;\n      this.hide();\n      this.show();\n      this.config.animation = initConfigAnimation;\n    } // Static\n    ;\n\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$6);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Tooltip(this, _config);\n          $(this).data(DATA_KEY$6, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tooltip, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$6;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$4;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$6;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$6;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$6;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$6;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$4;\n      }\n    }]);\n\n    return Tooltip;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$6] = Tooltip._jQueryInterface;\n  $.fn[NAME$6].Constructor = Tooltip;\n\n  $.fn[NAME$6].noConflict = function () {\n    $.fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n    return Tooltip._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$7 = 'popover';\n  var VERSION$7 = '4.3.1';\n  var DATA_KEY$7 = 'bs.popover';\n  var EVENT_KEY$7 = \".\" + DATA_KEY$7;\n  var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];\n  var CLASS_PREFIX$1 = 'bs-popover';\n  var BSCLS_PREFIX_REGEX$1 = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX$1 + \"\\\\S+\", 'g');\n\n  var Default$5 = _objectSpread({}, Tooltip.Default, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n  });\n\n  var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, {\n    content: '(string|element|function)'\n  });\n\n  var ClassName$7 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$7 = {\n    TITLE: '.popover-header',\n    CONTENT: '.popover-body'\n  };\n  var Event$7 = {\n    HIDE: \"hide\" + EVENT_KEY$7,\n    HIDDEN: \"hidden\" + EVENT_KEY$7,\n    SHOW: \"show\" + EVENT_KEY$7,\n    SHOWN: \"shown\" + EVENT_KEY$7,\n    INSERTED: \"inserted\" + EVENT_KEY$7,\n    CLICK: \"click\" + EVENT_KEY$7,\n    FOCUSIN: \"focusin\" + EVENT_KEY$7,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$7,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$7,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$7\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Popover =\n  /*#__PURE__*/\n  function (_Tooltip) {\n    _inheritsLoose(Popover, _Tooltip);\n\n    function Popover() {\n      return _Tooltip.apply(this, arguments) || this;\n    }\n\n    var _proto = Popover.prototype;\n\n    // Overrides\n    _proto.isWithContent = function isWithContent() {\n      return this.getTitle() || this._getContent();\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX$1 + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events\n\n      this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle());\n\n      var content = this._getContent();\n\n      if (typeof content === 'function') {\n        content = content.call(this.element);\n      }\n\n      this.setElementContent($tip.find(Selector$7.CONTENT), content);\n      $tip.removeClass(ClassName$7.FADE + \" \" + ClassName$7.SHOW);\n    } // Private\n    ;\n\n    _proto._getContent = function _getContent() {\n      return this.element.getAttribute('data-content') || this.config.content;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    } // Static\n    ;\n\n    Popover._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$7);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Popover(this, _config);\n          $(this).data(DATA_KEY$7, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Popover, null, [{\n      key: \"VERSION\",\n      // Getters\n      get: function get() {\n        return VERSION$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$5;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$7;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$7;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$7;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$7;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$5;\n      }\n    }]);\n\n    return Popover;\n  }(Tooltip);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$7] = Popover._jQueryInterface;\n  $.fn[NAME$7].Constructor = Popover;\n\n  $.fn[NAME$7].noConflict = function () {\n    $.fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n    return Popover._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$8 = 'scrollspy';\n  var VERSION$8 = '4.3.1';\n  var DATA_KEY$8 = 'bs.scrollspy';\n  var EVENT_KEY$8 = \".\" + DATA_KEY$8;\n  var DATA_API_KEY$6 = '.data-api';\n  var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8];\n  var Default$6 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  var DefaultType$6 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  var Event$8 = {\n    ACTIVATE: \"activate\" + EVENT_KEY$8,\n    SCROLL: \"scroll\" + EVENT_KEY$8,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$8 + DATA_API_KEY$6\n  };\n  var ClassName$8 = {\n    DROPDOWN_ITEM: 'dropdown-item',\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active'\n  };\n  var Selector$8 = {\n    DATA_SPY: '[data-spy=\"scroll\"]',\n    ACTIVE: '.active',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    NAV_LINKS: '.nav-link',\n    NAV_ITEMS: '.nav-item',\n    LIST_ITEMS: '.list-group-item',\n    DROPDOWN: '.dropdown',\n    DROPDOWN_ITEMS: '.dropdown-item',\n    DROPDOWN_TOGGLE: '.dropdown-toggle'\n  };\n  var OffsetMethod = {\n    OFFSET: 'offset',\n    POSITION: 'position'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var ScrollSpy =\n  /*#__PURE__*/\n  function () {\n    function ScrollSpy(element, config) {\n      var _this = this;\n\n      this._element = element;\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\n      this._config = this._getConfig(config);\n      this._selector = this._config.target + \" \" + Selector$8.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector$8.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector$8.DROPDOWN_ITEMS);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      $(this._scrollElement).on(Event$8.SCROLL, function (event) {\n        return _this._process(event);\n      });\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    var _proto = ScrollSpy.prototype;\n\n    // Public\n    _proto.refresh = function refresh() {\n      var _this2 = this;\n\n      var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      var targets = [].slice.call(document.querySelectorAll(this._selector));\n      targets.map(function (element) {\n        var target;\n        var targetSelector = Util.getSelectorFromElement(element);\n\n        if (targetSelector) {\n          target = document.querySelector(targetSelector);\n        }\n\n        if (target) {\n          var targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            // TODO (fat): remove sketch reliance on jQuery position/offset\n            return [$(target)[offsetMethod]().top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(function (item) {\n        return item;\n      }).sort(function (a, b) {\n        return a[0] - b[0];\n      }).forEach(function (item) {\n        _this2._offsets.push(item[0]);\n\n        _this2._targets.push(item[1]);\n      });\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$8);\n      $(this._scrollElement).off(EVENT_KEY$8);\n      this._element = null;\n      this._scrollElement = null;\n      this._config = null;\n      this._selector = null;\n      this._offsets = null;\n      this._targets = null;\n      this._activeTarget = null;\n      this._scrollHeight = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$6, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.target !== 'string') {\n        var id = $(config.target).attr('id');\n\n        if (!id) {\n          id = Util.getUID(NAME$8);\n          $(config.target).attr('id', id);\n        }\n\n        config.target = \"#\" + id;\n      }\n\n      Util.typeCheckConfig(NAME$8, config, DefaultType$6);\n      return config;\n    };\n\n    _proto._getScrollTop = function _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    };\n\n    _proto._getScrollHeight = function _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    };\n\n    _proto._getOffsetHeight = function _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    };\n\n    _proto._process = function _process() {\n      var scrollTop = this._getScrollTop() + this._config.offset;\n\n      var scrollHeight = this._getScrollHeight();\n\n      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        var target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      var offsetLength = this._offsets.length;\n\n      for (var i = offsetLength; i--;) {\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    };\n\n    _proto._activate = function _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      var queries = this._selector.split(',').map(function (selector) {\n        return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + selector + \"[href=\\\"\" + target + \"\\\"]\";\n      });\n\n      var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));\n\n      if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) {\n        $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE);\n        $link.addClass(ClassName$8.ACTIVE);\n      } else {\n        // Set triggered link as active\n        $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_LINKS + \", \" + Selector$8.LIST_ITEMS).addClass(ClassName$8.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_ITEMS).children(Selector$8.NAV_LINKS).addClass(ClassName$8.ACTIVE);\n      }\n\n      $(this._scrollElement).trigger(Event$8.ACTIVATE, {\n        relatedTarget: target\n      });\n    };\n\n    _proto._clear = function _clear() {\n      [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {\n        return node.classList.contains(ClassName$8.ACTIVE);\n      }).forEach(function (node) {\n        return node.classList.remove(ClassName$8.ACTIVE);\n      });\n    } // Static\n    ;\n\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$8);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new ScrollSpy(this, _config);\n          $(this).data(DATA_KEY$8, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(ScrollSpy, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$8;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$6;\n      }\n    }]);\n\n    return ScrollSpy;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(window).on(Event$8.LOAD_DATA_API, function () {\n    var scrollSpys = [].slice.call(document.querySelectorAll(Selector$8.DATA_SPY));\n    var scrollSpysLength = scrollSpys.length;\n\n    for (var i = scrollSpysLength; i--;) {\n      var $spy = $(scrollSpys[i]);\n\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$8] = ScrollSpy._jQueryInterface;\n  $.fn[NAME$8].Constructor = ScrollSpy;\n\n  $.fn[NAME$8].noConflict = function () {\n    $.fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n    return ScrollSpy._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$9 = 'tab';\n  var VERSION$9 = '4.3.1';\n  var DATA_KEY$9 = 'bs.tab';\n  var EVENT_KEY$9 = \".\" + DATA_KEY$9;\n  var DATA_API_KEY$7 = '.data-api';\n  var JQUERY_NO_CONFLICT$9 = $.fn[NAME$9];\n  var Event$9 = {\n    HIDE: \"hide\" + EVENT_KEY$9,\n    HIDDEN: \"hidden\" + EVENT_KEY$9,\n    SHOW: \"show\" + EVENT_KEY$9,\n    SHOWN: \"shown\" + EVENT_KEY$9,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$9 + DATA_API_KEY$7\n  };\n  var ClassName$9 = {\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active',\n    DISABLED: 'disabled',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$9 = {\n    DROPDOWN: '.dropdown',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    ACTIVE: '.active',\n    ACTIVE_UL: '> li > .active',\n    DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n    DROPDOWN_TOGGLE: '.dropdown-toggle',\n    DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tab =\n  /*#__PURE__*/\n  function () {\n    function Tab(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Tab.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName$9.ACTIVE) || $(this._element).hasClass(ClassName$9.DISABLED)) {\n        return;\n      }\n\n      var target;\n      var previous;\n      var listElement = $(this._element).closest(Selector$9.NAV_LIST_GROUP)[0];\n      var selector = Util.getSelectorFromElement(this._element);\n\n      if (listElement) {\n        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector$9.ACTIVE_UL : Selector$9.ACTIVE;\n        previous = $.makeArray($(listElement).find(itemSelector));\n        previous = previous[previous.length - 1];\n      }\n\n      var hideEvent = $.Event(Event$9.HIDE, {\n        relatedTarget: this._element\n      });\n      var showEvent = $.Event(Event$9.SHOW, {\n        relatedTarget: previous\n      });\n\n      if (previous) {\n        $(previous).trigger(hideEvent);\n      }\n\n      $(this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (selector) {\n        target = document.querySelector(selector);\n      }\n\n      this._activate(this._element, listElement);\n\n      var complete = function complete() {\n        var hiddenEvent = $.Event(Event$9.HIDDEN, {\n          relatedTarget: _this._element\n        });\n        var shownEvent = $.Event(Event$9.SHOWN, {\n          relatedTarget: previous\n        });\n        $(previous).trigger(hiddenEvent);\n        $(_this._element).trigger(shownEvent);\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$9);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._activate = function _activate(element, container, callback) {\n      var _this2 = this;\n\n      var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector$9.ACTIVE_UL) : $(container).children(Selector$9.ACTIVE);\n      var active = activeElements[0];\n      var isTransitioning = callback && active && $(active).hasClass(ClassName$9.FADE);\n\n      var complete = function complete() {\n        return _this2._transitionComplete(element, active, callback);\n      };\n\n      if (active && isTransitioning) {\n        var transitionDuration = Util.getTransitionDurationFromElement(active);\n        $(active).removeClass(ClassName$9.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n      if (active) {\n        $(active).removeClass(ClassName$9.ACTIVE);\n        var dropdownChild = $(active.parentNode).find(Selector$9.DROPDOWN_ACTIVE_CHILD)[0];\n\n        if (dropdownChild) {\n          $(dropdownChild).removeClass(ClassName$9.ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      $(element).addClass(ClassName$9.ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      Util.reflow(element);\n\n      if (element.classList.contains(ClassName$9.FADE)) {\n        element.classList.add(ClassName$9.SHOW);\n      }\n\n      if (element.parentNode && $(element.parentNode).hasClass(ClassName$9.DROPDOWN_MENU)) {\n        var dropdownElement = $(element).closest(Selector$9.DROPDOWN)[0];\n\n        if (dropdownElement) {\n          var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector$9.DROPDOWN_TOGGLE));\n          $(dropdownToggleList).addClass(ClassName$9.ACTIVE);\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n    ;\n\n    Tab._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$9);\n\n        if (!data) {\n          data = new Tab(this);\n          $this.data(DATA_KEY$9, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tab, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$9;\n      }\n    }]);\n\n    return Tab;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$9.CLICK_DATA_API, Selector$9.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n\n    Tab._jQueryInterface.call($(this), 'show');\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$9] = Tab._jQueryInterface;\n  $.fn[NAME$9].Constructor = Tab;\n\n  $.fn[NAME$9].noConflict = function () {\n    $.fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n    return Tab._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$a = 'toast';\n  var VERSION$a = '4.3.1';\n  var DATA_KEY$a = 'bs.toast';\n  var EVENT_KEY$a = \".\" + DATA_KEY$a;\n  var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];\n  var Event$a = {\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$a,\n    HIDE: \"hide\" + EVENT_KEY$a,\n    HIDDEN: \"hidden\" + EVENT_KEY$a,\n    SHOW: \"show\" + EVENT_KEY$a,\n    SHOWN: \"shown\" + EVENT_KEY$a\n  };\n  var ClassName$a = {\n    FADE: 'fade',\n    HIDE: 'hide',\n    SHOW: 'show',\n    SHOWING: 'showing'\n  };\n  var DefaultType$7 = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  var Default$7 = {\n    animation: true,\n    autohide: true,\n    delay: 500\n  };\n  var Selector$a = {\n    DATA_DISMISS: '[data-dismiss=\"toast\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Toast =\n  /*#__PURE__*/\n  function () {\n    function Toast(element, config) {\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._timeout = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Toast.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      $(this._element).trigger(Event$a.SHOW);\n\n      if (this._config.animation) {\n        this._element.classList.add(ClassName$a.FADE);\n      }\n\n      var complete = function complete() {\n        _this._element.classList.remove(ClassName$a.SHOWING);\n\n        _this._element.classList.add(ClassName$a.SHOW);\n\n        $(_this._element).trigger(Event$a.SHOWN);\n\n        if (_this._config.autohide) {\n          _this.hide();\n        }\n      };\n\n      this._element.classList.remove(ClassName$a.HIDE);\n\n      this._element.classList.add(ClassName$a.SHOWING);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.hide = function hide(withoutTimeout) {\n      var _this2 = this;\n\n      if (!this._element.classList.contains(ClassName$a.SHOW)) {\n        return;\n      }\n\n      $(this._element).trigger(Event$a.HIDE);\n\n      if (withoutTimeout) {\n        this._close();\n      } else {\n        this._timeout = setTimeout(function () {\n          _this2._close();\n        }, this._config.delay);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n\n      if (this._element.classList.contains(ClassName$a.SHOW)) {\n        this._element.classList.remove(ClassName$a.SHOW);\n      }\n\n      $(this._element).off(Event$a.CLICK_DISMISS);\n      $.removeData(this._element, DATA_KEY$a);\n      this._element = null;\n      this._config = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$7, $(this._element).data(), typeof config === 'object' && config ? config : {});\n      Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this3 = this;\n\n      $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {\n        return _this3.hide(true);\n      });\n    };\n\n    _proto._close = function _close() {\n      var _this4 = this;\n\n      var complete = function complete() {\n        _this4._element.classList.add(ClassName$a.HIDE);\n\n        $(_this4._element).trigger(Event$a.HIDDEN);\n      };\n\n      this._element.classList.remove(ClassName$a.SHOW);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    } // Static\n    ;\n\n    Toast._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY$a);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new Toast(this, _config);\n          $element.data(DATA_KEY$a, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](this);\n        }\n      });\n    };\n\n    _createClass(Toast, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$a;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$7;\n      }\n    }]);\n\n    return Toast;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$a] = Toast._jQueryInterface;\n  $.fn[NAME$a].Constructor = Toast;\n\n  $.fn[NAME$a].noConflict = function () {\n    $.fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n    return Toast._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  (function () {\n    if (typeof $ === 'undefined') {\n      throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n    }\n\n    var version = $.fn.jquery.split(' ')[0].split('.');\n    var minMajor = 1;\n    var ltMajor = 2;\n    var minMinor = 9;\n    var minPatch = 1;\n    var maxMajor = 4;\n\n    if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n      throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n    }\n  })();\n\n  exports.Util = Util;\n  exports.Alert = Alert;\n  exports.Button = Button;\n  exports.Carousel = Carousel;\n  exports.Collapse = Collapse;\n  exports.Dropdown = Dropdown;\n  exports.Modal = Modal;\n  exports.Popover = Popover;\n  exports.Scrollspy = ScrollSpy;\n  exports.Tab = Tab;\n  exports.Toast = Toast;\n  exports.Tooltip = Tooltip;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=bootstrap.bundle.js.map\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/bootstrap/dist/js/bootstrap.js",
    "content": "/*!\n  * Bootstrap v4.3.1 (https://getbootstrap.com/)\n  * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n  */\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('jquery'), require('popper.js')) :\n  typeof define === 'function' && define.amd ? define(['exports', 'jquery', 'popper.js'], factory) :\n  (global = global || self, factory(global.bootstrap = {}, global.jQuery, global.Popper));\n}(this, function (exports, $, Popper) { 'use strict';\n\n  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;\n  Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper;\n\n  function _defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  function _createClass(Constructor, protoProps, staticProps) {\n    if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) _defineProperties(Constructor, staticProps);\n    return Constructor;\n  }\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  function _objectSpread(target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i] != null ? arguments[i] : {};\n      var ownKeys = Object.keys(source);\n\n      if (typeof Object.getOwnPropertySymbols === 'function') {\n        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n          return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n        }));\n      }\n\n      ownKeys.forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    }\n\n    return target;\n  }\n\n  function _inheritsLoose(subClass, superClass) {\n    subClass.prototype = Object.create(superClass.prototype);\n    subClass.prototype.constructor = subClass;\n    subClass.__proto__ = superClass;\n  }\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): util.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  /**\n   * ------------------------------------------------------------------------\n   * Private TransitionEnd Helpers\n   * ------------------------------------------------------------------------\n   */\n\n  var TRANSITION_END = 'transitionend';\n  var MAX_UID = 1000000;\n  var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp)\n\n  function toType(obj) {\n    return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase();\n  }\n\n  function getSpecialTransitionEndEvent() {\n    return {\n      bindType: TRANSITION_END,\n      delegateType: TRANSITION_END,\n      handle: function handle(event) {\n        if ($(event.target).is(this)) {\n          return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params\n        }\n\n        return undefined; // eslint-disable-line no-undefined\n      }\n    };\n  }\n\n  function transitionEndEmulator(duration) {\n    var _this = this;\n\n    var called = false;\n    $(this).one(Util.TRANSITION_END, function () {\n      called = true;\n    });\n    setTimeout(function () {\n      if (!called) {\n        Util.triggerTransitionEnd(_this);\n      }\n    }, duration);\n    return this;\n  }\n\n  function setTransitionEndSupport() {\n    $.fn.emulateTransitionEnd = transitionEndEmulator;\n    $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent();\n  }\n  /**\n   * --------------------------------------------------------------------------\n   * Public Util Api\n   * --------------------------------------------------------------------------\n   */\n\n\n  var Util = {\n    TRANSITION_END: 'bsTransitionEnd',\n    getUID: function getUID(prefix) {\n      do {\n        // eslint-disable-next-line no-bitwise\n        prefix += ~~(Math.random() * MAX_UID); // \"~~\" acts like a faster Math.floor() here\n      } while (document.getElementById(prefix));\n\n      return prefix;\n    },\n    getSelectorFromElement: function getSelectorFromElement(element) {\n      var selector = element.getAttribute('data-target');\n\n      if (!selector || selector === '#') {\n        var hrefAttr = element.getAttribute('href');\n        selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : '';\n      }\n\n      try {\n        return document.querySelector(selector) ? selector : null;\n      } catch (err) {\n        return null;\n      }\n    },\n    getTransitionDurationFromElement: function getTransitionDurationFromElement(element) {\n      if (!element) {\n        return 0;\n      } // Get transition-duration of the element\n\n\n      var transitionDuration = $(element).css('transition-duration');\n      var transitionDelay = $(element).css('transition-delay');\n      var floatTransitionDuration = parseFloat(transitionDuration);\n      var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found\n\n      if (!floatTransitionDuration && !floatTransitionDelay) {\n        return 0;\n      } // If multiple durations are defined, take the first\n\n\n      transitionDuration = transitionDuration.split(',')[0];\n      transitionDelay = transitionDelay.split(',')[0];\n      return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n    },\n    reflow: function reflow(element) {\n      return element.offsetHeight;\n    },\n    triggerTransitionEnd: function triggerTransitionEnd(element) {\n      $(element).trigger(TRANSITION_END);\n    },\n    // TODO: Remove in v5\n    supportsTransitionEnd: function supportsTransitionEnd() {\n      return Boolean(TRANSITION_END);\n    },\n    isElement: function isElement(obj) {\n      return (obj[0] || obj).nodeType;\n    },\n    typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) {\n      for (var property in configTypes) {\n        if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n          var expectedTypes = configTypes[property];\n          var value = config[property];\n          var valueType = value && Util.isElement(value) ? 'element' : toType(value);\n\n          if (!new RegExp(expectedTypes).test(valueType)) {\n            throw new Error(componentName.toUpperCase() + \": \" + (\"Option \\\"\" + property + \"\\\" provided type \\\"\" + valueType + \"\\\" \") + (\"but expected type \\\"\" + expectedTypes + \"\\\".\"));\n          }\n        }\n      }\n    },\n    findShadowRoot: function findShadowRoot(element) {\n      if (!document.documentElement.attachShadow) {\n        return null;\n      } // Can find the shadow root otherwise it'll return the document\n\n\n      if (typeof element.getRootNode === 'function') {\n        var root = element.getRootNode();\n        return root instanceof ShadowRoot ? root : null;\n      }\n\n      if (element instanceof ShadowRoot) {\n        return element;\n      } // when we don't find a shadow root\n\n\n      if (!element.parentNode) {\n        return null;\n      }\n\n      return Util.findShadowRoot(element.parentNode);\n    }\n  };\n  setTransitionEndSupport();\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME = 'alert';\n  var VERSION = '4.3.1';\n  var DATA_KEY = 'bs.alert';\n  var EVENT_KEY = \".\" + DATA_KEY;\n  var DATA_API_KEY = '.data-api';\n  var JQUERY_NO_CONFLICT = $.fn[NAME];\n  var Selector = {\n    DISMISS: '[data-dismiss=\"alert\"]'\n  };\n  var Event = {\n    CLOSE: \"close\" + EVENT_KEY,\n    CLOSED: \"closed\" + EVENT_KEY,\n    CLICK_DATA_API: \"click\" + EVENT_KEY + DATA_API_KEY\n  };\n  var ClassName = {\n    ALERT: 'alert',\n    FADE: 'fade',\n    SHOW: 'show'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Alert =\n  /*#__PURE__*/\n  function () {\n    function Alert(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Alert.prototype;\n\n    // Public\n    _proto.close = function close(element) {\n      var rootElement = this._element;\n\n      if (element) {\n        rootElement = this._getRootElement(element);\n      }\n\n      var customEvent = this._triggerCloseEvent(rootElement);\n\n      if (customEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._removeElement(rootElement);\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._getRootElement = function _getRootElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      var parent = false;\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      if (!parent) {\n        parent = $(element).closest(\".\" + ClassName.ALERT)[0];\n      }\n\n      return parent;\n    };\n\n    _proto._triggerCloseEvent = function _triggerCloseEvent(element) {\n      var closeEvent = $.Event(Event.CLOSE);\n      $(element).trigger(closeEvent);\n      return closeEvent;\n    };\n\n    _proto._removeElement = function _removeElement(element) {\n      var _this = this;\n\n      $(element).removeClass(ClassName.SHOW);\n\n      if (!$(element).hasClass(ClassName.FADE)) {\n        this._destroyElement(element);\n\n        return;\n      }\n\n      var transitionDuration = Util.getTransitionDurationFromElement(element);\n      $(element).one(Util.TRANSITION_END, function (event) {\n        return _this._destroyElement(element, event);\n      }).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto._destroyElement = function _destroyElement(element) {\n      $(element).detach().trigger(Event.CLOSED).remove();\n    } // Static\n    ;\n\n    Alert._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY);\n\n        if (!data) {\n          data = new Alert(this);\n          $element.data(DATA_KEY, data);\n        }\n\n        if (config === 'close') {\n          data[config](this);\n        }\n      });\n    };\n\n    Alert._handleDismiss = function _handleDismiss(alertInstance) {\n      return function (event) {\n        if (event) {\n          event.preventDefault();\n        }\n\n        alertInstance.close(this);\n      };\n    };\n\n    _createClass(Alert, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION;\n      }\n    }]);\n\n    return Alert;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert()));\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME] = Alert._jQueryInterface;\n  $.fn[NAME].Constructor = Alert;\n\n  $.fn[NAME].noConflict = function () {\n    $.fn[NAME] = JQUERY_NO_CONFLICT;\n    return Alert._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$1 = 'button';\n  var VERSION$1 = '4.3.1';\n  var DATA_KEY$1 = 'bs.button';\n  var EVENT_KEY$1 = \".\" + DATA_KEY$1;\n  var DATA_API_KEY$1 = '.data-api';\n  var JQUERY_NO_CONFLICT$1 = $.fn[NAME$1];\n  var ClassName$1 = {\n    ACTIVE: 'active',\n    BUTTON: 'btn',\n    FOCUS: 'focus'\n  };\n  var Selector$1 = {\n    DATA_TOGGLE_CARROT: '[data-toggle^=\"button\"]',\n    DATA_TOGGLE: '[data-toggle=\"buttons\"]',\n    INPUT: 'input:not([type=\"hidden\"])',\n    ACTIVE: '.active',\n    BUTTON: '.btn'\n  };\n  var Event$1 = {\n    CLICK_DATA_API: \"click\" + EVENT_KEY$1 + DATA_API_KEY$1,\n    FOCUS_BLUR_DATA_API: \"focus\" + EVENT_KEY$1 + DATA_API_KEY$1 + \" \" + (\"blur\" + EVENT_KEY$1 + DATA_API_KEY$1)\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Button =\n  /*#__PURE__*/\n  function () {\n    function Button(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Button.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      var triggerChangeEvent = true;\n      var addAriaPressed = true;\n      var rootElement = $(this._element).closest(Selector$1.DATA_TOGGLE)[0];\n\n      if (rootElement) {\n        var input = this._element.querySelector(Selector$1.INPUT);\n\n        if (input) {\n          if (input.type === 'radio') {\n            if (input.checked && this._element.classList.contains(ClassName$1.ACTIVE)) {\n              triggerChangeEvent = false;\n            } else {\n              var activeElement = rootElement.querySelector(Selector$1.ACTIVE);\n\n              if (activeElement) {\n                $(activeElement).removeClass(ClassName$1.ACTIVE);\n              }\n            }\n          }\n\n          if (triggerChangeEvent) {\n            if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) {\n              return;\n            }\n\n            input.checked = !this._element.classList.contains(ClassName$1.ACTIVE);\n            $(input).trigger('change');\n          }\n\n          input.focus();\n          addAriaPressed = false;\n        }\n      }\n\n      if (addAriaPressed) {\n        this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName$1.ACTIVE));\n      }\n\n      if (triggerChangeEvent) {\n        $(this._element).toggleClass(ClassName$1.ACTIVE);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$1);\n      this._element = null;\n    } // Static\n    ;\n\n    Button._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$1);\n\n        if (!data) {\n          data = new Button(this);\n          $(this).data(DATA_KEY$1, data);\n        }\n\n        if (config === 'toggle') {\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Button, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$1;\n      }\n    }]);\n\n    return Button;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$1.CLICK_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    event.preventDefault();\n    var button = event.target;\n\n    if (!$(button).hasClass(ClassName$1.BUTTON)) {\n      button = $(button).closest(Selector$1.BUTTON);\n    }\n\n    Button._jQueryInterface.call($(button), 'toggle');\n  }).on(Event$1.FOCUS_BLUR_DATA_API, Selector$1.DATA_TOGGLE_CARROT, function (event) {\n    var button = $(event.target).closest(Selector$1.BUTTON)[0];\n    $(button).toggleClass(ClassName$1.FOCUS, /^focus(in)?$/.test(event.type));\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$1] = Button._jQueryInterface;\n  $.fn[NAME$1].Constructor = Button;\n\n  $.fn[NAME$1].noConflict = function () {\n    $.fn[NAME$1] = JQUERY_NO_CONFLICT$1;\n    return Button._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$2 = 'carousel';\n  var VERSION$2 = '4.3.1';\n  var DATA_KEY$2 = 'bs.carousel';\n  var EVENT_KEY$2 = \".\" + DATA_KEY$2;\n  var DATA_API_KEY$2 = '.data-api';\n  var JQUERY_NO_CONFLICT$2 = $.fn[NAME$2];\n  var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key\n\n  var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key\n\n  var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch\n\n  var SWIPE_THRESHOLD = 40;\n  var Default = {\n    interval: 5000,\n    keyboard: true,\n    slide: false,\n    pause: 'hover',\n    wrap: true,\n    touch: true\n  };\n  var DefaultType = {\n    interval: '(number|boolean)',\n    keyboard: 'boolean',\n    slide: '(boolean|string)',\n    pause: '(string|boolean)',\n    wrap: 'boolean',\n    touch: 'boolean'\n  };\n  var Direction = {\n    NEXT: 'next',\n    PREV: 'prev',\n    LEFT: 'left',\n    RIGHT: 'right'\n  };\n  var Event$2 = {\n    SLIDE: \"slide\" + EVENT_KEY$2,\n    SLID: \"slid\" + EVENT_KEY$2,\n    KEYDOWN: \"keydown\" + EVENT_KEY$2,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$2,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$2,\n    TOUCHSTART: \"touchstart\" + EVENT_KEY$2,\n    TOUCHMOVE: \"touchmove\" + EVENT_KEY$2,\n    TOUCHEND: \"touchend\" + EVENT_KEY$2,\n    POINTERDOWN: \"pointerdown\" + EVENT_KEY$2,\n    POINTERUP: \"pointerup\" + EVENT_KEY$2,\n    DRAG_START: \"dragstart\" + EVENT_KEY$2,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$2 + DATA_API_KEY$2,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$2 + DATA_API_KEY$2\n  };\n  var ClassName$2 = {\n    CAROUSEL: 'carousel',\n    ACTIVE: 'active',\n    SLIDE: 'slide',\n    RIGHT: 'carousel-item-right',\n    LEFT: 'carousel-item-left',\n    NEXT: 'carousel-item-next',\n    PREV: 'carousel-item-prev',\n    ITEM: 'carousel-item',\n    POINTER_EVENT: 'pointer-event'\n  };\n  var Selector$2 = {\n    ACTIVE: '.active',\n    ACTIVE_ITEM: '.active.carousel-item',\n    ITEM: '.carousel-item',\n    ITEM_IMG: '.carousel-item img',\n    NEXT_PREV: '.carousel-item-next, .carousel-item-prev',\n    INDICATORS: '.carousel-indicators',\n    DATA_SLIDE: '[data-slide], [data-slide-to]',\n    DATA_RIDE: '[data-ride=\"carousel\"]'\n  };\n  var PointerType = {\n    TOUCH: 'touch',\n    PEN: 'pen'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Carousel =\n  /*#__PURE__*/\n  function () {\n    function Carousel(element, config) {\n      this._items = null;\n      this._interval = null;\n      this._activeElement = null;\n      this._isPaused = false;\n      this._isSliding = false;\n      this.touchTimeout = null;\n      this.touchStartX = 0;\n      this.touchDeltaX = 0;\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._indicatorsElement = this._element.querySelector(Selector$2.INDICATORS);\n      this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0;\n      this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent);\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Carousel.prototype;\n\n    // Public\n    _proto.next = function next() {\n      if (!this._isSliding) {\n        this._slide(Direction.NEXT);\n      }\n    };\n\n    _proto.nextWhenVisible = function nextWhenVisible() {\n      // Don't call next when the page isn't visible\n      // or the carousel or its parent isn't visible\n      if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') {\n        this.next();\n      }\n    };\n\n    _proto.prev = function prev() {\n      if (!this._isSliding) {\n        this._slide(Direction.PREV);\n      }\n    };\n\n    _proto.pause = function pause(event) {\n      if (!event) {\n        this._isPaused = true;\n      }\n\n      if (this._element.querySelector(Selector$2.NEXT_PREV)) {\n        Util.triggerTransitionEnd(this._element);\n        this.cycle(true);\n      }\n\n      clearInterval(this._interval);\n      this._interval = null;\n    };\n\n    _proto.cycle = function cycle(event) {\n      if (!event) {\n        this._isPaused = false;\n      }\n\n      if (this._interval) {\n        clearInterval(this._interval);\n        this._interval = null;\n      }\n\n      if (this._config.interval && !this._isPaused) {\n        this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval);\n      }\n    };\n\n    _proto.to = function to(index) {\n      var _this = this;\n\n      this._activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeIndex = this._getItemIndex(this._activeElement);\n\n      if (index > this._items.length - 1 || index < 0) {\n        return;\n      }\n\n      if (this._isSliding) {\n        $(this._element).one(Event$2.SLID, function () {\n          return _this.to(index);\n        });\n        return;\n      }\n\n      if (activeIndex === index) {\n        this.pause();\n        this.cycle();\n        return;\n      }\n\n      var direction = index > activeIndex ? Direction.NEXT : Direction.PREV;\n\n      this._slide(direction, this._items[index]);\n    };\n\n    _proto.dispose = function dispose() {\n      $(this._element).off(EVENT_KEY$2);\n      $.removeData(this._element, DATA_KEY$2);\n      this._items = null;\n      this._config = null;\n      this._element = null;\n      this._interval = null;\n      this._isPaused = null;\n      this._isSliding = null;\n      this._activeElement = null;\n      this._indicatorsElement = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default, config);\n      Util.typeCheckConfig(NAME$2, config, DefaultType);\n      return config;\n    };\n\n    _proto._handleSwipe = function _handleSwipe() {\n      var absDeltax = Math.abs(this.touchDeltaX);\n\n      if (absDeltax <= SWIPE_THRESHOLD) {\n        return;\n      }\n\n      var direction = absDeltax / this.touchDeltaX; // swipe left\n\n      if (direction > 0) {\n        this.prev();\n      } // swipe right\n\n\n      if (direction < 0) {\n        this.next();\n      }\n    };\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this2 = this;\n\n      if (this._config.keyboard) {\n        $(this._element).on(Event$2.KEYDOWN, function (event) {\n          return _this2._keydown(event);\n        });\n      }\n\n      if (this._config.pause === 'hover') {\n        $(this._element).on(Event$2.MOUSEENTER, function (event) {\n          return _this2.pause(event);\n        }).on(Event$2.MOUSELEAVE, function (event) {\n          return _this2.cycle(event);\n        });\n      }\n\n      if (this._config.touch) {\n        this._addTouchEventListeners();\n      }\n    };\n\n    _proto._addTouchEventListeners = function _addTouchEventListeners() {\n      var _this3 = this;\n\n      if (!this._touchSupported) {\n        return;\n      }\n\n      var start = function start(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchStartX = event.originalEvent.clientX;\n        } else if (!_this3._pointerEvent) {\n          _this3.touchStartX = event.originalEvent.touches[0].clientX;\n        }\n      };\n\n      var move = function move(event) {\n        // ensure swiping with one touch and not pinching\n        if (event.originalEvent.touches && event.originalEvent.touches.length > 1) {\n          _this3.touchDeltaX = 0;\n        } else {\n          _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX;\n        }\n      };\n\n      var end = function end(event) {\n        if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) {\n          _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX;\n        }\n\n        _this3._handleSwipe();\n\n        if (_this3._config.pause === 'hover') {\n          // If it's a touch-enabled device, mouseenter/leave are fired as\n          // part of the mouse compatibility events on first tap - the carousel\n          // would stop cycling until user tapped out of it;\n          // here, we listen for touchend, explicitly pause the carousel\n          // (as if it's the second time we tap on it, mouseenter compat event\n          // is NOT fired) and after a timeout (to allow for mouse compatibility\n          // events to fire) we explicitly restart cycling\n          _this3.pause();\n\n          if (_this3.touchTimeout) {\n            clearTimeout(_this3.touchTimeout);\n          }\n\n          _this3.touchTimeout = setTimeout(function (event) {\n            return _this3.cycle(event);\n          }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval);\n        }\n      };\n\n      $(this._element.querySelectorAll(Selector$2.ITEM_IMG)).on(Event$2.DRAG_START, function (e) {\n        return e.preventDefault();\n      });\n\n      if (this._pointerEvent) {\n        $(this._element).on(Event$2.POINTERDOWN, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.POINTERUP, function (event) {\n          return end(event);\n        });\n\n        this._element.classList.add(ClassName$2.POINTER_EVENT);\n      } else {\n        $(this._element).on(Event$2.TOUCHSTART, function (event) {\n          return start(event);\n        });\n        $(this._element).on(Event$2.TOUCHMOVE, function (event) {\n          return move(event);\n        });\n        $(this._element).on(Event$2.TOUCHEND, function (event) {\n          return end(event);\n        });\n      }\n    };\n\n    _proto._keydown = function _keydown(event) {\n      if (/input|textarea/i.test(event.target.tagName)) {\n        return;\n      }\n\n      switch (event.which) {\n        case ARROW_LEFT_KEYCODE:\n          event.preventDefault();\n          this.prev();\n          break;\n\n        case ARROW_RIGHT_KEYCODE:\n          event.preventDefault();\n          this.next();\n          break;\n\n        default:\n      }\n    };\n\n    _proto._getItemIndex = function _getItemIndex(element) {\n      this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector$2.ITEM)) : [];\n      return this._items.indexOf(element);\n    };\n\n    _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) {\n      var isNextDirection = direction === Direction.NEXT;\n      var isPrevDirection = direction === Direction.PREV;\n\n      var activeIndex = this._getItemIndex(activeElement);\n\n      var lastItemIndex = this._items.length - 1;\n      var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex;\n\n      if (isGoingToWrap && !this._config.wrap) {\n        return activeElement;\n      }\n\n      var delta = direction === Direction.PREV ? -1 : 1;\n      var itemIndex = (activeIndex + delta) % this._items.length;\n      return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex];\n    };\n\n    _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) {\n      var targetIndex = this._getItemIndex(relatedTarget);\n\n      var fromIndex = this._getItemIndex(this._element.querySelector(Selector$2.ACTIVE_ITEM));\n\n      var slideEvent = $.Event(Event$2.SLIDE, {\n        relatedTarget: relatedTarget,\n        direction: eventDirectionName,\n        from: fromIndex,\n        to: targetIndex\n      });\n      $(this._element).trigger(slideEvent);\n      return slideEvent;\n    };\n\n    _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) {\n      if (this._indicatorsElement) {\n        var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector$2.ACTIVE));\n        $(indicators).removeClass(ClassName$2.ACTIVE);\n\n        var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)];\n\n        if (nextIndicator) {\n          $(nextIndicator).addClass(ClassName$2.ACTIVE);\n        }\n      }\n    };\n\n    _proto._slide = function _slide(direction, element) {\n      var _this4 = this;\n\n      var activeElement = this._element.querySelector(Selector$2.ACTIVE_ITEM);\n\n      var activeElementIndex = this._getItemIndex(activeElement);\n\n      var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement);\n\n      var nextElementIndex = this._getItemIndex(nextElement);\n\n      var isCycling = Boolean(this._interval);\n      var directionalClassName;\n      var orderClassName;\n      var eventDirectionName;\n\n      if (direction === Direction.NEXT) {\n        directionalClassName = ClassName$2.LEFT;\n        orderClassName = ClassName$2.NEXT;\n        eventDirectionName = Direction.LEFT;\n      } else {\n        directionalClassName = ClassName$2.RIGHT;\n        orderClassName = ClassName$2.PREV;\n        eventDirectionName = Direction.RIGHT;\n      }\n\n      if (nextElement && $(nextElement).hasClass(ClassName$2.ACTIVE)) {\n        this._isSliding = false;\n        return;\n      }\n\n      var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName);\n\n      if (slideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (!activeElement || !nextElement) {\n        // Some weirdness is happening, so we bail\n        return;\n      }\n\n      this._isSliding = true;\n\n      if (isCycling) {\n        this.pause();\n      }\n\n      this._setActiveIndicatorElement(nextElement);\n\n      var slidEvent = $.Event(Event$2.SLID, {\n        relatedTarget: nextElement,\n        direction: eventDirectionName,\n        from: activeElementIndex,\n        to: nextElementIndex\n      });\n\n      if ($(this._element).hasClass(ClassName$2.SLIDE)) {\n        $(nextElement).addClass(orderClassName);\n        Util.reflow(nextElement);\n        $(activeElement).addClass(directionalClassName);\n        $(nextElement).addClass(directionalClassName);\n        var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10);\n\n        if (nextElementInterval) {\n          this._config.defaultInterval = this._config.defaultInterval || this._config.interval;\n          this._config.interval = nextElementInterval;\n        } else {\n          this._config.interval = this._config.defaultInterval || this._config.interval;\n        }\n\n        var transitionDuration = Util.getTransitionDurationFromElement(activeElement);\n        $(activeElement).one(Util.TRANSITION_END, function () {\n          $(nextElement).removeClass(directionalClassName + \" \" + orderClassName).addClass(ClassName$2.ACTIVE);\n          $(activeElement).removeClass(ClassName$2.ACTIVE + \" \" + orderClassName + \" \" + directionalClassName);\n          _this4._isSliding = false;\n          setTimeout(function () {\n            return $(_this4._element).trigger(slidEvent);\n          }, 0);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        $(activeElement).removeClass(ClassName$2.ACTIVE);\n        $(nextElement).addClass(ClassName$2.ACTIVE);\n        this._isSliding = false;\n        $(this._element).trigger(slidEvent);\n      }\n\n      if (isCycling) {\n        this.cycle();\n      }\n    } // Static\n    ;\n\n    Carousel._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$2);\n\n        var _config = _objectSpread({}, Default, $(this).data());\n\n        if (typeof config === 'object') {\n          _config = _objectSpread({}, _config, config);\n        }\n\n        var action = typeof config === 'string' ? config : _config.slide;\n\n        if (!data) {\n          data = new Carousel(this, _config);\n          $(this).data(DATA_KEY$2, data);\n        }\n\n        if (typeof config === 'number') {\n          data.to(config);\n        } else if (typeof action === 'string') {\n          if (typeof data[action] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + action + \"\\\"\");\n          }\n\n          data[action]();\n        } else if (_config.interval && _config.ride) {\n          data.pause();\n          data.cycle();\n        }\n      });\n    };\n\n    Carousel._dataApiClickHandler = function _dataApiClickHandler(event) {\n      var selector = Util.getSelectorFromElement(this);\n\n      if (!selector) {\n        return;\n      }\n\n      var target = $(selector)[0];\n\n      if (!target || !$(target).hasClass(ClassName$2.CAROUSEL)) {\n        return;\n      }\n\n      var config = _objectSpread({}, $(target).data(), $(this).data());\n\n      var slideIndex = this.getAttribute('data-slide-to');\n\n      if (slideIndex) {\n        config.interval = false;\n      }\n\n      Carousel._jQueryInterface.call($(target), config);\n\n      if (slideIndex) {\n        $(target).data(DATA_KEY$2).to(slideIndex);\n      }\n\n      event.preventDefault();\n    };\n\n    _createClass(Carousel, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$2;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default;\n      }\n    }]);\n\n    return Carousel;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$2.CLICK_DATA_API, Selector$2.DATA_SLIDE, Carousel._dataApiClickHandler);\n  $(window).on(Event$2.LOAD_DATA_API, function () {\n    var carousels = [].slice.call(document.querySelectorAll(Selector$2.DATA_RIDE));\n\n    for (var i = 0, len = carousels.length; i < len; i++) {\n      var $carousel = $(carousels[i]);\n\n      Carousel._jQueryInterface.call($carousel, $carousel.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$2] = Carousel._jQueryInterface;\n  $.fn[NAME$2].Constructor = Carousel;\n\n  $.fn[NAME$2].noConflict = function () {\n    $.fn[NAME$2] = JQUERY_NO_CONFLICT$2;\n    return Carousel._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$3 = 'collapse';\n  var VERSION$3 = '4.3.1';\n  var DATA_KEY$3 = 'bs.collapse';\n  var EVENT_KEY$3 = \".\" + DATA_KEY$3;\n  var DATA_API_KEY$3 = '.data-api';\n  var JQUERY_NO_CONFLICT$3 = $.fn[NAME$3];\n  var Default$1 = {\n    toggle: true,\n    parent: ''\n  };\n  var DefaultType$1 = {\n    toggle: 'boolean',\n    parent: '(string|element)'\n  };\n  var Event$3 = {\n    SHOW: \"show\" + EVENT_KEY$3,\n    SHOWN: \"shown\" + EVENT_KEY$3,\n    HIDE: \"hide\" + EVENT_KEY$3,\n    HIDDEN: \"hidden\" + EVENT_KEY$3,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$3 + DATA_API_KEY$3\n  };\n  var ClassName$3 = {\n    SHOW: 'show',\n    COLLAPSE: 'collapse',\n    COLLAPSING: 'collapsing',\n    COLLAPSED: 'collapsed'\n  };\n  var Dimension = {\n    WIDTH: 'width',\n    HEIGHT: 'height'\n  };\n  var Selector$3 = {\n    ACTIVES: '.show, .collapsing',\n    DATA_TOGGLE: '[data-toggle=\"collapse\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Collapse =\n  /*#__PURE__*/\n  function () {\n    function Collapse(element, config) {\n      this._isTransitioning = false;\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._triggerArray = [].slice.call(document.querySelectorAll(\"[data-toggle=\\\"collapse\\\"][href=\\\"#\" + element.id + \"\\\"],\" + (\"[data-toggle=\\\"collapse\\\"][data-target=\\\"#\" + element.id + \"\\\"]\")));\n      var toggleList = [].slice.call(document.querySelectorAll(Selector$3.DATA_TOGGLE));\n\n      for (var i = 0, len = toggleList.length; i < len; i++) {\n        var elem = toggleList[i];\n        var selector = Util.getSelectorFromElement(elem);\n        var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) {\n          return foundElem === element;\n        });\n\n        if (selector !== null && filterElement.length > 0) {\n          this._selector = selector;\n\n          this._triggerArray.push(elem);\n        }\n      }\n\n      this._parent = this._config.parent ? this._getParent() : null;\n\n      if (!this._config.parent) {\n        this._addAriaAndCollapsedClass(this._element, this._triggerArray);\n      }\n\n      if (this._config.toggle) {\n        this.toggle();\n      }\n    } // Getters\n\n\n    var _proto = Collapse.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if ($(this._element).hasClass(ClassName$3.SHOW)) {\n        this.hide();\n      } else {\n        this.show();\n      }\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._isTransitioning || $(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var actives;\n      var activesData;\n\n      if (this._parent) {\n        actives = [].slice.call(this._parent.querySelectorAll(Selector$3.ACTIVES)).filter(function (elem) {\n          if (typeof _this._config.parent === 'string') {\n            return elem.getAttribute('data-parent') === _this._config.parent;\n          }\n\n          return elem.classList.contains(ClassName$3.COLLAPSE);\n        });\n\n        if (actives.length === 0) {\n          actives = null;\n        }\n      }\n\n      if (actives) {\n        activesData = $(actives).not(this._selector).data(DATA_KEY$3);\n\n        if (activesData && activesData._isTransitioning) {\n          return;\n        }\n      }\n\n      var startEvent = $.Event(Event$3.SHOW);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (actives) {\n        Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide');\n\n        if (!activesData) {\n          $(actives).data(DATA_KEY$3, null);\n        }\n      }\n\n      var dimension = this._getDimension();\n\n      $(this._element).removeClass(ClassName$3.COLLAPSE).addClass(ClassName$3.COLLAPSING);\n      this._element.style[dimension] = 0;\n\n      if (this._triggerArray.length) {\n        $(this._triggerArray).removeClass(ClassName$3.COLLAPSED).attr('aria-expanded', true);\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        $(_this._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).addClass(ClassName$3.SHOW);\n        _this._element.style[dimension] = '';\n\n        _this.setTransitioning(false);\n\n        $(_this._element).trigger(Event$3.SHOWN);\n      };\n\n      var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\n      var scrollSize = \"scroll\" + capitalizedDimension;\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      this._element.style[dimension] = this._element[scrollSize] + \"px\";\n    };\n\n    _proto.hide = function hide() {\n      var _this2 = this;\n\n      if (this._isTransitioning || !$(this._element).hasClass(ClassName$3.SHOW)) {\n        return;\n      }\n\n      var startEvent = $.Event(Event$3.HIDE);\n      $(this._element).trigger(startEvent);\n\n      if (startEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      var dimension = this._getDimension();\n\n      this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + \"px\";\n      Util.reflow(this._element);\n      $(this._element).addClass(ClassName$3.COLLAPSING).removeClass(ClassName$3.COLLAPSE).removeClass(ClassName$3.SHOW);\n      var triggerArrayLength = this._triggerArray.length;\n\n      if (triggerArrayLength > 0) {\n        for (var i = 0; i < triggerArrayLength; i++) {\n          var trigger = this._triggerArray[i];\n          var selector = Util.getSelectorFromElement(trigger);\n\n          if (selector !== null) {\n            var $elem = $([].slice.call(document.querySelectorAll(selector)));\n\n            if (!$elem.hasClass(ClassName$3.SHOW)) {\n              $(trigger).addClass(ClassName$3.COLLAPSED).attr('aria-expanded', false);\n            }\n          }\n        }\n      }\n\n      this.setTransitioning(true);\n\n      var complete = function complete() {\n        _this2.setTransitioning(false);\n\n        $(_this2._element).removeClass(ClassName$3.COLLAPSING).addClass(ClassName$3.COLLAPSE).trigger(Event$3.HIDDEN);\n      };\n\n      this._element.style[dimension] = '';\n      var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n      $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n    };\n\n    _proto.setTransitioning = function setTransitioning(isTransitioning) {\n      this._isTransitioning = isTransitioning;\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$3);\n      this._config = null;\n      this._parent = null;\n      this._element = null;\n      this._triggerArray = null;\n      this._isTransitioning = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$1, config);\n      config.toggle = Boolean(config.toggle); // Coerce string values\n\n      Util.typeCheckConfig(NAME$3, config, DefaultType$1);\n      return config;\n    };\n\n    _proto._getDimension = function _getDimension() {\n      var hasWidth = $(this._element).hasClass(Dimension.WIDTH);\n      return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT;\n    };\n\n    _proto._getParent = function _getParent() {\n      var _this3 = this;\n\n      var parent;\n\n      if (Util.isElement(this._config.parent)) {\n        parent = this._config.parent; // It's a jQuery object\n\n        if (typeof this._config.parent.jquery !== 'undefined') {\n          parent = this._config.parent[0];\n        }\n      } else {\n        parent = document.querySelector(this._config.parent);\n      }\n\n      var selector = \"[data-toggle=\\\"collapse\\\"][data-parent=\\\"\" + this._config.parent + \"\\\"]\";\n      var children = [].slice.call(parent.querySelectorAll(selector));\n      $(children).each(function (i, element) {\n        _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]);\n      });\n      return parent;\n    };\n\n    _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) {\n      var isOpen = $(element).hasClass(ClassName$3.SHOW);\n\n      if (triggerArray.length) {\n        $(triggerArray).toggleClass(ClassName$3.COLLAPSED, !isOpen).attr('aria-expanded', isOpen);\n      }\n    } // Static\n    ;\n\n    Collapse._getTargetFromElement = function _getTargetFromElement(element) {\n      var selector = Util.getSelectorFromElement(element);\n      return selector ? document.querySelector(selector) : null;\n    };\n\n    Collapse._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$3);\n\n        var _config = _objectSpread({}, Default$1, $this.data(), typeof config === 'object' && config ? config : {});\n\n        if (!data && _config.toggle && /show|hide/.test(config)) {\n          _config.toggle = false;\n        }\n\n        if (!data) {\n          data = new Collapse(this, _config);\n          $this.data(DATA_KEY$3, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Collapse, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$3;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$1;\n      }\n    }]);\n\n    return Collapse;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$3.CLICK_DATA_API, Selector$3.DATA_TOGGLE, function (event) {\n    // preventDefault only for <a> elements (which change the URL) not inside the collapsible element\n    if (event.currentTarget.tagName === 'A') {\n      event.preventDefault();\n    }\n\n    var $trigger = $(this);\n    var selector = Util.getSelectorFromElement(this);\n    var selectors = [].slice.call(document.querySelectorAll(selector));\n    $(selectors).each(function () {\n      var $target = $(this);\n      var data = $target.data(DATA_KEY$3);\n      var config = data ? 'toggle' : $trigger.data();\n\n      Collapse._jQueryInterface.call($target, config);\n    });\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$3] = Collapse._jQueryInterface;\n  $.fn[NAME$3].Constructor = Collapse;\n\n  $.fn[NAME$3].noConflict = function () {\n    $.fn[NAME$3] = JQUERY_NO_CONFLICT$3;\n    return Collapse._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$4 = 'dropdown';\n  var VERSION$4 = '4.3.1';\n  var DATA_KEY$4 = 'bs.dropdown';\n  var EVENT_KEY$4 = \".\" + DATA_KEY$4;\n  var DATA_API_KEY$4 = '.data-api';\n  var JQUERY_NO_CONFLICT$4 = $.fn[NAME$4];\n  var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key\n\n  var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key\n\n  var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key\n\n  var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key\n\n  var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse)\n\n  var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + \"|\" + ARROW_DOWN_KEYCODE + \"|\" + ESCAPE_KEYCODE);\n  var Event$4 = {\n    HIDE: \"hide\" + EVENT_KEY$4,\n    HIDDEN: \"hidden\" + EVENT_KEY$4,\n    SHOW: \"show\" + EVENT_KEY$4,\n    SHOWN: \"shown\" + EVENT_KEY$4,\n    CLICK: \"click\" + EVENT_KEY$4,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYDOWN_DATA_API: \"keydown\" + EVENT_KEY$4 + DATA_API_KEY$4,\n    KEYUP_DATA_API: \"keyup\" + EVENT_KEY$4 + DATA_API_KEY$4\n  };\n  var ClassName$4 = {\n    DISABLED: 'disabled',\n    SHOW: 'show',\n    DROPUP: 'dropup',\n    DROPRIGHT: 'dropright',\n    DROPLEFT: 'dropleft',\n    MENURIGHT: 'dropdown-menu-right',\n    MENULEFT: 'dropdown-menu-left',\n    POSITION_STATIC: 'position-static'\n  };\n  var Selector$4 = {\n    DATA_TOGGLE: '[data-toggle=\"dropdown\"]',\n    FORM_CHILD: '.dropdown form',\n    MENU: '.dropdown-menu',\n    NAVBAR_NAV: '.navbar-nav',\n    VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n  };\n  var AttachmentMap = {\n    TOP: 'top-start',\n    TOPEND: 'top-end',\n    BOTTOM: 'bottom-start',\n    BOTTOMEND: 'bottom-end',\n    RIGHT: 'right-start',\n    RIGHTEND: 'right-end',\n    LEFT: 'left-start',\n    LEFTEND: 'left-end'\n  };\n  var Default$2 = {\n    offset: 0,\n    flip: true,\n    boundary: 'scrollParent',\n    reference: 'toggle',\n    display: 'dynamic'\n  };\n  var DefaultType$2 = {\n    offset: '(number|string|function)',\n    flip: 'boolean',\n    boundary: '(string|element)',\n    reference: '(string|element)',\n    display: 'string'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Dropdown =\n  /*#__PURE__*/\n  function () {\n    function Dropdown(element, config) {\n      this._element = element;\n      this._popper = null;\n      this._config = this._getConfig(config);\n      this._menu = this._getMenuElement();\n      this._inNavbar = this._detectNavbar();\n\n      this._addEventListeners();\n    } // Getters\n\n\n    var _proto = Dropdown.prototype;\n\n    // Public\n    _proto.toggle = function toggle() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      var isActive = $(this._menu).hasClass(ClassName$4.SHOW);\n\n      Dropdown._clearMenus();\n\n      if (isActive) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      } // Disable totally Popper.js for Dropdown in Navbar\n\n\n      if (!this._inNavbar) {\n        /**\n         * Check for Popper dependency\n         * Popper - https://popper.js.org\n         */\n        if (typeof Popper === 'undefined') {\n          throw new TypeError('Bootstrap\\'s dropdowns require Popper.js (https://popper.js.org/)');\n        }\n\n        var referenceElement = this._element;\n\n        if (this._config.reference === 'parent') {\n          referenceElement = parent;\n        } else if (Util.isElement(this._config.reference)) {\n          referenceElement = this._config.reference; // Check if it's jQuery element\n\n          if (typeof this._config.reference.jquery !== 'undefined') {\n            referenceElement = this._config.reference[0];\n          }\n        } // If boundary is not `scrollParent`, then set position to `static`\n        // to allow the menu to \"escape\" the scroll parent's boundaries\n        // https://github.com/twbs/bootstrap/issues/24251\n\n\n        if (this._config.boundary !== 'scrollParent') {\n          $(parent).addClass(ClassName$4.POSITION_STATIC);\n        }\n\n        this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig());\n      } // If this is a touch-enabled device we add extra\n      // empty mouseover listeners to the body's immediate children;\n      // only needed because of broken event delegation on iOS\n      // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n\n      if ('ontouchstart' in document.documentElement && $(parent).closest(Selector$4.NAVBAR_NAV).length === 0) {\n        $(document.body).children().on('mouseover', null, $.noop);\n      }\n\n      this._element.focus();\n\n      this._element.setAttribute('aria-expanded', true);\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.show = function show() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || $(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var showEvent = $.Event(Event$4.SHOW, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.SHOWN, relatedTarget));\n    };\n\n    _proto.hide = function hide() {\n      if (this._element.disabled || $(this._element).hasClass(ClassName$4.DISABLED) || !$(this._menu).hasClass(ClassName$4.SHOW)) {\n        return;\n      }\n\n      var relatedTarget = {\n        relatedTarget: this._element\n      };\n      var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n\n      var parent = Dropdown._getParentFromElement(this._element);\n\n      $(parent).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(this._menu).toggleClass(ClassName$4.SHOW);\n      $(parent).toggleClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$4);\n      $(this._element).off(EVENT_KEY$4);\n      this._element = null;\n      this._menu = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n\n        this._popper = null;\n      }\n    };\n\n    _proto.update = function update() {\n      this._inNavbar = this._detectNavbar();\n\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Private\n    ;\n\n    _proto._addEventListeners = function _addEventListeners() {\n      var _this = this;\n\n      $(this._element).on(Event$4.CLICK, function (event) {\n        event.preventDefault();\n        event.stopPropagation();\n\n        _this.toggle();\n      });\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config);\n      Util.typeCheckConfig(NAME$4, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._getMenuElement = function _getMenuElement() {\n      if (!this._menu) {\n        var parent = Dropdown._getParentFromElement(this._element);\n\n        if (parent) {\n          this._menu = parent.querySelector(Selector$4.MENU);\n        }\n      }\n\n      return this._menu;\n    };\n\n    _proto._getPlacement = function _getPlacement() {\n      var $parentDropdown = $(this._element.parentNode);\n      var placement = AttachmentMap.BOTTOM; // Handle dropup\n\n      if ($parentDropdown.hasClass(ClassName$4.DROPUP)) {\n        placement = AttachmentMap.TOP;\n\n        if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n          placement = AttachmentMap.TOPEND;\n        }\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPRIGHT)) {\n        placement = AttachmentMap.RIGHT;\n      } else if ($parentDropdown.hasClass(ClassName$4.DROPLEFT)) {\n        placement = AttachmentMap.LEFT;\n      } else if ($(this._menu).hasClass(ClassName$4.MENURIGHT)) {\n        placement = AttachmentMap.BOTTOMEND;\n      }\n\n      return placement;\n    };\n\n    _proto._detectNavbar = function _detectNavbar() {\n      return $(this._element).closest('.navbar').length > 0;\n    };\n\n    _proto._getOffset = function _getOffset() {\n      var _this2 = this;\n\n      var offset = {};\n\n      if (typeof this._config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this._config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getPopperConfig = function _getPopperConfig() {\n      var popperConfig = {\n        placement: this._getPlacement(),\n        modifiers: {\n          offset: this._getOffset(),\n          flip: {\n            enabled: this._config.flip\n          },\n          preventOverflow: {\n            boundariesElement: this._config.boundary\n          }\n        } // Disable Popper.js if we have a static display\n\n      };\n\n      if (this._config.display === 'static') {\n        popperConfig.modifiers.applyStyle = {\n          enabled: false\n        };\n      }\n\n      return popperConfig;\n    } // Static\n    ;\n\n    Dropdown._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$4);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data) {\n          data = new Dropdown(this, _config);\n          $(this).data(DATA_KEY$4, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    Dropdown._clearMenus = function _clearMenus(event) {\n      if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) {\n        return;\n      }\n\n      var toggles = [].slice.call(document.querySelectorAll(Selector$4.DATA_TOGGLE));\n\n      for (var i = 0, len = toggles.length; i < len; i++) {\n        var parent = Dropdown._getParentFromElement(toggles[i]);\n\n        var context = $(toggles[i]).data(DATA_KEY$4);\n        var relatedTarget = {\n          relatedTarget: toggles[i]\n        };\n\n        if (event && event.type === 'click') {\n          relatedTarget.clickEvent = event;\n        }\n\n        if (!context) {\n          continue;\n        }\n\n        var dropdownMenu = context._menu;\n\n        if (!$(parent).hasClass(ClassName$4.SHOW)) {\n          continue;\n        }\n\n        if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) {\n          continue;\n        }\n\n        var hideEvent = $.Event(Event$4.HIDE, relatedTarget);\n        $(parent).trigger(hideEvent);\n\n        if (hideEvent.isDefaultPrevented()) {\n          continue;\n        } // If this is a touch-enabled device we remove the extra\n        // empty mouseover listeners we added for iOS support\n\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().off('mouseover', null, $.noop);\n        }\n\n        toggles[i].setAttribute('aria-expanded', 'false');\n        $(dropdownMenu).removeClass(ClassName$4.SHOW);\n        $(parent).removeClass(ClassName$4.SHOW).trigger($.Event(Event$4.HIDDEN, relatedTarget));\n      }\n    };\n\n    Dropdown._getParentFromElement = function _getParentFromElement(element) {\n      var parent;\n      var selector = Util.getSelectorFromElement(element);\n\n      if (selector) {\n        parent = document.querySelector(selector);\n      }\n\n      return parent || element.parentNode;\n    } // eslint-disable-next-line complexity\n    ;\n\n    Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) {\n      // If not input/textarea:\n      //  - And not a key in REGEXP_KEYDOWN => not a dropdown command\n      // If input/textarea:\n      //  - If space key => not a dropdown command\n      //  - If key is other than escape\n      //    - If key is not up or down => not a dropdown command\n      //    - If trigger inside the menu => not a dropdown command\n      if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector$4.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) {\n        return;\n      }\n\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (this.disabled || $(this).hasClass(ClassName$4.DISABLED)) {\n        return;\n      }\n\n      var parent = Dropdown._getParentFromElement(this);\n\n      var isActive = $(parent).hasClass(ClassName$4.SHOW);\n\n      if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) {\n        if (event.which === ESCAPE_KEYCODE) {\n          var toggle = parent.querySelector(Selector$4.DATA_TOGGLE);\n          $(toggle).trigger('focus');\n        }\n\n        $(this).trigger('click');\n        return;\n      }\n\n      var items = [].slice.call(parent.querySelectorAll(Selector$4.VISIBLE_ITEMS));\n\n      if (items.length === 0) {\n        return;\n      }\n\n      var index = items.indexOf(event.target);\n\n      if (event.which === ARROW_UP_KEYCODE && index > 0) {\n        // Up\n        index--;\n      }\n\n      if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) {\n        // Down\n        index++;\n      }\n\n      if (index < 0) {\n        index = 0;\n      }\n\n      items[index].focus();\n    };\n\n    _createClass(Dropdown, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$4;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$2;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$2;\n      }\n    }]);\n\n    return Dropdown;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$4.KEYDOWN_DATA_API, Selector$4.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event$4.KEYDOWN_DATA_API, Selector$4.MENU, Dropdown._dataApiKeydownHandler).on(Event$4.CLICK_DATA_API + \" \" + Event$4.KEYUP_DATA_API, Dropdown._clearMenus).on(Event$4.CLICK_DATA_API, Selector$4.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    Dropdown._jQueryInterface.call($(this), 'toggle');\n  }).on(Event$4.CLICK_DATA_API, Selector$4.FORM_CHILD, function (e) {\n    e.stopPropagation();\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$4] = Dropdown._jQueryInterface;\n  $.fn[NAME$4].Constructor = Dropdown;\n\n  $.fn[NAME$4].noConflict = function () {\n    $.fn[NAME$4] = JQUERY_NO_CONFLICT$4;\n    return Dropdown._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$5 = 'modal';\n  var VERSION$5 = '4.3.1';\n  var DATA_KEY$5 = 'bs.modal';\n  var EVENT_KEY$5 = \".\" + DATA_KEY$5;\n  var DATA_API_KEY$5 = '.data-api';\n  var JQUERY_NO_CONFLICT$5 = $.fn[NAME$5];\n  var ESCAPE_KEYCODE$1 = 27; // KeyboardEvent.which value for Escape (Esc) key\n\n  var Default$3 = {\n    backdrop: true,\n    keyboard: true,\n    focus: true,\n    show: true\n  };\n  var DefaultType$3 = {\n    backdrop: '(boolean|string)',\n    keyboard: 'boolean',\n    focus: 'boolean',\n    show: 'boolean'\n  };\n  var Event$5 = {\n    HIDE: \"hide\" + EVENT_KEY$5,\n    HIDDEN: \"hidden\" + EVENT_KEY$5,\n    SHOW: \"show\" + EVENT_KEY$5,\n    SHOWN: \"shown\" + EVENT_KEY$5,\n    FOCUSIN: \"focusin\" + EVENT_KEY$5,\n    RESIZE: \"resize\" + EVENT_KEY$5,\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$5,\n    KEYDOWN_DISMISS: \"keydown.dismiss\" + EVENT_KEY$5,\n    MOUSEUP_DISMISS: \"mouseup.dismiss\" + EVENT_KEY$5,\n    MOUSEDOWN_DISMISS: \"mousedown.dismiss\" + EVENT_KEY$5,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$5 + DATA_API_KEY$5\n  };\n  var ClassName$5 = {\n    SCROLLABLE: 'modal-dialog-scrollable',\n    SCROLLBAR_MEASURER: 'modal-scrollbar-measure',\n    BACKDROP: 'modal-backdrop',\n    OPEN: 'modal-open',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$5 = {\n    DIALOG: '.modal-dialog',\n    MODAL_BODY: '.modal-body',\n    DATA_TOGGLE: '[data-toggle=\"modal\"]',\n    DATA_DISMISS: '[data-dismiss=\"modal\"]',\n    FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top',\n    STICKY_CONTENT: '.sticky-top'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Modal =\n  /*#__PURE__*/\n  function () {\n    function Modal(element, config) {\n      this._config = this._getConfig(config);\n      this._element = element;\n      this._dialog = element.querySelector(Selector$5.DIALOG);\n      this._backdrop = null;\n      this._isShown = false;\n      this._isBodyOverflowing = false;\n      this._ignoreBackdropClick = false;\n      this._isTransitioning = false;\n      this._scrollbarWidth = 0;\n    } // Getters\n\n\n    var _proto = Modal.prototype;\n\n    // Public\n    _proto.toggle = function toggle(relatedTarget) {\n      return this._isShown ? this.hide() : this.show(relatedTarget);\n    };\n\n    _proto.show = function show(relatedTarget) {\n      var _this = this;\n\n      if (this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      if ($(this._element).hasClass(ClassName$5.FADE)) {\n        this._isTransitioning = true;\n      }\n\n      var showEvent = $.Event(Event$5.SHOW, {\n        relatedTarget: relatedTarget\n      });\n      $(this._element).trigger(showEvent);\n\n      if (this._isShown || showEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = true;\n\n      this._checkScrollbar();\n\n      this._setScrollbar();\n\n      this._adjustDialog();\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(this._element).on(Event$5.CLICK_DISMISS, Selector$5.DATA_DISMISS, function (event) {\n        return _this.hide(event);\n      });\n      $(this._dialog).on(Event$5.MOUSEDOWN_DISMISS, function () {\n        $(_this._element).one(Event$5.MOUSEUP_DISMISS, function (event) {\n          if ($(event.target).is(_this._element)) {\n            _this._ignoreBackdropClick = true;\n          }\n        });\n      });\n\n      this._showBackdrop(function () {\n        return _this._showElement(relatedTarget);\n      });\n    };\n\n    _proto.hide = function hide(event) {\n      var _this2 = this;\n\n      if (event) {\n        event.preventDefault();\n      }\n\n      if (!this._isShown || this._isTransitioning) {\n        return;\n      }\n\n      var hideEvent = $.Event(Event$5.HIDE);\n      $(this._element).trigger(hideEvent);\n\n      if (!this._isShown || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      this._isShown = false;\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (transition) {\n        this._isTransitioning = true;\n      }\n\n      this._setEscapeEvent();\n\n      this._setResizeEvent();\n\n      $(document).off(Event$5.FOCUSIN);\n      $(this._element).removeClass(ClassName$5.SHOW);\n      $(this._element).off(Event$5.CLICK_DISMISS);\n      $(this._dialog).off(Event$5.MOUSEDOWN_DISMISS);\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, function (event) {\n          return _this2._hideModal(event);\n        }).emulateTransitionEnd(transitionDuration);\n      } else {\n        this._hideModal();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      [window, this._element, this._dialog].forEach(function (htmlElement) {\n        return $(htmlElement).off(EVENT_KEY$5);\n      });\n      /**\n       * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API`\n       * Do not move `document` in `htmlElements` array\n       * It will remove `Event.CLICK_DATA_API` event that should remain\n       */\n\n      $(document).off(Event$5.FOCUSIN);\n      $.removeData(this._element, DATA_KEY$5);\n      this._config = null;\n      this._element = null;\n      this._dialog = null;\n      this._backdrop = null;\n      this._isShown = null;\n      this._isBodyOverflowing = null;\n      this._ignoreBackdropClick = null;\n      this._isTransitioning = null;\n      this._scrollbarWidth = null;\n    };\n\n    _proto.handleUpdate = function handleUpdate() {\n      this._adjustDialog();\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$3, config);\n      Util.typeCheckConfig(NAME$5, config, DefaultType$3);\n      return config;\n    };\n\n    _proto._showElement = function _showElement(relatedTarget) {\n      var _this3 = this;\n\n      var transition = $(this._element).hasClass(ClassName$5.FADE);\n\n      if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) {\n        // Don't move modal's DOM position\n        document.body.appendChild(this._element);\n      }\n\n      this._element.style.display = 'block';\n\n      this._element.removeAttribute('aria-hidden');\n\n      this._element.setAttribute('aria-modal', true);\n\n      if ($(this._dialog).hasClass(ClassName$5.SCROLLABLE)) {\n        this._dialog.querySelector(Selector$5.MODAL_BODY).scrollTop = 0;\n      } else {\n        this._element.scrollTop = 0;\n      }\n\n      if (transition) {\n        Util.reflow(this._element);\n      }\n\n      $(this._element).addClass(ClassName$5.SHOW);\n\n      if (this._config.focus) {\n        this._enforceFocus();\n      }\n\n      var shownEvent = $.Event(Event$5.SHOWN, {\n        relatedTarget: relatedTarget\n      });\n\n      var transitionComplete = function transitionComplete() {\n        if (_this3._config.focus) {\n          _this3._element.focus();\n        }\n\n        _this3._isTransitioning = false;\n        $(_this3._element).trigger(shownEvent);\n      };\n\n      if (transition) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._dialog);\n        $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration);\n      } else {\n        transitionComplete();\n      }\n    };\n\n    _proto._enforceFocus = function _enforceFocus() {\n      var _this4 = this;\n\n      $(document).off(Event$5.FOCUSIN) // Guard against infinite focus loop\n      .on(Event$5.FOCUSIN, function (event) {\n        if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) {\n          _this4._element.focus();\n        }\n      });\n    };\n\n    _proto._setEscapeEvent = function _setEscapeEvent() {\n      var _this5 = this;\n\n      if (this._isShown && this._config.keyboard) {\n        $(this._element).on(Event$5.KEYDOWN_DISMISS, function (event) {\n          if (event.which === ESCAPE_KEYCODE$1) {\n            event.preventDefault();\n\n            _this5.hide();\n          }\n        });\n      } else if (!this._isShown) {\n        $(this._element).off(Event$5.KEYDOWN_DISMISS);\n      }\n    };\n\n    _proto._setResizeEvent = function _setResizeEvent() {\n      var _this6 = this;\n\n      if (this._isShown) {\n        $(window).on(Event$5.RESIZE, function (event) {\n          return _this6.handleUpdate(event);\n        });\n      } else {\n        $(window).off(Event$5.RESIZE);\n      }\n    };\n\n    _proto._hideModal = function _hideModal() {\n      var _this7 = this;\n\n      this._element.style.display = 'none';\n\n      this._element.setAttribute('aria-hidden', true);\n\n      this._element.removeAttribute('aria-modal');\n\n      this._isTransitioning = false;\n\n      this._showBackdrop(function () {\n        $(document.body).removeClass(ClassName$5.OPEN);\n\n        _this7._resetAdjustments();\n\n        _this7._resetScrollbar();\n\n        $(_this7._element).trigger(Event$5.HIDDEN);\n      });\n    };\n\n    _proto._removeBackdrop = function _removeBackdrop() {\n      if (this._backdrop) {\n        $(this._backdrop).remove();\n        this._backdrop = null;\n      }\n    };\n\n    _proto._showBackdrop = function _showBackdrop(callback) {\n      var _this8 = this;\n\n      var animate = $(this._element).hasClass(ClassName$5.FADE) ? ClassName$5.FADE : '';\n\n      if (this._isShown && this._config.backdrop) {\n        this._backdrop = document.createElement('div');\n        this._backdrop.className = ClassName$5.BACKDROP;\n\n        if (animate) {\n          this._backdrop.classList.add(animate);\n        }\n\n        $(this._backdrop).appendTo(document.body);\n        $(this._element).on(Event$5.CLICK_DISMISS, function (event) {\n          if (_this8._ignoreBackdropClick) {\n            _this8._ignoreBackdropClick = false;\n            return;\n          }\n\n          if (event.target !== event.currentTarget) {\n            return;\n          }\n\n          if (_this8._config.backdrop === 'static') {\n            _this8._element.focus();\n          } else {\n            _this8.hide();\n          }\n        });\n\n        if (animate) {\n          Util.reflow(this._backdrop);\n        }\n\n        $(this._backdrop).addClass(ClassName$5.SHOW);\n\n        if (!callback) {\n          return;\n        }\n\n        if (!animate) {\n          callback();\n          return;\n        }\n\n        var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n        $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration);\n      } else if (!this._isShown && this._backdrop) {\n        $(this._backdrop).removeClass(ClassName$5.SHOW);\n\n        var callbackRemove = function callbackRemove() {\n          _this8._removeBackdrop();\n\n          if (callback) {\n            callback();\n          }\n        };\n\n        if ($(this._element).hasClass(ClassName$5.FADE)) {\n          var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop);\n\n          $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration);\n        } else {\n          callbackRemove();\n        }\n      } else if (callback) {\n        callback();\n      }\n    } // ----------------------------------------------------------------------\n    // the following methods are used to handle overflowing modals\n    // todo (fat): these should probably be refactored out of modal.js\n    // ----------------------------------------------------------------------\n    ;\n\n    _proto._adjustDialog = function _adjustDialog() {\n      var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n\n      if (!this._isBodyOverflowing && isModalOverflowing) {\n        this._element.style.paddingLeft = this._scrollbarWidth + \"px\";\n      }\n\n      if (this._isBodyOverflowing && !isModalOverflowing) {\n        this._element.style.paddingRight = this._scrollbarWidth + \"px\";\n      }\n    };\n\n    _proto._resetAdjustments = function _resetAdjustments() {\n      this._element.style.paddingLeft = '';\n      this._element.style.paddingRight = '';\n    };\n\n    _proto._checkScrollbar = function _checkScrollbar() {\n      var rect = document.body.getBoundingClientRect();\n      this._isBodyOverflowing = rect.left + rect.right < window.innerWidth;\n      this._scrollbarWidth = this._getScrollbarWidth();\n    };\n\n    _proto._setScrollbar = function _setScrollbar() {\n      var _this9 = this;\n\n      if (this._isBodyOverflowing) {\n        // Note: DOMNode.style.paddingRight returns the actual value or '' if not set\n        //   while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set\n        var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n        var stickyContent = [].slice.call(document.querySelectorAll(Selector$5.STICKY_CONTENT)); // Adjust fixed content padding\n\n        $(fixedContent).each(function (index, element) {\n          var actualPadding = element.style.paddingRight;\n          var calculatedPadding = $(element).css('padding-right');\n          $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + \"px\");\n        }); // Adjust sticky content margin\n\n        $(stickyContent).each(function (index, element) {\n          var actualMargin = element.style.marginRight;\n          var calculatedMargin = $(element).css('margin-right');\n          $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + \"px\");\n        }); // Adjust body padding\n\n        var actualPadding = document.body.style.paddingRight;\n        var calculatedPadding = $(document.body).css('padding-right');\n        $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + \"px\");\n      }\n\n      $(document.body).addClass(ClassName$5.OPEN);\n    };\n\n    _proto._resetScrollbar = function _resetScrollbar() {\n      // Restore fixed content padding\n      var fixedContent = [].slice.call(document.querySelectorAll(Selector$5.FIXED_CONTENT));\n      $(fixedContent).each(function (index, element) {\n        var padding = $(element).data('padding-right');\n        $(element).removeData('padding-right');\n        element.style.paddingRight = padding ? padding : '';\n      }); // Restore sticky content\n\n      var elements = [].slice.call(document.querySelectorAll(\"\" + Selector$5.STICKY_CONTENT));\n      $(elements).each(function (index, element) {\n        var margin = $(element).data('margin-right');\n\n        if (typeof margin !== 'undefined') {\n          $(element).css('margin-right', margin).removeData('margin-right');\n        }\n      }); // Restore body padding\n\n      var padding = $(document.body).data('padding-right');\n      $(document.body).removeData('padding-right');\n      document.body.style.paddingRight = padding ? padding : '';\n    };\n\n    _proto._getScrollbarWidth = function _getScrollbarWidth() {\n      // thx d.walsh\n      var scrollDiv = document.createElement('div');\n      scrollDiv.className = ClassName$5.SCROLLBAR_MEASURER;\n      document.body.appendChild(scrollDiv);\n      var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth;\n      document.body.removeChild(scrollDiv);\n      return scrollbarWidth;\n    } // Static\n    ;\n\n    Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$5);\n\n        var _config = _objectSpread({}, Default$3, $(this).data(), typeof config === 'object' && config ? config : {});\n\n        if (!data) {\n          data = new Modal(this, _config);\n          $(this).data(DATA_KEY$5, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](relatedTarget);\n        } else if (_config.show) {\n          data.show(relatedTarget);\n        }\n      });\n    };\n\n    _createClass(Modal, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$5;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$3;\n      }\n    }]);\n\n    return Modal;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$5.CLICK_DATA_API, Selector$5.DATA_TOGGLE, function (event) {\n    var _this10 = this;\n\n    var target;\n    var selector = Util.getSelectorFromElement(this);\n\n    if (selector) {\n      target = document.querySelector(selector);\n    }\n\n    var config = $(target).data(DATA_KEY$5) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data());\n\n    if (this.tagName === 'A' || this.tagName === 'AREA') {\n      event.preventDefault();\n    }\n\n    var $target = $(target).one(Event$5.SHOW, function (showEvent) {\n      if (showEvent.isDefaultPrevented()) {\n        // Only register focus restorer if modal will actually get shown\n        return;\n      }\n\n      $target.one(Event$5.HIDDEN, function () {\n        if ($(_this10).is(':visible')) {\n          _this10.focus();\n        }\n      });\n    });\n\n    Modal._jQueryInterface.call($(target), config, this);\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$5] = Modal._jQueryInterface;\n  $.fn[NAME$5].Constructor = Modal;\n\n  $.fn[NAME$5].noConflict = function () {\n    $.fn[NAME$5] = JQUERY_NO_CONFLICT$5;\n    return Modal._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): tools/sanitizer.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n  var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href'];\n  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i;\n  var DefaultWhitelist = {\n    // Global attributes allowed on any supplied element below.\n    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n    a: ['target', 'href', 'title', 'rel'],\n    area: [],\n    b: [],\n    br: [],\n    col: [],\n    code: [],\n    div: [],\n    em: [],\n    hr: [],\n    h1: [],\n    h2: [],\n    h3: [],\n    h4: [],\n    h5: [],\n    h6: [],\n    i: [],\n    img: ['src', 'alt', 'title', 'width', 'height'],\n    li: [],\n    ol: [],\n    p: [],\n    pre: [],\n    s: [],\n    small: [],\n    span: [],\n    sub: [],\n    sup: [],\n    strong: [],\n    u: [],\n    ul: []\n    /**\n     * A pattern that recognizes a commonly useful subset of URLs that are safe.\n     *\n     * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n     */\n\n  };\n  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi;\n  /**\n   * A pattern that matches safe data URLs. Only matches image, video and audio types.\n   *\n   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts\n   */\n\n  var DATA_URL_PATTERN = /^data:(?:image\\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\\/(?:mpeg|mp4|ogg|webm)|audio\\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;\n\n  function allowedAttribute(attr, allowedAttributeList) {\n    var attrName = attr.nodeName.toLowerCase();\n\n    if (allowedAttributeList.indexOf(attrName) !== -1) {\n      if (uriAttrs.indexOf(attrName) !== -1) {\n        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN));\n      }\n\n      return true;\n    }\n\n    var regExp = allowedAttributeList.filter(function (attrRegex) {\n      return attrRegex instanceof RegExp;\n    }); // Check if a regular expression validates the attribute.\n\n    for (var i = 0, l = regExp.length; i < l; i++) {\n      if (attrName.match(regExp[i])) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {\n    if (unsafeHtml.length === 0) {\n      return unsafeHtml;\n    }\n\n    if (sanitizeFn && typeof sanitizeFn === 'function') {\n      return sanitizeFn(unsafeHtml);\n    }\n\n    var domParser = new window.DOMParser();\n    var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html');\n    var whitelistKeys = Object.keys(whiteList);\n    var elements = [].slice.call(createdDocument.body.querySelectorAll('*'));\n\n    var _loop = function _loop(i, len) {\n      var el = elements[i];\n      var elName = el.nodeName.toLowerCase();\n\n      if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) {\n        el.parentNode.removeChild(el);\n        return \"continue\";\n      }\n\n      var attributeList = [].slice.call(el.attributes);\n      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []);\n      attributeList.forEach(function (attr) {\n        if (!allowedAttribute(attr, whitelistedAttributes)) {\n          el.removeAttribute(attr.nodeName);\n        }\n      });\n    };\n\n    for (var i = 0, len = elements.length; i < len; i++) {\n      var _ret = _loop(i, len);\n\n      if (_ret === \"continue\") continue;\n    }\n\n    return createdDocument.body.innerHTML;\n  }\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$6 = 'tooltip';\n  var VERSION$6 = '4.3.1';\n  var DATA_KEY$6 = 'bs.tooltip';\n  var EVENT_KEY$6 = \".\" + DATA_KEY$6;\n  var JQUERY_NO_CONFLICT$6 = $.fn[NAME$6];\n  var CLASS_PREFIX = 'bs-tooltip';\n  var BSCLS_PREFIX_REGEX = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX + \"\\\\S+\", 'g');\n  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn'];\n  var DefaultType$4 = {\n    animation: 'boolean',\n    template: 'string',\n    title: '(string|element|function)',\n    trigger: 'string',\n    delay: '(number|object)',\n    html: 'boolean',\n    selector: '(string|boolean)',\n    placement: '(string|function)',\n    offset: '(number|string|function)',\n    container: '(string|element|boolean)',\n    fallbackPlacement: '(string|array)',\n    boundary: '(string|element)',\n    sanitize: 'boolean',\n    sanitizeFn: '(null|function)',\n    whiteList: 'object'\n  };\n  var AttachmentMap$1 = {\n    AUTO: 'auto',\n    TOP: 'top',\n    RIGHT: 'right',\n    BOTTOM: 'bottom',\n    LEFT: 'left'\n  };\n  var Default$4 = {\n    animation: true,\n    template: '<div class=\"tooltip\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    selector: false,\n    placement: 'top',\n    offset: 0,\n    container: false,\n    fallbackPlacement: 'flip',\n    boundary: 'scrollParent',\n    sanitize: true,\n    sanitizeFn: null,\n    whiteList: DefaultWhitelist\n  };\n  var HoverState = {\n    SHOW: 'show',\n    OUT: 'out'\n  };\n  var Event$6 = {\n    HIDE: \"hide\" + EVENT_KEY$6,\n    HIDDEN: \"hidden\" + EVENT_KEY$6,\n    SHOW: \"show\" + EVENT_KEY$6,\n    SHOWN: \"shown\" + EVENT_KEY$6,\n    INSERTED: \"inserted\" + EVENT_KEY$6,\n    CLICK: \"click\" + EVENT_KEY$6,\n    FOCUSIN: \"focusin\" + EVENT_KEY$6,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$6,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$6,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$6\n  };\n  var ClassName$6 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$6 = {\n    TOOLTIP: '.tooltip',\n    TOOLTIP_INNER: '.tooltip-inner',\n    ARROW: '.arrow'\n  };\n  var Trigger = {\n    HOVER: 'hover',\n    FOCUS: 'focus',\n    CLICK: 'click',\n    MANUAL: 'manual'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tooltip =\n  /*#__PURE__*/\n  function () {\n    function Tooltip(element, config) {\n      /**\n       * Check for Popper dependency\n       * Popper - https://popper.js.org\n       */\n      if (typeof Popper === 'undefined') {\n        throw new TypeError('Bootstrap\\'s tooltips require Popper.js (https://popper.js.org/)');\n      } // private\n\n\n      this._isEnabled = true;\n      this._timeout = 0;\n      this._hoverState = '';\n      this._activeTrigger = {};\n      this._popper = null; // Protected\n\n      this.element = element;\n      this.config = this._getConfig(config);\n      this.tip = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Tooltip.prototype;\n\n    // Public\n    _proto.enable = function enable() {\n      this._isEnabled = true;\n    };\n\n    _proto.disable = function disable() {\n      this._isEnabled = false;\n    };\n\n    _proto.toggleEnabled = function toggleEnabled() {\n      this._isEnabled = !this._isEnabled;\n    };\n\n    _proto.toggle = function toggle(event) {\n      if (!this._isEnabled) {\n        return;\n      }\n\n      if (event) {\n        var dataKey = this.constructor.DATA_KEY;\n        var context = $(event.currentTarget).data(dataKey);\n\n        if (!context) {\n          context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n          $(event.currentTarget).data(dataKey, context);\n        }\n\n        context._activeTrigger.click = !context._activeTrigger.click;\n\n        if (context._isWithActiveTrigger()) {\n          context._enter(null, context);\n        } else {\n          context._leave(null, context);\n        }\n      } else {\n        if ($(this.getTipElement()).hasClass(ClassName$6.SHOW)) {\n          this._leave(null, this);\n\n          return;\n        }\n\n        this._enter(null, this);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      $.removeData(this.element, this.constructor.DATA_KEY);\n      $(this.element).off(this.constructor.EVENT_KEY);\n      $(this.element).closest('.modal').off('hide.bs.modal');\n\n      if (this.tip) {\n        $(this.tip).remove();\n      }\n\n      this._isEnabled = null;\n      this._timeout = null;\n      this._hoverState = null;\n      this._activeTrigger = null;\n\n      if (this._popper !== null) {\n        this._popper.destroy();\n      }\n\n      this._popper = null;\n      this.element = null;\n      this.config = null;\n      this.tip = null;\n    };\n\n    _proto.show = function show() {\n      var _this = this;\n\n      if ($(this.element).css('display') === 'none') {\n        throw new Error('Please use show on visible elements');\n      }\n\n      var showEvent = $.Event(this.constructor.Event.SHOW);\n\n      if (this.isWithContent() && this._isEnabled) {\n        $(this.element).trigger(showEvent);\n        var shadowRoot = Util.findShadowRoot(this.element);\n        var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element);\n\n        if (showEvent.isDefaultPrevented() || !isInTheDom) {\n          return;\n        }\n\n        var tip = this.getTipElement();\n        var tipId = Util.getUID(this.constructor.NAME);\n        tip.setAttribute('id', tipId);\n        this.element.setAttribute('aria-describedby', tipId);\n        this.setContent();\n\n        if (this.config.animation) {\n          $(tip).addClass(ClassName$6.FADE);\n        }\n\n        var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement;\n\n        var attachment = this._getAttachment(placement);\n\n        this.addAttachmentClass(attachment);\n\n        var container = this._getContainer();\n\n        $(tip).data(this.constructor.DATA_KEY, this);\n\n        if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) {\n          $(tip).appendTo(container);\n        }\n\n        $(this.element).trigger(this.constructor.Event.INSERTED);\n        this._popper = new Popper(this.element, tip, {\n          placement: attachment,\n          modifiers: {\n            offset: this._getOffset(),\n            flip: {\n              behavior: this.config.fallbackPlacement\n            },\n            arrow: {\n              element: Selector$6.ARROW\n            },\n            preventOverflow: {\n              boundariesElement: this.config.boundary\n            }\n          },\n          onCreate: function onCreate(data) {\n            if (data.originalPlacement !== data.placement) {\n              _this._handlePopperPlacementChange(data);\n            }\n          },\n          onUpdate: function onUpdate(data) {\n            return _this._handlePopperPlacementChange(data);\n          }\n        });\n        $(tip).addClass(ClassName$6.SHOW); // If this is a touch-enabled device we add extra\n        // empty mouseover listeners to the body's immediate children;\n        // only needed because of broken event delegation on iOS\n        // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n\n        if ('ontouchstart' in document.documentElement) {\n          $(document.body).children().on('mouseover', null, $.noop);\n        }\n\n        var complete = function complete() {\n          if (_this.config.animation) {\n            _this._fixTransition();\n          }\n\n          var prevHoverState = _this._hoverState;\n          _this._hoverState = null;\n          $(_this.element).trigger(_this.constructor.Event.SHOWN);\n\n          if (prevHoverState === HoverState.OUT) {\n            _this._leave(null, _this);\n          }\n        };\n\n        if ($(this.tip).hasClass(ClassName$6.FADE)) {\n          var transitionDuration = Util.getTransitionDurationFromElement(this.tip);\n          $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n        } else {\n          complete();\n        }\n      }\n    };\n\n    _proto.hide = function hide(callback) {\n      var _this2 = this;\n\n      var tip = this.getTipElement();\n      var hideEvent = $.Event(this.constructor.Event.HIDE);\n\n      var complete = function complete() {\n        if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) {\n          tip.parentNode.removeChild(tip);\n        }\n\n        _this2._cleanTipClass();\n\n        _this2.element.removeAttribute('aria-describedby');\n\n        $(_this2.element).trigger(_this2.constructor.Event.HIDDEN);\n\n        if (_this2._popper !== null) {\n          _this2._popper.destroy();\n        }\n\n        if (callback) {\n          callback();\n        }\n      };\n\n      $(this.element).trigger(hideEvent);\n\n      if (hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.SHOW); // If this is a touch-enabled device we remove the extra\n      // empty mouseover listeners we added for iOS support\n\n      if ('ontouchstart' in document.documentElement) {\n        $(document.body).children().off('mouseover', null, $.noop);\n      }\n\n      this._activeTrigger[Trigger.CLICK] = false;\n      this._activeTrigger[Trigger.FOCUS] = false;\n      this._activeTrigger[Trigger.HOVER] = false;\n\n      if ($(this.tip).hasClass(ClassName$6.FADE)) {\n        var transitionDuration = Util.getTransitionDurationFromElement(tip);\n        $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n\n      this._hoverState = '';\n    };\n\n    _proto.update = function update() {\n      if (this._popper !== null) {\n        this._popper.scheduleUpdate();\n      }\n    } // Protected\n    ;\n\n    _proto.isWithContent = function isWithContent() {\n      return Boolean(this.getTitle());\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var tip = this.getTipElement();\n      this.setElementContent($(tip.querySelectorAll(Selector$6.TOOLTIP_INNER)), this.getTitle());\n      $(tip).removeClass(ClassName$6.FADE + \" \" + ClassName$6.SHOW);\n    };\n\n    _proto.setElementContent = function setElementContent($element, content) {\n      if (typeof content === 'object' && (content.nodeType || content.jquery)) {\n        // Content is a DOM node or a jQuery\n        if (this.config.html) {\n          if (!$(content).parent().is($element)) {\n            $element.empty().append(content);\n          }\n        } else {\n          $element.text($(content).text());\n        }\n\n        return;\n      }\n\n      if (this.config.html) {\n        if (this.config.sanitize) {\n          content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn);\n        }\n\n        $element.html(content);\n      } else {\n        $element.text(content);\n      }\n    };\n\n    _proto.getTitle = function getTitle() {\n      var title = this.element.getAttribute('data-original-title');\n\n      if (!title) {\n        title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title;\n      }\n\n      return title;\n    } // Private\n    ;\n\n    _proto._getOffset = function _getOffset() {\n      var _this3 = this;\n\n      var offset = {};\n\n      if (typeof this.config.offset === 'function') {\n        offset.fn = function (data) {\n          data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {});\n          return data;\n        };\n      } else {\n        offset.offset = this.config.offset;\n      }\n\n      return offset;\n    };\n\n    _proto._getContainer = function _getContainer() {\n      if (this.config.container === false) {\n        return document.body;\n      }\n\n      if (Util.isElement(this.config.container)) {\n        return $(this.config.container);\n      }\n\n      return $(document).find(this.config.container);\n    };\n\n    _proto._getAttachment = function _getAttachment(placement) {\n      return AttachmentMap$1[placement.toUpperCase()];\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this4 = this;\n\n      var triggers = this.config.trigger.split(' ');\n      triggers.forEach(function (trigger) {\n        if (trigger === 'click') {\n          $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) {\n            return _this4.toggle(event);\n          });\n        } else if (trigger !== Trigger.MANUAL) {\n          var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN;\n          var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT;\n          $(_this4.element).on(eventIn, _this4.config.selector, function (event) {\n            return _this4._enter(event);\n          }).on(eventOut, _this4.config.selector, function (event) {\n            return _this4._leave(event);\n          });\n        }\n      });\n      $(this.element).closest('.modal').on('hide.bs.modal', function () {\n        if (_this4.element) {\n          _this4.hide();\n        }\n      });\n\n      if (this.config.selector) {\n        this.config = _objectSpread({}, this.config, {\n          trigger: 'manual',\n          selector: ''\n        });\n      } else {\n        this._fixTitle();\n      }\n    };\n\n    _proto._fixTitle = function _fixTitle() {\n      var titleType = typeof this.element.getAttribute('data-original-title');\n\n      if (this.element.getAttribute('title') || titleType !== 'string') {\n        this.element.setAttribute('data-original-title', this.element.getAttribute('title') || '');\n        this.element.setAttribute('title', '');\n      }\n    };\n\n    _proto._enter = function _enter(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true;\n      }\n\n      if ($(context.getTipElement()).hasClass(ClassName$6.SHOW) || context._hoverState === HoverState.SHOW) {\n        context._hoverState = HoverState.SHOW;\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.SHOW;\n\n      if (!context.config.delay || !context.config.delay.show) {\n        context.show();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.SHOW) {\n          context.show();\n        }\n      }, context.config.delay.show);\n    };\n\n    _proto._leave = function _leave(event, context) {\n      var dataKey = this.constructor.DATA_KEY;\n      context = context || $(event.currentTarget).data(dataKey);\n\n      if (!context) {\n        context = new this.constructor(event.currentTarget, this._getDelegateConfig());\n        $(event.currentTarget).data(dataKey, context);\n      }\n\n      if (event) {\n        context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;\n      }\n\n      if (context._isWithActiveTrigger()) {\n        return;\n      }\n\n      clearTimeout(context._timeout);\n      context._hoverState = HoverState.OUT;\n\n      if (!context.config.delay || !context.config.delay.hide) {\n        context.hide();\n        return;\n      }\n\n      context._timeout = setTimeout(function () {\n        if (context._hoverState === HoverState.OUT) {\n          context.hide();\n        }\n      }, context.config.delay.hide);\n    };\n\n    _proto._isWithActiveTrigger = function _isWithActiveTrigger() {\n      for (var trigger in this._activeTrigger) {\n        if (this._activeTrigger[trigger]) {\n          return true;\n        }\n      }\n\n      return false;\n    };\n\n    _proto._getConfig = function _getConfig(config) {\n      var dataAttributes = $(this.element).data();\n      Object.keys(dataAttributes).forEach(function (dataAttr) {\n        if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) {\n          delete dataAttributes[dataAttr];\n        }\n      });\n      config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.delay === 'number') {\n        config.delay = {\n          show: config.delay,\n          hide: config.delay\n        };\n      }\n\n      if (typeof config.title === 'number') {\n        config.title = config.title.toString();\n      }\n\n      if (typeof config.content === 'number') {\n        config.content = config.content.toString();\n      }\n\n      Util.typeCheckConfig(NAME$6, config, this.constructor.DefaultType);\n\n      if (config.sanitize) {\n        config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn);\n      }\n\n      return config;\n    };\n\n    _proto._getDelegateConfig = function _getDelegateConfig() {\n      var config = {};\n\n      if (this.config) {\n        for (var key in this.config) {\n          if (this.constructor.Default[key] !== this.config[key]) {\n            config[key] = this.config[key];\n          }\n        }\n      }\n\n      return config;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX);\n\n      if (tabClass !== null && tabClass.length) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    };\n\n    _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) {\n      var popperInstance = popperData.instance;\n      this.tip = popperInstance.popper;\n\n      this._cleanTipClass();\n\n      this.addAttachmentClass(this._getAttachment(popperData.placement));\n    };\n\n    _proto._fixTransition = function _fixTransition() {\n      var tip = this.getTipElement();\n      var initConfigAnimation = this.config.animation;\n\n      if (tip.getAttribute('x-placement') !== null) {\n        return;\n      }\n\n      $(tip).removeClass(ClassName$6.FADE);\n      this.config.animation = false;\n      this.hide();\n      this.show();\n      this.config.animation = initConfigAnimation;\n    } // Static\n    ;\n\n    Tooltip._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$6);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Tooltip(this, _config);\n          $(this).data(DATA_KEY$6, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tooltip, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$6;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$4;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$6;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$6;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$6;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$6;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$4;\n      }\n    }]);\n\n    return Tooltip;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$6] = Tooltip._jQueryInterface;\n  $.fn[NAME$6].Constructor = Tooltip;\n\n  $.fn[NAME$6].noConflict = function () {\n    $.fn[NAME$6] = JQUERY_NO_CONFLICT$6;\n    return Tooltip._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$7 = 'popover';\n  var VERSION$7 = '4.3.1';\n  var DATA_KEY$7 = 'bs.popover';\n  var EVENT_KEY$7 = \".\" + DATA_KEY$7;\n  var JQUERY_NO_CONFLICT$7 = $.fn[NAME$7];\n  var CLASS_PREFIX$1 = 'bs-popover';\n  var BSCLS_PREFIX_REGEX$1 = new RegExp(\"(^|\\\\s)\" + CLASS_PREFIX$1 + \"\\\\S+\", 'g');\n\n  var Default$5 = _objectSpread({}, Tooltip.Default, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\" role=\"tooltip\">' + '<div class=\"arrow\"></div>' + '<h3 class=\"popover-header\"></h3>' + '<div class=\"popover-body\"></div></div>'\n  });\n\n  var DefaultType$5 = _objectSpread({}, Tooltip.DefaultType, {\n    content: '(string|element|function)'\n  });\n\n  var ClassName$7 = {\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$7 = {\n    TITLE: '.popover-header',\n    CONTENT: '.popover-body'\n  };\n  var Event$7 = {\n    HIDE: \"hide\" + EVENT_KEY$7,\n    HIDDEN: \"hidden\" + EVENT_KEY$7,\n    SHOW: \"show\" + EVENT_KEY$7,\n    SHOWN: \"shown\" + EVENT_KEY$7,\n    INSERTED: \"inserted\" + EVENT_KEY$7,\n    CLICK: \"click\" + EVENT_KEY$7,\n    FOCUSIN: \"focusin\" + EVENT_KEY$7,\n    FOCUSOUT: \"focusout\" + EVENT_KEY$7,\n    MOUSEENTER: \"mouseenter\" + EVENT_KEY$7,\n    MOUSELEAVE: \"mouseleave\" + EVENT_KEY$7\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Popover =\n  /*#__PURE__*/\n  function (_Tooltip) {\n    _inheritsLoose(Popover, _Tooltip);\n\n    function Popover() {\n      return _Tooltip.apply(this, arguments) || this;\n    }\n\n    var _proto = Popover.prototype;\n\n    // Overrides\n    _proto.isWithContent = function isWithContent() {\n      return this.getTitle() || this._getContent();\n    };\n\n    _proto.addAttachmentClass = function addAttachmentClass(attachment) {\n      $(this.getTipElement()).addClass(CLASS_PREFIX$1 + \"-\" + attachment);\n    };\n\n    _proto.getTipElement = function getTipElement() {\n      this.tip = this.tip || $(this.config.template)[0];\n      return this.tip;\n    };\n\n    _proto.setContent = function setContent() {\n      var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events\n\n      this.setElementContent($tip.find(Selector$7.TITLE), this.getTitle());\n\n      var content = this._getContent();\n\n      if (typeof content === 'function') {\n        content = content.call(this.element);\n      }\n\n      this.setElementContent($tip.find(Selector$7.CONTENT), content);\n      $tip.removeClass(ClassName$7.FADE + \" \" + ClassName$7.SHOW);\n    } // Private\n    ;\n\n    _proto._getContent = function _getContent() {\n      return this.element.getAttribute('data-content') || this.config.content;\n    };\n\n    _proto._cleanTipClass = function _cleanTipClass() {\n      var $tip = $(this.getTipElement());\n      var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX$1);\n\n      if (tabClass !== null && tabClass.length > 0) {\n        $tip.removeClass(tabClass.join(''));\n      }\n    } // Static\n    ;\n\n    Popover._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$7);\n\n        var _config = typeof config === 'object' ? config : null;\n\n        if (!data && /dispose|hide/.test(config)) {\n          return;\n        }\n\n        if (!data) {\n          data = new Popover(this, _config);\n          $(this).data(DATA_KEY$7, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Popover, null, [{\n      key: \"VERSION\",\n      // Getters\n      get: function get() {\n        return VERSION$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$5;\n      }\n    }, {\n      key: \"NAME\",\n      get: function get() {\n        return NAME$7;\n      }\n    }, {\n      key: \"DATA_KEY\",\n      get: function get() {\n        return DATA_KEY$7;\n      }\n    }, {\n      key: \"Event\",\n      get: function get() {\n        return Event$7;\n      }\n    }, {\n      key: \"EVENT_KEY\",\n      get: function get() {\n        return EVENT_KEY$7;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$5;\n      }\n    }]);\n\n    return Popover;\n  }(Tooltip);\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$7] = Popover._jQueryInterface;\n  $.fn[NAME$7].Constructor = Popover;\n\n  $.fn[NAME$7].noConflict = function () {\n    $.fn[NAME$7] = JQUERY_NO_CONFLICT$7;\n    return Popover._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$8 = 'scrollspy';\n  var VERSION$8 = '4.3.1';\n  var DATA_KEY$8 = 'bs.scrollspy';\n  var EVENT_KEY$8 = \".\" + DATA_KEY$8;\n  var DATA_API_KEY$6 = '.data-api';\n  var JQUERY_NO_CONFLICT$8 = $.fn[NAME$8];\n  var Default$6 = {\n    offset: 10,\n    method: 'auto',\n    target: ''\n  };\n  var DefaultType$6 = {\n    offset: 'number',\n    method: 'string',\n    target: '(string|element)'\n  };\n  var Event$8 = {\n    ACTIVATE: \"activate\" + EVENT_KEY$8,\n    SCROLL: \"scroll\" + EVENT_KEY$8,\n    LOAD_DATA_API: \"load\" + EVENT_KEY$8 + DATA_API_KEY$6\n  };\n  var ClassName$8 = {\n    DROPDOWN_ITEM: 'dropdown-item',\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active'\n  };\n  var Selector$8 = {\n    DATA_SPY: '[data-spy=\"scroll\"]',\n    ACTIVE: '.active',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    NAV_LINKS: '.nav-link',\n    NAV_ITEMS: '.nav-item',\n    LIST_ITEMS: '.list-group-item',\n    DROPDOWN: '.dropdown',\n    DROPDOWN_ITEMS: '.dropdown-item',\n    DROPDOWN_TOGGLE: '.dropdown-toggle'\n  };\n  var OffsetMethod = {\n    OFFSET: 'offset',\n    POSITION: 'position'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var ScrollSpy =\n  /*#__PURE__*/\n  function () {\n    function ScrollSpy(element, config) {\n      var _this = this;\n\n      this._element = element;\n      this._scrollElement = element.tagName === 'BODY' ? window : element;\n      this._config = this._getConfig(config);\n      this._selector = this._config.target + \" \" + Selector$8.NAV_LINKS + \",\" + (this._config.target + \" \" + Selector$8.LIST_ITEMS + \",\") + (this._config.target + \" \" + Selector$8.DROPDOWN_ITEMS);\n      this._offsets = [];\n      this._targets = [];\n      this._activeTarget = null;\n      this._scrollHeight = 0;\n      $(this._scrollElement).on(Event$8.SCROLL, function (event) {\n        return _this._process(event);\n      });\n      this.refresh();\n\n      this._process();\n    } // Getters\n\n\n    var _proto = ScrollSpy.prototype;\n\n    // Public\n    _proto.refresh = function refresh() {\n      var _this2 = this;\n\n      var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;\n      var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;\n      var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;\n      this._offsets = [];\n      this._targets = [];\n      this._scrollHeight = this._getScrollHeight();\n      var targets = [].slice.call(document.querySelectorAll(this._selector));\n      targets.map(function (element) {\n        var target;\n        var targetSelector = Util.getSelectorFromElement(element);\n\n        if (targetSelector) {\n          target = document.querySelector(targetSelector);\n        }\n\n        if (target) {\n          var targetBCR = target.getBoundingClientRect();\n\n          if (targetBCR.width || targetBCR.height) {\n            // TODO (fat): remove sketch reliance on jQuery position/offset\n            return [$(target)[offsetMethod]().top + offsetBase, targetSelector];\n          }\n        }\n\n        return null;\n      }).filter(function (item) {\n        return item;\n      }).sort(function (a, b) {\n        return a[0] - b[0];\n      }).forEach(function (item) {\n        _this2._offsets.push(item[0]);\n\n        _this2._targets.push(item[1]);\n      });\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$8);\n      $(this._scrollElement).off(EVENT_KEY$8);\n      this._element = null;\n      this._scrollElement = null;\n      this._config = null;\n      this._selector = null;\n      this._offsets = null;\n      this._targets = null;\n      this._activeTarget = null;\n      this._scrollHeight = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$6, typeof config === 'object' && config ? config : {});\n\n      if (typeof config.target !== 'string') {\n        var id = $(config.target).attr('id');\n\n        if (!id) {\n          id = Util.getUID(NAME$8);\n          $(config.target).attr('id', id);\n        }\n\n        config.target = \"#\" + id;\n      }\n\n      Util.typeCheckConfig(NAME$8, config, DefaultType$6);\n      return config;\n    };\n\n    _proto._getScrollTop = function _getScrollTop() {\n      return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;\n    };\n\n    _proto._getScrollHeight = function _getScrollHeight() {\n      return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);\n    };\n\n    _proto._getOffsetHeight = function _getOffsetHeight() {\n      return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;\n    };\n\n    _proto._process = function _process() {\n      var scrollTop = this._getScrollTop() + this._config.offset;\n\n      var scrollHeight = this._getScrollHeight();\n\n      var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();\n\n      if (this._scrollHeight !== scrollHeight) {\n        this.refresh();\n      }\n\n      if (scrollTop >= maxScroll) {\n        var target = this._targets[this._targets.length - 1];\n\n        if (this._activeTarget !== target) {\n          this._activate(target);\n        }\n\n        return;\n      }\n\n      if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {\n        this._activeTarget = null;\n\n        this._clear();\n\n        return;\n      }\n\n      var offsetLength = this._offsets.length;\n\n      for (var i = offsetLength; i--;) {\n        var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);\n\n        if (isActiveTarget) {\n          this._activate(this._targets[i]);\n        }\n      }\n    };\n\n    _proto._activate = function _activate(target) {\n      this._activeTarget = target;\n\n      this._clear();\n\n      var queries = this._selector.split(',').map(function (selector) {\n        return selector + \"[data-target=\\\"\" + target + \"\\\"],\" + selector + \"[href=\\\"\" + target + \"\\\"]\";\n      });\n\n      var $link = $([].slice.call(document.querySelectorAll(queries.join(','))));\n\n      if ($link.hasClass(ClassName$8.DROPDOWN_ITEM)) {\n        $link.closest(Selector$8.DROPDOWN).find(Selector$8.DROPDOWN_TOGGLE).addClass(ClassName$8.ACTIVE);\n        $link.addClass(ClassName$8.ACTIVE);\n      } else {\n        // Set triggered link as active\n        $link.addClass(ClassName$8.ACTIVE); // Set triggered links parents as active\n        // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_LINKS + \", \" + Selector$8.LIST_ITEMS).addClass(ClassName$8.ACTIVE); // Handle special case when .nav-link is inside .nav-item\n\n        $link.parents(Selector$8.NAV_LIST_GROUP).prev(Selector$8.NAV_ITEMS).children(Selector$8.NAV_LINKS).addClass(ClassName$8.ACTIVE);\n      }\n\n      $(this._scrollElement).trigger(Event$8.ACTIVATE, {\n        relatedTarget: target\n      });\n    };\n\n    _proto._clear = function _clear() {\n      [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) {\n        return node.classList.contains(ClassName$8.ACTIVE);\n      }).forEach(function (node) {\n        return node.classList.remove(ClassName$8.ACTIVE);\n      });\n    } // Static\n    ;\n\n    ScrollSpy._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var data = $(this).data(DATA_KEY$8);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new ScrollSpy(this, _config);\n          $(this).data(DATA_KEY$8, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(ScrollSpy, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$8;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$6;\n      }\n    }]);\n\n    return ScrollSpy;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(window).on(Event$8.LOAD_DATA_API, function () {\n    var scrollSpys = [].slice.call(document.querySelectorAll(Selector$8.DATA_SPY));\n    var scrollSpysLength = scrollSpys.length;\n\n    for (var i = scrollSpysLength; i--;) {\n      var $spy = $(scrollSpys[i]);\n\n      ScrollSpy._jQueryInterface.call($spy, $spy.data());\n    }\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$8] = ScrollSpy._jQueryInterface;\n  $.fn[NAME$8].Constructor = ScrollSpy;\n\n  $.fn[NAME$8].noConflict = function () {\n    $.fn[NAME$8] = JQUERY_NO_CONFLICT$8;\n    return ScrollSpy._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$9 = 'tab';\n  var VERSION$9 = '4.3.1';\n  var DATA_KEY$9 = 'bs.tab';\n  var EVENT_KEY$9 = \".\" + DATA_KEY$9;\n  var DATA_API_KEY$7 = '.data-api';\n  var JQUERY_NO_CONFLICT$9 = $.fn[NAME$9];\n  var Event$9 = {\n    HIDE: \"hide\" + EVENT_KEY$9,\n    HIDDEN: \"hidden\" + EVENT_KEY$9,\n    SHOW: \"show\" + EVENT_KEY$9,\n    SHOWN: \"shown\" + EVENT_KEY$9,\n    CLICK_DATA_API: \"click\" + EVENT_KEY$9 + DATA_API_KEY$7\n  };\n  var ClassName$9 = {\n    DROPDOWN_MENU: 'dropdown-menu',\n    ACTIVE: 'active',\n    DISABLED: 'disabled',\n    FADE: 'fade',\n    SHOW: 'show'\n  };\n  var Selector$9 = {\n    DROPDOWN: '.dropdown',\n    NAV_LIST_GROUP: '.nav, .list-group',\n    ACTIVE: '.active',\n    ACTIVE_UL: '> li > .active',\n    DATA_TOGGLE: '[data-toggle=\"tab\"], [data-toggle=\"pill\"], [data-toggle=\"list\"]',\n    DROPDOWN_TOGGLE: '.dropdown-toggle',\n    DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Tab =\n  /*#__PURE__*/\n  function () {\n    function Tab(element) {\n      this._element = element;\n    } // Getters\n\n\n    var _proto = Tab.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName$9.ACTIVE) || $(this._element).hasClass(ClassName$9.DISABLED)) {\n        return;\n      }\n\n      var target;\n      var previous;\n      var listElement = $(this._element).closest(Selector$9.NAV_LIST_GROUP)[0];\n      var selector = Util.getSelectorFromElement(this._element);\n\n      if (listElement) {\n        var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector$9.ACTIVE_UL : Selector$9.ACTIVE;\n        previous = $.makeArray($(listElement).find(itemSelector));\n        previous = previous[previous.length - 1];\n      }\n\n      var hideEvent = $.Event(Event$9.HIDE, {\n        relatedTarget: this._element\n      });\n      var showEvent = $.Event(Event$9.SHOW, {\n        relatedTarget: previous\n      });\n\n      if (previous) {\n        $(previous).trigger(hideEvent);\n      }\n\n      $(this._element).trigger(showEvent);\n\n      if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) {\n        return;\n      }\n\n      if (selector) {\n        target = document.querySelector(selector);\n      }\n\n      this._activate(this._element, listElement);\n\n      var complete = function complete() {\n        var hiddenEvent = $.Event(Event$9.HIDDEN, {\n          relatedTarget: _this._element\n        });\n        var shownEvent = $.Event(Event$9.SHOWN, {\n          relatedTarget: previous\n        });\n        $(previous).trigger(hiddenEvent);\n        $(_this._element).trigger(shownEvent);\n      };\n\n      if (target) {\n        this._activate(target, target.parentNode, complete);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      $.removeData(this._element, DATA_KEY$9);\n      this._element = null;\n    } // Private\n    ;\n\n    _proto._activate = function _activate(element, container, callback) {\n      var _this2 = this;\n\n      var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector$9.ACTIVE_UL) : $(container).children(Selector$9.ACTIVE);\n      var active = activeElements[0];\n      var isTransitioning = callback && active && $(active).hasClass(ClassName$9.FADE);\n\n      var complete = function complete() {\n        return _this2._transitionComplete(element, active, callback);\n      };\n\n      if (active && isTransitioning) {\n        var transitionDuration = Util.getTransitionDurationFromElement(active);\n        $(active).removeClass(ClassName$9.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto._transitionComplete = function _transitionComplete(element, active, callback) {\n      if (active) {\n        $(active).removeClass(ClassName$9.ACTIVE);\n        var dropdownChild = $(active.parentNode).find(Selector$9.DROPDOWN_ACTIVE_CHILD)[0];\n\n        if (dropdownChild) {\n          $(dropdownChild).removeClass(ClassName$9.ACTIVE);\n        }\n\n        if (active.getAttribute('role') === 'tab') {\n          active.setAttribute('aria-selected', false);\n        }\n      }\n\n      $(element).addClass(ClassName$9.ACTIVE);\n\n      if (element.getAttribute('role') === 'tab') {\n        element.setAttribute('aria-selected', true);\n      }\n\n      Util.reflow(element);\n\n      if (element.classList.contains(ClassName$9.FADE)) {\n        element.classList.add(ClassName$9.SHOW);\n      }\n\n      if (element.parentNode && $(element.parentNode).hasClass(ClassName$9.DROPDOWN_MENU)) {\n        var dropdownElement = $(element).closest(Selector$9.DROPDOWN)[0];\n\n        if (dropdownElement) {\n          var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector$9.DROPDOWN_TOGGLE));\n          $(dropdownToggleList).addClass(ClassName$9.ACTIVE);\n        }\n\n        element.setAttribute('aria-expanded', true);\n      }\n\n      if (callback) {\n        callback();\n      }\n    } // Static\n    ;\n\n    Tab._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $this = $(this);\n        var data = $this.data(DATA_KEY$9);\n\n        if (!data) {\n          data = new Tab(this);\n          $this.data(DATA_KEY$9, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config]();\n        }\n      });\n    };\n\n    _createClass(Tab, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$9;\n      }\n    }]);\n\n    return Tab;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * Data Api implementation\n   * ------------------------------------------------------------------------\n   */\n\n\n  $(document).on(Event$9.CLICK_DATA_API, Selector$9.DATA_TOGGLE, function (event) {\n    event.preventDefault();\n\n    Tab._jQueryInterface.call($(this), 'show');\n  });\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n  $.fn[NAME$9] = Tab._jQueryInterface;\n  $.fn[NAME$9].Constructor = Tab;\n\n  $.fn[NAME$9].noConflict = function () {\n    $.fn[NAME$9] = JQUERY_NO_CONFLICT$9;\n    return Tab._jQueryInterface;\n  };\n\n  /**\n   * ------------------------------------------------------------------------\n   * Constants\n   * ------------------------------------------------------------------------\n   */\n\n  var NAME$a = 'toast';\n  var VERSION$a = '4.3.1';\n  var DATA_KEY$a = 'bs.toast';\n  var EVENT_KEY$a = \".\" + DATA_KEY$a;\n  var JQUERY_NO_CONFLICT$a = $.fn[NAME$a];\n  var Event$a = {\n    CLICK_DISMISS: \"click.dismiss\" + EVENT_KEY$a,\n    HIDE: \"hide\" + EVENT_KEY$a,\n    HIDDEN: \"hidden\" + EVENT_KEY$a,\n    SHOW: \"show\" + EVENT_KEY$a,\n    SHOWN: \"shown\" + EVENT_KEY$a\n  };\n  var ClassName$a = {\n    FADE: 'fade',\n    HIDE: 'hide',\n    SHOW: 'show',\n    SHOWING: 'showing'\n  };\n  var DefaultType$7 = {\n    animation: 'boolean',\n    autohide: 'boolean',\n    delay: 'number'\n  };\n  var Default$7 = {\n    animation: true,\n    autohide: true,\n    delay: 500\n  };\n  var Selector$a = {\n    DATA_DISMISS: '[data-dismiss=\"toast\"]'\n    /**\n     * ------------------------------------------------------------------------\n     * Class Definition\n     * ------------------------------------------------------------------------\n     */\n\n  };\n\n  var Toast =\n  /*#__PURE__*/\n  function () {\n    function Toast(element, config) {\n      this._element = element;\n      this._config = this._getConfig(config);\n      this._timeout = null;\n\n      this._setListeners();\n    } // Getters\n\n\n    var _proto = Toast.prototype;\n\n    // Public\n    _proto.show = function show() {\n      var _this = this;\n\n      $(this._element).trigger(Event$a.SHOW);\n\n      if (this._config.animation) {\n        this._element.classList.add(ClassName$a.FADE);\n      }\n\n      var complete = function complete() {\n        _this._element.classList.remove(ClassName$a.SHOWING);\n\n        _this._element.classList.add(ClassName$a.SHOW);\n\n        $(_this._element).trigger(Event$a.SHOWN);\n\n        if (_this._config.autohide) {\n          _this.hide();\n        }\n      };\n\n      this._element.classList.remove(ClassName$a.HIDE);\n\n      this._element.classList.add(ClassName$a.SHOWING);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    };\n\n    _proto.hide = function hide(withoutTimeout) {\n      var _this2 = this;\n\n      if (!this._element.classList.contains(ClassName$a.SHOW)) {\n        return;\n      }\n\n      $(this._element).trigger(Event$a.HIDE);\n\n      if (withoutTimeout) {\n        this._close();\n      } else {\n        this._timeout = setTimeout(function () {\n          _this2._close();\n        }, this._config.delay);\n      }\n    };\n\n    _proto.dispose = function dispose() {\n      clearTimeout(this._timeout);\n      this._timeout = null;\n\n      if (this._element.classList.contains(ClassName$a.SHOW)) {\n        this._element.classList.remove(ClassName$a.SHOW);\n      }\n\n      $(this._element).off(Event$a.CLICK_DISMISS);\n      $.removeData(this._element, DATA_KEY$a);\n      this._element = null;\n      this._config = null;\n    } // Private\n    ;\n\n    _proto._getConfig = function _getConfig(config) {\n      config = _objectSpread({}, Default$7, $(this._element).data(), typeof config === 'object' && config ? config : {});\n      Util.typeCheckConfig(NAME$a, config, this.constructor.DefaultType);\n      return config;\n    };\n\n    _proto._setListeners = function _setListeners() {\n      var _this3 = this;\n\n      $(this._element).on(Event$a.CLICK_DISMISS, Selector$a.DATA_DISMISS, function () {\n        return _this3.hide(true);\n      });\n    };\n\n    _proto._close = function _close() {\n      var _this4 = this;\n\n      var complete = function complete() {\n        _this4._element.classList.add(ClassName$a.HIDE);\n\n        $(_this4._element).trigger(Event$a.HIDDEN);\n      };\n\n      this._element.classList.remove(ClassName$a.SHOW);\n\n      if (this._config.animation) {\n        var transitionDuration = Util.getTransitionDurationFromElement(this._element);\n        $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration);\n      } else {\n        complete();\n      }\n    } // Static\n    ;\n\n    Toast._jQueryInterface = function _jQueryInterface(config) {\n      return this.each(function () {\n        var $element = $(this);\n        var data = $element.data(DATA_KEY$a);\n\n        var _config = typeof config === 'object' && config;\n\n        if (!data) {\n          data = new Toast(this, _config);\n          $element.data(DATA_KEY$a, data);\n        }\n\n        if (typeof config === 'string') {\n          if (typeof data[config] === 'undefined') {\n            throw new TypeError(\"No method named \\\"\" + config + \"\\\"\");\n          }\n\n          data[config](this);\n        }\n      });\n    };\n\n    _createClass(Toast, null, [{\n      key: \"VERSION\",\n      get: function get() {\n        return VERSION$a;\n      }\n    }, {\n      key: \"DefaultType\",\n      get: function get() {\n        return DefaultType$7;\n      }\n    }, {\n      key: \"Default\",\n      get: function get() {\n        return Default$7;\n      }\n    }]);\n\n    return Toast;\n  }();\n  /**\n   * ------------------------------------------------------------------------\n   * jQuery\n   * ------------------------------------------------------------------------\n   */\n\n\n  $.fn[NAME$a] = Toast._jQueryInterface;\n  $.fn[NAME$a].Constructor = Toast;\n\n  $.fn[NAME$a].noConflict = function () {\n    $.fn[NAME$a] = JQUERY_NO_CONFLICT$a;\n    return Toast._jQueryInterface;\n  };\n\n  /**\n   * --------------------------------------------------------------------------\n   * Bootstrap (v4.3.1): index.js\n   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n   * --------------------------------------------------------------------------\n   */\n\n  (function () {\n    if (typeof $ === 'undefined') {\n      throw new TypeError('Bootstrap\\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\\'s JavaScript.');\n    }\n\n    var version = $.fn.jquery.split(' ')[0].split('.');\n    var minMajor = 1;\n    var ltMajor = 2;\n    var minMinor = 9;\n    var minPatch = 1;\n    var maxMajor = 4;\n\n    if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) {\n      throw new Error('Bootstrap\\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0');\n    }\n  })();\n\n  exports.Util = Util;\n  exports.Alert = Alert;\n  exports.Button = Button;\n  exports.Carousel = Carousel;\n  exports.Collapse = Collapse;\n  exports.Dropdown = Dropdown;\n  exports.Modal = Modal;\n  exports.Popover = Popover;\n  exports.Scrollspy = ScrollSpy;\n  exports.Tab = Tab;\n  exports.Toast = Toast;\n  exports.Tooltip = Tooltip;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n//# sourceMappingURL=bootstrap.js.map\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/jquery/LICENSE.txt",
    "content": "Copyright JS Foundation and other contributors, https://js.foundation/\n\nThis software consists of voluntary contributions made by many\nindividuals. For exact contribution history, see the revision history\navailable at https://github.com/jquery/jquery\n\nThe following license applies to all parts of this software except as\ndocumented below:\n\n====\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n====\n\nAll files located in the node_modules and external directories are\nexternally maintained libraries used by this software which have their\nown licenses; we recommend you read them, as their terms may differ from\nthe terms above.\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/jquery/dist/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v3.5.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2020-05-04T22:49Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar flat = arr.flat ? function( array ) {\n\treturn arr.flat.call( array );\n} : function( array ) {\n\treturn arr.concat.apply( [], array );\n};\n\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n      // Support: Chrome <=57, Firefox <=52\n      // In some browsers, typeof returns \"function\" for HTML <object> elements\n      // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n      // We don't want to classify *any* DOM node as a function.\n      return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n  };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\nvar document = window.document;\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnonce: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, node, doc ) {\n\t\tdoc = doc || document;\n\n\t\tvar i, val,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\n\t\t\t\t// Support: Firefox 64+, Edge 18+\n\t\t\t\t// Some browsers don't support the \"nonce\" property on scripts.\n\t\t\t\t// On the other hand, just using `getAttribute` is not enough as\n\t\t\t\t// the `nonce` attribute is reset to an empty string whenever it\n\t\t\t\t// becomes browsing-context connected.\n\t\t\t\t// See https://github.com/whatwg/html/issues/2369\n\t\t\t\t// See https://html.spec.whatwg.org/#nonce-attributes\n\t\t\t\t// The `node.getAttribute` check was added for the sake of\n\t\t\t\t// `jQuery.globalEval` so that it can fake a nonce-containing node\n\t\t\t\t// via an object.\n\t\t\t\tval = node[ i ] || node.getAttribute && node.getAttribute( i );\n\t\t\t\tif ( val ) {\n\t\t\t\t\tscript.setAttribute( i, val );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.5.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t};\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teven: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn ( i + 1 ) % 2;\n\t\t} ) );\n\t},\n\n\todd: function() {\n\t\treturn this.pushStack( jQuery.grep( this, function( _elem, i ) {\n\t\t\treturn i % 2;\n\t\t} ) );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent Object.prototype pollution\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( name === \"__proto__\" || target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\t\t\t\t\tsrc = target[ name ];\n\n\t\t\t\t\t// Ensure proper type for the source value\n\t\t\t\t\tif ( copyIsArray && !Array.isArray( src ) ) {\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t} else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) {\n\t\t\t\t\t\tclone = {};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src;\n\t\t\t\t\t}\n\t\t\t\t\tcopyIsArray = false;\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a provided context; falls back to the global one\n\t// if not specified.\n\tglobalEval: function( code, options, doc ) {\n\t\tDOMEval( code, { nonce: options && options.nonce }, doc );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn flat( ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( _i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.5\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://js.foundation/\n *\n * Date: 2020-03-14\n */\n( function( window ) {\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tnonnativeSelectorCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ( {} ).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpushNative = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[ i ] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|\" +\n\t\t\"ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram\n\tidentifier = \"(?:\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace +\n\t\t\"?|\\\\\\\\[^\\\\r\\\\n\\\\f]|[\\\\w-]|[^\\0-\\\\x7f])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\n\t\t// \"Attribute values must be CSS identifiers [capture 5]\n\t\t// or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" +\n\t\twhitespace + \"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" +\n\t\twhitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace +\n\t\t\"*\" ),\n\trdescend = new RegExp( whitespace + \"|>\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" +\n\t\t\twhitespace + \"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" +\n\t\t\twhitespace + \"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace +\n\t\t\t\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" + whitespace +\n\t\t\t\"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trhtml = /HTML$/i,\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\[\\\\da-fA-F]{1,6}\" + whitespace + \"?|\\\\\\\\([^\\\\r\\\\n\\\\f])\", \"g\" ),\n\tfunescape = function( escape, nonHex ) {\n\t\tvar high = \"0x\" + escape.slice( 1 ) - 0x10000;\n\n\t\treturn nonHex ?\n\n\t\t\t// Strip the backslash prefix from a non-hex escape sequence\n\t\t\tnonHex :\n\n\t\t\t// Replace a hexadecimal escape sequence with the encoded Unicode code point\n\t\t\t// Support: IE <=11+\n\t\t\t// For values outside the Basic Multilingual Plane (BMP), manually construct a\n\t\t\t// surrogate pair\n\t\t\thigh < 0 ?\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" +\n\t\t\t\tch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tinDisabledFieldset = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && elem.nodeName.toLowerCase() === \"fieldset\";\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t( arr = slice.call( preferredDoc.childNodes ) ),\n\t\tpreferredDoc.childNodes\n\t);\n\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\t// eslint-disable-next-line no-unused-expressions\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpushNative.apply( target, slice.call( els ) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( ( target[ j++ ] = els[ i++ ] ) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\t\tsetDocument( context );\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( ( m = match[ 1 ] ) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( ( elem = context.getElementById( m ) ) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && ( elem = newContext.getElementById( m ) ) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[ 2 ] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( ( m = match[ 3 ] ) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!nonnativeSelectorCache[ selector + \" \" ] &&\n\t\t\t\t( !rbuggyQSA || !rbuggyQSA.test( selector ) ) &&\n\n\t\t\t\t// Support: IE 8 only\n\t\t\t\t// Exclude object elements\n\t\t\t\t( nodeType !== 1 || context.nodeName.toLowerCase() !== \"object\" ) ) {\n\n\t\t\t\tnewSelector = selector;\n\t\t\t\tnewContext = context;\n\n\t\t\t\t// qSA considers elements outside a scoping root when evaluating child or\n\t\t\t\t// descendant combinators, which is not what we want.\n\t\t\t\t// In such cases, we work around the behavior by prefixing every selector in the\n\t\t\t\t// list with an ID selector referencing the scope context.\n\t\t\t\t// The technique has to be used as well when a leading combinator is used\n\t\t\t\t// as such selectors are not recognized by querySelectorAll.\n\t\t\t\t// Thanks to Andrew Dupont for this technique.\n\t\t\t\tif ( nodeType === 1 &&\n\t\t\t\t\t( rdescend.test( selector ) || rcombinators.test( selector ) ) ) {\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\n\t\t\t\t\t// We can use :scope instead of the ID hack if the browser\n\t\t\t\t\t// supports it & if we're not changing the context.\n\t\t\t\t\tif ( newContext !== context || !support.scope ) {\n\n\t\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\t\tif ( ( nid = context.getAttribute( \"id\" ) ) ) {\n\t\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcontext.setAttribute( \"id\", ( nid = expando ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[ i ] = ( nid ? \"#\" + nid : \":scope\" ) + \" \" +\n\t\t\t\t\t\t\ttoSelector( groups[ i ] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\tnonnativeSelectorCache( selector, true );\n\t\t\t\t} finally {\n\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn ( cache[ key + \" \" ] = value );\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement( \"fieldset\" );\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch ( e ) {\n\t\treturn false;\n\t} finally {\n\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split( \"|\" ),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[ i ] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( ( cur = cur.nextSibling ) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn ( name === \"input\" || name === \"button\" ) && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\tinDisabledFieldset( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction( function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction( function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ ( j = matchIndexes[ i ] ) ] ) {\n\t\t\t\t\tseed[ j ] = !( matches[ j ] = seed[ j ] );\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t} );\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\tvar namespace = elem.namespaceURI,\n\t\tdocElem = ( elem.ownerDocument || elem ).documentElement;\n\n\t// Support: IE <=8\n\t// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes\n\t// https://bugs.jquery.com/ticket/4833\n\treturn !rhtml.test( namespace || docElem && docElem.nodeName || \"HTML\" );\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( preferredDoc != document &&\n\t\t( subWindow = document.defaultView ) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t// Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only,\n\t// Safari 4 - 5 only, Opera <=11.6 - 12.x only\n\t// IE/Edge & older browsers don't support the :scope pseudo-class.\n\t// Support: Safari 6.0 only\n\t// Safari 6.0 supports :scope but it's an alias of :root there.\n\tsupport.scope = assert( function( el ) {\n\t\tdocElem.appendChild( el ).appendChild( document.createElement( \"div\" ) );\n\t\treturn typeof el.querySelectorAll !== \"undefined\" &&\n\t\t\t!el.querySelectorAll( \":scope fieldset div\" ).length;\n\t} );\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert( function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute( \"className\" );\n\t} );\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert( function( el ) {\n\t\tel.appendChild( document.createComment( \"\" ) );\n\t\treturn !el.getElementsByTagName( \"*\" ).length;\n\t} );\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert( function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t} );\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[ \"ID\" ] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute( \"id\" ) === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[ \"ID\" ] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode( \"id\" );\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[ \"ID\" ] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( ( elem = elems[ i++ ] ) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode( \"id\" );\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[ \"TAG\" ] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[ \"CLASS\" ] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) {\n\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert( function( el ) {\n\n\t\t\tvar input;\n\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll( \"[msallowcapture^='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll( \"[selected]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"~=\" );\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 15 - 18+\n\t\t\t// IE 11/Edge don't find elements on a `[name='']` query in some cases.\n\t\t\t// Adding a temporary attribute to the document before the selection works\n\t\t\t// around the issue.\n\t\t\t// Interestingly, IE 10 & older don't seem to have the issue.\n\t\t\tinput = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"name\", \"\" );\n\t\t\tel.appendChild( input );\n\t\t\tif ( !el.querySelectorAll( \"[name='']\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*name\" + whitespace + \"*=\" +\n\t\t\t\t\twhitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll( \":checked\" ).length ) {\n\t\t\t\trbuggyQSA.push( \":checked\" );\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push( \".#.+[+~]\" );\n\t\t\t}\n\n\t\t\t// Support: Firefox <=3.6 - 5 only\n\t\t\t// Old Firefox doesn't throw on a badly-escaped identifier.\n\t\t\tel.querySelectorAll( \"\\\\\\f\" );\n\t\t\trbuggyQSA.push( \"[\\\\r\\\\n\\\\f]\" );\n\t\t} );\n\n\t\tassert( function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement( \"input\" );\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll( \"[name=d]\" ).length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll( \":enabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll( \":disabled\" ).length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: Opera 10 - 11 only\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll( \"*,:x\" );\n\t\t\trbuggyQSA.push( \",.*:\" );\n\t\t} );\n\t}\n\n\tif ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector ) ) ) ) {\n\n\t\tassert( function( el ) {\n\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t} );\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( \"|\" ) );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( \"|\" ) );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t) );\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( ( b = b.parentNode ) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t// two documents; shallow comparisons work.\n\t\t// eslint-disable-next-line eqeqeq\n\t\tcompare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( a == document || a.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, a ) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( b == document || b.ownerDocument == preferredDoc &&\n\t\t\t\tcontains( preferredDoc, b ) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\treturn a == document ? -1 :\n\t\t\t\tb == document ? 1 :\n\t\t\t\t/* eslint-enable eqeqeq */\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( ( cur = cur.parentNode ) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[ i ] === bp[ i ] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[ i ], bp[ i ] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t// two documents; shallow comparisons work.\n\t\t\t/* eslint-disable eqeqeq */\n\t\t\tap[ i ] == preferredDoc ? -1 :\n\t\t\tbp[ i ] == preferredDoc ? 1 :\n\t\t\t/* eslint-enable eqeqeq */\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\tsetDocument( elem );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!nonnativeSelectorCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\n\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t// fragment in IE 9\n\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\tnonnativeSelectorCache( expr, true );\n\t\t}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( context.ownerDocument || context ) != document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\n\t// Set document vars if needed\n\t// Support: IE 11+, Edge 17 - 18+\n\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t// two documents; shallow comparisons work.\n\t// eslint-disable-next-line eqeqeq\n\tif ( ( elem.ownerDocument || elem ) != document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn ( sel + \"\" ).replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( ( elem = results[ i++ ] ) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( ( node = elem[ i++ ] ) ) {\n\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[ 1 ] = match[ 1 ].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[ 3 ] = ( match[ 3 ] || match[ 4 ] ||\n\t\t\t\tmatch[ 5 ] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[ 2 ] === \"~=\" ) {\n\t\t\t\tmatch[ 3 ] = \" \" + match[ 3 ] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[ 1 ] = match[ 1 ].toLowerCase();\n\n\t\t\tif ( match[ 1 ].slice( 0, 3 ) === \"nth\" ) {\n\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[ 3 ] ) {\n\t\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[ 4 ] = +( match[ 4 ] ?\n\t\t\t\t\tmatch[ 5 ] + ( match[ 6 ] || 1 ) :\n\t\t\t\t\t2 * ( match[ 3 ] === \"even\" || match[ 3 ] === \"odd\" ) );\n\t\t\t\tmatch[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === \"odd\" );\n\n\t\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[ 3 ] ) {\n\t\t\t\tSizzle.error( match[ 0 ] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[ 6 ] && match[ 2 ];\n\n\t\t\tif ( matchExpr[ \"CHILD\" ].test( match[ 0 ] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[ 3 ] ) {\n\t\t\t\tmatch[ 2 ] = match[ 4 ] || match[ 5 ] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t( excess = tokenize( unquoted, true ) ) &&\n\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t( excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length ) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[ 0 ] = match[ 0 ].slice( 0, excess );\n\t\t\t\tmatch[ 2 ] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() {\n\t\t\t\t\treturn true;\n\t\t\t\t} :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t( pattern = new RegExp( \"(^|\" + whitespace +\n\t\t\t\t\t\")\" + className + \"(\" + whitespace + \"|$)\" ) ) && classCache(\n\t\t\t\t\t\tclassName, function( elem ) {\n\t\t\t\t\t\t\treturn pattern.test(\n\t\t\t\t\t\t\t\ttypeof elem.className === \"string\" && elem.className ||\n\t\t\t\t\t\t\t\ttypeof elem.getAttribute !== \"undefined\" &&\n\t\t\t\t\t\t\t\t\telem.getAttribute( \"class\" ) ||\n\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t);\n\t\t\t\t} );\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\t/* eslint-disable max-len */\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t\t/* eslint-enable max-len */\n\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, _argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( ( node = node[ dir ] ) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || ( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( ( node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t( diff = nodeIndex = 0 ) || start.pop() ) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( node[ expando ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t( outerCache[ node.uniqueID ] = {} );\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction( function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[ i ] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t} ) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction( function( selector ) {\n\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction( function( seed, matches, _context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\t\t\t\t\tseed[ i ] = !( matches[ i ] = elem );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} ) :\n\t\t\t\tfunction( elem, _context, xml ) {\n\t\t\t\t\tinput[ 0 ] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[ 0 ] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t} ),\n\n\t\t\"has\": markFunction( function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t} ),\n\n\t\t\"contains\": markFunction( function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t} ),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test( lang || \"\" ) ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( ( elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute( \"xml:lang\" ) || elem.getAttribute( \"lang\" ) ) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( ( elem = elem.parentNode ) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t} ),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement &&\n\t\t\t\t( !document.hasFocus || document.hasFocus() ) &&\n\t\t\t\t!!( elem.type || elem.href || ~elem.tabIndex );\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn ( nodeName === \"input\" && !!elem.checked ) ||\n\t\t\t\t( nodeName === \"option\" && !!elem.selected );\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\t// eslint-disable-next-line no-unused-expressions\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[ \"empty\" ]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( ( attr = elem.getAttribute( \"type\" ) ) == null ||\n\t\t\t\t\tattr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo( function() {\n\t\t\treturn [ 0 ];\n\t\t} ),\n\n\t\t\"last\": createPositionalPseudo( function( _matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t} ),\n\n\t\t\"eq\": createPositionalPseudo( function( _matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t} ),\n\n\t\t\"even\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"odd\": createPositionalPseudo( function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"lt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ?\n\t\t\t\targument + length :\n\t\t\t\targument > length ?\n\t\t\t\t\tlength :\n\t\t\t\t\targument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} ),\n\n\t\t\"gt\": createPositionalPseudo( function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t} )\n\t}\n};\n\nExpr.pseudos[ \"nth\" ] = Expr.pseudos[ \"eq\" ];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || ( match = rcomma.exec( soFar ) ) ) {\n\t\t\tif ( match ) {\n\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[ 0 ].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( ( tokens = [] ) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( ( match = rcombinators.exec( soFar ) ) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push( {\n\t\t\t\tvalue: matched,\n\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[ 0 ].replace( rtrim, \" \" )\n\t\t\t} );\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] ||\n\t\t\t\t( match = preFilters[ type ]( match ) ) ) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push( {\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t} );\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[ i ].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( ( elem = elem[ dir ] ) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || ( elem[ expando ] = {} );\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] ||\n\t\t\t\t\t\t\t( outerCache[ elem.uniqueID ] = {} );\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( ( oldCache = uniqueCache[ key ] ) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn ( newCache[ 2 ] = oldCache[ 2 ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[ i ]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[ 0 ];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[ i ], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( elem = unmatched[ i ] ) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction( function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts(\n\t\t\t\tselector || \"*\",\n\t\t\t\tcontext.nodeType ? [ context ] : context,\n\t\t\t\t[]\n\t\t\t),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( ( elem = temp[ i ] ) ) {\n\t\t\t\t\tmatcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) ) {\n\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( ( matcherIn[ i ] = elem ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, ( matcherOut = [] ), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( ( elem = matcherOut[ i ] ) &&\n\t\t\t\t\t\t( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) {\n\n\t\t\t\t\t\tseed[ temp ] = !( results[ temp ] = elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t} );\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[ 0 ].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[ \" \" ],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t( checkContext = context ).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) {\n\t\t\tmatchers = [ addCombinator( elementMatcher( matchers ), matcher ) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[ j ].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\n\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\ttokens\n\t\t\t\t\t\t.slice( 0, i - 1 )\n\t\t\t\t\t\t.concat( { value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" } )\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[ \"TAG\" ]( \"*\", outermost ),\n\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\n\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\toutermostContext = context == document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\n\t\t\t\t\t// Support: IE 11+, Edge 17 - 18+\n\t\t\t\t\t// IE/Edge sometimes throw a \"Permission denied\" error when strict-comparing\n\t\t\t\t\t// two documents; shallow comparisons work.\n\t\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\t\tif ( !context && elem.ownerDocument != document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( ( matcher = elementMatchers[ j++ ] ) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml ) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( ( elem = !matcher && elem ) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( ( matcher = setMatchers[ j++ ] ) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !( unmatched[ i ] || setMatched[ i ] ) ) {\n\t\t\t\t\t\t\t\tsetMatched[ i ] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[ i ] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache(\n\t\t\tselector,\n\t\t\tmatcherFromGroupMatchers( elementMatchers, setMatchers )\n\t\t);\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( ( selector = compiled.selector || selector ) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[ 0 ] = match[ 0 ].slice( 0 );\n\t\tif ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === \"ID\" &&\n\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) {\n\n\t\t\tcontext = ( Expr.find[ \"ID\" ]( token.matches[ 0 ]\n\t\t\t\t.replace( runescape, funescape ), context ) || [] )[ 0 ];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[ \"needsContext\" ].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[ i ];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ ( type = token.type ) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( ( find = Expr.find[ type ] ) ) {\n\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( ( seed = find(\n\t\t\t\t\ttoken.matches[ 0 ].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext\n\t\t\t\t) ) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split( \"\" ).sort( sortOrder ).join( \"\" ) === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert( function( el ) {\n\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement( \"fieldset\" ) ) & 1;\n} );\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert( function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute( \"href\" ) === \"#\";\n} ) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert( function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n} ) ) {\n\taddHandle( \"value\", function( elem, _name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t} );\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert( function( el ) {\n\treturn el.getAttribute( \"disabled\" ) == null;\n} ) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t( val = elem.getAttributeNode( name ) ) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\t\tnull;\n\t\t}\n\t} );\n}\n\nreturn Sizzle;\n\n} )( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, _i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\tif ( elem.contentDocument != null &&\n\n\t\t\t// Support: IE 11+\n\t\t\t// <object> elements with no `data` attribute has an object\n\t\t\t// `contentDocument` with a `null` prototype.\n\t\t\tgetProto( elem.contentDocument ) ) {\n\n\t\t\treturn elem.contentDocument;\n\t\t}\n\n\t\t// Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n\t\t// Treat the template element as a regular one in browsers that\n\t\t// don't support it.\n\t\tif ( nodeName( elem, \"template\" ) ) {\n\t\t\telem = elem.content || elem;\n\t\t}\n\n\t\treturn jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( _i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, _key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( _all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar documentElement = document.documentElement;\n\n\n\n\tvar isAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem );\n\t\t},\n\t\tcomposed = { composed: true };\n\n\t// Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only\n\t// Check attachment across shadow DOM boundaries when possible (gh-3504)\n\t// Support: iOS 10.0-10.2 only\n\t// Early iOS 10 versions support `attachShadow` but not `getRootNode`,\n\t// leading to errors. We need to check for `getRootNode`.\n\tif ( documentElement.getRootNode ) {\n\t\tisAttached = function( elem ) {\n\t\t\treturn jQuery.contains( elem.ownerDocument, elem ) ||\n\t\t\t\telem.getRootNode( composed ) === elem.ownerDocument;\n\t\t};\n\t}\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tisAttached( elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = elem.nodeType &&\n\t\t\t( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n\n\t// Support: IE <=9 only\n\t// IE <=9 replaces <option> tags with their contents when inserted outside of\n\t// the select element.\n\tdiv.innerHTML = \"<option></option>\";\n\tsupport.option = !!div.lastChild;\n} )();\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n// Support: IE <=9 only\nif ( !support.option ) {\n\twrapMap.optgroup = wrapMap.option = [ 1, \"<select multiple='multiple'>\", \"</select>\" ];\n}\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, attached, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tattached = isAttached( elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( attached ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 - 11+\n// focus() and blur() are asynchronous, except when they are no-op.\n// So expect focus to be synchronous when the element is already active,\n// and blur to be synchronous when the element is not already active.\n// (focus and blur are always synchronous in other supported browsers,\n// this just defines when we can count on it).\nfunction expectSync( elem, type ) {\n\treturn ( elem === safeActiveElement() ) === ( type === \"focus\" );\n}\n\n// Support: IE <=9 only\n// Accessing document.activeElement can throw unexpectedly\n// https://bugs.jquery.com/ticket/13393\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Only attach events to objects that accept data\n\t\tif ( !acceptData( elem ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = Object.create( null );\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\n\t\t\t// Make a writable jQuery.Event from the native event object\n\t\t\tevent = jQuery.event.fix( nativeEvent ),\n\n\t\t\thandlers = (\n\t\t\t\t\tdataPriv.get( this, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// If the event is namespaced, then each handler is only invoked if it is\n\t\t\t\t// specially universal or its namespaces are a superset of the event's.\n\t\t\t\tif ( !event.rnamespace || handleObj.namespace === false ||\n\t\t\t\t\tevent.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tclick: {\n\n\t\t\t// Utilize native event to ensure correct state for checkable inputs\n\t\t\tsetup: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Claim the first handler\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\t// dataPriv.set( el, \"click\", ... )\n\t\t\t\t\tleverageNative( el, \"click\", returnTrue );\n\t\t\t\t}\n\n\t\t\t\t// Return false to allow normal processing in the caller\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\ttrigger: function( data ) {\n\n\t\t\t\t// For mutual compressibility with _default, replace `this` access with a local var.\n\t\t\t\t// `|| data` is dead code meant only to preserve the variable through minification.\n\t\t\t\tvar el = this || data;\n\n\t\t\t\t// Force setup before triggering a click\n\t\t\t\tif ( rcheckableType.test( el.type ) &&\n\t\t\t\t\tel.click && nodeName( el, \"input\" ) ) {\n\n\t\t\t\t\tleverageNative( el, \"click\" );\n\t\t\t\t}\n\n\t\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, suppress native .click() on links\n\t\t\t// Also prevent it if we're currently inside a leveraged native-event stack\n\t\t\t_default: function( event ) {\n\t\t\t\tvar target = event.target;\n\t\t\t\treturn rcheckableType.test( target.type ) &&\n\t\t\t\t\ttarget.click && nodeName( target, \"input\" ) &&\n\t\t\t\t\tdataPriv.get( target, \"click\" ) ||\n\t\t\t\t\tnodeName( target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Ensure the presence of an event listener that handles manually-triggered\n// synthetic events by interrupting progress until reinvoked in response to\n// *native* events that it fires directly, ensuring that state changes have\n// already occurred before other listeners are invoked.\nfunction leverageNative( el, type, expectSync ) {\n\n\t// Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add\n\tif ( !expectSync ) {\n\t\tif ( dataPriv.get( el, type ) === undefined ) {\n\t\t\tjQuery.event.add( el, type, returnTrue );\n\t\t}\n\t\treturn;\n\t}\n\n\t// Register the controller as a special universal handler for all event namespaces\n\tdataPriv.set( el, type, false );\n\tjQuery.event.add( el, type, {\n\t\tnamespace: false,\n\t\thandler: function( event ) {\n\t\t\tvar notAsync, result,\n\t\t\t\tsaved = dataPriv.get( this, type );\n\n\t\t\tif ( ( event.isTrigger & 1 ) && this[ type ] ) {\n\n\t\t\t\t// Interrupt processing of the outer synthetic .trigger()ed event\n\t\t\t\t// Saved data should be false in such cases, but might be a leftover capture object\n\t\t\t\t// from an async native handler (gh-4350)\n\t\t\t\tif ( !saved.length ) {\n\n\t\t\t\t\t// Store arguments for use when handling the inner native event\n\t\t\t\t\t// There will always be at least one argument (an event object), so this array\n\t\t\t\t\t// will not be confused with a leftover capture object.\n\t\t\t\t\tsaved = slice.call( arguments );\n\t\t\t\t\tdataPriv.set( this, type, saved );\n\n\t\t\t\t\t// Trigger the native event and capture its result\n\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t// focus() and blur() are asynchronous\n\t\t\t\t\tnotAsync = expectSync( this, type );\n\t\t\t\t\tthis[ type ]();\n\t\t\t\t\tresult = dataPriv.get( this, type );\n\t\t\t\t\tif ( saved !== result || notAsync ) {\n\t\t\t\t\t\tdataPriv.set( this, type, false );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = {};\n\t\t\t\t\t}\n\t\t\t\t\tif ( saved !== result ) {\n\n\t\t\t\t\t\t// Cancel the outer synthetic event\n\t\t\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\treturn result.value;\n\t\t\t\t\t}\n\n\t\t\t\t// If this is an inner synthetic event for an event with a bubbling surrogate\n\t\t\t\t// (focus or blur), assume that the surrogate already propagated from triggering the\n\t\t\t\t// native event and prevent that from happening again here.\n\t\t\t\t// This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the\n\t\t\t\t// bubbling surrogate propagates *after* the non-bubbling base), but that seems\n\t\t\t\t// less bad than duplication.\n\t\t\t\t} else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t}\n\n\t\t\t// If this is a native event triggered above, everything is now in order\n\t\t\t// Fire an inner synthetic event with the original arguments\n\t\t\t} else if ( saved.length ) {\n\n\t\t\t\t// ...and capture the result\n\t\t\t\tdataPriv.set( this, type, {\n\t\t\t\t\tvalue: jQuery.event.trigger(\n\n\t\t\t\t\t\t// Support: IE <=9 - 11+\n\t\t\t\t\t\t// Extend with the prototype to reset the above stopImmediatePropagation()\n\t\t\t\t\t\tjQuery.extend( saved[ 0 ], jQuery.Event.prototype ),\n\t\t\t\t\t\tsaved.slice( 1 ),\n\t\t\t\t\t\tthis\n\t\t\t\t\t)\n\t\t\t\t} );\n\n\t\t\t\t// Abort handling of the native event\n\t\t\t\tevent.stopImmediatePropagation();\n\t\t\t}\n\t\t}\n\t} );\n}\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcode: true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\njQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( type, delegateType ) {\n\tjQuery.event.special[ type ] = {\n\n\t\t// Utilize native event if possible so blur/focus sequence is correct\n\t\tsetup: function() {\n\n\t\t\t// Claim the first handler\n\t\t\t// dataPriv.set( this, \"focus\", ... )\n\t\t\t// dataPriv.set( this, \"blur\", ... )\n\t\t\tleverageNative( this, type, expectSync );\n\n\t\t\t// Return false to allow normal processing in the caller\n\t\t\treturn false;\n\t\t},\n\t\ttrigger: function() {\n\n\t\t\t// Force setup before trigger\n\t\t\tleverageNative( this, type );\n\n\t\t\t// Return non-false to allow normal event-path propagation\n\t\t\treturn true;\n\t\t},\n\n\t\tdelegateType: delegateType\n\t};\n} );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.get( src );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdataPriv.remove( dest, \"handle events\" );\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = flat( args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl && !node.noModule ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src, {\n\t\t\t\t\t\t\t\t\tnonce: node.nonce || node.getAttribute( \"nonce\" )\n\t\t\t\t\t\t\t\t}, doc );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), node, doc );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && isAttached( node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html;\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = isAttached( elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar swap = function( elem, options, callback ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.call( elem );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\t// Support: Chrome <=64\n\t\t// Don't get tricked when zoom affects offsetWidth (gh-4029)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12;\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableTrDimensionsVal, reliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t},\n\n\t\t// Support: IE 9 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Behavior in IE 9 is more subtle than in newer versions & it passes\n\t\t// some versions of this test; make sure not to make it pass there!\n\t\treliableTrDimensions: function() {\n\t\t\tvar table, tr, trChild, trStyle;\n\t\t\tif ( reliableTrDimensionsVal == null ) {\n\t\t\t\ttable = document.createElement( \"table\" );\n\t\t\t\ttr = document.createElement( \"tr\" );\n\t\t\t\ttrChild = document.createElement( \"div\" );\n\n\t\t\t\ttable.style.cssText = \"position:absolute;left:-11111px\";\n\t\t\t\ttr.style.height = \"1px\";\n\t\t\t\ttrChild.style.height = \"9px\";\n\n\t\t\t\tdocumentElement\n\t\t\t\t\t.appendChild( table )\n\t\t\t\t\t.appendChild( tr )\n\t\t\t\t\t.appendChild( trChild );\n\n\t\t\t\ttrStyle = window.getComputedStyle( tr );\n\t\t\t\treliableTrDimensionsVal = parseInt( trStyle.height ) > 3;\n\n\t\t\t\tdocumentElement.removeChild( table );\n\t\t\t}\n\t\t\treturn reliableTrDimensionsVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !isAttached( elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar cssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style,\n\tvendorProps = {};\n\n// Return a vendor-prefixed property or undefined\nfunction vendorPropName( name ) {\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a potentially-mapped jQuery.cssProps or vendor prefixed property\nfunction finalPropName( name ) {\n\tvar final = jQuery.cssProps[ name ] || vendorProps[ name ];\n\n\tif ( final ) {\n\t\treturn final;\n\t}\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\treturn vendorProps[ name ] = vendorPropName( name ) || name;\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t};\n\nfunction setPositiveNumber( _elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\n\t\t// If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter\n\t\t// Use an explicit zero to avoid NaN (gh-3964)\n\t\t) ) || 0;\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\n\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322).\n\t\t// Fake content-box until we know it's needed to know the true value.\n\t\tboxSizingNeeded = !support.boxSizingReliable() || extra,\n\t\tisBorderBox = boxSizingNeeded &&\n\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox,\n\n\t\tval = curCSS( elem, dimension, styles ),\n\t\toffsetProp = \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 );\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\n\t// Support: IE 9 - 11 only\n\t// Use offsetWidth/offsetHeight for when box sizing is unreliable.\n\t// In those cases, the computed value can be trusted to be border-box.\n\tif ( ( !support.boxSizingReliable() && isBorderBox ||\n\n\t\t// Support: IE 10 - 11+, Edge 15 - 18+\n\t\t// IE/Edge misreport `getComputedStyle` of table rows with width/height\n\t\t// set in CSS while `offset*` properties report correct values.\n\t\t// Interestingly, in some cases IE 9 doesn't suffer from this issue.\n\t\t!support.reliableTrDimensions() && nodeName( elem, \"tr\" ) ||\n\n\t\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t\t// This happens for inline elements with no explicit setting (gh-3571)\n\t\tval === \"auto\" ||\n\n\t\t// Support: Android <=4.1 - 4.3 only\n\t\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) &&\n\n\t\t// Make sure the element is visible & connected\n\t\telem.getClientRects().length ) {\n\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\n\n\t\t// Where available, offsetWidth/offsetHeight approximate border box dimensions.\n\t\t// Where not available (e.g., SVG), assume unreliable box-sizing and interpret the\n\t\t// retrieved value as a content box dimension.\n\t\tvalueIsBorderBox = offsetProp in elem;\n\t\tif ( valueIsBorderBox ) {\n\t\t\tval = elem[ offsetProp ];\n\t\t}\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"gridArea\": true,\n\t\t\"gridColumn\": true,\n\t\t\"gridColumnEnd\": true,\n\t\t\"gridColumnStart\": true,\n\t\t\"gridRow\": true,\n\t\t\"gridRowEnd\": true,\n\t\t\"gridRowStart\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\t// The isCustomProp check can be removed in jQuery 4.0 when we only auto-append\n\t\t\t// \"px\" to a few hardcoded values.\n\t\t\tif ( type === \"number\" && !isCustomProp ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( _i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\n\t\t\t\t// Only read styles.position if the test has a chance to fail\n\t\t\t\t// to avoid forcing a reflow.\n\t\t\t\tscrollboxSizeBuggy = !support.scrollboxSize() &&\n\t\t\t\t\tstyles.position === \"absolute\",\n\n\t\t\t\t// To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991)\n\t\t\t\tboxSizingNeeded = scrollboxSizeBuggy || extra,\n\t\t\t\tisBorderBox = boxSizingNeeded &&\n\t\t\t\t\tjQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra ?\n\t\t\t\t\tboxModelAdjustment(\n\t\t\t\t\t\telem,\n\t\t\t\t\t\tdimension,\n\t\t\t\t\t\textra,\n\t\t\t\t\t\tisBorderBox,\n\t\t\t\t\t\tstyles\n\t\t\t\t\t) :\n\t\t\t\t\t0;\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && scrollboxSizeBuggy ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 && (\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ||\n\t\t\t\t\ttween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( _i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( _i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = (\n\t\t\t\t\tdataPriv.get( cur, \"events\" ) || Object.create( null )\n\t\t\t\t)[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\n\t\t\t\t// Handle: regular nodes (via `this.ownerDocument`), window\n\t\t\t\t// (via `this.document`) & document (via `this`).\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this.document || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = { guid: Date.now() };\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\tif ( a == null ) {\n\t\treturn \"\";\n\t}\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( _i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() + \" \" ] =\n\t\t\t\t\t\t\t\t\t( responseHeaders[ match[ 1 ].toLowerCase() + \" \" ] || [] )\n\t\t\t\t\t\t\t\t\t\t.concat( match[ 2 ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() + \" \" ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match.join( \", \" );\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce.guid++ ) +\n\t\t\t\t\tuncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Use a noop converter for missing script\n\t\t\tif ( !isSuccess && jQuery.inArray( \"script\", s.dataTypes ) > -1 ) {\n\t\t\t\ts.converters[ \"text script\" ] = function() {};\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( _i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\njQuery.ajaxPrefilter( function( s ) {\n\tvar i;\n\tfor ( i in s.headers ) {\n\t\tif ( i.toLowerCase() === \"content-type\" ) {\n\t\t\ts.contentType = s.headers[ i ] || \"\";\n\t\t}\n\t}\n} );\n\n\njQuery._evalUrl = function( url, options, doc ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\n\t\t// Only evaluate the response if it is successful (gh-4126)\n\t\t// dataFilter is not invoked for failure responses, so using it instead\n\t\t// of the default converter is kludgy but it works.\n\t\tconverters: {\n\t\t\t\"text script\": function() {}\n\t\t},\n\t\tdataFilter: function( response ) {\n\t\t\tjQuery.globalEval( response, options, doc );\n\t\t}\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain or forced-by-attrs requests\n\tif ( s.crossDomain || s.scriptAttrs ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" )\n\t\t\t\t\t.attr( s.scriptAttrs || {} )\n\t\t\t\t\t.prop( { charset: s.scriptCharset, src: s.url } )\n\t\t\t\t\t.on( \"load error\", callback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce.guid++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tif ( typeof props.top === \"number\" ) {\n\t\t\t\tprops.top += \"px\";\n\t\t\t}\n\t\t\tif ( typeof props.left === \"number\" ) {\n\t\t\t\tprops.left += \"px\";\n\t\t\t}\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( _i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( _i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t},\n\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( _i, name ) {\n\n\t\t// Handle event binding\n\t\tjQuery.fn[ name ] = function( data, fn ) {\n\t\t\treturn arguments.length > 0 ?\n\t\t\t\tthis.on( name, null, data, fn ) :\n\t\t\t\tthis.trigger( name );\n\t\t};\n\t} );\n\n\n\n\n// Support: Android <=4.0 only\n// Make sure we trim BOM and NBSP\nvar rtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\njQuery.trim = function( text ) {\n\treturn text == null ?\n\t\t\"\" :\n\t\t( text + \"\" ).replace( rtrim, \"\" );\n};\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( typeof noGlobal === \"undefined\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/jquery-validation/LICENSE.md",
    "content": "The MIT License (MIT)\n=====================\n\nCopyright Jörn Zaefferer\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/jquery-validation/dist/additional-methods.js",
    "content": "/*!\n * jQuery Validation Plugin v1.17.0\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2017 Jörn Zaefferer\n * Released under the MIT license\n */\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( [\"jquery\", \"./jquery.validate\"], factory );\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t} else {\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n( function() {\n\n\tfunction stripHtml( value ) {\n\n\t\t// Remove html tags and space chars\n\t\treturn value.replace( /<.[^<>]*?>/g, \" \" ).replace( /&nbsp;|&#160;/gi, \" \" )\n\n\t\t// Remove punctuation\n\t\t.replace( /[.(),;:!?%#$'\\\"_+=\\/\\-“”’]*/g, \"\" );\n\t}\n\n\t$.validator.addMethod( \"maxWords\", function( value, element, params ) {\n\t\treturn this.optional( element ) || stripHtml( value ).match( /\\b\\w+\\b/g ).length <= params;\n\t}, $.validator.format( \"Please enter {0} words or less.\" ) );\n\n\t$.validator.addMethod( \"minWords\", function( value, element, params ) {\n\t\treturn this.optional( element ) || stripHtml( value ).match( /\\b\\w+\\b/g ).length >= params;\n\t}, $.validator.format( \"Please enter at least {0} words.\" ) );\n\n\t$.validator.addMethod( \"rangeWords\", function( value, element, params ) {\n\t\tvar valueStripped = stripHtml( value ),\n\t\t\tregex = /\\b\\w+\\b/g;\n\t\treturn this.optional( element ) || valueStripped.match( regex ).length >= params[ 0 ] && valueStripped.match( regex ).length <= params[ 1 ];\n\t}, $.validator.format( \"Please enter between {0} and {1} words.\" ) );\n\n}() );\n\n// Accept a value from a file input based on a required mimetype\n$.validator.addMethod( \"accept\", function( value, element, param ) {\n\n\t// Split mime on commas in case we have multiple types we can accept\n\tvar typeParam = typeof param === \"string\" ? param.replace( /\\s/g, \"\" ) : \"image/*\",\n\t\toptionalValue = this.optional( element ),\n\t\ti, file, regex;\n\n\t// Element is optional\n\tif ( optionalValue ) {\n\t\treturn optionalValue;\n\t}\n\n\tif ( $( element ).attr( \"type\" ) === \"file\" ) {\n\n\t\t// Escape string to be used in the regex\n\t\t// see: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex\n\t\t// Escape also \"/*\" as \"/.*\" as a wildcard\n\t\ttypeParam = typeParam\n\t\t\t\t.replace( /[\\-\\[\\]\\/\\{\\}\\(\\)\\+\\?\\.\\\\\\^\\$\\|]/g, \"\\\\$&\" )\n\t\t\t\t.replace( /,/g, \"|\" )\n\t\t\t\t.replace( /\\/\\*/g, \"/.*\" );\n\n\t\t// Check if the element has a FileList before checking each file\n\t\tif ( element.files && element.files.length ) {\n\t\t\tregex = new RegExp( \".?(\" + typeParam + \")$\", \"i\" );\n\t\t\tfor ( i = 0; i < element.files.length; i++ ) {\n\t\t\t\tfile = element.files[ i ];\n\n\t\t\t\t// Grab the mimetype from the loaded file, verify it matches\n\t\t\t\tif ( !file.type.match( regex ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Either return true because we've validated each file, or because the\n\t// browser does not support element.files and the FileList feature\n\treturn true;\n}, $.validator.format( \"Please enter a value with a valid mimetype.\" ) );\n\n$.validator.addMethod( \"alphanumeric\", function( value, element ) {\n\treturn this.optional( element ) || /^\\w+$/i.test( value );\n}, \"Letters, numbers, and underscores only please\" );\n\n/*\n * Dutch bank account numbers (not 'giro' numbers) have 9 digits\n * and pass the '11 check'.\n * We accept the notation with spaces, as that is common.\n * acceptable: 123456789 or 12 34 56 789\n */\n$.validator.addMethod( \"bankaccountNL\", function( value, element ) {\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\tif ( !( /^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test( value ) ) ) {\n\t\treturn false;\n\t}\n\n\t// Now '11 check'\n\tvar account = value.replace( / /g, \"\" ), // Remove spaces\n\t\tsum = 0,\n\t\tlen = account.length,\n\t\tpos, factor, digit;\n\tfor ( pos = 0; pos < len; pos++ ) {\n\t\tfactor = len - pos;\n\t\tdigit = account.substring( pos, pos + 1 );\n\t\tsum = sum + factor * digit;\n\t}\n\treturn sum % 11 === 0;\n}, \"Please specify a valid bank account number\" );\n\n$.validator.addMethod( \"bankorgiroaccountNL\", function( value, element ) {\n\treturn this.optional( element ) ||\n\t\t\t( $.validator.methods.bankaccountNL.call( this, value, element ) ) ||\n\t\t\t( $.validator.methods.giroaccountNL.call( this, value, element ) );\n}, \"Please specify a valid bank or giro account number\" );\n\n/**\n * BIC is the business identifier code (ISO 9362). This BIC check is not a guarantee for authenticity.\n *\n * BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional)\n *\n * Validation is case-insensitive. Please make sure to normalize input yourself.\n *\n * BIC definition in detail:\n * - First 4 characters - bank code (only letters)\n * - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters)\n * - Next 2 characters - location code (letters and digits)\n *   a. shall not start with '0' or '1'\n *   b. second character must be a letter ('O' is not allowed) or digit ('0' for test (therefore not allowed), '1' denoting passive participant, '2' typically reverse-billing)\n * - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits)\n */\n$.validator.addMethod( \"bic\", function( value, element ) {\n    return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value.toUpperCase() );\n}, \"Please specify a valid BIC code\" );\n\n/*\n * Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities\n * Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal\n *\n * Spanish CIF structure:\n *\n * [ T ][ P ][ P ][ N ][ N ][ N ][ N ][ N ][ C ]\n *\n * Where:\n *\n * T: 1 character. Kind of Organization Letter: [ABCDEFGHJKLMNPQRSUVW]\n * P: 2 characters. Province.\n * N: 5 characters. Secuencial Number within the province.\n * C: 1 character. Control Digit: [0-9A-J].\n *\n * [ T ]: Kind of Organizations. Possible values:\n *\n *   A. Corporations\n *   B. LLCs\n *   C. General partnerships\n *   D. Companies limited partnerships\n *   E. Communities of goods\n *   F. Cooperative Societies\n *   G. Associations\n *   H. Communities of homeowners in horizontal property regime\n *   J. Civil Societies\n *   K. Old format\n *   L. Old format\n *   M. Old format\n *   N. Nonresident entities\n *   P. Local authorities\n *   Q. Autonomous bodies, state or not, and the like, and congregations and religious institutions\n *   R. Congregations and religious institutions (since 2008 ORDER EHA/451/2008)\n *   S. Organs of State Administration and regions\n *   V. Agrarian Transformation\n *   W. Permanent establishments of non-resident in Spain\n *\n * [ C ]: Control Digit. It can be a number or a letter depending on T value:\n * [ T ]  -->  [ C ]\n * ------    ----------\n *   A         Number\n *   B         Number\n *   E         Number\n *   H         Number\n *   K         Letter\n *   P         Letter\n *   Q         Letter\n *   S         Letter\n *\n */\n$.validator.addMethod( \"cifES\", function( value, element ) {\n\t\"use strict\";\n\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\n\tvar cifRegEx = new RegExp( /^([ABCDEFGHJKLMNPQRSUVW])(\\d{7})([0-9A-J])$/gi );\n\tvar letter  = value.substring( 0, 1 ), // [ T ]\n\t\tnumber  = value.substring( 1, 8 ), // [ P ][ P ][ N ][ N ][ N ][ N ][ N ]\n\t\tcontrol = value.substring( 8, 9 ), // [ C ]\n\t\tall_sum = 0,\n\t\teven_sum = 0,\n\t\todd_sum = 0,\n\t\ti, n,\n\t\tcontrol_digit,\n\t\tcontrol_letter;\n\n\tfunction isOdd( n ) {\n\t\treturn n % 2 === 0;\n\t}\n\n\t// Quick format test\n\tif ( value.length !== 9 || !cifRegEx.test( value ) ) {\n\t\treturn false;\n\t}\n\n\tfor ( i = 0; i < number.length; i++ ) {\n\t\tn = parseInt( number[ i ], 10 );\n\n\t\t// Odd positions\n\t\tif ( isOdd( i ) ) {\n\n\t\t\t// Odd positions are multiplied first.\n\t\t\tn *= 2;\n\n\t\t\t// If the multiplication is bigger than 10 we need to adjust\n\t\t\todd_sum += n < 10 ? n : n - 9;\n\n\t\t// Even positions\n\t\t// Just sum them\n\t\t} else {\n\t\t\teven_sum += n;\n\t\t}\n\t}\n\n\tall_sum = even_sum + odd_sum;\n\tcontrol_digit = ( 10 - ( all_sum ).toString().substr( -1 ) ).toString();\n\tcontrol_digit = parseInt( control_digit, 10 ) > 9 ? \"0\" : control_digit;\n\tcontrol_letter = \"JABCDEFGHI\".substr( control_digit, 1 ).toString();\n\n\t// Control must be a digit\n\tif ( letter.match( /[ABEH]/ ) ) {\n\t\treturn control === control_digit;\n\n\t// Control must be a letter\n\t} else if ( letter.match( /[KPQS]/ ) ) {\n\t\treturn control === control_letter;\n\t}\n\n\t// Can be either\n\treturn control === control_digit || control === control_letter;\n\n}, \"Please specify a valid CIF number.\" );\n\n/*\n * Brazillian CPF number (Cadastrado de Pessoas Físicas) is the equivalent of a Brazilian tax registration number.\n * CPF numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.\n */\n$.validator.addMethod( \"cpfBR\", function( value ) {\n\n\t// Removing special characters from value\n\tvalue = value.replace( /([~!@#$%^&*()_+=`{}\\[\\]\\-|\\\\:;'<>,.\\/? ])+/g, \"\" );\n\n\t// Checking value to have 11 digits only\n\tif ( value.length !== 11 ) {\n\t\treturn false;\n\t}\n\n\tvar sum = 0,\n\t\tfirstCN, secondCN, checkResult, i;\n\n\tfirstCN = parseInt( value.substring( 9, 10 ), 10 );\n\tsecondCN = parseInt( value.substring( 10, 11 ), 10 );\n\n\tcheckResult = function( sum, cn ) {\n\t\tvar result = ( sum * 10 ) % 11;\n\t\tif ( ( result === 10 ) || ( result === 11 ) ) {\n\t\t\tresult = 0;\n\t\t}\n\t\treturn ( result === cn );\n\t};\n\n\t// Checking for dump data\n\tif ( value === \"\" ||\n\t\tvalue === \"00000000000\" ||\n\t\tvalue === \"11111111111\" ||\n\t\tvalue === \"22222222222\" ||\n\t\tvalue === \"33333333333\" ||\n\t\tvalue === \"44444444444\" ||\n\t\tvalue === \"55555555555\" ||\n\t\tvalue === \"66666666666\" ||\n\t\tvalue === \"77777777777\" ||\n\t\tvalue === \"88888888888\" ||\n\t\tvalue === \"99999999999\"\n\t) {\n\t\treturn false;\n\t}\n\n\t// Step 1 - using first Check Number:\n\tfor ( i = 1; i <= 9; i++ ) {\n\t\tsum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 11 - i );\n\t}\n\n\t// If first Check Number (CN) is valid, move to Step 2 - using second Check Number:\n\tif ( checkResult( sum, firstCN ) ) {\n\t\tsum = 0;\n\t\tfor ( i = 1; i <= 10; i++ ) {\n\t\t\tsum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 12 - i );\n\t\t}\n\t\treturn checkResult( sum, secondCN );\n\t}\n\treturn false;\n\n}, \"Please specify a valid CPF number\" );\n\n// https://jqueryvalidation.org/creditcard-method/\n// based on https://en.wikipedia.org/wiki/Luhn_algorithm\n$.validator.addMethod( \"creditcard\", function( value, element ) {\n\tif ( this.optional( element ) ) {\n\t\treturn \"dependency-mismatch\";\n\t}\n\n\t// Accept only spaces, digits and dashes\n\tif ( /[^0-9 \\-]+/.test( value ) ) {\n\t\treturn false;\n\t}\n\n\tvar nCheck = 0,\n\t\tnDigit = 0,\n\t\tbEven = false,\n\t\tn, cDigit;\n\n\tvalue = value.replace( /\\D/g, \"\" );\n\n\t// Basing min and max length on\n\t// https://developer.ean.com/general_info/Valid_Credit_Card_Types\n\tif ( value.length < 13 || value.length > 19 ) {\n\t\treturn false;\n\t}\n\n\tfor ( n = value.length - 1; n >= 0; n-- ) {\n\t\tcDigit = value.charAt( n );\n\t\tnDigit = parseInt( cDigit, 10 );\n\t\tif ( bEven ) {\n\t\t\tif ( ( nDigit *= 2 ) > 9 ) {\n\t\t\t\tnDigit -= 9;\n\t\t\t}\n\t\t}\n\n\t\tnCheck += nDigit;\n\t\tbEven = !bEven;\n\t}\n\n\treturn ( nCheck % 10 ) === 0;\n}, \"Please enter a valid credit card number.\" );\n\n/* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator\n * Redistributed under the the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0\n * Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)\n */\n$.validator.addMethod( \"creditcardtypes\", function( value, element, param ) {\n\tif ( /[^0-9\\-]+/.test( value ) ) {\n\t\treturn false;\n\t}\n\n\tvalue = value.replace( /\\D/g, \"\" );\n\n\tvar validTypes = 0x0000;\n\n\tif ( param.mastercard ) {\n\t\tvalidTypes |= 0x0001;\n\t}\n\tif ( param.visa ) {\n\t\tvalidTypes |= 0x0002;\n\t}\n\tif ( param.amex ) {\n\t\tvalidTypes |= 0x0004;\n\t}\n\tif ( param.dinersclub ) {\n\t\tvalidTypes |= 0x0008;\n\t}\n\tif ( param.enroute ) {\n\t\tvalidTypes |= 0x0010;\n\t}\n\tif ( param.discover ) {\n\t\tvalidTypes |= 0x0020;\n\t}\n\tif ( param.jcb ) {\n\t\tvalidTypes |= 0x0040;\n\t}\n\tif ( param.unknown ) {\n\t\tvalidTypes |= 0x0080;\n\t}\n\tif ( param.all ) {\n\t\tvalidTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;\n\t}\n\tif ( validTypes & 0x0001 && /^(5[12345])/.test( value ) ) { // Mastercard\n\t\treturn value.length === 16;\n\t}\n\tif ( validTypes & 0x0002 && /^(4)/.test( value ) ) { // Visa\n\t\treturn value.length === 16;\n\t}\n\tif ( validTypes & 0x0004 && /^(3[47])/.test( value ) ) { // Amex\n\t\treturn value.length === 15;\n\t}\n\tif ( validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test( value ) ) { // Dinersclub\n\t\treturn value.length === 14;\n\t}\n\tif ( validTypes & 0x0010 && /^(2(014|149))/.test( value ) ) { // Enroute\n\t\treturn value.length === 15;\n\t}\n\tif ( validTypes & 0x0020 && /^(6011)/.test( value ) ) { // Discover\n\t\treturn value.length === 16;\n\t}\n\tif ( validTypes & 0x0040 && /^(3)/.test( value ) ) { // Jcb\n\t\treturn value.length === 16;\n\t}\n\tif ( validTypes & 0x0040 && /^(2131|1800)/.test( value ) ) { // Jcb\n\t\treturn value.length === 15;\n\t}\n\tif ( validTypes & 0x0080 ) { // Unknown\n\t\treturn true;\n\t}\n\treturn false;\n}, \"Please enter a valid credit card number.\" );\n\n/**\n * Validates currencies with any given symbols by @jameslouiz\n * Symbols can be optional or required. Symbols required by default\n *\n * Usage examples:\n *  currency: [\"£\", false] - Use false for soft currency validation\n *  currency: [\"$\", false]\n *  currency: [\"RM\", false] - also works with text based symbols such as \"RM\" - Malaysia Ringgit etc\n *\n *  <input class=\"currencyInput\" name=\"currencyInput\">\n *\n * Soft symbol checking\n *  currencyInput: {\n *     currency: [\"$\", false]\n *  }\n *\n * Strict symbol checking (default)\n *  currencyInput: {\n *     currency: \"$\"\n *     //OR\n *     currency: [\"$\", true]\n *  }\n *\n * Multiple Symbols\n *  currencyInput: {\n *     currency: \"$,£,¢\"\n *  }\n */\n$.validator.addMethod( \"currency\", function( value, element, param ) {\n    var isParamString = typeof param === \"string\",\n        symbol = isParamString ? param : param[ 0 ],\n        soft = isParamString ? true : param[ 1 ],\n        regex;\n\n    symbol = symbol.replace( /,/g, \"\" );\n    symbol = soft ? symbol + \"]\" : symbol + \"]?\";\n    regex = \"^[\" + symbol + \"([1-9]{1}[0-9]{0,2}(\\\\,[0-9]{3})*(\\\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\\\.[0-9]{0,2})?|0(\\\\.[0-9]{0,2})?|(\\\\.[0-9]{1,2})?)$\";\n    regex = new RegExp( regex );\n    return this.optional( element ) || regex.test( value );\n\n}, \"Please specify a valid currency\" );\n\n$.validator.addMethod( \"dateFA\", function( value, element ) {\n\treturn this.optional( element ) || /^[1-4]\\d{3}\\/((0?[1-6]\\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\\/(30|([1-2][0-9])|(0?[1-9]))))$/.test( value );\n}, $.validator.messages.date );\n\n/**\n * Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.\n *\n * @example $.validator.methods.date(\"01/01/1900\")\n * @result true\n *\n * @example $.validator.methods.date(\"01/13/1990\")\n * @result false\n *\n * @example $.validator.methods.date(\"01.01.1900\")\n * @result false\n *\n * @example <input name=\"pippo\" class=\"{dateITA:true}\" />\n * @desc Declares an optional input element whose value must be a valid date.\n *\n * @name $.validator.methods.dateITA\n * @type Boolean\n * @cat Plugins/Validate/Methods\n */\n$.validator.addMethod( \"dateITA\", function( value, element ) {\n\tvar check = false,\n\t\tre = /^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/,\n\t\tadata, gg, mm, aaaa, xdata;\n\tif ( re.test( value ) ) {\n\t\tadata = value.split( \"/\" );\n\t\tgg = parseInt( adata[ 0 ], 10 );\n\t\tmm = parseInt( adata[ 1 ], 10 );\n\t\taaaa = parseInt( adata[ 2 ], 10 );\n\t\txdata = new Date( Date.UTC( aaaa, mm - 1, gg, 12, 0, 0, 0 ) );\n\t\tif ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth() === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {\n\t\t\tcheck = true;\n\t\t} else {\n\t\t\tcheck = false;\n\t\t}\n\t} else {\n\t\tcheck = false;\n\t}\n\treturn this.optional( element ) || check;\n}, $.validator.messages.date );\n\n$.validator.addMethod( \"dateNL\", function( value, element ) {\n\treturn this.optional( element ) || /^(0?[1-9]|[12]\\d|3[01])[\\.\\/\\-](0?[1-9]|1[012])[\\.\\/\\-]([12]\\d)?(\\d\\d)$/.test( value );\n}, $.validator.messages.date );\n\n// Older \"accept\" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept\n$.validator.addMethod( \"extension\", function( value, element, param ) {\n\tparam = typeof param === \"string\" ? param.replace( /,/g, \"|\" ) : \"png|jpe?g|gif\";\n\treturn this.optional( element ) || value.match( new RegExp( \"\\\\.(\" + param + \")$\", \"i\" ) );\n}, $.validator.format( \"Please enter a value with a valid extension.\" ) );\n\n/**\n * Dutch giro account numbers (not bank numbers) have max 7 digits\n */\n$.validator.addMethod( \"giroaccountNL\", function( value, element ) {\n\treturn this.optional( element ) || /^[0-9]{1,7}$/.test( value );\n}, \"Please specify a valid giro account number\" );\n\n/**\n * IBAN is the international bank account number.\n * It has a country - specific format, that is checked here too\n *\n * Validation is case-insensitive. Please make sure to normalize input yourself.\n */\n$.validator.addMethod( \"iban\", function( value, element ) {\n\n\t// Some quick simple tests to prevent needless work\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\n\t// Remove spaces and to upper case\n\tvar iban = value.replace( / /g, \"\" ).toUpperCase(),\n\t\tibancheckdigits = \"\",\n\t\tleadingZeroes = true,\n\t\tcRest = \"\",\n\t\tcOperator = \"\",\n\t\tcountrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p;\n\n\t// Check for IBAN code length.\n\t// It contains:\n\t// country code ISO 3166-1 - two letters,\n\t// two check digits,\n\t// Basic Bank Account Number (BBAN) - up to 30 chars\n\tvar minimalIBANlength = 5;\n\tif ( iban.length < minimalIBANlength ) {\n\t\treturn false;\n\t}\n\n\t// Check the country code and find the country specific format\n\tcountrycode = iban.substring( 0, 2 );\n\tbbancountrypatterns = {\n\t\t\"AL\": \"\\\\d{8}[\\\\dA-Z]{16}\",\n\t\t\"AD\": \"\\\\d{8}[\\\\dA-Z]{12}\",\n\t\t\"AT\": \"\\\\d{16}\",\n\t\t\"AZ\": \"[\\\\dA-Z]{4}\\\\d{20}\",\n\t\t\"BE\": \"\\\\d{12}\",\n\t\t\"BH\": \"[A-Z]{4}[\\\\dA-Z]{14}\",\n\t\t\"BA\": \"\\\\d{16}\",\n\t\t\"BR\": \"\\\\d{23}[A-Z][\\\\dA-Z]\",\n\t\t\"BG\": \"[A-Z]{4}\\\\d{6}[\\\\dA-Z]{8}\",\n\t\t\"CR\": \"\\\\d{17}\",\n\t\t\"HR\": \"\\\\d{17}\",\n\t\t\"CY\": \"\\\\d{8}[\\\\dA-Z]{16}\",\n\t\t\"CZ\": \"\\\\d{20}\",\n\t\t\"DK\": \"\\\\d{14}\",\n\t\t\"DO\": \"[A-Z]{4}\\\\d{20}\",\n\t\t\"EE\": \"\\\\d{16}\",\n\t\t\"FO\": \"\\\\d{14}\",\n\t\t\"FI\": \"\\\\d{14}\",\n\t\t\"FR\": \"\\\\d{10}[\\\\dA-Z]{11}\\\\d{2}\",\n\t\t\"GE\": \"[\\\\dA-Z]{2}\\\\d{16}\",\n\t\t\"DE\": \"\\\\d{18}\",\n\t\t\"GI\": \"[A-Z]{4}[\\\\dA-Z]{15}\",\n\t\t\"GR\": \"\\\\d{7}[\\\\dA-Z]{16}\",\n\t\t\"GL\": \"\\\\d{14}\",\n\t\t\"GT\": \"[\\\\dA-Z]{4}[\\\\dA-Z]{20}\",\n\t\t\"HU\": \"\\\\d{24}\",\n\t\t\"IS\": \"\\\\d{22}\",\n\t\t\"IE\": \"[\\\\dA-Z]{4}\\\\d{14}\",\n\t\t\"IL\": \"\\\\d{19}\",\n\t\t\"IT\": \"[A-Z]\\\\d{10}[\\\\dA-Z]{12}\",\n\t\t\"KZ\": \"\\\\d{3}[\\\\dA-Z]{13}\",\n\t\t\"KW\": \"[A-Z]{4}[\\\\dA-Z]{22}\",\n\t\t\"LV\": \"[A-Z]{4}[\\\\dA-Z]{13}\",\n\t\t\"LB\": \"\\\\d{4}[\\\\dA-Z]{20}\",\n\t\t\"LI\": \"\\\\d{5}[\\\\dA-Z]{12}\",\n\t\t\"LT\": \"\\\\d{16}\",\n\t\t\"LU\": \"\\\\d{3}[\\\\dA-Z]{13}\",\n\t\t\"MK\": \"\\\\d{3}[\\\\dA-Z]{10}\\\\d{2}\",\n\t\t\"MT\": \"[A-Z]{4}\\\\d{5}[\\\\dA-Z]{18}\",\n\t\t\"MR\": \"\\\\d{23}\",\n\t\t\"MU\": \"[A-Z]{4}\\\\d{19}[A-Z]{3}\",\n\t\t\"MC\": \"\\\\d{10}[\\\\dA-Z]{11}\\\\d{2}\",\n\t\t\"MD\": \"[\\\\dA-Z]{2}\\\\d{18}\",\n\t\t\"ME\": \"\\\\d{18}\",\n\t\t\"NL\": \"[A-Z]{4}\\\\d{10}\",\n\t\t\"NO\": \"\\\\d{11}\",\n\t\t\"PK\": \"[\\\\dA-Z]{4}\\\\d{16}\",\n\t\t\"PS\": \"[\\\\dA-Z]{4}\\\\d{21}\",\n\t\t\"PL\": \"\\\\d{24}\",\n\t\t\"PT\": \"\\\\d{21}\",\n\t\t\"RO\": \"[A-Z]{4}[\\\\dA-Z]{16}\",\n\t\t\"SM\": \"[A-Z]\\\\d{10}[\\\\dA-Z]{12}\",\n\t\t\"SA\": \"\\\\d{2}[\\\\dA-Z]{18}\",\n\t\t\"RS\": \"\\\\d{18}\",\n\t\t\"SK\": \"\\\\d{20}\",\n\t\t\"SI\": \"\\\\d{15}\",\n\t\t\"ES\": \"\\\\d{20}\",\n\t\t\"SE\": \"\\\\d{20}\",\n\t\t\"CH\": \"\\\\d{5}[\\\\dA-Z]{12}\",\n\t\t\"TN\": \"\\\\d{20}\",\n\t\t\"TR\": \"\\\\d{5}[\\\\dA-Z]{17}\",\n\t\t\"AE\": \"\\\\d{3}\\\\d{16}\",\n\t\t\"GB\": \"[A-Z]{4}\\\\d{14}\",\n\t\t\"VG\": \"[\\\\dA-Z]{4}\\\\d{16}\"\n\t};\n\n\tbbanpattern = bbancountrypatterns[ countrycode ];\n\n\t// As new countries will start using IBAN in the\n\t// future, we only check if the countrycode is known.\n\t// This prevents false negatives, while almost all\n\t// false positives introduced by this, will be caught\n\t// by the checksum validation below anyway.\n\t// Strict checking should return FALSE for unknown\n\t// countries.\n\tif ( typeof bbanpattern !== \"undefined\" ) {\n\t\tibanregexp = new RegExp( \"^[A-Z]{2}\\\\d{2}\" + bbanpattern + \"$\", \"\" );\n\t\tif ( !( ibanregexp.test( iban ) ) ) {\n\t\t\treturn false; // Invalid country specific format\n\t\t}\n\t}\n\n\t// Now check the checksum, first convert to digits\n\tibancheck = iban.substring( 4, iban.length ) + iban.substring( 0, 4 );\n\tfor ( i = 0; i < ibancheck.length; i++ ) {\n\t\tcharAt = ibancheck.charAt( i );\n\t\tif ( charAt !== \"0\" ) {\n\t\t\tleadingZeroes = false;\n\t\t}\n\t\tif ( !leadingZeroes ) {\n\t\t\tibancheckdigits += \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\".indexOf( charAt );\n\t\t}\n\t}\n\n\t// Calculate the result of: ibancheckdigits % 97\n\tfor ( p = 0; p < ibancheckdigits.length; p++ ) {\n\t\tcChar = ibancheckdigits.charAt( p );\n\t\tcOperator = \"\" + cRest + \"\" + cChar;\n\t\tcRest = cOperator % 97;\n\t}\n\treturn cRest === 1;\n}, \"Please specify a valid IBAN\" );\n\n$.validator.addMethod( \"integer\", function( value, element ) {\n\treturn this.optional( element ) || /^-?\\d+$/.test( value );\n}, \"A positive or negative non-decimal number please\" );\n\n$.validator.addMethod( \"ipv4\", function( value, element ) {\n\treturn this.optional( element ) || /^(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/i.test( value );\n}, \"Please enter a valid IP v4 address.\" );\n\n$.validator.addMethod( \"ipv6\", function( value, element ) {\n\treturn this.optional( element ) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b)\\.){3}(\\b((25[0-5])|(1\\d{2})|(2[0-4]\\d)|(\\d{1,2}))\\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test( value );\n}, \"Please enter a valid IP v6 address.\" );\n\n$.validator.addMethod( \"lettersonly\", function( value, element ) {\n\treturn this.optional( element ) || /^[a-z]+$/i.test( value );\n}, \"Letters only please\" );\n\n$.validator.addMethod( \"letterswithbasicpunc\", function( value, element ) {\n\treturn this.optional( element ) || /^[a-z\\-.,()'\"\\s]+$/i.test( value );\n}, \"Letters or punctuation only please\" );\n\n$.validator.addMethod( \"mobileNL\", function( value, element ) {\n\treturn this.optional( element ) || /^((\\+|00(\\s|\\s?\\-\\s?)?)31(\\s|\\s?\\-\\s?)?(\\(0\\)[\\-\\s]?)?|0)6((\\s|\\s?\\-\\s?)?[0-9]){8}$/.test( value );\n}, \"Please specify a valid mobile number\" );\n\n/* For UK phone functions, do the following server side processing:\n * Compare original input with this RegEx pattern:\n * ^\\(?(?:(?:00\\)?[\\s\\-]?\\(?|\\+)(44)\\)?[\\s\\-]?\\(?(?:0\\)?[\\s\\-]?\\(?)?|0)([1-9]\\d{1,4}\\)?[\\s\\d\\-]+)$\n * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'\n * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.\n * A number of very detailed GB telephone number RegEx patterns can also be found at:\n * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers\n */\n$.validator.addMethod( \"mobileUK\", function( phone_number, element ) {\n\tphone_number = phone_number.replace( /\\(|\\)|\\s+|-/g, \"\" );\n\treturn this.optional( element ) || phone_number.length > 9 &&\n\t\tphone_number.match( /^(?:(?:(?:00\\s?|\\+)44\\s?|0)7(?:[1345789]\\d{2}|624)\\s?\\d{3}\\s?\\d{3})$/ );\n}, \"Please specify a valid mobile number\" );\n\n$.validator.addMethod( \"netmask\", function( value, element ) {\n    return this.optional( element ) || /^(254|252|248|240|224|192|128)\\.0\\.0\\.0|255\\.(254|252|248|240|224|192|128|0)\\.0\\.0|255\\.255\\.(254|252|248|240|224|192|128|0)\\.0|255\\.255\\.255\\.(254|252|248|240|224|192|128|0)/i.test( value );\n}, \"Please enter a valid netmask.\" );\n\n/*\n * The NIE (Número de Identificación de Extranjero) is a Spanish tax identification number assigned by the Spanish\n * authorities to any foreigner.\n *\n * The NIE is the equivalent of a Spaniards Número de Identificación Fiscal (NIF) which serves as a fiscal\n * identification number. The CIF number (Certificado de Identificación Fiscal) is equivalent to the NIF, but applies to\n * companies rather than individuals. The NIE consists of an 'X' or 'Y' followed by 7 or 8 digits then another letter.\n */\n$.validator.addMethod( \"nieES\", function( value, element ) {\n\t\"use strict\";\n\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\n\tvar nieRegEx = new RegExp( /^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi );\n\tvar validChars = \"TRWAGMYFPDXBNJZSQVHLCKET\",\n\t\tletter = value.substr( value.length - 1 ).toUpperCase(),\n\t\tnumber;\n\n\tvalue = value.toString().toUpperCase();\n\n\t// Quick format test\n\tif ( value.length > 10 || value.length < 9 || !nieRegEx.test( value ) ) {\n\t\treturn false;\n\t}\n\n\t// X means same number\n\t// Y means number + 10000000\n\t// Z means number + 20000000\n\tvalue = value.replace( /^[X]/, \"0\" )\n\t\t.replace( /^[Y]/, \"1\" )\n\t\t.replace( /^[Z]/, \"2\" );\n\n\tnumber = value.length === 9 ? value.substr( 0, 8 ) : value.substr( 0, 9 );\n\n\treturn validChars.charAt( parseInt( number, 10 ) % 23 ) === letter;\n\n}, \"Please specify a valid NIE number.\" );\n\n/*\n * The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals\n */\n$.validator.addMethod( \"nifES\", function( value, element ) {\n\t\"use strict\";\n\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\n\tvalue = value.toUpperCase();\n\n\t// Basic format test\n\tif ( !value.match( \"((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)\" ) ) {\n\t\treturn false;\n\t}\n\n\t// Test NIF\n\tif ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) {\n\t\treturn ( \"TRWAGMYFPDXBNJZSQVHLCKE\".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) );\n\t}\n\n\t// Test specials NIF (starts with K, L or M)\n\tif ( /^[KLM]{1}/.test( value ) ) {\n\t\treturn ( value[ 8 ] === \"TRWAGMYFPDXBNJZSQVHLCKE\".charAt( value.substring( 8, 1 ) % 23 ) );\n\t}\n\n\treturn false;\n\n}, \"Please specify a valid NIF number.\" );\n\n/*\n * Numer identyfikacji podatkowej ( NIP ) is the way tax identification used in Poland for companies\n */\n$.validator.addMethod( \"nipPL\", function( value ) {\n\t\"use strict\";\n\n\tvalue = value.replace( /[^0-9]/g, \"\" );\n\n\tif ( value.length !== 10 ) {\n\t\treturn false;\n\t}\n\n\tvar arrSteps = [ 6, 5, 7, 2, 3, 4, 5, 6, 7 ];\n\tvar intSum = 0;\n\tfor ( var i = 0; i < 9; i++ ) {\n\t\tintSum += arrSteps[ i ] * value[ i ];\n\t}\n\tvar int2 = intSum % 11;\n\tvar intControlNr = ( int2 === 10 ) ? 0 : int2;\n\n\treturn ( intControlNr === parseInt( value[ 9 ], 10 ) );\n}, \"Please specify a valid NIP number.\" );\n\n$.validator.addMethod( \"notEqualTo\", function( value, element, param ) {\n\treturn this.optional( element ) || !$.validator.methods.equalTo.call( this, value, element, param );\n}, \"Please enter a different value, values must not be the same.\" );\n\n$.validator.addMethod( \"nowhitespace\", function( value, element ) {\n\treturn this.optional( element ) || /^\\S+$/i.test( value );\n}, \"No white space please\" );\n\n/**\n* Return true if the field value matches the given format RegExp\n*\n* @example $.validator.methods.pattern(\"AR1004\",element,/^AR\\d{4}$/)\n* @result true\n*\n* @example $.validator.methods.pattern(\"BR1004\",element,/^AR\\d{4}$/)\n* @result false\n*\n* @name $.validator.methods.pattern\n* @type Boolean\n* @cat Plugins/Validate/Methods\n*/\n$.validator.addMethod( \"pattern\", function( value, element, param ) {\n\tif ( this.optional( element ) ) {\n\t\treturn true;\n\t}\n\tif ( typeof param === \"string\" ) {\n\t\tparam = new RegExp( \"^(?:\" + param + \")$\" );\n\t}\n\treturn param.test( value );\n}, \"Invalid format.\" );\n\n/**\n * Dutch phone numbers have 10 digits (or 11 and start with +31).\n */\n$.validator.addMethod( \"phoneNL\", function( value, element ) {\n\treturn this.optional( element ) || /^((\\+|00(\\s|\\s?\\-\\s?)?)31(\\s|\\s?\\-\\s?)?(\\(0\\)[\\-\\s]?)?|0)[1-9]((\\s|\\s?\\-\\s?)?[0-9]){8}$/.test( value );\n}, \"Please specify a valid phone number.\" );\n\n/* For UK phone functions, do the following server side processing:\n * Compare original input with this RegEx pattern:\n * ^\\(?(?:(?:00\\)?[\\s\\-]?\\(?|\\+)(44)\\)?[\\s\\-]?\\(?(?:0\\)?[\\s\\-]?\\(?)?|0)([1-9]\\d{1,4}\\)?[\\s\\d\\-]+)$\n * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'\n * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.\n * A number of very detailed GB telephone number RegEx patterns can also be found at:\n * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers\n */\n\n// Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers\n$.validator.addMethod( \"phonesUK\", function( phone_number, element ) {\n\tphone_number = phone_number.replace( /\\(|\\)|\\s+|-/g, \"\" );\n\treturn this.optional( element ) || phone_number.length > 9 &&\n\t\tphone_number.match( /^(?:(?:(?:00\\s?|\\+)44\\s?|0)(?:1\\d{8,9}|[23]\\d{9}|7(?:[1345789]\\d{8}|624\\d{6})))$/ );\n}, \"Please specify a valid uk phone number\" );\n\n/* For UK phone functions, do the following server side processing:\n * Compare original input with this RegEx pattern:\n * ^\\(?(?:(?:00\\)?[\\s\\-]?\\(?|\\+)(44)\\)?[\\s\\-]?\\(?(?:0\\)?[\\s\\-]?\\(?)?|0)([1-9]\\d{1,4}\\)?[\\s\\d\\-]+)$\n * Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'\n * Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.\n * A number of very detailed GB telephone number RegEx patterns can also be found at:\n * http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers\n */\n$.validator.addMethod( \"phoneUK\", function( phone_number, element ) {\n\tphone_number = phone_number.replace( /\\(|\\)|\\s+|-/g, \"\" );\n\treturn this.optional( element ) || phone_number.length > 9 &&\n\t\tphone_number.match( /^(?:(?:(?:00\\s?|\\+)44\\s?)|(?:\\(?0))(?:\\d{2}\\)?\\s?\\d{4}\\s?\\d{4}|\\d{3}\\)?\\s?\\d{3}\\s?\\d{3,4}|\\d{4}\\)?\\s?(?:\\d{5}|\\d{3}\\s?\\d{3})|\\d{5}\\)?\\s?\\d{4,5})$/ );\n}, \"Please specify a valid phone number\" );\n\n/**\n * Matches US phone number format\n *\n * where the area code may not start with 1 and the prefix may not start with 1\n * allows '-' or ' ' as a separator and allows parens around area code\n * some people may want to put a '1' in front of their number\n *\n * 1(212)-999-2345 or\n * 212 999 2344 or\n * 212-999-0983\n *\n * but not\n * 111-123-5434\n * and not\n * 212 123 4567\n */\n$.validator.addMethod( \"phoneUS\", function( phone_number, element ) {\n\tphone_number = phone_number.replace( /\\s+/g, \"\" );\n\treturn this.optional( element ) || phone_number.length > 9 &&\n\t\tphone_number.match( /^(\\+?1-?)?(\\([2-9]([02-9]\\d|1[02-9])\\)|[2-9]([02-9]\\d|1[02-9]))-?[2-9]([02-9]\\d|1[02-9])-?\\d{4}$/ );\n}, \"Please specify a valid phone number\" );\n\n/*\n* Valida CEPs do brasileiros:\n*\n* Formatos aceitos:\n* 99999-999\n* 99.999-999\n* 99999999\n*/\n$.validator.addMethod( \"postalcodeBR\", function( cep_value, element ) {\n\treturn this.optional( element ) || /^\\d{2}.\\d{3}-\\d{3}?$|^\\d{5}-?\\d{3}?$/.test( cep_value );\n}, \"Informe um CEP válido.\" );\n\n/**\n * Matches a valid Canadian Postal Code\n *\n * @example jQuery.validator.methods.postalCodeCA( \"H0H 0H0\", element )\n * @result true\n *\n * @example jQuery.validator.methods.postalCodeCA( \"H0H0H0\", element )\n * @result false\n *\n * @name jQuery.validator.methods.postalCodeCA\n * @type Boolean\n * @cat Plugins/Validate/Methods\n */\n$.validator.addMethod( \"postalCodeCA\", function( value, element ) {\n\treturn this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\\d[ABCEGHJKLMNPRSTVWXYZ] *\\d[ABCEGHJKLMNPRSTVWXYZ]\\d$/i.test( value );\n}, \"Please specify a valid postal code\" );\n\n/* Matches Italian postcode (CAP) */\n$.validator.addMethod( \"postalcodeIT\", function( value, element ) {\n\treturn this.optional( element ) || /^\\d{5}$/.test( value );\n}, \"Please specify a valid postal code\" );\n\n$.validator.addMethod( \"postalcodeNL\", function( value, element ) {\n\treturn this.optional( element ) || /^[1-9][0-9]{3}\\s?[a-zA-Z]{2}$/.test( value );\n}, \"Please specify a valid postal code\" );\n\n// Matches UK postcode. Does not match to UK Channel Islands that have their own postcodes (non standard UK)\n$.validator.addMethod( \"postcodeUK\", function( value, element ) {\n\treturn this.optional( element ) || /^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\\s?(0AA))$/i.test( value );\n}, \"Please specify a valid UK postcode\" );\n\n/*\n * Lets you say \"at least X inputs that match selector Y must be filled.\"\n *\n * The end result is that neither of these inputs:\n *\n *\t<input class=\"productinfo\" name=\"partnumber\">\n *\t<input class=\"productinfo\" name=\"description\">\n *\n *\t...will validate unless at least one of them is filled.\n *\n * partnumber:\t{require_from_group: [1,\".productinfo\"]},\n * description: {require_from_group: [1,\".productinfo\"]}\n *\n * options[0]: number of fields that must be filled in the group\n * options[1]: CSS selector that defines the group of conditionally required fields\n */\n$.validator.addMethod( \"require_from_group\", function( value, element, options ) {\n\tvar $fields = $( options[ 1 ], element.form ),\n\t\t$fieldsFirst = $fields.eq( 0 ),\n\t\tvalidator = $fieldsFirst.data( \"valid_req_grp\" ) ? $fieldsFirst.data( \"valid_req_grp\" ) : $.extend( {}, this ),\n\t\tisValid = $fields.filter( function() {\n\t\t\treturn validator.elementValue( this );\n\t\t} ).length >= options[ 0 ];\n\n\t// Store the cloned validator for future validation\n\t$fieldsFirst.data( \"valid_req_grp\", validator );\n\n\t// If element isn't being validated, run each require_from_group field's validation rules\n\tif ( !$( element ).data( \"being_validated\" ) ) {\n\t\t$fields.data( \"being_validated\", true );\n\t\t$fields.each( function() {\n\t\t\tvalidator.element( this );\n\t\t} );\n\t\t$fields.data( \"being_validated\", false );\n\t}\n\treturn isValid;\n}, $.validator.format( \"Please fill at least {0} of these fields.\" ) );\n\n/*\n * Lets you say \"either at least X inputs that match selector Y must be filled,\n * OR they must all be skipped (left blank).\"\n *\n * The end result, is that none of these inputs:\n *\n *\t<input class=\"productinfo\" name=\"partnumber\">\n *\t<input class=\"productinfo\" name=\"description\">\n *\t<input class=\"productinfo\" name=\"color\">\n *\n *\t...will validate unless either at least two of them are filled,\n *\tOR none of them are.\n *\n * partnumber:\t{skip_or_fill_minimum: [2,\".productinfo\"]},\n * description: {skip_or_fill_minimum: [2,\".productinfo\"]},\n * color:\t\t{skip_or_fill_minimum: [2,\".productinfo\"]}\n *\n * options[0]: number of fields that must be filled in the group\n * options[1]: CSS selector that defines the group of conditionally required fields\n *\n */\n$.validator.addMethod( \"skip_or_fill_minimum\", function( value, element, options ) {\n\tvar $fields = $( options[ 1 ], element.form ),\n\t\t$fieldsFirst = $fields.eq( 0 ),\n\t\tvalidator = $fieldsFirst.data( \"valid_skip\" ) ? $fieldsFirst.data( \"valid_skip\" ) : $.extend( {}, this ),\n\t\tnumberFilled = $fields.filter( function() {\n\t\t\treturn validator.elementValue( this );\n\t\t} ).length,\n\t\tisValid = numberFilled === 0 || numberFilled >= options[ 0 ];\n\n\t// Store the cloned validator for future validation\n\t$fieldsFirst.data( \"valid_skip\", validator );\n\n\t// If element isn't being validated, run each skip_or_fill_minimum field's validation rules\n\tif ( !$( element ).data( \"being_validated\" ) ) {\n\t\t$fields.data( \"being_validated\", true );\n\t\t$fields.each( function() {\n\t\t\tvalidator.element( this );\n\t\t} );\n\t\t$fields.data( \"being_validated\", false );\n\t}\n\treturn isValid;\n}, $.validator.format( \"Please either skip these fields or fill at least {0} of them.\" ) );\n\n/* Validates US States and/or Territories by @jdforsythe\n * Can be case insensitive or require capitalization - default is case insensitive\n * Can include US Territories or not - default does not\n * Can include US Military postal abbreviations (AA, AE, AP) - default does not\n *\n * Note: \"States\" always includes DC (District of Colombia)\n *\n * Usage examples:\n *\n *  This is the default - case insensitive, no territories, no military zones\n *  stateInput: {\n *     caseSensitive: false,\n *     includeTerritories: false,\n *     includeMilitary: false\n *  }\n *\n *  Only allow capital letters, no territories, no military zones\n *  stateInput: {\n *     caseSensitive: false\n *  }\n *\n *  Case insensitive, include territories but not military zones\n *  stateInput: {\n *     includeTerritories: true\n *  }\n *\n *  Only allow capital letters, include territories and military zones\n *  stateInput: {\n *     caseSensitive: true,\n *     includeTerritories: true,\n *     includeMilitary: true\n *  }\n *\n */\n$.validator.addMethod( \"stateUS\", function( value, element, options ) {\n\tvar isDefault = typeof options === \"undefined\",\n\t\tcaseSensitive = ( isDefault || typeof options.caseSensitive === \"undefined\" ) ? false : options.caseSensitive,\n\t\tincludeTerritories = ( isDefault || typeof options.includeTerritories === \"undefined\" ) ? false : options.includeTerritories,\n\t\tincludeMilitary = ( isDefault || typeof options.includeMilitary === \"undefined\" ) ? false : options.includeMilitary,\n\t\tregex;\n\n\tif ( !includeTerritories && !includeMilitary ) {\n\t\tregex = \"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$\";\n\t} else if ( includeTerritories && includeMilitary ) {\n\t\tregex = \"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$\";\n\t} else if ( includeTerritories ) {\n\t\tregex = \"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$\";\n\t} else {\n\t\tregex = \"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$\";\n\t}\n\n\tregex = caseSensitive ? new RegExp( regex ) : new RegExp( regex, \"i\" );\n\treturn this.optional( element ) || regex.test( value );\n}, \"Please specify a valid state\" );\n\n// TODO check if value starts with <, otherwise don't try stripping anything\n$.validator.addMethod( \"strippedminlength\", function( value, element, param ) {\n\treturn $( value ).text().length >= param;\n}, $.validator.format( \"Please enter at least {0} characters\" ) );\n\n$.validator.addMethod( \"time\", function( value, element ) {\n\treturn this.optional( element ) || /^([01]\\d|2[0-3]|[0-9])(:[0-5]\\d){1,2}$/.test( value );\n}, \"Please enter a valid time, between 00:00 and 23:59\" );\n\n$.validator.addMethod( \"time12h\", function( value, element ) {\n\treturn this.optional( element ) || /^((0?[1-9]|1[012])(:[0-5]\\d){1,2}(\\ ?[AP]M))$/i.test( value );\n}, \"Please enter a valid time in 12-hour am/pm format\" );\n\n// Same as url, but TLD is optional\n$.validator.addMethod( \"url2\", function( value, element ) {\n\treturn this.optional( element ) || /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)*(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i.test( value );\n}, $.validator.messages.url );\n\n/**\n * Return true, if the value is a valid vehicle identification number (VIN).\n *\n * Works with all kind of text inputs.\n *\n * @example <input type=\"text\" size=\"20\" name=\"VehicleID\" class=\"{required:true,vinUS:true}\" />\n * @desc Declares a required input element whose value must be a valid vehicle identification number.\n *\n * @name $.validator.methods.vinUS\n * @type Boolean\n * @cat Plugins/Validate/Methods\n */\n$.validator.addMethod( \"vinUS\", function( v ) {\n\tif ( v.length !== 17 ) {\n\t\treturn false;\n\t}\n\n\tvar LL = [ \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"J\", \"K\", \"L\", \"M\", \"N\", \"P\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\" ],\n\t\tVL = [ 1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 7, 9, 2, 3, 4, 5, 6, 7, 8, 9 ],\n\t\tFL = [ 8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2 ],\n\t\trs = 0,\n\t\ti, n, d, f, cd, cdv;\n\n\tfor ( i = 0; i < 17; i++ ) {\n\t\tf = FL[ i ];\n\t\td = v.slice( i, i + 1 );\n\t\tif ( i === 8 ) {\n\t\t\tcdv = d;\n\t\t}\n\t\tif ( !isNaN( d ) ) {\n\t\t\td *= f;\n\t\t} else {\n\t\t\tfor ( n = 0; n < LL.length; n++ ) {\n\t\t\t\tif ( d.toUpperCase() === LL[ n ] ) {\n\t\t\t\t\td = VL[ n ];\n\t\t\t\t\td *= f;\n\t\t\t\t\tif ( isNaN( cdv ) && n === 8 ) {\n\t\t\t\t\t\tcdv = LL[ n ];\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\trs += d;\n\t}\n\tcd = rs % 11;\n\tif ( cd === 10 ) {\n\t\tcd = \"X\";\n\t}\n\tif ( cd === cdv ) {\n\t\treturn true;\n\t}\n\treturn false;\n}, \"The specified vehicle identification number (VIN) is invalid.\" );\n\n$.validator.addMethod( \"zipcodeUS\", function( value, element ) {\n\treturn this.optional( element ) || /^\\d{5}(-\\d{4})?$/.test( value );\n}, \"The specified US ZIP Code is invalid\" );\n\n$.validator.addMethod( \"ziprange\", function( value, element ) {\n\treturn this.optional( element ) || /^90[2-5]\\d\\{2\\}-\\d{4}$/.test( value );\n}, \"Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx\" );\nreturn $;\n}));"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/jquery-validation/dist/jquery.validate.js",
    "content": "/*!\n * jQuery Validation Plugin v1.17.0\n *\n * https://jqueryvalidation.org/\n *\n * Copyright (c) 2017 Jörn Zaefferer\n * Released under the MIT license\n */\n(function( factory ) {\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( [\"jquery\"], factory );\n\t} else if (typeof module === \"object\" && module.exports) {\n\t\tmodule.exports = factory( require( \"jquery\" ) );\n\t} else {\n\t\tfactory( jQuery );\n\t}\n}(function( $ ) {\n\n$.extend( $.fn, {\n\n\t// https://jqueryvalidation.org/validate/\n\tvalidate: function( options ) {\n\n\t\t// If nothing is selected, return nothing; can't chain anyway\n\t\tif ( !this.length ) {\n\t\t\tif ( options && options.debug && window.console ) {\n\t\t\t\tconsole.warn( \"Nothing selected, can't validate, returning nothing.\" );\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if a validator for this form was already created\n\t\tvar validator = $.data( this[ 0 ], \"validator\" );\n\t\tif ( validator ) {\n\t\t\treturn validator;\n\t\t}\n\n\t\t// Add novalidate tag if HTML5.\n\t\tthis.attr( \"novalidate\", \"novalidate\" );\n\n\t\tvalidator = new $.validator( options, this[ 0 ] );\n\t\t$.data( this[ 0 ], \"validator\", validator );\n\n\t\tif ( validator.settings.onsubmit ) {\n\n\t\t\tthis.on( \"click.validate\", \":submit\", function( event ) {\n\n\t\t\t\t// Track the used submit button to properly handle scripted\n\t\t\t\t// submits later.\n\t\t\t\tvalidator.submitButton = event.currentTarget;\n\n\t\t\t\t// Allow suppressing validation by adding a cancel class to the submit button\n\t\t\t\tif ( $( this ).hasClass( \"cancel\" ) ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow suppressing validation by adding the html5 formnovalidate attribute to the submit button\n\t\t\t\tif ( $( this ).attr( \"formnovalidate\" ) !== undefined ) {\n\t\t\t\t\tvalidator.cancelSubmit = true;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Validate the form on submit\n\t\t\tthis.on( \"submit.validate\", function( event ) {\n\t\t\t\tif ( validator.settings.debug ) {\n\n\t\t\t\t\t// Prevent form submit to be able to see console output\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t\tfunction handle() {\n\t\t\t\t\tvar hidden, result;\n\n\t\t\t\t\t// Insert a hidden input as a replacement for the missing submit button\n\t\t\t\t\t// The hidden input is inserted in two cases:\n\t\t\t\t\t//   - A user defined a `submitHandler`\n\t\t\t\t\t//   - There was a pending request due to `remote` method and `stopRequest()`\n\t\t\t\t\t//     was called to submit the form in case it's valid\n\t\t\t\t\tif ( validator.submitButton && ( validator.settings.submitHandler || validator.formSubmitted ) ) {\n\t\t\t\t\t\thidden = $( \"<input type='hidden'/>\" )\n\t\t\t\t\t\t\t.attr( \"name\", validator.submitButton.name )\n\t\t\t\t\t\t\t.val( $( validator.submitButton ).val() )\n\t\t\t\t\t\t\t.appendTo( validator.currentForm );\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( validator.settings.submitHandler ) {\n\t\t\t\t\t\tresult = validator.settings.submitHandler.call( validator, validator.currentForm, event );\n\t\t\t\t\t\tif ( hidden ) {\n\n\t\t\t\t\t\t\t// And clean up afterwards; thanks to no-block-scope, hidden can be referenced\n\t\t\t\t\t\t\thidden.remove();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result !== undefined ) {\n\t\t\t\t\t\t\treturn result;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// Prevent submit for invalid forms or custom submit handlers\n\t\t\t\tif ( validator.cancelSubmit ) {\n\t\t\t\t\tvalidator.cancelSubmit = false;\n\t\t\t\t\treturn handle();\n\t\t\t\t}\n\t\t\t\tif ( validator.form() ) {\n\t\t\t\t\tif ( validator.pendingRequest ) {\n\t\t\t\t\t\tvalidator.formSubmitted = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn handle();\n\t\t\t\t} else {\n\t\t\t\t\tvalidator.focusInvalid();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\treturn validator;\n\t},\n\n\t// https://jqueryvalidation.org/valid/\n\tvalid: function() {\n\t\tvar valid, validator, errorList;\n\n\t\tif ( $( this[ 0 ] ).is( \"form\" ) ) {\n\t\t\tvalid = this.validate().form();\n\t\t} else {\n\t\t\terrorList = [];\n\t\t\tvalid = true;\n\t\t\tvalidator = $( this[ 0 ].form ).validate();\n\t\t\tthis.each( function() {\n\t\t\t\tvalid = validator.element( this ) && valid;\n\t\t\t\tif ( !valid ) {\n\t\t\t\t\terrorList = errorList.concat( validator.errorList );\n\t\t\t\t}\n\t\t\t} );\n\t\t\tvalidator.errorList = errorList;\n\t\t}\n\t\treturn valid;\n\t},\n\n\t// https://jqueryvalidation.org/rules/\n\trules: function( command, argument ) {\n\t\tvar element = this[ 0 ],\n\t\t\tsettings, staticRules, existingRules, data, param, filtered;\n\n\t\t// If nothing is selected, return empty object; can't chain anyway\n\t\tif ( element == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( !element.form && element.hasAttribute( \"contenteditable\" ) ) {\n\t\t\telement.form = this.closest( \"form\" )[ 0 ];\n\t\t\telement.name = this.attr( \"name\" );\n\t\t}\n\n\t\tif ( element.form == null ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( command ) {\n\t\t\tsettings = $.data( element.form, \"validator\" ).settings;\n\t\t\tstaticRules = settings.rules;\n\t\t\texistingRules = $.validator.staticRules( element );\n\t\t\tswitch ( command ) {\n\t\t\tcase \"add\":\n\t\t\t\t$.extend( existingRules, $.validator.normalizeRule( argument ) );\n\n\t\t\t\t// Remove messages from rules, but allow them to be set separately\n\t\t\t\tdelete existingRules.messages;\n\t\t\t\tstaticRules[ element.name ] = existingRules;\n\t\t\t\tif ( argument.messages ) {\n\t\t\t\t\tsettings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"remove\":\n\t\t\t\tif ( !argument ) {\n\t\t\t\t\tdelete staticRules[ element.name ];\n\t\t\t\t\treturn existingRules;\n\t\t\t\t}\n\t\t\t\tfiltered = {};\n\t\t\t\t$.each( argument.split( /\\s/ ), function( index, method ) {\n\t\t\t\t\tfiltered[ method ] = existingRules[ method ];\n\t\t\t\t\tdelete existingRules[ method ];\n\t\t\t\t} );\n\t\t\t\treturn filtered;\n\t\t\t}\n\t\t}\n\n\t\tdata = $.validator.normalizeRules(\n\t\t$.extend(\n\t\t\t{},\n\t\t\t$.validator.classRules( element ),\n\t\t\t$.validator.attributeRules( element ),\n\t\t\t$.validator.dataRules( element ),\n\t\t\t$.validator.staticRules( element )\n\t\t), element );\n\n\t\t// Make sure required is at front\n\t\tif ( data.required ) {\n\t\t\tparam = data.required;\n\t\t\tdelete data.required;\n\t\t\tdata = $.extend( { required: param }, data );\n\t\t}\n\n\t\t// Make sure remote is at back\n\t\tif ( data.remote ) {\n\t\t\tparam = data.remote;\n\t\t\tdelete data.remote;\n\t\t\tdata = $.extend( data, { remote: param } );\n\t\t}\n\n\t\treturn data;\n\t}\n} );\n\n// Custom selectors\n$.extend( $.expr.pseudos || $.expr[ \":\" ], {\t\t// '|| $.expr[ \":\" ]' here enables backwards compatibility to jQuery 1.7. Can be removed when dropping jQ 1.7.x support\n\n\t// https://jqueryvalidation.org/blank-selector/\n\tblank: function( a ) {\n\t\treturn !$.trim( \"\" + $( a ).val() );\n\t},\n\n\t// https://jqueryvalidation.org/filled-selector/\n\tfilled: function( a ) {\n\t\tvar val = $( a ).val();\n\t\treturn val !== null && !!$.trim( \"\" + val );\n\t},\n\n\t// https://jqueryvalidation.org/unchecked-selector/\n\tunchecked: function( a ) {\n\t\treturn !$( a ).prop( \"checked\" );\n\t}\n} );\n\n// Constructor for validator\n$.validator = function( options, form ) {\n\tthis.settings = $.extend( true, {}, $.validator.defaults, options );\n\tthis.currentForm = form;\n\tthis.init();\n};\n\n// https://jqueryvalidation.org/jQuery.validator.format/\n$.validator.format = function( source, params ) {\n\tif ( arguments.length === 1 ) {\n\t\treturn function() {\n\t\t\tvar args = $.makeArray( arguments );\n\t\t\targs.unshift( source );\n\t\t\treturn $.validator.format.apply( this, args );\n\t\t};\n\t}\n\tif ( params === undefined ) {\n\t\treturn source;\n\t}\n\tif ( arguments.length > 2 && params.constructor !== Array  ) {\n\t\tparams = $.makeArray( arguments ).slice( 1 );\n\t}\n\tif ( params.constructor !== Array ) {\n\t\tparams = [ params ];\n\t}\n\t$.each( params, function( i, n ) {\n\t\tsource = source.replace( new RegExp( \"\\\\{\" + i + \"\\\\}\", \"g\" ), function() {\n\t\t\treturn n;\n\t\t} );\n\t} );\n\treturn source;\n};\n\n$.extend( $.validator, {\n\n\tdefaults: {\n\t\tmessages: {},\n\t\tgroups: {},\n\t\trules: {},\n\t\terrorClass: \"error\",\n\t\tpendingClass: \"pending\",\n\t\tvalidClass: \"valid\",\n\t\terrorElement: \"label\",\n\t\tfocusCleanup: false,\n\t\tfocusInvalid: true,\n\t\terrorContainer: $( [] ),\n\t\terrorLabelContainer: $( [] ),\n\t\tonsubmit: true,\n\t\tignore: \":hidden\",\n\t\tignoreTitle: false,\n\t\tonfocusin: function( element ) {\n\t\t\tthis.lastActive = element;\n\n\t\t\t// Hide error label and remove error class on focus if enabled\n\t\t\tif ( this.settings.focusCleanup ) {\n\t\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.hideThese( this.errorsFor( element ) );\n\t\t\t}\n\t\t},\n\t\tonfocusout: function( element ) {\n\t\t\tif ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonkeyup: function( element, event ) {\n\n\t\t\t// Avoid revalidate the field when pressing one of the following keys\n\t\t\t// Shift       => 16\n\t\t\t// Ctrl        => 17\n\t\t\t// Alt         => 18\n\t\t\t// Caps lock   => 20\n\t\t\t// End         => 35\n\t\t\t// Home        => 36\n\t\t\t// Left arrow  => 37\n\t\t\t// Up arrow    => 38\n\t\t\t// Right arrow => 39\n\t\t\t// Down arrow  => 40\n\t\t\t// Insert      => 45\n\t\t\t// Num lock    => 144\n\t\t\t// AltGr key   => 225\n\t\t\tvar excludedKeys = [\n\t\t\t\t16, 17, 18, 20, 35, 36, 37,\n\t\t\t\t38, 39, 40, 45, 144, 225\n\t\t\t];\n\n\t\t\tif ( event.which === 9 && this.elementValue( element ) === \"\" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) {\n\t\t\t\treturn;\n\t\t\t} else if ( element.name in this.submitted || element.name in this.invalid ) {\n\t\t\t\tthis.element( element );\n\t\t\t}\n\t\t},\n\t\tonclick: function( element ) {\n\n\t\t\t// Click on selects, radiobuttons and checkboxes\n\t\t\tif ( element.name in this.submitted ) {\n\t\t\t\tthis.element( element );\n\n\t\t\t// Or option elements, check parent select in that case\n\t\t\t} else if ( element.parentNode.name in this.submitted ) {\n\t\t\t\tthis.element( element.parentNode );\n\t\t\t}\n\t\t},\n\t\thighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).addClass( errorClass ).removeClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).addClass( errorClass ).removeClass( validClass );\n\t\t\t}\n\t\t},\n\t\tunhighlight: function( element, errorClass, validClass ) {\n\t\t\tif ( element.type === \"radio\" ) {\n\t\t\t\tthis.findByName( element.name ).removeClass( errorClass ).addClass( validClass );\n\t\t\t} else {\n\t\t\t\t$( element ).removeClass( errorClass ).addClass( validClass );\n\t\t\t}\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.setDefaults/\n\tsetDefaults: function( settings ) {\n\t\t$.extend( $.validator.defaults, settings );\n\t},\n\n\tmessages: {\n\t\trequired: \"This field is required.\",\n\t\tremote: \"Please fix this field.\",\n\t\temail: \"Please enter a valid email address.\",\n\t\turl: \"Please enter a valid URL.\",\n\t\tdate: \"Please enter a valid date.\",\n\t\tdateISO: \"Please enter a valid date (ISO).\",\n\t\tnumber: \"Please enter a valid number.\",\n\t\tdigits: \"Please enter only digits.\",\n\t\tequalTo: \"Please enter the same value again.\",\n\t\tmaxlength: $.validator.format( \"Please enter no more than {0} characters.\" ),\n\t\tminlength: $.validator.format( \"Please enter at least {0} characters.\" ),\n\t\trangelength: $.validator.format( \"Please enter a value between {0} and {1} characters long.\" ),\n\t\trange: $.validator.format( \"Please enter a value between {0} and {1}.\" ),\n\t\tmax: $.validator.format( \"Please enter a value less than or equal to {0}.\" ),\n\t\tmin: $.validator.format( \"Please enter a value greater than or equal to {0}.\" ),\n\t\tstep: $.validator.format( \"Please enter a multiple of {0}.\" )\n\t},\n\n\tautoCreateRanges: false,\n\n\tprototype: {\n\n\t\tinit: function() {\n\t\t\tthis.labelContainer = $( this.settings.errorLabelContainer );\n\t\t\tthis.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm );\n\t\t\tthis.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer );\n\t\t\tthis.submitted = {};\n\t\t\tthis.valueCache = {};\n\t\t\tthis.pendingRequest = 0;\n\t\t\tthis.pending = {};\n\t\t\tthis.invalid = {};\n\t\t\tthis.reset();\n\n\t\t\tvar groups = ( this.groups = {} ),\n\t\t\t\trules;\n\t\t\t$.each( this.settings.groups, function( key, value ) {\n\t\t\t\tif ( typeof value === \"string\" ) {\n\t\t\t\t\tvalue = value.split( /\\s/ );\n\t\t\t\t}\n\t\t\t\t$.each( value, function( index, name ) {\n\t\t\t\t\tgroups[ name ] = key;\n\t\t\t\t} );\n\t\t\t} );\n\t\t\trules = this.settings.rules;\n\t\t\t$.each( rules, function( key, value ) {\n\t\t\t\trules[ key ] = $.validator.normalizeRule( value );\n\t\t\t} );\n\n\t\t\tfunction delegate( event ) {\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( !this.form && this.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = $( this ).attr( \"name\" );\n\t\t\t\t}\n\n\t\t\t\tvar validator = $.data( this.form, \"validator\" ),\n\t\t\t\t\teventType = \"on\" + event.type.replace( /^validate/, \"\" ),\n\t\t\t\t\tsettings = validator.settings;\n\t\t\t\tif ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) {\n\t\t\t\t\tsettings[ eventType ].call( validator, this, event );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.on( \"focusin.validate focusout.validate keyup.validate\",\n\t\t\t\t\t\":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], \" +\n\t\t\t\t\t\"[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], \" +\n\t\t\t\t\t\"[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], \" +\n\t\t\t\t\t\"[type='radio'], [type='checkbox'], [contenteditable], [type='button']\", delegate )\n\n\t\t\t\t// Support: Chrome, oldIE\n\t\t\t\t// \"select\" is provided as event.target when clicking a option\n\t\t\t\t.on( \"click.validate\", \"select, option, [type='radio'], [type='checkbox']\", delegate );\n\n\t\t\tif ( this.settings.invalidHandler ) {\n\t\t\t\t$( this.currentForm ).on( \"invalid-form.validate\", this.settings.invalidHandler );\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.form/\n\t\tform: function() {\n\t\t\tthis.checkForm();\n\t\t\t$.extend( this.submitted, this.errorMap );\n\t\t\tthis.invalid = $.extend( {}, this.errorMap );\n\t\t\tif ( !this.valid() ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t}\n\t\t\tthis.showErrors();\n\t\t\treturn this.valid();\n\t\t},\n\n\t\tcheckForm: function() {\n\t\t\tthis.prepareForm();\n\t\t\tfor ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) {\n\t\t\t\tthis.check( elements[ i ] );\n\t\t\t}\n\t\t\treturn this.valid();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.element/\n\t\telement: function( element ) {\n\t\t\tvar cleanElement = this.clean( element ),\n\t\t\t\tcheckElement = this.validationTargetFor( cleanElement ),\n\t\t\t\tv = this,\n\t\t\t\tresult = true,\n\t\t\t\trs, group;\n\n\t\t\tif ( checkElement === undefined ) {\n\t\t\t\tdelete this.invalid[ cleanElement.name ];\n\t\t\t} else {\n\t\t\t\tthis.prepareElement( checkElement );\n\t\t\t\tthis.currentElements = $( checkElement );\n\n\t\t\t\t// If this element is grouped, then validate all group elements already\n\t\t\t\t// containing a value\n\t\t\t\tgroup = this.groups[ checkElement.name ];\n\t\t\t\tif ( group ) {\n\t\t\t\t\t$.each( this.groups, function( name, testgroup ) {\n\t\t\t\t\t\tif ( testgroup === group && name !== checkElement.name ) {\n\t\t\t\t\t\t\tcleanElement = v.validationTargetFor( v.clean( v.findByName( name ) ) );\n\t\t\t\t\t\t\tif ( cleanElement && cleanElement.name in v.invalid ) {\n\t\t\t\t\t\t\t\tv.currentElements.push( cleanElement );\n\t\t\t\t\t\t\t\tresult = v.check( cleanElement ) && result;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t\trs = this.check( checkElement ) !== false;\n\t\t\t\tresult = result && rs;\n\t\t\t\tif ( rs ) {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = false;\n\t\t\t\t} else {\n\t\t\t\t\tthis.invalid[ checkElement.name ] = true;\n\t\t\t\t}\n\n\t\t\t\tif ( !this.numberOfInvalids() ) {\n\n\t\t\t\t\t// Hide error containers on last error\n\t\t\t\t\tthis.toHide = this.toHide.add( this.containers );\n\t\t\t\t}\n\t\t\t\tthis.showErrors();\n\n\t\t\t\t// Add aria-invalid status for screen readers\n\t\t\t\t$( element ).attr( \"aria-invalid\", !rs );\n\t\t\t}\n\n\t\t\treturn result;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.showErrors/\n\t\tshowErrors: function( errors ) {\n\t\t\tif ( errors ) {\n\t\t\t\tvar validator = this;\n\n\t\t\t\t// Add items to error list and map\n\t\t\t\t$.extend( this.errorMap, errors );\n\t\t\t\tthis.errorList = $.map( this.errorMap, function( message, name ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tmessage: message,\n\t\t\t\t\t\telement: validator.findByName( name )[ 0 ]\n\t\t\t\t\t};\n\t\t\t\t} );\n\n\t\t\t\t// Remove items from success list\n\t\t\t\tthis.successList = $.grep( this.successList, function( element ) {\n\t\t\t\t\treturn !( element.name in errors );\n\t\t\t\t} );\n\t\t\t}\n\t\t\tif ( this.settings.showErrors ) {\n\t\t\t\tthis.settings.showErrors.call( this, this.errorMap, this.errorList );\n\t\t\t} else {\n\t\t\t\tthis.defaultShowErrors();\n\t\t\t}\n\t\t},\n\n\t\t// https://jqueryvalidation.org/Validator.resetForm/\n\t\tresetForm: function() {\n\t\t\tif ( $.fn.resetForm ) {\n\t\t\t\t$( this.currentForm ).resetForm();\n\t\t\t}\n\t\t\tthis.invalid = {};\n\t\t\tthis.submitted = {};\n\t\t\tthis.prepareForm();\n\t\t\tthis.hideErrors();\n\t\t\tvar elements = this.elements()\n\t\t\t\t.removeData( \"previousValue\" )\n\t\t\t\t.removeAttr( \"aria-invalid\" );\n\n\t\t\tthis.resetElements( elements );\n\t\t},\n\n\t\tresetElements: function( elements ) {\n\t\t\tvar i;\n\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0; elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ],\n\t\t\t\t\t\tthis.settings.errorClass, \"\" );\n\t\t\t\t\tthis.findByName( elements[ i ].name ).removeClass( this.settings.validClass );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telements\n\t\t\t\t\t.removeClass( this.settings.errorClass )\n\t\t\t\t\t.removeClass( this.settings.validClass );\n\t\t\t}\n\t\t},\n\n\t\tnumberOfInvalids: function() {\n\t\t\treturn this.objectLength( this.invalid );\n\t\t},\n\n\t\tobjectLength: function( obj ) {\n\t\t\t/* jshint unused: false */\n\t\t\tvar count = 0,\n\t\t\t\ti;\n\t\t\tfor ( i in obj ) {\n\n\t\t\t\t// This check allows counting elements with empty error\n\t\t\t\t// message as invalid elements\n\t\t\t\tif ( obj[ i ] !== undefined && obj[ i ] !== null && obj[ i ] !== false ) {\n\t\t\t\t\tcount++;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn count;\n\t\t},\n\n\t\thideErrors: function() {\n\t\t\tthis.hideThese( this.toHide );\n\t\t},\n\n\t\thideThese: function( errors ) {\n\t\t\terrors.not( this.containers ).text( \"\" );\n\t\t\tthis.addWrapper( errors ).hide();\n\t\t},\n\n\t\tvalid: function() {\n\t\t\treturn this.size() === 0;\n\t\t},\n\n\t\tsize: function() {\n\t\t\treturn this.errorList.length;\n\t\t},\n\n\t\tfocusInvalid: function() {\n\t\t\tif ( this.settings.focusInvalid ) {\n\t\t\t\ttry {\n\t\t\t\t\t$( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || [] )\n\t\t\t\t\t.filter( \":visible\" )\n\t\t\t\t\t.focus()\n\n\t\t\t\t\t// Manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find\n\t\t\t\t\t.trigger( \"focusin\" );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// Ignore IE throwing errors when focusing hidden elements\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tfindLastActive: function() {\n\t\t\tvar lastActive = this.lastActive;\n\t\t\treturn lastActive && $.grep( this.errorList, function( n ) {\n\t\t\t\treturn n.element.name === lastActive.name;\n\t\t\t} ).length === 1 && lastActive;\n\t\t},\n\n\t\telements: function() {\n\t\t\tvar validator = this,\n\t\t\t\trulesCache = {};\n\n\t\t\t// Select all valid inputs inside the form (no submit or reset buttons)\n\t\t\treturn $( this.currentForm )\n\t\t\t.find( \"input, select, textarea, [contenteditable]\" )\n\t\t\t.not( \":submit, :reset, :image, :disabled\" )\n\t\t\t.not( this.settings.ignore )\n\t\t\t.filter( function() {\n\t\t\t\tvar name = this.name || $( this ).attr( \"name\" ); // For contenteditable\n\t\t\t\tif ( !name && validator.settings.debug && window.console ) {\n\t\t\t\t\tconsole.error( \"%o has no name assigned\", this );\n\t\t\t\t}\n\n\t\t\t\t// Set form expando on contenteditable\n\t\t\t\tif ( this.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\t\tthis.form = $( this ).closest( \"form\" )[ 0 ];\n\t\t\t\t\tthis.name = name;\n\t\t\t\t}\n\n\t\t\t\t// Select only the first element for each name, and only those with rules specified\n\t\t\t\tif ( name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trulesCache[ name ] = true;\n\t\t\t\treturn true;\n\t\t\t} );\n\t\t},\n\n\t\tclean: function( selector ) {\n\t\t\treturn $( selector )[ 0 ];\n\t\t},\n\n\t\terrors: function() {\n\t\t\tvar errorClass = this.settings.errorClass.split( \" \" ).join( \".\" );\n\t\t\treturn $( this.settings.errorElement + \".\" + errorClass, this.errorContext );\n\t\t},\n\n\t\tresetInternals: function() {\n\t\t\tthis.successList = [];\n\t\t\tthis.errorList = [];\n\t\t\tthis.errorMap = {};\n\t\t\tthis.toShow = $( [] );\n\t\t\tthis.toHide = $( [] );\n\t\t},\n\n\t\treset: function() {\n\t\t\tthis.resetInternals();\n\t\t\tthis.currentElements = $( [] );\n\t\t},\n\n\t\tprepareForm: function() {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errors().add( this.containers );\n\t\t},\n\n\t\tprepareElement: function( element ) {\n\t\t\tthis.reset();\n\t\t\tthis.toHide = this.errorsFor( element );\n\t\t},\n\n\t\telementValue: function( element ) {\n\t\t\tvar $element = $( element ),\n\t\t\t\ttype = element.type,\n\t\t\t\tval, idx;\n\n\t\t\tif ( type === \"radio\" || type === \"checkbox\" ) {\n\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).val();\n\t\t\t} else if ( type === \"number\" && typeof element.validity !== \"undefined\" ) {\n\t\t\t\treturn element.validity.badInput ? \"NaN\" : $element.val();\n\t\t\t}\n\n\t\t\tif ( element.hasAttribute( \"contenteditable\" ) ) {\n\t\t\t\tval = $element.text();\n\t\t\t} else {\n\t\t\t\tval = $element.val();\n\t\t\t}\n\n\t\t\tif ( type === \"file\" ) {\n\n\t\t\t\t// Modern browser (chrome & safari)\n\t\t\t\tif ( val.substr( 0, 12 ) === \"C:\\\\fakepath\\\\\" ) {\n\t\t\t\t\treturn val.substr( 12 );\n\t\t\t\t}\n\n\t\t\t\t// Legacy browsers\n\t\t\t\t// Unix-based path\n\t\t\t\tidx = val.lastIndexOf( \"/\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Windows-based path\n\t\t\t\tidx = val.lastIndexOf( \"\\\\\" );\n\t\t\t\tif ( idx >= 0 ) {\n\t\t\t\t\treturn val.substr( idx + 1 );\n\t\t\t\t}\n\n\t\t\t\t// Just the file name\n\t\t\t\treturn val;\n\t\t\t}\n\n\t\t\tif ( typeof val === \"string\" ) {\n\t\t\t\treturn val.replace( /\\r/g, \"\" );\n\t\t\t}\n\t\t\treturn val;\n\t\t},\n\n\t\tcheck: function( element ) {\n\t\t\telement = this.validationTargetFor( this.clean( element ) );\n\n\t\t\tvar rules = $( element ).rules(),\n\t\t\t\trulesCount = $.map( rules, function( n, i ) {\n\t\t\t\t\treturn i;\n\t\t\t\t} ).length,\n\t\t\t\tdependencyMismatch = false,\n\t\t\t\tval = this.elementValue( element ),\n\t\t\t\tresult, method, rule, normalizer;\n\n\t\t\t// Prioritize the local normalizer defined for this element over the global one\n\t\t\t// if the former exists, otherwise user the global one in case it exists.\n\t\t\tif ( typeof rules.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = rules.normalizer;\n\t\t\t} else if (\ttypeof this.settings.normalizer === \"function\" ) {\n\t\t\t\tnormalizer = this.settings.normalizer;\n\t\t\t}\n\n\t\t\t// If normalizer is defined, then call it to retreive the changed value instead\n\t\t\t// of using the real one.\n\t\t\t// Note that `this` in the normalizer is `element`.\n\t\t\tif ( normalizer ) {\n\t\t\t\tval = normalizer.call( element, val );\n\n\t\t\t\tif ( typeof val !== \"string\" ) {\n\t\t\t\t\tthrow new TypeError( \"The normalizer should return a string value.\" );\n\t\t\t\t}\n\n\t\t\t\t// Delete the normalizer from rules to avoid treating it as a pre-defined method.\n\t\t\t\tdelete rules.normalizer;\n\t\t\t}\n\n\t\t\tfor ( method in rules ) {\n\t\t\t\trule = { method: method, parameters: rules[ method ] };\n\t\t\t\ttry {\n\t\t\t\t\tresult = $.validator.methods[ method ].call( this, val, element, rule.parameters );\n\n\t\t\t\t\t// If a method indicates that the field is optional and therefore valid,\n\t\t\t\t\t// don't mark it as valid when there are no other rules\n\t\t\t\t\tif ( result === \"dependency-mismatch\" && rulesCount === 1 ) {\n\t\t\t\t\t\tdependencyMismatch = true;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tdependencyMismatch = false;\n\n\t\t\t\t\tif ( result === \"pending\" ) {\n\t\t\t\t\t\tthis.toHide = this.toHide.not( this.errorsFor( element ) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !result ) {\n\t\t\t\t\t\tthis.formatAndAdd( element, rule );\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\tif ( this.settings.debug && window.console ) {\n\t\t\t\t\t\tconsole.log( \"Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\", e );\n\t\t\t\t\t}\n\t\t\t\t\tif ( e instanceof TypeError ) {\n\t\t\t\t\t\te.message += \".  Exception occurred when checking element \" + element.id + \", check the '\" + rule.method + \"' method.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( dependencyMismatch ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( this.objectLength( rules ) ) {\n\t\t\t\tthis.successList.push( element );\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t// Return the custom message for the given element and validation method\n\t\t// specified in the element's HTML5 data attribute\n\t\t// return the generic message if present and no method specific message is present\n\t\tcustomDataMessage: function( element, method ) {\n\t\t\treturn $( element ).data( \"msg\" + method.charAt( 0 ).toUpperCase() +\n\t\t\t\tmethod.substring( 1 ).toLowerCase() ) || $( element ).data( \"msg\" );\n\t\t},\n\n\t\t// Return the custom message for the given element name and validation method\n\t\tcustomMessage: function( name, method ) {\n\t\t\tvar m = this.settings.messages[ name ];\n\t\t\treturn m && ( m.constructor === String ? m : m[ method ] );\n\t\t},\n\n\t\t// Return the first defined argument, allowing empty strings\n\t\tfindDefined: function() {\n\t\t\tfor ( var i = 0; i < arguments.length; i++ ) {\n\t\t\t\tif ( arguments[ i ] !== undefined ) {\n\t\t\t\t\treturn arguments[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn undefined;\n\t\t},\n\n\t\t// The second parameter 'rule' used to be a string, and extended to an object literal\n\t\t// of the following form:\n\t\t// rule = {\n\t\t//     method: \"method name\",\n\t\t//     parameters: \"the given method parameters\"\n\t\t// }\n\t\t//\n\t\t// The old behavior still supported, kept to maintain backward compatibility with\n\t\t// old code, and will be removed in the next major release.\n\t\tdefaultMessage: function( element, rule ) {\n\t\t\tif ( typeof rule === \"string\" ) {\n\t\t\t\trule = { method: rule };\n\t\t\t}\n\n\t\t\tvar message = this.findDefined(\n\t\t\t\t\tthis.customMessage( element.name, rule.method ),\n\t\t\t\t\tthis.customDataMessage( element, rule.method ),\n\n\t\t\t\t\t// 'title' is never undefined, so handle empty string as undefined\n\t\t\t\t\t!this.settings.ignoreTitle && element.title || undefined,\n\t\t\t\t\t$.validator.messages[ rule.method ],\n\t\t\t\t\t\"<strong>Warning: No message defined for \" + element.name + \"</strong>\"\n\t\t\t\t),\n\t\t\t\ttheregex = /\\$?\\{(\\d+)\\}/g;\n\t\t\tif ( typeof message === \"function\" ) {\n\t\t\t\tmessage = message.call( this, rule.parameters, element );\n\t\t\t} else if ( theregex.test( message ) ) {\n\t\t\t\tmessage = $.validator.format( message.replace( theregex, \"{$1}\" ), rule.parameters );\n\t\t\t}\n\n\t\t\treturn message;\n\t\t},\n\n\t\tformatAndAdd: function( element, rule ) {\n\t\t\tvar message = this.defaultMessage( element, rule );\n\n\t\t\tthis.errorList.push( {\n\t\t\t\tmessage: message,\n\t\t\t\telement: element,\n\t\t\t\tmethod: rule.method\n\t\t\t} );\n\n\t\t\tthis.errorMap[ element.name ] = message;\n\t\t\tthis.submitted[ element.name ] = message;\n\t\t},\n\n\t\taddWrapper: function( toToggle ) {\n\t\t\tif ( this.settings.wrapper ) {\n\t\t\t\ttoToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) );\n\t\t\t}\n\t\t\treturn toToggle;\n\t\t},\n\n\t\tdefaultShowErrors: function() {\n\t\t\tvar i, elements, error;\n\t\t\tfor ( i = 0; this.errorList[ i ]; i++ ) {\n\t\t\t\terror = this.errorList[ i ];\n\t\t\t\tif ( this.settings.highlight ) {\n\t\t\t\t\tthis.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t\tthis.showLabel( error.element, error.message );\n\t\t\t}\n\t\t\tif ( this.errorList.length ) {\n\t\t\t\tthis.toShow = this.toShow.add( this.containers );\n\t\t\t}\n\t\t\tif ( this.settings.success ) {\n\t\t\t\tfor ( i = 0; this.successList[ i ]; i++ ) {\n\t\t\t\t\tthis.showLabel( this.successList[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( this.settings.unhighlight ) {\n\t\t\t\tfor ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) {\n\t\t\t\t\tthis.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toHide = this.toHide.not( this.toShow );\n\t\t\tthis.hideErrors();\n\t\t\tthis.addWrapper( this.toShow ).show();\n\t\t},\n\n\t\tvalidElements: function() {\n\t\t\treturn this.currentElements.not( this.invalidElements() );\n\t\t},\n\n\t\tinvalidElements: function() {\n\t\t\treturn $( this.errorList ).map( function() {\n\t\t\t\treturn this.element;\n\t\t\t} );\n\t\t},\n\n\t\tshowLabel: function( element, message ) {\n\t\t\tvar place, group, errorID, v,\n\t\t\t\terror = this.errorsFor( element ),\n\t\t\t\telementID = this.idOrName( element ),\n\t\t\t\tdescribedBy = $( element ).attr( \"aria-describedby\" );\n\n\t\t\tif ( error.length ) {\n\n\t\t\t\t// Refresh error/success class\n\t\t\t\terror.removeClass( this.settings.validClass ).addClass( this.settings.errorClass );\n\n\t\t\t\t// Replace message on existing label\n\t\t\t\terror.html( message );\n\t\t\t} else {\n\n\t\t\t\t// Create error element\n\t\t\t\terror = $( \"<\" + this.settings.errorElement + \">\" )\n\t\t\t\t\t.attr( \"id\", elementID + \"-error\" )\n\t\t\t\t\t.addClass( this.settings.errorClass )\n\t\t\t\t\t.html( message || \"\" );\n\n\t\t\t\t// Maintain reference to the element to be placed into the DOM\n\t\t\t\tplace = error;\n\t\t\t\tif ( this.settings.wrapper ) {\n\n\t\t\t\t\t// Make sure the element is visible, even in IE\n\t\t\t\t\t// actually showing the wrapped element is handled elsewhere\n\t\t\t\t\tplace = error.hide().show().wrap( \"<\" + this.settings.wrapper + \"/>\" ).parent();\n\t\t\t\t}\n\t\t\t\tif ( this.labelContainer.length ) {\n\t\t\t\t\tthis.labelContainer.append( place );\n\t\t\t\t} else if ( this.settings.errorPlacement ) {\n\t\t\t\t\tthis.settings.errorPlacement.call( this, place, $( element ) );\n\t\t\t\t} else {\n\t\t\t\t\tplace.insertAfter( element );\n\t\t\t\t}\n\n\t\t\t\t// Link error back to the element\n\t\t\t\tif ( error.is( \"label\" ) ) {\n\n\t\t\t\t\t// If the error is a label, then associate using 'for'\n\t\t\t\t\terror.attr( \"for\", elementID );\n\n\t\t\t\t\t// If the element is not a child of an associated label, then it's necessary\n\t\t\t\t\t// to explicitly apply aria-describedby\n\t\t\t\t} else if ( error.parents( \"label[for='\" + this.escapeCssMeta( elementID ) + \"']\" ).length === 0 ) {\n\t\t\t\t\terrorID = error.attr( \"id\" );\n\n\t\t\t\t\t// Respect existing non-error aria-describedby\n\t\t\t\t\tif ( !describedBy ) {\n\t\t\t\t\t\tdescribedBy = errorID;\n\t\t\t\t\t} else if ( !describedBy.match( new RegExp( \"\\\\b\" + this.escapeCssMeta( errorID ) + \"\\\\b\" ) ) ) {\n\n\t\t\t\t\t\t// Add to end of list if not already present\n\t\t\t\t\t\tdescribedBy += \" \" + errorID;\n\t\t\t\t\t}\n\t\t\t\t\t$( element ).attr( \"aria-describedby\", describedBy );\n\n\t\t\t\t\t// If this element is grouped, then assign to all elements in the same group\n\t\t\t\t\tgroup = this.groups[ element.name ];\n\t\t\t\t\tif ( group ) {\n\t\t\t\t\t\tv = this;\n\t\t\t\t\t\t$.each( v.groups, function( name, testgroup ) {\n\t\t\t\t\t\t\tif ( testgroup === group ) {\n\t\t\t\t\t\t\t\t$( \"[name='\" + v.escapeCssMeta( name ) + \"']\", v.currentForm )\n\t\t\t\t\t\t\t\t\t.attr( \"aria-describedby\", error.attr( \"id\" ) );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( !message && this.settings.success ) {\n\t\t\t\terror.text( \"\" );\n\t\t\t\tif ( typeof this.settings.success === \"string\" ) {\n\t\t\t\t\terror.addClass( this.settings.success );\n\t\t\t\t} else {\n\t\t\t\t\tthis.settings.success( error, element );\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.toShow = this.toShow.add( error );\n\t\t},\n\n\t\terrorsFor: function( element ) {\n\t\t\tvar name = this.escapeCssMeta( this.idOrName( element ) ),\n\t\t\t\tdescriber = $( element ).attr( \"aria-describedby\" ),\n\t\t\t\tselector = \"label[for='\" + name + \"'], label[for='\" + name + \"'] *\";\n\n\t\t\t// 'aria-describedby' should directly reference the error element\n\t\t\tif ( describer ) {\n\t\t\t\tselector = selector + \", #\" + this.escapeCssMeta( describer )\n\t\t\t\t\t.replace( /\\s+/g, \", #\" );\n\t\t\t}\n\n\t\t\treturn this\n\t\t\t\t.errors()\n\t\t\t\t.filter( selector );\n\t\t},\n\n\t\t// See https://api.jquery.com/category/selectors/, for CSS\n\t\t// meta-characters that should be escaped in order to be used with JQuery\n\t\t// as a literal part of a name/id or any selector.\n\t\tescapeCssMeta: function( string ) {\n\t\t\treturn string.replace( /([\\\\!\"#$%&'()*+,./:;<=>?@\\[\\]^`{|}~])/g, \"\\\\$1\" );\n\t\t},\n\n\t\tidOrName: function( element ) {\n\t\t\treturn this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.id || element.name );\n\t\t},\n\n\t\tvalidationTargetFor: function( element ) {\n\n\t\t\t// If radio/checkbox, validate first element in group instead\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\telement = this.findByName( element.name );\n\t\t\t}\n\n\t\t\t// Always apply ignore filter\n\t\t\treturn $( element ).not( this.settings.ignore )[ 0 ];\n\t\t},\n\n\t\tcheckable: function( element ) {\n\t\t\treturn ( /radio|checkbox/i ).test( element.type );\n\t\t},\n\n\t\tfindByName: function( name ) {\n\t\t\treturn $( this.currentForm ).find( \"[name='\" + this.escapeCssMeta( name ) + \"']\" );\n\t\t},\n\n\t\tgetLength: function( value, element ) {\n\t\t\tswitch ( element.nodeName.toLowerCase() ) {\n\t\t\tcase \"select\":\n\t\t\t\treturn $( \"option:selected\", element ).length;\n\t\t\tcase \"input\":\n\t\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\t\treturn this.findByName( element.name ).filter( \":checked\" ).length;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn value.length;\n\t\t},\n\n\t\tdepend: function( param, element ) {\n\t\t\treturn this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true;\n\t\t},\n\n\t\tdependTypes: {\n\t\t\t\"boolean\": function( param ) {\n\t\t\t\treturn param;\n\t\t\t},\n\t\t\t\"string\": function( param, element ) {\n\t\t\t\treturn !!$( param, element.form ).length;\n\t\t\t},\n\t\t\t\"function\": function( param, element ) {\n\t\t\t\treturn param( element );\n\t\t\t}\n\t\t},\n\n\t\toptional: function( element ) {\n\t\t\tvar val = this.elementValue( element );\n\t\t\treturn !$.validator.methods.required.call( this, val, element ) && \"dependency-mismatch\";\n\t\t},\n\n\t\tstartRequest: function( element ) {\n\t\t\tif ( !this.pending[ element.name ] ) {\n\t\t\t\tthis.pendingRequest++;\n\t\t\t\t$( element ).addClass( this.settings.pendingClass );\n\t\t\t\tthis.pending[ element.name ] = true;\n\t\t\t}\n\t\t},\n\n\t\tstopRequest: function( element, valid ) {\n\t\t\tthis.pendingRequest--;\n\n\t\t\t// Sometimes synchronization fails, make sure pendingRequest is never < 0\n\t\t\tif ( this.pendingRequest < 0 ) {\n\t\t\t\tthis.pendingRequest = 0;\n\t\t\t}\n\t\t\tdelete this.pending[ element.name ];\n\t\t\t$( element ).removeClass( this.settings.pendingClass );\n\t\t\tif ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) {\n\t\t\t\t$( this.currentForm ).submit();\n\n\t\t\t\t// Remove the hidden input that was used as a replacement for the\n\t\t\t\t// missing submit button. The hidden input is added by `handle()`\n\t\t\t\t// to ensure that the value of the used submit button is passed on\n\t\t\t\t// for scripted submits triggered by this method\n\t\t\t\tif ( this.submitButton ) {\n\t\t\t\t\t$( \"input:hidden[name='\" + this.submitButton.name + \"']\", this.currentForm ).remove();\n\t\t\t\t}\n\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t} else if ( !valid && this.pendingRequest === 0 && this.formSubmitted ) {\n\t\t\t\t$( this.currentForm ).triggerHandler( \"invalid-form\", [ this ] );\n\t\t\t\tthis.formSubmitted = false;\n\t\t\t}\n\t\t},\n\n\t\tpreviousValue: function( element, method ) {\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\treturn $.data( element, \"previousValue\" ) || $.data( element, \"previousValue\", {\n\t\t\t\told: null,\n\t\t\t\tvalid: true,\n\t\t\t\tmessage: this.defaultMessage( element, { method: method } )\n\t\t\t} );\n\t\t},\n\n\t\t// Cleans up all forms and elements, removes validator-specific events\n\t\tdestroy: function() {\n\t\t\tthis.resetForm();\n\n\t\t\t$( this.currentForm )\n\t\t\t\t.off( \".validate\" )\n\t\t\t\t.removeData( \"validator\" )\n\t\t\t\t.find( \".validate-equalTo-blur\" )\n\t\t\t\t\t.off( \".validate-equalTo\" )\n\t\t\t\t\t.removeClass( \"validate-equalTo-blur\" );\n\t\t}\n\n\t},\n\n\tclassRuleSettings: {\n\t\trequired: { required: true },\n\t\temail: { email: true },\n\t\turl: { url: true },\n\t\tdate: { date: true },\n\t\tdateISO: { dateISO: true },\n\t\tnumber: { number: true },\n\t\tdigits: { digits: true },\n\t\tcreditcard: { creditcard: true }\n\t},\n\n\taddClassRules: function( className, rules ) {\n\t\tif ( className.constructor === String ) {\n\t\t\tthis.classRuleSettings[ className ] = rules;\n\t\t} else {\n\t\t\t$.extend( this.classRuleSettings, className );\n\t\t}\n\t},\n\n\tclassRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tclasses = $( element ).attr( \"class\" );\n\n\t\tif ( classes ) {\n\t\t\t$.each( classes.split( \" \" ), function() {\n\t\t\t\tif ( this in $.validator.classRuleSettings ) {\n\t\t\t\t\t$.extend( rules, $.validator.classRuleSettings[ this ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeAttributeRule: function( rules, type, method, value ) {\n\n\t\t// Convert the value to a number for number inputs, and for text for backwards compability\n\t\t// allows type=\"date\" and others to be compared as strings\n\t\tif ( /min|max|step/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) {\n\t\t\tvalue = Number( value );\n\n\t\t\t// Support Opera Mini, which returns NaN for undefined minlength\n\t\t\tif ( isNaN( value ) ) {\n\t\t\t\tvalue = undefined;\n\t\t\t}\n\t\t}\n\n\t\tif ( value || value === 0 ) {\n\t\t\trules[ method ] = value;\n\t\t} else if ( type === method && type !== \"range\" ) {\n\n\t\t\t// Exception: the jquery validate 'range' method\n\t\t\t// does not test for the html5 'range' type\n\t\t\trules[ method ] = true;\n\t\t}\n\t},\n\n\tattributeRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\n\t\t\t// Support for <input required> in both html5 and older browsers\n\t\t\tif ( method === \"required\" ) {\n\t\t\t\tvalue = element.getAttribute( method );\n\n\t\t\t\t// Some browsers return an empty string for the required attribute\n\t\t\t\t// and non-HTML5 browsers might have required=\"\" markup\n\t\t\t\tif ( value === \"\" ) {\n\t\t\t\t\tvalue = true;\n\t\t\t\t}\n\n\t\t\t\t// Force non-HTML5 browsers to return bool\n\t\t\t\tvalue = !!value;\n\t\t\t} else {\n\t\t\t\tvalue = $element.attr( method );\n\t\t\t}\n\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\n\t\t// 'maxlength' may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs\n\t\tif ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) {\n\t\t\tdelete rules.maxlength;\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\tdataRules: function( element ) {\n\t\tvar rules = {},\n\t\t\t$element = $( element ),\n\t\t\ttype = element.getAttribute( \"type\" ),\n\t\t\tmethod, value;\n\n\t\tfor ( method in $.validator.methods ) {\n\t\t\tvalue = $element.data( \"rule\" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() );\n\t\t\tthis.normalizeAttributeRule( rules, type, method, value );\n\t\t}\n\t\treturn rules;\n\t},\n\n\tstaticRules: function( element ) {\n\t\tvar rules = {},\n\t\t\tvalidator = $.data( element.form, \"validator\" );\n\n\t\tif ( validator.settings.rules ) {\n\t\t\trules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {};\n\t\t}\n\t\treturn rules;\n\t},\n\n\tnormalizeRules: function( rules, element ) {\n\n\t\t// Handle dependency check\n\t\t$.each( rules, function( prop, val ) {\n\n\t\t\t// Ignore rule when param is explicitly false, eg. required:false\n\t\t\tif ( val === false ) {\n\t\t\t\tdelete rules[ prop ];\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( val.param || val.depends ) {\n\t\t\t\tvar keepRule = true;\n\t\t\t\tswitch ( typeof val.depends ) {\n\t\t\t\tcase \"string\":\n\t\t\t\t\tkeepRule = !!$( val.depends, element.form ).length;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"function\":\n\t\t\t\t\tkeepRule = val.depends.call( element, element );\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( keepRule ) {\n\t\t\t\t\trules[ prop ] = val.param !== undefined ? val.param : true;\n\t\t\t\t} else {\n\t\t\t\t\t$.data( element.form, \"validator\" ).resetElements( $( element ) );\n\t\t\t\t\tdelete rules[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\t// Evaluate parameters\n\t\t$.each( rules, function( rule, parameter ) {\n\t\t\trules[ rule ] = $.isFunction( parameter ) && rule !== \"normalizer\" ? parameter( element ) : parameter;\n\t\t} );\n\n\t\t// Clean number parameters\n\t\t$.each( [ \"minlength\", \"maxlength\" ], function() {\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\trules[ this ] = Number( rules[ this ] );\n\t\t\t}\n\t\t} );\n\t\t$.each( [ \"rangelength\", \"range\" ], function() {\n\t\t\tvar parts;\n\t\t\tif ( rules[ this ] ) {\n\t\t\t\tif ( $.isArray( rules[ this ] ) ) {\n\t\t\t\t\trules[ this ] = [ Number( rules[ this ][ 0 ] ), Number( rules[ this ][ 1 ] ) ];\n\t\t\t\t} else if ( typeof rules[ this ] === \"string\" ) {\n\t\t\t\t\tparts = rules[ this ].replace( /[\\[\\]]/g, \"\" ).split( /[\\s,]+/ );\n\t\t\t\t\trules[ this ] = [ Number( parts[ 0 ] ), Number( parts[ 1 ] ) ];\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tif ( $.validator.autoCreateRanges ) {\n\n\t\t\t// Auto-create ranges\n\t\t\tif ( rules.min != null && rules.max != null ) {\n\t\t\t\trules.range = [ rules.min, rules.max ];\n\t\t\t\tdelete rules.min;\n\t\t\t\tdelete rules.max;\n\t\t\t}\n\t\t\tif ( rules.minlength != null && rules.maxlength != null ) {\n\t\t\t\trules.rangelength = [ rules.minlength, rules.maxlength ];\n\t\t\t\tdelete rules.minlength;\n\t\t\t\tdelete rules.maxlength;\n\t\t\t}\n\t\t}\n\n\t\treturn rules;\n\t},\n\n\t// Converts a simple string to a {string: true} rule, e.g., \"required\" to {required:true}\n\tnormalizeRule: function( data ) {\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tvar transformed = {};\n\t\t\t$.each( data.split( /\\s/ ), function() {\n\t\t\t\ttransformed[ this ] = true;\n\t\t\t} );\n\t\t\tdata = transformed;\n\t\t}\n\t\treturn data;\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.addMethod/\n\taddMethod: function( name, method, message ) {\n\t\t$.validator.methods[ name ] = method;\n\t\t$.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ];\n\t\tif ( method.length < 3 ) {\n\t\t\t$.validator.addClassRules( name, $.validator.normalizeRule( name ) );\n\t\t}\n\t},\n\n\t// https://jqueryvalidation.org/jQuery.validator.methods/\n\tmethods: {\n\n\t\t// https://jqueryvalidation.org/required-method/\n\t\trequired: function( value, element, param ) {\n\n\t\t\t// Check if dependency is met\n\t\t\tif ( !this.depend( param, element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\t\t\tif ( element.nodeName.toLowerCase() === \"select\" ) {\n\n\t\t\t\t// Could be an array for select-multiple or a string, both are fine this way\n\t\t\t\tvar val = $( element ).val();\n\t\t\t\treturn val && val.length > 0;\n\t\t\t}\n\t\t\tif ( this.checkable( element ) ) {\n\t\t\t\treturn this.getLength( value, element ) > 0;\n\t\t\t}\n\t\t\treturn value.length > 0;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/email-method/\n\t\temail: function( value, element ) {\n\n\t\t\t// From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address\n\t\t\t// Retrieved 2014-01-14\n\t\t\t// If you have a problem with this implementation, report a bug against the above spec\n\t\t\t// Or use custom methods to implement your own email validation\n\t\t\treturn this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/url-method/\n\t\turl: function( value, element ) {\n\n\t\t\t// Copyright (c) 2010-2013 Diego Perini, MIT licensed\n\t\t\t// https://gist.github.com/dperini/729294\n\t\t\t// see also https://mathiasbynens.be/demo/url-regex\n\t\t\t// modified to allow protocol-relative URLs\n\t\t\treturn this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!(?:10|127)(?:\\.\\d{1,3}){3})(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})).?)(?::\\d{2,5})?(?:[/?#]\\S*)?$/i.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/date-method/\n\t\tdate: function( value, element ) {\n\t\t\treturn this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/dateISO-method/\n\t\tdateISO: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/number-method/\n\t\tnumber: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^(?:-?\\d+|-?\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/digits-method/\n\t\tdigits: function( value, element ) {\n\t\t\treturn this.optional( element ) || /^\\d+$/.test( value );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/minlength-method/\n\t\tminlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/maxlength-method/\n\t\tmaxlength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || length <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/rangelength-method/\n\t\trangelength: function( value, element, param ) {\n\t\t\tvar length = $.isArray( value ) ? value.length : this.getLength( value, element );\n\t\t\treturn this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/min-method/\n\t\tmin: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value >= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/max-method/\n\t\tmax: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || value <= param;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/range-method/\n\t\trange: function( value, element, param ) {\n\t\t\treturn this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] );\n\t\t},\n\n\t\t// https://jqueryvalidation.org/step-method/\n\t\tstep: function( value, element, param ) {\n\t\t\tvar type = $( element ).attr( \"type\" ),\n\t\t\t\terrorMessage = \"Step attribute on input type \" + type + \" is not supported.\",\n\t\t\t\tsupportedTypes = [ \"text\", \"number\", \"range\" ],\n\t\t\t\tre = new RegExp( \"\\\\b\" + type + \"\\\\b\" ),\n\t\t\t\tnotSupported = type && !re.test( supportedTypes.join() ),\n\t\t\t\tdecimalPlaces = function( num ) {\n\t\t\t\t\tvar match = ( \"\" + num ).match( /(?:\\.(\\d+))?$/ );\n\t\t\t\t\tif ( !match ) {\n\t\t\t\t\t\treturn 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Number of digits right of decimal point.\n\t\t\t\t\treturn match[ 1 ] ? match[ 1 ].length : 0;\n\t\t\t\t},\n\t\t\t\ttoInt = function( num ) {\n\t\t\t\t\treturn Math.round( num * Math.pow( 10, decimals ) );\n\t\t\t\t},\n\t\t\t\tvalid = true,\n\t\t\t\tdecimals;\n\n\t\t\t// Works only for text, number and range input types\n\t\t\t// TODO find a way to support input types date, datetime, datetime-local, month, time and week\n\t\t\tif ( notSupported ) {\n\t\t\t\tthrow new Error( errorMessage );\n\t\t\t}\n\n\t\t\tdecimals = decimalPlaces( param );\n\n\t\t\t// Value can't have too many decimals\n\t\t\tif ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) {\n\t\t\t\tvalid = false;\n\t\t\t}\n\n\t\t\treturn this.optional( element ) || valid;\n\t\t},\n\n\t\t// https://jqueryvalidation.org/equalTo-method/\n\t\tequalTo: function( value, element, param ) {\n\n\t\t\t// Bind to the blur event of the target in order to revalidate whenever the target field is updated\n\t\t\tvar target = $( param );\n\t\t\tif ( this.settings.onfocusout && target.not( \".validate-equalTo-blur\" ).length ) {\n\t\t\t\ttarget.addClass( \"validate-equalTo-blur\" ).on( \"blur.validate-equalTo\", function() {\n\t\t\t\t\t$( element ).valid();\n\t\t\t\t} );\n\t\t\t}\n\t\t\treturn value === target.val();\n\t\t},\n\n\t\t// https://jqueryvalidation.org/remote-method/\n\t\tremote: function( value, element, param, method ) {\n\t\t\tif ( this.optional( element ) ) {\n\t\t\t\treturn \"dependency-mismatch\";\n\t\t\t}\n\n\t\t\tmethod = typeof method === \"string\" && method || \"remote\";\n\n\t\t\tvar previous = this.previousValue( element, method ),\n\t\t\t\tvalidator, data, optionDataString;\n\n\t\t\tif ( !this.settings.messages[ element.name ] ) {\n\t\t\t\tthis.settings.messages[ element.name ] = {};\n\t\t\t}\n\t\t\tprevious.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];\n\t\t\tthis.settings.messages[ element.name ][ method ] = previous.message;\n\n\t\t\tparam = typeof param === \"string\" && { url: param } || param;\n\t\t\toptionDataString = $.param( $.extend( { data: value }, param.data ) );\n\t\t\tif ( previous.old === optionDataString ) {\n\t\t\t\treturn previous.valid;\n\t\t\t}\n\n\t\t\tprevious.old = optionDataString;\n\t\t\tvalidator = this;\n\t\t\tthis.startRequest( element );\n\t\t\tdata = {};\n\t\t\tdata[ element.name ] = value;\n\t\t\t$.ajax( $.extend( true, {\n\t\t\t\tmode: \"abort\",\n\t\t\t\tport: \"validate\" + element.name,\n\t\t\t\tdataType: \"json\",\n\t\t\t\tdata: data,\n\t\t\t\tcontext: validator.currentForm,\n\t\t\t\tsuccess: function( response ) {\n\t\t\t\t\tvar valid = response === true || response === \"true\",\n\t\t\t\t\t\terrors, message, submitted;\n\n\t\t\t\t\tvalidator.settings.messages[ element.name ][ method ] = previous.originalMessage;\n\t\t\t\t\tif ( valid ) {\n\t\t\t\t\t\tsubmitted = validator.formSubmitted;\n\t\t\t\t\t\tvalidator.resetInternals();\n\t\t\t\t\t\tvalidator.toHide = validator.errorsFor( element );\n\t\t\t\t\t\tvalidator.formSubmitted = submitted;\n\t\t\t\t\t\tvalidator.successList.push( element );\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = false;\n\t\t\t\t\t\tvalidator.showErrors();\n\t\t\t\t\t} else {\n\t\t\t\t\t\terrors = {};\n\t\t\t\t\t\tmessage = response || validator.defaultMessage( element, { method: method, parameters: value } );\n\t\t\t\t\t\terrors[ element.name ] = previous.message = message;\n\t\t\t\t\t\tvalidator.invalid[ element.name ] = true;\n\t\t\t\t\t\tvalidator.showErrors( errors );\n\t\t\t\t\t}\n\t\t\t\t\tprevious.valid = valid;\n\t\t\t\t\tvalidator.stopRequest( element, valid );\n\t\t\t\t}\n\t\t\t}, param ) );\n\t\t\treturn \"pending\";\n\t\t}\n\t}\n\n} );\n\n// Ajax mode: abort\n// usage: $.ajax({ mode: \"abort\"[, port: \"uniqueport\"]});\n// if mode:\"abort\" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort()\n\nvar pendingRequests = {},\n\tajax;\n\n// Use a prefilter if available (1.5+)\nif ( $.ajaxPrefilter ) {\n\t$.ajaxPrefilter( function( settings, _, xhr ) {\n\t\tvar port = settings.port;\n\t\tif ( settings.mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = xhr;\n\t\t}\n\t} );\n} else {\n\n\t// Proxy ajax\n\tajax = $.ajax;\n\t$.ajax = function( settings ) {\n\t\tvar mode = ( \"mode\" in settings ? settings : $.ajaxSettings ).mode,\n\t\t\tport = ( \"port\" in settings ? settings : $.ajaxSettings ).port;\n\t\tif ( mode === \"abort\" ) {\n\t\t\tif ( pendingRequests[ port ] ) {\n\t\t\t\tpendingRequests[ port ].abort();\n\t\t\t}\n\t\t\tpendingRequests[ port ] = ajax.apply( this, arguments );\n\t\t\treturn pendingRequests[ port ];\n\t\t}\n\t\treturn ajax.apply( this, arguments );\n\t};\n}\nreturn $;\n}));"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt",
    "content": "Copyright (c) .NET Foundation. All rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\nthese files except in compliance with the License. You may obtain a copy of the\nLicense at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed\nunder the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR\nCONDITIONS OF ANY KIND, either express or implied. See the License for the\nspecific language governing permissions and limitations under the License.\n"
  },
  {
    "path": "Demo/2021/NewTemplatesInNet6/WebApplication2/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js",
    "content": "// Unobtrusive validation support library for jQuery and jQuery Validate\n// Copyright (c) .NET Foundation. All rights reserved.\n// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.\n// @version v3.2.11\n\n/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */\n/*global document: false, jQuery: false */\n\n(function (factory) {\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(\"jquery.validate.unobtrusive\", ['jquery-validation'], factory);\n    } else if (typeof module === 'object' && module.exports) {\n        // CommonJS-like environments that support module.exports     \n        module.exports = factory(require('jquery-validation'));\n    } else {\n        // Browser global\n        jQuery.validator.unobtrusive = factory(jQuery);\n    }\n}(function ($) {\n    var $jQval = $.validator,\n        adapters,\n        data_validation = \"unobtrusiveValidation\";\n\n    function setValidationValues(options, ruleName, value) {\n        options.rules[ruleName] = value;\n        if (options.message) {\n            options.messages[ruleName] = options.message;\n        }\n    }\n\n    function splitAndTrim(value) {\n        return value.replace(/^\\s+|\\s+$/g, \"\").split(/\\s*,\\s*/g);\n    }\n\n    function escapeAttributeValue(value) {\n        // As mentioned on http://api.jquery.com/category/selectors/\n        return value.replace(/([!\"#$%&'()*+,./:;<=>?@\\[\\\\\\]^`{|}~])/g, \"\\\\$1\");\n    }\n\n    function getModelPrefix(fieldName) {\n        return fieldName.substr(0, fieldName.lastIndexOf(\".\") + 1);\n    }\n\n    function appendModelPrefix(value, prefix) {\n        if (value.indexOf(\"*.\") === 0) {\n            value = value.replace(\"*.\", prefix);\n        }\n        return value;\n    }\n\n    function onError(error, inputElement) {  // 'this' is the form element\n        var container = $(this).find(\"[data-valmsg-for='\" + escapeAttributeValue(inputElement[0].name) + \"']\"),\n            replaceAttrValue = container.attr(\"data-valmsg-replace\"),\n            replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;\n\n        container.removeClass(\"field-validation-valid\").addClass(\"field-validation-error\");\n        error.data(\"unobtrusiveContainer\", container);\n\n        if (replace) {\n            container.empty();\n            error.removeClass(\"input-validation-error\").appendTo(container);\n        }\n        else {\n            error.hide();\n        }\n    }\n\n    function onErrors(event, validator) {  // 'this' is the form element\n        var container = $(this).find(\"[data-valmsg-summary=true]\"),\n            list = container.find(\"ul\");\n\n        if (list && list.length && validator.errorList.length) {\n            list.empty();\n            container.addClass(\"validation-summary-errors\").removeClass(\"validation-summary-valid\");\n\n            $.each(validator.errorList, function () {\n                $(\"<li />\").html(this.message).appendTo(list);\n            });\n        }\n    }\n\n    function onSuccess(error) {  // 'this' is the form element\n        var container = error.data(\"unobtrusiveContainer\");\n\n        if (container) {\n            var replaceAttrValue = container.attr(\"data-valmsg-replace\"),\n                replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;\n\n            container.addClass(\"field-validation-valid\").removeClass(\"field-validation-error\");\n            error.removeData(\"unobtrusiveContainer\");\n\n            if (replace) {\n                container.empty();\n            }\n        }\n    }\n\n    function onReset(event) {  // 'this' is the form element\n        var $form = $(this),\n            key = '__jquery_unobtrusive_validation_form_reset';\n        if ($form.data(key)) {\n            return;\n        }\n        // Set a flag that indicates we're currently resetting the form.\n        $form.data(key, true);\n        try {\n            $form.data(\"validator\").resetForm();\n        } finally {\n            $form.removeData(key);\n        }\n\n        $form.find(\".validation-summary-errors\")\n            .addClass(\"validation-summary-valid\")\n            .removeClass(\"validation-summary-errors\");\n        $form.find(\".field-validation-error\")\n            .addClass(\"field-validation-valid\")\n            .removeClass(\"field-validation-error\")\n            .removeData(\"unobtrusiveContainer\")\n            .find(\">*\")  // If we were using valmsg-replace, get the underlying error\n            .removeData(\"unobtrusiveContainer\");\n    }\n\n    function validationInfo(form) {\n        var $form = $(form),\n            result = $form.data(data_validation),\n            onResetProxy = $.proxy(onReset, form),\n            defaultOptions = $jQval.unobtrusive.options || {},\n            execInContext = function (name, args) {\n                var func = defaultOptions[name];\n                func && $.isFunction(func) && func.apply(form, args);\n            };\n\n        if (!result) {\n            result = {\n                options: {  // options structure passed to jQuery Validate's validate() method\n                    errorClass: defaultOptions.errorClass || \"input-validation-error\",\n                    errorElement: defaultOptions.errorElement || \"span\",\n                    errorPlacement: function () {\n                        onError.apply(form, arguments);\n                        execInContext(\"errorPlacement\", arguments);\n                    },\n                    invalidHandler: function () {\n                        onErrors.apply(form, arguments);\n                        execInContext(\"invalidHandler\", arguments);\n                    },\n                    messages: {},\n                    rules: {},\n                    success: function () {\n                        onSuccess.apply(form, arguments);\n                        execInContext(\"success\", arguments);\n                    }\n                },\n                attachValidation: function () {\n                    $form\n                        .off(\"reset.\" + data_validation, onResetProxy)\n                        .on(\"reset.\" + data_validation, onResetProxy)\n                        .validate(this.options);\n                },\n                validate: function () {  // a validation function that is called by unobtrusive Ajax\n                    $form.validate();\n                    return $form.valid();\n                }\n            };\n            $form.data(data_validation, result);\n        }\n\n        return result;\n    }\n\n    $jQval.unobtrusive = {\n        adapters: [],\n\n        parseElement: function (element, skipAttach) {\n            /// <summary>\n            /// Parses a single HTML element for unobtrusive validation attributes.\n            /// </summary>\n            /// <param name=\"element\" domElement=\"true\">The HTML element to be parsed.</param>\n            /// <param name=\"skipAttach\" type=\"Boolean\">[Optional] true to skip attaching the\n            /// validation to the form. If parsing just this single element, you should specify true.\n            /// If parsing several elements, you should specify false, and manually attach the validation\n            /// to the form when you are finished. The default is false.</param>\n            var $element = $(element),\n                form = $element.parents(\"form\")[0],\n                valInfo, rules, messages;\n\n            if (!form) {  // Cannot do client-side validation without a form\n                return;\n            }\n\n            valInfo = validationInfo(form);\n            valInfo.options.rules[element.name] = rules = {};\n            valInfo.options.messages[element.name] = messages = {};\n\n            $.each(this.adapters, function () {\n                var prefix = \"data-val-\" + this.name,\n                    message = $element.attr(prefix),\n                    paramValues = {};\n\n                if (message !== undefined) {  // Compare against undefined, because an empty message is legal (and falsy)\n                    prefix += \"-\";\n\n                    $.each(this.params, function () {\n                        paramValues[this] = $element.attr(prefix + this);\n                    });\n\n                    this.adapt({\n                        element: element,\n                        form: form,\n                        message: message,\n                        params: paramValues,\n                        rules: rules,\n                        messages: messages\n                    });\n                }\n            });\n\n            $.extend(rules, { \"__dummy__\": true });\n\n            if (!skipAttach) {\n                valInfo.attachValidation();\n            }\n        },\n\n        parse: function (selector) {\n            /// <summary>\n            /// Parses all the HTML elements in the specified selector. It looks for input elements decorated\n            /// with the [data-val=true] attribute value and enables validation according to the data-val-*\n            /// attribute values.\n            /// </summary>\n            /// <param name=\"selector\" type=\"String\">Any valid jQuery selector.</param>\n\n            // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one\n            // element with data-val=true\n            var $selector = $(selector),\n                $forms = $selector.parents()\n                    .addBack()\n                    .filter(\"form\")\n                    .add($selector.find(\"form\"))\n                    .has(\"[data-val=true]\");\n\n            $selector.find(\"[data-val=true]\").each(function () {\n                $jQval.unobtrusive.parseElement(this, true);\n            });\n\n            $forms.each(function () {\n                var info = validationInfo(this);\n                if (info) {\n                    info.attachValidation();\n                }\n            });\n        }\n    };\n\n    adapters = $jQval.unobtrusive.adapters;\n\n    adapters.add = function (adapterName, params, fn) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\n        /// <param name=\"params\" type=\"Array\" optional=\"true\">[Optional] An array of parameter names (strings) that will\n        /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and\n        /// mmmm is the parameter name).</param>\n        /// <param name=\"fn\" type=\"Function\">The function to call, which adapts the values from the HTML\n        /// attributes into jQuery Validate rules and/or messages.</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        if (!fn) {  // Called with no params, just a function\n            fn = params;\n            params = [];\n        }\n        this.push({ name: adapterName, params: params, adapt: fn });\n        return this;\n    };\n\n    adapters.addBool = function (adapterName, ruleName) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\n        /// the jQuery Validate validation rule has no parameter values.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\n        /// <param name=\"ruleName\" type=\"String\" optional=\"true\">[Optional] The name of the jQuery Validate rule. If not provided, the value\n        /// of adapterName will be used instead.</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        return this.add(adapterName, function (options) {\n            setValidationValues(options, ruleName || adapterName, true);\n        });\n    };\n\n    adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\n        /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and\n        /// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>\n        /// <param name=\"minRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you only\n        /// have a minimum value.</param>\n        /// <param name=\"maxRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you only\n        /// have a maximum value.</param>\n        /// <param name=\"minMaxRuleName\" type=\"String\">The name of the jQuery Validate rule to be used when you\n        /// have both a minimum and maximum value.</param>\n        /// <param name=\"minAttribute\" type=\"String\" optional=\"true\">[Optional] The name of the HTML attribute that\n        /// contains the minimum value. The default is \"min\".</param>\n        /// <param name=\"maxAttribute\" type=\"String\" optional=\"true\">[Optional] The name of the HTML attribute that\n        /// contains the maximum value. The default is \"max\".</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        return this.add(adapterName, [minAttribute || \"min\", maxAttribute || \"max\"], function (options) {\n            var min = options.params.min,\n                max = options.params.max;\n\n            if (min && max) {\n                setValidationValues(options, minMaxRuleName, [min, max]);\n            }\n            else if (min) {\n                setValidationValues(options, minRuleName, min);\n            }\n            else if (max) {\n                setValidationValues(options, maxRuleName, max);\n            }\n        });\n    };\n\n    adapters.addSingleVal = function (adapterName, attribute, ruleName) {\n        /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where\n        /// the jQuery Validate validation rule has a single value.</summary>\n        /// <param name=\"adapterName\" type=\"String\">The name of the adapter to be added. This matches the name used\n        /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>\n        /// <param name=\"attribute\" type=\"String\">[Optional] The name of the HTML attribute that contains the value.\n        /// The default is \"val\".</param>\n        /// <param name=\"ruleName\" type=\"String\" optional=\"true\">[Optional] The name of the jQuery Validate rule. If not provided, the value\n        /// of adapterName will be used instead.</param>\n        /// <returns type=\"jQuery.validator.unobtrusive.adapters\" />\n        return this.add(adapterName, [attribute || \"val\"], function (options) {\n            setValidationValues(options, ruleName || adapterName, options.params[attribute]);\n        });\n    };\n\n    $jQval.addMethod(\"__dummy__\", function (value, element, params) {\n        return true;\n    });\n\n    $jQval.addMethod(\"regex\", function (value, element, params) {\n        var match;\n        if (this.optional(element)) {\n            return true;\n        }\n\n        match = new RegExp(params).exec(value);\n        return (match && (match.index === 0) && (match[0].length === value.length));\n    });\n\n    $jQval.addMethod(\"nonalphamin\", function (value, element, nonalphamin) {\n        var match;\n        if (nonalphamin) {\n            match = value.match(/\\W/g);\n            match = match && match.length >= nonalphamin;\n        }\n        return match;\n    });\n\n    if ($jQval.methods.extension) {\n        adapters.addSingleVal(\"accept\", \"mimtype\");\n        adapters.addSingleVal(\"extension\", \"extension\");\n    } else {\n        // for backward compatibility, when the 'extension' validation method does not exist, such as with versions\n        // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for\n        // validating the extension, and ignore mime-type validations as they are not supported.\n        adapters.addSingleVal(\"extension\", \"extension\", \"accept\");\n    }\n\n    adapters.addSingleVal(\"regex\", \"pattern\");\n    adapters.addBool(\"creditcard\").addBool(\"date\").addBool(\"digits\").addBool(\"email\").addBool(\"number\").addBool(\"url\");\n    adapters.addMinMax(\"length\", \"minlength\", \"maxlength\", \"rangelength\").addMinMax(\"range\", \"min\", \"max\", \"range\");\n    adapters.addMinMax(\"minlength\", \"minlength\").addMinMax(\"maxlength\", \"minlength\", \"maxlength\");\n    adapters.add(\"equalto\", [\"other\"], function (options) {\n        var prefix = getModelPrefix(options.element.name),\n            other = options.params.other,\n            fullOtherName = appendModelPrefix(other, prefix),\n            element = $(options.form).find(\":input\").filter(\"[name='\" + escapeAttributeValue(fullOtherName) + \"']\")[0];\n\n        setValidationValues(options, \"equalTo\", element);\n    });\n    adapters.add(\"required\", function (options) {\n        // jQuery Validate equates \"required\" with \"mandatory\" for checkbox elements\n        if (options.element.tagName.toUpperCase() !== \"INPUT\" || options.element.type.toUpperCase() !== \"CHECKBOX\") {\n            setValidationValues(options, \"required\", true);\n        }\n    });\n    adapters.add(\"remote\", [\"url\", \"type\", \"additionalfields\"], function (options) {\n        var value = {\n            url: options.params.url,\n            type: options.params.type || \"GET\",\n            data: {}\n        },\n            prefix = getModelPrefix(options.element.name);\n\n        $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {\n            var paramName = appendModelPrefix(fieldName, prefix);\n            value.data[paramName] = function () {\n                var field = $(options.form).find(\":input\").filter(\"[name='\" + escapeAttributeValue(paramName) + \"']\");\n                // For checkboxes and radio buttons, only pick up values from checked fields.\n                if (field.is(\":checkbox\")) {\n                    return field.filter(\":checked\").val() || field.filter(\":hidden\").val() || '';\n                }\n                else if (field.is(\":radio\")) {\n                    return field.filter(\":checked\").val() || '';\n                }\n                return field.val();\n            };\n        });\n\n        setValidationValues(options, \"remote\", value);\n    });\n    adapters.add(\"password\", [\"min\", \"nonalphamin\", \"regex\"], function (options) {\n        if (options.params.min) {\n            setValidationValues(options, \"minlength\", options.params.min);\n        }\n        if (options.params.nonalphamin) {\n            setValidationValues(options, \"nonalphamin\", options.params.nonalphamin);\n        }\n        if (options.params.regex) {\n            setValidationValues(options, \"regex\", options.params.regex);\n        }\n    });\n    adapters.add(\"fileextensions\", [\"extensions\"], function (options) {\n        setValidationValues(options, \"extension\", options.params.extensions);\n    });\n\n    $(function () {\n        $jQval.unobtrusive.parse(document);\n    });\n\n    return $jQval.unobtrusive;\n}));\n"
  },
  {
    "path": "Demo/2021/NoThrowAwaiter/NoThrowAwaiter/IgnoreCancelBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace NoThrowAwaiter\n{\n    public class IgnoreCancelBenchmark\n    {\n        private const int N = 200;\n\n        [Benchmark]\n        public async Task TryCatch()\n        {\n            for (int i = 0; i < N; i++)\n            {\n                try\n                {\n                    await Throw().ConfigureAwait(false);\n                }\n                catch (OperationCanceledException)\n                {\n                    // ignore cancel\n                }\n            }\n        }\n\n        [Benchmark]\n        public async Task NoThrow()\n        {\n            for (int i = 0; i < N; i++)\n            {\n                await Throw().NoThrowOnCancel(false);\n            }\n        }\n\n        private static async Task Throw()\n        {\n            await Task.Yield();\n            await Task.Yield();\n            await Task.Yield();\n            throw new TaskCanceledException();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2021/NoThrowAwaiter/NoThrowAwaiter/NoThrowAwaiter.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net5.0</TargetFramework>\n    <LangVersion>9.0</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.12.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2021/NoThrowAwaiter/NoThrowAwaiter/NoThrowOnCancelAwaiter.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Threading.Tasks;\n\nnamespace NoThrowAwaiter\n{\n    public struct NoThrowOnCancelAwaiter : ICriticalNotifyCompletion\n    {\n        private readonly Task _t;\n        private readonly bool _continueOnCapturedContext;\n        internal NoThrowOnCancelAwaiter(Task task, bool continueOnCapturedContext) { _t = task; _continueOnCapturedContext = continueOnCapturedContext; }\n        public bool IsCompleted { get { return _t.IsCompleted; } }\n        public ResultOrCancel GetResult() => ResultOrCancel.FromTask(_t);\n        public void OnCompleted(Action continuation) => _t.ConfigureAwait(_continueOnCapturedContext).GetAwaiter().OnCompleted(continuation);\n        public void UnsafeOnCompleted(Action continuation) => _t.ConfigureAwait(_continueOnCapturedContext).GetAwaiter().UnsafeOnCompleted(continuation);\n        public NoThrowOnCancelAwaiter GetAwaiter() => this;\n    }\n}\n"
  },
  {
    "path": "Demo/2021/NoThrowAwaiter/NoThrowAwaiter/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\nusing NoThrowAwaiter;\n\nBenchmarkRunner.Run<IgnoreCancelBenchmark>();\n"
  },
  {
    "path": "Demo/2021/NoThrowAwaiter/NoThrowAwaiter/ResultOrCancel.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\n\nnamespace NoThrowAwaiter\n{\n    public struct ResultOrCancel\n    {\n        private ResultOrCancel(bool ranToCompetion) => IsCompletedSuccessfully = ranToCompetion;\n\n        public bool IsCompletedSuccessfully { get; }\n        public bool IsCanceled => !IsCompletedSuccessfully;\n\n        internal static ResultOrCancel FromTask(Task t)\n        {\n            if (t.IsCanceled) return default;\n            if (t.Exception?.InnerException is OperationCanceledException) return default;\n            t.GetAwaiter().GetResult();\n            return new(true);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2021/NoThrowAwaiter/NoThrowAwaiter/TaskExtensions.cs",
    "content": "﻿using System.Threading.Tasks;\n\nnamespace NoThrowAwaiter\n{\n    public static class TaskExtensions\n    {\n        public static NoThrowOnCancelAwaiter NoThrowOnCancel(this Task t, bool continueOnCapturedContext = true) => new(t, continueOnCapturedContext);\n    }\n}\n"
  },
  {
    "path": "Demo/2021/NoThrowAwaiter/NoThrowAwaiter.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.31004.235\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NoThrowAwaiter\", \"NoThrowAwaiter\\NoThrowAwaiter.csproj\", \"{8D5F88BA-70BA-4A59-AE56-4743418C7652}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{8D5F88BA-70BA-4A59-AE56-4743418C7652}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8D5F88BA-70BA-4A59-AE56-4743418C7652}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8D5F88BA-70BA-4A59-AE56-4743418C7652}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8D5F88BA-70BA-4A59-AE56-4743418C7652}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {D29C5568-B52E-4411-AECA-1BA26BAA81AF}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2022/Algebra/Algebra/Algebra.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n    <LangVersion>preview</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Algebra/Algebra/Constants/IConstant.cs",
    "content": "﻿namespace Algebra.Constants;\n\npublic interface IConstant<T>\n{\n    static abstract T Value { get; }\n}\n\npublic struct Constant<T, TBase, N> : IConstant<T>\n    where T : IImplicitConversion<T, TBase>\n    where N : IConstant<TBase>\n{\n    public static T Value { get; } = N.Value;\n}\n"
  },
  {
    "path": "Demo/2022/Algebra/Algebra/Constants/IntConstants.cs",
    "content": "﻿namespace Algebra.Constants;\n\npublic struct _0 : IConstant<int> { public static int Value => 0; }\npublic struct _1 : IConstant<int> { public static int Value => 1; }\npublic struct _2 : IConstant<int> { public static int Value => 2; }\npublic struct _3 : IConstant<int> { public static int Value => 3; }\npublic struct _4 : IConstant<int> { public static int Value => 4; }\npublic struct _5 : IConstant<int> { public static int Value => 5; }\npublic struct _6 : IConstant<int> { public static int Value => 6; }\npublic struct _7 : IConstant<int> { public static int Value => 7; }\npublic struct _8 : IConstant<int> { public static int Value => 8; }\npublic struct _9 : IConstant<int> { public static int Value => 9; }\npublic struct _10 : IConstant<int> { public static int Value => 10; }\npublic struct _11 : IConstant<int> { public static int Value => 11; }\npublic struct _12 : IConstant<int> { public static int Value => 12; }\npublic struct _13 : IConstant<int> { public static int Value => 13; }\npublic struct _14 : IConstant<int> { public static int Value => 14; }\npublic struct _15 : IConstant<int> { public static int Value => 15; }\npublic struct _16 : IConstant<int> { public static int Value => 16; }\npublic struct _17 : IConstant<int> { public static int Value => 17; }\npublic struct _18 : IConstant<int> { public static int Value => 18; }\npublic struct _19 : IConstant<int> { public static int Value => 19; }\npublic struct _20 : IConstant<int> { public static int Value => 20; }\npublic struct _21 : IConstant<int> { public static int Value => 21; }\npublic struct _22 : IConstant<int> { public static int Value => 22; }\npublic struct _23 : IConstant<int> { public static int Value => 23; }\npublic struct _24 : IConstant<int> { public static int Value => 24; }\npublic struct _25 : IConstant<int> { public static int Value => 25; }\npublic struct _26 : IConstant<int> { public static int Value => 26; }\npublic struct _27 : IConstant<int> { public static int Value => 27; }\npublic struct _28 : IConstant<int> { public static int Value => 28; }\npublic struct _29 : IConstant<int> { public static int Value => 29; }\npublic struct _30 : IConstant<int> { public static int Value => 30; }\npublic struct _31 : IConstant<int> { public static int Value => 31; }\npublic struct _32 : IConstant<int> { public static int Value => 32; }\npublic struct _33 : IConstant<int> { public static int Value => 33; }\npublic struct _34 : IConstant<int> { public static int Value => 34; }\npublic struct _35 : IConstant<int> { public static int Value => 35; }\npublic struct _36 : IConstant<int> { public static int Value => 36; }\npublic struct _37 : IConstant<int> { public static int Value => 37; }\npublic struct _38 : IConstant<int> { public static int Value => 38; }\npublic struct _39 : IConstant<int> { public static int Value => 39; }\npublic struct _40 : IConstant<int> { public static int Value => 40; }\npublic struct _41 : IConstant<int> { public static int Value => 41; }\npublic struct _42 : IConstant<int> { public static int Value => 42; }\npublic struct _43 : IConstant<int> { public static int Value => 43; }\npublic struct _44 : IConstant<int> { public static int Value => 44; }\npublic struct _45 : IConstant<int> { public static int Value => 45; }\npublic struct _46 : IConstant<int> { public static int Value => 46; }\npublic struct _47 : IConstant<int> { public static int Value => 47; }\npublic struct _48 : IConstant<int> { public static int Value => 48; }\npublic struct _49 : IConstant<int> { public static int Value => 49; }\npublic struct _50 : IConstant<int> { public static int Value => 50; }\npublic struct _51 : IConstant<int> { public static int Value => 51; }\npublic struct _52 : IConstant<int> { public static int Value => 52; }\npublic struct _53 : IConstant<int> { public static int Value => 53; }\npublic struct _54 : IConstant<int> { public static int Value => 54; }\npublic struct _55 : IConstant<int> { public static int Value => 55; }\npublic struct _56 : IConstant<int> { public static int Value => 56; }\npublic struct _57 : IConstant<int> { public static int Value => 57; }\npublic struct _58 : IConstant<int> { public static int Value => 58; }\npublic struct _59 : IConstant<int> { public static int Value => 59; }\npublic struct _60 : IConstant<int> { public static int Value => 60; }\npublic struct _61 : IConstant<int> { public static int Value => 61; }\npublic struct _62 : IConstant<int> { public static int Value => 62; }\npublic struct _63 : IConstant<int> { public static int Value => 63; }\npublic struct _64 : IConstant<int> { public static int Value => 64; }\npublic struct _65 : IConstant<int> { public static int Value => 65; }\npublic struct _66 : IConstant<int> { public static int Value => 66; }\npublic struct _67 : IConstant<int> { public static int Value => 67; }\npublic struct _68 : IConstant<int> { public static int Value => 68; }\npublic struct _69 : IConstant<int> { public static int Value => 69; }\npublic struct _70 : IConstant<int> { public static int Value => 70; }\npublic struct _71 : IConstant<int> { public static int Value => 71; }\npublic struct _72 : IConstant<int> { public static int Value => 72; }\npublic struct _73 : IConstant<int> { public static int Value => 73; }\npublic struct _74 : IConstant<int> { public static int Value => 74; }\npublic struct _75 : IConstant<int> { public static int Value => 75; }\npublic struct _76 : IConstant<int> { public static int Value => 76; }\npublic struct _77 : IConstant<int> { public static int Value => 77; }\npublic struct _78 : IConstant<int> { public static int Value => 78; }\npublic struct _79 : IConstant<int> { public static int Value => 79; }\npublic struct _80 : IConstant<int> { public static int Value => 80; }\npublic struct _81 : IConstant<int> { public static int Value => 81; }\npublic struct _82 : IConstant<int> { public static int Value => 82; }\npublic struct _83 : IConstant<int> { public static int Value => 83; }\npublic struct _84 : IConstant<int> { public static int Value => 84; }\npublic struct _85 : IConstant<int> { public static int Value => 85; }\npublic struct _86 : IConstant<int> { public static int Value => 86; }\npublic struct _87 : IConstant<int> { public static int Value => 87; }\npublic struct _88 : IConstant<int> { public static int Value => 88; }\npublic struct _89 : IConstant<int> { public static int Value => 89; }\npublic struct _90 : IConstant<int> { public static int Value => 90; }\npublic struct _91 : IConstant<int> { public static int Value => 91; }\npublic struct _92 : IConstant<int> { public static int Value => 92; }\npublic struct _93 : IConstant<int> { public static int Value => 93; }\npublic struct _94 : IConstant<int> { public static int Value => 94; }\npublic struct _95 : IConstant<int> { public static int Value => 95; }\npublic struct _96 : IConstant<int> { public static int Value => 96; }\npublic struct _97 : IConstant<int> { public static int Value => 97; }\npublic struct _98 : IConstant<int> { public static int Value => 98; }\npublic struct _99 : IConstant<int> { public static int Value => 99; }\n\npublic struct M1 : IConstant<int> { public static int Value => -1; }\npublic struct M2 : IConstant<int> { public static int Value => -2; }\npublic struct M3 : IConstant<int> { public static int Value => -3; }\npublic struct M4 : IConstant<int> { public static int Value => -4; }\npublic struct M5 : IConstant<int> { public static int Value => -5; }\npublic struct M6 : IConstant<int> { public static int Value => -6; }\npublic struct M7 : IConstant<int> { public static int Value => -7; }\npublic struct M8 : IConstant<int> { public static int Value => -8; }\npublic struct M9 : IConstant<int> { public static int Value => -9; }\n"
  },
  {
    "path": "Demo/2022/Algebra/Algebra/Constants/IntegerConstant.cs",
    "content": "﻿using System.Numerics;\n\nnamespace Algebra.Constants;\n\npublic struct IntegerConstant<T, N> : IConstant<T>\n    where T : INumberBase<T>\n    where N : IConstant<int>\n{\n    public static T Value { get; } = T.CreateChecked(N.Value);\n}\n\npublic struct Byte<N> : IConstant<byte> where N : IConstant<int> { public static byte Value => (byte)N.Value; }\npublic struct SByte<N> : IConstant<sbyte> where N : IConstant<int> { public static sbyte Value => (sbyte)N.Value; }\npublic struct Int16<N> : IConstant<short> where N : IConstant<int> { public static short Value => (short)N.Value; }\npublic struct UInt16<N> : IConstant<ushort> where N : IConstant<int> { public static ushort Value => (ushort)N.Value; }\npublic struct Int32<N> : IConstant<int> where N : IConstant<int> { public static int Value => N.Value; }\npublic struct UInt32<N> : IConstant<uint> where N : IConstant<int> { public static uint Value => (uint)N.Value; }\npublic struct Int64<N> : IConstant<long> where N : IConstant<int> { public static long Value => N.Value; }\npublic struct UInt64<N> : IConstant<ulong> where N : IConstant<int> { public static ulong Value => (ulong)N.Value; }\npublic struct Int128<N> : IConstant<Int128> where N : IConstant<int> { public static Int128 Value => N.Value; }\npublic struct UInt128<N> : IConstant<UInt128> where N : IConstant<int> { public static UInt128 Value => (UInt128)N.Value; }\npublic struct BigInteger<N> : IConstant<BigInteger> where N : IConstant<int> { public static BigInteger Value => N.Value; }\n\npublic static class IntegerConstants<T>\n    where T : INumberBase<T>\n{\n    public struct _0 : IConstant<T> { public static T Value { get; } = T.CreateChecked(0); }\n    public struct _1 : IConstant<T> { public static T Value { get; } = T.CreateChecked(1); }\n    public struct _2 : IConstant<T> { public static T Value { get; } = T.CreateChecked(2); }\n    public struct _3 : IConstant<T> { public static T Value { get; } = T.CreateChecked(3); }\n    public struct _4 : IConstant<T> { public static T Value { get; } = T.CreateChecked(4); }\n    public struct _5 : IConstant<T> { public static T Value { get; } = T.CreateChecked(5); }\n    public struct _6 : IConstant<T> { public static T Value { get; } = T.CreateChecked(6); }\n    public struct _7 : IConstant<T> { public static T Value { get; } = T.CreateChecked(7); }\n    public struct _8 : IConstant<T> { public static T Value { get; } = T.CreateChecked(8); }\n    public struct _9 : IConstant<T> { public static T Value { get; } = T.CreateChecked(9); }\n    public struct _10 : IConstant<T> { public static T Value { get; } = T.CreateChecked(10); }\n    public struct _11 : IConstant<T> { public static T Value { get; } = T.CreateChecked(11); }\n    public struct _12 : IConstant<T> { public static T Value { get; } = T.CreateChecked(12); }\n    public struct _13 : IConstant<T> { public static T Value { get; } = T.CreateChecked(13); }\n    public struct _14 : IConstant<T> { public static T Value { get; } = T.CreateChecked(14); }\n    public struct _15 : IConstant<T> { public static T Value { get; } = T.CreateChecked(15); }\n    public struct _16 : IConstant<T> { public static T Value { get; } = T.CreateChecked(16); }\n    public struct _17 : IConstant<T> { public static T Value { get; } = T.CreateChecked(17); }\n    public struct _18 : IConstant<T> { public static T Value { get; } = T.CreateChecked(18); }\n    public struct _19 : IConstant<T> { public static T Value { get; } = T.CreateChecked(19); }\n    public struct _20 : IConstant<T> { public static T Value { get; } = T.CreateChecked(20); }\n    public struct _21 : IConstant<T> { public static T Value { get; } = T.CreateChecked(21); }\n    public struct _22 : IConstant<T> { public static T Value { get; } = T.CreateChecked(22); }\n    public struct _23 : IConstant<T> { public static T Value { get; } = T.CreateChecked(23); }\n    public struct _24 : IConstant<T> { public static T Value { get; } = T.CreateChecked(24); }\n    public struct _25 : IConstant<T> { public static T Value { get; } = T.CreateChecked(25); }\n    public struct _26 : IConstant<T> { public static T Value { get; } = T.CreateChecked(26); }\n    public struct _27 : IConstant<T> { public static T Value { get; } = T.CreateChecked(27); }\n    public struct _28 : IConstant<T> { public static T Value { get; } = T.CreateChecked(28); }\n    public struct _29 : IConstant<T> { public static T Value { get; } = T.CreateChecked(29); }\n    public struct _30 : IConstant<T> { public static T Value { get; } = T.CreateChecked(30); }\n    public struct _31 : IConstant<T> { public static T Value { get; } = T.CreateChecked(31); }\n    public struct _32 : IConstant<T> { public static T Value { get; } = T.CreateChecked(32); }\n    public struct _33 : IConstant<T> { public static T Value { get; } = T.CreateChecked(33); }\n    public struct _34 : IConstant<T> { public static T Value { get; } = T.CreateChecked(34); }\n    public struct _35 : IConstant<T> { public static T Value { get; } = T.CreateChecked(35); }\n    public struct _36 : IConstant<T> { public static T Value { get; } = T.CreateChecked(36); }\n    public struct _37 : IConstant<T> { public static T Value { get; } = T.CreateChecked(37); }\n    public struct _38 : IConstant<T> { public static T Value { get; } = T.CreateChecked(38); }\n    public struct _39 : IConstant<T> { public static T Value { get; } = T.CreateChecked(39); }\n    public struct _40 : IConstant<T> { public static T Value { get; } = T.CreateChecked(40); }\n    public struct _41 : IConstant<T> { public static T Value { get; } = T.CreateChecked(41); }\n    public struct _42 : IConstant<T> { public static T Value { get; } = T.CreateChecked(42); }\n    public struct _43 : IConstant<T> { public static T Value { get; } = T.CreateChecked(43); }\n    public struct _44 : IConstant<T> { public static T Value { get; } = T.CreateChecked(44); }\n    public struct _45 : IConstant<T> { public static T Value { get; } = T.CreateChecked(45); }\n    public struct _46 : IConstant<T> { public static T Value { get; } = T.CreateChecked(46); }\n    public struct _47 : IConstant<T> { public static T Value { get; } = T.CreateChecked(47); }\n    public struct _48 : IConstant<T> { public static T Value { get; } = T.CreateChecked(48); }\n    public struct _49 : IConstant<T> { public static T Value { get; } = T.CreateChecked(49); }\n    public struct _50 : IConstant<T> { public static T Value { get; } = T.CreateChecked(50); }\n    public struct _51 : IConstant<T> { public static T Value { get; } = T.CreateChecked(51); }\n    public struct _52 : IConstant<T> { public static T Value { get; } = T.CreateChecked(52); }\n    public struct _53 : IConstant<T> { public static T Value { get; } = T.CreateChecked(53); }\n    public struct _54 : IConstant<T> { public static T Value { get; } = T.CreateChecked(54); }\n    public struct _55 : IConstant<T> { public static T Value { get; } = T.CreateChecked(55); }\n    public struct _56 : IConstant<T> { public static T Value { get; } = T.CreateChecked(56); }\n    public struct _57 : IConstant<T> { public static T Value { get; } = T.CreateChecked(57); }\n    public struct _58 : IConstant<T> { public static T Value { get; } = T.CreateChecked(58); }\n    public struct _59 : IConstant<T> { public static T Value { get; } = T.CreateChecked(59); }\n    public struct _60 : IConstant<T> { public static T Value { get; } = T.CreateChecked(60); }\n    public struct _61 : IConstant<T> { public static T Value { get; } = T.CreateChecked(61); }\n    public struct _62 : IConstant<T> { public static T Value { get; } = T.CreateChecked(62); }\n    public struct _63 : IConstant<T> { public static T Value { get; } = T.CreateChecked(63); }\n    public struct _64 : IConstant<T> { public static T Value { get; } = T.CreateChecked(64); }\n    public struct _65 : IConstant<T> { public static T Value { get; } = T.CreateChecked(65); }\n    public struct _66 : IConstant<T> { public static T Value { get; } = T.CreateChecked(66); }\n    public struct _67 : IConstant<T> { public static T Value { get; } = T.CreateChecked(67); }\n    public struct _68 : IConstant<T> { public static T Value { get; } = T.CreateChecked(68); }\n    public struct _69 : IConstant<T> { public static T Value { get; } = T.CreateChecked(69); }\n    public struct _70 : IConstant<T> { public static T Value { get; } = T.CreateChecked(70); }\n    public struct _71 : IConstant<T> { public static T Value { get; } = T.CreateChecked(71); }\n    public struct _72 : IConstant<T> { public static T Value { get; } = T.CreateChecked(72); }\n    public struct _73 : IConstant<T> { public static T Value { get; } = T.CreateChecked(73); }\n    public struct _74 : IConstant<T> { public static T Value { get; } = T.CreateChecked(74); }\n    public struct _75 : IConstant<T> { public static T Value { get; } = T.CreateChecked(75); }\n    public struct _76 : IConstant<T> { public static T Value { get; } = T.CreateChecked(76); }\n    public struct _77 : IConstant<T> { public static T Value { get; } = T.CreateChecked(77); }\n    public struct _78 : IConstant<T> { public static T Value { get; } = T.CreateChecked(78); }\n    public struct _79 : IConstant<T> { public static T Value { get; } = T.CreateChecked(79); }\n    public struct _80 : IConstant<T> { public static T Value { get; } = T.CreateChecked(80); }\n    public struct _81 : IConstant<T> { public static T Value { get; } = T.CreateChecked(81); }\n    public struct _82 : IConstant<T> { public static T Value { get; } = T.CreateChecked(82); }\n    public struct _83 : IConstant<T> { public static T Value { get; } = T.CreateChecked(83); }\n    public struct _84 : IConstant<T> { public static T Value { get; } = T.CreateChecked(84); }\n    public struct _85 : IConstant<T> { public static T Value { get; } = T.CreateChecked(85); }\n    public struct _86 : IConstant<T> { public static T Value { get; } = T.CreateChecked(86); }\n    public struct _87 : IConstant<T> { public static T Value { get; } = T.CreateChecked(87); }\n    public struct _88 : IConstant<T> { public static T Value { get; } = T.CreateChecked(88); }\n    public struct _89 : IConstant<T> { public static T Value { get; } = T.CreateChecked(89); }\n    public struct _90 : IConstant<T> { public static T Value { get; } = T.CreateChecked(90); }\n    public struct _91 : IConstant<T> { public static T Value { get; } = T.CreateChecked(91); }\n    public struct _92 : IConstant<T> { public static T Value { get; } = T.CreateChecked(92); }\n    public struct _93 : IConstant<T> { public static T Value { get; } = T.CreateChecked(93); }\n    public struct _94 : IConstant<T> { public static T Value { get; } = T.CreateChecked(94); }\n    public struct _95 : IConstant<T> { public static T Value { get; } = T.CreateChecked(95); }\n    public struct _96 : IConstant<T> { public static T Value { get; } = T.CreateChecked(96); }\n    public struct _97 : IConstant<T> { public static T Value { get; } = T.CreateChecked(97); }\n    public struct _98 : IConstant<T> { public static T Value { get; } = T.CreateChecked(98); }\n    public struct _99 : IConstant<T> { public static T Value { get; } = T.CreateChecked(99); }\n\n    public struct M1 : IConstant<T> { public static T Value => T.CreateChecked(-1); }\n    public struct M2 : IConstant<T> { public static T Value => T.CreateChecked(-2); }\n    public struct M3 : IConstant<T> { public static T Value => T.CreateChecked(-3); }\n    public struct M4 : IConstant<T> { public static T Value => T.CreateChecked(-4); }\n    public struct M5 : IConstant<T> { public static T Value => T.CreateChecked(-5); }\n    public struct M6 : IConstant<T> { public static T Value => T.CreateChecked(-6); }\n    public struct M7 : IConstant<T> { public static T Value => T.CreateChecked(-7); }\n    public struct M8 : IConstant<T> { public static T Value => T.CreateChecked(-8); }\n    public struct M9 : IConstant<T> { public static T Value => T.CreateChecked(-9); }\n}\n"
  },
  {
    "path": "Demo/2022/Algebra/Algebra/Constants/RationalConstant.cs",
    "content": "﻿using System.Numerics;\n\nnamespace Algebra.Constants;\n\npublic struct RationalConstant<TBase, N> : IConstant<Rational<TBase>>\n    where TBase : IAdditiveIdentity<TBase, TBase>,\n    IMultiplicativeIdentity<TBase, TBase>,\n    IAdditionOperators<TBase, TBase, TBase>,\n    ISubtractionOperators<TBase, TBase, TBase>,\n    IMultiplyOperators<TBase, TBase, TBase>,\n    IDivisionOperators<TBase, TBase, TBase>,\n    IUnaryNegationOperators<TBase, TBase>,\n    IComparisonOperators<TBase, TBase>\n    where N : IConstant<TBase>\n{\n    public static Rational<TBase> Value { get; } = new(N.Value);\n}\n\npublic static class RationalConstants<T>\n    where T : INumber<T>\n{\n    public struct _0 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(0); }\n    public struct _1 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(1); }\n    public struct _2 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(2); }\n    public struct _3 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(3); }\n    public struct _4 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(4); }\n    public struct _5 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(5); }\n    public struct _6 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(6); }\n    public struct _7 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(7); }\n    public struct _8 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(8); }\n    public struct _9 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(9); }\n    public struct _10 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(10); }\n    public struct _11 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(11); }\n    public struct _12 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(12); }\n    public struct _13 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(13); }\n    public struct _14 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(14); }\n    public struct _15 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(15); }\n    public struct _16 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(16); }\n    public struct _17 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(17); }\n    public struct _18 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(18); }\n    public struct _19 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(19); }\n    public struct _20 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(20); }\n    public struct _21 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(21); }\n    public struct _22 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(22); }\n    public struct _23 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(23); }\n    public struct _24 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(24); }\n    public struct _25 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(25); }\n    public struct _26 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(26); }\n    public struct _27 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(27); }\n    public struct _28 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(28); }\n    public struct _29 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(29); }\n    public struct _30 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(30); }\n    public struct _31 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(31); }\n    public struct _32 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(32); }\n    public struct _33 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(33); }\n    public struct _34 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(34); }\n    public struct _35 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(35); }\n    public struct _36 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(36); }\n    public struct _37 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(37); }\n    public struct _38 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(38); }\n    public struct _39 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(39); }\n    public struct _40 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(40); }\n    public struct _41 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(41); }\n    public struct _42 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(42); }\n    public struct _43 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(43); }\n    public struct _44 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(44); }\n    public struct _45 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(45); }\n    public struct _46 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(46); }\n    public struct _47 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(47); }\n    public struct _48 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(48); }\n    public struct _49 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(49); }\n    public struct _50 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(50); }\n    public struct _51 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(51); }\n    public struct _52 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(52); }\n    public struct _53 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(53); }\n    public struct _54 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(54); }\n    public struct _55 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(55); }\n    public struct _56 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(56); }\n    public struct _57 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(57); }\n    public struct _58 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(58); }\n    public struct _59 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(59); }\n    public struct _60 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(60); }\n    public struct _61 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(61); }\n    public struct _62 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(62); }\n    public struct _63 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(63); }\n    public struct _64 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(64); }\n    public struct _65 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(65); }\n    public struct _66 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(66); }\n    public struct _67 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(67); }\n    public struct _68 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(68); }\n    public struct _69 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(69); }\n    public struct _70 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(70); }\n    public struct _71 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(71); }\n    public struct _72 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(72); }\n    public struct _73 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(73); }\n    public struct _74 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(74); }\n    public struct _75 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(75); }\n    public struct _76 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(76); }\n    public struct _77 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(77); }\n    public struct _78 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(78); }\n    public struct _79 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(79); }\n    public struct _80 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(80); }\n    public struct _81 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(81); }\n    public struct _82 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(82); }\n    public struct _83 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(83); }\n    public struct _84 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(84); }\n    public struct _85 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(85); }\n    public struct _86 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(86); }\n    public struct _87 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(87); }\n    public struct _88 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(88); }\n    public struct _89 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(89); }\n    public struct _90 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(90); }\n    public struct _91 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(91); }\n    public struct _92 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(92); }\n    public struct _93 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(93); }\n    public struct _94 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(94); }\n    public struct _95 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(95); }\n    public struct _96 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(96); }\n    public struct _97 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(97); }\n    public struct _98 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(98); }\n    public struct _99 : IConstant<Rational<T>> { public static Rational<T> Value { get; } = T.CreateChecked(99); }\n\n    public struct M1 : IConstant<Rational<T>> { public static Rational<T> Value => T.CreateChecked(-1); }\n    public struct M2 : IConstant<Rational<T>> { public static Rational<T> Value => T.CreateChecked(-2); }\n    public struct M3 : IConstant<Rational<T>> { public static Rational<T> Value => T.CreateChecked(-3); }\n    public struct M4 : IConstant<Rational<T>> { public static Rational<T> Value => T.CreateChecked(-4); }\n    public struct M5 : IConstant<Rational<T>> { public static Rational<T> Value => T.CreateChecked(-5); }\n    public struct M6 : IConstant<Rational<T>> { public static Rational<T> Value => T.CreateChecked(-6); }\n    public struct M7 : IConstant<Rational<T>> { public static Rational<T> Value => T.CreateChecked(-7); }\n    public struct M8 : IConstant<Rational<T>> { public static Rational<T> Value => T.CreateChecked(-8); }\n    public struct M9 : IConstant<Rational<T>> { public static Rational<T> Value => T.CreateChecked(-9); }\n}\n"
  },
  {
    "path": "Demo/2022/Algebra/Algebra/Conversion.cs",
    "content": "﻿namespace Algebra;\n\npublic interface IImplicitConversion<TSelf, TBase> where TSelf : IImplicitConversion<TSelf, TBase>\n{\n    static abstract implicit operator TSelf(TBase x);\n}\n\npublic interface IExplicitConversion<TSelf, TBase> where TSelf : IExplicitConversion<TSelf, TBase>\n{\n    static abstract explicit operator TSelf(TBase x);\n}\n"
  },
  {
    "path": "Demo/2022/Algebra/Algebra/EuclideanAlgorithm.cs",
    "content": "﻿using System.Numerics;\n\nnamespace Algebra;\n\npublic class EuclideanAlgorithm\n{\n    /// <summary>\n    /// https://en.wikipedia.org/wiki/Euclidean_algorithm\n    /// </summary>\n    public static T Gcd<T>(T a, T b)\n        where T : IAdditiveIdentity<T, T>,\n        ISubtractionOperators<T, T, T>,\n        IMultiplyOperators<T, T, T>,\n        IDivisionOperators<T, T, T>,\n        IEqualityOperators<T, T>\n    {\n        while (b != T.AdditiveIdentity) (a, b) = (b, a - (a / b) * b);\n        return a;\n    }\n\n    /// <summary>\n    /// https://en.wikipedia.org/wiki/Euclidean_algorithm\n    /// </summary>\n    public static T GcdModulus<T>(T a, T b)\n        where T : IAdditiveIdentity<T, T>,\n        IModulusOperators<T, T, T>,\n        IEqualityOperators<T, T>\n    {\n        while (b != T.AdditiveIdentity) (a, b) = (b, a % b);\n        return a;\n    }\n\n    /// <summary>\n    /// https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm\n    /// </summary>\n    public static (T gcd, T x, T y) Egcd<T>(T a, T b)\n        where T : IAdditiveIdentity<T, T>,\n        IMultiplicativeIdentity<T, T>,\n        ISubtractionOperators<T, T, T>,\n        IMultiplyOperators<T, T, T>,\n        IDivisionOperators<T, T, T>,\n        IEqualityOperators<T, T>\n    {\n        var (r, r0) = (b, a);\n        var (s, s0) = (T.AdditiveIdentity, T.MultiplicativeIdentity);\n        var (t, t0) = (T.MultiplicativeIdentity, T.AdditiveIdentity);\n\n        while (r != T.AdditiveIdentity)\n        {\n            var q = r0 / r;\n            (r0, r) = (r, r0 - q * r);\n            (s0, s) = (s, s0 - q * s);\n            (t0, t) = (t, t0 - q * t);\n        }\n\n        return (r0, s0, t0);\n    }\n}\n"
  },
  {
    "path": "Demo/2022/Algebra/Algebra/QuadraticField.cs",
    "content": "﻿using System.Numerics;\nusing Algebra.Constants;\n\nnamespace Algebra;\n\npublic readonly struct QuadraticField<TBase, D>\n    : IAdditiveIdentity<QuadraticField<TBase, D>, QuadraticField<TBase, D>>,\n    IMultiplicativeIdentity<QuadraticField<TBase, D>, QuadraticField<TBase, D>>,\n    IAdditionOperators<QuadraticField<TBase, D>, QuadraticField<TBase, D>, QuadraticField<TBase, D>>,\n    IAdditionOperators<QuadraticField<TBase, D>, TBase, QuadraticField<TBase, D>>,\n    ISubtractionOperators<QuadraticField<TBase, D>, QuadraticField<TBase, D>, QuadraticField<TBase, D>>,\n    ISubtractionOperators<QuadraticField<TBase, D>, TBase, QuadraticField<TBase, D>>,\n    IMultiplyOperators<QuadraticField<TBase, D>, QuadraticField<TBase, D>, QuadraticField<TBase, D>>,\n    IMultiplyOperators<QuadraticField<TBase, D>, TBase, QuadraticField<TBase, D>>,\n    IDivisionOperators<QuadraticField<TBase, D>, QuadraticField<TBase, D>, QuadraticField<TBase, D>>,\n    IDivisionOperators<QuadraticField<TBase, D>, TBase, QuadraticField<TBase, D>>,\n    IEqualityOperators<QuadraticField<TBase, D>, QuadraticField<TBase, D>>,\n    IEqualityOperators<QuadraticField<TBase, D>, TBase>,\n    IUnaryPlusOperators<QuadraticField<TBase, D>, QuadraticField<TBase, D>>,\n    IUnaryNegationOperators<QuadraticField<TBase, D>, QuadraticField<TBase, D>>,\n    IImplicitConversion<QuadraticField<TBase, D>, TBase>\n\n    where TBase : IAdditiveIdentity<TBase, TBase>,\n    IMultiplicativeIdentity<TBase, TBase>,\n    IAdditionOperators<TBase, TBase, TBase>,\n    ISubtractionOperators<TBase, TBase, TBase>,\n    IMultiplyOperators<TBase, TBase, TBase>,\n    IDivisionOperators<TBase, TBase, TBase>,\n    IEqualityOperators<TBase, TBase>,\n    IUnaryPlusOperators<TBase, TBase>,\n    IUnaryNegationOperators<TBase, TBase>,\n    IComparisonOperators<TBase, TBase>\n\n    where D : IConstant<TBase>\n{\n    public TBase X { get; }\n    public TBase Y { get; }\n\n    public QuadraticField(TBase x) : this(x, TBase.AdditiveIdentity) { }\n\n    public QuadraticField(TBase x, TBase y) => (X, Y) = (x, y);\n\n    public static implicit operator QuadraticField<TBase, D>(TBase value) => new(value);\n\n    public static QuadraticField<TBase, D> One { get; } = new(TBase.MultiplicativeIdentity, TBase.AdditiveIdentity);\n    public static QuadraticField<TBase, D> Zero { get; } = new(TBase.AdditiveIdentity, TBase.AdditiveIdentity);\n    public static QuadraticField<TBase, D> I { get; } = new(TBase.AdditiveIdentity, TBase.MultiplicativeIdentity);\n\n    static QuadraticField<TBase, D> IAdditiveIdentity<QuadraticField<TBase, D>, QuadraticField<TBase, D>>.AdditiveIdentity => Zero;\n    static QuadraticField<TBase, D> IMultiplicativeIdentity<QuadraticField<TBase, D>, QuadraticField<TBase, D>>.MultiplicativeIdentity => One;\n\n    public static QuadraticField<TBase, D> operator +(QuadraticField<TBase, D> left, QuadraticField<TBase, D> right)\n        => new(left.X + right.X, left.Y + right.Y);\n\n    public static QuadraticField<TBase, D> operator checked +(QuadraticField<TBase, D> left, QuadraticField<TBase, D> right)\n        => checked(new(left.X + right.X, left.Y + right.Y));\n\n    public static QuadraticField<TBase, D> operator +(QuadraticField<TBase, D> left, TBase right)\n        => new(left.X + right, left.Y);\n\n    public static QuadraticField<TBase, D> operator checked +(QuadraticField<TBase, D> left, TBase right)\n        => checked(new(left.X + right, left.Y));\n\n    public static QuadraticField<TBase, D> operator +(TBase left, QuadraticField<TBase, D> right)\n        => new(left + right.X, right.Y);\n\n    public static QuadraticField<TBase, D> operator checked +(TBase left, QuadraticField<TBase, D> right)\n        => checked(new(left + right.X, right.Y));\n\n    public static QuadraticField<TBase, D> operator -(QuadraticField<TBase, D> left, QuadraticField<TBase, D> right)\n        => new(left.X - right.X, left.Y - right.Y);\n\n    public static QuadraticField<TBase, D> operator checked -(QuadraticField<TBase, D> left, QuadraticField<TBase, D> right)\n        => checked(new(left.X - right.X, left.Y - right.Y));\n\n    public static QuadraticField<TBase, D> operator -(QuadraticField<TBase, D> left, TBase right)\n        => new(left.X - right, left.Y);\n\n    public static QuadraticField<TBase, D> operator checked -(QuadraticField<TBase, D> left, TBase right)\n        => checked(new(left.X - right, left.Y));\n\n    public static QuadraticField<TBase, D> operator -(TBase left, QuadraticField<TBase, D> right)\n        => new(left - right.X, right.Y);\n\n    public static QuadraticField<TBase, D> operator checked -(TBase left, QuadraticField<TBase, D> right)\n        => checked(new(left - right.X, right.Y));\n\n    public static QuadraticField<TBase, D> operator *(QuadraticField<TBase, D> left, QuadraticField<TBase, D> right)\n        => new(left.X * right.X + D.Value * left.Y * right.Y, left.X * right.Y + left.Y * right.X);\n\n    public static QuadraticField<TBase, D> operator checked *(QuadraticField<TBase, D> left, QuadraticField<TBase, D> right)\n        => checked(new(left.X * right.X + D.Value * left.Y * right.Y, left.X * right.Y + left.Y * right.X));\n\n    public static QuadraticField<TBase, D> operator *(QuadraticField<TBase, D> left, TBase right)\n        => new(left.X * right, left.Y * right);\n\n    public static QuadraticField<TBase, D> operator checked *(QuadraticField<TBase, D> left, TBase right)\n        => checked(new(left.X * right, left.Y * right));\n\n    public static QuadraticField<TBase, D> operator *(TBase left, QuadraticField<TBase, D> right)\n        => new(left * right.X, left * right.X);\n\n    public static QuadraticField<TBase, D> operator checked *(TBase left, QuadraticField<TBase, D> right)\n        => checked(new(left * right.X, left * right.X));\n\n    public static QuadraticField<TBase, D> operator /(QuadraticField<TBase, D> left, QuadraticField<TBase, D> right)\n    {\n        var n = right.Norm();\n        var t = left * right.Conjugate();\n        return new(t.X / n, t.Y / n);\n    }\n\n    public static QuadraticField<TBase, D> operator checked /(QuadraticField<TBase, D> left, QuadraticField<TBase, D> right)\n    {\n        checked\n        {\n            var n = right.Norm();\n            var t = left * right.Conjugate();\n            return new(t.X / n, t.Y / n);\n        }\n    }\n\n    public static QuadraticField<TBase, D> operator /(QuadraticField<TBase, D> left, TBase right)\n        => new(left.X / right, left.Y / right);\n\n    public static QuadraticField<TBase, D> operator checked /(QuadraticField<TBase, D> left, TBase right)\n        => checked(new(left.X / right, left.Y / right));\n\n    public static QuadraticField<TBase, D> operator /(TBase left, QuadraticField<TBase, D> right)\n    {\n        var n = right.Norm();\n        var t = left * right.Conjugate();\n        return new(t.X / n, t.Y / n);\n    }\n\n    public static QuadraticField<TBase, D> operator checked /(TBase left, QuadraticField<TBase, D> right)\n    {\n        checked\n        {\n            var n = right.Norm();\n            var t = left * right.Conjugate();\n            return new(t.X / n, t.Y / n);\n        }\n    }\n\n    public static QuadraticField<TBase, D> operator +(QuadraticField<TBase, D> value) => value;\n    public static QuadraticField<TBase, D> operator checked -(QuadraticField<TBase, D> value) => checked(new(-value.X, -value.Y));\n    public static QuadraticField<TBase, D> operator -(QuadraticField<TBase, D> value) => new(-value.X, -value.Y);\n\n    public QuadraticField<TBase, D> Conjugate() => new(X, -Y);\n    public TBase Norm() => X * X - D.Value * Y * Y;\n\n    public static bool operator ==(QuadraticField<TBase, D> left, QuadraticField<TBase, D> right) => left.Equals(right);\n    public static bool operator !=(QuadraticField<TBase, D> left, QuadraticField<TBase, D> right) => !left.Equals(right);\n    public bool Equals(QuadraticField<TBase, D> other) => (X, Y) == (other.X, other.Y);\n\n    public static bool operator ==(QuadraticField<TBase, D> left, TBase right) => left.Equals(right);\n    public static bool operator !=(QuadraticField<TBase, D> left, TBase right) => !left.Equals(right);\n    public bool Equals(TBase? other) => (X, Y) == (other, TBase.AdditiveIdentity);\n\n    public override bool Equals(object? obj) => obj is QuadraticField<TBase, D> other && Equals(other);\n    public override int GetHashCode() => HashCode.Combine(X, Y);\n    public override string ToString()\n        =>\n        Y == TBase.AdditiveIdentity ? $\"{X}\" :\n        X == TBase.AdditiveIdentity ? $\"{Y}√{D.Value}\" :\n        Y < TBase.AdditiveIdentity ? $\"{X}{Y}√{D.Value}\" :\n        $\"{X}+{Y}√{D.Value}\";\n}\n"
  },
  {
    "path": "Demo/2022/Algebra/Algebra/Rational.cs",
    "content": "﻿using System.Numerics;\n\nnamespace Algebra;\n\npublic readonly struct Rational<TBase>\n    : IAdditiveIdentity<Rational<TBase>, Rational<TBase>>,\n    IMultiplicativeIdentity<Rational<TBase>, Rational<TBase>>,\n    IAdditionOperators<Rational<TBase>, Rational<TBase>, Rational<TBase>>,\n    IAdditionOperators<Rational<TBase>, TBase, Rational<TBase>>,\n    ISubtractionOperators<Rational<TBase>, Rational<TBase>, Rational<TBase>>,\n    ISubtractionOperators<Rational<TBase>, TBase, Rational<TBase>>,\n    IMultiplyOperators<Rational<TBase>, Rational<TBase>, Rational<TBase>>,\n    IMultiplyOperators<Rational<TBase>, TBase, Rational<TBase>>,\n    IDivisionOperators<Rational<TBase>, Rational<TBase>, Rational<TBase>>,\n    IDivisionOperators<Rational<TBase>, TBase, Rational<TBase>>,\n    IComparisonOperators<Rational<TBase>, Rational<TBase>>,\n    IComparisonOperators<Rational<TBase>, TBase>,\n    IUnaryPlusOperators<Rational<TBase>, Rational<TBase>>,\n    IUnaryNegationOperators<Rational<TBase>, Rational<TBase>>,\n    IImplicitConversion<Rational<TBase>, TBase>\n\n    where TBase :\n    IAdditiveIdentity<TBase, TBase>,\n    IMultiplicativeIdentity<TBase, TBase>,\n    IAdditionOperators<TBase, TBase, TBase>,\n    ISubtractionOperators<TBase, TBase, TBase>,\n    IMultiplyOperators<TBase, TBase, TBase>,\n    IDivisionOperators<TBase, TBase, TBase>,\n    IUnaryNegationOperators<TBase, TBase>,\n    IComparisonOperators<TBase, TBase>\n{\n    public TBase Numerator { get; }\n    public TBase Denominator { get; }\n\n    public Rational(TBase value)\n    {\n        (Numerator, Denominator) = (value, TBase.MultiplicativeIdentity);\n    }\n\n    public Rational(TBase numerator, TBase denominator)\n    {\n        (Numerator, Denominator) = Canonicalize(numerator, denominator);\n    }\n\n    public static (TBase x, TBase y) Canonicalize(TBase a, TBase b)\n    {\n        var (r, r0) = (b, a);\n        var (s, s0) = (TBase.AdditiveIdentity, TBase.MultiplicativeIdentity);\n        var (t, t0) = (TBase.MultiplicativeIdentity, TBase.AdditiveIdentity);\n\n        while (r != TBase.AdditiveIdentity)\n        {\n            var q = r0 / r;\n            (r0, r) = (r, r0 - q * r);\n            (s0, s) = (s, s0 - q * s);\n            (t0, t) = (t, t0 - q * t);\n        }\n\n        if (s == TBase.AdditiveIdentity) return (TBase.MultiplicativeIdentity, TBase.AdditiveIdentity);\n\n        if (s < TBase.AdditiveIdentity)\n        {\n            s = -s;\n            t = -t;\n        }\n\n        if (s == TBase.MultiplicativeIdentity) return (-t, TBase.MultiplicativeIdentity);\n\n        return (-t, s);\n    }\n\n    public static implicit operator Rational<TBase>(TBase value) => new(value);\n\n    public static Rational<TBase> One { get; } = new(TBase.MultiplicativeIdentity, TBase.MultiplicativeIdentity);\n    public static Rational<TBase> Zero { get; } = new(TBase.AdditiveIdentity, TBase.MultiplicativeIdentity);\n\n    static Rational<TBase> IAdditiveIdentity<Rational<TBase>, Rational<TBase>>.AdditiveIdentity => Zero;\n    static Rational<TBase> IMultiplicativeIdentity<Rational<TBase>, Rational<TBase>>.MultiplicativeIdentity => One;\n\n    public static Rational<TBase> operator +(Rational<TBase> left, Rational<TBase> right)\n        => new(left.Numerator * right.Denominator + left.Denominator * right.Numerator, left.Denominator * right.Denominator);\n\n    public static Rational<TBase> operator checked +(Rational<TBase> left, Rational<TBase> right)\n        => checked(new(left.Numerator * right.Denominator + left.Denominator * right.Numerator, left.Denominator * right.Denominator));\n\n    public static Rational<TBase> operator +(Rational<TBase> left, TBase right)\n        => new(left.Numerator + left.Denominator * right, left.Denominator);\n\n    public static Rational<TBase> operator checked +(Rational<TBase> left, TBase right)\n        => checked(new(left.Numerator + left.Denominator * right, left.Denominator));\n\n    public static Rational<TBase> operator +(TBase left, Rational<TBase> right)\n        => new(left * right.Denominator + right.Numerator, right.Denominator);\n\n    public static Rational<TBase> operator checked +(TBase left, Rational<TBase> right)\n        => checked(new(left * right.Denominator + right.Numerator, right.Denominator));\n\n    public static Rational<TBase> operator -(Rational<TBase> left, Rational<TBase> right)\n        => new(left.Numerator * right.Denominator - left.Denominator * right.Numerator, left.Denominator * right.Denominator);\n\n    public static Rational<TBase> operator checked -(Rational<TBase> left, Rational<TBase> right)\n        => checked(new(left.Numerator * right.Denominator - left.Denominator * right.Numerator, left.Denominator * right.Denominator));\n\n    public static Rational<TBase> operator -(Rational<TBase> left, TBase right)\n        => new(left.Numerator - left.Denominator * right, left.Denominator);\n\n    public static Rational<TBase> operator checked -(Rational<TBase> left, TBase right)\n        => checked(new(left.Numerator - left.Denominator * right, left.Denominator));\n\n    public static Rational<TBase> operator -(TBase left, Rational<TBase> right)\n        => new(left * right.Denominator - right.Numerator, right.Denominator);\n\n    public static Rational<TBase> operator checked -(TBase left, Rational<TBase> right)\n        => checked(new(left * right.Denominator - right.Numerator, right.Denominator));\n\n    public static Rational<TBase> operator *(Rational<TBase> left, Rational<TBase> right)\n        => new(left.Numerator * right.Numerator, left.Denominator * right.Denominator);\n\n    public static Rational<TBase> operator checked *(Rational<TBase> left, Rational<TBase> right)\n        => checked(new(left.Numerator * right.Numerator, left.Denominator * right.Denominator));\n\n    public static Rational<TBase> operator *(Rational<TBase> left, TBase right)\n        => new(left.Numerator * right, left.Denominator);\n\n    public static Rational<TBase> operator checked *(Rational<TBase> left, TBase right)\n        => checked(new(left.Numerator * right, left.Denominator));\n\n    public static Rational<TBase> operator *(TBase left, Rational<TBase> right)\n        => new(left * right.Numerator, right.Denominator);\n\n    public static Rational<TBase> operator checked *(TBase left, Rational<TBase> right)\n        => checked(new(left * right.Numerator, right.Denominator));\n\n    public static Rational<TBase> operator /(Rational<TBase> left, Rational<TBase> right)\n        => checked(new(left.Numerator * right.Denominator, left.Denominator * right.Numerator));\n\n    public static Rational<TBase> operator checked /(Rational<TBase> left, Rational<TBase> right)\n        => checked(new(left.Numerator * right.Denominator, left.Denominator * right.Numerator));\n\n    public static Rational<TBase> operator /(Rational<TBase> left, TBase right)\n        => new(left.Numerator, left.Denominator * right);\n\n    public static Rational<TBase> operator checked /(Rational<TBase> left, TBase right)\n        => checked(new(left.Numerator, left.Denominator * right));\n\n    public static Rational<TBase> operator /(TBase left, Rational<TBase> right)\n        => checked(new(left * right.Denominator, right.Numerator));\n\n    public static Rational<TBase> operator checked /(TBase left, Rational<TBase> right)\n        => checked(new(left * right.Denominator, right.Numerator));\n\n    public static Rational<TBase> operator +(Rational<TBase> value) => value;\n\n    public static Rational<TBase> operator checked -(Rational<TBase> value) => checked(new(-value.Numerator, value.Denominator));\n\n    public static Rational<TBase> operator -(Rational<TBase> value) => new(-value.Numerator, value.Denominator);\n\n    public static bool operator ==(Rational<TBase> left, Rational<TBase> right) => left.Equals(right);\n    public static bool operator !=(Rational<TBase> left, Rational<TBase> right) => !left.Equals(right);\n    public static bool operator >(Rational<TBase> left, Rational<TBase> right) => left.Numerator * right.Denominator > left.Denominator * right.Numerator;\n    public static bool operator >=(Rational<TBase> left, Rational<TBase> right) => left.Numerator * right.Denominator >= left.Denominator * right.Numerator;\n    public static bool operator <(Rational<TBase> left, Rational<TBase> right) => left.Numerator * right.Denominator < left.Denominator * right.Numerator;\n    public static bool operator <=(Rational<TBase> left, Rational<TBase> right) => left.Numerator * right.Denominator <= left.Denominator * right.Numerator;\n    public bool Equals(Rational<TBase> other) => Numerator * other.Denominator == Denominator * other.Numerator;\n    public int CompareTo(Rational<TBase> other) => (Numerator * other.Denominator).CompareTo(Denominator * other.Denominator);\n\n    public static bool operator ==(Rational<TBase> left, TBase right) => left.Equals(right);\n    public static bool operator !=(Rational<TBase> left, TBase right) => !left.Equals(right);\n    public static bool operator >(Rational<TBase> left, TBase right) => left.Numerator > left.Denominator * right;\n    public static bool operator >=(Rational<TBase> left, TBase right) => left.Numerator >= left.Denominator * right;\n    public static bool operator <(Rational<TBase> left, TBase right) => left.Numerator < left.Denominator * right;\n    public static bool operator <=(Rational<TBase> left, TBase right) => left.Numerator <= left.Denominator * right;\n    public bool Equals(TBase? other) => Numerator == Denominator * other!;\n    public int CompareTo(TBase? other) => Numerator.CompareTo(Denominator * other!);\n\n    public static bool operator ==(TBase left, Rational<TBase> right) => left.Equals(right);\n    public static bool operator !=(TBase left, Rational<TBase> right) => !left.Equals(right);\n    public static bool operator >(TBase left, Rational<TBase> right) => left * right.Denominator > right.Numerator;\n    public static bool operator >=(TBase left, Rational<TBase> right) => left * right.Denominator >= right.Numerator;\n    public static bool operator <(TBase left, Rational<TBase> right) => left * right.Denominator < right.Numerator;\n    public static bool operator <=(TBase left, Rational<TBase> right) => left * right.Denominator <= right.Numerator;\n\n    public override bool Equals(object? obj) => obj is Rational<TBase> other && Equals(other);\n    public override int GetHashCode() => HashCode.Combine(Numerator, Denominator);\n    public int CompareTo(object? obj) => obj is Rational<TBase> other ? CompareTo(other) : -1;\n    public override string ToString() => Denominator == TBase.MultiplicativeIdentity\n        ? Numerator.ToString()!\n        : $\"{Numerator}/{Denominator}\";\n}\n"
  },
  {
    "path": "Demo/2022/Algebra/Algebra/RationalQuadraticField.cs",
    "content": "﻿using System.Numerics;\nusing Algebra.Constants;\n\nnamespace Algebra;\n\npublic static class RationalQuadraticField<TBase, N>\n    where TBase : INumber<TBase>\n    where N : IConstant<int>\n{\n    public static QuadraticField<Rational<TBase>, RationalConstant<TBase, IntegerConstant<TBase, N>>> Zero { get; } = QuadraticField<Rational<TBase>, RationalConstant<TBase, IntegerConstant<TBase, N>>>.Zero;\n    public static QuadraticField<Rational<TBase>, RationalConstant<TBase, IntegerConstant<TBase, N>>> One { get; } = QuadraticField<Rational<TBase>, RationalConstant<TBase, IntegerConstant<TBase, N>>>.One;\n    public static QuadraticField<Rational<TBase>, RationalConstant<TBase, IntegerConstant<TBase, N>>> I { get; } = QuadraticField<Rational<TBase>, RationalConstant<TBase, IntegerConstant<TBase, N>>>.I;\n}\n"
  },
  {
    "path": "Demo/2022/Algebra/Algebra.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.3.32611.2\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Algebra\", \"Algebra\\Algebra.csproj\", \"{440C3757-5D0A-44D6-AC06-EC57B13F23B1}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{218672C2-FB83-4209-A893-DF11D9F96F48}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"TestAlgebra\", \"TestAlgebra\\TestAlgebra.csproj\", \"{82FA132C-3C02-4E9F-A76D-9B06A740CD60}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{440C3757-5D0A-44D6-AC06-EC57B13F23B1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{440C3757-5D0A-44D6-AC06-EC57B13F23B1}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{440C3757-5D0A-44D6-AC06-EC57B13F23B1}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{440C3757-5D0A-44D6-AC06-EC57B13F23B1}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{218672C2-FB83-4209-A893-DF11D9F96F48}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{218672C2-FB83-4209-A893-DF11D9F96F48}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{218672C2-FB83-4209-A893-DF11D9F96F48}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{218672C2-FB83-4209-A893-DF11D9F96F48}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{82FA132C-3C02-4E9F-A76D-9B06A740CD60}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{82FA132C-3C02-4E9F-A76D-9B06A740CD60}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{82FA132C-3C02-4E9F-A76D-9B06A740CD60}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{82FA132C-3C02-4E9F-A76D-9B06A740CD60}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {E32B1AC0-9767-4B2E-B63B-693A13F64433}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2022/Algebra/ConsoleApp1/ConsoleApp1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n    <LangVersion>preview</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Algebra\\Algebra.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Algebra/ConsoleApp1/Program.cs",
    "content": "﻿using Algebra;\nusing System.Numerics;\n\nusing Q2 = Algebra.QuadraticField<\n    Algebra.Rational<short>,\n    Algebra.Constants.RationalConstants<short>._2>;\n\nusing C = Algebra.QuadraticField<\n    Algebra.Rational<short>,\n    Algebra.Constants.RationalConstants<short>.M1>;\n\nusing static Algebra.RationalQuadraticField<long, Algebra.Constants.M1>;\nusing Algebra.Constants;\n{\n    var r1 = new Rational<BigInteger>(-35, 10);\n    var r2 = new Rational<BigInteger>(7, -2);\n\n    Console.WriteLine($\"{r1} == {r2} {r1 == r2}\");\n    Console.WriteLine($\"{r1 + r2}, {r1 - r2}, {r1 * r2}, {r1 / r2}\");\n\n    Console.WriteLine(r1 / 7);\n    Console.WriteLine(-r1 * 2 / 3);\n}\n{\n    var r1 = new Rational<int>(-35, 10);\n    var r2 = new Rational<int>(7, -2);\n\n    Console.WriteLine($\"{r1} == {r2} {r1 == r2}\");\n    Console.WriteLine($\"{r1 + r2}, {r1 - r2}, {r1 * r2}, {r1 / r2}\");\n\n    Console.WriteLine(r1 / 7);\n    Console.WriteLine(-r1 * 2 / 3);\n}\n{\n    var x = new Q2(1);\n    var y = new Q2(0, -1);\n\n    Console.WriteLine(new Q2(0));\n    Console.WriteLine(new Q2(1));\n    Console.WriteLine(new Q2(0, 1));\n    Console.WriteLine(x);\n    Console.WriteLine(y);\n    var z = x + y;\n    Console.WriteLine(z);\n    Console.WriteLine(z * z);\n    Console.WriteLine(z / new Q2(3, 5));\n}\nConsole.WriteLine(\"-----\");\n{\n    var x = new C(1);\n    var y = new C(0, -1);\n\n    Console.WriteLine(new C(0));\n    Console.WriteLine(new C(1));\n    Console.WriteLine(new C(0, 1));\n    Console.WriteLine(x);\n    Console.WriteLine(y);\n    var z = x + y;\n    Console.WriteLine(z);\n    Console.WriteLine(z * z);\n    Console.WriteLine(z / new C(3, 5));\n}\n\n{\n    var x = 3 + I * 2;\n    var y = -4 + I * 3;\n\n    Console.WriteLine(x);\n    Console.WriteLine(y);\n    Console.WriteLine(x + y);\n    Console.WriteLine(x - y);\n    Console.WriteLine(x * y);\n    Console.WriteLine(x / y);\n}\n\n{\n    var q = 1.AsQ();\n\n    var q1 = 1.AsQ(new _5());\n    //var q2 = q1.AsQ(new _7());\n}\n\nstatic class Ex\n{\n    public static Rational<TBase> AsQ<TBase>(this TBase x)\n        where TBase :\n        IAdditiveIdentity<TBase, TBase>,\n        IMultiplicativeIdentity<TBase, TBase>,\n        IAdditionOperators<TBase, TBase, TBase>,\n        ISubtractionOperators<TBase, TBase, TBase>,\n        IMultiplyOperators<TBase, TBase, TBase>,\n        IDivisionOperators<TBase, TBase, TBase>,\n        IUnaryNegationOperators<TBase, TBase>,\n        IComparisonOperators<TBase, TBase>\n        => new(x);\n\n    public static QuadraticField<Rational<TBase>, RationalConstant<TBase, IntegerConstant<TBase, N>>> AsQ<TBase, N>(this TBase x, N _)\n        where TBase : INumber<TBase>\n        where N : IConstant<int>\n        => new(new(x));\n}\n\npublic static class ConstantTypeBuilder\n{\n    public static Constant<Rational<TBase>, TBase, N> Rational<TBase, N>()\n        where TBase :\n        IAdditiveIdentity<TBase, TBase>,\n        IMultiplicativeIdentity<TBase, TBase>,\n        IAdditionOperators<TBase, TBase, TBase>,\n        ISubtractionOperators<TBase, TBase, TBase>,\n        IMultiplyOperators<TBase, TBase, TBase>,\n        IDivisionOperators<TBase, TBase, TBase>,\n        IUnaryNegationOperators<TBase, TBase>,\n        IComparisonOperators<TBase, TBase>\n        where N : IConstant<TBase>\n        => default;\n}\n"
  },
  {
    "path": "Demo/2022/Algebra/TestAlgebra/EuclideanAlgorithmTest.cs",
    "content": "using Algebra;\nusing System.Numerics;\n\nnamespace TestAlgebra;\n\npublic class EuclideanAlgorithmTest\n{\n    public static IEnumerable<object[]> GetRandomData()\n    {\n        const int min = 1;\n        const int max = 500;\n        var r = new Random();\n\n        return Enumerable.Range(0, 100)\n            .Select(_ => new object[]\n            {\n                r.Next(min, max),\n                r.Next(min, max),\n            })\n            .ToArray();\n    }\n\n    [Theory]\n    [InlineData(1, 1)]\n    [InlineData(2, 2)]\n    [InlineData(2, 6)]\n    [InlineData(6, 3)]\n    [InlineData(10, 13)]\n    [InlineData(5 * 7 * 13, 2 * 3 * 5 * 7)]\n    [MemberData(nameof(GetRandomData))]\n    public void Gcd(int a, int b)\n    {\n        GcdT<byte>(a, b);\n        GcdT<sbyte>(a, b);\n        GcdT<short>(a, b);\n        GcdT<ushort>(a, b);\n        GcdT<int>(a, b);\n        GcdT<uint>(a, b);\n        GcdT<long>(a, b);\n        GcdT<ulong>(a, b);\n        GcdT<Int128>(a, b);\n        GcdT<UInt128>(a, b);\n    }\n\n    private static void GcdT<T>(int a0, int b0)\n        where T : INumber<T>\n    {\n        var a = T.CreateTruncating(a0);\n        var b = T.CreateTruncating(b0);\n\n        var g1 = EuclideanAlgorithm.Gcd(a, b);\n        var g2 = EuclideanAlgorithm.GcdModulus(a, b);\n        var (g3, x, y) = EuclideanAlgorithm.Egcd(a, b);\n\n        Assert.Equal(g1, g2);\n        Assert.Equal(g1, g3);\n        Assert.Equal(g1, a * x + b * y);\n    }\n}"
  },
  {
    "path": "Demo/2022/Algebra/TestAlgebra/TestAlgebra.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n    <LangVersion>preview</LangVersion>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.1.0\" />\n    <PackageReference Include=\"xunit\" Version=\"2.4.1\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.4.3\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"coverlet.collector\" Version=\"3.1.2\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Algebra\\Algebra.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Algebra/TestAlgebra/Usings.cs",
    "content": "global using Xunit;"
  },
  {
    "path": "Demo/2022/Csharp11/17.0/GenericAttribute/GenericAttribute.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Library</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n\n    <!-- .NET 7 Preview 7 時点で、generic attributes の preview 外し忘れてる(11に変更し忘れてる)みたい。 -->\n    <LangVersion>preview</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.0/GenericAttribute/Program.cs",
    "content": "﻿// C# 10 の頃から実装はあったけども、最終的に LangVersion 10 には入らず、C# 10 正式リリース時点で Preview として残ったもの。\n// (.NET ランタイム側の対応が必要で、テストが間に合わなかった(実際何か不具合あったっぽい？)だけ。)\n// (現在の計画では) C# 11 で今度こそ正式に入る予定。\n\n// 属性をジェネリック型にできるようになりました。以上。\n[AttributeUsage(AttributeTargets.All)]\nsealed class GenericAttribute<T> : Attribute { }\n\n// 通常の属性と同様、Attribute 語尾は省略できる。\n[Generic<int>]\nclass A { }\n\n// フルネームでも OK。\n[GenericAttribute<int>]\nclass B { }\n\n// 型引数が open なままではダメ。\n// 例えば以下のコードはコンパイルエラーになる。\n#if false\n[GenericAttribute<T>] // CS8968 エラー\nclass C<T> { }\n#endif\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.1p1/NewlineInInterpolation/NewlineInInterpolation.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.1p1/NewlineInInterpolation/Program.cs",
    "content": "﻿var a = 1;\nvar b = 2;\nvar s = $\"a: {\n    a // ここの改行、前は入れれなかった。特に理由はないので修正。\n    }, b: {\n    b\n    }\";\n\nConsole.WriteLine(s);\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.1p2/ListPattern/ListPattern.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.1p2/ListPattern/Program.cs",
    "content": "﻿using System.Text;\n\n//## リスト パターン\n\nvar x = new[] { 1, 2, 3, 4, 5 };\n\nif (x.AsSpan() is [1, .. var y, 5]) // これで、1開始、5終端にマッチしたとき、真ん中の要素を取る。\n{\n    foreach (var item in y) // 2, 3, 4\n    {\n        Console.WriteLine(item);\n    }\n}\n\n//## 無駄に再帰させてみる\n\n// こんなのも有効な C# コードだったりする。\n// 特に意味はない。 new int[0] is [] と一緒。結局、 Length == 0 と一緒。\nif (new int[] { }[..][..][..] is [.. [.. []]])\n{\n}\n\n//## 利用例1: BOM 除去\n\n// こういう使い方なら実用的かなぁという例。\n// UTF-8 なシーケンスから BOM の除去。\nvar utf8 = Encoding.UTF8.GetBytes(\"何か\").AsSpan();\n\nif (utf8 is [0xEF, 0xBB, 0xBF, .. var noBom])\n{\n    utf8 = noBom;\n}\n\nforeach (var c in utf8)\n{\n    Console.WriteLine(c);\n}\n\n//## 利用例2: head-tail 再起\n\n// まあ、よくあるのは関数型言語でよく見る head-tail。\nm(new byte[] { 1, 2, 3, 4 });\n\nvoid m(Span<byte> span)\n{\n    if (span is [var head, .. var tail])\n    {\n        m(tail);\n        Console.WriteLine(head);\n    }\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.1p3/NullCheck/NullCheck.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.1p3/NullCheck/Program.cs",
    "content": "﻿{ }\n\n#if false\n// !! は「いったん取りやめ」になって、17.3p2 でコンパイル通らなくなってる。\n\n#pragma warning disable IDE0060\n\n//## 引数の後ろに !!\n\n// 引数名の後ろに !! を付けることによって、引数の null チェックコードが挿入される。\nvoid m(string s!!) { }\n\nm(\"abc\"); // OK\n\ntry\n{\n    // 本来、(#nullable enable な状況下で) m に null は渡しちゃいけないんだけど、\n    // 警告を無視して立ち悪く null を渡すことが可能。\n    m(null!);\n\n    // この場合はこんなことするやつが悪いものの、古いコードを参照したり unsafe とか使ってると事故で紛れ込むこともある。\n    // 要するに、#nullable enable (NRT) を100%信用してはいけない状況での次善策。\n\n    // ちなみに、\n    // ! は「人間が null 安全保証するように頑張るからとりあえず何もしないでくれ。null なまま dereference しないように人手で頑張る。」\n    // !! は「NRT を無視して null を渡してくるやつがいるかもしれない。その場合は容赦なく例外を出してくれ。」\n    // という感じで、似てるようで結果は真逆。\n    // あと、「NRT を無視された場合の備え」なので、NRT とは相補的な機能。\n    //\n    // なので、同じ記号を使うのを避けて !! になった。\n    // 書き方が string!! s とかじゃないのも「型がらみの機能じゃないから」(型名にくっついてると「string!! 型」と勘違いされる)。\n}\ncatch (ArgumentNullException)\n{\n    Console.WriteLine(\"ここに来るはず。\");\n}\n\n//## !! の展開結果の説明\n\n// m と近しい手書きコード:\nm1(\"\");\n\n// 完全に手書き。\nvoid m1(string s)\n{\n    // ただ、throw はインライン展開を阻害しがちなので、\n    // 実はこんな感じで m1 内に直接 throw を書くのはちょっとだけパフォーマンスに不利だったりする。\n    if (s is null) throw new ArgumentNullException(nameof(s));\n}\n\nm2(\"\");\n\n// .NET 6 から入った ArgumentNullException.ThrowIfNull を活用。\nvoid m2(string s)\n{\n    // C# 10 の新機能である CallerArgumentExpression を使ってて、引数名の \"s\" は自動的に ThrowIfNull に渡る。\n    // C# 11 の s!! で早速あんまり使い道がなくなったけども… \n    ArgumentNullException.ThrowIfNull(s);\n}\n\n//## null チェックのタイミング\n\n// ちなみに、!! で挿入される null チェックは、手書きではどうやっても書けないくらい「早いタイミング」で呼ばれる。\ntry\n{\n    // base() もフィールド初期化子も呼ばれない。\n    // それよりも先に throw new ArgumentNullException。\n    new Derived(null!);\n}\ncatch { }\n\nclass Base\n{\n    public Base()\n    {\n        Console.WriteLine(\"Base コンストラクターが呼ばれた\");\n    }\n}\n\nclass Derived : Base\n{\n    // !! で挿入した null チェックは base() よりも前に呼ばれる。\n    public Derived(string s!!) : base()\n    {\n        // ここに if (s is null) throw を書くのだと base() 呼び出しよりも後になる。\n    }\n\n    public int X = InitX();\n\n    private static int InitX()\n    {\n        Console.WriteLine(\"Derived フィールド初期化子が呼ばれた\");\n        return 1;\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.2p1/CacheDelegate/CacheDelegate.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.2p1/CacheDelegate/Program.cs",
    "content": "﻿#pragma warning disable CS8321, IDE0051, IDE0062, IDE0090\n\n// 文法的には何も変化がないものの、内部的な最適化の話。\n\n// こんなメソッドがあったとして、\nstatic int square(int x) => x * x;\n\n// こんな感じでデリゲート化したいとする。\nFunc<int, int> f() => square;\n\n// f とほぼ等価なコード、昔はこうだった:\n// 毎回 Func デリゲートが new されて、毎回アロケーションが掛かる。\nFunc<int, int> f0() => new Func<int, int>(square);\n\n// ちなみに、ラムダ式の場合はキャッシュされる仕様なので、毎回はアロケーション掛からない。\nFunc<int, int> fLambda() => x => x * x;\n\npartial class Program\n{\n    static int square(int x) => x * x;\n\n    // C# 11 では、これに類するコード生成されて、上記の f でもキャッシュが掛かるようになった。\n    static Func<int, int>? _fCache;\n    static Func<int, int> f() => _fCache ??= new Func<int, int>(square);\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.2p1/RawStringLiteral/Program.cs",
    "content": "﻿using System.Text.Json;\n\n//## raw string literals\n\n// - 3個以上の \" から開始\n// - 複数行の場合、最初と最後の改行は無視される\n// - \" とか \"\" をエスケープなしで書ける(開始文字を \"\"\"\" とかにすれば、\"\"\" もエスケープなしで書ける)\n// - 最後の \"\"\" 行に合わせてインデントが揃えられる(それより前の空白は無視される)\nJsonDocument.Parse(\"\"\"\n    {\n        \"id\": 123,\n        \"name\": \"abc\",\n        \"data\": [ true, null, 1.23 ]\n    }\n    \"\"\");\n\n// これと等価なものを @\"\" で書くなら:\nJsonDocument.Parse(@\"{\n    \"\"id\"\": 123,\n    \"\"name\"\": \"\"abc\"\",\n    \"\"data\"\": [ true, null, 1.23 ]\n}\");\n\n//## 文字列長の例\n\n// 1\nConsole.WriteLine(\"\"\"\n    a\n    \"\"\".Length);\n\n// 0\nConsole.WriteLine(\"\"\"\n    \n    \"\"\".Length);\n\n// ちなみに、↓はコンパイルエラーになる。そりゃ。↑ の「長さ0文字列」よりも短くなっちゃう。\n#if false\nConsole.WriteLine(\"\"\"\n    \"\"\".Length);\n#endif\n\n// \"\"\" の行のインデント下げると…\n// 5\nConsole.WriteLine(\"\"\"\n    a\n\"\"\".Length);\n\n//## 単一行 raw string\n\n// 改行なしなら普通に単一行リテラルに:\n// 単に \" のエスケープが要らないだけ。\nJsonDocument.Parse(\"\"\"[true, null, \"abc\", 1.23]\"\"\");\n\n//## \" たくさん\n\n// 開始を \" 7個にしてみる。\nConsole.WriteLine(\"\"\"\"\"\"\"\n    \"\"\"\"\"\" エスケープなしで \" が6個\n    \"\"\"\"\" エスケープなしで \" が5個\n    \"\"\"\" エスケープなしで \" が4個\n    \"\"\" エスケープなしで \" が3個\n    \"\" エスケープなしで \" が2個\n    \" エスケープなしで \" が1個\n    \"\"\"\"\"\"\");\n\n//## interpolated raw string\n\n// - $ を付けて、interpolation もできる\n// - $ も任意個数付けれる\n//   - $ と同じ数だけ { } が必要\n//   - 例えば $$\"\"\" 開始だと、 {{ と }} で囲った場所が interpolation hole\n//   - この場合、1個だけの { と } はエスケープなしで書ける\n\nConsole.WriteLine(f(1000, \"abc\")); // { \"id\": 1000, \"name\": \"abc\" } (空白文字除く)\n\nstatic string f(int id, string name) => $$\"\"\"\n    {\n        \"id\": {{id}},\n        \"name\": \"{{name}}\"\n    }\n    \"\"\";\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.2p1/RawStringLiteral/RawStringLiteral.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.2p1/RawStringLiteral/Whitespaces.cs",
    "content": "﻿// see https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure\n\nnamespace RawStringLiteral;\n\ninternal class Whitespaces\n{\n    // C# is not whitespace sensitive.\n\t\u000b\f               public const string S = \"\"\"\n\t\u000b\f               abc\n\t\u000b\f               \"\"\";\n\n    public static void M()\n    {\n        // Whitespace\n        //     : [\\p{ Zs}]  // any character with Unicode class Zs\n        //     | '\\u0009'  // horizontal tab\n        //     | '\\u000B'  // vertical tab\n        //     | '\\u000C'  // form feed\n        //     ;\n        foreach (var c in \"\t\u000b\f                \")\n        {\n            Console.WriteLine($\"{(int)c:X}\");\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p1/AutoDefaultStruct/AutoDefaultStruct.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p1/AutoDefaultStruct/Program.cs",
    "content": "﻿var a = new AutoDefault(1);\nConsole.WriteLine($\"{a.X}, {a.Y}\"); // 1, 0\n\n// これまで、構造体のコンストラクターでは、\n// * コンストラクターを抜けるまでにすべてのフィールドを初期化しないとダメ\n// * 関数メンバー(プロパティとかメソッド)に触れる前にすべてのフィールドを初期化しないとダメ\n// みたいな制限があった。\n//\n// 特にこの制限を維持する理由もないみたいなので変更。\nstruct AutoDefault\n{\n    public int X;\n    public int Y; // CS0649 警告\n\n    public AutoDefault(int x)\n    {\n        X = x;\n\n        // Y に何も代入しないの、OK になった。\n        // (昔はエラーだった。今も警告は出る。)\n        //\n        // この場合、何も代入してないフィールドには自動的に 0 が入る。\n        // (0 というか、いわゆる既定値。0, false, null, default。)\n    }\n}\n\n#if false\n// というのも、C# 11 リリースまでには以下のような「半自動プロパティ構文」も入る予定で、\n// 「自動 0 初期化」の需要が上がった。\nstruct SemiAutoProperty\n{\n    // field がキーワードに。\n    // 自動的にバッキング フィールドへの読み書きになる。\n    public int X { get => field; set => field = value; }\n\n    public SemiAutoProperty(int x)\n    {\n        // 「フィールドを予期化しないままプロパティ(関数メンバー)を呼んじゃダメ」制限に引っかかりそう。\n        // auto-default の仕様が入ったなら、「X のバッキング フィールドは 0 初期化された状態で X の set を呼ぶ」になるので平気。\n        X = x;\n    }\n}\n#endif\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p1/CheckedOperator/CheckedOperator.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p1/CheckedOperator/Program.cs",
    "content": "﻿// 通常(オプション指定がないとき、unchecked 扱い)、整数型の算術演算はオーバーフローチェックしない。\nvar x = new Int4Bit(3);\n++x;\nConsole.WriteLine(x.Value);\n\n// 同じ処理でも checked ブロックで囲うと…\ntry\n{\n    var y = new Int4Bit(3);\n\n    checked\n    {\n        ++y;\n    }\n}\ncatch\n{\n    // ここに来るはず。\n    Console.WriteLine(\"overflow\");\n}\n\n//## checked operator の定義\n// こんな感じの特殊用途な整数型を作ったとして\nstruct Int4Bit\n{\n    private readonly byte _value;\n    public Int4Bit(int value) => _value = (byte)(value & 3);\n    public int Value => _value;\n\n    // デモ用に1個だけ演算子を実装。とりあえず簡単な ++ を。\n    public static Int4Bit operator ++(Int4Bit x) => new(x._value + 1);\n\n    // この型、このままだと int とかの組み込み型と違って、「オーバーフローした時の挙動」を選べない。\n    // 組み込み型に準ずるユーザー定義型を作りたいのにできないことがあった。\n\n    // generic math も導入されることだし、この「できないことがある」問題解消の動きが出てきた。\n    // operator checked って文法で、 unchecked/checkd で別実装を持てる。\n    public static Int4Bit operator checked ++(Int4Bit x) => x._value < 3 ? new(x._value + 1) : throw new Exception();\n}\n\n// dotnet/runtime で System.Int128 を足すみたいな話が出てるみたい。\n// (この文脈で checked operator の話が出て採用された。)\n// https://github.com/dotnet/runtime/pull/69204\n// https://github.com/dotnet/runtime/issues/67151\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p1/PatternROS/PatternROS.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p1/PatternROS/Program.cs",
    "content": "﻿Console.WriteLine(m(\"true\"));\nConsole.WriteLine(m(\"false\"));\nConsole.WriteLine(m(\"other\"));\n\n// ReadOnlySpan<char> に対して is とか switch で文字列リテラルとの比較ができるようになった。\nstatic bool? m(ReadOnlySpan<char> s) => s switch\n{\n    \"true\" => true,\n    \"false\" => false,\n    _ => null,\n};\n\n#if false\n// ちなみに、UTF-8 リテラルを使って ReadOnlySpan<byte> にマッチさせるのは無理。\n// 「\"\"u8 は const じゃないからパターンに使えない」みたいな理由。\n// (C# 11 正式リリースでもこれはできないままな可能性大。)\n\nstatic bool? error(ReadOnlySpan<byte> s) => s switch\n{\n    \"true\"u8 => true,\n    \"false\"u8 => false,\n    _ => null,\n};\n#endif\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p1/UnsignedRightShift/Program.cs",
    "content": "﻿using System.Numerics;\n\n//## >>> で論理シフト\n\n// signed な整数に対して、\nint x = -1;\n\n// >>> で右シフトすると論理シフト(符号ビットを引き継がない右シフト)になる。\nConsole.WriteLine(x >>> 16); // 65535\n\n// >> だと算術シフトで、 -1 はいくら右シフトしても -1。\nConsole.WriteLine(x >> 16);\n\n// これまでの C# だと、「論理シフトしたければ一度 uint にキャストしてくれ」ということになってた。\nConsole.WriteLine((uint)x >> 16); // 65535\n\n//## generic math\n// generic math が入ると、「T に対応する unsigned な型を取る手段がない」ということになって、 >>> が必要になったみたい。\n\n// unsigned の場合は想定通り動くけど、\nConsole.WriteLine(m<ushort>(0xffff)); // 0x0ff0\n\n// signed のときダメ。\nConsole.WriteLine(m<short>(-1)); // 0xfff0\n\nstatic T m<T>(T x)\n    where T : IShiftOperators<T, int, T>\n{\n    // 適当に「両端4ビットずつの値を消す」みたいなことをシフトでやるとして、\n    x <<= 8;\n    x >>= 4; // signed int の場合、算術シフトになっちゃう！\n    return x;\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p1/UnsignedRightShift/UnsignedRightShift.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p1/Utf8Literal/Program.cs",
    "content": "﻿#pragma warning disable CS0183, CS8321\n\n//## UTF-8 リテラル\n\n// 本音を言うなら Utf8String とか「UTF-8 を表す型」が欲しいし、\n// なんだったら string の中身を UTF-8 にしてほしいけども。\n// それは課題が多くて、やるとしても長期計画とかになっちゃって厳しい。\n//\n// そこまでやらなくても今ある需要の幾分かを解決できる手段として「リテラルだけ」を提供。\n// byte[] や Span<byte>、ReadOnlySpan<byte> に対して代入できる「UTF-8 バイト列を表すリテラル」が導入されることに。\n\n//## u8 接尾辞\n// \"\"u8 みたいに、\"\" の後ろに u8 接尾辞を付ける。\n\nvar utf8 = \"aあ🐈\"u8;\n\n// ちなみに、var を使うと現状(17.3p1)は ReadOnlySpan<byte> 型になる。\n// (もしかしたらリリースまでに ReadOnlySpan<byte> に変わるかも。)\nConsole.WriteLine(utf8 is ReadOnlySpan<byte>); // 常に true。\n\n// aあ🐈 を UTF-8 化したものなので、\n// 61 E3 81 82 F0 9F 90 88\n// が表示される。\nwrite(utf8);\n\nstatic void write(ReadOnlySpan<byte> utf8)\n{\n    foreach (byte x in utf8) Console.Write($\"{x:X2} \");\n    Console.WriteLine();\n}\n\n//## アロケーション回避\n// (u8 リテラルの仕様じゃなくて元からある仕様なものの)\n// ReadOnlySpan<byte> に対して定数 byte[] を代入すると、アロケーションがなくなる最適化が掛かる。\n\nReadOnlySpan<byte> span = \"aあ🐈\"u8; // new byte[] のアロケーションは消える。\nwrite(span);\n\n// 元からそうなので、\n// ReadOnlySpan<byte> span = new byte[] { 0x61, 0xE3, 0x81, 0x82, 0xF0, 0x9F, 0x90, 0x88 };\n// でも全く同じ結果。\n\n//## UTF-8 raw string literals\n// raw string との組み合わせも可能。\n\nvar raw = \"\"\"\n    abc\n    あいう\n    \"\"\"u8;\n\n// a  b  c  \\r \\n あ       い       う\n// 61 62 63 0D 0A E3 81 82 E3 81 84 E3 81 86\n// (改行文字はソースコードの文字コード設定次第。git の auto-crlf には注意。)\nwrite(raw);\n\n//## const じゃない\n// u8 リテラルは const にはなれない。\n// new byte[] が const になれないので、それと一緒。\n\n#if false\n// これは「そもそも const byte[] とは書けない」ということでエラー。\nconst byte[] constUtf8 = \"abc\"u8;\n\n// 既定値にも使えない。\nvoid m(byte[] utf8 = \"abc\"u8) { }\n\n// パターンにも使えない。\nif (utf8 is \"abc\"u8) { }\n\n// 属性の引数にも使えない。\n[MyAttribute(\"abc\"u8)]\nvoid m() { }\n#endif\n\n// new byte[] なら属性の引数に使えるのに…\n[MyAttribute(new byte[] { 0x61, 0xE3, 0x81 })] // これは OK。\nvoid m() { }\n\n// 属性の引数には const もしくは配列作成式(array creation expression)を渡せるんだけど、\n// \"\"u8 は new byte[] として解釈されるにも関わらず、array creation じゃない。\n// (これは C# 11 リリースまでにはもしかしたら改善されるかも。)\n\n//## 不正な UTF-8\n#if false\n// サロゲートペアの片割れとか、C# 文字列リテラルとしては有効だけど、UTF-8 としては無効な文字列がある。\n// そういう文字列リテラルに u8 を付けるとコンパイル エラーになる。\nReadOnlySpan<byte> ilformed = \"\\uD83D\"u8; // CS9026 エラー。\n#endif\n\n//## 変更予定\n#if false\n// 17.3p1 時点では書けてしまうコード:\n// 暗黙の変換はオーバーロード解決とか壊しちゃうみたいでやっぱやめるって。\n// 今後、u8 語尾必須になる予定。\nbyte[] implicitUtf8 = \"aあ🐈\";\n\n// 17.3p1 時点で書けないコード:\n// これはできるようにするかも。\nvar concat = \"abc\"u8 + \"def\"u8;\n\n// 今は↓みたいに書けるけど、上記の通り、暗黙の変換自体なくなる。\nbyte[] concat = \"abc\" + \"def\";\n\n// 17.3p1 時点で書けないコード:\n// 文字列補間もダメ。\n// これは要望は出てるけども多分 C# 11 リリース時点ではやれなさそう。\nbyte[] interpolation = $\"{utf8} + abc\"u8;\n#endif\n\nclass MyAttribute : Attribute\n{\n    public MyAttribute(byte[] bytes) { }\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p1/Utf8Literal/Utf8Literal.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/NameOfParameter/NameOfParameter.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/NameOfParameter/Program.cs",
    "content": "﻿#pragma warning disable CS8321\n\n//## nameof(parameter)\n//\n// メソッド引数に対して nameof(parameter) するときのスコープがちょっと変更。\n// * C# 10 まで: メソッドとか他の引数に付けた属性はスコープ外\n// * C# 11 以降: メソッドとか他の引数に付けた属性もスコープに入る\n\nusing System.Diagnostics.CodeAnalysis;\nusing System.Runtime.CompilerServices;\n\nstring s = m(\"\");\nConsole.WriteLine(s);\n\n// 今までこの属性、 NotNullIfNotNull(\"x\") と書かないといけなくて割かしつらかった。\n[return: NotNullIfNotNull(nameof(x))]\nstatic string? m(string? x) => x;\n\n// const string iterpolation と組み合わせれば…\n[My($\"\"\"\n    この文字列を Source Generator とかで使うとして、引数名を参照したいときに\n    {nameof(x)}, {nameof(y)}\n    こんな感じで引数の名前を埋め込める。\n    \"\"\")]\nvoid gen(int x, string y) { }\n\n// string.Create の引数はこんな感じ:\nstatic string Create(\n    IFormatProvider? provider,\n    Span<char> initialBuffer,\n    // これも C# 11 から OK に。\n    [InterpolatedStringHandlerArgument(nameof(provider), nameof(initialBuffer))]\n    ref DefaultInterpolatedStringHandler handler)\n{\n    return \"\";\n}\n\n// ArgumentNullException.ThrowIfNull の引数はこんな感じ:\nstatic void ThrowIfNull(\n    [NotNull] object? argument,\n    // この nameof(argument) も C# 11 から。\n    [CallerArgumentExpression(nameof(argument))] string? paramName = null)\n{ }\n\nclass MyAttribute : Attribute\n{\n    public MyAttribute(string message) { }\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/NumericIntPtr/NumericIntPtr.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/NumericIntPtr/Program.cs",
    "content": "﻿//## IntPtr に直接算術演算が定義された\n\nIntPtr x = 1;\nIntPtr y = 2;\n\n// C# 9 の頃から書けたコード:\nvar w = 3 * (nint)x + (nint)y << 2;\n\n// この行が .NET 7 以降でないとコンパイル通らないコード:\nIntPtr z = 3 * x + y << 2;\n\nConsole.WriteLine(z);\n\n// C# 9 で nint/nuint が入って、その当時は\n// * nint/nuint は内部的には IntPtr/UIntPtr になってる\n// * ただ、(当時)IntPtr/UIntPtr には算術演算がなかったので、nint/nuint のときはコンパイラーが特別扱いして算術演算コードを生成してた\n// * IntPtr/UIntPtr なのか nint/nuint なのかを区別するために NativeInteger 属性を付けてた\n// だった。\n//\n// .NET 7 でこの区別が不要になる。\n// なので、.NET 7 以降をターゲットにした場合、\n// * NativeInteger 属性を出力しない\n// * NativeInteger 属性が付いてるかどうかは無視する\n// * nint/nuint は完全に IntPtr/UIntPtr の別名になった\n// となるらしい。\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/RelaxingShiftOperator/Background.cs",
    "content": "﻿using System.Numerics;\n\nclass Background\n{\n    public static void M()\n    {\n        for (int i = 0; i < 10; i++)\n        {\n            Console.WriteLine($\"{i} {Log2(i)} {Mask(i)}\");\n        }\n    }\n\n    // こんな感じで「ビット数を調べる」みたいなことはそこそこ出番あり。\n    public static int Log2<T>(T x)\n        where T : IBinaryInteger<T>\n    {\n        var count = 0;\n        for (; x != T.Zero; x >>>= 1, count++) { }\n        return count;\n    }\n\n    // その手のビット数、その後シフト演算の右オペランドに使うことあり。\n    public static T Mask<T>(T x)\n        where T : IBinaryInteger<T>\n    {\n        var bits = Log2(x);\n        return (T.One << bits) - T.One;\n    }\n\n    // ↑ビット数、大体は int で十分だけども、戻り値の側も generic math にしたい場合も考えうる。\n    public static TBits Log2<T, TBits>(T x)\n        where T : IBinaryInteger<T>\n        where TBits : INumber<TBits>\n    {\n        var count = TBits.Zero;\n        for (; x != T.Zero; x >>>= 1, count++) { }\n        return count;\n    }\n\n    // 今、IShiftOperators が operator<< (TSelf, int) しか持っていないので、\n    // TBits を介した Mask は実装できない。\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/RelaxingShiftOperator/Drawback.cs",
    "content": "﻿using static Iostream;\n\nclass Drawback\n{\n    public static void M()\n    {\n        // C# の思想的には書かせたくないコードの例。\n        // 書けてしまうように。\n        _ = cout << \"Hellow World!\" << endl;\n\n        // まあ、「言語的に禁止するのはやりすぎ」、「ガイドラインで非推奨にすれば十分」ということになった。\n        //\n        // シフト演算子の制限緩和をしなくても(いままででも)、\n        // 「Path の連結に / を使う」みたいなことは出来ちゃってたわけだし。\n        // (これも「ガイドライン的にはダメ」と言われてる。)\n    }\n}\n\npublic static class Iostream\n{\n    public static readonly ConsoleOut cout = new();\n    public static readonly ConsoleEndLine endl = new();\n\n    public struct ConsoleOut\n    {\n        public static ConsoleOut operator <<(ConsoleOut x, string value) { Console.Write(value); return x; }\n        public static ConsoleOut operator <<(ConsoleOut x, ConsoleEndLine _) { Console.WriteLine(); return x; }\n    }\n\n    public struct ConsoleEndLine { }\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/RelaxingShiftOperator/Program.cs",
    "content": "﻿//## シフト演算子の右辺の制限緩和\n//\n// C# のシフト演算子のオーバーロード、これまでは「右オペランドは int でないとダメ」という制限が掛かってた。\n//\n// 思想的な問題で、C# は「組み込み型に対する使い方と著しく乖離した演算子オーバーロードはあんまり認めたくない」という感じ。\n// (「string の + の concat はいいのか」という批判はあり。\n//  少なくとも、C++ の cout << \"\" << endl; はさせたくない。)\n//\n// これも、generic math に伴って制限緩和が掛かることに。\n\n//### 背景\n//\n// 背景は Background.cs を参照。\n\n//### 制限緩和\n\nvar x = new Int4Bit(3);\nvar y = new Int4Bit(1);\nConsole.WriteLine(x << y);\n\n// 4ビット整数(0～15)みたいなのを作ったとして、\npublic struct Int4Bit\n{\n    public byte Value { get; }\n    public Int4Bit(int value) => Value = (byte)(0xF & value);\n    public override string ToString() => Value.ToString();\n\n    // シフト演算の右オペランドも「自身の型」でやれるように。\n    // (前までは int y しかダメだった。)\n    public static Int4Bit operator <<(Int4Bit x, Int4Bit y) => new(x.Value << y.Value);\n    public static Int4Bit operator >>(Int4Bit x, Int4Bit y) => new(x.Value >> y.Value);\n}\n\n//### 欠点\n//\n// 冒頭で「させたくない」と書いた cout << \"\" << endl; ができちゃう。\n// Drawback.cs 参照。\n//\n// 言語的に禁止しなくても、ガイドライン等整備して非推奨であることを伝えれば十分ではないかという感じの流れ。\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/RelaxingShiftOperator/RelaxingShiftOperator.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/RequiredMembers/MembersNotNull.cs",
    "content": "﻿#pragma warning disable CS8618\n\n//### 非 null 参照型フィールド/プロパティ\nclass MembersNotNull\n{\n    // C# 8.0 で null 共用参照型が入って以来、この X, Y に出てくる警告を真っ当に消す手段がなかった。\n    // 非 null な参照型のメンバーはコンストラクター内で初期化されないといけない。\n    // (このソースコードでは pragma で抑止してる。真っ当に消せるはずの警告も一緒に消えちゃったりするんであんまりよくない。)\n    //\n    // もちろん、コンストラクターを用意すれば解消はするものの…\n    // C# 9.0 で init の意味がちょっと薄れる。\n    public string X { get; init; }\n    public string Y { get; init; }\n}\n\n//### positional 初期化\n\n// 「コンストラクターを用意すれば解決とは言ったものの…\n// record がない頃はコンストラクターを書くのも結構面倒。\n\nclass InitWithConstructor\n{\n    // x, y の文字をそれぞれ4回書く必要あり。\n    public string X { get; init; }\n    public string Y { get; init; }\n    public InitWithConstructor(string x, string y)\n    {\n        X = x;\n        Y = y;\n    }\n\n    // さらに言うと、後からプロパティを足そうとすると…\n    public string Z { get; init; }\n\n    // コンストラクターももう1回書き直し。\n    public InitWithConstructor(string x, string y, string z)\n    {\n        X = x;\n        Y = y;\n        Z = z;\n    }\n}\n\n// record にはプライマリ コンストラクターっていう仕様があって、\n// 以下のようなコードから上記のようなプロパティとコンストラクターを生成してくれる。\n// これで多少面倒は減ったものの…\nrecord PositionalBase(string X, string Y);\n\n// 派生クラスを作ったときに X, Y をどこかから伝搬しないといけない。\n// だいたいは以下のように X, Y を再度書く必要あり。\nrecord PositionalDerived(string X, string Y, string Z) : PositionalBase(X, Y);\n\n//### nominal 初期化\n//\n// コンストラクター引数(順序に意味があるので「positional (位置による) 初期化」という)だから追加・拡張が面倒なので…\n// プロパティ初期化(名前に意味があるので「nominal (名前による)初期化」という)が欲しくなったり。\n\nrecord NominalBase\n{\n    public string X { get; init; }\n    public string Y { get; init; }\n}\n\nrecord NominalDerived : NominalBase\n{\n    // X, Y の伝搬不要！\n    public string Z { get; init; }\n}\n\n// そして冒頭の問題に戻る。\n// NominalBase に出てる「非 null 参照型プロパティはちゃんと初期化しろ」警告が消せない。 \n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/RequiredMembers/Program.cs",
    "content": "﻿//## Required メンバー\n//\n// C# 8.0 で null 許容参照型が入って以来ずっとある課題。\n// 非 null な参照型フィールド/プロパティがあると、コンストラクターが必須になっちゃう。\n// コンストラクターを用意するのが結構めんどくさい場面も多々あってしんどかった。\n// MembersNotNull.cs を参照。\n\nusing System.Diagnostics.CodeAnalysis;\n\n//### required 修飾子\n//\n// そこで C# 11 で導入されるのが required。\n// プロパティ(とか、public フィールド)に付けておくと、オブジェクト初期化子で初期化することを義務付けられるようになった。\n\nvar a = new A\n{\n    // ここの2行、どちらか片方でも削るとコンパイル エラーになる。\n    X = \"\",\n    Y = 1,\n};\n\nConsole.WriteLine(a);\n\nrecord A\n{\n    // required を付けると初期化子での初期化が必須になる。\n    public required string X { get; init; }\n    public required int Y { get; init; }\n\n    public A() { }\n\n    // ちなみに、「コンストラクターでちゃんと初期化してるから、初期化子で改めて値を渡す必要はないよ」みたいな実装をしたい場合、\n    // SetsRequiredMembers 属性を付ける。\n    // こっちなら var a = new A(\"\", 1); とか書ける。\n    [SetsRequiredMembers]\n    public A(string x, int y)\n    {\n        X = x;\n        Y = y;\n\n        // ただし注意が2点:\n        // * 「X だけは初期化したけど、Y は初期化子で渡してくれ」みたいな部分指定はできない\n        // * このコンストラクター内で Y に何も代入しなくても特に警告は出ない。実装者任せ\n    }\n\n    // 未対応のバージョンのコンパイラーで new A(); だけ呼ばれると困るので、\n    // A() の方には「対応していなければエラーになる属性」みたいなのを付けるみたい。\n    // (今のところ Obsolete 属性を使ってやってる。)\n}\n\n// ちなみに、virtual にしたりできる。\n// (abstract も可。)\nclass Base\n{\n    public virtual required string X { get; set; }\n}\n\nclass Derived : Base\n{\n    // 派生側で required を外すのはダメ。コンパイル エラーに。\n    //public override string X { get; init; }\n\n    // これなら OK。\n    public override required string X { get; set; }\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/RequiredMembers/RequiredMembers.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/StaticVirtual/GenericMath.cs",
    "content": "﻿// static abstract メンバーをふんだんに使って、\n// .NET 7 では、int とか float の + とか - とかの演算を全部インターフェイスを介して呼べるようになった。\n// System.Numeric.INumber インターフェイスってのが追加されてる。\n\nusing System.Numerics;\n\ninternal static class GenericMath\n{\n    // いままではこんなごく単純な Sum (総和)すら、ジェネリックには書けなかった。\n    public static T Sum<T>(this IEnumerable<T> source)\n        where T : INumber<T>\n    {\n        var sum = T.Zero; // ここの Zero とか\n        foreach (var x in source) sum += x; // ここの + 演算子とか\n        // この辺りのメンバーが static abstract で INumeric (の親インターフェイス)に定義されてる。\n        return sum;\n    }\n\n    public static void M()\n    {\n        // どの整数型を使っても呼べる。\n        // パフォーマンスもかなりいい。\n        Console.WriteLine(Sum(new byte[] { 1, 2, 3, 4, 5 }));\n        Console.WriteLine(Sum(new int[] { 1, 2, 3, 4, 5 }));\n        Console.WriteLine(Sum(new double[] { 1, 2, 3, 4, 5 }));\n    }\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/StaticVirtual/Parsable.cs",
    "content": "﻿using System.Buffers.Text;\nusing System.Text;\n\ninterface IUtf8Parsable<T>\n    where T : IUtf8Parsable<T>\n{\n    // 静的メンバーにしたいもの筆頭が、ファクトリメソッドの類。\n    // この例では Parse (文字列から T のインスタンスを作る)にしているものの、\n    // 例えば static T Create(); みたいなものの需要も結構高いはず。\n    static abstract T Parse(ReadOnlySpan<byte> utf8);\n\n    // virtual にもできる。\n    // デフォルト実装を持ちつつ、必要であればクラス側で別実装を書ける。\n    public static virtual T Parse(string s)\n    {\n        var buffer = (stackalloc byte[s.Length]);\n        var read = Encoding.ASCII.GetBytes(s, buffer);\n        return T.Parse(buffer[..read]);\n    }\n}\n\n// 実装例:\nrecord struct Point(int X, int Y) : IUtf8Parsable<Point>\n{\n    public static Point Parse(ReadOnlySpan<byte> utf8)\n    {\n        var i = utf8.IndexOf((byte)',');\n        var xs = utf8[..i];\n        var ys = utf8[(i + 1)..];\n\n        Utf8Parser.TryParse(xs, out int x, out _);\n        Utf8Parser.TryParse(ys, out int y, out _);\n\n        return new(x, y);\n    }\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/StaticVirtual/Program.cs",
    "content": "﻿//## static virtual\n//\n// インターフェイスの static abstract メソッドに対して実装を持てるようになった。\n// といっても、そもそも、static abstract 自体まだ例を挙げていないのでそこから。\n//\n// (一応、去年、preview のころにちょこっとだけサンプルを書いてる:\n//  https://github.com/ufcpp/UfcppSample/tree/master/Demo/2021/Csharp10/StaticAbstract/GenericMath/Algebra )\n\n//### static abstract\n//\n// インターフェイスの静的メンバーを abstract にできるようになった。\n// StaticAbstract.cs を参照。\n\nStaticAbstract.M();\n\n// 一番の用途は generic math。\n// GenericMath.cs を参照。\n\nGenericMath.M();\n\n// 注意点として、static abstract なメンバーは、全然動的な挙動をしない。\n// StaticBehavior.cs を参照。\n\nStaticBehavior.M();\n\n//### static virtual\n//\n// C# 8.0 で、インターフェイスにデフォルト実装を持てるようになってるわけで。\n// https://ufcpp.net/study/csharp/oo_interface.html?p=5#dim\n//\n// 今回正式に入る(C# 10 の頃に preview リリースされた) static abstract メンバーで、デフォルト実装を持てない理由もない。\n// ただ、まあ、17.3p2 でようやく実装されたとのこと。\n//\n// 文法的に static virtual って書くのでそのまま「static virtual メンバー」と言ったり、\n// デフォルト実装が DIM (default interface method) という呼ばれ方もあるので「DIM for static abstract」と言ったり。\n\nm(new Int4Bit(6), 4);\n\nstatic void m<T>(T start, int count)\n    where T : IAdditive<T>\n{\n    for (int i = 0; i < count; i++)\n    {\n        Console.WriteLine(start);\n        ++start;\n    }\n}\n\npublic interface IAdditive<T> where T : IAdditive<T>\n{\n    static abstract T One { get; }\n    static abstract T operator+(T a, T b);\n\n    // これが今回から可能に(static virtual)。\n    // インクリメントとか、+ 演算子と One があれば汎用に実装可能。\n    static virtual T operator ++(T a) => a + T.One;\n}\n\npublic struct Int4Bit : IAdditive<Int4Bit>\n{\n    public byte Value { get; }\n    public Int4Bit(int value) => Value = (byte)(0xF & value);\n    public override string ToString() => Value.ToString();\n\n    // static abstract を実装。\n    public static Int4Bit One => new(1);\n    public static Int4Bit operator +(Int4Bit a, Int4Bit b) => new(a.Value + b.Value);\n\n    // デフォルト実装で十分なら ↑ 3行で終わりだし、\n    // もし、別の実装を持ちたければ、以下のような行を足してもいい。\n    //public static Int4Bit operator ++(Int4Bit a) => new(a.Value + 1);\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/StaticVirtual/StaticAbstract.cs",
    "content": "﻿// インターフェイスの静的メンバーを abstract にできるように。\n// というか、C# 10 の頃から「preview feature」として提供されてた。\n// (当時は、EnablePreviewFeatures オプションを立てないと使えない状態。)\n// これも C# 11 で正式リリースで、オプション指定なしで使えるようになる。\n\nusing System.Buffers.Binary;\n\nclass StaticAbstract\n{\n    public static void M()\n    {\n        var a = new MyData { X = 1, Y = 2, Z = 3 };\n        var b = a.BinaryCopy();\n\n        a.X = 10;\n\n        Console.WriteLine(a);\n        Console.WriteLine(b);\n    }\n}\n\n// インターフェイスに static abstract なメンバーを定義する例。\ninterface ISerializable<TSelf>\n{\n    static abstract int RequiedBufferSize { get; }\n    void Format(Span<byte> destination);\n\n    // static でないと、この手のインスタンス新規作成系のメソッドを定義しにくかった。\n    // これまでもファクトリ インターフェイスを別途用意すれば出来はしたものの、\n    // TSelf に加えて TFactory みたいな別の型引数を追加で渡さないといけなかったり、結構面倒だった。\n    static abstract TSelf Parse(ReadOnlySpan<byte> source);\n}\n\n// 利用例\nstatic class Serializable\n{\n    public static TSelf BinaryCopy<TSelf>(this TSelf x)\n        where TSelf : ISerializable<TSelf>\n    {\n        // こことか\n        var buffer = (stackalloc byte[TSelf.RequiedBufferSize]);\n        x.Format(buffer);\n\n        // ここみたいに、型引数.メンバー名 で static abstract メンバーを参照できる。\n        return TSelf.Parse(buffer);\n    }\n}\n\n// インターフェイスの実装例。\nclass MyData : ISerializable<MyData>\n{\n    public int X { get; set; }\n    public int Y { get; set; }\n    public int Z { get; set; }\n    public override string ToString() => $\"{X}, {Y}, {Z}\";\n\n    public static int RequiedBufferSize => 12;\n\n    public void Format(Span<byte> destination)\n    {\n        BinaryPrimitives.WriteInt32LittleEndian(destination, X);\n        BinaryPrimitives.WriteInt32LittleEndian(destination[4..], Y);\n        BinaryPrimitives.WriteInt32LittleEndian(destination[8..], Z);\n    }\n\n    public static MyData Parse(ReadOnlySpan<byte> source)\n    {\n        return new()\n        {\n            X = BinaryPrimitives.ReadInt32LittleEndian(source),\n            Y = BinaryPrimitives.ReadInt32LittleEndian(source[4..]),\n            Z = BinaryPrimitives.ReadInt32LittleEndian(source[8..]),\n        };\n    }\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/StaticVirtual/StaticBehavior.cs",
    "content": "﻿// 静的なのとインスタンスなのと、1個ずつメンバーを用意。\ninterface IName\n{\n    static abstract string StaticName { get; }\n    string InstanceName { get; }\n}\n\n// IName を実装するクラスを派生させて作る。\nclass Base : IName\n{\n    static string IName.StaticName => \"static Base\";\n    string IName.InstanceName => \"instance Base\";\n}\n\nclass Derived : Base, IName\n{\n    static string IName.StaticName => \"static Derived\";\n    string IName.InstanceName => \"instance Derived\";\n}\n\n// 呼び出し側:\nclass StaticBehavior\n{\n    public static void WriteName<T>(T x)\n        where T : IName\n    {\n        Console.WriteLine(x.InstanceName); // 通常の abstract\n        Console.WriteLine(T.StaticName);   // static abstract\n    }\n\n    public static void M()\n    {\n        // この2つは型引数の静的な型とインスタンスの型が一致しているので変なことにはならない。\n        WriteName(new Base());\n        WriteName(new Derived());\n\n        // こういうのがちょっと注意が必要。\n        // 型引数は Base だけど、 x に渡る引数には Derived が入ってる。\n        // 出力は、\n        // instance Derived\n        // static Base\n        // になる。\n        WriteName<Base>(new Derived());\n\n        // コンパイル時に渡した型引数によって動作が決まっちゃう。\n        // 動的な挙動は全然しない。\n    }\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.3p2/StaticVirtual/StaticVirtual.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.4p1/FileLocal/A.cs",
    "content": "﻿// Program.cs にも同名のクラスがいるけど別物。\nfile class X\n{\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.4p1/FileLocal/FileLocal.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.4p1/FileLocal/Inheritance.cs",
    "content": "﻿namespace FileLocal;\n\n// file-local なクラスで public なクラスを継承。\nfile class FileDerived : Base\n{\n}\n\npublic class Base\n{\n    // これはダメ。\n    // file-local な型を public な引数・戻り値には書けない。\n    //public static FileDerived Create() => new X();\n\n    // これは書けるので、大体これでやる。\n    public static Base Create() => new FileDerived();\n}\n\n#if ERROR\n// 逆はダメ。\nfile class FileBase { }\nclass Derived : FileBase { } // CS9053 エラー。\n#endif\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.4p1/FileLocal/Interface.cs",
    "content": "﻿// file-local なインターフェイスも OK だし、\n// それを public な型で実装するのも OK。\n\npublic class CX : IX // OK\n{\n    // file 修飾子は top-level の型にしか付けれないみたいで、\n    // file void M() { } とかは書けない。\n\n    // でも、 file-local インターフェイス で明示的実装しておけば実質 file-local メソッドに。\n    void IX.M() { }\n}\n\nfile interface IX\n{\n    void M(); // これを明示的実装すれば file 内限定メソッド作れる。\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.4p1/FileLocal/Program.cs",
    "content": "﻿1.M();\n\nConsole.WriteLine(FileLocal.R.M().IsMatch(\"1234\"));\n\n// Program.cs 内でだけ有効なクラス。\n// A.cs とかの別のファイルに同名のクラスがいても平気。\nfile static class X\n{\n    // なので、この拡張メソッド M も、Program.cs 内でだけ参照可能。\n    public static void M(this int x) => Console.WriteLine($\"{x} in Program.cs\");\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.4p1/FileLocal/R.cs",
    "content": "﻿using System.Text.RegularExpressions;\n\nnamespace FileLocal;\n\ninternal partial class R\n{\n    // file 修飾子、Source Generator で使う需要が高い。\n    // 例えば、RegexGenerator は早速使ってる。\n    [GeneratedRegex(@\"\\d+\")]\n    public static partial Regex M();\n\n    // ↑このメソッドから、\n    // file sealed class M_0 : Regex { } みたいなクラスが作られてる。\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.4p1/RefField/FixedArray.cs",
    "content": "﻿#pragma warning disable IDE0044, IDE0051, CS0169\n\nusing System.Runtime.InteropServices;\n\nnamespace RefField;\n\npublic ref struct FixedArray4<T>\n{\n    private T _x0, _x1, _x2, _x3;\n\n#if NET7_PREVIEW7\n    // ほんとは UnscopedRef 属性ってのがあって、それに対応した暁には解決するものの…\n    // 現状、この行をコンパイルする手段がない。\n    public ref T this[int index] => ref Unsafe.Add(ref _x0, index);\n#endif\n\n    // MemoryMarshal.CreateSpan は互換性のため / Unsafe な手段を取りたいときのために、\n    // ref 引数が scoped ref になってる(.NET 7 から)。\n    // なので、このコードはコンパイルできる。\n    // ただし… これを TargetFramework net6.0 に変えたらコンパイルできなくなる(scoped 修飾子がないので)。\n    public ref T this[int index] => ref MemoryMarshal.CreateSpan(ref _x0, 4)[index];\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.4p1/RefField/MultipleRefReturn.cs",
    "content": "﻿// (ref int, ref int) みたいな、「ref 戻り値の多値戻り値」を書きたい。\n\nnamespace RefField;\n\npartial class Program\n{\n#if 本当に書きたかったもの\n    private static (ref int, ref int) M(ref int a, ref int b, ref int c)\n    {\n        // 実際には何かしら分岐するとして、とりあえずデモ用に常に a, b を返す。\n        return (ref a, ref b);\n    }\n\n    // ValueTuple<ref int, ref int> (要は ref 型引数)が書ければいいんだけども…\n    // 要望としては出てるけども、ちょっと実装するとなると大変そう。\n#endif\n\n    // ref 多値戻り値代わりに RefTuple (後ろで実装)を使う。\n    // これなら書ける。\n    private static RefTuple<int, int> M(ref int a, ref int b, ref int c)\n    {\n        return new(ref a, ref b);\n    }\n\n    public static void MultipleRefReturnExample()\n    {\n        int x = 1;\n        int y = 1;\n        int z = 1;\n\n        var (r1, r2) = M(ref x, ref y, ref z);\n\n        r1.Reference = 2;\n        r2.Reference = 3;\n\n        Console.WriteLine((x, y, z)); // 2, 3, 1\n    }\n}\n\n// 現状、(ref x, ref y) みたいなタプルを作れないので、その代わりになる型を用意。\nref struct RefTuple<T1, T2>\n{\n    public ref T1 Item1;\n    public ref T2 Item2;\n\n    public RefTuple(ref T1 item1, ref T2 item2)\n    {\n        Item1 = ref item1;\n        Item2 = ref item2;\n    }\n\n    // ref のまま分解したいんだけど…\n#if false\n    // これは書けるけど、やりたいことじゃない。\n    public void Deconstruct(out T1 item1, out T2 item2)\n    {\n        item1 = Item1;\n        item2 = Item2;\n    }\n\n    // 本当にやりたいことはこれだけど、無理。\n    // すなわち、ref tuple deconstruct 無理。\n    public void Deconstruct(out ref T1 item1, out ref T2 item2)\n    {\n        item1 = ref Item1;\n        item2 = ref Item2;\n    }\n#endif\n\n    // ref deconstruct やろうとすると、\n    // ByReference<T> みたいなものを介する必要あり。\n    public void Deconstruct(out ByReference<T1> item1, out ByReference<T2> item2)\n    {\n        item1 = new(ref Item1);\n        item2 = new(ref Item2);\n    }\n}\n\n// せっかく ref field を書けるようになったけど、結局「ref field 1個だけ持つラッパー構造体」が必要に…\nref struct ByReference<T>\n{\n    public ref T Reference;\n    public ByReference(ref T reference) => Reference = ref reference;\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.4p1/RefField/Program.cs",
    "content": "﻿#pragma warning disable CS8321\n\nConsole.WriteLine(\"Hello, World!\");\n\nstatic A m1()\n{\n    var a = new A();\n    return a;\n}\n\nstatic A m2(ref int x)\n{\n    var a = new A() { X = ref x };\n    return a;\n}\n\n#if ERROR\nstatic A m3()\n{\n    var x = 1;\n    var a = new A();\n    a.X = ref x; // エラー: local x を scoped じゃない a に代入。\n    return a; // その代わり、return しても OK。\n}\n#endif\n\nstatic void m4()\n{\n    var x = 1;\n    scoped var a = new A();\n    a.X = ref x; // これは OK。\n}\n\n#if ERROR\nstatic A m5()\n{\n    var x = 1;\n    scoped var a = new A { X = ref x };\n    return a; // エラー: scoped a を return。\n}\n#endif\n\nref struct A { public ref int X; }\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.4p1/RefField/RefField.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/Csharp11/17.4p1/RefField/TypedRef.cs",
    "content": "﻿// object を介することによる box 化を、TypedReference もどきで回避できないかという試み。\n\nusing System.Runtime.CompilerServices;\n\nnamespace RefField;\n\n// やってることは System.TypedReference とほぼ一緒。\n// TypedReference の利用条件緩和が掛かればそのまま使えるかも。\nreadonly ref struct TypedRef\n{\n    public readonly Type Type;\n    private readonly ref byte _reference;\n\n    private TypedRef(Type type, ref byte reference)\n    {\n        Type = type;\n        _reference = ref reference;\n    }\n\n    public static TypedRef Create<T>(ref T reference) => new(typeof(T), ref Unsafe.As<T, byte>(ref reference));\n\n    public ref T Cast<T>()\n    {\n        if (typeof(T) != Type) throw new InvalidCastException();\n        return ref Unsafe.As<byte, T>(ref _reference);\n    }\n}\n\n// TypedRef 利用例。\nstruct A\n{\n    public int X;\n    public float Y;\n    public string Z;\n\n    public override string ToString() => $\"{X}, {Y}, {Z}\";\n\n    // リフレクションは重たいし、↓こんなコードをコード生成するとして…\n    public object GetValue(int index) => index switch\n    {\n        0 => X, // box 化が気になる。\n        1 => Y, // box 化が気になる。\n        2 => Z,\n        _ => throw new IndexOutOfRangeException(),\n    };\n\n    public void SetValue(int index, object value)\n    {\n        switch (index)\n        {\n            case 0: X = (int)value; break; // box 化が気になる。\n            case 1: Y = (float)value; break; // box 化が気になる。\n            case 2: Z = (string)value; break;\n            default: throw new IndexOutOfRangeException();\n        }\n    }\n}\n\nstatic class AExtensions\n{\n    // 代わりにこんなの活用できないかなぁとか思う。\n    // (UnscopedRef 属性がサポートされたらインスタンス メソッドにできる。\n    //  .NET 7 Preview 7 時点ではまだなので、いったん拡張メソッド。)\n    public static TypedRef GetReference(ref this A a, int index) => index switch\n    {\n        0 => TypedRef.Create(ref a.X),\n        1 => TypedRef.Create(ref a.Y),\n        2 => TypedRef.Create(ref a.Z),\n        _ => throw new IndexOutOfRangeException(),\n    };\n}\n\npartial class Program\n{\n    public static void TypedRefExample()\n    {\n        var a = new A();\n\n        a.SetValue(0, 1);    // box 化\n        a.SetValue(1, 1.2f); // box 化\n        a.SetValue(2, \"abc\");\n\n        Console.WriteLine(a);\n\n        // 速くなるかどうかはちょっと怪しい(測ってみないとわかんない)けど、一応 box 化は避けれる。\n        a.GetReference(0).Cast<int>() = 2;\n        a.GetReference(1).Cast<float>() = 2.5f;\n        a.GetReference(2).Cast<string>() = \"xyz\";\n\n        Console.WriteLine(a);\n    }\n}\n"
  },
  {
    "path": "Demo/2022/Csharp11/Csharp11.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30114.105\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"17.1p1\", \"17.1p1\", \"{8167A848-77DB-4D44-9DFB-315E882444C0}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NewlineInInterpolation\", \"17.1p1\\NewlineInInterpolation\\NewlineInInterpolation.csproj\", \"{A19C3040-44DA-4DD6-9FFB-BB51D8460E2A}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"17.1p2\", \"17.1p2\", \"{EDDE37D8-66F9-4718-A12B-6DDDCE606E88}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ListPattern\", \"17.1p2\\ListPattern\\ListPattern.csproj\", \"{D050C39C-840C-45B6-AA5C-551ED1FB9315}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"17.1p3\", \"17.1p3\", \"{5BCEF54B-FA34-4B2C-8148-D919A1E99A1C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NullCheck\", \"17.1p3\\NullCheck\\NullCheck.csproj\", \"{E3CABDF4-9355-4C79-B477-A5182B87E5F4}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"17.2p1\", \"17.2p1\", \"{A7F23F1D-3E74-49CF-82FD-B8C11A8E252E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CacheDelegate\", \"17.2p1\\CacheDelegate\\CacheDelegate.csproj\", \"{C8ED39E3-B55C-40C7-B139-1D37467374C5}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RawStringLiteral\", \"17.2p1\\RawStringLiteral\\RawStringLiteral.csproj\", \"{C7F0B0BB-48B9-417A-B301-5C01FCE05B32}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"17.0\", \"17.0\", \"{26C7590B-7ABA-4066-9FA0-397C15D28538}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"GenericAttribute\", \"17.0\\GenericAttribute\\GenericAttribute.csproj\", \"{D2D10C86-F4C8-430E-89BF-FC6ED0419496}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"17.3p1\", \"17.3p1\", \"{D568A760-BB19-45A3-9ED6-8FE91B498D8C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"UnsignedRightShift\", \"17.3p1\\UnsignedRightShift\\UnsignedRightShift.csproj\", \"{1C2C3DFA-9015-47A4-B929-B5F5D2E97736}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CheckedOperator\", \"17.3p1\\CheckedOperator\\CheckedOperator.csproj\", \"{4636292D-5B78-454B-BAD8-52F1C1D910B9}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"PatternROS\", \"17.3p1\\PatternROS\\PatternROS.csproj\", \"{3F79D512-2294-4CD8-989B-A12999588F56}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"AutoDefaultStruct\", \"17.3p1\\AutoDefaultStruct\\AutoDefaultStruct.csproj\", \"{C44EEC16-B8DF-41DF-AD3D-FF7FB95053CC}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Utf8Literal\", \"17.3p1\\Utf8Literal\\Utf8Literal.csproj\", \"{CF819F0B-705C-484D-AAE2-C37A8D7DD5AF}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"17.3p2\", \"17.3p2\", \"{2004C6D6-3774-47C8-84B9-F1AAF9FC838E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NumericIntPtr\", \"17.3p2\\NumericIntPtr\\NumericIntPtr.csproj\", \"{F0D0B1F1-13BC-4AEF-946C-191C87BEE42D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NameOfParameter\", \"17.3p2\\NameOfParameter\\NameOfParameter.csproj\", \"{51C6CDC9-381F-4469-AE67-2994E88D690E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RequiredMembers\", \"17.3p2\\RequiredMembers\\RequiredMembers.csproj\", \"{C78CD201-2EE6-4C81-911C-A7CCBDE8A352}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RelaxingShiftOperator\", \"17.3p2\\RelaxingShiftOperator\\RelaxingShiftOperator.csproj\", \"{5C752491-20CA-41AD-B89C-14BE037ECBE7}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"StaticVirtual\", \"17.3p2\\StaticVirtual\\StaticVirtual.csproj\", \"{1095925F-262B-4120-BD9B-8447351E367B}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"17.4p1\", \"17.4p1\", \"{EEC271E3-B36C-431E-BD9E-4A6B7F806847}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"FileLocal\", \"17.4p1\\FileLocal\\FileLocal.csproj\", \"{D4D10EDD-CF6B-41CF-9F90-E5543E5973B2}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"RefField\", \"17.4p1\\RefField\\RefField.csproj\", \"{E5D040FB-005E-4239-BB7C-46BEED8B9ECE}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{A19C3040-44DA-4DD6-9FFB-BB51D8460E2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A19C3040-44DA-4DD6-9FFB-BB51D8460E2A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A19C3040-44DA-4DD6-9FFB-BB51D8460E2A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A19C3040-44DA-4DD6-9FFB-BB51D8460E2A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D050C39C-840C-45B6-AA5C-551ED1FB9315}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D050C39C-840C-45B6-AA5C-551ED1FB9315}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D050C39C-840C-45B6-AA5C-551ED1FB9315}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D050C39C-840C-45B6-AA5C-551ED1FB9315}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E3CABDF4-9355-4C79-B477-A5182B87E5F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E3CABDF4-9355-4C79-B477-A5182B87E5F4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E3CABDF4-9355-4C79-B477-A5182B87E5F4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E3CABDF4-9355-4C79-B477-A5182B87E5F4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C8ED39E3-B55C-40C7-B139-1D37467374C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C8ED39E3-B55C-40C7-B139-1D37467374C5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C8ED39E3-B55C-40C7-B139-1D37467374C5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C8ED39E3-B55C-40C7-B139-1D37467374C5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C7F0B0BB-48B9-417A-B301-5C01FCE05B32}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C7F0B0BB-48B9-417A-B301-5C01FCE05B32}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C7F0B0BB-48B9-417A-B301-5C01FCE05B32}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C7F0B0BB-48B9-417A-B301-5C01FCE05B32}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D2D10C86-F4C8-430E-89BF-FC6ED0419496}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D2D10C86-F4C8-430E-89BF-FC6ED0419496}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D2D10C86-F4C8-430E-89BF-FC6ED0419496}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D2D10C86-F4C8-430E-89BF-FC6ED0419496}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1C2C3DFA-9015-47A4-B929-B5F5D2E97736}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1C2C3DFA-9015-47A4-B929-B5F5D2E97736}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1C2C3DFA-9015-47A4-B929-B5F5D2E97736}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1C2C3DFA-9015-47A4-B929-B5F5D2E97736}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4636292D-5B78-454B-BAD8-52F1C1D910B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4636292D-5B78-454B-BAD8-52F1C1D910B9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4636292D-5B78-454B-BAD8-52F1C1D910B9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4636292D-5B78-454B-BAD8-52F1C1D910B9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3F79D512-2294-4CD8-989B-A12999588F56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3F79D512-2294-4CD8-989B-A12999588F56}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3F79D512-2294-4CD8-989B-A12999588F56}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3F79D512-2294-4CD8-989B-A12999588F56}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C44EEC16-B8DF-41DF-AD3D-FF7FB95053CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C44EEC16-B8DF-41DF-AD3D-FF7FB95053CC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C44EEC16-B8DF-41DF-AD3D-FF7FB95053CC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C44EEC16-B8DF-41DF-AD3D-FF7FB95053CC}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CF819F0B-705C-484D-AAE2-C37A8D7DD5AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CF819F0B-705C-484D-AAE2-C37A8D7DD5AF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CF819F0B-705C-484D-AAE2-C37A8D7DD5AF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CF819F0B-705C-484D-AAE2-C37A8D7DD5AF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F0D0B1F1-13BC-4AEF-946C-191C87BEE42D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F0D0B1F1-13BC-4AEF-946C-191C87BEE42D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F0D0B1F1-13BC-4AEF-946C-191C87BEE42D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F0D0B1F1-13BC-4AEF-946C-191C87BEE42D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{51C6CDC9-381F-4469-AE67-2994E88D690E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{51C6CDC9-381F-4469-AE67-2994E88D690E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{51C6CDC9-381F-4469-AE67-2994E88D690E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{51C6CDC9-381F-4469-AE67-2994E88D690E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{C78CD201-2EE6-4C81-911C-A7CCBDE8A352}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C78CD201-2EE6-4C81-911C-A7CCBDE8A352}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C78CD201-2EE6-4C81-911C-A7CCBDE8A352}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C78CD201-2EE6-4C81-911C-A7CCBDE8A352}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5C752491-20CA-41AD-B89C-14BE037ECBE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5C752491-20CA-41AD-B89C-14BE037ECBE7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5C752491-20CA-41AD-B89C-14BE037ECBE7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5C752491-20CA-41AD-B89C-14BE037ECBE7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{1095925F-262B-4120-BD9B-8447351E367B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{1095925F-262B-4120-BD9B-8447351E367B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{1095925F-262B-4120-BD9B-8447351E367B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{1095925F-262B-4120-BD9B-8447351E367B}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D4D10EDD-CF6B-41CF-9F90-E5543E5973B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D4D10EDD-CF6B-41CF-9F90-E5543E5973B2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D4D10EDD-CF6B-41CF-9F90-E5543E5973B2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D4D10EDD-CF6B-41CF-9F90-E5543E5973B2}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E5D040FB-005E-4239-BB7C-46BEED8B9ECE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E5D040FB-005E-4239-BB7C-46BEED8B9ECE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E5D040FB-005E-4239-BB7C-46BEED8B9ECE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E5D040FB-005E-4239-BB7C-46BEED8B9ECE}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{A19C3040-44DA-4DD6-9FFB-BB51D8460E2A} = {8167A848-77DB-4D44-9DFB-315E882444C0}\n\t\t{D050C39C-840C-45B6-AA5C-551ED1FB9315} = {EDDE37D8-66F9-4718-A12B-6DDDCE606E88}\n\t\t{E3CABDF4-9355-4C79-B477-A5182B87E5F4} = {5BCEF54B-FA34-4B2C-8148-D919A1E99A1C}\n\t\t{C8ED39E3-B55C-40C7-B139-1D37467374C5} = {A7F23F1D-3E74-49CF-82FD-B8C11A8E252E}\n\t\t{C7F0B0BB-48B9-417A-B301-5C01FCE05B32} = {A7F23F1D-3E74-49CF-82FD-B8C11A8E252E}\n\t\t{D2D10C86-F4C8-430E-89BF-FC6ED0419496} = {26C7590B-7ABA-4066-9FA0-397C15D28538}\n\t\t{1C2C3DFA-9015-47A4-B929-B5F5D2E97736} = {D568A760-BB19-45A3-9ED6-8FE91B498D8C}\n\t\t{4636292D-5B78-454B-BAD8-52F1C1D910B9} = {D568A760-BB19-45A3-9ED6-8FE91B498D8C}\n\t\t{3F79D512-2294-4CD8-989B-A12999588F56} = {D568A760-BB19-45A3-9ED6-8FE91B498D8C}\n\t\t{C44EEC16-B8DF-41DF-AD3D-FF7FB95053CC} = {D568A760-BB19-45A3-9ED6-8FE91B498D8C}\n\t\t{CF819F0B-705C-484D-AAE2-C37A8D7DD5AF} = {D568A760-BB19-45A3-9ED6-8FE91B498D8C}\n\t\t{F0D0B1F1-13BC-4AEF-946C-191C87BEE42D} = {2004C6D6-3774-47C8-84B9-F1AAF9FC838E}\n\t\t{51C6CDC9-381F-4469-AE67-2994E88D690E} = {2004C6D6-3774-47C8-84B9-F1AAF9FC838E}\n\t\t{C78CD201-2EE6-4C81-911C-A7CCBDE8A352} = {2004C6D6-3774-47C8-84B9-F1AAF9FC838E}\n\t\t{5C752491-20CA-41AD-B89C-14BE037ECBE7} = {2004C6D6-3774-47C8-84B9-F1AAF9FC838E}\n\t\t{1095925F-262B-4120-BD9B-8447351E367B} = {2004C6D6-3774-47C8-84B9-F1AAF9FC838E}\n\t\t{D4D10EDD-CF6B-41CF-9F90-E5543E5973B2} = {EEC271E3-B36C-431E-BD9E-4A6B7F806847}\n\t\t{E5D040FB-005E-4239-BB7C-46BEED8B9ECE} = {EEC271E3-B36C-431E-BD9E-4A6B7F806847}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2022/Csharp11/Directory.build.targets",
    "content": "<Project>\n\n  <PropertyGroup>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/EmbeddedLanguages/.editorconfig",
    "content": "[*.cs]\n\ncsharp_style_namespace_declarations=file_scoped:suggestion\n\n[*.csproj]\nindent_size=2\nindent_style=space\n"
  },
  {
    "path": "Demo/2022/EmbeddedLanguages/Directory.Build.targets",
    "content": "<Project>\n\n  <PropertyGroup>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/EmbeddedLanguages/EmbeddedLanguages.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.1.32120.378\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"WithoutFeatures\", \"WithoutFeatures\\WithoutFeatures.csproj\", \"{0334E6B2-4581-4A92-83A8-B1596A6DC0D8}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"WithFeatures\", \"WithFeatures\\WithFeatures.csproj\", \"{EE109E1F-16D8-48FD-856F-7F717F27F49C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Example\", \"Example\\Example.csproj\", \"{3220D034-9FBD-4E3E-A32E-A0556817E7FC}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{0334E6B2-4581-4A92-83A8-B1596A6DC0D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0334E6B2-4581-4A92-83A8-B1596A6DC0D8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0334E6B2-4581-4A92-83A8-B1596A6DC0D8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0334E6B2-4581-4A92-83A8-B1596A6DC0D8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{EE109E1F-16D8-48FD-856F-7F717F27F49C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EE109E1F-16D8-48FD-856F-7F717F27F49C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EE109E1F-16D8-48FD-856F-7F717F27F49C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EE109E1F-16D8-48FD-856F-7F717F27F49C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3220D034-9FBD-4E3E-A32E-A0556817E7FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3220D034-9FBD-4E3E-A32E-A0556817E7FC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3220D034-9FBD-4E3E-A32E-A0556817E7FC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3220D034-9FBD-4E3E-A32E-A0556817E7FC}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {0910A4C4-C73B-4AC0-82F7-0FE84592B6FB}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2022/EmbeddedLanguages/Example/Example.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/EmbeddedLanguages/Example/Program.cs",
    "content": "﻿// lang=regex\nvar s = @\"(?<name>\\w+?\\d{3})\\.txt\";\nConsole.WriteLine(s);\n"
  },
  {
    "path": "Demo/2022/EmbeddedLanguages/WithFeatures/WithFeatures.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Build.Locator\" Version=\"1.4.1\" />\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp.Workspaces\" Version=\"4.1.0-3.final\" />\n    <PackageReference Include=\"Microsoft.CodeAnalysis.Workspaces.MSBuild\" Version=\"4.1.0-3.final\" />\n  </ItemGroup>\n\n  <!-- WithoutFeatures の方との差はこれを参照しているかどうかだけ。 -->\n  <!-- これの中に RegexEmbeddedLanguage とかが入ってる。 -->\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp.Features\" Version=\"4.1.0-3.final\" />\n  </ItemGroup>\n\n  <!-- WithoutFeatures の方と全く同じソースコードを使う。 -->\n  <ItemGroup>\n    <Compile Include=\"../WithoutFeatures/*.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/EmbeddedLanguages/WithoutFeatures/Program.cs",
    "content": "﻿using Microsoft.Build.Locator;\nusing Microsoft.CodeAnalysis.Classification;\nusing Microsoft.CodeAnalysis.MSBuild;\nusing Microsoft.CodeAnalysis.Text;\n\nMSBuildLocator.RegisterDefaults();\n\n// MSBuildWorkspace はデフォルトで MEF から LanguageService を読むようになってるらしい。\nusing var workspace = MSBuildWorkspace.Create();\n\n// Example.csproj を開いて、Program.cs の中身を読む。\nvar project = await workspace.OpenProjectAsync(\"../../../../Example/Example.csproj\");\nvar doc = project.Documents.First(d => d.Name == \"Program.cs\");\nvar text = await doc.GetTextAsync();\n\n// Program.cs の構文解析結果を表示。\nvar classifiedSpans = await Classifier.GetClassifiedSpansAsync(doc, TextSpan.FromBounds(0, text.Length));\nforeach (var s in classifiedSpans)\n{\n    Console.WriteLine($\"{text.GetSubText(s.TextSpan)} ({s.TextSpan.Start}-{s.TextSpan.End}) : {s.ClassificationType}\");\n}\n"
  },
  {
    "path": "Demo/2022/EmbeddedLanguages/WithoutFeatures/WithoutFeatures.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net6.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Build.Locator\" Version=\"1.4.1\" />\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp.Workspaces\" Version=\"4.1.0-3.final\" />\n    <PackageReference Include=\"Microsoft.CodeAnalysis.Workspaces.MSBuild\" Version=\"4.1.0-3.final\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/EmbeddedLanguages/readme.md",
    "content": "# Embedded Languages\n\nVisual Studio 上で C# コードを書いていると、以下のような構文ハイライトが掛かります。\n\n![regex 構文ハイライト](fig/LangRegex.png)\n\n正規表現の部分にもちゃんと構文ハイライトが掛かっています。\n\nさすがに C# コンパイラー本体がこの処理をしているわけではなくて、プラグインみたいです。\n以下のような流れでハイライトが掛かるみたいです。\n\n* C# コンパイラーは [MEF](https://docs.microsoft.com/ja-jp/dotnet/framework/mef/) で拡張機能を足せる作りになっている\n* [MSBuildWorkspace はデフォルトで](https://github.com/dotnet/roslyn/blob/834f4057b67df99410e3052bfe64c82043eaa374/src/Workspaces/Core/MSBuild/MSBuild/MSBuildWorkspace.cs#L63)実行ファイルと同一フォルダー内にある MEF コンポーネントをロードする\n* [Microsoft.CodeAnalysis.CSharp.Features](https://www.nuget.org/packages/Microsoft.CodeAnalysis.CSharp.Features/) 内に正規表現の構文解析をする MEF コンポーネントが入っている\n* 現状の上記パッケージに入っているコード: [Roslyn リポジトリ内の EmbeddedLanguages フォルダー](https://github.com/dotnet/roslyn/tree/main/src/Features/Core/Portable/EmbeddedLanguages)\n\nということで、Microsoft.CodeAnalysis.CSharp.Features 参照の有無で、`Classifier` の結果が変わります。\n[WithoutFeatures](WithoutFeatures)の方は参照なし、\n[WithFeatures](WithFeatures)の方は参照ありで、\nその他のコードはすべて同じです。\nで、これらの実行結果は以下の通り。\n\nWithoutFeatures の方:\n\n```txt\n// lang=regex (0-13) : comment\nvar (15-18) : keyword\ns (19-20) : local name\n= (21-22) : operator\n@\"(?<name>\\w+?\\d{3})\\.txt\" (23-49) : string - verbatim\n; (49-50) : punctuation\nConsole (52-59) : class name\nConsole (52-59) : static symbol\n. (59-60) : operator\nWriteLine (60-69) : method name\nWriteLine (60-69) : static symbol\n( (69-70) : punctuation\ns (70-71) : local name\n) (71-72) : punctuation\n; (72-73) : punctuation\n```\n\nWithFeatures の方:\n\n```txt\n// lang=regex (0-13) : comment\nvar (15-18) : keyword\ns (19-20) : local name\n= (21-22) : operator\n@\"(?<name>\\w+?\\d{3})\\.txt\" (23-49) : string - verbatim\n( (25-26) : regex - grouping\n? (26-27) : regex - grouping\n< (27-28) : regex - grouping\nname (28-32) : regex - grouping\n> (32-33) : regex - grouping\n\\ (33-34) : regex - character class\nw (34-35) : regex - character class\n+ (35-36) : regex - quantifier\n? (36-37) : regex - quantifier\n\\ (37-38) : regex - character class\nd (38-39) : regex - character class\n{ (39-40) : regex - quantifier\n3 (40-41) : regex - quantifier\n} (41-42) : regex - quantifier\n) (42-43) : regex - grouping\n\\ (43-44) : regex - self escaped character\n. (44-45) : regex - self escaped character\ntxt (45-48) : regex - text\n; (49-50) : punctuation\nConsole (52-59) : static symbol\nConsole (52-59) : class name\n. (59-60) : operator\nWriteLine (60-69) : static symbol\nWriteLine (60-69) : method name\n( (69-70) : punctuation\ns (70-71) : local name\n) (71-72) : punctuation\n; (72-73) : punctuation\n```\n\n"
  },
  {
    "path": "Demo/2022/NBitInt/ConsoleApp1/ConsoleApp1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\NBitInt\\NBitInt.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/NBitInt/ConsoleApp1/Program.cs",
    "content": "﻿using NBitInt;\nusing NBitInt.IntConstants;\n\nInt<byte, _1> a = default;\nInt<byte, _2> b = default;\nInt<byte, _4> c = default;\nInt<byte, _7> d = default;\nInt<short, _9> e = default;\n\nfor (int i = 0; i < 1024; i++, a++, b++, c++, d++, e++)\n{\n    Console.WriteLine($\"{a,3} {b,3} {c, 3} {d, 3} {e, 3}\");\n}\n"
  },
  {
    "path": "Demo/2022/NBitInt/NBitInt/IConstant.cs",
    "content": "﻿namespace NBitInt;\n\npublic interface IConstant<T>\n{\n    static abstract T Value { get; }\n}\n"
  },
  {
    "path": "Demo/2022/NBitInt/NBitInt/Int.cs",
    "content": "﻿using System.Diagnostics.CodeAnalysis;\nusing System.Globalization;\nusing System.Numerics;\n\nnamespace NBitInt;\n\npublic readonly struct Int<BaseInt, Bits> : IBinaryInteger<Int<BaseInt, Bits>>\n    where BaseInt : IBinaryInteger<BaseInt>\n    where Bits : IConstant<int>\n{\n    private static BaseInt Modulo => BaseInt.One << Bits.Value;\n    private static BaseInt Mask => Modulo - BaseInt.One;\n\n    public BaseInt Value { get; }\n    public Int(BaseInt value) => Value = value & Mask;\n\n    private static Int<BaseInt, Bits> Checked(BaseInt value)\n    {\n        if (value >= Modulo) throw new OverflowException();\n        return new(value);\n    }\n\n    public static int Radix => BaseInt.Radix;\n\n    public static Int<BaseInt, Bits> Zero => new(BaseInt.Zero);\n    public static Int<BaseInt, Bits> One => new(BaseInt.One);\n\n    public static Int<BaseInt, Bits> AdditiveIdentity => new(BaseInt.AdditiveIdentity);\n    public static Int<BaseInt, Bits> MultiplicativeIdentity => new(BaseInt.MultiplicativeIdentity);\n\n    public static Int<BaseInt, Bits> Abs(Int<BaseInt, Bits> value)\n        => new(BaseInt.Abs(value.Value));\n    public static Int<BaseInt, Bits> Clamp(Int<BaseInt, Bits> value, Int<BaseInt, Bits> min, Int<BaseInt, Bits> max)\n        => new(BaseInt.Clamp(value.Value, min.Value, max.Value));\n\n    public static (Int<BaseInt, Bits> Quotient, Int<BaseInt, Bits> Remainder) DivRem(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right)\n    {\n        var (q, r) = BaseInt.DivRem(left.Value, right.Value);\n        return (new(q), new(r));\n    }\n\n    public static bool IsCanonical(Int<BaseInt, Bits> value) => BaseInt.IsCanonical(value.Value);\n    public static bool IsComplexNumber(Int<BaseInt, Bits> value) => BaseInt.IsComplexNumber(value.Value);\n    public static bool IsEvenInteger(Int<BaseInt, Bits> value) => BaseInt.IsEvenInteger(value.Value);\n    public static bool IsFinite(Int<BaseInt, Bits> value) => BaseInt.IsFinite(value.Value);\n    public static bool IsImaginaryNumber(Int<BaseInt, Bits> value) => BaseInt.IsImaginaryNumber(value.Value);\n    public static bool IsInfinity(Int<BaseInt, Bits> value) => BaseInt.IsInfinity(value.Value);\n    public static bool IsInteger(Int<BaseInt, Bits> value) => BaseInt.IsInteger(value.Value);\n    public static bool IsNaN(Int<BaseInt, Bits> value) => BaseInt.IsNaN(value.Value);\n    public static bool IsNegative(Int<BaseInt, Bits> value) => BaseInt.IsNegative(value.Value);\n    public static bool IsNegativeInfinity(Int<BaseInt, Bits> value) => BaseInt.IsNegativeInfinity(value.Value);\n    public static bool IsNormal(Int<BaseInt, Bits> value) => BaseInt.IsNormal(value.Value);\n    public static bool IsOddInteger(Int<BaseInt, Bits> value) => BaseInt.IsOddInteger(value.Value);\n    public static bool IsPositive(Int<BaseInt, Bits> value) => BaseInt.IsPositive(value.Value);\n    public static bool IsPositiveInfinity(Int<BaseInt, Bits> value) => BaseInt.IsPositiveInfinity(value.Value);\n    public static bool IsPow2(Int<BaseInt, Bits> value) => BaseInt.IsPow2(value.Value);\n    public static bool IsRealNumber(Int<BaseInt, Bits> value) => BaseInt.IsRealNumber(value.Value);\n    public static bool IsSubnormal(Int<BaseInt, Bits> value) => BaseInt.IsSubnormal(value.Value);\n    public static bool IsZero(Int<BaseInt, Bits> value) => BaseInt.IsZero(value.Value);\n\n    public static Int<BaseInt, Bits> Log2(Int<BaseInt, Bits> value) => new(BaseInt.Log2(value.Value));\n    public static Int<BaseInt, Bits> Max(Int<BaseInt, Bits> x, Int<BaseInt, Bits> y) => new(BaseInt.Max(x.Value, y.Value));\n    public static Int<BaseInt, Bits> MaxMagnitude(Int<BaseInt, Bits> x, Int<BaseInt, Bits> y) => new(BaseInt.MaxMagnitude(x.Value, y.Value));\n    public static Int<BaseInt, Bits> MaxMagnitudeNumber(Int<BaseInt, Bits> x, Int<BaseInt, Bits> y) => new(BaseInt.MaxMagnitudeNumber(x.Value, y.Value));\n    public static Int<BaseInt, Bits> MaxNumber(Int<BaseInt, Bits> x, Int<BaseInt, Bits> y) => new(BaseInt.MaxNumber(x.Value, y.Value));\n    public static Int<BaseInt, Bits> Min(Int<BaseInt, Bits> x, Int<BaseInt, Bits> y) => new(BaseInt.Min(x.Value, y.Value));\n    public static Int<BaseInt, Bits> MinMagnitude(Int<BaseInt, Bits> x, Int<BaseInt, Bits> y) => new(BaseInt.MinMagnitude(x.Value, y.Value));\n    public static Int<BaseInt, Bits> MinMagnitudeNumber(Int<BaseInt, Bits> x, Int<BaseInt, Bits> y) => new(BaseInt.MinMagnitudeNumber(x.Value, y.Value));\n    public static Int<BaseInt, Bits> MinNumber(Int<BaseInt, Bits> x, Int<BaseInt, Bits> y) => new(BaseInt.MinNumber(x.Value, y.Value));\n\n    static Int<BaseInt, Bits> INumber<Int<BaseInt, Bits>>.CopySign(Int<BaseInt, Bits> value, Int<BaseInt, Bits> sign) => throw new NotImplementedException();\n    static int INumber<Int<BaseInt, Bits>>.Sign(Int<BaseInt, Bits> value) => throw new NotImplementedException();\n    static bool INumberBase<Int<BaseInt, Bits>>.TryConvertFromChecked<TOther>(TOther value, out Int<BaseInt, Bits> result) => throw new NotImplementedException();\n    static bool INumberBase<Int<BaseInt, Bits>>.TryConvertFromSaturating<TOther>(TOther value, out Int<BaseInt, Bits> result) => throw new NotImplementedException();\n    static bool INumberBase<Int<BaseInt, Bits>>.TryConvertFromTruncating<TOther>(TOther value, out Int<BaseInt, Bits> result) => throw new NotImplementedException();\n    static bool INumberBase<Int<BaseInt, Bits>>.TryConvertToChecked<TOther>(Int<BaseInt, Bits> value, [NotNullWhen(true)] out TOther? result) where TOther : default => throw new NotImplementedException();\n    static bool INumberBase<Int<BaseInt, Bits>>.TryConvertToSaturating<TOther>(Int<BaseInt, Bits> value, [NotNullWhen(true)] out TOther? result) where TOther : default => throw new NotImplementedException();\n    static bool INumberBase<Int<BaseInt, Bits>>.TryConvertToTruncating<TOther>(Int<BaseInt, Bits> value, [NotNullWhen(true)] out TOther? result) where TOther : default => throw new NotImplementedException();\n    static Int<BaseInt, Bits> IBinaryInteger<Int<BaseInt, Bits>>.LeadingZeroCount(Int<BaseInt, Bits> value) => throw new NotImplementedException();\n    static Int<BaseInt, Bits> IBinaryInteger<Int<BaseInt, Bits>>.TrailingZeroCount(Int<BaseInt, Bits> value) => throw new NotImplementedException();\n    static Int<BaseInt, Bits> IBinaryInteger<Int<BaseInt, Bits>>.PopCount(Int<BaseInt, Bits> value) => throw new NotImplementedException();\n    static Int<BaseInt, Bits> IBinaryInteger<Int<BaseInt, Bits>>.RotateLeft(Int<BaseInt, Bits> value, int rotateAmount) => throw new NotImplementedException();\n    static Int<BaseInt, Bits> IBinaryInteger<Int<BaseInt, Bits>>.RotateRight(Int<BaseInt, Bits> value, int rotateAmount) => throw new NotImplementedException();\n    int IBinaryInteger<Int<BaseInt, Bits>>.GetByteCount() => throw new NotImplementedException();\n    int IBinaryInteger<Int<BaseInt, Bits>>.GetShortestBitLength() => throw new NotImplementedException();\n\n    public static Int<BaseInt, Bits> operator +(Int<BaseInt, Bits> value) => new(+value.Value);\n    public static Int<BaseInt, Bits> operator +(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => new(left.Value + right.Value);\n    public static Int<BaseInt, Bits> operator checked +(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => Checked(left.Value + right.Value);\n    public static Int<BaseInt, Bits> operator -(Int<BaseInt, Bits> value) => new(-value.Value);\n    public static Int<BaseInt, Bits> operator checked -(Int<BaseInt, Bits> value) => Checked(-value.Value);\n    public static Int<BaseInt, Bits> operator -(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => new(left.Value - right.Value);\n    public static Int<BaseInt, Bits> operator checked -(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => Checked(left.Value - right.Value);\n\n    public static Int<BaseInt, Bits> operator ++(Int<BaseInt, Bits> value) => new(value.Value + BaseInt.One);\n    public static Int<BaseInt, Bits> operator checked ++(Int<BaseInt, Bits> value) => Checked(value.Value + BaseInt.One);\n    public static Int<BaseInt, Bits> operator --(Int<BaseInt, Bits> value) => new(value.Value - BaseInt.One);\n    public static Int<BaseInt, Bits> operator checked --(Int<BaseInt, Bits> value) => Checked(value.Value - BaseInt.One);\n\n    public static Int<BaseInt, Bits> operator *(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => new(left.Value * right.Value);\n    public static Int<BaseInt, Bits> operator checked *(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => Checked(left.Value * right.Value);\n    public static Int<BaseInt, Bits> operator /(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => new(left.Value / right.Value);\n    public static Int<BaseInt, Bits> operator checked /(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => Checked(left.Value / right.Value);\n    public static Int<BaseInt, Bits> operator %(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => new(left.Value % right.Value);\n\n    public static Int<BaseInt, Bits> operator ~(Int<BaseInt, Bits> value) => new(~value.Value);\n    public static Int<BaseInt, Bits> operator &(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => new(left.Value & right.Value);\n    public static Int<BaseInt, Bits> operator |(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => new(left.Value | right.Value);\n    public static Int<BaseInt, Bits> operator ^(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => new(left.Value ^ right.Value);\n\n    public static Int<BaseInt, Bits> operator <<(Int<BaseInt, Bits> value, int shiftAmount) => new(value.Value << shiftAmount);\n    public static Int<BaseInt, Bits> operator >>(Int<BaseInt, Bits> value, int shiftAmount) => new(value.Value >> shiftAmount);\n    public static Int<BaseInt, Bits> operator >>>(Int<BaseInt, Bits> value, int shiftAmount) => new(value.Value >>> shiftAmount);\n\n    public static bool operator ==(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => left.Value == right.Value;\n    public static bool operator !=(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => left.Value != right.Value;\n\n    public static bool operator <(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => left.Value < right.Value;\n    public static bool operator >(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => left.Value > right.Value;\n    public static bool operator <=(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => left.Value <= right.Value;\n    public static bool operator >=(Int<BaseInt, Bits> left, Int<BaseInt, Bits> right) => left.Value >= right.Value;\n\n    public int CompareTo(object? obj) => obj is Int<BaseInt, Bits> other ? CompareTo(other) : -1;\n    public int CompareTo(Int<BaseInt, Bits> other) => Value.CompareTo(other.Value);\n    public bool Equals(Int<BaseInt, Bits> other) => Value == other.Value;\n    public override bool Equals([NotNullWhen(true)] object? obj) => obj is Int<BaseInt, Bits> other && Equals(other);\n    public override int GetHashCode() => Value.GetHashCode();\n\n    public string ToString(string? format, IFormatProvider? formatProvider) => Value.ToString(format, formatProvider);\n\n    public bool TryFormat(Span<char> destination, out int charsWritten, ReadOnlySpan<char> format, IFormatProvider? provider)\n        => Value.TryFormat(destination, out charsWritten, format, provider);\n\n    public bool TryWriteBigEndian(Span<byte> destination, out int bytesWritten)\n        => Value.TryWriteBigEndian(destination, out bytesWritten);\n    public bool TryWriteLittleEndian(Span<byte> destination, out int bytesWritten)\n        => Value.TryWriteLittleEndian(destination, out bytesWritten);\n\n    public static Int<BaseInt, Bits> Parse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider? provider)\n        => new(BaseInt.Parse(s, style, provider));\n    public static Int<BaseInt, Bits> Parse(string s, NumberStyles style, IFormatProvider? provider)\n        => new(BaseInt.Parse(s, style, provider));\n    public static Int<BaseInt, Bits> Parse(ReadOnlySpan<char> s, IFormatProvider? provider)\n        => new(BaseInt.Parse(s, provider));\n    public static Int<BaseInt, Bits> Parse(string s, IFormatProvider? provider)\n        => new(BaseInt.Parse(s, provider));\n\n    public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider? provider, out Int<BaseInt, Bits> result)\n    {\n        if (BaseInt.TryParse(s, style, provider, out var v))\n        {\n            result = new(v);\n            return true;\n        }\n        else\n        {\n            result = Zero;\n            return false;\n        }\n    }\n\n    public static bool TryParse([NotNullWhen(true)] string? s, NumberStyles style, IFormatProvider? provider, out Int<BaseInt, Bits> result)\n    {\n        if (BaseInt.TryParse(s, style, provider, out var v))\n        {\n            result = new(v);\n            return true;\n        }\n        else\n        {\n            result = Zero;\n            return false;\n        }\n    }\n\n    public static bool TryParse(ReadOnlySpan<char> s, IFormatProvider? provider, out Int<BaseInt, Bits> result)\n    {\n        if (BaseInt.TryParse(s, provider, out var v))\n        {\n            result = new(v);\n            return true;\n        }\n        else\n        {\n            result = Zero;\n            return false;\n        }\n    }\n\n    public static bool TryParse([NotNullWhen(true)] string? s, IFormatProvider? provider, out Int<BaseInt, Bits> result)\n    {\n        if (BaseInt.TryParse(s, provider, out var v))\n        {\n            result = new(v);\n            return true;\n        }\n        else\n        {\n            result = Zero;\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2022/NBitInt/NBitInt/IntConstant.cs",
    "content": "﻿namespace NBitInt.IntConstants;\n\npublic struct _0 : IConstant<int> { public static int Value => 0; }\npublic struct _1 : IConstant<int> { public static int Value => 1; }\npublic struct _2 : IConstant<int> { public static int Value => 2; }\npublic struct _3 : IConstant<int> { public static int Value => 3; }\npublic struct _4 : IConstant<int> { public static int Value => 4; }\npublic struct _5 : IConstant<int> { public static int Value => 5; }\npublic struct _6 : IConstant<int> { public static int Value => 6; }\npublic struct _7 : IConstant<int> { public static int Value => 7; }\npublic struct _8 : IConstant<int> { public static int Value => 8; }\npublic struct _9 : IConstant<int> { public static int Value => 9; }\npublic struct _10 : IConstant<int> { public static int Value => 10; }\npublic struct _11 : IConstant<int> { public static int Value => 11; }\npublic struct _12 : IConstant<int> { public static int Value => 12; }\npublic struct _13 : IConstant<int> { public static int Value => 13; }\npublic struct _14 : IConstant<int> { public static int Value => 14; }\npublic struct _15 : IConstant<int> { public static int Value => 15; }\npublic struct _16 : IConstant<int> { public static int Value => 16; }\npublic struct _17 : IConstant<int> { public static int Value => 17; }\npublic struct _18 : IConstant<int> { public static int Value => 18; }\npublic struct _19 : IConstant<int> { public static int Value => 19; }\npublic struct _20 : IConstant<int> { public static int Value => 20; }\npublic struct _21 : IConstant<int> { public static int Value => 21; }\npublic struct _22 : IConstant<int> { public static int Value => 22; }\npublic struct _23 : IConstant<int> { public static int Value => 23; }\npublic struct _24 : IConstant<int> { public static int Value => 24; }\npublic struct _25 : IConstant<int> { public static int Value => 25; }\npublic struct _26 : IConstant<int> { public static int Value => 26; }\npublic struct _27 : IConstant<int> { public static int Value => 27; }\npublic struct _28 : IConstant<int> { public static int Value => 28; }\npublic struct _29 : IConstant<int> { public static int Value => 29; }\npublic struct _30 : IConstant<int> { public static int Value => 30; }\npublic struct _31 : IConstant<int> { public static int Value => 31; }\npublic struct _32 : IConstant<int> { public static int Value => 32; }\npublic struct _33 : IConstant<int> { public static int Value => 33; }\npublic struct _34 : IConstant<int> { public static int Value => 34; }\npublic struct _35 : IConstant<int> { public static int Value => 35; }\npublic struct _36 : IConstant<int> { public static int Value => 36; }\npublic struct _37 : IConstant<int> { public static int Value => 37; }\npublic struct _38 : IConstant<int> { public static int Value => 38; }\npublic struct _39 : IConstant<int> { public static int Value => 39; }\npublic struct _40 : IConstant<int> { public static int Value => 40; }\npublic struct _41 : IConstant<int> { public static int Value => 41; }\npublic struct _42 : IConstant<int> { public static int Value => 42; }\npublic struct _43 : IConstant<int> { public static int Value => 43; }\npublic struct _44 : IConstant<int> { public static int Value => 44; }\npublic struct _45 : IConstant<int> { public static int Value => 45; }\npublic struct _46 : IConstant<int> { public static int Value => 46; }\npublic struct _47 : IConstant<int> { public static int Value => 47; }\npublic struct _48 : IConstant<int> { public static int Value => 48; }\npublic struct _49 : IConstant<int> { public static int Value => 49; }\npublic struct _50 : IConstant<int> { public static int Value => 50; }\npublic struct _51 : IConstant<int> { public static int Value => 51; }\npublic struct _52 : IConstant<int> { public static int Value => 52; }\npublic struct _53 : IConstant<int> { public static int Value => 53; }\npublic struct _54 : IConstant<int> { public static int Value => 54; }\npublic struct _55 : IConstant<int> { public static int Value => 55; }\npublic struct _56 : IConstant<int> { public static int Value => 56; }\npublic struct _57 : IConstant<int> { public static int Value => 57; }\npublic struct _58 : IConstant<int> { public static int Value => 58; }\npublic struct _59 : IConstant<int> { public static int Value => 59; }\npublic struct _60 : IConstant<int> { public static int Value => 60; }\npublic struct _61 : IConstant<int> { public static int Value => 61; }\npublic struct _62 : IConstant<int> { public static int Value => 62; }\npublic struct _63 : IConstant<int> { public static int Value => 63; }\npublic struct _64 : IConstant<int> { public static int Value => 64; }\npublic struct _65 : IConstant<int> { public static int Value => 65; }\npublic struct _66 : IConstant<int> { public static int Value => 66; }\npublic struct _67 : IConstant<int> { public static int Value => 67; }\npublic struct _68 : IConstant<int> { public static int Value => 68; }\npublic struct _69 : IConstant<int> { public static int Value => 69; }\npublic struct _70 : IConstant<int> { public static int Value => 70; }\npublic struct _71 : IConstant<int> { public static int Value => 71; }\npublic struct _72 : IConstant<int> { public static int Value => 72; }\npublic struct _73 : IConstant<int> { public static int Value => 73; }\npublic struct _74 : IConstant<int> { public static int Value => 74; }\npublic struct _75 : IConstant<int> { public static int Value => 75; }\npublic struct _76 : IConstant<int> { public static int Value => 76; }\npublic struct _77 : IConstant<int> { public static int Value => 77; }\npublic struct _78 : IConstant<int> { public static int Value => 78; }\npublic struct _79 : IConstant<int> { public static int Value => 79; }\npublic struct _80 : IConstant<int> { public static int Value => 80; }\npublic struct _81 : IConstant<int> { public static int Value => 81; }\npublic struct _82 : IConstant<int> { public static int Value => 82; }\npublic struct _83 : IConstant<int> { public static int Value => 83; }\npublic struct _84 : IConstant<int> { public static int Value => 84; }\npublic struct _85 : IConstant<int> { public static int Value => 85; }\npublic struct _86 : IConstant<int> { public static int Value => 86; }\npublic struct _87 : IConstant<int> { public static int Value => 87; }\npublic struct _88 : IConstant<int> { public static int Value => 88; }\npublic struct _89 : IConstant<int> { public static int Value => 89; }\npublic struct _90 : IConstant<int> { public static int Value => 90; }\npublic struct _91 : IConstant<int> { public static int Value => 91; }\npublic struct _92 : IConstant<int> { public static int Value => 92; }\npublic struct _93 : IConstant<int> { public static int Value => 93; }\npublic struct _94 : IConstant<int> { public static int Value => 94; }\npublic struct _95 : IConstant<int> { public static int Value => 95; }\npublic struct _96 : IConstant<int> { public static int Value => 96; }\npublic struct _97 : IConstant<int> { public static int Value => 97; }\npublic struct _98 : IConstant<int> { public static int Value => 98; }\npublic struct _99 : IConstant<int> { public static int Value => 99; }\n"
  },
  {
    "path": "Demo/2022/NBitInt/NBitInt/NBitInt.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n    <LangVersion>preview</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/NBitInt/NBitInt.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.3.32611.2\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"NBitInt\", \"NBitInt\\NBitInt.csproj\", \"{CE2A26FB-FFB2-46E6-9429-115AB292D5C3}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{357DE0DC-8E1E-4EB4-8F32-A7B89747047B}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{CE2A26FB-FFB2-46E6-9429-115AB292D5C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CE2A26FB-FFB2-46E6-9429-115AB292D5C3}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CE2A26FB-FFB2-46E6-9429-115AB292D5C3}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CE2A26FB-FFB2-46E6-9429-115AB292D5C3}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{357DE0DC-8E1E-4EB4-8F32-A7B89747047B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{357DE0DC-8E1E-4EB4-8F32-A7B89747047B}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{357DE0DC-8E1E-4EB4-8F32-A7B89747047B}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{357DE0DC-8E1E-4EB4-8F32-A7B89747047B}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {CA9897E8-4259-4F9A-97DE-28880090C18C}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/Benchmark/Benchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.13.2\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ClassLibrary1\\ClassLibrary1.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/Benchmark/GeneratorBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing ClassLibrary1;\n\nnamespace Benchmark;\n\npublic class GeneratorBenchmark\n{\n    private static string Gen<T>()\n        where T : IGenerator\n        => T.Create(typeof(Sample)).TransformText();\n\n    [Benchmark]\n    public string T4() => Gen<T4Generator>();\n\n    [Benchmark]\n    public string Interpolation() => Gen<InterpolationGenerator>();\n}\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/Benchmark/Program.cs",
    "content": "﻿using Benchmark;\nusing BenchmarkDotNet.Running;\n\nBenchmarkRunner.Run<GeneratorBenchmark>();\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/Benchmark/Sample.cs",
    "content": "﻿namespace Benchmark;\n\npublic struct Sample\n{\n    public int X;\n    public string? Y;\n    public byte[] Z;\n}\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/ClassLibrary1/ClassLibrary1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"System.CodeDom\" />\n    <Service Include=\"{508349b6-6b84-4df5-91f0-309beebad82d}\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"T4Generator.tt\">\n      <Generator>TextTemplatingFilePreprocessor</Generator>\n      <LastGenOutput>T4Generator.cs</LastGenOutput>\n    </None>\n    <Compile Update=\"T4Generator.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>T4Generator.tt</DependentUpon>\n    </Compile>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/ClassLibrary1/IGenerator.cs",
    "content": "﻿namespace ClassLibrary1;\n\npublic interface IGenerator\n{\n    static abstract IGenerator Create(Type type);\n    string TransformText();\n}"
  },
  {
    "path": "Demo/2022/NoMoreT4/ClassLibrary1/InterpolationGenerator.cs",
    "content": "﻿using System.Text;\n\nnamespace ClassLibrary1;\n\npublic partial class InterpolationGenerator : IGenerator\n{\n    private readonly Type _type;\n    public InterpolationGenerator(Type type) => _type = type;\n    public static IGenerator Create(Type type) => new InterpolationGenerator(type);\n\n    public string TransformText()\n    {\n        var s = new StringBuilder();\n\n        s.Append($$\"\"\"\nnamespace {{_type.Namespace}};\n\npublic partial static class {{_type.Name}}Extensions\n{\n\n\"\"\");\n        foreach (var f in _type.GetFields())\n        {\n            s.Append($$\"\"\"\n    public void Set{{f.Name}}(this {{_type.Name}} x, object value) => x.{{f.Name}} = ({{f.FieldType.FullName}})value;\n\n\"\"\");\n        }\n        s.Append($$\"\"\"\n}\n\n\"\"\");\n\n        return s.ToString();\n    }\n}\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/ClassLibrary1/T4Generator.cs",
    "content": "// ------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version: 17.0.0.0\n//  \n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n// ------------------------------------------------------------------------------\nnamespace ClassLibrary1\n{\n    using System.Linq;\n    using System.Text;\n    using System.Collections.Generic;\n    using System;\n    \n    /// <summary>\n    /// Class to produce the template output\n    /// </summary>\n    \n    #line 1 \"C:\\Users\\xii-h\\Documents\\github\\ufcpp\\UfcppSample\\Demo\\2022\\NoMoreT4\\ClassLibrary1\\T4Generator.tt\"\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.TextTemplating\", \"17.0.0.0\")]\n    public partial class T4Generator : T4GeneratorBase\n    {\n#line hidden\n        /// <summary>\n        /// Create the template output\n        /// </summary>\n        public virtual string TransformText()\n        {\n            this.Write(\"namespace \");\n            \n            #line 6 \"C:\\Users\\xii-h\\Documents\\github\\ufcpp\\UfcppSample\\Demo\\2022\\NoMoreT4\\ClassLibrary1\\T4Generator.tt\"\n            this.Write(this.ToStringHelper.ToStringWithCulture(_type.Namespace));\n            \n            #line default\n            #line hidden\n            this.Write(\";\\r\\n\\r\\npublic partial static class \");\n            \n            #line 8 \"C:\\Users\\xii-h\\Documents\\github\\ufcpp\\UfcppSample\\Demo\\2022\\NoMoreT4\\ClassLibrary1\\T4Generator.tt\"\n            this.Write(this.ToStringHelper.ToStringWithCulture(_type.Name));\n            \n            #line default\n            #line hidden\n            this.Write(\"Extensions\\r\\n{\\r\\n\");\n            \n            #line 10 \"C:\\Users\\xii-h\\Documents\\github\\ufcpp\\UfcppSample\\Demo\\2022\\NoMoreT4\\ClassLibrary1\\T4Generator.tt\"\n\nforeach (var f in _type.GetFields())\n{\n\n            \n            #line default\n            #line hidden\n            this.Write(\"    public void Set\");\n            \n            #line 14 \"C:\\Users\\xii-h\\Documents\\github\\ufcpp\\UfcppSample\\Demo\\2022\\NoMoreT4\\ClassLibrary1\\T4Generator.tt\"\n            this.Write(this.ToStringHelper.ToStringWithCulture(f.Name));\n            \n            #line default\n            #line hidden\n            this.Write(\"(this \");\n            \n            #line 14 \"C:\\Users\\xii-h\\Documents\\github\\ufcpp\\UfcppSample\\Demo\\2022\\NoMoreT4\\ClassLibrary1\\T4Generator.tt\"\n            this.Write(this.ToStringHelper.ToStringWithCulture(_type.Name));\n            \n            #line default\n            #line hidden\n            this.Write(\" x, object value) => x.\");\n            \n            #line 14 \"C:\\Users\\xii-h\\Documents\\github\\ufcpp\\UfcppSample\\Demo\\2022\\NoMoreT4\\ClassLibrary1\\T4Generator.tt\"\n            this.Write(this.ToStringHelper.ToStringWithCulture(f.Name));\n            \n            #line default\n            #line hidden\n            this.Write(\" = (\");\n            \n            #line 14 \"C:\\Users\\xii-h\\Documents\\github\\ufcpp\\UfcppSample\\Demo\\2022\\NoMoreT4\\ClassLibrary1\\T4Generator.tt\"\n            this.Write(this.ToStringHelper.ToStringWithCulture(f.FieldType.FullName));\n            \n            #line default\n            #line hidden\n            this.Write(\")value;\\r\\n\");\n            \n            #line 15 \"C:\\Users\\xii-h\\Documents\\github\\ufcpp\\UfcppSample\\Demo\\2022\\NoMoreT4\\ClassLibrary1\\T4Generator.tt\"\n\n}\n\n            \n            #line default\n            #line hidden\n            this.Write(\"}\\r\\n\");\n            return this.GenerationEnvironment.ToString();\n        }\n    }\n    \n    #line default\n    #line hidden\n    #region Base class\n    /// <summary>\n    /// Base class for this transformation\n    /// </summary>\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.TextTemplating\", \"17.0.0.0\")]\n    public class T4GeneratorBase\n    {\n        #region Fields\n        private global::System.Text.StringBuilder generationEnvironmentField;\n        private global::System.CodeDom.Compiler.CompilerErrorCollection errorsField;\n        private global::System.Collections.Generic.List<int> indentLengthsField;\n        private string currentIndentField = \"\";\n        private bool endsWithNewline;\n        private global::System.Collections.Generic.IDictionary<string, object> sessionField;\n        #endregion\n        #region Properties\n        /// <summary>\n        /// The string builder that generation-time code is using to assemble generated output\n        /// </summary>\n        protected System.Text.StringBuilder GenerationEnvironment\n        {\n            get\n            {\n                if ((this.generationEnvironmentField == null))\n                {\n                    this.generationEnvironmentField = new global::System.Text.StringBuilder();\n                }\n                return this.generationEnvironmentField;\n            }\n            set\n            {\n                this.generationEnvironmentField = value;\n            }\n        }\n        /// <summary>\n        /// The error collection for the generation process\n        /// </summary>\n        public System.CodeDom.Compiler.CompilerErrorCollection Errors\n        {\n            get\n            {\n                if ((this.errorsField == null))\n                {\n                    this.errorsField = new global::System.CodeDom.Compiler.CompilerErrorCollection();\n                }\n                return this.errorsField;\n            }\n        }\n        /// <summary>\n        /// A list of the lengths of each indent that was added with PushIndent\n        /// </summary>\n        private System.Collections.Generic.List<int> indentLengths\n        {\n            get\n            {\n                if ((this.indentLengthsField == null))\n                {\n                    this.indentLengthsField = new global::System.Collections.Generic.List<int>();\n                }\n                return this.indentLengthsField;\n            }\n        }\n        /// <summary>\n        /// Gets the current indent we use when adding lines to the output\n        /// </summary>\n        public string CurrentIndent\n        {\n            get\n            {\n                return this.currentIndentField;\n            }\n        }\n        /// <summary>\n        /// Current transformation session\n        /// </summary>\n        public virtual global::System.Collections.Generic.IDictionary<string, object> Session\n        {\n            get\n            {\n                return this.sessionField;\n            }\n            set\n            {\n                this.sessionField = value;\n            }\n        }\n        #endregion\n        #region Transform-time helpers\n        /// <summary>\n        /// Write text directly into the generated output\n        /// </summary>\n        public void Write(string textToAppend)\n        {\n            if (string.IsNullOrEmpty(textToAppend))\n            {\n                return;\n            }\n            // If we're starting off, or if the previous text ended with a newline,\n            // we have to append the current indent first.\n            if (((this.GenerationEnvironment.Length == 0) \n                        || this.endsWithNewline))\n            {\n                this.GenerationEnvironment.Append(this.currentIndentField);\n                this.endsWithNewline = false;\n            }\n            // Check if the current text ends with a newline\n            if (textToAppend.EndsWith(global::System.Environment.NewLine, global::System.StringComparison.CurrentCulture))\n            {\n                this.endsWithNewline = true;\n            }\n            // This is an optimization. If the current indent is \"\", then we don't have to do any\n            // of the more complex stuff further down.\n            if ((this.currentIndentField.Length == 0))\n            {\n                this.GenerationEnvironment.Append(textToAppend);\n                return;\n            }\n            // Everywhere there is a newline in the text, add an indent after it\n            textToAppend = textToAppend.Replace(global::System.Environment.NewLine, (global::System.Environment.NewLine + this.currentIndentField));\n            // If the text ends with a newline, then we should strip off the indent added at the very end\n            // because the appropriate indent will be added when the next time Write() is called\n            if (this.endsWithNewline)\n            {\n                this.GenerationEnvironment.Append(textToAppend, 0, (textToAppend.Length - this.currentIndentField.Length));\n            }\n            else\n            {\n                this.GenerationEnvironment.Append(textToAppend);\n            }\n        }\n        /// <summary>\n        /// Write text directly into the generated output\n        /// </summary>\n        public void WriteLine(string textToAppend)\n        {\n            this.Write(textToAppend);\n            this.GenerationEnvironment.AppendLine();\n            this.endsWithNewline = true;\n        }\n        /// <summary>\n        /// Write formatted text directly into the generated output\n        /// </summary>\n        public void Write(string format, params object[] args)\n        {\n            this.Write(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args));\n        }\n        /// <summary>\n        /// Write formatted text directly into the generated output\n        /// </summary>\n        public void WriteLine(string format, params object[] args)\n        {\n            this.WriteLine(string.Format(global::System.Globalization.CultureInfo.CurrentCulture, format, args));\n        }\n        /// <summary>\n        /// Raise an error\n        /// </summary>\n        public void Error(string message)\n        {\n            System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError();\n            error.ErrorText = message;\n            this.Errors.Add(error);\n        }\n        /// <summary>\n        /// Raise a warning\n        /// </summary>\n        public void Warning(string message)\n        {\n            System.CodeDom.Compiler.CompilerError error = new global::System.CodeDom.Compiler.CompilerError();\n            error.ErrorText = message;\n            error.IsWarning = true;\n            this.Errors.Add(error);\n        }\n        /// <summary>\n        /// Increase the indent\n        /// </summary>\n        public void PushIndent(string indent)\n        {\n            if ((indent == null))\n            {\n                throw new global::System.ArgumentNullException(\"indent\");\n            }\n            this.currentIndentField = (this.currentIndentField + indent);\n            this.indentLengths.Add(indent.Length);\n        }\n        /// <summary>\n        /// Remove the last indent that was added with PushIndent\n        /// </summary>\n        public string PopIndent()\n        {\n            string returnValue = \"\";\n            if ((this.indentLengths.Count > 0))\n            {\n                int indentLength = this.indentLengths[(this.indentLengths.Count - 1)];\n                this.indentLengths.RemoveAt((this.indentLengths.Count - 1));\n                if ((indentLength > 0))\n                {\n                    returnValue = this.currentIndentField.Substring((this.currentIndentField.Length - indentLength));\n                    this.currentIndentField = this.currentIndentField.Remove((this.currentIndentField.Length - indentLength));\n                }\n            }\n            return returnValue;\n        }\n        /// <summary>\n        /// Remove any indentation\n        /// </summary>\n        public void ClearIndent()\n        {\n            this.indentLengths.Clear();\n            this.currentIndentField = \"\";\n        }\n        #endregion\n        #region ToString Helpers\n        /// <summary>\n        /// Utility class to produce culture-oriented representation of an object as a string.\n        /// </summary>\n        public class ToStringInstanceHelper\n        {\n            private System.IFormatProvider formatProviderField  = global::System.Globalization.CultureInfo.InvariantCulture;\n            /// <summary>\n            /// Gets or sets format provider to be used by ToStringWithCulture method.\n            /// </summary>\n            public System.IFormatProvider FormatProvider\n            {\n                get\n                {\n                    return this.formatProviderField ;\n                }\n                set\n                {\n                    if ((value != null))\n                    {\n                        this.formatProviderField  = value;\n                    }\n                }\n            }\n            /// <summary>\n            /// This is called from the compile/run appdomain to convert objects within an expression block to a string\n            /// </summary>\n            public string ToStringWithCulture(object objectToConvert)\n            {\n                if ((objectToConvert == null))\n                {\n                    throw new global::System.ArgumentNullException(\"objectToConvert\");\n                }\n                System.Type t = objectToConvert.GetType();\n                System.Reflection.MethodInfo method = t.GetMethod(\"ToString\", new System.Type[] {\n                            typeof(System.IFormatProvider)});\n                if ((method == null))\n                {\n                    return objectToConvert.ToString();\n                }\n                else\n                {\n                    return ((string)(method.Invoke(objectToConvert, new object[] {\n                                this.formatProviderField })));\n                }\n            }\n        }\n        private ToStringInstanceHelper toStringHelperField = new ToStringInstanceHelper();\n        /// <summary>\n        /// Helper to produce culture-oriented representation of an object as a string\n        /// </summary>\n        public ToStringInstanceHelper ToStringHelper\n        {\n            get\n            {\n                return this.toStringHelperField;\n            }\n        }\n        #endregion\n    }\n    #endregion\n}\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/ClassLibrary1/T4Generator.partial.cs",
    "content": "namespace ClassLibrary1;\n\npublic partial class T4Generator : IGenerator\n{\n    private readonly Type _type;\n    public T4Generator(Type type) => _type = type;\n    public static IGenerator Create(Type type) => new T4Generator(type);\n}\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/ClassLibrary1/T4Generator.tt",
    "content": "<#@ template language=\"C#\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ import namespace=\"System.Text\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\nnamespace <#= _type.Namespace #>;\n\npublic partial static class <#= _type.Name #>Extensions\n{\n<#\nforeach (var f in _type.GetFields())\n{\n#>\n    public void Set<#= f.Name #>(this <#= _type.Name #> x, object value) => x.<#= f.Name #> = (<#= f.FieldType.FullName #>)value;\n<#\n}\n#>\n}\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/ConsoleApp1/ConsoleApp1.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ClassLibrary1\\ClassLibrary1.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/ConsoleApp1/Program.cs",
    "content": "﻿using ClassLibrary1;\nusing ConsoleApp1;\n\nvar t = typeof(Sample);\nm<T4Generator>(t);\nm<InterpolationGenerator>(t);\n\nstatic void m<T>(Type type)\n    where T : IGenerator\n    => Console.WriteLine(T.Create(type).TransformText());\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/ConsoleApp1/Sample.cs",
    "content": "﻿namespace ConsoleApp1;\n\npublic struct Sample\n{\n    public int X;\n    public string? Y;\n    public byte[] Z;\n}\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/FileGenerator/FileGenerator.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net7.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"ScribanSourceGenerator\" Version=\"1.0.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <AdditionalFiles Include=\"*.scriban\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Remove=\"X.scriban\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/FileGenerator/X.scriban",
    "content": "﻿static class Extensions\n{\n{{\nfor $t in [\"bool\",\"byte\",\"int\",\"double\"]\n~}}\n    public static bool TryParse(this string s, out {{$t}} x) => {{$t}}.TryParse(s, out x);\n{{ end }}\n}\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/FileGenerator/Y.cs",
    "content": "﻿namespace FileGenerator;\n\n[ScribanSourceGeneretor.ClassMember(\"\"\"\n    {{\n    for $t in [\"bool\",\"byte\",\"int\",\"double\"]\n    ~}}\n        public static bool TryParse(this string s, out {{$t}} x) => {{$t}}.TryParse(s, out x);\n    {{ end }}\n    \"\"\")]\ninternal static partial class Extensions\n{\n}\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/NoMoreT4.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.5.33103.201\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ConsoleApp1\", \"ConsoleApp1\\ConsoleApp1.csproj\", \"{88A63FBB-8798-4696-96B0-417C60B4D0C7}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"ClassLibrary1\", \"ClassLibrary1\\ClassLibrary1.csproj\", \"{AD09EFDE-7E70-412A-A3BF-1C2B09B399DB}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Benchmark\", \"Benchmark\\Benchmark.csproj\", \"{2AA26EAD-97CC-4A38-BC28-7EF28483CEF8}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"FileGenerator\", \"FileGenerator\\FileGenerator.csproj\", \"{17A20F54-87D5-4615-A78D-F4457DBED406}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{88A63FBB-8798-4696-96B0-417C60B4D0C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{88A63FBB-8798-4696-96B0-417C60B4D0C7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{88A63FBB-8798-4696-96B0-417C60B4D0C7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{88A63FBB-8798-4696-96B0-417C60B4D0C7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AD09EFDE-7E70-412A-A3BF-1C2B09B399DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AD09EFDE-7E70-412A-A3BF-1C2B09B399DB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AD09EFDE-7E70-412A-A3BF-1C2B09B399DB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AD09EFDE-7E70-412A-A3BF-1C2B09B399DB}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2AA26EAD-97CC-4A38-BC28-7EF28483CEF8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2AA26EAD-97CC-4A38-BC28-7EF28483CEF8}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2AA26EAD-97CC-4A38-BC28-7EF28483CEF8}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2AA26EAD-97CC-4A38-BC28-7EF28483CEF8}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{17A20F54-87D5-4615-A78D-F4457DBED406}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{17A20F54-87D5-4615-A78D-F4457DBED406}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{17A20F54-87D5-4615-A78D-F4457DBED406}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{17A20F54-87D5-4615-A78D-F4457DBED406}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {8AB7E02E-CB4C-4533-8AC5-376A8602BB41}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2022/NoMoreT4/readme.md",
    "content": "# TextTemplatingFilePreprocessor 要らない説\n\n## 背景\n\n* TextTemplatingFilePreprocessor = 実行時テキストテンプレートって言われてるやつ\n* TextTemplatingFilePreprocessor は、まあ、元々あんまり使われてる気配を感じてない\n  * T4 自体あんまり使われてない疑惑も\n* まして、C# 11 なら `$\"\"\" \"\"\"` 使えば十分\n\n## この sln\n\n* T4 と文字列補間で同じテキスト生成してみる\n* BenchmarkDotNet にかけてみる\n\n## 結果\n\n手元の環境での BenchmarkDotNet 実行結果:\n\n|        Method |        Mean |    Error |   StdDev |\n|-------------- |------------:|---------:|---------:|\n|            T4 | 19,247.7 ns | 74.46 ns | 69.65 ns |\n| Interpolation |    330.6 ns |  5.94 ns |  5.55 ns |\n\nメソッド名通り、\n\n* T4: T4 テンプレートを使用\n* Interpolation: 文字列補間を使用\n\nさすがに2桁違いは…\n\n## 原因\n\nC# 10 移行、文字列補間が超高速化されたというのもあり。\n\nT4 の生成するコードが悲惨というのもあり。\n`<#= #>` に渡したオブジェクト1個1個に対して以下のメソッドが呼ばれてる。\n\n```cs\npublic string ToStringWithCulture(object objectToConvert)\n{\n    if ((objectToConvert == null))\n    {\n        throw new global::System.ArgumentNullException(\"objectToConvert\");\n    }\n    System.Type t = objectToConvert.GetType();\n    System.Reflection.MethodInfo method = t.GetMethod(\"ToString\", new System.Type[] {\n                typeof(System.IFormatProvider)});\n    if ((method == null))\n    {\n        return objectToConvert.ToString();\n    }\n    else\n    {\n        return ((string)(method.Invoke(objectToConvert, new object[] {\n                    this.formatProviderField })));\n    }\n}\n```\n\nカルチャー対応のためだけにリフレクション…\nしかも、都度 `Type.GetMethod` を呼ぶところから…\n\n## 脱 T4 のメリット・デメリット\n\n脱 T4 メリット\n\n* 速い\n* 普通の C# だけで書ける\n  * 補完・コード解析が働く\n* Visual Studio 以外で使える\n  * 「Visual Studio 上で保存時にコード生成」がきつかった\n  * この Roslyn Source Generator な時代に、誰も Source Generator 化しないあたりでお察し\n* csproj がすっきり\n  * `<None Update=\"T4Generator.tt\">` みたいな謎タグ要らない\n  * `<Service Include=\"{508349b6-6b84-4df5-91f0-309beebad82d}\" />` とかいう謎サービス要らない\n  * `<PackageReference Include=\"System.CodeDom\" />` とかいうつらみあるパッケージ参照要らない\n* Visual Studio 自体のバージョン・表示言語に依存しない\n  * TextTemplatingFilePreprocessor の生成結果はは「T4 ファイルを編集して保存した PC」に依存しちゃう\n  * 複数人編集すると Git 差分が悲惨なことになってた\n\n脱 T4 デメリット\n\n* 文字列補間、そこまできれいな文法じゃない\n  * T4 でもそこまで読みやすくはないんで、好みによるかも\n\n## 脱 T4 手法\n\n結構機械的な置換が可能。\n\n```cs\nusing System.Text.RegularExpressions;\n\nstatic partial class RepalceT4\n{\n    public static string Replace(string x)\n    {\n        x = A().Replace(x, m => \"{{\" + m.Groups[1].Value + \"}}\");\n        x = C().Replace(x, \"\"\"\"\n                    s.Append($$$$\"\"\"\n            \"\"\"\");\n        x = B().Replace(x, \"\"\"\"\n\n            \"\"\");\n            \"\"\"\");\n\n        var y = \"\"\"\"\n                        \n                public string TransformText()\n                {\n                    var s = new StringBuilder();\n\n                    s.Append($$\"\"\"\n            //《Generated by .tt》\n            \n            \"\"\"\"\n            + x +\n            \"\"\"\"\n\n            \"\"\");\n\n                return s.ToString();\n            }\n\n            \"\"\"\";\n        return y;\n    }\n\n    [GeneratedRegex(\"\"\"\n        \\<\\#\\=(.*?)\\#\\>\n        \"\"\", RegexOptions.Multiline)]\n    private static partial Regex A();\n\n    [GeneratedRegex(\"\"\"\n        ^\\<\\#\n        \"\"\", RegexOptions.Multiline)]\n    private static partial Regex B();\n\n    [GeneratedRegex(\"\"\"\n        ^\\#\\>\n        \"\"\", RegexOptions.Multiline)]\n    private static partial Regex C();\n}\n```\n\n条件演算子(` ? : `)が入ってるとちょっとコンパイルエラーを起こすとか、\n`<#+ #>` に対応していないとか細かい機能不足はあるものの、\n手作業調整で済む範囲。\n\nちなみに、クリップボードからの貼り付け:\n\n```cs\nusing System.Windows;\n\nclass Program\n{\n    [STAThread]\n    static void Main()\n    {\n        var x = Clipboard.GetText();\n        Clipboard.SetText(RepalceT4.Replace(x));\n    }\n}\n```\n"
  },
  {
    "path": "Demo/2022/StringJoin/JoinBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\n\nnamespace StringJoin;\n\n[MemoryDiagnoser]\npublic class JoinBenchmark\n{\n    private static readonly byte[][] _data = new[]\n    {\n        new byte[] { 1, 3, 5, 7 },\n        new byte[] { 2, 5, 9, 14, 20 },\n        new byte[] { 192, 168, 0, 1 },\n        new byte[] { 5, 6, 3 },\n        new byte[] { 4, 4, 6 },\n        new byte[] { 255, 255, 0, 0 },\n    };\n\n    [Benchmark]\n    public string StringJoin() => string.Join(\", \", _data.Select(sub => string.Join(\".\", sub)));\n\n    [Benchmark]\n    public string StringJoinX() => string.Join(\", \", _data.Select(sub => string.Join(\".\", sub.Select(x => x.ToString(\"X\")))));\n\n    [Benchmark]\n    public string JoinerJoin() => $\"{Joiner.Join(\", \", _data.Select(sub => Joiner.Join(\".\", sub)))}\";\n\n    [Benchmark]\n    public string JoinerJoinX() => $\"{Joiner.Join(\", \", _data.Select(sub => Joiner.Join(\".\", sub))):X}\";\n}\n"
  },
  {
    "path": "Demo/2022/StringJoin/Joiner.cs",
    "content": "﻿using System.Text;\n\nnamespace StringJoin;\n\npublic class Joiner\n{\n    public static Joiner<T> Join<T>(string separator, IEnumerable<T> items)\n        where T : ISpanFormattable\n        => new(separator, items);\n}\n\npublic struct Joiner<T> : ISpanFormattable\n    where T : ISpanFormattable\n{\n    private readonly string _separator;\n    private readonly IEnumerable<T> _items;\n    public Joiner(string separator, IEnumerable<T> items) => (_separator, _items) = (separator, items);\n\n    public bool TryFormat(Span<char> destination, out int charsWritten, ReadOnlySpan<char> format, IFormatProvider? provider)\n    {\n        var first = true;\n        charsWritten = 0;\n        foreach (var item in _items)\n        {\n            if (first) first = false;\n            else\n            {\n                if (destination.Length < _separator.Length)\n                {\n                    return false;\n                }\n                _separator.CopyTo(destination);\n                charsWritten += _separator.Length;\n                destination = destination[_separator.Length..];\n            }\n\n            if (!item.TryFormat(destination, out var w, format, provider)) return false;\n\n            charsWritten += w;\n            destination = destination[w..];\n        }\n        return true;\n    }\n\n    public string ToString(string? format, IFormatProvider? formatProvider)\n    {\n        var s = new StringBuilder();\n        var first = true;\n        foreach (var item in _items)\n        {\n            if (first) first = false;\n            else s.Append(_separator);\n            s.Append(item.ToString(format, formatProvider));\n        }\n        return s.ToString();\n    }\n\n    public override string ToString() => ToString(null, null);\n}\n"
  },
  {
    "path": "Demo/2022/StringJoin/Program.cs",
    "content": "﻿// See https://aka.ms/new-console-template for more information\nusing StringJoin;\n\n#if DEBUG\nvar b = new JoinBenchmark();\n\nConsole.WriteLine(b.StringJoin());\nConsole.WriteLine(b.JoinerJoin());\nConsole.WriteLine(b.StringJoinX());\nConsole.WriteLine(b.JoinerJoinX());\n#else\nBenchmarkDotNet.Running.BenchmarkRunner.Run<JoinBenchmark>();\n#endif\n"
  },
  {
    "path": "Demo/2022/StringJoin/StringJoin.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.13.1\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2022/StringJoin/StringJoin.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 16\nVisualStudioVersion = 16.0.30114.105\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"StringJoin\", \"StringJoin.csproj\", \"{027F5F39-272B-4274-8F0C-6E963B5F722D}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{027F5F39-272B-4274-8F0C-6E963B5F722D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{027F5F39-272B-4274-8F0C-6E963B5F722D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{027F5F39-272B-4274-8F0C-6E963B5F722D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{027F5F39-272B-4274-8F0C-6E963B5F722D}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2022/StringJoin/readme.md",
    "content": "C# 10.0 でせっかく string interpolation が高速化されたのに、その中で `string.Join` とか使うと遅くなるよなぁ…\nみたいな悩みがあったものの、`ISpanFormattable` ベースの `Join` メソッドを用意することで解消できそうという話。\n\nコード:\n\n* [`ISpanFormattable` ベースの `Join` メソッド](Joiner.cs)\n* [ベンチマーク](JoinBenchmark.cs)\n\nベンチマーク内容は、↓みたいな2重配列を、\n\n```cs\nnew[]\n{\n    new byte[] { 192, 168, 0, 1 },\n    new byte[] { 255, 255, 0, 0 },\n};\n```\n\n`192.168.0.1, 255.255.0.0` (10進)とか `C0.A8.0.1, FF.FF.0.0` (16進)とかに整形する処理を計測。\n\nベンチマーク対象:\n\n* `StringJoin`: 普通に `string.Join` 利用\n* `StringJoinX`: 普通に `string.Join` 利用で、`X` 書式指定\n* `JoinerJoin`: `ISpanFormattable` ベースの `Join` 利用\n* `JoinerJoinX`: `ISpanFormattable` ベースの `Join` 利用で、`X` 書式指定\n\nベンチマーク結果(一例):\n\n|      Method |     Mean |   Error |  StdDev |  Gen 0 | Allocated |\n|------------ |---------:|--------:|--------:|-------:|----------:|\n|  StringJoin | 531.5 ns | 4.78 ns | 4.24 ns | 0.0982 |     824 B |\n| StringJoinX | 984.7 ns | 8.70 ns | 8.14 ns | 0.1545 |   1,296 B |\n|  JoinerJoin | 484.6 ns | 2.82 ns | 2.64 ns | 0.0467 |     392 B |\n| JoinerJoinX | 640.6 ns | 1.28 ns | 1.07 ns | 0.0458 |     384 B |\n"
  },
  {
    "path": "Demo/2022/Whitespace/Program.cs",
    "content": "﻿//↓ U+0001～001F except for tab (09), CR (0D), LF (0A)\n//\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\u000b\f\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f\n// Visual Studio displays these control characters as symbols.\n\n// U+000B, U+000C, and U+001A are treated as whitespace in C#, thus, the folloing is a valid C# code.\n\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001a\u001avar a = 1;\n\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000b\u000bif (a > 0)\n\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\f\fConsole.WriteLine(a);\n"
  },
  {
    "path": "Demo/2022/Whitespace/Whitespace.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2023/MemberOrder/.vscode/settings.json",
    "content": "{\n    \"dotnet.defaultSolution\": \"MemberOrder.sln\"\n}"
  },
  {
    "path": "Demo/2023/MemberOrder/A.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nclass A\n{\n    [ModuleInitializer]\n    public static void Init() => Console.WriteLine(\"Latin A\");\n}\n"
  },
  {
    "path": "Demo/2023/MemberOrder/Ab/Ab.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n  </PropertyGroup>\n\n  <!-- 全部のファイルの順序を明示。 A → B。 -->\n  <ItemGroup>\n    <Compile Include=\"../Program.cs\" />\n    <Compile Include=\"../A.cs\" />\n    <Compile Include=\"../B.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2023/MemberOrder/B.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nclass B\n{\n    [ModuleInitializer]\n    public static void Init() => Console.WriteLine(\"Latin B\");\n}\n"
  },
  {
    "path": "Demo/2023/MemberOrder/Ba/Ba.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n  </PropertyGroup>\n\n  <!-- 全部のファイルの順序を明示。 B → A。 -->\n  <ItemGroup>\n    <Compile Include=\"../Program.cs\" />\n    <Compile Include=\"../B.cs\" />\n    <Compile Include=\"../A.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2023/MemberOrder/Directory.Build.props",
    "content": "<Project>\n  <PropertyGroup>\n    <ImplicitUsings>true</ImplicitUsings>\n  </PropertyGroup>\n</Project>\n"
  },
  {
    "path": "Demo/2023/MemberOrder/Explicit/Explicit.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n  </PropertyGroup>\n\n  <!-- 一部のファイルの順序を明示。 -->\n  <ItemGroup>\n    <Compile Include=\"../*.cs\" />\n\n    <!-- *.cs の後でも、1度 Remove Add すれば順序を明示できる。 -->\n    <Compile Remove=\"../A.cs\" />\n    <Compile Include=\"../A.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2023/MemberOrder/Implicit/Implicit.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n  </PropertyGroup>\n\n  <!-- *.cs でビルドシステムに完全にお任せ。 -->\n  <ItemGroup>\n    <Compile Include=\"../*.cs\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2023/MemberOrder/MemberOrder.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.7.33808.371\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Implicit\", \"Implicit\\Implicit.csproj\", \"{55573A33-5791-4837-80E6-FBEA579A6879}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Explicit\", \"Explicit\\Explicit.csproj\", \"{7DCC7787-AA64-4438-9763-002A3831C749}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Ab\", \"Ab\\Ab.csproj\", \"{AC02CE28-2FC5-455E-975E-E93F26B31A96}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Ba\", \"Ba\\Ba.csproj\", \"{3A963BF0-7F68-45D2-842D-27C0A821EC36}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"SolutionItems\", \"SolutionItems\", \"{633AE07B-5BB3-46D6-AA1F-6258B679FB68}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tDirectory.Build.props = Directory.Build.props\n\t\treadme.md = readme.md\n\tEndProjectSection\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{55573A33-5791-4837-80E6-FBEA579A6879}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{55573A33-5791-4837-80E6-FBEA579A6879}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{55573A33-5791-4837-80E6-FBEA579A6879}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{55573A33-5791-4837-80E6-FBEA579A6879}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7DCC7787-AA64-4438-9763-002A3831C749}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7DCC7787-AA64-4438-9763-002A3831C749}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7DCC7787-AA64-4438-9763-002A3831C749}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7DCC7787-AA64-4438-9763-002A3831C749}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{AC02CE28-2FC5-455E-975E-E93F26B31A96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{AC02CE28-2FC5-455E-975E-E93F26B31A96}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{AC02CE28-2FC5-455E-975E-E93F26B31A96}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{AC02CE28-2FC5-455E-975E-E93F26B31A96}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3A963BF0-7F68-45D2-842D-27C0A821EC36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3A963BF0-7F68-45D2-842D-27C0A821EC36}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3A963BF0-7F68-45D2-842D-27C0A821EC36}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3A963BF0-7F68-45D2-842D-27C0A821EC36}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {D59F9E3E-CE8F-4AFA-825C-ED1953A81F4C}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2023/MemberOrder/Program.cs",
    "content": "﻿{ }\n"
  },
  {
    "path": "Demo/2023/MemberOrder/Z.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nclass Z\n{\n    [ModuleInitializer]\n    public static void Init() => Console.WriteLine(\"Latin Z\");\n}\n"
  },
  {
    "path": "Demo/2023/MemberOrder/readme.md",
    "content": "﻿# Module Initializer の実行順序\n\n## 概要\n\nModule Initializer の実行順序は、ファイルが分かれてる場合、ファイルをコンパイラーに渡した順。\n\nで、ファイルが渡る順序は以下のようになってそう。\n\n* csc 直呼びの場合、引数の順序そのまま\n* csproj に `<Compile Include=\"...\"/>` を明示した場合、その並び順\n* `<Compile Include=\"**/*.cs\"/>` だと、ビルドツール次第\n    * 昔ながらの MSBuild.exe は UTF-16 比較っぽい\n    * dotnet build は UTF-8 比較っぽい\n    * いずれも Ordinal 比較\n \n ## csc 引数順\n\n 例えば csc 直呼びするなら、\n\n ```\n$csc = 'C:\\Program Files\\dotnet\\sdk\\8.0.100-preview.5.23303.2\\Roslyn\\bincore\\csc.dll'\n$shared = \"C:\\Program Files\\dotnet\\shared\\Microsoft.NETCore.App\\8.0.0-preview.5.23280.8\\\"\ndotnet $csc -t:library -r:\"$shared\\System.Private.CoreLib.dll\" -out:Az.dll .\\A.cs .\\Z.cs\ndotnet $csc -t:library -r:\"$shared\\System.Private.CoreLib.dll\" -out:Za.dll .\\Z.cs .\\A.cs \n```\n\nこんな感じで Az.dll と Za.dll の結果が変わる。\n\n## Ab.csproj, Ba.csproj\n\n必要な C# ファイルを明示的に csproj に並べたもの。\n\nAb.csproj:\n\n```xml\n  <ItemGroup>\n    <Compile Include=\"../Program.cs\" />\n    <Compile Include=\"../A.cs\" />\n    <Compile Include=\"../B.cs\" />\n  </ItemGroup>\n```\n\nこの場合、実行結果は\n\n```\nLatin A\nLatin B\n```\n\nAb.csproj:\n\n```xml\n  <ItemGroup>\n    <Compile Include=\"../Program.cs\" />\n    <Compile Include=\"../B.cs\" />\n    <Compile Include=\"../A.cs\" />\n  </ItemGroup>\n```\n\nA.cs と B.cs の並びが逆。\nこの場合、実行結果は\n\n```\nLatin B\nLatin A\n```\n\n## Implicit.csproj\n\n`*.cs` でビルド システムにお任せしてしまった場合。\n\nImplicit.csproj:\n\n```xml\n  <ItemGroup>\n    <Compile Include=\"../*.cs\" />\n  </ItemGroup>\n```\n\nどうも、Visual Studio (MSBuild.exe) と、dotnet CLI (dotnet build/run) で順序が違うっぽい。\n\nVisual Studio の場合:\n\n```\nLatin A\nLatin B\nLatin Z\nLatin-1 A\nGreek α\nCyrillic д\nカタカナ ア\n漢字\nEmoji ??\n漢字(サロゲートペア) ??(ほっけ)\n半角カナ ｱ\n```\n\n(絵文字とかサロゲートペアな文字が表示されないのは現状の Visual Studio のバグ。)\n\n絵文字(サロゲートペア、U+D800 近辺)が半角カナ(U+FF00 近辺)の前にいるということはおそらく UTF-16 で比較してる。\n\ndotnet run の場合:\n\n```\nLatin A\nLatin B\nLatin Z\nLatin-1 À\nGreek α\nCyrillic д\nカタカナ ア\n漢字\n半角カナ ｱ\nEmoji 🐈\n漢字(サロゲートペア) 𩸽(ほっけ)\n```\n\n絵文字が後ろなのでおそらく UTF-8 比較。\n\n## Explicit.csproj\n\n`*.cs` を使いつつ、一度 Remove → Include することで一部の順序を明示。\n\nExplicit.csproj:\n\n```xml\n  <ItemGroup>\n    <Compile Include=\"../*.cs\" />\n    <Compile Remove=\"../A.cs\" />\n    <Compile Include=\"../A.cs\" />\n  </ItemGroup>\n```\n\n(絵文字の順序が先ほどの理屈で環境依存なものの)\nこれで「A.cs が最後」だけは保証される。\n\n```\nLatin B\nLatin Z\nLatin-1 À\nGreek α\nCyrillic д\nカタカナ ア\n漢字\n半角カナ ｱ\nEmoji 🐈\n漢字(サロゲートペア) 𩸽(ほっけ)\nLatin A\n```\n"
  },
  {
    "path": "Demo/2023/MemberOrder/À.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nclass Latin1\n{\n    [ModuleInitializer]\n    public static void Init() => Console.WriteLine(\"Latin-1 À\");\n}\n"
  },
  {
    "path": "Demo/2023/MemberOrder/α.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nclass Greek\n{\n    [ModuleInitializer]\n    public static void Init() => Console.WriteLine(\"Greek α\");\n}\n"
  },
  {
    "path": "Demo/2023/MemberOrder/д.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nclass Cyrillic\n{\n    [ModuleInitializer]\n    public static void Init() => Console.WriteLine(\"Cyrillic д\");\n}\n"
  },
  {
    "path": "Demo/2023/MemberOrder/ア.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nclass Katagana\n{\n    [ModuleInitializer]\n    public static void Init() => Console.WriteLine(\"カタカナ ア\");\n}\n"
  },
  {
    "path": "Demo/2023/MemberOrder/漢字.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nclass 漢字\n{\n    [ModuleInitializer]\n    public static void Init() => Console.WriteLine(\"漢字\");\n}\n"
  },
  {
    "path": "Demo/2023/MemberOrder/ｱ.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nclass HalfWithKatagana\n{\n    [ModuleInitializer]\n    public static void Init() => Console.WriteLine(\"半角カナ ｱ\");\n}\n"
  },
  {
    "path": "Demo/2023/MemberOrder/🐈.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nclass Emoji\n{\n    [ModuleInitializer]\n    public static void Init() => Console.WriteLine(\"Emoji 🐈\");\n}\n"
  },
  {
    "path": "Demo/2023/MemberOrder/𩸽.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nclass SurrogatePairHan\n{\n    [ModuleInitializer]\n    public static void Init() => Console.WriteLine(\"漢字(サロゲートペア) 𩸽(ほっけ)\");\n}\n"
  },
  {
    "path": "Demo/2024/Distinct/.editorconfig",
    "content": "[*]\ncharset = utf-8\nend_of_line = lf\n\ncsharp_style_namespace_declarations=file_scoped:suggestion\n"
  },
  {
    "path": "Demo/2024/Distinct/Directory.Build.props",
    "content": "<Project>\n\n  <PropertyGroup>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2024/Distinct/Distinct/Binary.cs",
    "content": "namespace Distinct;\n\npublic class Binary\n{\n    public static ReadOnlySpan<T> Distinct<T>(IEnumerable<T> source, Span<T> buffer)\n        where T : IComparable<T>\n    {\n        var count = 0;\n\n        foreach (var item in source)\n        {\n            var i = buffer[..count].BinarySearch(item);\n            if (i >= 0) continue;\n            InsertAt(buffer, ~i, item);\n            ++count;\n        }\n\n        return buffer[..count];\n    }\n\n    private static void InsertAt<T>(Span<T> span, int index, T value)\n    {\n        span[index..^1].CopyTo(span[(index + 1)..]);\n        span[index] = value;\n    }\n}\n\n/*\n    public static int BinarySearch<TItem, TSearch>(this IList<TItem> list, TSearch value, Func<TSearch, TItem, int> comparer)\n    {\n        ThrowHelper.ThrowIfNull(list);\n        ThrowHelper.ThrowIfNull(comparer);\n\n        int lower = 0;\n        int upper = list.Count - 1;\n\n        while (lower <= upper)\n        {\n            int middle = lower + (upper - lower) / 2;\n            int comparisonResult = comparer(value, list[middle]);\n            if (comparisonResult < 0)\n            {\n                upper = middle - 1;\n            }\n            else if (comparisonResult > 0)\n            {\n                lower = middle + 1;\n            }\n            else\n            {\n                return middle;\n            }\n        }\n\n        return ~lower;\n    }\n * */\n"
  },
  {
    "path": "Demo/2024/Distinct/Distinct/Distinct.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2024/Distinct/Distinct/Hash.cs",
    "content": "namespace Distinct;\n\npublic class Hash\n{\n    /// <summary>\n    /// かなり癖の強い実装。\n    /// </summary>\n    /// <remarks>\n    /// * buffer がデフォルト値で初期化されてないと動作しない\n    /// * source にデフォルト値が入ってくると動作しない\n    /// * buffer サイズが source の倍程度の長さがないと衝突多くて遅い\n    /// </remarks>\n    public static Span<T> Distinct<T, TKey>(IEnumerable<T> source, Span<T> buffer, Func<T, TKey> getKey, Func<T, bool> isDefault)\n        where TKey : notnull\n    {\n        SpanHashSet<T, TKey> set = new(buffer, getKey, isDefault);\n\n        foreach (var x in source) set.Add(x);\n\n        var len = set.Compact();\n        return buffer[..len];\n    }\n}\n"
  },
  {
    "path": "Demo/2024/Distinct/Distinct/Linear.cs",
    "content": "namespace Distinct;\n\npublic class Linear\n{\n    public static ReadOnlySpan<T> Distinct<T>(IEnumerable<T> source, Span<T> buffer)\n        where T : IEquatable<T>\n    {\n        var count = 0;\n\n        foreach (var item in source)\n        {\n            if (buffer[..count].Contains(item)) continue;\n            buffer[count++] = item;\n        }\n\n        return buffer[..count];\n    }\n}\n"
  },
  {
    "path": "Demo/2024/Distinct/Distinct/SpanHashSet.cs",
    "content": "using System.Runtime.CompilerServices;\n\nnamespace Distinct;\n\npublic readonly ref struct SpanHashSet<T, TKey>(Span<T> buffer, Func<T, TKey> getKey, Func<T, bool> isDefault)\n    where TKey : notnull\n{\n    private readonly Span<T> _buffer = buffer;\n\n    public bool Add(T item)\n    {\n        ref var r = ref GetOrAddValueRef(getKey(item));\n        if (!isDefault(r)) return false;\n\n        r = item;\n        return true;\n    }\n\n    public ref T GetOrAddValueRef(TKey key)\n    {\n        var buffer = _buffer;\n        var len = buffer.Length;\n\n        int collisionCount = 0;\n        int bucketIndex = key.GetHashCode() % len;\n        for (int i = bucketIndex; i < len; i = (i + 1) % len)\n        {\n            ref var item = ref buffer[i];\n            if (key.Equals(getKey(item))\n                || isDefault(item))\n                return ref item!;\n\n            if (collisionCount == buffer.Length) Throw();\n\n            collisionCount++;\n        }\n\n        Throw();\n        return ref Unsafe.NullRef<T>();\n    }\n\n    private static void Throw() => throw new InvalidOperationException();\n\n    public int Compact()\n    {\n        var buffer = _buffer;\n        var len = buffer.Length;\n\n        var count = 0;\n        for (int i = 0; i < len; i++)\n        {\n            ref var item = ref buffer[i];\n            if (!isDefault(item))\n            {\n                if (count != i)\n                {\n                    buffer[count] = item;\n                    item = default!;\n                }\n\n                count++;\n            }\n        }\n\n        return count;\n    }\n}\n\n"
  },
  {
    "path": "Demo/2024/Distinct/Distinct.slnx",
    "content": "<Solution>\n  <Properties Name=\"Visual Studio\">\n    <Property Name=\"OpenWith\" Value=\"17\" />\n  </Properties>\n  <Project Path=\"DistinctBenchmark\\DistinctBenchmark.csproj\" Type=\"C#\" />\n  <Project Path=\"DistinctTest\\DistinctTest.csproj\" Type=\"C#\" />\n  <Project Path=\"Distinct\\Distinct.csproj\" />\n  <Folder Name=\"/solution items/\">\n    <File Path=\".editorconfig\" />\n    <File Path=\"Directory.Build.props\" />\n    <File Path=\"readme.md\" />\n  </Folder>\n</Solution>\n"
  },
  {
    "path": "Demo/2024/Distinct/DistinctBenchmark/DistinctBenchmark.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net8.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.13.12\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Distinct\\Distinct.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2024/Distinct/DistinctBenchmark/Program.cs",
    "content": "using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\n\nBenchmarkRunner.Run<DistinctBenchmark>();\n\npublic class DistinctBenchmark\n{\n    [Params(10, 20, 50, 100, 200, 500, 1000)]\n    public int N { get; set; }\n\n    private int[] _data = null!;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        var r = new Random();\n        _data = new int[1000];\n        foreach (ref var x in _data.AsSpan()) x = r.Next(1, 1000);\n    }\n\n    [Benchmark(Baseline = true)]\n    public void Linq()\n    {\n        foreach (var _ in _data.Take(N).Distinct()) ;\n    }\n\n    [Benchmark]\n    public void Linear()\n    {\n        foreach (var _ in Distinct.Linear.Distinct(_data.Take(N), stackalloc int[N])) ;\n    }\n\n    [Benchmark]\n    public void Binary()\n    {\n        foreach (var _ in Distinct.Binary.Distinct(_data.Take(N), stackalloc int[N])) ;\n    }\n\n    [Benchmark]\n    public void Hash()\n    {\n        foreach (var _ in Distinct.Hash.Distinct(_data.Take(N), stackalloc int[N], x => x, x => x == 0)) ;\n    }\n\n    [Benchmark]\n    public void Hash2N()\n    {\n        foreach (var _ in Distinct.Hash.Distinct(_data.Take(N), stackalloc int[2 * N], x => x, x => x == 0)) ;\n    }\n}"
  },
  {
    "path": "Demo/2024/Distinct/DistinctTest/BinaryTest.cs",
    "content": "\nnamespace DistinctTest;\n\npublic class BinaryTest\n{\n    [Fact]\n    public void EqualToLinqDistictOrder()\n    {\n        var data = TestData.Data;\n        var expected = data.Distinct().Order().ToArray();\n        var actual = Distinct.Binary.Distinct(data, stackalloc int[data.Length]);\n\n        Assert.Equal(expected, actual);\n    }\n}\n"
  },
  {
    "path": "Demo/2024/Distinct/DistinctTest/DistinctTest.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n    <IsPackable>false</IsPackable>\n    <IsTestProject>true</IsTestProject>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.10.0\" />\n    <PackageReference Include=\"xunit\" Version=\"2.8.1\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.8.1\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n    <PackageReference Include=\"coverlet.collector\" Version=\"6.0.2\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Distinct\\Distinct.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2024/Distinct/DistinctTest/GlobalUsings.cs",
    "content": "global using Xunit;"
  },
  {
    "path": "Demo/2024/Distinct/DistinctTest/HashTest.cs",
    "content": "namespace DistinctTest;\n\npublic class HashTest\n{\n    [Fact]\n    public void EqualToLinqDistictOrder()\n    {\n        var data = TestData.Data;\n        var expected = data.Distinct().Order().ToArray();\n        var actual = Distinct.Hash.Distinct(data, stackalloc int[data.Length], x => x, x => x == 0);\n        MemoryExtensions.Sort(actual);\n\n        Assert.Equal(expected, actual);\n    }\n}\n"
  },
  {
    "path": "Demo/2024/Distinct/DistinctTest/LinearTest.cs",
    "content": "\nnamespace DistinctTest;\n\npublic class LinearTest\n{\n    [Fact]\n    public void EqualToLinqDistict()\n    {\n        var data = TestData.Data;\n        var expected = data.Distinct().ToArray();\n        var actual = Distinct.Linear.Distinct(data, stackalloc int[data.Length]);\n\n        Assert.Equal(expected, actual);\n    }\n}\n"
  },
  {
    "path": "Demo/2024/Distinct/DistinctTest/TestData.cs",
    "content": "\nnamespace DistinctTest;\n\npublic class TestData\n{\n    public static int[] Data => _data ??= CreateData();\n    private static int[]? _data;\n\n    private static int[] CreateData()\n    {\n        var r = new Random();\n        var data = new int[1000];\n        foreach (ref var x in data.AsSpan()) x = r.Next(1, 1000);\n        return data;\n    }\n}\n"
  },
  {
    "path": "Demo/2024/Distinct/readme.md",
    "content": "DistinctBenchmark 実行結果の一例。\n線形探索が O(N^2) でも、N = 200 くらいまで十分速くて。\n\n| Method | N    | Mean         | Error      | StdDev     | Ratio | RatioSD |\n|------- |----- |-------------:|-----------:|-----------:|------:|--------:|\n| Linq   | 10   |    157.25 ns |   2.765 ns |   2.958 ns |  1.00 |    0.00 |\n| Linear | 10   |     70.80 ns |   0.323 ns |   0.286 ns |  0.45 |    0.01 |\n| Binary | 10   |    146.64 ns |   0.696 ns |   0.617 ns |  0.93 |    0.02 |\n| Hash   | 10   |    146.07 ns |   2.694 ns |   2.520 ns |  0.93 |    0.02 |\n| Hash2N | 10   |    128.85 ns |   2.589 ns |   2.542 ns |  0.82 |    0.02 |\n|        |      |              |            |            |       |         |\n| Linq   | 20   |    287.46 ns |   3.941 ns |   3.291 ns |  1.00 |    0.00 |\n| Linear | 20   |    125.51 ns |   0.791 ns |   0.740 ns |  0.44 |    0.01 |\n| Binary | 20   |    301.43 ns |   1.369 ns |   1.214 ns |  1.05 |    0.02 |\n| Hash   | 20   |    450.00 ns |   8.751 ns |  10.747 ns |  1.56 |    0.04 |\n| Hash2N | 20   |    222.27 ns |   3.615 ns |   3.205 ns |  0.77 |    0.02 |\n|        |      |              |            |            |       |         |\n| Linq   | 50   |    632.81 ns |  10.086 ns |   9.434 ns |  1.00 |    0.00 |\n| Linear | 50   |    315.08 ns |   4.687 ns |   4.384 ns |  0.50 |    0.01 |\n| Binary | 50   |    925.55 ns |   4.668 ns |   4.367 ns |  1.46 |    0.02 |\n| Hash   | 50   |    634.85 ns |  10.736 ns |  11.487 ns |  1.00 |    0.03 |\n| Hash2N | 50   |    512.61 ns |   7.750 ns |   7.249 ns |  0.81 |    0.01 |\n|        |      |              |            |            |       |         |\n| Linq   | 100  |  1,260.17 ns |  24.340 ns |  32.493 ns |  1.00 |    0.00 |\n| Linear | 100  |    740.53 ns |   3.028 ns |   2.832 ns |  0.58 |    0.02 |\n| Binary | 100  |  1,987.19 ns |   9.317 ns |   8.715 ns |  1.57 |    0.04 |\n| Hash   | 100  |  1,916.33 ns |  25.549 ns |  23.899 ns |  1.51 |    0.04 |\n| Hash2N | 100  |  1,018.40 ns |  19.144 ns |  22.046 ns |  0.81 |    0.03 |\n|        |      |              |            |            |       |         |\n| Linq   | 200  |  1,964.36 ns |  30.448 ns |  28.482 ns |  1.00 |    0.00 |\n| Linear | 200  |  1,478.41 ns |  14.099 ns |  12.498 ns |  0.75 |    0.01 |\n| Binary | 200  |  4,427.71 ns |  32.419 ns |  30.325 ns |  2.25 |    0.04 |\n| Hash   | 200  |  4,290.08 ns |  70.805 ns |  62.766 ns |  2.19 |    0.05 |\n| Hash2N | 200  |  2,030.15 ns |  24.690 ns |  21.887 ns |  1.04 |    0.01 |\n|        |      |              |            |            |       |         |\n| Linq   | 500  |  4,634.32 ns |  69.073 ns |  64.611 ns |  1.00 |    0.00 |\n| Linear | 500  |  5,678.84 ns |  43.522 ns |  38.582 ns |  1.23 |    0.02 |\n| Binary | 500  | 12,530.30 ns | 182.564 ns | 170.770 ns |  2.70 |    0.06 |\n| Hash   | 500  |  8,187.25 ns | 108.242 ns |  95.954 ns |  1.77 |    0.02 |\n| Hash2N | 500  |  5,110.52 ns |  59.791 ns |  55.929 ns |  1.10 |    0.02 |\n|        |      |              |            |            |       |         |\n| Linq   | 1000 |  9,188.08 ns | 182.133 ns | 178.879 ns |  1.00 |    0.00 |\n| Linear | 1000 | 21,839.60 ns | 421.085 ns | 393.883 ns |  2.38 |    0.03 |\n| Binary | 1000 | 52,693.67 ns | 423.829 ns | 396.450 ns |  5.75 |    0.13 |\n| Hash   | 1000 | 13,579.77 ns | 128.310 ns | 113.743 ns |  1.48 |    0.02 |\n| Hash2N | 1000 | 14,448.26 ns | 125.190 ns | 117.103 ns |  1.58 |    0.03 |"
  },
  {
    "path": "Demo/2024/ValueList/Collections/IListImpl.cs",
    "content": "﻿using System.Diagnostics;\nusing System.Runtime.CompilerServices;\n\nnamespace ValueList.Collections;\n\ninternal interface IListImpl<T>\n{\n    Span<T> Span { get; }\n    int Position { get; set; }\n    void Resize(int nextCapacity);\n\n    public static ref T GetItem<TSelf>(scoped ref TSelf self, int index)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        Debug.Assert(index < self.Position);\n        return ref self.Span[index];\n    }\n\n    public static void SetLength<TSelf>(scoped ref TSelf self, int length)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        Debug.Assert(length >= 0);\n        Debug.Assert(length <= self.Span.Length);\n        self.Position = length;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static void Add<TSelf>(scoped ref TSelf self, T item)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        int pos = self.Position;\n\n        Span<T> span = self.Span;\n        if ((uint)pos < (uint)span.Length)\n        {\n            span[pos] = item;\n            self.Position = pos + 1;\n        }\n        else\n        {\n            AddWithGrow(ref self, item);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    private static void AddWithGrow<TSelf>(scoped ref TSelf self, T item)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        Debug.Assert(self.Position == self.Span.Length);\n        int pos = self.Position;\n        Grow(ref self, 1);\n        self.Span[pos] = item;\n        self.Position = pos + 1;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static void AddRange<TSelf>(scoped ref TSelf self, scoped ReadOnlySpan<T> source)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        int pos = self.Position;\n        Span<T> span = self.Span;\n        if (source.Length == 1 && (uint)pos < (uint)span.Length)\n        {\n            span[pos] = source[0];\n            self.Position = pos + 1;\n        }\n        else\n        {\n            AddRangeWithGrow(ref self, source);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    private static void AddRangeWithGrow<TSelf>(scoped ref TSelf self, scoped ReadOnlySpan<T> source)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        if ((uint)(self.Position + source.Length) > (uint)self.Span.Length)\n        {\n            Grow(ref self, self.Span.Length - self.Position + source.Length);\n        }\n\n        source.CopyTo(self.Span[self.Position..]);\n        self.Position += source.Length;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static Span<T> AddSpan<TSelf>(scoped ref TSelf self, int length)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        Debug.Assert(length >= 0);\n\n        int pos = self.Position;\n        Span<T> span = self.Span;\n        if ((ulong)(uint)pos + (ulong)(uint)length <= (ulong)(uint)span.Length)\n        {\n            self.Position = pos + length;\n            return span.Slice(pos, length);\n        }\n        else\n        {\n            return AddSpanWithGrow(ref self, length);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    private static Span<T> AddSpanWithGrow<TSelf>(scoped ref TSelf self, int length)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        int pos = self.Position;\n        Grow(ref self, self.Span.Length - pos + length);\n        self.Position += length;\n        return self.Span.Slice(pos, length);\n    }\n\n    private static void Grow<TSelf>(scoped ref TSelf self, int additionalCapacityRequired)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        const int ArrayMaxLength = 0x7FFFFFC7;\n\n        var span = self.Span;\n\n        int nextCapacity = Math.Max(span.Length != 0 ? span.Length * 2 : 4, span.Length + additionalCapacityRequired);\n\n        if ((uint)nextCapacity > ArrayMaxLength)\n        {\n            nextCapacity = Math.Max(Math.Max(span.Length + 1, ArrayMaxLength), span.Length);\n        }\n\n        self.Resize(nextCapacity);\n    }\n}\n"
  },
  {
    "path": "Demo/2024/ValueList/Collections/PooledValueList.cs",
    "content": "﻿using System.Buffers;\nusing System.Runtime.CompilerServices;\n\nnamespace ValueList.Collections;\n\npublic struct PooledValueList<T> : IListImpl<T>, IDisposable\n{\n    private T[]? _arrayFromPool;\n    private int _pos;\n\n    readonly Span<T> IListImpl<T>.Span => _arrayFromPool;\n    int IListImpl<T>.Position { readonly get => _pos; set => _pos = value; }\n    void IListImpl<T>.Resize(int nextCapacity)\n    {\n        T[] array = ArrayPool<T>.Shared.Rent(nextCapacity);\n        _arrayFromPool.AsSpan().CopyTo(array);\n\n        T[]? toReturn = _arrayFromPool;\n        _arrayFromPool = array;\n        if (toReturn != null)\n        {\n            ArrayPool<T>.Shared.Return(toReturn);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public void Dispose()\n    {\n        T[]? toReturn = _arrayFromPool;\n        if (toReturn != null)\n        {\n            _arrayFromPool = null;\n            ArrayPool<T>.Shared.Return(toReturn);\n        }\n    }\n\n    public int Length { readonly get => _pos; set => IListImpl<T>.SetLength(ref this, value); }\n    public ref T this[int index] => ref IListImpl<T>.GetItem(ref this, index);\n    public void Add(T item) => IListImpl<T>.Add(ref this, item);\n    public void AddRange(scoped ReadOnlySpan<T> source) => IListImpl<T>.AddRange(ref this, source);\n    public Span<T> AddSpan(int length) => IListImpl<T>.AddSpan(ref this, length);\n    public readonly ReadOnlySpan<T> AsSpan() => _arrayFromPool.AsSpan()[.._pos];\n    public readonly ReadOnlyMemory<T> AsMemory() => _arrayFromPool.AsMemory()[.._pos];\n}\n"
  },
  {
    "path": "Demo/2024/ValueList/Collections/ReferenceImplementation.cs",
    "content": "﻿// https://github.com/dotnet/runtime/blob/d9a66070026c9133fade4e61a60d00aec170bfc4/src/libraries/System.Private.CoreLib/src/System/Collections/Generic/ValueListBuilder.cs\n\nusing System.Buffers;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\n\nnamespace ValueList.Collections;\n\ninternal ref struct ReferenceImplementation<T>\n{\n    private Span<T> _span;\n    private T[]? _arrayFromPool;\n    private int _pos;\n\n    public ReferenceImplementation(Span<T> initialSpan)\n    {\n        _span = initialSpan;\n        _arrayFromPool = null;\n        _pos = 0;\n    }\n\n    public int Length\n    {\n        get => _pos;\n        set\n        {\n            Debug.Assert(value >= 0);\n            Debug.Assert(value <= _span.Length);\n            _pos = value;\n        }\n    }\n\n    public ref T this[int index]\n    {\n        get\n        {\n            Debug.Assert(index < _pos);\n            return ref _span[index];\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public void Append(T item)\n    {\n        int pos = _pos;\n\n        // Workaround for https://github.com/dotnet/runtime/issues/72004\n        Span<T> span = _span;\n        if ((uint)pos < (uint)span.Length)\n        {\n            span[pos] = item;\n            _pos = pos + 1;\n        }\n        else\n        {\n            AddWithResize(item);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public void Append(scoped ReadOnlySpan<T> source)\n    {\n        int pos = _pos;\n        Span<T> span = _span;\n        if (source.Length == 1 && (uint)pos < (uint)span.Length)\n        {\n            span[pos] = source[0];\n            _pos = pos + 1;\n        }\n        else\n        {\n            AppendMultiChar(source);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    private void AppendMultiChar(scoped ReadOnlySpan<T> source)\n    {\n        if ((uint)(_pos + source.Length) > (uint)_span.Length)\n        {\n            Grow(_span.Length - _pos + source.Length);\n        }\n\n        source.CopyTo(_span.Slice(_pos));\n        _pos += source.Length;\n    }\n\n    public void Insert(int index, scoped ReadOnlySpan<T> source)\n    {\n        Debug.Assert(index == 0, \"Implementation currently only supports index == 0\");\n\n        if ((uint)(_pos + source.Length) > (uint)_span.Length)\n        {\n            Grow(source.Length);\n        }\n\n        _span.Slice(0, _pos).CopyTo(_span.Slice(source.Length));\n        source.CopyTo(_span);\n        _pos += source.Length;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public Span<T> AppendSpan(int length)\n    {\n        Debug.Assert(length >= 0);\n\n        int pos = _pos;\n        Span<T> span = _span;\n        if ((ulong)(uint)pos + (ulong)(uint)length <= (ulong)(uint)span.Length) // same guard condition as in Span<T>.Slice on 64-bit\n        {\n            _pos = pos + length;\n            return span.Slice(pos, length);\n        }\n        else\n        {\n            return AppendSpanWithGrow(length);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    private Span<T> AppendSpanWithGrow(int length)\n    {\n        int pos = _pos;\n        Grow(_span.Length - pos + length);\n        _pos += length;\n        return _span.Slice(pos, length);\n    }\n\n    // Hide uncommon path\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    private void AddWithResize(T item)\n    {\n        Debug.Assert(_pos == _span.Length);\n        int pos = _pos;\n        Grow(1);\n        _span[pos] = item;\n        _pos = pos + 1;\n    }\n\n    public ReadOnlySpan<T> AsSpan()\n    {\n        return _span.Slice(0, _pos);\n    }\n\n    public readonly ReadOnlyMemory<T> AsMemory() => _arrayFromPool is { } a ? a.AsMemory()[.._pos] : _span.ToArray();\n\n    public bool TryCopyTo(Span<T> destination, out int itemsWritten)\n    {\n        if (_span.Slice(0, _pos).TryCopyTo(destination))\n        {\n            itemsWritten = _pos;\n            return true;\n        }\n\n        itemsWritten = 0;\n        return false;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public void Dispose()\n    {\n        T[]? toReturn = _arrayFromPool;\n        if (toReturn != null)\n        {\n            _arrayFromPool = null;\n            ArrayPool<T>.Shared.Return(toReturn);\n        }\n    }\n\n    // Note that consuming implementations depend on the list only growing if it's absolutely\n    // required.  If the list is already large enough to hold the additional items be added,\n    // it must not grow. The list is used in a number of places where the reference is checked\n    // and it's expected to match the initial reference provided to the constructor if that\n    // span was sufficiently large.\n    private void Grow(int additionalCapacityRequired = 1)\n    {\n        const int ArrayMaxLength = 0x7FFFFFC7; // same as Array.MaxLength\n\n        // Double the size of the span.  If it's currently empty, default to size 4,\n        // although it'll be increased in Rent to the pool's minimum bucket size.\n        int nextCapacity = Math.Max(_span.Length != 0 ? _span.Length * 2 : 4, _span.Length + additionalCapacityRequired);\n\n        // If the computed doubled capacity exceeds the possible length of an array, then we\n        // want to downgrade to either the maximum array length if that's large enough to hold\n        // an additional item, or the current length + 1 if it's larger than the max length, in\n        // which case it'll result in an OOM when calling Rent below.  In the exceedingly rare\n        // case where _span.Length is already int.MaxValue (in which case it couldn't be a managed\n        // array), just use that same value again and let it OOM in Rent as well.\n        if ((uint)nextCapacity > ArrayMaxLength)\n        {\n            nextCapacity = Math.Max(Math.Max(_span.Length + 1, ArrayMaxLength), _span.Length);\n        }\n\n        T[] array = ArrayPool<T>.Shared.Rent(nextCapacity);\n        _span.CopyTo(array);\n\n        T[]? toReturn = _arrayFromPool;\n        _span = _arrayFromPool = array;\n        if (toReturn != null)\n        {\n            ArrayPool<T>.Shared.Return(toReturn);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2024/ValueList/Collections/ValueList.cs",
    "content": "﻿namespace ValueList.Collections;\n\npublic struct ValueList<T> : IListImpl<T>\n{\n    private T[]? _array;\n    private int _pos;\n\n    readonly Span<T> IListImpl<T>.Span => _array;\n    int IListImpl<T>.Position { readonly get => _pos; set => _pos = value; }\n    void IListImpl<T>.Resize(int nextCapacity) => Array.Resize(ref _array, nextCapacity);\n\n    public int Length { readonly get => _pos; set => IListImpl<T>.SetLength(ref this, value); }\n    public ref T this[int index] => ref IListImpl<T>.GetItem(ref this, index);\n    public void Add(T item) => IListImpl<T>.Add(ref this, item);\n    public void AddRange(scoped ReadOnlySpan<T> source) => IListImpl<T>.AddRange(ref this, source);\n    public Span<T> AddSpan(int length) => IListImpl<T>.AddSpan(ref this, length);\n    public readonly ReadOnlySpan<T> AsSpan() => _array.AsSpan()[.._pos];\n    public readonly ReadOnlyMemory<T> AsMemory() => _array.AsMemory()[.._pos];\n}\n"
  },
  {
    "path": "Demo/2024/ValueList/Collections/ValueListBuilder.cs",
    "content": "﻿using System.Buffers;\nusing System.Runtime.CompilerServices;\n\nnamespace ValueList.Collections;\n\npublic ref struct ValueListBuilder<T>(Span<T> initialSpan) : IListImpl<T>\n{\n    private Span<T> _span = initialSpan;\n    private T[]? _arrayFromPool = null;\n    private int _pos = 0;\n\n    readonly Span<T> IListImpl<T>.Span => _span;\n    int IListImpl<T>.Position { readonly get => _pos; set => _pos = value; }\n    void IListImpl<T>.Resize(int nextCapacity)\n    {\n        T[] array = ArrayPool<T>.Shared.Rent(nextCapacity);\n        _span.CopyTo(array);\n\n        T[]? toReturn = _arrayFromPool;\n        _span = _arrayFromPool = array;\n        if (toReturn != null)\n        {\n            ArrayPool<T>.Shared.Return(toReturn);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public void Dispose()\n    {\n        T[]? toReturn = _arrayFromPool;\n        if (toReturn != null)\n        {\n            _arrayFromPool = null;\n            ArrayPool<T>.Shared.Return(toReturn);\n        }\n    }\n\n    public int Length { readonly get => _pos; set => IListImpl<T>.SetLength(ref this, value); }\n    public ref T this[int index] => ref IListImpl<T>.GetItem(ref this, index);\n    public void Add(T item) => IListImpl<T>.Add(ref this, item);\n    public void AddRange(scoped ReadOnlySpan<T> source) => IListImpl<T>.AddRange(ref this, source);\n    public Span<T> AddSpan(int length) => IListImpl<T>.AddSpan(ref this, length);\n    public readonly ReadOnlySpan<T> AsSpan() => _span[.._pos];\n    public readonly ReadOnlyMemory<T> AsMemory() => _arrayFromPool is { } a ? a.AsMemory()[.._pos] : _span.ToArray();\n}\n"
  },
  {
    "path": "Demo/2024/ValueList/Program.cs",
    "content": "﻿using ValueList;\n\n#if DEBUG\n\nvar b = new ValueListBenchmark();\nb.Setup();\nconst int Take = 200;\nforeach (var x in b.ValueList().Span[..Take]) Console.Write($\"{x:X2}\"); Console.WriteLine();\nforeach (var x in b.PooledValueList().Span[..Take]) Console.Write($\"{x:X2}\"); Console.WriteLine();\nforeach (var x in b.ValueListBuilder().Span[..Take]) Console.Write($\"{x:X2}\"); Console.WriteLine();\nforeach (var x in b.ReferenceImplementation().Span[..Take]) Console.Write($\"{x:X2}\"); Console.WriteLine();\n\n#else\nBenchmarkDotNet.Running.BenchmarkRunner.Run<ValueListBenchmark>();\n\n#endif\n"
  },
  {
    "path": "Demo/2024/ValueList/ValueList.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <LangVersion>preview</LangVersion>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.13.12\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2024/ValueList/ValueList.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.0.31903.59\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ValueList\", \"ValueList.csproj\", \"{798A3F06-DC52-4222-AD75-BBB98F900554}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{798A3F06-DC52-4222-AD75-BBB98F900554}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{798A3F06-DC52-4222-AD75-BBB98F900554}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{798A3F06-DC52-4222-AD75-BBB98F900554}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{798A3F06-DC52-4222-AD75-BBB98F900554}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/2024/ValueList/ValueListBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing System.Runtime.InteropServices;\nusing ValueList.Collections;\n\nnamespace ValueList;\n\npublic class ValueListBenchmark\n{\n    private byte[] _bytes = null!;\n    private short[] _shorts = null!;\n    private int[] _ints = null!;\n    private long[] _longs = null!;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        const int N = 100;\n        var r = new Random();\n        foreach (ref var x in (_bytes = new byte[N]).AsSpan()) x = (byte)r.Next();\n        foreach (ref var x in (_shorts = new short[N]).AsSpan()) x = (short)r.Next();\n        foreach (ref var x in (_ints = new int[N]).AsSpan()) x = (int)r.Next();\n        foreach (ref var x in (_longs = new long[N]).AsSpan()) x = (long)r.Next();\n    }\n\n    [Benchmark]\n    public ReadOnlyMemory<byte> ValueList()\n    {\n        var list = new ValueList<byte>();\n        foreach (var x in _bytes) list.Add(x);\n        foreach (var x in _shorts) MemoryMarshal.Write(list.AddSpan(sizeof(short)), x);\n        foreach (var x in _ints) MemoryMarshal.Write(list.AddSpan(sizeof(int)), x);\n        foreach (var x in _longs) MemoryMarshal.Write(list.AddSpan(sizeof(long)), x);\n        return list.AsMemory();\n    }\n\n    [Benchmark]\n    public ReadOnlyMemory<byte> PooledValueList()\n    {\n        using var list = new PooledValueList<byte>();\n        foreach (var x in _bytes) list.Add(x);\n        foreach (var x in _shorts) MemoryMarshal.Write(list.AddSpan(sizeof(short)), x);\n        foreach (var x in _ints) MemoryMarshal.Write(list.AddSpan(sizeof(int)), x);\n        foreach (var x in _longs) MemoryMarshal.Write(list.AddSpan(sizeof(long)), x);\n        return list.AsMemory();\n    }\n\n    [Benchmark]\n    public ReadOnlyMemory<byte> ValueListBuilder()\n    {\n        using var list = new ValueListBuilder<byte>(stackalloc byte[512]);\n        foreach (var x in _bytes) list.Add(x);\n        foreach (var x in _shorts) MemoryMarshal.Write(list.AddSpan(sizeof(short)), x);\n        foreach (var x in _ints) MemoryMarshal.Write(list.AddSpan(sizeof(int)), x);\n        foreach (var x in _longs) MemoryMarshal.Write(list.AddSpan(sizeof(long)), x);\n        return list.AsMemory();\n    }\n\n    [Benchmark]\n    public ReadOnlyMemory<byte> ReferenceImplementation()\n    {\n        using var list = new ReferenceImplementation<byte>(stackalloc byte[512]);\n        foreach (var x in _bytes) list.Append(x);\n        foreach (var x in _shorts) MemoryMarshal.Write(list.AppendSpan(sizeof(short)), x);\n        foreach (var x in _ints) MemoryMarshal.Write(list.AppendSpan(sizeof(int)), x);\n        foreach (var x in _longs) MemoryMarshal.Write(list.AppendSpan(sizeof(long)), x);\n        return list.AsMemory();\n    }\n}\n"
  },
  {
    "path": "Demo/2025/InPlaceGroupBy/.editorconfig",
    "content": "[*]\ncharset = utf-8\nend_of_line = lf\n\ncsharp_style_namespace_declarations=file_scoped:suggestion\n"
  },
  {
    "path": "Demo/2025/InPlaceGroupBy/BenchmarkInPlaceGroupBy/BenchmarkInPlaceGroupBy.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.14.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\InPlaceGroupBy\\InPlaceGroupBy.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/InPlaceGroupBy/BenchmarkInPlaceGroupBy/Program.cs",
    "content": "using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing InPlaceGroupBy;\nusing System.Runtime.CompilerServices;\n\nBenchmarkRunner.Run<InPlaceGroupByBenchmark>();\n\n[MemoryDiagnoser]\npublic class InPlaceGroupByBenchmark\n{\n    public static (string key, int value)[] Data =\n    [\n        (\"a\", 1), (\"ab\", 2), (\"abc\", 3), (\"a\", 4), (\"ab\", 5),\n        (\"a\", 6), (\"a\", 7), (\"abc\", 8), (\"a\", 9), (\"a\", 10),\n        (\"a\", 11), (\"ab\", 12), (\"abc\", 13), (\"b\", 14), (\"ab\", 15),\n        (\"a\", 16), (\"a\", 17), (\"bc\", 18), (\"a\", 19), (\"b\", 20),\n        (\"a\", 21), (\"ab\", 22), (\"ac\", 23), (\"a\", 24), (\"ab\", 25),\n        (\"a\", 26), (\"d\", 27), (\"abc\", 28), (\"a\", 29), (\"ac\", 30),\n    ];\n\n    [Benchmark]\n    public void Linq()\n    {\n        var values = (stackalloc int[30]);\n        var i = 0;\n\n        foreach (var g in Data.GroupBy(x => x.key))\n        {\n            values[i++] = g.Sum(x => x.value);\n        }\n    }\n\n    [InlineArray(32)]\n    private struct Buffer<T>\n    {\n        private T _value;\n    }\n\n    [Benchmark]\n    public void InPlaceSpan()\n    {\n        var buffer = new Buffer<(string key, int value)>();\n        Span<(string key, int value)> span = buffer;\n        Data.CopyTo(span); // needs copy\n\n        var values = (stackalloc int[30]);\n        var i = 0;\n\n        foreach (var g in span.GroupBy((x, y) => x.key.AsSpan().CompareTo(y.key, StringComparison.Ordinal)))\n        {\n            values[i++] = g.Sum(x => x.value);\n        }\n    }\n}\n\nfile static class Ex\n{\n    public static int Sum<T>(this Span<T> span, Func<T, int> selector)\n    {\n        var sum = 0;\n        foreach (var item in span) sum += selector(item);\n        return sum;\n    }\n}\n"
  },
  {
    "path": "Demo/2025/InPlaceGroupBy/Directory.Build.props",
    "content": "<Project>\n\n  <PropertyGroup>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/InPlaceGroupBy/InPlaceGroupBy/InPlaceGroupBy.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/InPlaceGroupBy/InPlaceGroupBy/InPlaceSpanExtensions.cs",
    "content": "namespace InPlaceGroupBy;\n\npublic static class InPlaceSpanExtensions\n{\n    public static SortedSpanGrouping<T> GroupBy<T>(this Span<T> span, Comparison<T> comparison)\n    {\n        span.Sort(comparison);\n        return new(span, comparison);\n    }\n}\n"
  },
  {
    "path": "Demo/2025/InPlaceGroupBy/InPlaceGroupBy/SortedSpanGrouping.cs",
    "content": "namespace InPlaceGroupBy;\n\npublic readonly ref struct SortedSpanGrouping<T>(Span<T> span, Comparison<T> comparison)\n{\n    private readonly Span<T> _span = span;\n    private readonly Comparison<T> _comparison = comparison;\n\n    public Enumerator GetEnumerator() => new(this);\n\n    public ref struct Enumerator(SortedSpanGrouping<T> source)\n    {\n        private readonly SortedSpanGrouping<T> _source = source;\n        private int _start;\n        private int _end;\n\n        public bool MoveNext()\n        {\n            if (_end >= _source._span.Length) return false;\n\n            var first = _source._span[_end];\n            _start = _end;\n            while (true)\n            {\n                ++_end;\n                if (_end >= _source._span.Length\n                    || _source._comparison(first, _source._span[_end]) != 0) return true;\n            }\n        }\n\n        public readonly Span<T> Current => _source._span[_start.._end];\n    }\n}\n"
  },
  {
    "path": "Demo/2025/InPlaceGroupBy/InPlaceGroupBy.slnx",
    "content": "<Solution>\n  <Project Path=\"BenchmarkInPlaceGroupBy/BenchmarkInPlaceGroupBy.csproj\" Id=\"6964974f-b77a-42f7-8c80-5ad9a4595a43\" />\n  <Project Path=\"InPlaceGroupBy/InPlaceGroupBy.csproj\" Id=\"852225a0-e903-4d69-bec2-c9ea24607280\" />\n  <Project Path=\"TestInPlaceGroupBy/TestInPlaceGroupBy.csproj\" Id=\"cb9d56bd-0431-484e-9414-37bf232801f3\" />\n</Solution>\n"
  },
  {
    "path": "Demo/2025/InPlaceGroupBy/TestInPlaceGroupBy/Common.cs",
    "content": "namespace TestInPlaceGroupBy;\n\nclass Common\n{\n    public static (string key, int value)[] Data = [\n        (\"a\", 1), (\"ab\", 2), (\"abc\", 3), (\"a\", 4), (\"ab\", 5),\n        (\"a\", 6), (\"a\", 7), (\"abc\", 8), (\"a\", 9), (\"a\", 10),\n        (\"a\", 11), (\"ab\", 12), (\"abc\", 13), (\"b\", 14), (\"ab\", 15),\n        (\"a\", 16), (\"a\", 17), (\"bc\", 18), (\"a\", 19), (\"b\", 20),\n        (\"a\", 21), (\"ab\", 22), (\"ac\", 23), (\"a\", 24), (\"ab\", 25),\n        (\"a\", 26), (\"d\", 27), (\"abc\", 28), (\"a\", 29), (\"ac\", 30),\n    ];\n\n    public static int Compare((string key, int value) x, (string key, int value) y)\n    {\n        return x.key.AsSpan().CompareTo(y.key, StringComparison.Ordinal);\n    }\n}\n"
  },
  {
    "path": "Demo/2025/InPlaceGroupBy/TestInPlaceGroupBy/InPlaceGroupBy.cs",
    "content": "using InPlaceGroupBy;\n\nnamespace TestInPlaceGroupBy;\n\nusing static Common;\n\npublic class InPlaceGroupByTest\n{\n    [Fact]\n    public void EquivalentToLinq()\n    {\n        var g1 = Data.GroupBy(x => x.key);\n\n        var data = Data.ToArray().AsSpan();\n        var g2 = data.GroupBy(Compare);\n\n        Equals(g1, g2);\n    }\n\n    private static void Equals(IEnumerable<IGrouping<string, (string key, int value)>> g1, SortedSpanGrouping<(string key, int value)> g2)\n    {\n        // Same count\n        var count = 0;\n        {\n            var e = g2.GetEnumerator();\n            while (e.MoveNext()) count++;\n        }\n        Assert.Equal(g1.Count(), count);\n\n        var d = g1.ToDictionary(x => x.Key);\n\n        foreach (var g in g2)\n        {\n            var key = g[0].key;\n\n            // Same keys\n            Assert.True(d.TryGetValue(key, out var g1Item));\n\n            // Same values but order is not guaranteed\n            Assert.Equal(\n                g1Item.Select(x => x.value).Order(),\n                g.ToArray().Select(x => x.value).Order());\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2025/InPlaceGroupBy/TestInPlaceGroupBy/TestInPlaceGroupBy.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"coverlet.collector\" Version=\"6.0.2\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.11.1\" />\n    <PackageReference Include=\"xunit\" Version=\"2.9.2\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.8.2\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\InPlaceGroupBy\\InPlaceGroupBy.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Using Include=\"Xunit\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/InPlaceGroupBy/readme.md",
    "content": "3・4個のキーに対して ToLookup してて、それのアロケーションで GC がネックになったりすることが結構あり。\n破壊的操作(source の Span の変更)を認めるならアロケーション0で似たことができるはずという作業。\n多少遅いけども、アロケーションはきっちり0に。\n\n| Method      | Mean     | Error    | StdDev   | Gen0   | Gen1   | Allocated |\n|------------ |---------:|---------:|---------:|-------:|-------:|----------:|\n| Linq        | 817.5 ns | 15.56 ns | 14.55 ns | 0.2689 | 0.0010 |    2256 B |\n| InPlaceSpan | 987.5 ns |  7.91 ns |  6.60 ns |      - |      - |         - |\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/.editorconfig",
    "content": "[*]\ncharset = utf-8\nend_of_line = lf\n\ncsharp_style_namespace_declarations=file_scoped:suggestion\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/BenchmarkPseudoDictionary/BenchmarkPseudoDictionary.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.14.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\PseudoDictionary\\PseudoDictionary.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/BenchmarkPseudoDictionary/Program.cs",
    "content": "using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing PseudoDictionary;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing ValueList.Collections;\n\nBenchmarkRunner.Run<PseudoDictionaryBenchmark>();\n\n[MemoryDiagnoser]\npublic class PseudoDictionaryBenchmark\n{\n    private const string data = \"\"\"\n            a ab Abc x A a xy x abc ab A X y z xy b abc a X yZ zX z a b c x ab aBc\n            \"\"\";\n\n    private string[] _keys = null!;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        var keys = data.Split(' ');\n        _keys = [.. keys, .. keys, .. keys, .. keys, .. keys, .. keys, .. keys, .. keys, .. keys];\n    }\n\n    [Benchmark]\n    public void Dictionary()\n    {\n        var dic = new Dictionary<string, int>();\n\n        foreach (var key in _keys)\n        {\n            CollectionsMarshal.GetValueRefOrAddDefault(dic, key, out _)++;\n        }\n    }\n\n    [Benchmark]\n    public void PseudoDictionary()\n    {\n        var list = new List<(string key, int value)>();\n\n        foreach (var key in _keys)\n        {\n            list.GetValueRefOrAddDefault(key)++;\n        }\n    }\n\n    [InlineArray(32)]\n    private struct Buffer<T>\n    {\n        private T _value;\n    }\n\n    [Benchmark]\n    public void ValueList()\n    {\n        var buffer = new Buffer<(string key, int value)>();\n        var list = new ValueListBuilder<(string key, int value)>(buffer);\n\n        foreach (var key in _keys)\n        {\n            list.GetValueRefOrAddDefault(key)++;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/Directory.Build.props",
    "content": "<Project>\n\n  <PropertyGroup>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/PseudoDictionary/IListImpl.cs",
    "content": "﻿using System.Diagnostics;\nusing System.Runtime.CompilerServices;\n\nnamespace ValueList.Collections;\n\ninternal interface IListImpl<T>\n{\n    Span<T> Span { get; }\n    int Position { get; set; }\n    void Resize(int nextCapacity);\n\n    public static ref T GetItem<TSelf>(scoped ref TSelf self, int index)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        Debug.Assert(index < self.Position);\n        return ref self.Span[index];\n    }\n\n    public static void SetLength<TSelf>(scoped ref TSelf self, int length)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        Debug.Assert(length >= 0);\n        Debug.Assert(length <= self.Span.Length);\n        self.Position = length;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static void Add<TSelf>(scoped ref TSelf self, T item)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        int pos = self.Position;\n\n        Span<T> span = self.Span;\n        if ((uint)pos < (uint)span.Length)\n        {\n            span[pos] = item;\n            self.Position = pos + 1;\n        }\n        else\n        {\n            AddWithGrow(ref self, item);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    private static void AddWithGrow<TSelf>(scoped ref TSelf self, T item)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        Debug.Assert(self.Position == self.Span.Length);\n        int pos = self.Position;\n        Grow(ref self, 1);\n        self.Span[pos] = item;\n        self.Position = pos + 1;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static void AddRange<TSelf>(scoped ref TSelf self, scoped ReadOnlySpan<T> source)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        int pos = self.Position;\n        Span<T> span = self.Span;\n        if (source.Length == 1 && (uint)pos < (uint)span.Length)\n        {\n            span[pos] = source[0];\n            self.Position = pos + 1;\n        }\n        else\n        {\n            AddRangeWithGrow(ref self, source);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    private static void AddRangeWithGrow<TSelf>(scoped ref TSelf self, scoped ReadOnlySpan<T> source)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        if ((uint)(self.Position + source.Length) > (uint)self.Span.Length)\n        {\n            Grow(ref self, self.Span.Length - self.Position + source.Length);\n        }\n\n        source.CopyTo(self.Span[self.Position..]);\n        self.Position += source.Length;\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public static Span<T> AddSpan<TSelf>(scoped ref TSelf self, int length)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        Debug.Assert(length >= 0);\n\n        int pos = self.Position;\n        Span<T> span = self.Span;\n        if ((ulong)(uint)pos + (ulong)(uint)length <= (ulong)(uint)span.Length)\n        {\n            self.Position = pos + length;\n            return span.Slice(pos, length);\n        }\n        else\n        {\n            return AddSpanWithGrow(ref self, length);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.NoInlining)]\n    private static Span<T> AddSpanWithGrow<TSelf>(scoped ref TSelf self, int length)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        int pos = self.Position;\n        Grow(ref self, self.Span.Length - pos + length);\n        self.Position += length;\n        return self.Span.Slice(pos, length);\n    }\n\n    private static void Grow<TSelf>(scoped ref TSelf self, int additionalCapacityRequired)\n        where TSelf : IListImpl<T>, allows ref struct\n    {\n        const int ArrayMaxLength = 0x7FFFFFC7;\n\n        var span = self.Span;\n\n        int nextCapacity = Math.Max(span.Length != 0 ? span.Length * 2 : 4, span.Length + additionalCapacityRequired);\n\n        if ((uint)nextCapacity > ArrayMaxLength)\n        {\n            nextCapacity = Math.Max(Math.Max(span.Length + 1, ArrayMaxLength), span.Length);\n        }\n\n        self.Resize(nextCapacity);\n    }\n}\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/PseudoDictionary/PseudoDictionary.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/PseudoDictionary/PseudoDictionaryExtensions.ValueList.cs",
    "content": "using ValueList.Collections;\n\nnamespace PseudoDictionary;\n\npublic static partial class PseudoDictionaryExtensions\n{\n    public static ref TValue GetValueRefOrAddDefault<TKey, TValue>(this ref ValueListBuilder<(TKey Key, TValue Value)> list, TKey key, Func<TKey, TKey, bool> keyComparer)\n    {\n        foreach (ref var x in list.AsSpan())\n            if (keyComparer(key, x.Key)) return ref x.Value;\n        list.Add((key, default!));\n        return ref list.AsSpan()[^1]!.Value;\n    }\n\n    public static ref TValue GetValueRefOrAddDefault<TKey, TValue>(this ref ValueListBuilder<(TKey Key, TValue Value)> list, TKey key)\n        where TKey : IEquatable<TKey>\n    {\n        foreach (ref var x in list.AsSpan())\n            if (key.Equals(x.Key)) return ref x.Value;\n        list.Add((key, default!));\n        return ref list.AsSpan()[^1]!.Value;\n    }\n\n    public static ref TValue GetValueRefOrAddDefault<TKey, TValue>(this ref ValueListBuilder<TValue> list, TKey key,\n        Func<TValue, TKey> getKey,\n        Func<TKey, TValue> newInstance,\n        Func<TKey, TKey, bool> comparer)\n    {\n        foreach (ref var x in list.AsSpan())\n            if (comparer(key, getKey(x))) return ref x;\n        list.Add(newInstance(key));\n        return ref list.AsSpan()[^1]!;\n    }\n\n    public static ref TValue GetValueRefOrAddDefault<TKey, TValue>(this ref ValueListBuilder<TValue> list, TKey key,\n        Func<TValue, TKey> getKey,\n        Func<TKey, TValue> newInstance)\n        where TKey : IEquatable<TKey>\n    {\n        foreach (ref var x in list.AsSpan())\n            if (key.Equals(getKey(x))) return ref x;\n        list.Add(newInstance(key));\n        return ref list.AsSpan()[^1]!;\n    }\n}\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/PseudoDictionary/PseudoDictionaryExtensions.cs",
    "content": "using System.Runtime.InteropServices;\n\nnamespace PseudoDictionary;\n\npublic static partial class PseudoDictionaryExtensions\n{\n    public static ref TValue GetValueRefOrAddDefault<TKey, TValue>(this List<(TKey Key, TValue Value)> list, TKey key, Func<TKey, TKey, bool> keyComparer)\n    {\n        foreach (ref var x in CollectionsMarshal.AsSpan(list))\n            if (keyComparer(key, x.Key)) return ref x.Value;\n        list.Add((key, default!));\n        return ref CollectionsMarshal.AsSpan(list)[^1]!.Value;\n    }\n\n    public static ref TValue GetValueRefOrAddDefault<TKey, TValue>(this List<(TKey Key, TValue Value)> list, TKey key)\n        where TKey : IEquatable<TKey>\n    {\n        foreach (ref var x in CollectionsMarshal.AsSpan(list))\n            if (key.Equals(x.Key)) return ref x.Value;\n        list.Add((key, default!));\n        return ref CollectionsMarshal.AsSpan(list)[^1]!.Value;\n    }\n\n    public static ref TValue GetValueRefOrAddDefault<TKey, TValue>(this List<TValue> list, TKey key,\n        Func<TValue, TKey> getKey,\n        Func<TKey, TValue> newInstance,\n        Func<TKey, TKey, bool> comparer)\n    {\n        foreach (ref var x in CollectionsMarshal.AsSpan(list))\n            if (comparer(key, getKey(x))) return ref x;\n        list.Add(newInstance(key));\n        return ref CollectionsMarshal.AsSpan(list)[^1]!;\n    }\n\n    public static ref TValue GetValueRefOrAddDefault<TKey, TValue>(this List<TValue> list, TKey key,\n        Func<TValue, TKey> getKey,\n        Func<TKey, TValue> newInstance)\n        where TKey : IEquatable<TKey>\n    {\n        foreach (ref var x in CollectionsMarshal.AsSpan(list))\n            if (key.Equals(getKey(x))) return ref x;\n        list.Add(newInstance(key));\n        return ref CollectionsMarshal.AsSpan(list)[^1]!;\n    }\n}\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/PseudoDictionary/ValueListBuilder.cs",
    "content": "using System.Buffers;\nusing System.Runtime.CompilerServices;\n\nnamespace ValueList.Collections;\n\npublic ref struct ValueListBuilder<T>(Span<T> initialSpan) : IListImpl<T>\n{\n    private Span<T> _span = initialSpan;\n    private T[]? _arrayFromPool = null;\n    private int _pos = 0;\n\n    readonly Span<T> IListImpl<T>.Span => _span;\n    int IListImpl<T>.Position { readonly get => _pos; set => _pos = value; }\n    void IListImpl<T>.Resize(int nextCapacity)\n    {\n        T[] array = ArrayPool<T>.Shared.Rent(nextCapacity);\n        _span.CopyTo(array);\n\n        T[]? toReturn = _arrayFromPool;\n        _span = _arrayFromPool = array;\n        if (toReturn != null)\n        {\n            ArrayPool<T>.Shared.Return(toReturn);\n        }\n    }\n\n    [MethodImpl(MethodImplOptions.AggressiveInlining)]\n    public void Dispose()\n    {\n        T[]? toReturn = _arrayFromPool;\n        if (toReturn != null)\n        {\n            _arrayFromPool = null;\n            ArrayPool<T>.Shared.Return(toReturn);\n        }\n    }\n\n    public int Length { readonly get => _pos; set => IListImpl<T>.SetLength(ref this, value); }\n    public ref T this[int index] => ref IListImpl<T>.GetItem(ref this, index);\n    public void Add(T item) => IListImpl<T>.Add(ref this, item);\n    public Span<T> AddSpan(int length) => IListImpl<T>.AddSpan(ref this, length);\n    public readonly Span<T> AsSpan() => _span[.._pos];\n}\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/PseudoDictionary.slnx",
    "content": "<Solution>\n  <Project Path=\"BenchmarkPseudoDictionary/BenchmarkPseudoDictionary.csproj\" Id=\"531b5f6c-3d56-4711-8015-bc5c1fe5088a\" />\n  <Project Path=\"PseudoDictionary/PseudoDictionary.csproj\" />\n  <Project Path=\"TestPseudoDictionary/TestPseudoDictionary.csproj\" Id=\"1389302d-f840-4199-a492-89875769b894\" />\n</Solution>\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/TestPseudoDictionary/Common.cs",
    "content": "namespace TestPseudoDictionary;\n\ninternal class Common\n{\n    public static bool EqualsIgnoreCase(string x, string y) => x.Equals(y, StringComparison.OrdinalIgnoreCase);\n\n    public struct X\n    {\n        public string Key;\n        public int Value;\n    }\n\n    public static string GetKey(X x) => x.Key;\n    public static X NewX(string key) => new() { Key = key };\n\n    public const string Data = \"a ab Abc x A a xy x abc ab A X y z xy b abc a X yZ zX z a b c x ab aBc\";\n    public static IEnumerable<string> EnumerateWords() => Data.Split(' ');\n}\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/TestPseudoDictionary/PseudoDictionaryExtensionsTest.cs",
    "content": "using PseudoDictionary;\nusing System.Runtime.InteropServices;\n\nnamespace TestPseudoDictionary;\n\nusing static Common;\n\npublic class PseudoDictionaryExtensionsTest\n{\n    [Fact]\n    public void EquivalentToDictionary()\n    {\n        var list = new List<(string key, int value)>();\n        var dic = new Dictionary<string, int>();\n\n        foreach (var word in EnumerateWords())\n        {\n            CollectionsMarshal.GetValueRefOrAddDefault(dic, word, out _)++;\n            list.GetValueRefOrAddDefault(word)++;\n        }\n\n        foreach (var (key, value) in dic)\n        {\n            Assert.Equal(value, list.GetValueRefOrAddDefault(key));\n        }\n    }\n\n    [Fact]\n    public void KeyComparer()\n    {\n        var list = new List<(string key, int value)>();\n        var dic = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);\n\n        foreach (var word in EnumerateWords())\n        {\n            CollectionsMarshal.GetValueRefOrAddDefault(dic, word, out _)++;\n            list.GetValueRefOrAddDefault(word, EqualsIgnoreCase)++;\n        }\n\n        foreach (var (key, value) in dic)\n        {\n            Assert.Equal(value, list.GetValueRefOrAddDefault(key, EqualsIgnoreCase));\n        }\n    }\n\n    [Fact]\n    public void KeySeletor()\n    {\n        var list = new List<X>();\n        var dic = new Dictionary<string, int>();\n\n        foreach (var word in EnumerateWords())\n        {\n            CollectionsMarshal.GetValueRefOrAddDefault(dic, word, out _)++;\n            list.GetValueRefOrAddDefault(word, GetKey, NewX).Value++;\n        }\n\n        foreach (var (key, value) in dic)\n        {\n            Assert.Equal(value, list.GetValueRefOrAddDefault(key, GetKey, NewX).Value);\n        }\n    }\n\n    [Fact]\n    public void KeySeletorComparer()\n    {\n        var list = new List<X>();\n        var dic = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);\n\n        foreach (var word in EnumerateWords())\n        {\n            CollectionsMarshal.GetValueRefOrAddDefault(dic, word, out _)++;\n            list.GetValueRefOrAddDefault(word, GetKey, NewX, EqualsIgnoreCase).Value++;\n        }\n\n        foreach (var (key, value) in dic)\n        {\n            Assert.Equal(value, list.GetValueRefOrAddDefault(key, GetKey, NewX, EqualsIgnoreCase).Value);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/TestPseudoDictionary/PseudoDictionaryExtensionsValueListTest.cs",
    "content": "using PseudoDictionary;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing ValueList.Collections;\n\nnamespace TestPseudoDictionary;\n\nusing static Common;\n\npublic class PseudoDictionaryExtensionsValueListTest\n{\n    [InlineArray(32)]\n    private struct Buffer<T>\n    {\n        private T _value;\n    }\n\n    [Fact]\n    public void EquivalentToDictionary()\n    {\n        var buffer = new Buffer<(string key, int value)>();\n        var list = new ValueListBuilder<(string key, int value)>(buffer);\n        var dic = new Dictionary<string, int>();\n\n        foreach (var word in EnumerateWords())\n        {\n            CollectionsMarshal.GetValueRefOrAddDefault(dic, word, out _)++;\n            list.GetValueRefOrAddDefault(word)++;\n        }\n\n        foreach (var (key, value) in dic)\n        {\n            Assert.Equal(value, list.GetValueRefOrAddDefault(key));\n        }\n    }\n\n    [Fact]\n    public void KeyComparer()\n    {\n        var buffer = new Buffer<(string key, int value)>();\n        var list = new ValueListBuilder<(string key, int value)>(buffer);\n        var dic = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);\n\n        foreach (var word in EnumerateWords())\n        {\n            CollectionsMarshal.GetValueRefOrAddDefault(dic, word, out _)++;\n            list.GetValueRefOrAddDefault(word, EqualsIgnoreCase)++;\n        }\n\n        foreach (var (key, value) in dic)\n        {\n            Assert.Equal(value, list.GetValueRefOrAddDefault(key, EqualsIgnoreCase));\n        }\n    }\n\n    [Fact]\n    public void KeySeletor()\n    {\n        var buffer = new Buffer<X>();\n        var list = new ValueListBuilder<X>(buffer);\n        var dic = new Dictionary<string, int>();\n\n        foreach (var word in EnumerateWords())\n        {\n            CollectionsMarshal.GetValueRefOrAddDefault(dic, word, out _)++;\n            list.GetValueRefOrAddDefault(word, GetKey, NewX).Value++;\n        }\n\n        foreach (var (key, value) in dic)\n        {\n            Assert.Equal(value, list.GetValueRefOrAddDefault(key, GetKey, NewX).Value);\n        }\n    }\n\n    [Fact]\n    public void KeySeletorComparer()\n    {\n        var buffer = new Buffer<X>();\n        var list = new ValueListBuilder<X>(buffer);\n        var dic = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);\n\n        foreach (var word in EnumerateWords())\n        {\n            CollectionsMarshal.GetValueRefOrAddDefault(dic, word, out _)++;\n            list.GetValueRefOrAddDefault(word, GetKey, NewX, EqualsIgnoreCase).Value++;\n        }\n\n        foreach (var (key, value) in dic)\n        {\n            Assert.Equal(value, list.GetValueRefOrAddDefault(key, GetKey, NewX, EqualsIgnoreCase).Value);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/TestPseudoDictionary/TestPseudoDictionary.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"coverlet.collector\" Version=\"6.0.2\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.11.1\" />\n    <PackageReference Include=\"xunit\" Version=\"2.9.2\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.8.2\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\PseudoDictionary\\PseudoDictionary.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Using Include=\"Xunit\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/PseudoDictionary/readme.md",
    "content": "少ない要素数のためにDictionaryを使うとアロケーションが気になる。\nListで、線形探索を使ってDictionaryを代用することを考える。\n要素数が少ないうち(以下のベンチマークでは15キーほど)はそこまで遅くならず、アロケーションは半減する。\nさらに、SpanベースのList (ValueList)を実装することで、要素数次第ではアロケーションを消せる。\n\n| Method           | Mean     | Error     | StdDev    | Gen0   | Allocated |\n|----------------- |---------:|----------:|----------:|-------:|----------:|\n| Dictionary       | 2.029 us | 0.0270 us | 0.0226 us | 0.1183 |     992 B |\n| PseudoDictionary | 2.346 us | 0.0272 us | 0.0241 us | 0.0648 |     552 B |\n| ValueList        | 2.297 us | 0.0198 us | 0.0186 us |      - |         - |\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/ConsoleApp1.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net9.0</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"BenchmarkDotNet\" Version=\"0.14.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/Example/A.cs",
    "content": "using ConsoleApp1.Formatter;\nusing System.Diagnostics;\nusing System.Runtime.CompilerServices;\n\nnamespace ConsoleApp1.Example;\n\npublic partial struct Line(Point start, Point end)\n{\n    private Point _start = start;\n    public Point Start { get => _start; set => _start = value; }\n\n    private Point _end = end;\n    public Point End { get => _end; set => _end = value; }\n\n    public Line() : this(default, default) { }\n}\n\npublic partial struct Point(int x, int y)\n{\n    private int _x = x;\n    public int X { get => _x; set => _x = value; }\n\n    private int _y = y;\n    public int Y { get => _y; set => _y = value; }\n\n    public Point() : this(0, 0) { }\n}\n\npartial struct Line\n{\n    public static readonly IFormatter Formetter = new RecordFormatter(\n        typeof(Line),\n        [\n            new(typeof(Point), x => Unsafe.Unbox<Line>(x).Start, (x, v) => Unsafe.Unbox<Line>(x).Start = (Point)v, x => UnsafeRef.Create(ref x.As<Line>()._start)),\n            new(typeof(Point), x => Unsafe.Unbox<Line>(x).End, (x, v) => Unsafe.Unbox<Line>(x).End = (Point)v, x => UnsafeRef.Create(ref x.As<Line>()._end)),\n        ]\n    );\n\n    public override string ToString() => $\"{Start} - {End}\";\n}\n\npartial struct Point\n{\n    public static readonly IFormatter Formetter = new RecordFormatter(\n        typeof(Point),\n        [\n            new(typeof(int), x => Unsafe.Unbox<Point>(x).X, (x, v) => Unsafe.Unbox<Point>(x).X = (int)v, x => UnsafeRef.Create(ref x.As<Point>()._x)),\n            new(typeof(int), x => Unsafe.Unbox<Point>(x).Y, (x, v) => Unsafe.Unbox<Point>(x).Y = (int)v, x => UnsafeRef.Create(ref x.As<Point>()._y)),\n        ]\n    );\n\n    public override string ToString() => $\"({X}, {Y})\";\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/Example/Program1.cs",
    "content": "using ConsoleApp1;\nusing System.Runtime.CompilerServices;\n\npartial class Program1\n{\n    public static void Run()\n    {\n        M(1, 2);\n        M(\"1\", 2.0);\n        M(true, DateTimeOffset.Now);\n        M((byte)1, (short)2, (ushort?)3);\n    }\n\n    public static void M<T1, T2>(T1 x1, T2 x2)\n    {\n        var tuple = (x1, x2);\n        var accessor = Accessor.Create(ref tuple);\n        A(tuple); // boxed\n        B(accessor);\n        Console.WriteLine();\n    }\n\n    public static void M<T1, T2, T3>(T1 x1, T2 x2, T3 x3)\n    {\n        var tuple = (x1, x2, x3);\n        var accessor = Accessor.Create(ref tuple);\n        A(tuple); // boxed\n        B(accessor);\n    }\n\n    static void A(ITuple tuple)\n    {\n        for (int i = 0; i < tuple.Length; i++)\n        {\n            Console.WriteLine(tuple[i]?.GetType().Name);\n        }\n    }\n\n    static void B<TAccessor>(TAccessor tuple)\n        where TAccessor : struct, ITupleAccessor, allows ref struct\n    {\n        foreach (var t in tuple)\n        {\n            Console.WriteLine(t.Type.Name);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/Formatter/ArrayFormatter.cs",
    "content": "using System.Buffers;\n\nnamespace ConsoleApp1.Formatter;\n\ninternal class ArrayFormatter<T> : IFormatter\n{\n    public Type Type => throw new NotImplementedException();\n\n    public object Read(FormatterProvider provider, ref SequenceReader<byte> reader)\n    {\n        var length = (int)provider.GetFormatter(typeof(int)).Read(provider, ref reader);\n        var t = provider.GetFormatter(typeof(T));\n        var array = new T[length];\n        for (int i = 0; i < length; i++)\n        {\n            array[i] = (T)t.Read(provider, ref reader);\n        }\n        return array;\n    }\n\n    public void Read(FormatterProvider provider, ref SequenceReader<byte> reader, scoped UnsafeRef value)\n    {\n        int length = 0;\n        provider.GetFormatter(typeof(int)).Read(provider, ref reader, UnsafeRef.Create(ref length));\n\n        if (value.As<object?>() is not T[] a || a.Length != length)\n        {\n            value.As<object?>() = new T[length];\n        }\n\n        var t = provider.GetFormatter(typeof(T));\n        var array = value.As<T[]>();\n        for (int i = 0; i < length; i++)\n        {\n            t.Read(provider, ref reader, UnsafeRef.Create(ref array[i]));\n        }\n    }\n\n    public void Write(FormatterProvider provider, IBufferWriter<byte> writer, object value)\n    {\n        var array = (T[])value;\n        provider.GetFormatter(typeof(int)).Write(provider, writer, array.Length);\n        var t = provider.GetFormatter(typeof(T));\n        for (int i = 0; i < array.Length; i++)\n        {\n            t.Write(provider, writer, array[i]);\n        }\n    }\n\n    public void Write(FormatterProvider provider, IBufferWriter<byte> writer, scoped UnsafeRef value)\n    {\n        var array = value.As<T[]>();\n        var length = array.Length;\n        provider.GetFormatter(typeof(int)).Write(provider, writer, UnsafeRef.Create(ref length));\n        var t = provider.GetFormatter(typeof(T));\n        for (int i = 0; i < length; i++)\n        {\n            t.Write(provider, writer, UnsafeRef.Create(ref array[i]));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/Formatter/FormatterProvider.cs",
    "content": "using System.Collections.Concurrent;\n\nnamespace ConsoleApp1.Formatter;\n\npublic class FormatterProvider\n{\n    private readonly ConcurrentDictionary<Type, IFormatter?> _formatters = [];\n\n    public IFormatter? GetFormatter(Type t)\n    {\n        return _formatters.GetOrAdd(t, Create);\n    }\n\n    private IFormatter? Create(Type type)\n    {\n        if (type.IsArray)\n        {\n            var elementType = type.GetElementType();\n            var formatter = (IFormatter)Activator.CreateInstance(typeof(ArrayFormatter<>).MakeGenericType(elementType));\n            return formatter;\n        }\n\n        return Primitives.GetFormatter(type);\n    }\n\n    public void Add(IFormatter formatter)\n    {\n        _formatters[formatter.Type] = formatter;\n    }\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/Formatter/IFormatter.cs",
    "content": "using System.Buffers;\n\nnamespace ConsoleApp1.Formatter;\n\npublic interface IFormatter\n{\n    Type Type { get; }\n\n    // via object\n    void Write(FormatterProvider provider, IBufferWriter<byte> writer, object value);\n    object Read(FormatterProvider provider, ref SequenceReader<byte> reader);\n\n    // via UnsafeRef\n    void Write(FormatterProvider provider, IBufferWriter<byte> writer, scoped UnsafeRef value);\n    void Read(FormatterProvider provider, ref SequenceReader<byte> reader, scoped UnsafeRef value);\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/Formatter/Primitives.cs",
    "content": "using System.Buffers;\nusing System.Collections.Frozen;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\nnamespace ConsoleApp1.Formatter;\n\npublic class Primitives\n{\n    private static readonly FrozenDictionary<Type, IFormatter> _formatters = new IFormatter[]\n    {\n        new LittleEndianFormatter<byte>(),\n        new LittleEndianFormatter<sbyte>(),\n        new LittleEndianFormatter<short>(),\n        new LittleEndianFormatter<ushort>(),\n        new LittleEndianFormatter<int>(),\n        new LittleEndianFormatter<uint>(),\n        new LittleEndianFormatter<long>(),\n        new LittleEndianFormatter<ulong>(),\n        new LittleEndianFormatter<float>(),\n        new LittleEndianFormatter<double>(),\n    }.ToFrozenDictionary(x => x.Type);\n\n    public static IFormatter? GetFormatter(Type t) => _formatters.TryGetValue(t, out var f) ? f : null;\n}\n\ninternal class LittleEndianFormatter<T> : IFormatter\n    where T : unmanaged\n{\n    public Type Type => typeof(T);\n\n    private static T Cast(ReadOnlySpan<byte> span) => MemoryMarshal.Cast<byte, T>(span)[0];\n    private static ReadOnlySpan<byte> Cast(ref T r)\n    {\n        var span = MemoryMarshal.CreateReadOnlySpan(ref r, 1);\n        return MemoryMarshal.Cast<T, byte>(span);\n    }\n\n    public object Read(FormatterProvider provider, ref SequenceReader<byte> reader)\n    {\n        var size = Unsafe.SizeOf<T>();\n        if (reader.UnreadSpan.Length >= size)\n        {\n            var span = reader.UnreadSpan[..size];\n            var value = Cast(span);\n            reader.Advance(size);\n            return value;\n        }\n        else\n        {\n            var span = (stackalloc byte[size]);\n            reader.UnreadSequence.CopyTo(span);\n            var value = Cast(span);\n            reader.Advance(size);\n            return value;\n        }\n    }\n\n    public void Read(FormatterProvider provider, ref SequenceReader<byte> reader, scoped UnsafeRef value)\n    {\n        var size = Unsafe.SizeOf<T>();\n        if (reader.UnreadSpan.Length >= size)\n        {\n            var span = reader.UnreadSpan[..size];\n            value.As<T>() = Cast(span);\n            reader.Advance(size);\n        }\n        else\n        {\n            var span = (stackalloc byte[size]);\n            reader.UnreadSequence.CopyTo(span);\n            value.As<T>() = Cast(span);\n            reader.Advance(size);\n        }\n    }\n\n    public void Write(FormatterProvider provider, IBufferWriter<byte> writer, object value)\n    {\n        writer.Write(Cast(ref Unsafe.Unbox<T>(value)));\n    }\n\n    public void Write(FormatterProvider provider, IBufferWriter<byte> writer, scoped UnsafeRef value)\n    {\n        writer.Write(Cast(ref value.As<T>()));\n    }\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/Formatter/RecordFormatter.cs",
    "content": "using System.Buffers;\n\nnamespace ConsoleApp1.Formatter;\n\npublic class RecordFormatter(Type type, RecordMemberInfo[] members) : IFormatter\n{\n    public Type Type => type;\n\n    public object Read(FormatterProvider provider, ref SequenceReader<byte> reader)\n    {\n        var value = Activator.CreateInstance(Type);\n        foreach (var m in members)\n        {\n            m.Setter(value, provider.GetFormatter(m.Type).Read(provider, ref reader));\n        }\n        return value;\n    }\n\n    public void Read(FormatterProvider provider, ref SequenceReader<byte> reader, scoped UnsafeRef value)\n    {\n        if (!type.IsValueType && value.As<object?>() == null)\n        {\n            value.As<object?>() = Activator.CreateInstance(Type);\n        }\n\n        foreach (var m in members)\n        {\n            provider.GetFormatter(m.Type).Read(provider, ref reader, m.RefGetter(value));\n        }\n    }\n\n    public void Write(FormatterProvider provider, IBufferWriter<byte> writer, object value)\n    {\n        foreach (var m in members)\n        {\n            provider.GetFormatter(m.Type).Write(provider, writer, m.Getter(value));\n        }\n    }\n\n    public void Write(FormatterProvider provider, IBufferWriter<byte> writer, scoped UnsafeRef value)\n    {\n        foreach (var m in members)\n        {\n            provider.GetFormatter(m.Type).Write(provider, writer, m.RefGetter(value));\n        }\n    }\n}\n\npublic readonly struct RecordMemberInfo(Type type, Func<object, object> getter, Action<object, object> setter, Func<UnsafeRef, UnsafeRef> refGetter)\n{\n    public Type Type { get; } = type;\n\n    // via object\n    public Func<object, object> Getter { get; } = getter;\n    public Action<object, object> Setter { get; } = setter;\n\n    // via UnsafeRef\n    public Func<UnsafeRef, UnsafeRef> RefGetter { get; } = refGetter;\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/ITupleAccessor.cs",
    "content": "﻿namespace ConsoleApp1;\n\npublic interface ITupleAccessor\n{\n    int Length { get; }\n    TypedRef this[int index] { get; }\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/Program.cs",
    "content": "using BenchmarkDotNet.Attributes;\nusing ConsoleApp1;\nusing ConsoleApp1.Example;\nusing ConsoleApp1.Formatter;\nusing System.Buffers;\n\n#if DEBUG\n\nvar b = new FormatterBenchmark();\nb.Setup();\n\n//for (int n = 0; n < 10000; n++)\n{\n    var x = b.ViaObject();\n    var y = b.ViaUnsafeRef();\n    AssertEqual(x, y);\n}\n\nstatic void AssertEqual(Line[] x, Line[] y)\n{\n    System.Diagnostics.Debug.Assert(x.Length == y.Length);\n    for (int i = 0; i < x.Length; i++)\n    {\n        System.Diagnostics.Debug.Assert(x[i].Start.X == y[i].Start.X);\n        System.Diagnostics.Debug.Assert(x[i].Start.Y == y[i].Start.Y);\n        System.Diagnostics.Debug.Assert(x[i].End.X == y[i].End.X);\n        System.Diagnostics.Debug.Assert(x[i].End.Y == y[i].End.Y);\n    }\n}\n\n#else\nBenchmarkDotNet.Running.BenchmarkRunner.Run<FormatterBenchmark>();\n#endif\n\n[MemoryDiagnoser]\npublic class FormatterBenchmark\n{\n    private const int N = 1000;\n\n    private Line[]? _data;\n    private ArrayBufferWriter<byte>? _writer;\n    private FormatterProvider _provider;\n\n    [GlobalSetup]\n    public void Setup()\n    {\n        var data = _data = new Line[N];\n        for (int i = 0; i < data.Length; i++)\n        {\n            data[i] = new(new(3 * i, 5 * i), new(7 * i, 2 * i));\n        }\n\n        _writer = new(N * sizeof(int) * 4 + sizeof(int));\n\n        var provider = _provider = new();\n        provider.Add(Line.Formetter);\n        provider.Add(Point.Formetter);\n        _ = provider.GetFormatter(typeof(int));\n    }\n\n    [Benchmark]\n    public Line[] ViaObject()\n    {\n        var writer = _writer;\n        writer.Clear();\n        var provider = _provider;\n        var formatter = provider.GetFormatter(typeof(Line[]));\n\n        formatter.Write(provider, writer, _data);\n        var serialized = writer.WrittenMemory;\n\n        var reader = new SequenceReader<byte>(new(serialized));\n        var deserialized = (Line[])formatter.Read(provider, ref reader);\n\n        return deserialized;\n    }\n\n\n    [Benchmark]\n    public Line[] ViaUnsafeRef()\n    {\n        var writer = _writer;\n        var provider = _provider;\n        var formatter = provider.GetFormatter(typeof(Line[]));\n\n        formatter.Write(provider, writer, UnsafeRef.Create(ref _data));\n        var serialized = writer.WrittenMemory;\n\n        var reader = new SequenceReader<byte>(new(serialized));\n        Line[] deserialized = null!;\n        formatter.Read(provider, ref reader, UnsafeRef.Create(ref deserialized));\n\n        return deserialized;\n    }\n}"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/TupleAccessor2.cs",
    "content": "﻿namespace ConsoleApp1;\n\npublic readonly ref struct TupleAccessor<T1, T2>(ref (T1, T2) tuple) : ITupleAccessor\n{\n    private readonly ref (T1, T2) _tuple = ref tuple;\n    public readonly int Length => 2;\n    public TypedRef this[int index] => index switch\n    {\n        0 => TypedRef.Create(ref _tuple.Item1),\n        1 => TypedRef.Create(ref _tuple.Item2),\n        _ => throw new IndexOutOfRangeException(),\n    };\n}\n\npartial class Accessor\n{\n    public static TupleAccessor<T1, T2> Create<T1, T2>(ref this (T1, T2) tuple) => new(ref tuple);\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/TupleAccessor3.cs",
    "content": "﻿namespace ConsoleApp1;\n\npublic readonly ref struct TupleAccessor<T1, T2, T3>(ref (T1, T2, T3) tuple) : ITupleAccessor\n{\n    private readonly ref (T1, T2, T3) _tuple = ref tuple;\n    public readonly int Length => 3;\n    public TypedRef this[int index] => index switch\n    {\n        0 => TypedRef.Create(ref _tuple.Item1),\n        1 => TypedRef.Create(ref _tuple.Item2),\n        2 => TypedRef.Create(ref _tuple.Item3),\n        _ => throw new IndexOutOfRangeException(),\n    };\n}\n\npartial class Accessor\n{\n    public static TupleAccessor<T1, T2, T3> Create<T1, T2, T3>(ref this (T1, T2, T3) tuple) => new(ref tuple);\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/TupleEnumerator.cs",
    "content": "﻿namespace ConsoleApp1;\n\npublic ref struct TupleEnumerator<TAccessor>(TAccessor tuple)\n    where TAccessor : struct, ITupleAccessor, allows ref struct\n{\n    private TAccessor _tuple = tuple;\n    private int _index = -1;\n\n    public bool MoveNext()\n    {\n        return ++_index < _tuple.Length;\n    }\n    public TypedRef Current => _tuple[_index];\n}\n\npublic static partial class Accessor\n{\n    public static TupleEnumerator<TAccessor> GetEnumerator<TAccessor>(this TAccessor tuple)\n       where TAccessor : struct, ITupleAccessor, allows ref struct\n        => new(tuple);\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/TypedRef.cs",
    "content": "﻿using System.Runtime.CompilerServices;\n\nnamespace ConsoleApp1;\n\n/// <summary>\n/// 型情報 + ref。\n/// </summary>\n/// <remarks>\n/// object だと値型の処理が悲惨なので ref で untyped にやり取りするための型を用意。\n///\n/// 中身、<see cref=\"TypedReference\"/> とほぼ一緒。\n/// ただ、そっちは ref field 実装前からあるせいで相当特別な制限かかってて使いづらい。\n///\n/// 名前一緒だと混乱しそうなのであえて省略形。\n/// </remarks>\npublic readonly ref struct TypedRef(Type type, ref byte r)\n{\n    public readonly Type Type = type;\n    public readonly UnsafeRef UnsafeReference = new(ref r);\n\n    public static TypedRef Create<T>(ref T value)\n    {\n        return new TypedRef(typeof(T), ref Unsafe.As<T, byte>(ref value));\n    }\n\n    public ref T As<T>()\n    {\n        if (typeof(T) != Type) ThrowTypeNotMatched();\n        return ref UnsafeReference.As<T>();\n    }\n\n    public void Set<T>(T value)\n    {\n        if (!typeof(T).IsAssignableTo(Type)) ThrowTypeNotMatched();\n        UnsafeReference.As<T>() = value;\n    }\n\n    public T Get<T>()\n    {\n        if (!typeof(T).IsAssignableFrom(Type)) ThrowTypeNotMatched();\n        return UnsafeReference.As<T>();\n    }\n\n    private void ThrowTypeNotMatched() => throw new InvalidCastException();\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/ConsoleApp1/UnsafeRef.cs",
    "content": "using System.Runtime.CompilerServices;\n\nnamespace ConsoleApp1;\n\n/// <summary>\n/// ref。\n/// </summary>\n/// <remarks>\n/// Unsafe.As&lt;T, byte&gt; で ref byte 化して参照を持つ。\n/// ほぼ managed ポインター。\n/// ref byte 直伝搬よりはマシ、程度。\n/// </remarks>\npublic readonly ref struct UnsafeRef(ref byte r)\n{\n    public readonly ref byte UnsafeReference = ref r;\n\n    public ref T As<T>()\n    {\n        return ref Unsafe.As<byte, T>(ref UnsafeReference);\n    }\n\n    public static UnsafeRef Create<T>(ref T value)\n    {\n        return new UnsafeRef(ref Unsafe.As<T, byte>(ref value));\n    }\n}\n"
  },
  {
    "path": "Demo/2025/RefReflection/RefReflection.slnx",
    "content": "<Solution>\n  <Project Path=\"ConsoleApp1/ConsoleApp1.csproj\" />\n</Solution>\n"
  },
  {
    "path": "Demo/2025/StringInDataSection/DataSectionAscii/Class1.cs",
    "content": "namespace DataSectionAscii;\n\npublic class Class1\n{\n    public static void M()\n    {\n        Console.WriteLine(\n            \"\"\"\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n\"\"\");\n    }\n}\n"
  },
  {
    "path": "Demo/2025/StringInDataSection/DataSectionAscii/DataSectionAscii.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n    <Features>$(Features);experimental-data-section-string-literals=0</Features>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/StringInDataSection/DataSectionJapanese/Class1.cs",
    "content": "namespace DataSectionJapanese;\n\npublic class Class1\n{\n    public static void M()\n    {\n        Console.WriteLine(\n            \"\"\"\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\n\"\"\");\n    }\n}\n"
  },
  {
    "path": "Demo/2025/StringInDataSection/DataSectionJapanese/DataSectionJapanese.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n    <Features>$(Features);experimental-data-section-string-literals=0</Features>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/StringInDataSection/Directory.build.props",
    "content": "<Project>\n\n  <PropertyGroup>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n    <UseArtifactsOutput>true</UseArtifactsOutput>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/StringInDataSection/NormalAscii/Class1.cs",
    "content": "namespace NormalAscii;\n\npublic class Class1\n{\n    public static void M()\n    {\n        Console.WriteLine(\n            \"\"\"\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\n\"\"\");\n    }\n}\n"
  },
  {
    "path": "Demo/2025/StringInDataSection/NormalAscii/NormalAscii.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/StringInDataSection/NormalJapanese/Class1.cs",
    "content": "namespace NormalJapanese;\n\npublic class Class1\n{\n    public static void M()\n    {\n        Console.WriteLine(\n            \"\"\"\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\nあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをん\n\"\"\");\n    }\n}\n"
  },
  {
    "path": "Demo/2025/StringInDataSection/NormalJapanese/NormalJapanese.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0</TargetFramework>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2025/StringInDataSection/StringInDataSection.slnx",
    "content": "<Solution>\n  <Folder Name=\"/.solution items/\">\n    <File Path=\"Directory.build.props\" />\n  </Folder>\n  <Project Path=\"DataSectionAscii/DataSectionAscii.csproj\" />\n  <Project Path=\"DataSectionJapanese/DataSectionJapanese.csproj\" />\n  <Project Path=\"NormalAscii/NormalAscii.csproj\" />\n  <Project Path=\"NormalJapanese/NormalJapanese.csproj\" />\n</Solution>\n"
  },
  {
    "path": "Demo/2025/StringInDataSection/readme.md",
    "content": "\n[String literals in data section](https://github.com/dotnet/roslyn/blob/main/docs/features/string-literals-data-section.md) を試してみる。\n\nNormalAscii, NormalJapanese, DataSectionAscii, DataSectionJapanese の4つのプロジェクトがあって、\n全部「長い文字列を `Console.WriteLine` してるだけ」のプログラム。\nビルド オプションと文字列の内容が違うだけで、以下の内容。\n\n* ビルド オプション\n  * Normal: オプション未指定\n  * DataSection: `experimental-data-section-string-literals=0` 指定あり\n* 文字列リテラル\n  * Ascii: ASCII 文字のみ\n  * Japanexe: ひらがな(+ 改行文字)のみ\n\n(補足: UTF-8 だと、ASCII は半分になるものの、日本語とかは1.5倍になる。)\n\nリリースビルド時の DLL サイズ:\n\n| DLL | サイズ |\n| --- | --- |\n| NormalAscii.dll | 68,608  |\n| DataSectionAscii.dll | 36,864 |\n| NormalJapanese.dll | 53,248 |\n| DataSectionJapanese.dll | 75,776  |\n"
  },
  {
    "path": "Demo/2026/DependencyPropertyGenerator/ClassLibrary1/Class1.cs",
    "content": "using System.Windows;\n\nnamespace ClassLibrary1;\n\npublic partial class Class1 : DependencyObject\n{\n    [DependencyPropertyGenerator.DependencyProperty]\n    public partial int P { get; set; }\n}\n"
  },
  {
    "path": "Demo/2026/DependencyPropertyGenerator/ClassLibrary1/ClassLibrary1.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net10.0-windows</TargetFramework>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n    <UseWPF>true</UseWPF>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Generator\\Generator.csproj\">\n      <OutputItemType>Analyzer</OutputItemType>\n      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>\n    </ProjectReference>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2026/DependencyPropertyGenerator/ClassLibrary1.slnx",
    "content": "<Solution>\n  <Project Path=\"ClassLibrary1/ClassLibrary1.csproj\" />\n  <Project Path=\"Generator.UnitTests/Generator.UnitTests.csproj\" />\n  <Project Path=\"Generator/Generator.csproj\" />\n</Solution>\n"
  },
  {
    "path": "Demo/2026/DependencyPropertyGenerator/Generator/DependencyPropertyGenerator.cs",
    "content": "using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\n\nnamespace Generator;\n\n[Generator]\npublic class DependencyPropertyGenerator : IIncrementalGenerator\n{\n    public void Initialize(IncrementalGeneratorInitializationContext context)\n    {\n        context.RegisterPostInitializationOutput(ctx => ctx.AddSource(\n            \"DependencyPropertyAttribute.g.cs\",\n            /* lang=C# */\n            \"\"\"\n            using System;\n\n            namespace DependencyPropertyGenerator;\n\n            [AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]\n            public class DependencyPropertyAttribute : Attribute\n            {\n            }\n            \"\"\"));\n\n        var propertyDeclarations = context.SyntaxProvider.ForAttributeWithMetadataName(\n            \"DependencyPropertyGenerator.DependencyPropertyAttribute\",\n            (node, _) => IsPartialProperty(node),\n            (context, _) => GetSemanticTargetForGeneration(context));\n\n        context.RegisterSourceOutput(propertyDeclarations, static (spc, source) => Execute(source, spc));\n    }\n\n    private static bool IsPartialProperty(SyntaxNode node)\n    {\n        return node is PropertyDeclarationSyntax propertyDeclaration &&\n               propertyDeclaration.Modifiers.Any(SyntaxKind.PartialKeyword);\n    }\n\n    private static PropertyInfo GetSemanticTargetForGeneration(GeneratorAttributeSyntaxContext context)\n    {\n        var p = (PropertyDeclarationSyntax)context.TargetNode;\n        var t = context.SemanticModel.GetTypeInfo(p.Type).Type!;\n        var ct = context.SemanticModel.GetDeclaredSymbol(p)!.ContainingType;\n\n        var pi = new PropertyInfo(\n            p.Identifier.Text,\n            t.ContainingNamespace + \".\" + t.Name,\n            ct.Name,\n            ct.ContainingNamespace.Name);\n\n        return pi;\n    }\n\n    private static void Execute(PropertyInfo? propertyInfo, SourceProductionContext context)\n    {\n        if (propertyInfo is null)\n            return;\n\n        var source = GenerateSource(propertyInfo);\n        context.AddSource($\"{propertyInfo.ClassName}.{propertyInfo.PropertyName}.g.cs\", source);\n    }\n\n    private static string GenerateSource(PropertyInfo propertyInfo)\n    {\n        var (propertyName, propertyType, className, namespaceName) = propertyInfo;\n\n        var namespaceDeclaration = string.IsNullOrEmpty(namespaceName)\n            ? string.Empty\n            : $\"\"\"\n            namespace {namespaceName};\n\n\n            \"\"\";\n\n        return $$\"\"\"\n            using System.Windows;\n\n            {{namespaceDeclaration}}partial class {{className}}\n            {\n                public static readonly DependencyProperty {{propertyName}}Property =\n                    DependencyProperty.Register(\n                        nameof({{propertyName}}),\n                        typeof({{propertyType}}),\n                        typeof({{className}}),\n                        new PropertyMetadata(default({{propertyType}})));\n\n                public partial {{propertyType}} {{propertyName}}\n                {\n                    get => ({{propertyType}})GetValue({{propertyName}}Property);\n                    set => SetValue({{propertyName}}Property, value);\n                }\n            }\n            \"\"\";\n    }\n\n    private record PropertyInfo(\n        string PropertyName,\n        string PropertyType,\n        string ClassName,\n        string Namespace);\n}\n"
  },
  {
    "path": "Demo/2026/DependencyPropertyGenerator/Generator/Generator.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netstandard2.0</TargetFramework>\n    <Nullable>enable</Nullable>\n    <LangVersion>14</LangVersion>\n    <EnforceExtendedAnalyzerRules>true</EnforceExtendedAnalyzerRules>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.CodeAnalysis.CSharp\" Version=\"5.0.0\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/2026/DependencyPropertyGenerator/Generator/PolyFill.cs",
    "content": "namespace System.Runtime.CompilerServices\n{\n    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface | AttributeTargets.Enum | AttributeTargets.Delegate, Inherited = false)]\n    internal sealed class IsExternalInit : Attribute\n    {\n    }\n}\n"
  },
  {
    "path": "Demo/2026/DependencyPropertyGenerator/Generator.UnitTests/DependencyPropertyGenerator.cs",
    "content": "using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing System.Diagnostics.CodeAnalysis;\nusing System.Runtime.InteropServices;\nusing Xunit;\n\nnamespace Generator.UnitTests;\n\npublic class DependencyPropertyGeneratorTests\n{\n    [Fact]\n    public void X()\n    {\n        RunGenerator(\"\"\"\n            class C\n            {\n                [DependencyPropertyGenerator.DependencyProperty]\n                public partial int P { get; set; }\n            }\n            \"\"\",\n            \"C.P\",\n            \"\"\"\n            using System.Windows;\n\n            partial class C\n            {\n                public static readonly DependencyProperty PProperty =\n                    DependencyProperty.Register(\n                        nameof(P),\n                        typeof(System.Int32),\n                        typeof(C),\n                        new PropertyMetadata(default(System.Int32)));\n\n                public partial System.Int32 P\n                {\n                    get => (System.Int32)GetValue(PProperty);\n                    set => SetValue(PProperty, value);\n                }\n            }\n            \"\"\");\n    }\n\n    private static void RunGenerator(\n        [StringSyntax(\"C#\")] string targetSource,\n        string fileName,\n        [StringSyntax(\"C#\")] string generatedSource)\n    {\n        var parseOptions = new CSharpParseOptions(LanguageVersion.Latest);\n        var driver = CSharpGeneratorDriver.Create(new DependencyPropertyGenerator()).WithUpdatedParseOptions(parseOptions);\n\n        var compilation = CSharpCompilation.Create(\"GeneratorTest\",\n            references: [MetadataReference.CreateFromFile(typeof(object).Assembly.Location)],\n            options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));\n\n        compilation = compilation.AddSyntaxTrees(CSharpSyntaxTree.ParseText(targetSource, parseOptions));\n\n        driver.RunGeneratorsAndUpdateCompilation(compilation, out var newCompilation, out var diagnostics);\n\n        foreach (var t in newCompilation.SyntaxTrees)\n        {\n            if (t.FilePath.EndsWith(fileName + \".g.cs\"))\n            {\n                var s = t.GetText().ToString();\n                Assert.Equal(generatedSource, s);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/2026/DependencyPropertyGenerator/Generator.UnitTests/Generator.UnitTests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <Nullable>enable</Nullable>\n    <TargetFramework>net9.0</TargetFramework>\n    <IsTestProject>true</IsTestProject>\n    <IsPackable>false</IsPackable>\n    <LangVersion>latest</LangVersion>\n    <DisableTransitiveProjectReferences>false</DisableTransitiveProjectReferences>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Generator\\Generator.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"18.0.1\" />\n    <PackageReference Include=\"xunit\" Version=\"2.9.3\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" Version=\"3.1.5\">\n      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/App.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\"/>\n    </startup>\n</configuration>\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp5/IndexInitializerSample.cs",
    "content": "﻿namespace Csharp6.Csharp5.IndexInitializer\n{\n    using System.Collections.Generic;\n\n    class Program\n    {\n        static void Main()\n        {\n            var dic = new Dictionary<string, int>();\n            dic[\"one\"] = 1;\n            dic[\"two\"] = 2;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp5/NameOfSample.cs",
    "content": "﻿using System;\n\nnamespace Csharp6.Csharp5.NameOf\n{\n    class MyClass\n    {\n        public int MyProperty => myField;\n        private int myField = 10;\n\n        public void MyMethod()\n        {\n            var myLocal = 10;\n            Console.WriteLine(\"MyClass\");\n            Console.WriteLine(\"MyProperty = \" + MyProperty);\n            Console.WriteLine(\"myField = \" + myField);\n            Console.WriteLine(\"MyMethod\");\n            Console.WriteLine(\"myLocal = \" + myLocal);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp5/NullConditional.cs",
    "content": "﻿using System;\n\nnamespace Csharp6.Csharp5\n{\n    class NullConditionalSample\n    {\n        public string Name { get; set; }\n\n        public static int? X(NullConditionalSample s)\n        {\n            if (s == null) return null;\n            var name = s.Name;\n            if (name == null) return null;\n            return name.Length;\n        }\n\n        static char? X(string s, int i)\n        {\n            if (s == null) return null;\n            return s[i];\n        }\n\n        static T Y<T>(Func<T> f)\n            where T : class\n        {\n            if (f == null) return null;\n            return f.Invoke();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp5/Point.cs",
    "content": "﻿namespace Csharp6.Csharp5\n{\n    /// <summary>\n    /// (X, Y) なクラス。X も Y も immutable に作りたい。\n    /// その場合、結構煩雑な定型文になってしまう…\n    /// </summary>\n    public class Point\n    {\n        private readonly int _x; // ←ここと\n        private readonly int _y;\n\n        public Point(int x, int y) // ←ここと\n        {\n            _x = x; // ←ここと\n            _y = y;\n        }\n\n        public int X { get { return _x; } } // ←ここ、何回 x 書けばいいんだよ！\n        public int Y { get { return _y; } }\n\n        public int InnerProduct(Point p)\n        {\n            return X * p.X + Y * p.Y;\n        }\n        public static Point operator -(Point p)\n        {\n            return new Point(-p.X, -p.Y);\n        }\n\n        public override string ToString()\n        {\n            return string.Format(\"({0}, {1})\", X, Y);\n        }\n    }\n\n    namespace PropertyInitializerWithoutAutoProperty\n    {\n        class Point\n        {\n            // ↓この初期値を設定するためだけに自動実装をやめることに\n            private int _x = 10;\n\n            public int X\n            {\n                get { return _x; }\n                set { _x = value; }\n            }\n\n            private int _y = 20;\n\n            public int Y\n            {\n                get { return _y; }\n                set { _y = value; }\n            }\n        }\n    }\n\n    namespace PropertyInitializerWithConstructor\n    {\n        class Point\n        {\n            public int X { get; set; }\n            public int Y { get; set; }\n\n            public Point()\n            {\n                // ↓この初期値を設定するためだけにコンストラクターが必要\n                X = 10;\n                Y = 20;\n            }\n        }\n    }\n\n    namespace GetOnlyWithoutAutoProperty\n    {\n        class Point\n        {\n            // ↓getのみの自動実装はできないので仕方なくフィールドを用意\n            private readonly int _x = 10;\n            public int X { get { return _x; } }\n\n            private readonly int _y = 20;\n            public int Y { get { return _y; } }\n        }\n    }\n\n    namespace GetOnlyWithConstructor\n    {\n        class Point\n        {\n            // ↓setをprivateにすることで外からは書き替えれないように\n            public int X { get; private set; }\n            public int Y { get; private set; }\n\n            public Point()\n            {\n                X = 10;\n                Y = 20;\n            }\n        }\n    }\n\n    namespace ExpressionBodiedFunction\n    {\n        public class Point\n        {\n            public int X { get; set; }\n            public int Y { get; set; }\n            public Point(int x = 0, int y = 0) { X = x; Y = y; }\n\n            public int InnerProduct(Point p)\n            {\n                return X * p.X + Y * p.Y;\n            }\n            public static Point operator -(Point p)\n            {\n                return new Point(-p.X, -p.Y);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp5/PointJson.cs",
    "content": "﻿using Newtonsoft.Json.Linq;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Csharp6.Csharp5\n{\n    static class PointJson\n    {\n        // 「return 式1個だけ;」なメソッド\n        // ラムダ式の場合は「() => 式;」みたいに { return } を省略できるのに…\n        public static JArray ToJson(IEnumerable<Point> points)\n        {\n            return new JArray(\n                from p in points\n                where p != null\n                select new JObject\n                {\n                    { \"x\", p.X },\n                    { \"y\", p.Y },\n                });\n        }\n\n        public static IEnumerable<Point> FromJson(JArray array)\n        {\n            foreach (var json in array)\n            {\n                if (json == null) continue;\n\n                int x, y;\n                if (TryGetInt(json[\"x\"], out x)\n                    && TryGetInt(json[\"y\"], out y))\n                {\n                    yield return new Point(x, y);\n                }\n            }\n        }\n\n        private static bool TryGetInt(JToken json, out int value)\n        {\n            var x = json as JValue;\n            var isInt = x != null && x.Type == JTokenType.Integer;\n            value = isInt ? x.ToObject<int>() : 0;\n            return isInt;\n        }\n\n        public static string ArrayToString(this IEnumerable<Point> points)\n        {\n            return \"[\" + string.Join(\", \", points) + \"]\";\n        }\n\n        public static IEnumerable<Point> ParseArray(string json)\n        {\n            return FromJson(JArray.Parse(json));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp5/Polygon.cs",
    "content": "﻿namespace Csharp6.Csharp5\n{\n    public class Polygon\n    {\n        private Point[] _vertexes;\n\n        public int Count\n        {\n            get\n            {\n                return _vertexes.Length;\n            }\n        }\n        public Point this[int i]\n        {\n            get\n            {\n                return _vertexes[i];\n            }\n        }\n\n        public Polygon(params Point[] vertexes) { _vertexes = vertexes; }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp5/Program.cs",
    "content": "﻿namespace Csharp6.Csharp5\n{\n    using System;\n    using System.Collections.Generic;\n\n    class Program\n    {\n        static void Main()\n        {\n            var points = new List<Point>\n            {\n                // C# 3.0 のコレクション初期化子\n                // List.Add(Point) が呼ばれてる\n                // 1行1行 new Point を書くのがめんどいことがある\n                new Point(3, 4),\n                new Point(-1, 0),\n                new Point(5, -2),\n                new Point(7, 6),\n                new Point(0, 0)\n            };\n\n            // Console. やら PointJson. やら、横に間延びしがち\n            Console.WriteLine(points.ArrayToString());\n            var json = PointJson.ToJson(points).ToString();\n            Console.WriteLine(json);\n            Console.WriteLine(PointJson.ParseArray(json).ArrayToString());\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp5/StaticUsingSample.cs",
    "content": "﻿namespace Csharp6.Csharp5.StaticUsing\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            var pi = 2 * Math.Asin(1);\n            Console.WriteLine(Math.PI == pi);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp5/StringInterpolationSample.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace Csharp6.Csharp5\n{\n    class StringInterpolationSample\n    {\n        void X(int x, int y)\n        {\n            var formatted = string.Format(\"({0}, {1})\", x, y);\n        }\n\n        static void Y()\n        {\n            IEnumerable<string> Cultures = new[] { \"en-us\", \"fr\", \"zh-hk\", \"ja-jp\" };\n\n            var x = 10;\n\n            IFormattable f = System.Runtime.CompilerServices.FormattableStringFactory.Create(\"{0:c}, {1:n}\", x, x);\n\n            foreach (var c in Cultures)\n            {\n                Console.WriteLine(f.ToString(null, new System.Globalization.CultureInfo(c)));\n            }\n        }\n\n        void Z(int x, int y)\n        {\n            var formatted = string.Format(@\"\nverbatim (here) formattable string\n{0}, {1}\n\", x, y);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6/AwaitInCatchFinally.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Threading.Tasks;\n\nnamespace Csharp6.Csharp6\n{\n    class AwaitInCatchFinally\n    {\n        public static async Task XAsync()\n        {\n            try\n            {\n                await SomeAsyncMethod();\n            }\n            catch (InvalidOperationException e)\n            {\n                using (var s = new StreamWriter(\"error.txt\"))\n                    await s.WriteAsync(e.ToString());\n            }\n            finally\n            {\n                using (var s = new StreamWriter(\"trace.txt\"))\n                    await s.WriteAsync(\"XAsync done.\");\n            }\n        }\n\n        private static Task SomeAsyncMethod()\n        {\n            return Task.Delay(1);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6/ExceptionFilter.cs",
    "content": "﻿namespace Csharp6.Csharp6.ExceptionFilter\n{\n    using System;\n\n    class Program\n    {\n        static void Main()\n        {\n            try\n            {\n                SomeMethod(1, 2);\n            }\n            catch (ArgumentException e) when (e.ParamName == \"x\")\n            {\n                // パラメーター名が x の時だけはエラー無視\n            }\n        }\n\n        private static void SomeMethod(int x, int y)\n        {\n            if (x < 0) throw new ArgumentException(nameof(x));\n            if (y < 0) throw new ArgumentException(nameof(y));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6/ExtensionCollectionInitializer.cs",
    "content": "﻿namespace Csharp6.Csharp6.ExtensionCollectionInitializer\n{\n    using System.Collections.Generic;\n\n    class Point\n    {\n        public int X { get; set; }\n        public int Y { get; set; }\n    }\n\n    static class PointExtensions\n    {\n        public static void Add(this List<Point> list, int x, int y)\n            => list.Add(new Point { X = x, Y = y });\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var points = new List<Point>\n            {\n                // PointExtensions.Add が呼ばれる\n                { 1, 2 },\n                { 4, 6 },\n                { 0, 3 },\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6/IndexInitializerSample.cs",
    "content": "﻿namespace Csharp6.Csharp6.IndexInitializer\n{\n    using System.Collections.Generic;\n\n    class Program\n    {\n        static void Main()\n        {\n            var dic = new Dictionary<string, int>\n            {\n                [\"one\"] = 1,\n                [\"two\"] = 2,\n            };\n\n        }\n    }\n}\n\nnamespace Csharp6.Csharp5.IndexInitializer\n{\n    using System.Collections.Generic;\n\n    class Sample\n    {\n        Dictionary<string, int> dic = new Dictionary<string, int>\n        {\n            [\"one\"] = 1,\n            [\"two\"] = 2,\n        };\n\n        Dictionary<string, int> GetDic(int x, int y) => new Dictionary<string, int>\n        {\n            [\"x\"] = x,\n            [\"y\"] = y,\n        };\n    }\n}\n\nnamespace Csharp6.Csharp5.ObjectIndexInitializer\n{\n    class Sample\n    {\n        public string Name { get; set; }\n\n        public int this[string key]\n        {\n            get { return 0; }\n            set { }\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            var s = new Sample\n            {\n                Name = \"sample\",\n                [\"X\"] = 1,\n                [\"Y\"] = 2,\n            };\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6/NameOfSample.cs",
    "content": "﻿using System;\n\nnamespace Csharp6.Csharp6.NameOf\n{\n    class MyClass\n    {\n        public int MyProperty => myField;\n        private int myField = 10;\n\n        public void MyMethod()\n        {\n            var myLocal = 10;\n            Console.WriteLine(nameof(MyClass));\n            Console.WriteLine(nameof(MyProperty) + \" = \" + MyProperty);\n            Console.WriteLine(nameof(myField) + \" = \" + myField);\n            Console.WriteLine(nameof(MyMethod));\n            Console.WriteLine(nameof(myLocal) + \" = \" + myLocal);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6/NullConditional.cs",
    "content": "﻿using System;\n\nnamespace Csharp6.Csharp6\n{\n    class NullConditionalSample\n    {\n        public string Name { get; set; }\n\n        public static int? X(NullConditionalSample s) => s?.Name?.Length;\n        static char? X(string s, int i) => s?[i];\n        static T Y<T>(Func<T> f)\n            where T : class\n            => f?.Invoke();\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6/Point.cs",
    "content": "﻿namespace Csharp6.Csharp6\n{\n    /// <summary>\n    /// immutable なクラス/構造体を作るのに大変ありがたい構文が追加された。\n    /// getter-only auto-property\n    /// property initializer\n    /// </summary>\n    public class Point\n    {\n        public int X { get; } = 0;\n        public int Y { get; } = 0;\n\n        public Point(int x, int y)\n        {\n            X = x;\n            Y = y;\n        }\n\n        public int InnerProduct(Point p) => X * p.X + Y * p.Y;\n        public static Point operator -(Point p) => new Point(-p.X, -p.Y);\n\n        public override string ToString() => $\"({X}, {Y})\";\n    }\n\n    namespace PropertyInitializer\n    {\n        class Point\n        {\n            // プロパティに初期化子を付けれるようになった\n            public int X { get; set; } = 10;\n            public int Y { get; set; } = 20;\n        }\n    }\n\n    namespace GetOnly\n    {\n        class Point\n        {\n            // ↓ set; を消すだけ\n            public int X { get; } = 10;\n            public int Y { get; } = 20;\n\n        }\n    }\n\n    namespace ExpressionBodiedFunction\n    {\n        public class Point\n        {\n            public int X { get; set; }\n            public int Y { get; set; }\n            public Point(int x = 0, int y = 0) { X = x; Y = y; }\n\n            public int InnerProduct(Point p) => X * p.X + Y * p.Y;\n            public static Point operator -(Point p) => new Point(-p.X, -p.Y);\n        }\n\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6/PointJson.cs",
    "content": "﻿using Newtonsoft.Json.Linq;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Csharp6.Csharp6\n{\n    static class PointJson\n    {\n        // 式1個だけな関数(メソッド、プロパティのgetter、演算子)は、ラムダ式風の => を使った書き方ができるようになった\n        public static JArray ToJson(IEnumerable<Point> points) =>\n            new JArray(\n                from p in points\n                where p != null\n                select new JObject\n                {\n                    { \"x\", p.X },\n                    { \"y\", p.Y },\n                });\n\n        public static IEnumerable<Point> FromJson(JArray array)\n        {\n            foreach (var json in array)\n            {\n                if (json == null) continue;\n\n                int x, y;\n                if (TryGetInt(json[\"x\"], out x)\n                    && TryGetInt(json[\"y\"], out y))\n                {\n                    yield return new Point(x, y);\n    }\n}\n        }\n\n        private static bool TryGetInt(JToken json, out int value)\n        {\n            var x = json as JValue;\n            var isInt = x != null && x.Type == JTokenType.Integer;\n            value = isInt ? x.ToObject<int>() : 0;\n            return isInt;\n        }\n\n        // ラムダ式風の関数定義は、こういう短い式1個だけなメソッドで使うのがよさそう\n        public static string ArrayToString(this IEnumerable<Point> points) => \"[\" + string.Join(\", \", points) + \"]\";\n\n        public static IEnumerable<Point> ParseArray(string json) => FromJson(JArray.Parse(json));\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6/Polygon.cs",
    "content": "﻿namespace Csharp6.Csharp6\n{\n    public class Polygon\n    {\n        private Point[] _vertexes;\n\n        public int Count => _vertexes.Length;\n        public Point this[int i] => _vertexes[i];\n\n        public Polygon(params Point[] vertexes) { _vertexes = vertexes; }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6/Program.cs",
    "content": "﻿namespace Csharp6.Csharp6\n{\n    using System.Collections.Generic;\n    using static System.Console;\n    using static PointJson;\n\n    class Program\n    {\n        static void Main()\n        {\n            var points = new List<Point>\n            {\n                // List.Add を呼んでいることには変わりないのだけども\n                // C#ｖNext では拡張メソッドでも OK になった\n                // ここで実際に呼ばれているのは PointExtensions.Add(this IList<Point>, int, int)\n                { 3, 4 },\n                { -1, 0 },\n                { 5, -2 },\n                { 7, 6 },\n                { 0, 0 }\n            };\n\n            // using System.Console ってやると、その C# ファイル内では Console. を省略できる\n            // 拡張メソッド同様、実際にどこで定義されているメソッドかわかりにくくなるって問題もあるのでやたらと使いたい機能ではないけども、便利な場面も結構あるはず\n            WriteLine(points.ArrayToString());\n            var json = ToJson(points).ToString();\n            WriteLine(json);\n            WriteLine(ParseArray(json).ArrayToString());\n        }\n    }\n\n    static class PointExtensions\n    {\n        public static void Add(this IList<Point> list, int x, int y) => list.Add(new Point(x, y));\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6/StaticUsingSample.cs",
    "content": "﻿namespace Csharp6.Csharp6.StaticUsing\n{\n    using System;\n    using static System.Math;\n\n    class Program\n    {\n        static void Main()\n        {\n            var pi = 2 * Asin(1);\n            Console.WriteLine(PI == pi);\n        }\n    }\n}\n\n#if false\n// もしも、using static に「static」が必要なかったら(名前空間に対する using との区別がつかなかったら)どうなるか。\n// 実際、プレビュー版の頃の C# 6.0 では using だけ(名前空間と同じ文法)だったので問題があった。\n\nnamespace Csharp6.Csharp6.StaticUsingIf\n{\n    using System;\n    using System.Linq;\n\n    // ↑ 静的クラスの方の Linq が参照される。\n    // 本来の LINQ (System.Linq.Enumerable クラス内の拡張メソッド)は呼べなくなるわ、\n    // nameof の意味が下記の Linq クラスの nameof 静的メソッドで上書きされてしまうわ、\n    // ろくなことにならない。\n\n    public class Program\n    {\n        public static void Main()\n        {\n            var name = nameof(Main); // 下記の System.Linq クラスの nameof 静的メソッドが呼ばれる。\n            Console.WriteLine(name);\n        }\n    }\n\n    namespace System\n    {\n        public static class Linq\n        {\n            public static string nameof(Action x) => \"\";\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6/StringInterpolationSample.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace Csharp6.Csharp6\n{\n    class StringInterpolationSample\n    {\n        void X(int x, int y)\n        {\n            var formatted = $\"{x}, {y})\";\n        }\n\n        static void Y()\n        {\n            IEnumerable<string> Cultures = new[] { \"en-us\", \"fr\", \"zh-hk\", \"ja-jp\" };\n\n            var x = 10;\n\n            IFormattable f = $\"{x:c}, {x:n}\";\n\n            foreach (var c in Cultures)\n            {\n                Console.WriteLine(f.ToString(null, new System.Globalization.CultureInfo(c)));\n            }\n        }\n\n        void Z(int x, int y)\n        {\n            var formatted = $@\"\nverbatim (here) formattable string\n{x}, {y}\n\";\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Csharp6.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{CAFFF634-F058-4777-8A9B-288E3DCC5EE4}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Csharp6</RootNamespace>\n    <AssemblyName>Csharp6</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject>Csharp6.Program</StartupObject>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Newtonsoft.Json\">\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.8\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Csharp5\\IndexInitializerSample.cs\" />\n    <Compile Include=\"Csharp5\\NameOfSample.cs\" />\n    <Compile Include=\"Csharp5\\NullConditional.cs\" />\n    <Compile Include=\"Csharp5\\Point.cs\" />\n    <Compile Include=\"Csharp5\\PointJson.cs\" />\n    <Compile Include=\"Csharp5\\Polygon.cs\" />\n    <Compile Include=\"Csharp5\\Program.cs\" />\n    <Compile Include=\"Csharp5\\StaticUsingSample.cs\" />\n    <Compile Include=\"Csharp5\\StringInterpolationSample.cs\" />\n    <Compile Include=\"Csharp6\\AwaitInCatchFinally.cs\" />\n    <Compile Include=\"Csharp6\\ExceptionFilter.cs\" />\n    <Compile Include=\"Csharp6\\ExtensionCollectionInitializer.cs\" />\n    <Compile Include=\"Csharp6\\IndexInitializerSample.cs\" />\n    <Compile Include=\"Csharp6\\NameOfSample.cs\" />\n    <Compile Include=\"Csharp6\\NullConditional.cs\" />\n    <Compile Include=\"Csharp6\\Point.cs\" />\n    <Compile Include=\"Csharp6\\PointJson.cs\" />\n    <Compile Include=\"Csharp6\\Polygon.cs\" />\n    <Compile Include=\"Csharp6\\Program.cs\" />\n    <Compile Include=\"Csharp6\\StaticUsingSample.cs\" />\n    <Compile Include=\"Csharp6\\StringInterpolationSample.cs\" />\n    <Compile Include=\"Misc\\AwaitOptimization.cs\" />\n    <Compile Include=\"Misc\\SmallChanges.cs\" />\n    <Compile Include=\"Misc\\StringInterpolationSample.cs\" />\n    <Compile Include=\"Misc\\UsingStaticEnum.cs\" />\n    <Compile Include=\"Misc\\UsingStaticNormalClass.cs\" />\n    <Compile Include=\"Misc\\UsingStaticExtensions.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Misc/AwaitOptimization.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Csharp6.Misc\n{\n    class AwaitOptimization\n    {\n        public static IEnumerable<int> GetXItems()\n        {\n            var x = 10;\n            yield return x;\n\n            var y = x * x;  // x は yield を超えて使っている\n            yield return y; // y は yield を超えない\n\n            yield return x;\n        }\n\n        public static async Task XAsync()\n        {\n            var x = 10;\n            await Task.Delay(x);\n\n            var y = x * x;       // x は await を超えて使っている\n            await Task.Delay(y); // y は await を超えない\n\n            await Task.Delay(x);\n        }\n\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Misc/SmallChanges.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Csharp6.Misc\n{\n    class SmallChanges\n    {\n    }\n\n    struct Point\n    {\n        public int X { get; private set; }\n\n        public Point(int x)\n        {\n            // C# 5.0まではエラーに。\n            X = x;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Misc/StringInterpolationSample.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Csharp6.Misc\n{\n    class StringInterpolationSample\n    {\n        public void X()\n        {\n            var x = 12300;\n\n            // ほぼ同じ意味\n            Console.WriteLine(string.Format(\"{0,4:x}\", x));\n            Console.WriteLine($\"{x,4:x}\");\n\n            // 書き方を忘れて、 , と : を間違えてしまうと…\n\n            // 実行時エラー\n            Console.WriteLine(string.Format(\"{0,x}\", x));\n\n            // コンパイル エラー\n            //Console.WriteLine($\"{x,x}\");\n\n            // エスケープ\n            var p = new { X = 10, Y = 20 };\n            Console.WriteLine($\"\\\"{{{p.X}, {p.Y}}}\\\"\");\n\n            // こちらは、逐語的文字列リテラルと同じルール\n            var verbatim = $@\"\n\"\"\n{{\n{p.X}\\{p.Y}\n}}\n\"\"\n\";\n\n            {\n                var data = new[] { 1, 2, 3 };\n                var s = $\"{string.Join(\", \", data)} => {string.Join(\", \", data.Select(i => i * i))}\";\n                Console.WriteLine(s);\n            }\n            {\n                //var s1 = $\"p = {p == null ? \"null\" : p.ToString()}\"; // エラー\n                var s2 = $\"p = {(p == null ? \"null\" : p.ToString())}\"; // 1段 () でくくればOK\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Misc/UsingStaticEnum.cs",
    "content": "﻿using static Color;\n\nclass UsingStaticEnum\n{\n    public void X()\n    {\n        // enum のメンバーも using static で参照できる\n        var cyan = Blue | Green;\n        var purple = Red | Blue;\n        var yellow = Red | Green;\n    }\n}\n\nenum Color\n{\n    Red = 1,\n    Green = 2,\n    Blue = 4,\n}\n\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Misc/UsingStaticExtensions.cs",
    "content": "﻿using static System.Linq.Enumerable;\n\nclass UsingStaticExtensions\n{\n    public void X()\n    {\n        // 普通の静的メソッド\n        // Enumerable.Range が呼ばれる\n        var input = Range(0, 10);\n\n        // 拡張メソッド\n        // Enumerable.Select が呼ばれる\n        var output1 = input.Select(x => x * x);\n\n        // 拡張メソッドを普通の静的メソッドとして呼ぼうとすると\n        // コンパイル エラー\n        //var output2 = Select(input, x => x * x);\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Misc/UsingStaticNormalClass.cs",
    "content": "﻿using System.Threading.Tasks;\nusing static System.Threading.Tasks.Task;\nusing static System.TimeSpan;\n\nclass UsingStaticNormalClass\n{\n    public async Task XAsync()\n    {\n        // TimeSpan.FromSeconds\n        var sec = FromSeconds(1);\n\n        // Task.Delay\n        await Delay(sec);\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Program.cs",
    "content": "﻿namespace Csharp6\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Csharp6\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Csharp6\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"cafff634-f058-4777-8a9b-288e3dcc5ee4\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/Csharp6/Csharp6/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Newtonsoft.Json\" version=\"13.0.1\" targetFramework=\"net45\" />\n</packages>"
  },
  {
    "path": "Demo/Csharp6/Csharp6.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22512.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Csharp6\", \"Csharp6\\Csharp6.csproj\", \"{CAFFF634-F058-4777-8A9B-288E3DCC5EE4}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{CAFFF634-F058-4777-8A9B-288E3DCC5EE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CAFFF634-F058-4777-8A9B-288E3DCC5EE4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CAFFF634-F058-4777-8A9B-288E3DCC5EE4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CAFFF634-F058-4777-8A9B-288E3DCC5EE4}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/AutoProperty/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/AutoProperty/AutoProperty.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{D8364F52-F9A7-4295-8163-9EA7F1E2B37E}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>AutoProperty</RootNamespace>\n    <AssemblyName>AutoProperty</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <LangVersion>experimental</LangVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Point.cs\" />\n    <Compile Include=\"Point.GetterOnly.cs\" />\n    <Compile Include=\"Point.Intializer.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <ItemGroup />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/AutoProperty/Point.GetterOnly.cs",
    "content": "﻿namespace AutoProperty.GetterOnly\n{\n    namespace Csharp5.Field\n    {\n        class Point\n        {\n            // ↓getのみの自動実装はできないので仕方なくフィールドを用意\n            private readonly int _x = 10;\n            public int X { get { return _x; } }\n\n            private readonly int _y = 20;\n            public int Y { get { return _y; } }\n        }\n    }\n\n    namespace Csharp5.Constructor\n    {\n        class Point\n        {\n            // ↓setをprivateにすることで外からは書き替えれないように\n            public int X { get; private set; }\n            public int Y { get; private set; }\n\n            public Point()\n            {\n                X = 10;\n                Y = 20;\n            }\n        }\n    }\n\n    namespace Csharp6\n    {\n        class Point\n        {\n            // ↓ set; を消すだけ\n            public int X { get; } = 10;\n            public int Y { get; } = 20;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/AutoProperty/Point.Intializer.cs",
    "content": "﻿namespace AutoProperty.Initializer\n{\n    namespace Csharp5.Field\n    {\n        class Point\n        {\n            // ↓この初期値を設定するためだけに自動実装をやめることに\n            private int _x = 10;\n\n            public int X\n            {\n                get { return _x; }\n                set { _x = value; }\n            }\n\n            private int _y = 20;\n\n            public int Y\n            {\n                get { return _y; }\n                set { _y = value; }\n            }\n        }\n    }\n\n    namespace Csharp5.Constructor\n    {\n        class Point\n        {\n            public int X { get; set; }\n            public int Y { get; set; }\n\n            public Point()\n            {\n                // ↓この初期値を設定するためだけにコンストラクターが必要\n                X = 10;\n                Y = 20;\n            }\n        }\n    }\n\n    namespace Csharp6\n    {\n        class Point\n        {\n            public int X { get; set; } = 10;\n            public int Y { get; set; } = 20;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/AutoProperty/Point.cs",
    "content": "﻿namespace AutoProperty.Base\n{\n    namespace Csharp2\n    {\n        class Point\n        {\n            private int _x;\n\n            public int X\n            {\n                get { return _x; }\n                set { _x = value; }\n            }\n\n            private int _y;\n\n            public int Y\n            {\n                get { return _y; }\n                set { _y = value; }\n            }\n        }\n    }\n\n    namespace Csharp5\n    {\n        class Point\n        {\n            public int X { get; set; }\n            public int Y { get; set; }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/AutoProperty/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace AutoProperty\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/AutoProperty/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"AutoProperty\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"AutoProperty\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"d8364f52-f9a7-4295-8163-9ea7f1e2b37e\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/Build2014Demo/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/Build2014Demo/Build2014Demo.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{99450994-4B2D-406E-8D92-57D68A7A07C6}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Build2014Demo</RootNamespace>\n    <AssemblyName>Build2014Demo</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <LangVersion>experimental</LangVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <SpecificVersion>False</SpecificVersion>\n      <HintPath>..\\packages\\Newtonsoft.Json.6.0.5\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Csharp5\\Point.cs\" />\n    <Compile Include=\"Csharp5\\PointJson.cs\" />\n    <Compile Include=\"Csharp5\\Program.cs\" />\n    <Compile Include=\"Csharp6\\Point.cs\" />\n    <Compile Include=\"Csharp6\\PointJson.cs\" />\n    <Compile Include=\"Csharp6\\Program.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/Build2014Demo/Csharp5/Point.cs",
    "content": "﻿namespace Build2014.Csharp5\n{\n    /// <summary>\n    /// (X, Y) なクラス。X も Y も immutable に作りたい。\n    /// その場合、結構煩雑な定型文になってしまう…\n    /// </summary>\n    class Point\n    {\n        private int _x; // ←ここと\n        private int _y;\n\n        public Point(int x, int y) // ←ここと\n        {\n            _x = x; // ←ここと\n            _y = y;\n        }\n\n        public int X { get { return _x; } } // ←ここ、何回 x 書けばいいんだよ！\n        public int Y { get { return _y; } }\n\n        public override string ToString()\n        {\n            return string.Format(\"({0}, {1})\", X, Y);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/Build2014Demo/Csharp5/PointJson.cs",
    "content": "﻿using Newtonsoft.Json.Linq;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Build2014.Csharp5\n{\n    static class PointJson\n    {\n        // 「return 式1個だけ;」なメソッド\n        // ラムダ式の場合は「() => 式;」みたいに { return } を省略できるのに…\n        public static JArray ToJson(IEnumerable<Point> points)\n        {\n            return new JArray(\n                from p in points\n                where p != null\n                select new JObject\n                {\n                    { \"x\", p.X },\n                    { \"y\", p.Y },\n                });\n        }\n\n        public static IEnumerable<Point> FromJson(JArray array)\n        {\n            foreach (var json in array)\n            {\n                if (json == null) continue;\n\n                // out 引数で使うために変数宣言\n                // こいつのために、「式」にできなくなる\n                int x, y;\n                if (TryGetInt(json[\"x\"], out x)\n                    && TryGetInt(json[\"y\"], out y))\n                {\n                    yield return new Point(x, y);\n                }\n            }\n        }\n\n        private static bool TryGetInt(JToken json, out int value)\n        {\n            var x = json as JValue;\n            var isInt = x != null && x.Type == JTokenType.Integer;\n            value = isInt ? x.ToObject<int>() : 0;\n            return isInt;\n        }\n\n        public static string ArrayToString(this IEnumerable<Point> points)\n        {\n            return \"[\" + string.Join(\", \", points) + \"]\";\n        }\n\n        public static IEnumerable<Point> ParseArray(string json)\n        {\n            return FromJson(JArray.Parse(json));\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/Build2014Demo/Csharp5/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace Build2014.Csharp5\n{\n    class Program\n    {\n        public static void Run()\n        {\n            var points = new List<Point>\n            {\n                // C# 3.0 のコレクション初期化子\n                // List.Add(Point) が呼ばれてる\n                // 1行1行 new Point を書くのがめんどいことがある\n                new Point(3, 4),\n                new Point(-1, 0),\n                new Point(5, -2),\n                new Point(7, 6),\n                new Point(0, 0)\n            };\n\n            // Console. やら PointJson. やら、横に間延びしがち\n            Console.WriteLine(points.ArrayToString());\n            var json = PointJson.ToJson(points).ToString();\n            Console.WriteLine(json);\n            Console.WriteLine(PointJson.ParseArray(json).ArrayToString());\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/Build2014Demo/Csharp6/Point.cs",
    "content": "﻿namespace Build2014.Csharp6\n{\n    /// <summary>\n    /// immutable なクラス/構造体を作るのに大変ありがたい構文が追加された。\n    /// primary constructor、getter-only auto-property\n    /// </summary>\n    class Point(int x, int y) // 新しいコンストラクター構文(primary constructor)\n    {\n        public int X { get; } = x; // get だけの自動実装プロパティと、その初期値。初期値には primary constructor の引数が使える\n        public int Y { get; } = y;\n\n        public override string ToString() => string.Format(\"({0}, {1})\", X, Y);\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/Build2014Demo/Csharp6/PointJson.cs",
    "content": "﻿using Newtonsoft.Json.Linq;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Build2014.Csharp6\n{\n    static class PointJson\n    {\n        // 式1個だけな関数(メソッド、プロパティのgetter、演算子)は、ラムダ式風の => を使った書き方ができるようになった\n        public static JArray ToJson(IEnumerable<Point> points) =>\n            new JArray(\n                from p in points\n                where p != null\n                select new JObject\n                {\n                    { \"x\", p.X },\n                    { \"y\", p.Y },\n                });\n\n        // 宣言式のおかげで out 引数を使う場合でも式1個で書けたりする\n        // この例はさすがにちょっとやりすぎかも。普通に yield return 使う方が読みやすい\n        public static IEnumerable<Point> FromJson(JArray array) =>\n            from json in array\n            select (TryGetInt(json[\"x\"], out var x) // 式の中で変数宣言できるように(宣言式)\n                && TryGetInt(json[\"y\"], out var y))\n                ? new Point(x, y)\n                : null\n                into p\n            where p != null\n            select p;\n\n        private static bool TryGetInt(JToken json, out int value)\n        {\n            var x = json as JValue;\n            var isInt = x != null && x.Type == JTokenType.Integer;\n            value = isInt ? x.ToObject<int>() : 0;\n            return isInt;\n        }\n\n        // ラムダ式風の関数定義は、こういう短い式1個だけなメソッドで使うのがよさそう\n        public static string ArrayToString(this IEnumerable<Point> points) => \"[\" + string.Join(\", \", points) + \"]\";\n\n        public static IEnumerable<Point> ParseArray(string json) => FromJson(JArray.Parse(json));\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/Build2014Demo/Csharp6/Program.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Console;\nusing Build2014.Csharp6.PointJson;\n\nnamespace Build2014.Csharp6\n{\n    class Program\n    {\n        public static void Run()\n        {\n            var points = new List<Point>\n            {\n                // List.Add を呼んでいることには変わりないのだけども\n                // C#ｖNext では拡張メソッドでも OK になった\n                // ここで実際に呼ばれているのは PointExtensions.Add(this IList<Point>, int, int)\n                { 3, 4 },\n                { -1, 0 },\n                { 5, -2 },\n                { 7, 6 },\n                { 0, 0 }\n            };\n\n            // using System.Console ってやると、その C# ファイル内では Console. を省略できる\n            // 拡張メソッド同様、実際にどこで定義されているメソッドかわかりにくくなるって問題もあるのでやたらと使いたい機能ではないけども、便利な場面も結構あるはず\n            WriteLine(points.ArrayToString());\n            var json = ToJson(points).ToString();\n            WriteLine(json);\n            WriteLine(ParseArray(json).ArrayToString());\n        }\n    }\n\n    static class PointExtensions\n    {\n        public static void Add(this IList<Point> list, int x, int y) => list.Add(new Point(x, y));\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/Build2014Demo/Program.cs",
    "content": "﻿namespace Build2014\n{\n    /// <summary>\n    /// //build/ 2014 でのデモをベースにした C# vNext のサンプル。\n    /// 主に、getter-only auto-property、primary constructor、expression bodied function、using static、declaration expressions などのデモ。\n    /// \"C# 6.0\" となる前のプレビュー状態で、バージョンアップのたびに少しずつ仕様追加・変更があって、そのたび追従して修正。\n    ///\n    /// //build/ のデモではセッションの最中に C# 5.0 の状態のコードを書き替えて新機能紹介していたけども、\n    /// このプロジェクトでは書き替えの前後の両方のコードを書いてある。\n    /// Csharp5 フォルダー/名前空間以下が C# 5.0 のコード。\n    /// Csharp6 フォルダー/名前空間以下が C# 6.0(予定) のコード。\n    /// </summary>\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            Csharp5.Program.Run();\n            Csharp6.Program.Run();\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/Build2014Demo/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Build2014Demo\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Build2014Demo\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"99450994-4b2d-406e-8d92-57d68a7a07c6\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/Csharp6.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22512.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Build2014Demo\", \"Build2014Demo\\Build2014Demo.csproj\", \"{99450994-4B2D-406E-8D92-57D68A7A07C6}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"AutoProperty\", \"AutoProperty\\AutoProperty.csproj\", \"{D8364F52-F9A7-4295-8163-9EA7F1E2B37E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"PrimaryConstructor\", \"PrimaryConstructor\\PrimaryConstructor.csproj\", \"{FA3D11E4-7DFE-4298-9589-D9DAFDCCBB9A}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{09309FA3-F9B2-4056-BD81-4E751564D0C9}\"\n\tProjectSection(SolutionItems) = preProject\n\t\treadme.txt = readme.txt\n\tEndProjectSection\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{99450994-4B2D-406E-8D92-57D68A7A07C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{99450994-4B2D-406E-8D92-57D68A7A07C6}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{99450994-4B2D-406E-8D92-57D68A7A07C6}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{99450994-4B2D-406E-8D92-57D68A7A07C6}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D8364F52-F9A7-4295-8163-9EA7F1E2B37E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D8364F52-F9A7-4295-8163-9EA7F1E2B37E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D8364F52-F9A7-4295-8163-9EA7F1E2B37E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D8364F52-F9A7-4295-8163-9EA7F1E2B37E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FA3D11E4-7DFE-4298-9589-D9DAFDCCBB9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FA3D11E4-7DFE-4298-9589-D9DAFDCCBB9A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FA3D11E4-7DFE-4298-9589-D9DAFDCCBB9A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FA3D11E4-7DFE-4298-9589-D9DAFDCCBB9A}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/PrimaryConstructor/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/PrimaryConstructor/FirstQuadrant.cs",
    "content": "﻿using System;\n\nnamespace PrimaryConstructor\n{\n    namespace Csharp5\n    {\n        /// <summary>\n        /// 第1象限 = x, y ともに正の領域\n        /// </summary>\n        class FirstQuadrant\n        {\n            public int X { get; private set; }\n            public int Y { get; private set; }\n\n            public FirstQuadrant(int x, int y)\n            {\n                if (x < 0) throw new ArgumentException(\"x must be positive.\");\n                if (y < 0) throw new ArgumentException(\"y must be positive.\");\n\n                X = x;\n                Y = y;\n            }\n        }\n    }\n\n    namespace Csharp6\n    {\n        class FirstQuadrant(int x, int y)\n        {\n            {\n                if (x < 0) throw new ArgumentException(nameof(x) + \"must be positive.\");\n                if (y < 0) throw new ArgumentException(nameof(y) + \"must be positive.\");\n            }\n\n            public int X { get; } = x;\n            public int Y { get; } = y;\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/PrimaryConstructor/Point.GetterOnly.cs",
    "content": "﻿namespace AutoProperty.GetterOnly\n{\n    namespace Csharp3\n    {\n        class Point\n        {\n            private readonly int _x; // ←ここと\n            public int X { get { return _x; } } // ←ここと\n\n            private readonly int _y;\n            public int Y { get { return _y; } }\n\n            public Point(int x, int y) // ←ここと\n            {\n                _x = x; // ←ここ、何か所に x と書けばいいのか\n                _y = y;\n            }\n\n            public Point() : this(0, 0) { }\n        }\n    }\n\n    namespace Csharp6\n    {\n        class Point(int x, int y) // ←ここと\n        {\n            public int X { get; } = x; // ←ここだけ\n            public int Y { get; } = y;\n\n            public Point() : this(0, 0) { }\n\n            // ちなみに、以下のようなコードを書くとエラーになる。\n            // public Point() { }\n            // 理由は、プライマリ コンストラクターを呼んでいないから。\n            // プライマリ コンストラクターは必ず呼ばれないと行けない。\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/PrimaryConstructor/PrimaryConstructor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{FA3D11E4-7DFE-4298-9589-D9DAFDCCBB9A}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>PrimaryConstructor</RootNamespace>\n    <AssemblyName>PrimaryConstructor</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <LangVersion>experimental</LangVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"FirstQuadrant.cs\" />\n    <Compile Include=\"Point.GetterOnly.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/PrimaryConstructor/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace PrimaryConstructor\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/PrimaryConstructor/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"PrimaryConstructor\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"PrimaryConstructor\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"fa3d11e4-7dfe-4298-9589-d9dafdccbb9a\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/Csharp6/旧/Csharp6_CTP3/readme.txt",
    "content": "Visual Studio \"14\" CTP 3 炢܂ł̂́B\nPrimary Constructors  Declaration Expressions  \"C# 7.0\" sɂȂďƂA낢ύXB\n"
  },
  {
    "path": "Demo/Csharp7/201603/201603.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.25115.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApplication1\", \"ConsoleApplication1\\ConsoleApplication1.csproj\", \"{39E35FCD-0FE7-4334-A8F8-621B7A4C7D14}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{39E35FCD-0FE7-4334-A8F8-621B7A4C7D14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{39E35FCD-0FE7-4334-A8F8-621B7A4C7D14}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{39E35FCD-0FE7-4334-A8F8-621B7A4C7D14}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{39E35FCD-0FE7-4334-A8F8-621B7A4C7D14}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Demo/Csharp7/201603/ConsoleApplication1/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Demo/Csharp7/201603/ConsoleApplication1/ConsoleApplication1.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{39E35FCD-0FE7-4334-A8F8-621B7A4C7D14}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ConsoleApplication1</RootNamespace>\n    <AssemblyName>ConsoleApplication1</AssemblyName>\n    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;DEBUG;__DEMO__</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject>ConsoleApplication1.LocalFunctions.Closure</StartupObject>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"LocalFunctions\\Closure.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"RefReturns\\BasedArray.cs\" />\n    <Compile Include=\"RefReturns\\Point.cs\" />\n    <Compile Include=\"RefReturns\\RefParamsAndReturns.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Demo/Csharp7/201603/ConsoleApplication1/LocalFunctions/Closure.cs",
    "content": "﻿using System;\n\nnamespace ConsoleApplication1.LocalFunctions\n{\n    class Closure\n    {\n        static void Main()\n        {\n            LocalFunction1.F();\n            LocalFunction2.F();\n            LambdaExression1.F();\n            LambdaExression2.F();\n        }\n\n        class LocalFunction1\n        {\n            public static void F()\n            {\n                int x = 0;\n                void f(int n) => x = n;\n                f(10);\n                Console.WriteLine(x);\n            }\n        }\n\n        class LocalFunction2\n        {\n            public static void F()\n            {\n                var s = new FState { x = 0 };\n                F_f(10, ref s);\n                Console.WriteLine(s.x);\n            }\n\n            struct FState\n            {\n                public int x;\n            }\n\n            static void F_f(int n, ref FState s) => s.x = n;\n        }\n\n        class LambdaExression1\n        {\n            public static void F()\n            {\n                int x = 0;\n                Action<int> f = n => x = n;\n                f(10);\n                Console.WriteLine(x);\n            }\n        }\n\n        class LambdaExression2\n        {\n            public static void F()\n            {\n                var s = new FState { x = 0 };\n                Action<int> f = s.f;\n                f(10);\n                Console.WriteLine(s.x);\n            }\n\n            class FState\n            {\n                public int x;\n\n                public void f(int n) => x = n;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp7/201603/ConsoleApplication1/Program.cs",
    "content": "﻿using System;\n\nstruct Buffer<T>\n{\n    public int BaseIndex { get; }\n\n    private readonly T[] _array;\n\n    public Buffer(int baseIndex, int count)\n    {\n        BaseIndex = baseIndex;\n        _array = new T[count];\n    }\n\n    public ref T this[int index] => ref _array[index - BaseIndex];\n}\n\nclass Base { }\nclass A : Base { public int Value { get; set; } }\nclass B : Base { public string Name { get; set; } }\n\nclass Program\n{\n    static void Main(string[] args)\n    {\n        BinaryLiteralsDeigitSeparator();\n        RefReturnsRefLocals();\n        LocalFunctions();\n        PatternMatching(new A { Value = 1 });\n        PatternMatching(new A { Value = 2 });\n        PatternMatching(new B { Name = \"abc\" });\n    }\n\n    private static void PatternMatching(Base x)\n    {\n        if (x is A a) Console.WriteLine($\"A: {a.Value}\");\n        else if (x is B b) Console.WriteLine($\"B: {b.Name}\");\n\n        switch (x)\n        {\n            case A { Value is 1 }:\n                Console.WriteLine($\"A whose value is 1\");\n                break;\n            case A a:\n                Console.WriteLine($\"A: {a.Value}\");\n                break;\n            case B b:\n                Console.WriteLine($\"B: {b.Name}\");\n                break;\n            case *:\n                break;\n        }\n    }\n\n    private static void BinaryLiteralsDeigitSeparator()\n    {\n        var b = 0b1000_0001;\n        Console.WriteLine(b);\n    }\n\n    private static void LocalFunctions()\n    {\n        int F(int n) => n >= 1 ? n * F(n - 1) : 1;\n        Console.WriteLine(F(5));\n    }\n\n    private static void RefReturnsRefLocals()\n    {\n        var buffer = new Buffer<int>(5, 5);\n        buffer[5] = 1;\n        ref var x = ref buffer[6];\n        x = 2;\n        Console.WriteLine($\"{buffer[5]}, {buffer[6]}\");\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp7/201603/ConsoleApplication1/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ConsoleApplication1\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApplication1\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"39e35fcd-0fe7-4334-a8f8-621b7a4c7d14\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Demo/Csharp7/201603/ConsoleApplication1/RefReturns/BasedArray.cs",
    "content": "﻿namespace ConsoleApplication1.RefReturns.BasedArray\n{\n    /// <summary>\n    /// 開始インデックスを任意に指定できる配列(いわゆる non-zero based 配列)。\n    /// 参照戻り値版。\n    /// </summary>\n    /// <typeparam name=\"T\">配列の要素の型</typeparam>\n    struct RefArray<T>\n    {\n        private readonly T[] _data;\n        public int BaseIndex { get; }\n        public RefArray(int baseIndex, int capacity) { BaseIndex = baseIndex; _data = new T[capacity]; }\n\n        public ref T this[int i] => ref _data[i - BaseIndex];\n    }\n\n    /// <summary>\n    /// 開始インデックスを任意に指定できる配列(いわゆる non-zero based 配列)。\n    /// get/set版。\n    /// </summary>\n    /// <typeparam name=\"T\">配列の要素の型</typeparam>\n    struct GetSetArray<T>\n    {\n        // この3行は RefArray と一緒。\n        private readonly T[] _data;\n        public int BaseIndex { get; }\n        public GetSetArray(int baseIndex, int capacity) { BaseIndex = baseIndex; _data = new T[capacity]; }\n\n        public T this[int i]\n        {\n            get { return _data[i - BaseIndex]; }\n            set { _data[i - BaseIndex] = value; }\n        }\n    }\n\n    class Program\n    {\n        static void Main()\n        {\n            const int N = 3;\n            var a0 = new Point[N];\n            var a1 = new RefArray<Point>(0, N);\n            var a2 = new GetSetArray<Point>(0, N);\n\n            a0[0].X = 1; // OK。配列のインデクサーは実は参照になってる\n            a1[0].X = 1; // OK。配列と同列！\n\n            //a2[0].X = 1;\n\n            // ↑これだとエラー。\n            // getの戻り値(コピー品)を書き換えようとしてるので、右辺値書き換え(やっちゃダメ)になる\n            // ↓こう書かないとダメ。\n\n            var p = a2[0];\n            p.X = 1;       // X だけ(4バイト)書き換えてるように見えて\n            a2[0] = p;     // Point 全体(12バイト)の読み書きが発生\n\n            System.Console.WriteLine(a0[0]);\n            System.Console.WriteLine(a1[0]);\n            System.Console.WriteLine(a2[0]);\n        }\n    }\n}\n"
  },
  {
    "path": "Demo/Csharp7/201603/ConsoleApplication1/RefReturns/Point.cs",
    "content": "﻿namespace ConsoleApplication1.RefReturns\n{\n    public struct Point\n    {\n        public int X;\n        public int Y;\n        public int Z;\n\n        public Point(int x, int y, int z)\n        {\n            X = x;\n            Y = y;\n            Z = z;\n        }\n\n        public override string ToString() => $\"({X}, {Y}, {Z})\";\n    }\n}"
  },
  {
    "path": "Demo/Csharp7/201603/ConsoleApplication1/RefReturns/RefParamsAndReturns.cs",
    "content": "﻿namespace ConsoleApplication1.RefReturns.RefParamsAndReturns\n{\n    class Program\n    {\n        static void Main()\n        {\n            var p = new Point { X = 2, Y = 3, Z = 5 };\n            SomeAlgorithm(ref p);\n            System.Console.WriteLine($\"{p.X}, {p.Y}, {p.Z}\"); // 4, 9, 25\n        }\n\n        /// <summary>\n        /// X, Y, Z それぞれにまったく同じ処理を掛けたい場合がある。\n        /// こういう、読み書きする場所だけ違って同じ計算をする場合、参照が使えると便利だったり。\n        /// この例では X, Y, Z をそれぞれ二乗。\n        /// </summary>\n        /// <param name=\"p\">計算対象。計算結果は自己書き換え。</param>\n        static void SomeAlgorithm(ref Point p)\n        {\n            SomeAlgorithm(ref p, 0);\n            SomeAlgorithm(ref p, 1);\n            SomeAlgorithm(ref p, 2);\n        }\n\n        /// <summary>\n        /// <see cref=\"SomeAlgorithm(ref Point)\"/>の X, Y, Z を個別に計算する。\n        /// </summary>\n        /// <param name=\"p\"></param>\n        /// <param name=\"index\">Xを計算したければ0、Yなら1、Zなら2</param>\n        /// <returns></returns>\n        static void SomeAlgorithm(ref Point p, int index)\n        {\n            ref var x = ref Get(ref p, index);\n            x = x * x;\n        }\n\n        /// <summary>\n        /// <see cref=\"Point\"/>に対して、インデックス指定でX, Y, Zのいずれかへの参照を返す。\n        /// </summary>\n        /// <param name=\"p\"></param>\n        /// <param name=\"index\">0ならX、1ならY、2ならZ</param>\n        /// <returns></returns>\n        static ref int Get(ref Point p, int index)\n        {\n            switch (index)\n            {\n                default:\n                case 0: return ref p.X;\n                case 1: return ref p.Y;\n                case 2: return ref p.Z;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Directory.Build.props",
    "content": "<Project>\n\n  <PropertyGroup>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>true</ImplicitUsings>\n    <LangVersion>latest</LangVersion>\n  </PropertyGroup>\n\n</Project>"
  },
  {
    "path": "LICENSE",
    "content": "Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2014 Nobuyuki Iwanaga\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 2/CallerInfoAttributes.cs",
    "content": "﻿namespace System.Runtime.CompilerServices\n{\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n    public sealed class CallerFilePathAttribute : Attribute\n    {\n        public CallerFilePathAttribute() { }\n    }\n\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n    public sealed class CallerLineNumberAttribute : Attribute\n    {\n        public CallerLineNumberAttribute() { }\n    }\n\n    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]\n    public sealed class CallerMemberNameAttribute : Attribute\n    {\n        public CallerMemberNameAttribute() { }\n    }\n}"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 2/Compatibility 2.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{895A0C44-DC4B-4A70-A807-9320925F719D}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Compatibility_2</RootNamespace>\n    <AssemblyName>Compatibility 2</AssemblyName>\n    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"CallerInfoAttributes.cs\" />\n    <Compile Include=\"Enumerable.cs\" />\n    <Compile Include=\"ExtensionAttribute.cs\" />\n    <Compile Include=\"FormattableString.cs\" />\n    <Compile Include=\"Func.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"readme.txt\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 2/Enumerable.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace System.Linq\n{\n    public static class Enumerable\n    {\n        public static IEnumerable<TResult> Select<TSource, TResult>( this IEnumerable<TSource> source, Func<TSource, TResult> selector)\n        {\n            foreach (var item in source)\n            {\n                yield return selector(item);\n            }\n        }\n\n        public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)\n        {\n            foreach (var item in source)\n            {\n                if (predicate(item))\n                    yield return item;\n            }\n        }\n\n        public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source)\n        {\n            return new List<TSource>(source);\n        }\n\n        public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source)\n        {\n            var list = source.ToList();\n            var array = new TSource[list.Count];\n            for (int i = 0; i < list.Count; i++)\n                array[i] = list[i];\n            return array;\n        }\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 2/ExtensionAttribute.cs",
    "content": "﻿namespace System.Runtime.CompilerServices\n{\n    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]\n    public sealed class ExtensionAttribute : Attribute\n    {\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 2/FormattableString.cs",
    "content": "﻿using System.Globalization;\n\nnamespace System\n{\n    public abstract class FormattableString : IFormattable\n    {\n        public abstract string Format { get; }\n        public abstract int ArgumentCount { get; }\n        public abstract object[] GetArguments();\n        public abstract object GetArgument(int index);\n        public abstract string ToString(IFormatProvider formatProvider);\n        string IFormattable.ToString(string ignored, IFormatProvider formatProvider) => ToString(formatProvider);\n        public static string Invariant(FormattableString formattable)\n        {\n            if (formattable == null)\n            {\n                throw new ArgumentNullException(nameof(formattable));\n            }\n            return formattable.ToString(CultureInfo.InvariantCulture);\n        }\n        public override string ToString() => ToString(CultureInfo.CurrentCulture);\n        protected FormattableString() { }\n    }\n}\n\nnamespace System.Runtime.CompilerServices\n{\n    public static class FormattableStringFactory\n    {\n        private sealed class ConcreteFormattableString : FormattableString\n        {\n            private readonly string _format;\n            private readonly object[] _arguments;\n            public override string Format => _format;\n            public override int ArgumentCount => _arguments.Length;\n            internal ConcreteFormattableString(string format, object[] arguments)\n            {\n                _format = format;\n                _arguments = arguments;\n            }\n            public override object[] GetArguments() => _arguments;\n            public override object GetArgument(int index) => _arguments[index];\n            public override string ToString(IFormatProvider formatProvider) => string.Format(formatProvider, _format, _arguments);\n        }\n        public static FormattableString Create(string format, params object[] arguments)\n        {\n            if (format == null) throw new ArgumentNullException(nameof(format));\n            if (arguments == null) throw new ArgumentNullException(nameof(arguments));\n            return new ConcreteFormattableString(format, arguments);\n        }\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 2/Func.cs",
    "content": "﻿namespace System\n{\n    public delegate TResult Func<TResult>();\n    public delegate TResult Func<T, TResult>(T arg);\n    public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);\n    public delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3);\n    public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 2/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Compatibility 2\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Compatibility 2\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"895a0c44-dc4b-4a70-a807-9320925f719d\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 2/readme.txt",
    "content": "﻿.NET 2.0 上で、C# 3.0 以降の機能を使うためのライブラリ。\n\n自作で\n・拡張メソッドが使えるように Extension 属性を定義している。\n・LINQ to Objects もどきが使えるように Enumerable クラス、Func デリゲートを定義している。\n・Caller Info 属性が使えるように自作している。\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 3/Compatibility 3.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{52D42322-D7F7-46B9-BB69-97A33D1D24AB}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Compatibility_3</RootNamespace>\n    <AssemblyName>Compatibility 3</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Compatibility 2\\CallerInfoAttributes.cs\">\n      <Link>CallerInfoAttributes.cs</Link>\n    </Compile>\n    <Compile Include=\"..\\Compatibility 2\\FormattableString.cs\">\n      <Link>FormattableString.cs</Link>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"readme.txt\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 3/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Compatibility 3\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Compatibility 3\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"52d42322-d7f7-46b9-bb69-97a33d1d24ab\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 3/readme.txt",
    "content": "﻿.NET 3.5 上で、C# 4.0 以降の機能を使うためのライブラリ。\n\n自作で\n・Caller Info 属性が使えるように自作している。\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 4/Compatibility 4.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{5DBB85A3-E4A1-4EB0-8C1E-6D05C215B59C}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Compatibility_4</RootNamespace>\n    <AssemblyName>Compatibility 4</AssemblyName>\n    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"..\\Compatibility 2\\FormattableString.cs\">\n      <Link>FormattableString.cs</Link>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Compatibility 4/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Compatibility 4\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Compatibility 4\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"5dbb85a3-e4a1-4eb0-8c1e-6d05c215b59c\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/LanguageAndFrameworkVersion.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22609.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Ver 2\", \"Ver2\\Ver 2.csproj\", \"{02C887AE-A303-4185-8619-E8F0B6B52525}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Ver 3\", \"Ver3\\Ver 3.csproj\", \"{A0778187-0F5B-43D4-ACD1-8278E7F4B2A5}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Ver 4\", \"Ver4\\Ver 4.csproj\", \"{E6F11E01-D165-4882-8513-4C16423725AC}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Ver 2 Plus\", \"Ver2Plus\\Ver 2 Plus.csproj\", \"{710E59FC-A21F-4D0C-96B9-DB19F9ED2E84}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Ver 4 Plus\", \"Ver4Plus\\Ver 4 Plus.csproj\", \"{15237782-9295-44E9-BF36-1B57A8D2294E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Ver 4.5\", \"Ver4_5\\Ver 4.5.csproj\", \"{0707D397-91F3-4622-84FF-B3D87E016EC7}\"\nEndProject\nProject(\"{D954291E-2A0B-460D-934E-DC6B0785DB48}\") = \"SharedProject\", \"SharedProject\\SharedProject.shproj\", \"{0391960F-DD89-4CED-B8B0-C1D9C2898369}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Ver 3 Plus\", \"Ver3Plus\\Ver 3 Plus.csproj\", \"{D4F2FBB6-EC3D-4BFC-9F2D-F3DC1BF3B419}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Ver 4.5 Plus\", \"Ver4_5Plus\\Ver 4.5 Plus.csproj\", \"{80E7B461-FD6D-413C-9A1D-10ACE9E77265}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Ver 4.6\", \"Ver4_6\\Ver 4.6.csproj\", \"{91939A00-FB43-4317-9392-3FD1A43CCEB2}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Compatibility 2\", \"Compatibility 2\\Compatibility 2.csproj\", \"{895A0C44-DC4B-4A70-A807-9320925F719D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Compatibility 3\", \"Compatibility 3\\Compatibility 3.csproj\", \"{52D42322-D7F7-46B9-BB69-97A33D1D24AB}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Compatibility 4\", \"Compatibility 4\\Compatibility 4.csproj\", \"{5DBB85A3-E4A1-4EB0-8C1E-6D05C215B59C}\"\nEndProject\nGlobal\n\tGlobalSection(SharedMSBuildProjectFiles) = preSolution\n\t\tSharedProject\\SharedProject.projitems*{15237782-9295-44e9-bf36-1b57a8d2294e}*SharedItemsImports = 4\n\t\tSharedProject\\SharedProject.projitems*{d4f2fbb6-ec3d-4bfc-9f2d-f3dc1bf3b419}*SharedItemsImports = 4\n\t\tSharedProject\\SharedProject.projitems*{710e59fc-a21f-4d0c-96b9-db19f9ed2e84}*SharedItemsImports = 4\n\t\tSharedProject\\SharedProject.projitems*{0391960f-dd89-4ced-b8b0-c1d9c2898369}*SharedItemsImports = 13\n\t\tSharedProject\\SharedProject.projitems*{0707d397-91f3-4622-84ff-b3d87e016ec7}*SharedItemsImports = 4\n\t\tSharedProject\\SharedProject.projitems*{a0778187-0f5b-43d4-acd1-8278e7f4b2a5}*SharedItemsImports = 4\n\t\tSharedProject\\SharedProject.projitems*{02c887ae-a303-4185-8619-e8f0b6b52525}*SharedItemsImports = 4\n\t\tSharedProject\\SharedProject.projitems*{91939a00-fb43-4317-9392-3fd1a43cceb2}*SharedItemsImports = 4\n\t\tSharedProject\\SharedProject.projitems*{80e7b461-fd6d-413c-9a1d-10ace9e77265}*SharedItemsImports = 4\n\t\tSharedProject\\SharedProject.projitems*{e6f11e01-d165-4882-8513-4c16423725ac}*SharedItemsImports = 4\n\tEndGlobalSection\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{02C887AE-A303-4185-8619-E8F0B6B52525}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{02C887AE-A303-4185-8619-E8F0B6B52525}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{02C887AE-A303-4185-8619-E8F0B6B52525}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{02C887AE-A303-4185-8619-E8F0B6B52525}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A0778187-0F5B-43D4-ACD1-8278E7F4B2A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A0778187-0F5B-43D4-ACD1-8278E7F4B2A5}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A0778187-0F5B-43D4-ACD1-8278E7F4B2A5}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A0778187-0F5B-43D4-ACD1-8278E7F4B2A5}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E6F11E01-D165-4882-8513-4C16423725AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E6F11E01-D165-4882-8513-4C16423725AC}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E6F11E01-D165-4882-8513-4C16423725AC}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E6F11E01-D165-4882-8513-4C16423725AC}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{710E59FC-A21F-4D0C-96B9-DB19F9ED2E84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{710E59FC-A21F-4D0C-96B9-DB19F9ED2E84}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{710E59FC-A21F-4D0C-96B9-DB19F9ED2E84}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{710E59FC-A21F-4D0C-96B9-DB19F9ED2E84}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{15237782-9295-44E9-BF36-1B57A8D2294E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{15237782-9295-44E9-BF36-1B57A8D2294E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{15237782-9295-44E9-BF36-1B57A8D2294E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{15237782-9295-44E9-BF36-1B57A8D2294E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0707D397-91F3-4622-84FF-B3D87E016EC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0707D397-91F3-4622-84FF-B3D87E016EC7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0707D397-91F3-4622-84FF-B3D87E016EC7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0707D397-91F3-4622-84FF-B3D87E016EC7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D4F2FBB6-EC3D-4BFC-9F2D-F3DC1BF3B419}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D4F2FBB6-EC3D-4BFC-9F2D-F3DC1BF3B419}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D4F2FBB6-EC3D-4BFC-9F2D-F3DC1BF3B419}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D4F2FBB6-EC3D-4BFC-9F2D-F3DC1BF3B419}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{80E7B461-FD6D-413C-9A1D-10ACE9E77265}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{80E7B461-FD6D-413C-9A1D-10ACE9E77265}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{80E7B461-FD6D-413C-9A1D-10ACE9E77265}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{80E7B461-FD6D-413C-9A1D-10ACE9E77265}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{91939A00-FB43-4317-9392-3FD1A43CCEB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{91939A00-FB43-4317-9392-3FD1A43CCEB2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{91939A00-FB43-4317-9392-3FD1A43CCEB2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{91939A00-FB43-4317-9392-3FD1A43CCEB2}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{895A0C44-DC4B-4A70-A807-9320925F719D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{895A0C44-DC4B-4A70-A807-9320925F719D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{895A0C44-DC4B-4A70-A807-9320925F719D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{895A0C44-DC4B-4A70-A807-9320925F719D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{52D42322-D7F7-46B9-BB69-97A33D1D24AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{52D42322-D7F7-46B9-BB69-97A33D1D24AB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{52D42322-D7F7-46B9-BB69-97A33D1D24AB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{52D42322-D7F7-46B9-BB69-97A33D1D24AB}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5DBB85A3-E4A1-4EB0-8C1E-6D05C215B59C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5DBB85A3-E4A1-4EB0-8C1E-6D05C215B59C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5DBB85A3-E4A1-4EB0-8C1E-6D05C215B59C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5DBB85A3-E4A1-4EB0-8C1E-6D05C215B59C}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp3/AnonymousTypeSample.cs",
    "content": "﻿namespace VersionSample.Csharp3\n{\n    /// <summary>\n    /// 匿名型も割とシンプルな構文糖衣の類。\n    /// クラスが1個自動生成されるだけ。\n    /// .NET 2.0 で問題なく動く。\n    /// </summary>\n    public class AnonymousTypeSample\n    {\n        public static void X()\n        {\n            // 匿名型\n            var a = new\n            {\n                X = 3,\n                Y = 5,\n            };\n        }\n\n        public static void ApproxSameAsX()\n        {\n            // 匿名クラス\n            var a = new CompilerGeneratedAnonymousClassA(3, 5);\n        }\n\n        private class CompilerGeneratedAnonymousClassA\n        {\n            private readonly int _x;\n            private readonly int _y;\n\n            public CompilerGeneratedAnonymousClassA(int v1, int v2)\n            {\n                _x = v1;\n                _y = v2;\n            }\n\n            public int X { get { return _x; } }\n            public int Y { get { return _y; } }\n\n            public override bool Equals(object obj)\n            {\n                var x = obj as CompilerGeneratedAnonymousClassA;\n                if (x == null) return false;\n                return X == x.X && Y == x.Y;\n            }\n\n            public override int GetHashCode()\n            {\n                return X.GetHashCode() ^ Y.GetHashCode();\n            }\n\n            public override string ToString()\n            {\n                return string.Format(\"{{ X = {0}, Y = {1} }}\", X, Y);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp3/ExtensionMethodSample.cs",
    "content": "﻿#if Ver3 || (Ver2 && Plus)\n\nusing System.Linq;\nusing System.Text;\n\nnamespace VersionSample.Csharp3\n{\n    /// <summary>\n    /// 拡張メソッドは、<see cref=\"System.Runtime.CompilerServices.ExtensionAttribute\"/> が付いているだけの普通の静的メソッド。\n    /// この属性は、同名であれば自作のものでもよくて、.NET 2.0 ターゲットでも、自作さえすれば拡張メソッドが使える。\n    /// </summary>\n    public static class ExtensionMethodSample\n    {\n        public static string SnakeToPascal(this string snake_case)\n        {\n            return string.Join(\"\", snake_case.Split('_').Select(ToInitialUpper).ToArray());\n        }\n\n        public static string ToInitialUpper(this string s)\n        {\n            var sb = new StringBuilder();\n            var first = true;\n            foreach (var c in s)\n            {\n                if (first)\n                {\n                    sb.Append(char.ToUpper(c));\n                    first = false;\n                }\n                else\n                {\n                    sb.Append(char.ToLower(c));\n                }\n            }\n            return sb.ToString();\n        }\n\n        // この書き方は認められてない(属性のところがエラーに。素直に拡張メソッドを使えと怒られる)けど、拡張メソッドの展開結果は以下のようになる\n\n        //[System.Runtime.CompilerServices.Extension]\n        public static string SameAsSnakeToPascal(string snake_case)\n        {\n            return string.Join(\"\", Enumerable.ToArray(Enumerable.Select(snake_case.Split('_'), ToInitialUpper)));\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp3/LinqToObjectSample.cs",
    "content": "﻿#if Ver3 || (Ver2 && Plus)\n\nusing System;\nusing System.Linq;\n\nnamespace VersionSample.Csharp3\n{\n    /// <summary>\n    /// LINQ to Objects は、要は <see cref=\"System.Collections.Generic.IEnumerable{T}\"/> に対する拡張メソッドでしかないので、\n    /// .NET 3.0 の <see cref=\"System.Linq.Enumerable\"/> と全く同じものを自作してしまえば、.NET 2.0 でも LINQ to Objects が使える。\n    /// <see cref=\"System.Linq.Enumerable\"/> は実装難易度もそんなに高くないし、Mono のソースコードでも使えばコピペで済む(他のクラスへの依存も少ないのでほぼファイルのコピーで終わり)し、簡単。\n    /// </summary>\n    public class LinqToObjectSample\n    {\n        public static void X()\n        {\n            var input = new[] { 1, 2, 3, 4, 5, 6, 7, 8 };\n            var output =\n                from x in input\n                where (x % 2) == 1\n                select x * x;\n\n            foreach (var x in output)\n            {\n                Console.WriteLine(x);\n            }\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp3/PartialMethodSample.cs",
    "content": "﻿using System;\n\nnamespace VersionSample.Csharp3\n{\n    /// <summary>\n    /// 部分メソッドは、C# 2.0 以前で同じようなコードを書く手段はないけども、単純にコンパイラーの提供する機能で、ライブラリ非依存。\n    /// .NET 2.0 以前でも動く。\n    /// </summary>\n    public partial class PartialMethodSample\n    {\n        public static void X()\n        {\n            OnBeginX(\"call iif the OnBeginX body is defined in anather part of the class\");\n\n            Console.WriteLine(\"X body\");\n\n            OnEndX(\"call iif the OnEdnX body is defined in anather part of the class\");\n        }\n\n        // 部分メソッド\n        // この状態だけだと呼び出されない。というか、引数の評価すらしない。\n        // 普通は機械生成のコードの中で宣言する。\n        static partial void OnBeginX(string message);\n        static partial void OnEndX(string message);\n    }\n}\n\nnamespace VersionSample.Csharp3\n{\n    public partial class PartialMethodSample\n    {\n        // こういう風に、別の部分クラス定義の中で部分メソッドの本体定義があったら、そこで初めてこのメソッドが呼ばれるようになる。\n        // 機械生成のコードに対して、手書きで何らかの処理を挟みたい場合に重宝する。\n        static partial void OnBeginX(string message)\n        {\n            Console.WriteLine(message);\n        }\n\n        static partial void OnEndX(string message)\n        {\n            Console.WriteLine(message);\n        }\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp3/QueryExpressionSample.cs",
    "content": "﻿using System;\nusing System.Text;\n\nnamespace VersionSample.Csharp3\n{\n    /// <summary>\n    /// クエリ式は、単に、 Select や Where っていう名前のメソッド呼び出し(拡張メソッド可)に展開されるだけ。\n    /// 拡張メソッドを使ってしまうと <see cref=\"System.Runtime.CompilerServices.ExtensionAttribute\"/> が必要になるものの、\n    /// 通常のインスタンス メソッドで Select や Where を持っているなら、普通に .NET 2.0 でもクエリ式を使える。\n    /// </summary>\n    public class QueryExpressionSample\n    {\n        public static void X()\n        {\n            var output =\n                from x in new QueryLog<int>()\n                where true\n                select new QueryLog<string>();\n\n            Console.WriteLine(output);\n        }\n\n        public static void SameAsX()\n        {\n            var output = new QueryLog<int>()\n                .Where(x => true)\n                .Select(x => new QueryLog<string>());\n\n            Console.WriteLine(output);\n        }\n    }\n\n    public delegate QueryLog<TResult> Selector<TSource, TResult>(QueryLog<TSource> item);\n    public delegate bool Predicate<TSource>(QueryLog<TSource> item);\n\n    public struct QueryLog<T>\n    {\n\n        private StringBuilder _log;\n\n        public QueryLog<TResult> Select<TResult>(Selector<T, TResult> selector)\n        {\n            _log = _log ?? new StringBuilder();\n            _log.AppendFormat(\".Select<{0}, {1}>\", typeof(T).Name, typeof(TResult).Name);\n            var x = selector(this);\n            x._log = _log;\n            return x;\n        }\n\n        public QueryLog<T> Where(Predicate<T> predicate)\n        {\n            _log = _log ?? new StringBuilder();\n            _log.AppendFormat(\".Where<{0}>\", typeof(T).Name);\n            return this;\n        }\n\n        public override string ToString()\n        {\n            return _log == null ? \"\" :  _log.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp3/SyntaxSugarSample.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace VersionSample.Csharp3\n{\n    /// <summary>\n    /// 型推論、初期化子、ラムダ式などは、割かし単純な構文糖衣でライブラリ非依存。\n    /// 当然、.NET 2.0 上で動く。\n    /// C# 2.0 相当のコードへの展開も割とシンプル。\n    /// </summary>\n    public class SyntaxSugarSample\n    {\n        public static void X()\n        {\n            // 変数の型推論\n            var n = 1;\n            var x = 1.0;\n\n            // 配列の型推論\n            var items = new[] { \"one\", \"two\", \"three\" };\n\n            // ラムダ式\n            var filtered = Where(items, s => s.Length > 3);\n\n            foreach (var item in filtered)\n            {\n                Console.WriteLine(item);\n            }\n\n            // オブジェクト初期化子\n            var p = new Point\n            {\n                X = 10 * n,\n                Y = (int)(20 * x),\n            };\n\n            // コレクション初期化子\n            var list = new List<Point>\n            {\n                new Point(1, 2),\n                new Point(3, 5),\n                new Point(8, 13),\n                new Point(21, 34),\n            };\n        }\n\n        public static void SameAsX()\n        {\n            // 変数の型推論\n            int n = 1;\n            double x = 1.0;\n\n            // 配列の型推論\n            string[] items = new string[] { \"one\", \"two\", \"three\" };\n\n            // ラムダ式\n            var filtered = Where(items, delegate(string s) { return s.Length > 3; });\n\n            foreach (var item in filtered)\n            {\n                Console.WriteLine(item);\n            }\n\n            // オブジェクト初期化子\n            var p = new Point();\n            p.X = 10 * n;\n            p.Y = (int)(20 * x);\n\n            // コレクション初期化子\n            var list = new List<Point>();\n            list.Add(new Point(1, 2));\n            list.Add(new Point(3, 5));\n            list.Add(new Point(8, 13));\n            list.Add(new Point(21, 34));\n        }\n\n        private static IEnumerable<string> Where(IEnumerable<string> source, System.Predicate<string> predicate)\n        {\n            foreach (var x in source)\n                if (predicate(x))\n                    yield return x;\n        }\n    }\n\n    public class Point\n    {\n        // プロパティの自動実装\n        public int X { get; set; }\n        public int Y { get; set; }\n\n        public Point() { }\n\n        public Point(int x, int y)\n        {\n            X = x;\n            Y = y;\n        }\n    }\n\n    public class ApproxSameAsPoint\n    {\n        private int _x;\n        public int X { get { return _x; } set { _x = value; } }\n\n        private int _y;\n        public int Y { get { return _y; } set { _y = value; } }\n\n        public ApproxSameAsPoint() { }\n\n        public ApproxSameAsPoint(int x, int y)\n        {\n            X = x;\n            Y = y;\n        }\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp4/DefaultParameterSample.cs",
    "content": "﻿using System;\n\nnamespace VersionSample.Csharp4\n{\n    /// <summary>\n    /// 省略可能パラメーター(パラメーターの規定値)、名前付きパラメーターは、IL レベルでは .NET 1.0 の頃からある。\n    /// (C# 1.0 の頃でも、<see cref=\"System.Runtime.InteropServices.OptionalAttribute\"/> を付ければ、VB からは省略可能パラメーターとして使える。)\n    ///\n    /// C# 的には 4.0 から入った機能だけども、上記の .NET 1.0 からある仕組みに対応しただけなので、.NET 1.0 上でも動く。\n    /// (利用に多少注意が必要な機能なので、結構長い間機能追加をためらってた。)\n    /// </summary>\n    public class DefaultParameterSample\n    {\n        public static void X()\n        {\n            Console.WriteLine(Sum(1, 2, 3));\n            Console.WriteLine(Sum(x: 1, y: 2, z: 3));\n            Console.WriteLine(Sum(y: 2, z: 3));\n            Console.WriteLine(Sum(x: 1, z: 3));\n            Console.WriteLine(Sum(x: 1, y: 2));\n            Console.WriteLine(Sum(x: 1));\n            Console.WriteLine(Sum(y: 2));\n            Console.WriteLine(Sum(z: 3));\n            Console.WriteLine(Sum());\n        }\n\n        public static void SameAsX()\n        {\n            // つまるところ、定数埋め込みに展開(const と同じ)される。\n            // ほんと(利用側コードへの)埋め込みなので、もしも規定値を変更した場合、利用側も再コンパイルしないと変更が反映されない。\n            // (ここが問題。const も同様の問題抱えてる。この問題があるから、C# は4.0までこの機能を入れるの渋ってた。)\n            Console.WriteLine(Sum(1, 2, 3));\n            Console.WriteLine(Sum(1, 2, 3));\n            Console.WriteLine(Sum(0, 2, 3));\n            Console.WriteLine(Sum(1, 0, 3));\n            Console.WriteLine(Sum(1, 2, 0));\n            Console.WriteLine(Sum(1, 0, 0));\n            Console.WriteLine(Sum(0, 2, 0));\n            Console.WriteLine(Sum(0, 0, 3));\n            Console.WriteLine(Sum(0, 0, 0));\n        }\n\n        public static int Sum(int x = 0, int y = 0, int z = 0)\n        {\n            return x + y + z;\n        }\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp4/DynamicSample.cs",
    "content": "﻿#if Ver4\n\nusing System;\n\nnamespace VersionSample.Csharp4\n{\n    /// <summary>\n    /// dynamic はガッツリと System.Core(v4.0以上)、Microsoft.Csharp アセンブリ(.NET 4で導入)に依存。\n    /// これも、おそらくは同名・同機能のクラスをいくつか自作すれば .NET 3.0 以前で使えるものの、簡単に自作できるようなクラスじゃない。\n    /// C# の機能の中で、同時期より前の .NET 上で動かせない数少ない機能。\n    /// </summary>\n    class DynamicSample\n    {\n        public static void X()\n        {\n            var x1 = new Csharp3.Point(10, 20);\n            var x2 = new { X = 10, Y = 20 };\n            var x3 = new Vector3 { X = 1.5f, Y = 2.1f, Z = 3.3f };\n            var x4 = new Record { X = \"one\", Y = \"two\" };\n\n            DynamicX(x1);\n            DynamicX(x2);\n            DynamicX(x3);\n            DynamicX(x4);\n        }\n\n        private static void DynamicX(dynamic x)\n        {\n            Console.WriteLine(x.X + x.Y);\n        }\n\n        private class Vector3\n        {\n            public float X { get; set; }\n            public float Y { get; set; }\n            public float Z { get; set; }\n        }\n\n        private class Record\n        {\n            public string X { get; set; }\n            public string Y { get; set; }\n        }\n    }\n}\n\n#endif"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp4/VarianceSample.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace VersionSample.Csharp4\n{\n    /// <summary>\n    /// ジェネリックの共変注釈(variance annotation、要するに、型引数の in/out 指定)は、小手先の構文糖衣じゃないし、ライブラリのレベルでどうこうできる機能じゃなくて、ランタイムの型システムが対応してる必要があるもの。\n    /// で、.NET ランタイムのレベルでは実は .NET 2.0 から実装されてた(要するに、ジェネリック導入と同時にこの機能もあった)。\n    /// C# や VB などのプログラミング言語レベルでの実装がなかったのを、C# 4.0/VB 7 で実装しただけ。\n    /// なので、当然、(自前のクラスに in/out を付ける分には).NET 3.0 以前でも使える。\n    /// </summary>\n    public class VarianceSample\n    {\n        public static void X()\n        {\n            var inner = new Dictionary<object, string>\n            {\n                { \"one\", \"un\" },\n                { \"two\", \"deux\" },\n                { \"three\", \"trois\" },\n                { \"four\", \"quatre\" },\n            };\n\n            DictionaryWrapper<object, string> dic = new DictionaryWrapper<object, string>(inner);\n\n            // dic と idic で型が違うように見えて、\n            // in (反変)型引数の場合、object → string (親クラスから子クラス)に代入可能\n            // out (共変)型引数の場合、string → object (子クラスから親クラス)に代入可能\n            // なので、代入できる。\n            IReadOnlyDictionary<string, object> idic = dic;\n        }\n\n        // インターフェイスの型引数に、in/out 注釈を付ける。\n        // in を付ける場合、関数メンバーの引数/set にしか使えない。\n        // out を付ける場合、関数メンバーの戻り値/get にしか使えない。\n        interface IReadOnlyDictionary<in TKey, out TValue>\n        {\n            TValue this[TKey key] { get; }\n        }\n\n        class DictionaryWrapper<TKey, TValue> : IReadOnlyDictionary<TKey, TValue>\n        {\n            Dictionary<TKey, TValue> _inner;\n\n            public DictionaryWrapper(Dictionary<TKey, TValue> inner) { _inner = inner; }\n\n            public TValue this[TKey key]\n            {\n                get\n                {\n                    throw new NotImplementedException();\n                }\n            }\n        }\n    }\n}\n\n#if Ver4\n\nnamespace VersionSample.Csharp4\n{\n    /// <summary>\n    /// 一方で、標準ライブラリ中のインターフェイスに対して、付けれるものにはきっちり全部編成注釈が付いたのは .NET 4 になってから。\n    /// なので、例えば、<see cref=\"IEnumerable{object}\"/> の変数に対して <see cref=\"List{string}\"/> のインスタンスを代入できるようになるのは .NET 4 移行。\n    /// </summary>\n    public class VarianceBclSample\n    {\n        public static void X()\n        {\n            List<string> x = new List<string> { \"one\", \"two\", \"three\" };\n            IEnumerable<object> y = x;\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp4/note.txt",
    "content": "﻿** サンプルにない C# 4.0 新機能に、COM 相互運用がある。\n\n対 COM(対 Runtime Callable Wrapper)限定で、\n- ref 引数に対して、呼び出し側の ref は省略できる\n- インデックス付きプロパティを呼び出せる\nというレガシー救済機能。\n\nこの2つのC#機能に関しては文法上の問題で、.NET 3.5 以前でも使えたはず。\nもう1個、RCW の生成がらみでランタイム自体にも手が入ってて、それは.NET 3.5 以前では使えないはず。\nSharedProject を使って COM 参照のサンプルを書くのが面倒なので割愛。\n\n** もう1点、自動実装イベントの展開方法が変わってる。\n\nスレッド安全性の確保の仕方が変わってるんだけど、差はパフォーマンスだけなので、確認のしようもないので割愛。\nC# 5.0 の foreach の仕様変更と同様、ビルドに使った C# コンパイラーに依存で、実行に使う .NET ランタイムには非依存。\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp5/AsyncSample.cs",
    "content": "﻿#if Ver4_5 || (Ver4 && Plus)\n\nusing System.IO;\nusing System.Threading.Tasks;\n\nnamespace VersionSample.Csharp5\n{\n    /// <summary>\n    /// async/await は、原理的にはどんな型であも await 可能(awaitable)にできるんだけども、実際のところ、自作するのはかなり大変。\n    /// まず無理。\n    /// なので、素の状態では、C# 5.0 と同時期に出た .NET 4.5 以上でないと async/await を使えない。\n    ///\n    /// ただし、.NET 4 上で await が使えるように、.NET 4.5 相当の <see cref=\"System.Threading.Tasks.Task\"/> クラス機能や、IO 系クラスの非同期メソッドなどを .NET 4 向けにバックポーティングしたものを、Microsoft が公式に提供してる。\n    /// (NuGet パッケージとして参照可能。Microsoft.Bcl.Async。)\n    /// これを使えば、.NET 4 以上であれば async/await を使える。\n    /// </summary>\n    public class AsyncSample\n    {\n        public static async Task XAsync()\n        {\n            using (var w = new StreamWriter(\"out.txt\"))\n            {\n                for (int i = 0; i < 100; i++)\n                {\n                    await w.WriteLineAsync(\"line \" + i);\n                }\n            }\n        }\n    }\n}\n\nnamespace VersionSample.Csharp5\n{\n#if Ver4_5\n    using T = System.Threading.Tasks.Task;\n#else\n    using T = System.Threading.Tasks.TaskEx;\n#endif\n\n    /// <summary>\n    /// ただ、Microsoft.Bcl.Async では、.NET 4.5 との差分のメンバーを拡張メソッドとかで定義してるんだけども、\n    /// 静的メソッドの拡張はできないので、<see cref=\"Task.Delay(int)\"/> みたいなやつは足せない。やむなく、TaskEx っていうクラスを作ってる。\n    /// このせいで、<see cref=\"Task.Delay(int)\"/> とかを使うには、上記 #if みたいなマネが必要。\n    /// </summary>\n    public class AsyncTaskSample\n    {\n        public static async Task XAsync()\n        {\n            await T.Yield();\n            await T.Delay(1);\n            await T.Run(() => { });\n            await T.WhenAll(T.Delay(1), T.Run(() => { }));\n            await T.WhenAny(T.Delay(1), T.Run(() => { }));\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp5/CallerInfoSample.cs",
    "content": "﻿#if Ver4_5 || (Ver2 && Plus)\n\nusing System;\nusing System.Runtime.CompilerServices;\n\nnamespace VersionSample.Csharp5\n{\n    /// <summary>\n    /// これも <see cref=\"Csharp3.ExtensionMethodSample\"/> 同様、同名の属性クラス(自作でもいい)さえあれば動く。\n    /// 自作すれば、.NET 2.0 でも動く。\n    /// </summary>\n    public class CallerInfoSample\n    {\n        public static void X()\n        {\n            WriteLine(\"sample\");\n        }\n\n        public static void ApproxSameAsX()\n        {\n            WriteLine(\"sample\", @\"[your solution full path]\\[project name]\\Csharp5\\CallerInfoSample.cs\", 21, \"ApproxSameAsX\");\n        }\n\n        public static void WriteLine(string message,\n            [CallerFilePath] string file = \"\",\n            [CallerLineNumber] int line = 0,\n            [CallerMemberName] string member = \"\")\n        {\n            var s = string.Format(\"{0}:{1} - {2}: {3}\", file, line, member, message);\n            Console.WriteLine(s);\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp5/ForeachBreakingChangeSample.cs",
    "content": "﻿using System;\n\nnamespace VersionSample.Csharp5\n{\n    /// <summary>\n    /// C# には珍しい破壊的変更の1つ。\n    /// foreach (var x in ...) の、x のスコープが変わった。\n    ///\n    /// これは、生成する IL が変更されたもので、単純に C# コンパイラーだけの問題。\n    /// ビルド時にどのコンパイラーを使ったかによって挙動が変わって、実行時にどの .NET ランタイムを使っているかにはよらない。\n    /// 逆に言うと、.NET 4 移行を使っていたとしても、古いコンパイラーでビルドすると古い挙動になるので注意。\n    /// </summary>\n    public class ForeachBreakingChangeSample\n    {\n        delegate void Action();\n\n        public static void X()\n        {\n            var data = new[] { 1, 2, 3, 4, 5 };\n\n            Action a = null;\n\n            foreach (var x in data)\n            {\n                // x が、\n                // C# 4.0 まで: foreach の { } 外で作られる(1個だけになる)\n                // C# 5.0 から: foreach の { } 内で作られる(ループのたびに別になる)\n\n                // この違いが問題になる場面はそんなに多くないものの…\n                // ラムダ式での変数キャプチャとかやると挙動に差が出る。\n                a += () => Console.WriteLine(x);\n            }\n\n            a();\n/*\nC# 4.0 までの結果\n5\n5\n5\n5\n5\n\nC# 5.0 移行での結果\n1\n2\n3\n4\n5\n*/\n        }\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp6/AsyncSample.cs",
    "content": "﻿#if Ver4_5 || (Ver4 && Plus)\n\nusing System;\nusing System.IO;\nusing System.Threading.Tasks;\n\nnamespace VersionSample.Csharp6\n{\n    /// <summary>\n    /// catch 句、finally 句内での await は、\n    /// async/await さえ使えるバージョンであれば必ず使える。\n    /// </summary>\n    public class AsyncSample\n    {\n        public static async Task XAsync()\n        {\n            try\n            {\n                await Csharp5.AsyncSample.XAsync();\n            }\n            catch (InvalidOperationException e)\n            {\n                using (var s = new StreamWriter(\"error.txt\"))\n                    await s.WriteAsync(e.ToString());\n            }\n            finally\n            {\n                using (var s = new StreamWriter(\"trace.txt\"))\n                    await s.WriteAsync(\"XAsync done.\");\n            }\n        }\n\n        public static async Task AproxSameXAsync()\n        {\n            // 要は、1段階多く try で囲って catch-throw し直ししたり、一度例外を変数で受けて、null じゃなかったら処理するみたいなことしてる。\n\n            Exception ex1 = null;\n            try\n            {\n                Exception ex2 = null;\n                try\n                {\n                    await Csharp5.AsyncSample.XAsync();\n                }\n                catch (InvalidOperationException e)\n                {\n                    ex2 = e;\n                }\n\n                if (ex2 != null)\n                {\n                    using (var s = new StreamWriter(\"error.txt\"))\n                        await s.WriteAsync(ex2.ToString());\n                }\n            }\n            catch(Exception e1)\n            {\n                ex1 = e1;\n            }\n\n            using (var s = new StreamWriter(\"trace.txt\"))\n                await s.WriteAsync(\"XAsync done.\");\n\n            if (ex1 != null)\n            {\n                throw ex1;\n                // ほんとは、スタックトレースを保存する処理とかがさらに挟まってる\n            }\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp6/ExtensionListInitializerSample.cs",
    "content": "﻿#if Ver3 || (Ver2 && Plus)\n\nusing System.Collections.Generic;\n\nnamespace VersionSample.Csharp6\n{\n    /// <summary>\n    /// 拡張メソッドでのコレクション初期化子は、\n    /// 拡張メソッドさえ使えるバージョンであれば必ず使える。\n    /// </summary>\n    public static class ExtensionListInitializerSample\n    {\n        public static void X()\n        {\n            // コレクション初期化子の Add が拡張メソッドでもよくなった。\n            var list = new List<Point>\n            {\n                { 1, 2 },\n                { 3, 4 },\n            };\n        }\n\n        public static void SameAsX()\n        {\n            // 拡張メソッドの Add が呼ばれる。\n            // ここではさらに、拡張メソッド自体も展開(通常の静的メソッド呼び出しに)してる。\n            var list = new List<Point>();\n            PointExtensions.Add(list, 1, 2);\n            PointExtensions.Add(list, 3, 4);\n        }\n    }\n\n    public static class PointExtensions\n    {\n        public static void Add(this List<Point> list, int x, int y)\n        {\n            list.Add(new Point(x, y));\n        }\n    }\n}\n\n#endif\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp6/NullConditionalSample.cs",
    "content": "﻿namespace VersionSample.Csharp6\n{\n    /// <summary>\n    ///  null 条件演算子。\n    /// これも、一度変数に受ける必要がなくなったり、? : 演算子のウザったさがなくなるだけの割とシンプルの構文糖衣。\n    /// </summary>\n    public class NullConditionalSample\n    {\n        public static int X(Entry x)\n        {\n            return x?.Name.Length ?? 0;\n        }\n\n        public static int SameAsX(Entry x)\n        {\n            if (x == null) return 0;\n            return x.Name.Length;\n        }\n\n        public static int? Y(Entry x)\n        {\n            return x?.Name?.Length;\n        }\n\n        public static int? SameAsY(Entry x)\n        {\n            if (x == null) return null;\n\n            var name = x.Name;\n            if (name == null) return null;\n            return name.Length;\n\n            // 下3行は、\n            //if (x.Name) return null;\n            //return x.Name.Length;\n            // ではなく、一度ローカル変数に受けたようなコードになる。\n            //x.Name == null ? null : x.Name.Length;\n            // みたいな、プロパティ呼び出しが2回にはならない。\n            // これが、? : 演算子ではできない。\n        }\n\n        public static int? DifferentFromY(Entry x)\n        {\n            var name = x == null ? null : x.Name;\n            // ?. は短絡評価なので、↑がnullだった時点でreturnして、↓の評価は走らなくなる。\n            return name == null ? (int?)null : name.Length;\n\n            // つまり、\n            // (1)\n            //return x?.Name?.Length;\n            // と、\n            // (2)\n            //var name = x?.Name;\n            //return name?.Length;\n            // は意味が変わるので注意。\n        }\n\n#if false\n        // 残念ながら、null 条件演算子は式ツリー化できない。\n        // SameAsY とかの例を見ての通り、複文に展開されるので。\n\n        public static void Z()\n        {\n            System.Linq.Expressions.Expression<System.Func<Entry, int>> e = x => x?.Name?.Length ?? 0;\n        }\n#endif\n    }\n\n    public class Entry\n    {\n        public int Id { get; }\n\n        public string Name { get; }\n\n        public Entry(int id, string name)\n        {\n            Id = id;\n            Name = name;\n        }\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp6/StringInterpolationSample.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace VersionSample.Csharp6\n{\n    /// <summary>\n    /// 文字列補間。\n    /// <see cref=\"string.Format(string, object[])\"/> を単純化する構文が言語に組み込まれる。\n    ///\n    /// 通常版(string 型の変数に代入)の場合、\n    /// 内部的には <see cref=\"string.Format(string, object[])\"/> (.NET 1.0の頃からある)を呼んでいるだけなので、古いバージョンでも当然動く。\n    /// </summary>\n    public class StringInterpolationSample\n    {\n        public static void X()\n        {\n            var x = 10;\n            var y = 20;\n\n            var s = $\"{x}, {y}, {x :c}, {x :n}\";\n            Console.WriteLine(s);\n\n            var verbatim = $@\"\nverbatim (here) string\n{x}, {y}, {x:c}, {x:n}\n\";\n            Console.WriteLine(verbatim);\n        }\n\n        public static void SameAsX()\n        {\n            var x = 10;\n            var y = 20;\n\n            var s = string.Format(\"{0}, {1}, {2 :c}, {3 :n}\", x, y, x, x);\n            Console.WriteLine(s);\n\n            var verbatim = string.Format(@\"\nverbatim (here) string\n{0}, {1}, {2:c}, {3:n}\n\", x, y, x, x);\n            Console.WriteLine(verbatim);\n        }\n\n        //【注意】この構文だとカルチャー指定とかができない(IFormatProviders を与えるオーバーロードを呼べない)。\n        // 正式版までには、\n        // IFormattable f = $\"{x}, {y]\";\n        // f.ToString(null, /* ここに provider を渡せる */);\n        // みたいな追加の構文が入る予定。\n        //\n        // この機能には、System.Runtime.CompilerServices.FormattedString 型が必要になるので、.NET 4.6 (もしくは同等の FormattedString の自前実装)が必要に。\n        // C# 6.0 の機能の中で、.NET 4.6/.NET Core 5を要求する唯一の機能。\n\n#if Ver4_6 || (Ver2 && Plus)\n\n        private static readonly IEnumerable<string> Cultures = new[] { \"en-us\", \"fr\", \"zh-hk\", \"ja-jp\" };\n\n        public static void Y()\n        {\n            var x = 10;\n\n            IFormattable f = $\"{x :c}, {x :n}\";\n\n            foreach (var c in Cultures)\n            {\n                var s = WithCulture(f, c);\n                Console.WriteLine(s);\n            }\n        }\n\n        public static void SameAsY()\n        {\n            var x = 10;\n\n            IFormattable f = System.Runtime.CompilerServices.FormattableStringFactory.Create(\"{0:c}, {1:n}\", x, x);\n\n            foreach (var c in Cultures)\n            {\n                var s = WithCulture(f, c);\n                Console.WriteLine(s);\n            }\n        }\n\n        private static string WithCulture(IFormattable f, string cultureName)\n        {\n            return f.ToString(null, System.Globalization.CultureInfo.CreateSpecificCulture(cultureName));\n        }\n\n#endif\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Csharp6/SyntaxSugarSample.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nusing static System.Math;\n\nnamespace VersionSample.Csharp6\n{\n    /// <summary>\n    /// C# 6.0 の機能はかなりの部分、かなりシンプルな構文糖衣。\n    /// .NET 2.0 上で余裕で動く。\n    /// </summary>\n    public class SyntaxSugarSample\n    {\n        public static void X()\n        {\n            var dic = new Dictionary<string, int>\n            {\n                [\"one\"] = 1,\n                [\"two\"] = 2,\n            };\n\n            Console.WriteLine(nameof(dic) + \" in \" + nameof(X));\n        }\n\n        public static void SameAsX()\n        {\n            // 展開方法も、オブジェクト初期化子と似たようなもの。\n            // 単に、代入がワンセットの式で書けるだけ。\n            var dic = new Dictionary<string, int>();\n            dic[\"one\"] = 1;\n            dic[\"two\"] = 2;\n\n            // nameof は普通に文字列リテラルに展開。\n            // 要は、静的コード解析とかリファクタリングのターゲットにできるというだけの文字列リテラル。\n            Console.WriteLine(\"dic\" + \" in \" + \"X\");\n        }\n\n        public static double Length(double x, double y)\n        {\n            return Sqrt(x * x + y * y);\n        }\n\n        public static double SameAsLength(double x, double y)\n        {\n            // 単に Math. が省略できるだけ\n            return Math.Sqrt(x * x + y * y);\n        }\n\n        public static void Y()\n        {\n            try\n            {\n            }\n            catch (ArgumentException e) when (e.ParamName == \"x\")\n            {\n                // パラメーター名が x の時だけはエラー無視\n            }\n\n            // この構文は、これまでの C# では書く方法ない。\n            // IL レベルでは、元々 catch 句にフィルターが書けた。その機能に C# も対応しただけ。\n        }\n    }\n\n    public class Point\n    {\n        // getter-only 自動実装プロパティ\n        public int X { get; } = 1;\n        public int Y { get; } = 2;\n\n        public Point() { }\n\n        public Point(int x, int y)\n        {\n            X = x;\n            Y = y;\n        }\n\n        // expression-bodied プロパティ\n        public int Size => X * Y;\n\n        // expression-bodied メソッド\n        // string-interpolation\n        public override string ToString() => \"(\" + X + \", \" + Y + \")\";\n    }\n\n    public class ApproxSameAsPoint\n    {\n        private readonly int _x = 1;\n        public int X { get { return _x; } }\n\n        private readonly int _y = 2;\n        public int Y { get { return _y; } }\n\n        public ApproxSameAsPoint() { }\n\n        public ApproxSameAsPoint(int x, int y)\n        {\n            _x = x;\n            _y = y;\n        }\n\n        public int Size { get { return X * Y; } }\n\n        public override string ToString()\n        {\n            return \"(\" + X + \", \" + Y + \")\";\n        }\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/Program.cs",
    "content": "﻿namespace VersionSample\n{\n    class Program\n    {\n        static void Main()\n        {\n            // C# コンパイラーのレベルで実現している機能(.NET のバージョンは問わない)\n            Csharp6.SyntaxSugarSample.X();\n            Csharp6.SyntaxSugarSample.SameAsX();\n            var entry = new Csharp6.Entry(1, \"one\");\n            Csharp6.NullConditionalSample.X(entry);\n            Csharp6.NullConditionalSample.SameAsX(entry);\n            Csharp6.NullConditionalSample.Y(entry);\n            Csharp6.NullConditionalSample.SameAsY(entry);\n            Csharp6.StringInterpolationSample.X();\n            Csharp6.StringInterpolationSample.SameAsX();\n            Csharp3.SyntaxSugarSample.X();\n            Csharp3.SyntaxSugarSample.SameAsX();\n            Csharp3.PartialMethodSample.X();\n\n            // .NET のレベルでは 1.0, 2.0 時代から対応していたけども、C# 的には後から対応したもの\n            Csharp6.SyntaxSugarSample.Y();\n            Csharp4.VarianceSample.X();\n            Csharp4.DefaultParameterSample.X();\n            Csharp4.DefaultParameterSample.SameAsX();\n\n            // どのバージョンでもコンパイルは通るけども、挙動がちょっと違うもの\n            Csharp5.ForeachBreakingChangeSample.X();\n\n#if Ver3 || (Ver2 && Plus)\n            // .NET 3.5 以降のみ。ただし、.NET 2.0 でも簡単なクラスの自作で対応可能。\n\n            Csharp6.ExtensionListInitializerSample.X();\n            Csharp6.ExtensionListInitializerSample.SameAsX();\n\n            var snake_case_string = \"snake_case_string\";\n            Csharp3.ExtensionMethodSample.SnakeToPascal(snake_case_string);\n            Csharp3.ExtensionMethodSample.SameAsSnakeToPascal(snake_case_string);\n            Csharp3.LinqToObjectSample.X();\n#endif\n\n#if Ver4_5 || (Ver2 && Plus)\n            // .NET 4.5 以降のみ。ただし、.NET 2.0 でも簡単なクラスの自作で対応可能。\n            // .NET 4 以降であれば NuGet パッケージの参照で対応可能。\n\n            Csharp5.CallerInfoSample.X();\n            Csharp5.CallerInfoSample.ApproxSameAsX();\n#endif\n\n#if Ver4_5 || (Ver4 && Plus)\n            // .NET 4.5 以降のみ。ただし、.NET 4 以降であれば NuGet パッケージの参照で対応可能。\n\n            Csharp6.AsyncSample.XAsync().Wait();\n            Csharp6.AsyncSample.AproxSameXAsync().Wait();\n            Csharp5.AsyncSample.XAsync().Wait();\n            Csharp5.AsyncTaskSample.XAsync().Wait();\n#endif\n\n#if Ver4_6 || (Ver2 && Plus)\n            // .NET 4.6 以降のみ。ただし、.NET 2.0 でも簡単なクラスの自作で対応可能。\n\n            Csharp6.StringInterpolationSample.Y();\n            Csharp6.StringInterpolationSample.SameAsY();\n#endif\n\n#if Ver4\n            // .NET 4 以降のみ。\n\n            Csharp4.VarianceBclSample.X();\n            Csharp4.DynamicSample.X();\n#endif\n        }\n    }\n}\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/SharedProject.projitems",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>\n    <HasSharedItems>true</HasSharedItems>\n    <SharedGUID>0391960f-dd89-4ced-b8b0-c1d9c2898369</SharedGUID>\n  </PropertyGroup>\n  <PropertyGroup Label=\"Configuration\">\n    <Import_RootNamespace>VersionSample</Import_RootNamespace>\n  </PropertyGroup>\n  <ItemGroup>\n    <Compile Include=\"$(MSBuildThisFileDirectory)Program.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp3\\AnonymousTypeSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp3\\PartialMethodSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp3\\SyntaxSugarSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp3\\ExtensionMethodSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp3\\LinqToObjectSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp3\\QueryExpressionSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp4\\DefaultParameterSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp4\\DynamicSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp4\\VarianceSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp5\\AsyncSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp5\\CallerInfoSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp5\\ForeachBreakingChangeSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp6\\AsyncSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp6\\ExtensionListInitializerSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp6\\NullConditionalSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp6\\StringInterpolationSample.cs\" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)Csharp6\\SyntaxSugarSample.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"$(MSBuildThisFileDirectory)Csharp4\\note.txt\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/SharedProject/SharedProject.shproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>0391960f-dd89-4ced-b8b0-c1d9c2898369</ProjectGuid>\n    <MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\CodeSharing\\Microsoft.CodeSharing.Common.Default.props\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\CodeSharing\\Microsoft.CodeSharing.Common.props\" />\n  <PropertyGroup />\n  <Import Project=\"SharedProject.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\CodeSharing\\Microsoft.CodeSharing.CSharp.targets\" />\n</Project>\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver2/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Ver2\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Ver2\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"02c887ae-a303-4185-8619-e8f0b6b52525\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver2/Ver 2.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{02C887AE-A303-4185-8619-E8F0B6B52525}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>VersionSample</RootNamespace>\n    <AssemblyName>Ver2</AssemblyName>\n    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;DEBUG;Ver2</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;Ver2</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"readme.txt\" />\n  </ItemGroup>\n  <Import Project=\"..\\SharedProject\\SharedProject.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver2/readme.txt",
    "content": "﻿.NET 2.0 ターゲット。\n何もしていない素の状態。\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver2Plus/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Ver2Plus\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Ver2Plus\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"710e59fc-a21f-4d0c-96b9-db19f9ed2e84\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver2Plus/Ver 2 Plus.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{710E59FC-A21F-4D0C-96B9-DB19F9ED2E84}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>VersionSample</RootNamespace>\n    <AssemblyName>Ver2Plus</AssemblyName>\n    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;DEBUG;Ver2 Plus</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;Ver2 Plus</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"readme.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Compatibility 2\\Compatibility 2.csproj\">\n      <Project>{895a0c44-dc4b-4a70-a807-9320925f719d}</Project>\n      <Name>Compatibility 2</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"..\\SharedProject\\SharedProject.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver2Plus/readme.txt",
    "content": "﻿.NET 2.0 ターゲット。\n\n拡張メソッド、LINQ、Caller Info が使えるように、Compatibility 2 プロジェクトを参照。\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver3/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Ver3\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Ver3\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"a0778187-0f5b-43d4-acd1-8278e7f4b2a5\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver3/Ver 3.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{A0778187-0F5B-43D4-ACD1-8278E7F4B2A5}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>VersionSample</RootNamespace>\n    <AssemblyName>Ver3</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;DEBUG;Ver2 Ver3</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;Ver2 Ver3</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"app.config\" />\n    <None Include=\"readme.txt\" />\n  </ItemGroup>\n  <Import Project=\"..\\SharedProject\\SharedProject.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver3/app.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n<startup><supportedRuntime version=\"v2.0.50727\"/></startup></configuration>\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver3/readme.txt",
    "content": "﻿.NET 3.5 ターゲット。\n何もしていない素の状態。\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver3Plus/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Ver3Plus\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Ver3Plus\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"d4f2fbb6-ec3d-4bfc-9f2d-f3dc1bf3b419\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver3Plus/Ver 3 Plus.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{D4F2FBB6-EC3D-4BFC-9F2D-F3DC1BF3B419}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>VersionSample</RootNamespace>\n    <AssemblyName>Ver3Plus</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;DEBUG;Ver2 Ver3 Plus</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;Ver2 Ver3 Plus</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"readme.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Compatibility 3\\Compatibility 3.csproj\">\n      <Project>{52d42322-d7f7-46b9-bb69-97a33d1d24ab}</Project>\n      <Name>Compatibility 3</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"..\\SharedProject\\SharedProject.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver3Plus/readme.txt",
    "content": "﻿.NET 3.5 ターゲット。\n\nCaller Info が使えるように、Compatibility 3 プロジェクトを参照。\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Ver4\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Ver4\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"e6f11e01-d165-4882-8513-4c16423725ac\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4/Ver 4.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{E6F11E01-D165-4882-8513-4C16423725AC}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>VersionSample</RootNamespace>\n    <AssemblyName>Ver4</AssemblyName>\n    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;DEBUG;Ver2 Ver3 Ver4</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;Ver2 Ver3 Ver4</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"readme.txt\" />\n  </ItemGroup>\n  <Import Project=\"..\\SharedProject\\SharedProject.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4/readme.txt",
    "content": "﻿.NET 4 ターゲット。\n何もしていない素の状態。\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4Plus/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Ver4Plus\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Ver4Plus\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"15237782-9295-44e9-bf36-1b57a8d2294e\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4Plus/Ver 4 Plus.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{15237782-9295-44E9-BF36-1B57A8D2294E}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>VersionSample</RootNamespace>\n    <AssemblyName>Ver4Plus</AssemblyName>\n    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;DEBUG;Ver2 Ver3 Ver4 Plus</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;Ver2 Ver3 Ver4 Plus</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.Threading.Tasks\">\n      <HintPath>..\\packages\\Microsoft.Bcl.Async.1.0.168\\lib\\net40\\Microsoft.Threading.Tasks.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Threading.Tasks.Extensions\">\n      <HintPath>..\\packages\\Microsoft.Bcl.Async.1.0.168\\lib\\net40\\Microsoft.Threading.Tasks.Extensions.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Threading.Tasks.Extensions.Desktop\">\n      <HintPath>..\\packages\\Microsoft.Bcl.Async.1.0.168\\lib\\net40\\Microsoft.Threading.Tasks.Extensions.Desktop.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.IO, Version=2.6.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bcl.1.1.10\\lib\\net40\\System.IO.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Net\" />\n    <Reference Include=\"System.Runtime, Version=2.6.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bcl.1.1.10\\lib\\net40\\System.Runtime.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Threading.Tasks, Version=2.6.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.Bcl.1.1.10\\lib\\net40\\System.Threading.Tasks.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"readme.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Compatibility 4\\Compatibility 4.csproj\">\n      <Project>{5dbb85a3-e4a1-4eb0-8c1e-6d05c215b59c}</Project>\n      <Name>Compatibility 4</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"..\\SharedProject\\SharedProject.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"..\\packages\\Microsoft.Bcl.Build.1.0.14\\tools\\Microsoft.Bcl.Build.targets\" Condition=\"Exists('..\\packages\\Microsoft.Bcl.Build.1.0.14\\tools\\Microsoft.Bcl.Build.targets')\" />\n  <Target Name=\"EnsureBclBuildImported\" BeforeTargets=\"BeforeBuild\" Condition=\"'$(BclBuildImported)' == ''\">\n    <Error Condition=\"!Exists('..\\packages\\Microsoft.Bcl.Build.1.0.14\\tools\\Microsoft.Bcl.Build.targets')\" Text=\"This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567.\" HelpKeyword=\"BCLBUILD2001\" />\n    <Error Condition=\"Exists('..\\packages\\Microsoft.Bcl.Build.1.0.14\\tools\\Microsoft.Bcl.Build.targets')\" Text=\"The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568.\" HelpKeyword=\"BCLBUILD2002\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4Plus/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Microsoft.Bcl\" version=\"1.1.10\" targetFramework=\"net4\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Bcl.Async\" version=\"1.0.168\" targetFramework=\"net4\" userInstalled=\"true\" />\n  <package id=\"Microsoft.Bcl.Build\" version=\"1.0.14\" targetFramework=\"net4\" userInstalled=\"true\" />\n</packages>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4Plus/readme.txt",
    "content": "﻿.NET 4 ターゲット。\n\nasync/await が使えるように、NuGet で Microsoft.Bcl.Async を参照。\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4_5/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Ver4_5\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Ver4_5\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"0707d397-91f3-4622-84ff-b3d87e016ec7\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4_5/Ver 4.5.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{0707D397-91F3-4622-84FF-B3D87E016EC7}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>VersionSample</RootNamespace>\n    <AssemblyName>Ver4_5</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;DEBUG;Ver2 Ver3 Ver4 Ver4_5</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;Ver2 Ver3 Ver4 Ver4_5</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"readme.txt\" />\n  </ItemGroup>\n  <Import Project=\"..\\SharedProject\\SharedProject.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4_5/readme.txt",
    "content": "﻿.NET 4.5 ターゲット。\n何もしていない素の状態。\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4_5Plus/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Ver4_5Plus\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Ver4_5Plus\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"80e7b461-fd6d-413c-9a1d-10ace9e77265\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4_5Plus/Ver 4.5 Plus.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{80E7B461-FD6D-413C-9A1D-10ACE9E77265}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>VersionSample</RootNamespace>\n    <AssemblyName>Ver4_5Plus</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;DEBUG;Ver2 Ver3 Ver4 Ver4_5 Plus</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;Ver2 Ver3 Ver4 Ver4_5 Plus</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"readme.txt\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Compatibility 4\\Compatibility 4.csproj\">\n      <Project>{5dbb85a3-e4a1-4eb0-8c1e-6d05c215b59c}</Project>\n      <Name>Compatibility 4</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"..\\SharedProject\\SharedProject.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4_5Plus/readme.txt",
    "content": "﻿.NET 4.5 ターゲット。\n\n自作で FormattableString を追加。\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4_6/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Ver4_6\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Ver4_6\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"91939a00-fb43-4317-9392-3fd1a43cceb2\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4_6/Ver 4.6.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{91939A00-FB43-4317-9392-3FD1A43CCEB2}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>VersionSample</RootNamespace>\n    <AssemblyName>Ver4_6</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>TRACE;DEBUG;Ver2 Ver3 Ver4 Ver4_5 Ver4_6</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE;Ver2 Ver3 Ver4 Ver4_5 Ver4_6</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"readme.txt\" />\n  </ItemGroup>\n  <Import Project=\"..\\SharedProject\\SharedProject.projitems\" Label=\"Shared\" />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "LanguageAndFrameworkVersion/Ver4_6/readme.txt",
    "content": "﻿.NET 4.6 ターゲット。\n何もしていない素の状態。\n"
  },
  {
    "path": "Palindrome/ConsoleApplication1/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.1\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Palindrome/ConsoleApplication1/ConsoleApplication1.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{F2C71B9C-957D-4B58-A2A0-D7B5B552358E}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Palindrome</RootNamespace>\n    <AssemblyName>ConsoleApplication1</AssemblyName>\n    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <SccProjectName>SAK</SccProjectName>\n    <SccLocalPath>SAK</SccLocalPath>\n    <SccAuxPath>SAK</SccAuxPath>\n    <SccProvider>SAK</SccProvider>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"Doc\\Beginning.pptx\" />\n    <None Include=\"Doc\\Conclusion.pptx\" />\n  </ItemGroup>\n  <ItemGroup />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Palindrome/ConsoleApplication1/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Palindrome\n{\n    class Program\n    {\n        static void Main()\n        {\n            const string SampleText = \"abcbad\";\n\n            Console.WriteLine(\"----- substrings -----\");\n            foreach (var x in GetSubstrings(SampleText))\n            {\n                Console.WriteLine(x);\n            }\n\n            Console.WriteLine(\"----- palindromes -----\");\n            foreach (var x in GetPalindromes(SampleText))\n            {\n                Console.WriteLine(x);\n            }\n        }\n\n        static IEnumerable<string> GetPalindromes(string s)\n        {\n            return GetSubstrings(s).Where(IsPalindrome).Distinct();\n        }\n\n        static IEnumerable<string> GetSubstrings(string s)\n        {\n            for (var start = 0; start < s.Length; start++)\n            {\n                for (var length = 1; length <= s.Length - start; length++)\n                {\n                    yield return s.Substring(start, length);\n\n                }\n            }\n        }\n\n        static bool IsPalindrome(string s)\n        {\n            for (var i = 0; i < s.Length / 2; i++)\n            {\n                if (s[i] != s[s.Length - 1 - i])\n                    return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Palindrome/ConsoleApplication1/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ConsoleApplication1\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApplication1\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"6ea88dd2-ea6d-4519-987c-8ab374c19ba5\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Palindrome/ConsoleApplication2/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.1\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Palindrome/ConsoleApplication2/ConsoleApplication2.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{0D6BD06C-97B4-4121-BB96-858CAB3F8D70}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Palindrome</RootNamespace>\n    <AssemblyName>ConsoleApplication2</AssemblyName>\n    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <SccProjectName>SAK</SccProjectName>\n    <SccLocalPath>SAK</SccLocalPath>\n    <SccAuxPath>SAK</SccAuxPath>\n    <SccProvider>SAK</SccProvider>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"SimpleImplementation.cs\" />\n    <Compile Include=\"Implementation1.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"Doc\\Beginning.pptx\" />\n    <None Include=\"Doc\\Conclusion.pptx\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Palindrome/ConsoleApplication2/Implementation1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Palindrome\n{\n    class Implementation1\n    {\n#if DEBUG\n        public static int count;\n#endif\n\n        public static IEnumerable<string> GetPalindromes(string text)\n        {\n            return GetSubstrings(text, IsPalindrome).Distinct();\n        }\n\n        public static IEnumerable<string> GetSubstrings(string text)\n        {\n            for (var start = 0; start < text.Length; start++)\n            {\n                for (var length = 1; length <= text.Length - start; length++)\n                {\n                    yield return text.Substring(start, length);\n                }\n            }\n        }\n\n        private delegate bool SubstringPredicate(string text, int startIndex, int length);\n\n        private static IEnumerable<string> GetSubstrings(string text, SubstringPredicate condition)\n        {\n            for (var start = 0; start < text.Length; start++)\n            {\n                for (var length = 1; length <= text.Length - start; length++)\n                {\n                    if (condition(text, start, length)) // 判定ではじいてから Substring\n                        yield return text.Substring(start, length);\n                }\n            }\n        }\n\n        public static bool IsPalindrome(string text, int startIndex, int length)\n        {\n            for (var i = 0; i < length / 2; i++)\n            {\n#if DEBUG\n                ++count;\n#endif\n                if (text[i + startIndex] != text[startIndex + length - 1 - i])\n                    return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Palindrome/ConsoleApplication2/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Palindrome\n{\n    class Program\n    {\n        static void Main()\n        {\n            var sampleData = new[]\n            {\n                \"abcbad\",\n                \"aaaaaaaaaabowijaoiwejroasafasdfasaaaaabbbbcbbbbaaoiwejatow\",\n                \"oe4itjaoewrgosergoishjreioushzudfizasdnfkjdnfvlmxoisrejaoweshgtriuaerngkjrsnrkljsnfkdlmszrhgaiuewhrtiouarehnpinrmxlkndl\",\n            };\n\n            foreach (var data in sampleData)\n            {\n                TestGetSubstrings(data);\n                TestGetPalindromes(data);\n            }\n        }\n\n        private static void TestGetSubstrings(string text)\n        {\n            var expected = SimpleImplementation.GetSubstrings(text).ToArray();\n            var actual = Implementation1.GetSubstrings(text).ToArray();\n\n            if (!expected.OrderBy(x => x).SequenceEqual(actual.OrderBy(x => x)))\n            {\n                Console.WriteLine(\"error GetSbustrings\");\n            }\n        }\n\n        private static void TestGetPalindromes(string text)\n        {\n            var expected = SimpleImplementation.GetPalindromes(text).OrderBy(x => x).ToArray();\n            var actual = Implementation1.GetPalindromes(text).OrderBy(x => x).ToArray();\n\n            if (!expected.SequenceEqual(actual))\n            {\n                Console.WriteLine(\"error GetPalindromes\");\n\n                Console.WriteLine(string.Join(\", \", expected));\n                Console.WriteLine(string.Join(\", \", actual));\n            }\n        }\n\n        private static void Write(string text)\n        {\n            Console.WriteLine(\"----- substrings -----\");\n            foreach (var x in Implementation1.GetSubstrings(text))\n            {\n                Console.WriteLine(x);\n            }\n\n            Console.WriteLine(\"----- palindromes -----\");\n            foreach (var x in Implementation1.GetPalindromes(text))\n            {\n                Console.WriteLine(x);\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "Palindrome/ConsoleApplication2/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ConsoleApplication2\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApplication2\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"f9b4f3f7-ba17-4f48-a53e-902dc1612dbd\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Palindrome/ConsoleApplication2/SimpleImplementation.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\n\nnamespace Palindrome\n{\n    class SimpleImplementation\n    {\n        public static IEnumerable<string> GetPalindromes(string text)\n        {\n            return GetSubstrings(text).Where(IsPalindrome).Distinct();\n        }\n\n        public static IEnumerable<string> GetSubstrings(string text)\n        {\n            for (var start = 0; start < text.Length; start++)\n            {\n                for (var length = 1; length <= text.Length - start; length++)\n                {\n                    yield return text.Substring(start, length);\n\n                }\n            }\n        }\n\n        public static bool IsPalindrome(string s)\n        {\n            for (var i = 0; i < s.Length / 2; i++)\n            {\n                if (s[i] != s[s.Length - 1 - i])\n                    return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Palindrome/ConsoleApplication3/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.1\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Palindrome/ConsoleApplication3/ConsoleApplication3.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{B10E4ABF-E579-4906-9BD5-5EA37ACBEA19}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Palindrome</RootNamespace>\n    <AssemblyName>ConsoleApplication3</AssemblyName>\n    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <SccProjectName>SAK</SccProjectName>\n    <SccLocalPath>SAK</SccLocalPath>\n    <SccAuxPath>SAK</SccAuxPath>\n    <SccProvider>SAK</SccProvider>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"SimpleImplementation.cs\" />\n    <Compile Include=\"Implementation1.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"Doc\\Beginning.pptx\" />\n    <None Include=\"Doc\\Conclusion.pptx\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Palindrome/ConsoleApplication3/Implementation1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Palindrome\n{\n    class Implementation1\n    {\n#if DEBUG\n        public static int count;\n#endif\n\n        public static IEnumerable<string> GetPalindromes(string text)\n        {\n            return GetSubstrings(text, IsPalindrome).Distinct();\n        }\n\n        public static IEnumerable<string> GetSubstrings(string text)\n        {\n            for (var start = 0; start < text.Length; start++)\n            {\n                for (var length = 1; length <= text.Length - start; length++)\n                {\n                    yield return text.Substring(start, length);\n                }\n            }\n        }\n\n        private delegate bool SubstringPredicate(string text, int startIndex, int length);\n\n        private static IEnumerable<string> GetSubstrings(string text, SubstringPredicate condition)\n        {\n            for (var start = 0; start < text.Length; start++)\n            {\n                for (var length = 1; length <= text.Length - start; length++)\n                {\n                    if (condition(text, start, length)) // 判定ではじいてから\n                        yield return text.Substring(start, length);\n                }\n            }\n        }\n\n        public static bool IsPalindrome(string text, int startIndex, int length)\n        {\n            for (var i = 0; i < length / 2; i++)\n            {\n#if DEBUG\n                ++count;\n#endif\n                if (text[i + startIndex] != text[startIndex + length - 1 - i])\n                    return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Palindrome/ConsoleApplication3/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\n\nnamespace Palindrome\n{\n    class Program\n    {\n        static void Main()\n        {\n            var r = new Random();\n\n            var sampleData = new[]\n            {\n                new { Tag = \"手打ちデータ1\", Text = \"abcbad\" },\n                new { Tag = \"手打ちデータ2\", Text = \"aaaaaaaaaabowijaoiwejroasafasdfasaaaaabbbbcbbbbaaoiwejatow\" },\n                new { Tag = \"手打ちデータ3\", Text = \"oe4itjaoewrgosergoishjreioushzudfizasdnfkjdnfvlmxoisrejaoweshgtriuaerngkjrsnrkljsnfkdlmszrhgaiuewhrtiouarehnpinrmxlkndl\" },\n                // アルファベット（26文字）想定\n                new { Tag = \"26種500文字\", Text = CreateText(r, 500, 26) },\n                new { Tag = \"同1000文字\", Text = CreateText(r, 1000, 26) },\n                new { Tag = \"同2000文字\", Text = CreateText(r, 2000, 26) },\n                new { Tag = \"同4000文字\", Text = CreateText(r, 4000, 26) },\n                // 全部同じ文字 = おそらくワーストケース O(n^3)\n                new { Tag = \"全部同じ100文字\", Text = CreateText(r, 100, 1) },\n                new { Tag = \"同200文字\", Text = CreateText(r, 200, 1) },\n                new { Tag = \"同400文字\", Text = CreateText(r, 400, 1) },\n                new { Tag = \"同800文字\", Text = CreateText(r, 800, 1) },\n            };\n\n            foreach (var data in sampleData)\n            {\n                Console.WriteLine(data.Tag);\n                //TestGetSubstrings(data.Text);\n                TestGetPalindromes(data.Text);\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"random\"></param>\n        /// <param name=\"length\">生成したいテキストの文字数。</param>\n        /// <param name=\"charCount\">文字の種類の数。</param>\n        /// <returns></returns>\n        static string CreateText(Random random, int length, int charCount)\n        {\n            var c = Enumerable.Range(0, length).Select(_ => (char)('a' + random.Next(0, charCount)));\n            return new string(c.ToArray());\n        }\n\n        private static void TestGetSubstrings(string text)\n        {\n            var expected = SimpleImplementation.GetSubstrings(text).ToArray();\n            var actual = Implementation1.GetSubstrings(text).ToArray();\n\n            if (!expected.OrderBy(x => x).SequenceEqual(actual.OrderBy(x => x)))\n            {\n                Console.WriteLine(\"error GetSbustrings\");\n            }\n        }\n\n        private static void TestGetPalindromes(string text)\n        {\n            var sw = new Stopwatch();\n            SimpleImplementation.count = 0;\n            sw.Restart();\n            var expected = SimpleImplementation.GetPalindromes(text).ToArray();\n            sw.Stop();\n            var simpleCount = SimpleImplementation.count;\n            var simpleTime = sw.Elapsed;\n\n            Implementation1.count = 0;\n            sw.Restart();\n            var actual = Implementation1.GetPalindromes(text).ToArray();\n            sw.Stop();\n            var newCount = Implementation1.count;\n            var newTime = sw.Elapsed;\n\n            Console.WriteLine(\"べた実装 {0}, {2}. 新実装 {1}, {3}\", simpleCount, newCount, simpleTime, newTime);\n\n            if (!expected.OrderBy(x => x).SequenceEqual(actual.OrderBy(x => x)))\n            {\n                Console.WriteLine(\"error GetPalindromes\");\n\n                Console.WriteLine(string.Join(\", \", expected));\n                Console.WriteLine(string.Join(\", \", actual));\n            }\n        }\n\n        private static void Write(string text)\n        {\n            Console.WriteLine(\"----- substrings -----\");\n            foreach (var x in Implementation1.GetSubstrings(text))\n            {\n                Console.WriteLine(x);\n            }\n\n            Console.WriteLine(\"----- palindromes -----\");\n            foreach (var x in Implementation1.GetPalindromes(text))\n            {\n                Console.WriteLine(x);\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "Palindrome/ConsoleApplication3/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ConsoleApplication3\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApplication3\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"f150f002-c680-4a0b-a9ce-e7480d5810fe\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Palindrome/ConsoleApplication3/SimpleImplementation.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\n\nnamespace Palindrome\n{\n    class SimpleImplementation\n    {\n#if DEBUG\n        public static int count;\n#endif\n\n        public static IEnumerable<string> GetPalindromes(string text)\n        {\n            return GetSubstrings(text).Where(IsPalindrome).Distinct();\n        }\n\n        public static IEnumerable<string> GetSubstrings(string text)\n        {\n            for (var start = 0; start < text.Length; start++)\n            {\n                for (var length = 1; length <= text.Length - start; length++)\n                {\n                    yield return text.Substring(start, length);\n                }\n            }\n        }\n\n        public static bool IsPalindrome(string s)\n        {\n            for (var i = 0; i < s.Length / 2; i++)\n            {\n#if DEBUG\n                ++count;\n#endif\n                if (s[i] != s[s.Length - 1 - i])\n                    return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Palindrome/ConsoleApplication4/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.1\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Palindrome/ConsoleApplication4/ConsoleApplication4.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{A387A0F8-DFC1-4B6C-8AD0-E412A43F6626}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Palindrome</RootNamespace>\n    <AssemblyName>ConsoleApplication4</AssemblyName>\n    <TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <SccProjectName>SAK</SccProjectName>\n    <SccLocalPath>SAK</SccLocalPath>\n    <SccAuxPath>SAK</SccAuxPath>\n    <SccProvider>SAK</SccProvider>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Implementation1.cs\" />\n    <Compile Include=\"Implementation2.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"SimpleImplementation.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"Doc\\Beginning.pptx\" />\n    <None Include=\"Doc\\Conclusion.pptx\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Palindrome/ConsoleApplication4/Implementation1.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Palindrome\n{\n    class Implementation1\n    {\n#if DEBUG\n        public static int count;\n#endif\n\n        public static IEnumerable<string> GetPalindromes(string text)\n        {\n            return GetSubstrings(text, IsPalindrome).Distinct();\n        }\n\n        public static IEnumerable<string> GetSubstrings(string text)\n        {\n            for (var start = 0; start < text.Length; start++)\n            {\n                for (var length = 1; length <= text.Length - start; length++)\n                {\n                    yield return text.Substring(start, length);\n                }\n            }\n        }\n\n        private delegate bool SubstringPredicate(string text, int startIndex, int length);\n\n        private static IEnumerable<string> GetSubstrings(string text, SubstringPredicate condition)\n        {\n            for (var start = 0; start < text.Length; start++)\n            {\n                for (var length = 1; length <= text.Length - start; length++)\n                {\n                    if (condition(text, start, length)) // 判定ではじいてから\n                        yield return text.Substring(start, length);\n                }\n            }\n        }\n\n        public static bool IsPalindrome(string text, int startIndex, int length)\n        {\n            for (var i = 0; i < length / 2; i++)\n            {\n#if DEBUG\n                ++count;\n#endif\n                if (text[i + startIndex] != text[startIndex + length - 1 - i])\n                    return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Palindrome/ConsoleApplication4/Implementation2.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\n\nnamespace Palindrome\n{\n    class Implementation2\n    {\n#if DEBUG\n        public static int count;\n#endif\n        public static IEnumerable<string> GetSubstrings(string text)\n        {\n            // 奇数\n            for (var middleIndex = 0; middleIndex < text.Length; middleIndex++)\n            {\n                for (int i = 0; middleIndex - i >= 0 && middleIndex + i < text.Length; i++)\n                {\n                    yield return text.Substring(middleIndex - i, 2 * i + 1);\n                }\n            }\n\n            // 偶数\n            for (var middleIndex = 0; middleIndex < text.Length - 1; middleIndex++)\n            {\n                for (int i = 0; middleIndex - i >= 0 && middleIndex + i + 1 < text.Length; i++)\n                {\n                    yield return text.Substring(middleIndex - i, 2 * i + 2);\n                }\n            }\n        }\n\n        public static IEnumerable<string> GetPalindromes(string text)\n        {\n            return GetPalindromesInternal(text).Distinct();\n        }\n\n        public static IEnumerable<string> GetPalindromesInternal(string text)\n        {\n            // 奇数\n            for (var middleIndex = 0; middleIndex < text.Length; middleIndex++)\n            {\n                for (var i = 0; ; i++)\n                {\n#if DEBUG\n                    ++count;\n#endif\n                    var start = middleIndex - i;\n                    var length = 2 * i + 1;\n                    var last = start + length - 1;\n\n                    if (start < 0 || last >= text.Length)\n                        break;\n                    if (text[start] != text[start + length - 1])\n                        break;\n                    yield return text.Substring(start, length);\n                }\n            }\n\n            // 偶数\n            for (var middleIndex = 0; middleIndex < text.Length - 1; middleIndex++)\n            {\n                for (var i = 0; ; i++)\n                {\n#if DEBUG\n                    ++count;\n#endif\n                    var start = middleIndex - i;\n                    var length = 2 * i + 2;\n                    var last = start + length - 1;\n\n                    if (start < 0 || last >= text.Length)\n                        break;\n                    if (text[start] != text[start + length - 1])\n                        break;\n                    yield return text.Substring(start, length);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Palindrome/ConsoleApplication4/Program.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\nusing System.Linq;\n\nnamespace Palindrome\n{\n    class Program\n    {\n        static void Main()\n        {\n            var r = new Random();\n\n            var sampleData = new[]\n            {\n                new { Tag = \"手打ちデータ1\", Text = \"abcbad\" },\n                new { Tag = \"手打ちデータ2\", Text = \"aaaaaaaaaabowijaoiwejroasafasdfasaaaaabbbbcbbbbaaoiwejatow\" },\n                new { Tag = \"手打ちデータ3\", Text = \"oe4itjaoewrgosergoishjreioushzudfizasdnfkjdnfvlmxoisrejaoweshgtriuaerngkjrsnrkljsnfkdlmszrhgaiuewhrtiouarehnpinrmxlkndl\" },\n                // アルファベット（26文字）想定\n                new { Tag = \"26種500文字\", Text = CreateText(r, 500, 26) },\n                new { Tag = \"同1000文字\", Text = CreateText(r, 1000, 26) },\n                new { Tag = \"同2000文字\", Text = CreateText(r, 2000, 26) },\n                new { Tag = \"同4000文字\", Text = CreateText(r, 4000, 26) },\n                // 全部同じ文字 = おそらくワーストケース O(n^3)\n                new { Tag = \"全部同じ100文字\", Text = CreateText(r, 100, 1) },\n                new { Tag = \"同200文字\", Text = CreateText(r, 200, 1) },\n                new { Tag = \"同400文字\", Text = CreateText(r, 400, 1) },\n                new { Tag = \"同800文字\", Text = CreateText(r, 800, 1) },\n            };\n\n            foreach (var data in sampleData)\n            {\n                Console.WriteLine(data.Tag);\n                //TestGetSubstrings(data.Text);\n                TestGetPalindromes(data.Text);\n            }\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"random\"></param>\n        /// <param name=\"length\">生成したいテキストの文字数。</param>\n        /// <param name=\"charCount\">文字の種類の数。</param>\n        /// <returns></returns>\n        static string CreateText(Random random, int length, int charCount)\n        {\n            var c = Enumerable.Range(0, length).Select(_ => (char)('a' + random.Next(0, charCount)));\n            return new string(c.ToArray());\n        }\n\n        private static void TestGetSubstrings(string text)\n        {\n            var expected = SimpleImplementation.GetSubstrings(text).ToArray();\n            var actual = Implementation2.GetSubstrings(text).ToArray();\n\n            if (!expected.OrderBy(x => x).SequenceEqual(actual.OrderBy(x => x)))\n            {\n                Console.WriteLine(\"error GetSbustrings\");\n            }\n        }\n\n        private static void TestGetPalindromes(string text)\n        {\n            var sw = new Stopwatch();\n            Implementation1.count = 0;\n            sw.Restart();\n            var expected = Implementation1.GetPalindromes(text).ToArray();\n            sw.Stop();\n            var simpleCount = Implementation1.count;\n            var simpleTime = sw.Elapsed;\n\n            Implementation2.count = 0;\n            sw.Restart();\n            var actual = Implementation2.GetPalindromes(text).ToArray();\n            sw.Stop();\n            var newCount = Implementation2.count;\n            var newTime = sw.Elapsed;\n\n            Console.WriteLine(\"べた実装 {0}, {2}. 新実装 {1}, {3}\", simpleCount, newCount, simpleTime, newTime);\n\n            if (!expected.OrderBy(x => x).SequenceEqual(actual.OrderBy(x => x)))\n            {\n                Console.WriteLine(\"error GetPalindromes\");\n\n                Console.WriteLine(string.Join(\", \", expected));\n                Console.WriteLine(string.Join(\", \", actual));\n            }\n        }\n\n        private static void Write(string text)\n        {\n            Console.WriteLine(\"----- substrings -----\");\n            foreach (var x in Implementation1.GetSubstrings(text))\n            {\n                Console.WriteLine(x);\n            }\n\n            Console.WriteLine(\"----- palindromes -----\");\n            foreach (var x in Implementation1.GetPalindromes(text))\n            {\n                Console.WriteLine(x);\n            }\n        }\n\n    }\n}"
  },
  {
    "path": "Palindrome/ConsoleApplication4/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ConsoleApplication4\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApplication4\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2014\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// 次の GUID は、このプロジェクトが COM に公開される場合の、typelib の ID です\n[assembly: Guid(\"aaf26fd0-ebf6-4720-885a-31338d40a26f\")]\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Palindrome/ConsoleApplication4/SimpleImplementation.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\n\nnamespace Palindrome\n{\n    class SimpleImplementation\n    {\n#if DEBUG\n        public static int count;\n#endif\n\n        public static IEnumerable<string> GetPalindromes(string text)\n        {\n            return GetSubstrings(text).Where(IsPalindrome).Distinct();\n        }\n\n        public static IEnumerable<string> GetSubstrings(string text)\n        {\n            for (var start = 0; start < text.Length; start++)\n            {\n                for (var length = 1; length <= text.Length - start; length++)\n                {\n                    yield return text.Substring(start, length);\n                }\n            }\n        }\n\n        public static bool IsPalindrome(string s)\n        {\n            for (var i = 0; i < s.Length / 2; i++)\n            {\n#if DEBUG\n                ++count;\n#endif\n                if (s[i] != s[s.Length - 1 - i])\n                    return false;\n            }\n            return true;\n        }\n    }\n}\n"
  },
  {
    "path": "Palindrome/Palindrome.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 2013\nVisualStudioVersion = 12.0.30219.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApplication1\", \"ConsoleApplication1\\ConsoleApplication1.csproj\", \"{F2C71B9C-957D-4B58-A2A0-D7B5B552358E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApplication2\", \"ConsoleApplication2\\ConsoleApplication2.csproj\", \"{0D6BD06C-97B4-4121-BB96-858CAB3F8D70}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApplication3\", \"ConsoleApplication3\\ConsoleApplication3.csproj\", \"{B10E4ABF-E579-4906-9BD5-5EA37ACBEA19}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ConsoleApplication4\", \"ConsoleApplication4\\ConsoleApplication4.csproj\", \"{A387A0F8-DFC1-4B6C-8AD0-E412A43F6626}\"\nEndProject\nGlobal\n\tGlobalSection(TeamFoundationVersionControl) = preSolution\n\t\tSccNumberOfProjects = 5\n\t\tSccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C}\n\t\tSccTeamFoundationServer = https://ufcpp.visualstudio.com//defaultcollection\n\t\tSccLocalPath0 = .\n\t\tSccProjectUniqueName1 = ConsoleApplication1\\\\ConsoleApplication1.csproj\n\t\tSccProjectName1 = ConsoleApplication1\n\t\tSccLocalPath1 = ConsoleApplication1\n\t\tSccProjectUniqueName2 = ConsoleApplication2\\\\ConsoleApplication2.csproj\n\t\tSccProjectName2 = ConsoleApplication2\n\t\tSccLocalPath2 = ConsoleApplication2\n\t\tSccProjectUniqueName3 = ConsoleApplication3\\\\ConsoleApplication3.csproj\n\t\tSccProjectName3 = ConsoleApplication3\n\t\tSccLocalPath3 = ConsoleApplication3\n\t\tSccProjectUniqueName4 = ConsoleApplication4\\\\ConsoleApplication4.csproj\n\t\tSccProjectName4 = ConsoleApplication4\n\t\tSccLocalPath4 = ConsoleApplication4\n\tEndGlobalSection\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{F2C71B9C-957D-4B58-A2A0-D7B5B552358E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F2C71B9C-957D-4B58-A2A0-D7B5B552358E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F2C71B9C-957D-4B58-A2A0-D7B5B552358E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F2C71B9C-957D-4B58-A2A0-D7B5B552358E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0D6BD06C-97B4-4121-BB96-858CAB3F8D70}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0D6BD06C-97B4-4121-BB96-858CAB3F8D70}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0D6BD06C-97B4-4121-BB96-858CAB3F8D70}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0D6BD06C-97B4-4121-BB96-858CAB3F8D70}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B10E4ABF-E579-4906-9BD5-5EA37ACBEA19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B10E4ABF-E579-4906-9BD5-5EA37ACBEA19}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B10E4ABF-E579-4906-9BD5-5EA37ACBEA19}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B10E4ABF-E579-4906-9BD5-5EA37ACBEA19}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{A387A0F8-DFC1-4B6C-8AD0-E412A43F6626}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{A387A0F8-DFC1-4B6C-8AD0-E412A43F6626}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{A387A0F8-DFC1-4B6C-8AD0-E412A43F6626}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{A387A0F8-DFC1-4B6C-8AD0-E412A43F6626}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "README.md",
    "content": "++C++; 向けサンプル\n===========\n\nhttp://ufcpp.net/ 向けのサンプル ソースコード置き場\n\n過去の分にさかのぼってソースコードを入れていくかは不明。その意思はあり。\n"
  },
  {
    "path": "Scribble/ContextFreeTask/ContextFreeTask.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.25909.2\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SampleWpfApp1\", \"SampleWpfApp1\\SampleWpfApp1.csproj\", \"{5298D6DC-21DC-4291-9735-74A95FBA926C}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{5298D6DC-21DC-4291-9735-74A95FBA926C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5298D6DC-21DC-4291-9735-74A95FBA926C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5298D6DC-21DC-4291-9735-74A95FBA926C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5298D6DC-21DC-4291-9735-74A95FBA926C}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Scribble/ContextFreeTask/SampleWpfApp1/App.xaml",
    "content": "﻿<Application x:Class=\"SampleWpfApp1.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             xmlns:local=\"clr-namespace:SampleWpfApp1\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Scribble/ContextFreeTask/SampleWpfApp1/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Windows;\n\nnamespace SampleWpfApp1\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Scribble/ContextFreeTask/SampleWpfApp1/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"SampleWpfApp1.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"\n        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n        xmlns:local=\"clr-namespace:SampleWpfApp1\"\n        mc:Ignorable=\"d\"\n        Title=\"MainWindow\" Height=\"350\" Width=\"525\">\n    <Grid>\n        <StackPanel>\n            <Button Click=\"Button_Click\">Run</Button>\n            <TextBlock x:Name=\"Output\"/>\n        </StackPanel>\n    </Grid>\n</Window>\n"
  },
  {
    "path": "Scribble/ContextFreeTask/SampleWpfApp1/MainWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Threading.Tasks;\nusing System.Windows;\nusing ContextFreeTasks;\n\nnamespace SampleWpfApp1\n{\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n            _mainThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;\n        }\n        private int _mainThreadId;\n\n        // 単体テストプロジェクト作るべきなんだけど、単体テストプロジェクト向けのメッセージポンプ作るのがめんどくさかったのでWPF上で実行\n        private async void Button_Click(object sender, RoutedEventArgs e)\n        {\n            try\n            {\n                Output.Text = \"running...\";\n                await A1(10);\n                await B1(10);\n                Output.Text = \"done\";\n            }\n            catch(Exception ex)\n            {\n                Output.Text = \"error: \" + ex;\n            }\n        }\n\n        private void OnMainThread()\n        {\n            var threadId = System.Threading.Thread.CurrentThread.ManagedThreadId;\n            if (_mainThreadId != threadId) throw new InvalidOperationException();\n        }\n\n        private void OnPoolThread()\n        {\n            var threadId = System.Threading.Thread.CurrentThread.ManagedThreadId;\n            if (_mainThreadId == threadId) throw new InvalidOperationException();\n        }\n\n        private async Task<string> A1(int n)\n        {\n            OnMainThread();\n            var s = await A2(n);\n            OnPoolThread();\n            await Task.Delay(100);\n            OnPoolThread();\n            await A3();\n            OnPoolThread();\n            return s;\n        }\n\n        private async ContextFreeTask<string> A2(int n)\n        {\n            await Task.Delay(100);\n            OnPoolThread();\n            await Task.Delay(100);\n            OnPoolThread();\n            await A3();\n            OnPoolThread();\n            return n.ToString();\n        }\n\n        private async ContextFreeTask A3()\n        {\n            await Task.Delay(100);\n            OnPoolThread();\n        }\n\n        private async Task<string> B1(int n)\n        {\n            OnMainThread();\n            var s = await B2(n);\n            OnMainThread();\n            await Task.Delay(100);\n            OnMainThread();\n            await B3();\n            OnMainThread();\n            return s;\n        }\n\n        private async Task<string> B2(int n)\n        {\n            await Task.Delay(100);\n            OnMainThread();\n            await Task.Delay(100);\n            OnMainThread();\n            await B3();\n            OnMainThread();\n            return n.ToString();\n        }\n\n        private async Task B3()\n        {\n            await Task.Delay(100);\n            OnMainThread();\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ContextFreeTask/SampleWpfApp1/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"SampleWpfApp1\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"SampleWpfApp1\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n//In order to begin building localizable applications, set\n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\n//inside a <PropertyGroup>.  For example, if you are using US english\n//in your source files, set the <UICulture> to en-US.  Then uncomment\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\n//the line below to match the UICulture setting in the project file.\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n                                     //(used if a resource is not found in the page,\n                                     // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n                                              //(used if a resource is not found in the page,\n                                              // app, or any theme specific resource dictionaries)\n)]\n\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Scribble/ContextFreeTask/SampleWpfApp1/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace SampleWpfApp1.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"SampleWpfApp1.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ContextFreeTask/SampleWpfApp1/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Scribble/ContextFreeTask/SampleWpfApp1/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace SampleWpfApp1.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"15.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ContextFreeTask/SampleWpfApp1/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "Scribble/ContextFreeTask/SampleWpfApp1/SampleWpfApp1.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{5298D6DC-21DC-4291-9735-74A95FBA926C}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <RootNamespace>SampleWpfApp1</RootNamespace>\n    <AssemblyName>SampleWpfApp1</AssemblyName>\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <WarningLevel>4</WarningLevel>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <Prefer32Bit>false</Prefer32Bit>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xaml\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Page Include=\"MainWindow.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"MainWindow.xaml.cs\">\n      <DependentUpon>MainWindow.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <None Include=\"app.config\" />\n    <None Include=\"project.json\" />\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "Scribble/ContextFreeTask/SampleWpfApp1/app.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n<startup><supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\"/></startup></configuration>\n"
  },
  {
    "path": "Scribble/ContextFreeTask/SampleWpfApp1/project.json",
    "content": "﻿{\n  \"frameworks\": {\n    \"net462\": {}\n  },\n  \"runtimes\": {\n    \"win\": {},\n    \"win-anycpu\": {},\n    \"win-x64\": {}\n  },\n  \"dependencies\": {\n    \"ContextFreeTasks\": \"0.1.0\"\n  }\n}"
  },
  {
    "path": "Scribble/FindSingleStatementBody/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Scribble/FindSingleStatementBody/CodeAnalysisForCSharp6.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{250D56BB-432A-4CF7-BE6A-6C5FF542D0E6}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>CodeAnalysisForCSharp6</RootNamespace>\n    <AssemblyName>CodeAnalysisForCSharp6</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.CodeAnalysis\">\n      <HintPath>..\\packages\\Microsoft.CodeAnalysis.Common.1.0.0-rc1\\lib\\net45\\Microsoft.CodeAnalysis.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CodeAnalysis.CSharp\">\n      <HintPath>..\\packages\\Microsoft.CodeAnalysis.CSharp.1.0.0-rc1\\lib\\net45\\Microsoft.CodeAnalysis.CSharp.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CodeAnalysis.CSharp.Desktop\">\n      <HintPath>..\\packages\\Microsoft.CodeAnalysis.CSharp.1.0.0-rc1\\lib\\net45\\Microsoft.CodeAnalysis.CSharp.Desktop.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CodeAnalysis.CSharp.Workspaces\">\n      <HintPath>..\\packages\\Microsoft.CodeAnalysis.CSharp.Workspaces.1.0.0-rc1\\lib\\net45\\Microsoft.CodeAnalysis.CSharp.Workspaces.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CodeAnalysis.CSharp.Workspaces.Desktop\">\n      <HintPath>..\\packages\\Microsoft.CodeAnalysis.CSharp.Workspaces.1.0.0-rc1\\lib\\net45\\Microsoft.CodeAnalysis.CSharp.Workspaces.Desktop.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CodeAnalysis.Desktop\">\n      <HintPath>..\\packages\\Microsoft.CodeAnalysis.Common.1.0.0-rc1\\lib\\net45\\Microsoft.CodeAnalysis.Desktop.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CodeAnalysis.Workspaces\">\n      <HintPath>..\\packages\\Microsoft.CodeAnalysis.Workspaces.Common.1.0.0-rc1\\lib\\net45\\Microsoft.CodeAnalysis.Workspaces.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.CodeAnalysis.Workspaces.Desktop\">\n      <HintPath>..\\packages\\Microsoft.CodeAnalysis.Workspaces.Common.1.0.0-rc1\\lib\\net45\\Microsoft.CodeAnalysis.Workspaces.Desktop.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Collections.Immutable, Version=1.1.33.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL\">\n      <Private>True</Private>\n      <HintPath>..\\packages\\System.Collections.Immutable.1.1.33-beta\\lib\\portable-net45+win8+wp8+wpa81\\System.Collections.Immutable.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Composition.AttributedModel\">\n      <HintPath>..\\packages\\Microsoft.Composition.1.0.27\\lib\\portable-net45+win8+wp8+wpa81\\System.Composition.AttributedModel.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Composition.Convention\">\n      <HintPath>..\\packages\\Microsoft.Composition.1.0.27\\lib\\portable-net45+win8+wp8+wpa81\\System.Composition.Convention.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Composition.Hosting\">\n      <HintPath>..\\packages\\Microsoft.Composition.1.0.27\\lib\\portable-net45+win8+wp8+wpa81\\System.Composition.Hosting.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Composition.Runtime\">\n      <HintPath>..\\packages\\Microsoft.Composition.1.0.27\\lib\\portable-net45+win8+wp8+wpa81\\System.Composition.Runtime.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Composition.TypedParts\">\n      <HintPath>..\\packages\\Microsoft.Composition.1.0.27\\lib\\portable-net45+win8+wp8+wpa81\\System.Composition.TypedParts.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Reflection.Metadata\">\n      <HintPath>..\\packages\\System.Reflection.Metadata.1.0.18-beta\\lib\\portable-net45+win8\\System.Reflection.Metadata.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"MethodAnalyzer.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"PropertyAnalysis.cs\" />\n    <Compile Include=\"SolutionLoader.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Analyzer Include=\"..\\packages\\Microsoft.CodeAnalysis.Analyzers.1.0.0-rc1\\tools\\analyzers\\C#\\Microsoft.CodeAnalysis.CSharp.Analyzers.dll\" />\n    <Analyzer Include=\"..\\packages\\Microsoft.CodeAnalysis.Analyzers.1.0.0-rc1\\tools\\analyzers\\Microsoft.CodeAnalysis.Analyzers.dll\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Scribble/FindSingleStatementBody/MethodAnalyzer.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\n\nnamespace CodeAnalysisForCSharp6\n{\n    /// <summary>\n    /// メソッド関連の解析。\n    /// </summary>\n    static class MethodAnalyzer\n    {\n        public static IEnumerable<MethodSyntaxInfo> GetMethods(this SolutionLoader s)\n        {\n            foreach (var tree in s.SyntaxTrees)\n            {\n                var root = tree.GetRoot();\n\n                foreach (var cd in root.DescendantNodes().Where(n => n.Kind() == SyntaxKind.ClassDeclaration).Cast<ClassDeclarationSyntax>())\n                {\n                    foreach (var m in cd.ChildNodes().Where(n => n.Kind() == SyntaxKind.MethodDeclaration).Cast<MethodDeclarationSyntax>())\n                    {\n                        yield return new MethodSyntaxInfo(tree, m);\n                    }\n                }\n            }\n        }\n    }\n\n    /// <summary>\n    /// メソッドの構文解析結果。\n    /// </summary>\n    class MethodSyntaxInfo\n    {\n        public SyntaxTree Tree { get; }\n        public MethodDeclarationSyntax Method { get; }\n\n        public MethodSyntaxInfo(SyntaxTree tree, MethodDeclarationSyntax method)\n        {\n            Tree = tree;\n            Method = method;\n\n            HasBody = method.Modifiers.All(x => x.Text != \"abstract\" && x.Text != \"partial\");\n            StatementCount = method.Body.Statements.Count;\n        }\n\n        /// <summary>\n        /// ボディを持つ(= abstract, partial ではない)。\n        /// </summary>\n        public bool HasBody { get; }\n\n        /// <summary>\n        /// ステートメント数。\n        /// </summary>\n        public int StatementCount { get; }\n    }\n}\n"
  },
  {
    "path": "Scribble/FindSingleStatementBody/Program.cs",
    "content": "﻿using Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\nusing Microsoft.CodeAnalysis.Text;\nusing System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace CodeAnalysisForCSharp6\n{\n    class Programs\n    {\n        static void Main(string[] args)\n        {\n            if (args.Length < 1)\n            {\n                Console.WriteLine(\"引数にソリューション名を指定してください\");\n                return;\n            }\n\n            ReadCsharpSourceCodes(args[0]).Wait();\n        }\n\n        private static async Task ReadCsharpSourceCodes(string path)\n        {\n            Console.WriteLine(\"Build started\");\n\n            var s = await SolutionLoader.LoadAsync(path);\n\n            FindGetOnlyPropertyWhichHasSingleStatement(s);\n            FindMethodWhichHasSingleStatement(s);\n        }\n\n        private static void FindGetOnlyPropertyWhichHasSingleStatement(SolutionLoader solution)\n        {\n            var items = (\n                from p in solution.GetProperties()\n                where p.HasBody\n                select p\n                ).ToArray();\n\n            var total = 0;\n            var getOnly = 0;\n            var singleStatement = 0;\n            var fieldAccess = 0;\n            var auto = 0;\n            var privateSet = 0;\n\n            foreach (var x in items)\n            {\n                total++;\n                if (x.IsGetOnly) getOnly++;\n                if (x.HasSingleStatement) singleStatement++;\n                if (x.BackingField != null) fieldAccess++;\n                if (x.IsAuto) auto++;\n                if (x.IsAuto && x.HasPrivateSet) privateSet++;\n            }\n\n            Console.WriteLine($\"total: {total}, get-only: {getOnly}, single stetement: {singleStatement}, field access: {fieldAccess}, auto: {auto}, private set: {privateSet}\");\n            Console.WriteLine($\"プロパティ全体の {singleStatement}個({(double)singleStatement / total * 100: 0.00}%) がステートメント1個だけ\");\n            Console.WriteLine($\"プロパティ全体の {(double)singleStatement / total * 100: 0.00}%\");\n\n            Console.WriteLine($\"get だけのプロパティのうち {(double)singleStatement / getOnly * 100: 0.00}% が式1個だけ\");\n            Console.WriteLine($\"式1つだけプロパティのうち {(double)fieldAccess / singleStatement * 100: 0.00}% が単なるフィールド アクセス\");\n\n            Console.WriteLine($\"プロパティ全体の {auto}個({(double)auto / total * 100: 0.00}%) が自動実装\");\n            Console.WriteLine($\"自動プロパティのうち {privateSet}個({(double)privateSet / auto * 100: 0.00}%) が private set\");\n        }\n\n        private static bool HasNoBody(PropertyDeclarationSyntax p)\n        {\n            return p.Modifiers.Any(x => x.Text == \"abstract\");\n        }\n\n        private static void FindMethodWhichHasSingleStatement(SolutionLoader solution)\n        {\n            var groups = (\n                from m in solution.GetMethods()\n                where m.HasBody\n                group m by m.StatementCount into g\n                orderby g.Key\n                select new { g.Key, Count = g.Count() }\n                ).ToArray();\n\n            var sum = 0;\n            foreach (var x in groups)\n            {\n                //Console.WriteLine($\"ステートメント数が {x.Key} 個のメソッドは {x.Count} 個ある\");\n                sum += x.Count;\n            }\n\n            Console.WriteLine($\"合計: {sum}\");\n            var one = groups.First(x => x.Key == 1);\n            Console.WriteLine($\"メソッドのうち {one.Count}個({(double)one.Count / sum * 100: 0.00}%) がステートメント1個だけ\");\n        }\n\n        private static bool HasNoBody(MethodDeclarationSyntax m)\n        {\n            return m.Modifiers.Any(x => x.Text == \"abstract\" || x.Text == \"partial\");\n        }\n\n        private static IEnumerable<MethodDeclarationSyntax> GetMethods(Solution solution)\n        {\n            foreach (var project in solution.Projects)\n            {\n                foreach (var doc in project.Documents)\n                {\n                    var text = File.ReadAllText(doc.FilePath);\n                    var tree = CSharpSyntaxTree.ParseText(SourceText.From(text));\n                    var root = tree.GetRoot();\n\n                    foreach (var cd in root.DescendantNodes().Where(n => n.Kind() == SyntaxKind.ClassDeclaration).Cast<ClassDeclarationSyntax>())\n                    {\n                        foreach (var m in cd.ChildNodes().Where(n => n.Kind() == SyntaxKind.MethodDeclaration).Cast<MethodDeclarationSyntax>())\n                        {\n                            yield return m;\n                        }\n                    }\n                }\n            }\n        }\n\n        private static IEnumerable<PropertyDeclarationSyntax> GetProperties(Solution solution)\n        {\n            foreach (var project in solution.Projects)\n            {\n                foreach (var doc in project.Documents)\n                {\n                    var text = File.ReadAllText(doc.FilePath);\n                    var tree = CSharpSyntaxTree.ParseText(SourceText.From(text));\n                    var root = tree.GetRoot();\n\n                    foreach (var cd in root.DescendantNodes().Where(n => n.Kind() == SyntaxKind.ClassDeclaration).Cast<ClassDeclarationSyntax>())\n                    {\n                        foreach (var p in cd.ChildNodes().Where(n => n.Kind() == SyntaxKind.PropertyDeclaration).Cast<PropertyDeclarationSyntax>())\n                        {\n                            yield return p;\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/FindSingleStatementBody/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"CodeAnalysisForCSharp6\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"CodeAnalysisForCSharp6\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"250d56bb-432a-4cf7-be6a-6c5ff542d0e6\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Scribble/FindSingleStatementBody/PropertyAnalysis.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\n\nnamespace CodeAnalysisForCSharp6\n{\n    /// <summary>\n    /// プロパティ関連の解析。\n    /// </summary>\n    static class PropertyAnalysis\n    {\n        public static IEnumerable<PropertySyntaxInfo> GetProperties(this SolutionLoader s)\n        {\n            foreach (var tree in s.SyntaxTrees)\n            {\n                var root = tree.GetRoot();\n\n                foreach (var cd in root.DescendantNodes().Where(n => n.Kind() == SyntaxKind.ClassDeclaration).Cast<ClassDeclarationSyntax>())\n                {\n                    foreach (var p in cd.ChildNodes().Where(n => n.Kind() == SyntaxKind.PropertyDeclaration).Cast<PropertyDeclarationSyntax>())\n                    {\n                        yield return new PropertySyntaxInfo(tree, p);\n                    }\n                }\n            }\n        }\n    }\n\n    /// <summary>\n    /// プロパティの構文解析結果。\n    /// </summary>\n    class PropertySyntaxInfo\n    {\n        public SyntaxTree Tree { get; }\n        public PropertyDeclarationSyntax Property { get; }\n\n        public PropertySyntaxInfo(SyntaxTree tree, PropertyDeclarationSyntax property)\n        {\n            Tree = tree;\n            Property = property;\n            HasBody = property.Modifiers.All(x => x.Text != \"abstract\");\n\n            var hasOnlyOneAccessor = property.AccessorList.Accessors.Count == 1;\n            var getter = property.AccessorList.Accessors.SingleOrDefault(a => a.Keyword.Text == \"get\");\n            var setter = property.AccessorList.Accessors.SingleOrDefault(a => a.Keyword.Text == \"set\");\n\n            IsAuto = (getter != null && getter.Body == null) && (setter != null && setter.Body == null);\n            HasPrivateSet = setter != null && setter.Modifiers.Any(x => x.Text == \"private\");\n\n            IsGetOnly = hasOnlyOneAccessor && getter != null;\n            HasSingleStatement = IsGetOnly && getter != null && getter.Body != null && getter.Body.Statements.Count == 1;\n\n            if (HasSingleStatement)\n            {\n                var statement = getter.Body.Statements[0];\n\n                var ret = statement as ReturnStatementSyntax;\n                if (ret != null)\n                {\n                    var id = ret.Expression as IdentifierNameSyntax;\n\n                    if (id != null)\n                    {\n                        BackingField = tree.GetRoot().DescendantNodes()\n                            .Select(x => x as FieldDeclarationSyntax)\n                            .Where(x => x != null)\n                            .Select(x => x.Declaration.Variables[0].Identifier.Text)\n                            .FirstOrDefault(name => name == id.Identifier.Text);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// ボディを持つ(= abstract ではない)。\n        /// </summary>\n        public bool HasBody { get; }\n\n        /// <summary>\n        /// getter 1つだけを持つ。\n        /// </summary>\n        public bool IsGetOnly { get; }\n\n        /// <summary>\n        /// <see cref=\"IsGetOnly\"/> かつ getter の中身が式1つだけ。\n        /// </summary>\n        public bool HasSingleStatement { get; }\n\n        /// <summary>\n        /// <see cref=\"HasSingleStatement\"/> かつ その1文がバック フィールド参照のとき、その識別子名。\n        /// 条件を満たさないときは null。\n        /// </summary>\n        public string BackingField { get; }\n\n        /// <summary>\n        /// 自動プロパティ。\n        /// </summary>\n        public bool IsAuto { get; }\n\n        /// <summary>\n        /// setter が private。\n        /// </summary>\n        public bool HasPrivateSet { get; }\n    }\n}\n"
  },
  {
    "path": "Scribble/FindSingleStatementBody/SolutionLoader.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.CodeAnalysis;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\nusing Microsoft.CodeAnalysis.Text;\n\nnamespace CodeAnalysisForCSharp6\n{\n    /// <summary>\n    /// ソリューションと、そのソリューション内の全 .cs ファイルのコンパイル結果を持っておくクラス。\n    /// </summary>\n    class SolutionLoader\n    {\n        /// <summary>\n        /// 読み込んだソリューション。\n        /// </summary>\n        public Solution Solution { get; }\n\n        /// <summary>\n        /// <see cref=\"Solution\"/> 内の全 .cs ファイルの構文解析結果。\n        /// </summary>\n        public IEnumerable<SyntaxTree> SyntaxTrees { get; }\n\n        /// <summary>\n        /// <see cref=\"SyntaxTrees\"/> を全部コンパイルした結果。\n        /// </summary>\n        public CSharpCompilation Compilation { get; }\n\n        private SolutionLoader(Solution solution)\n        {\n            Solution = solution;\n            SyntaxTrees = GetSyntaxTrees(solution);\n            Compilation =  CSharpCompilation.Create(\"temp\", SyntaxTrees);\n        }\n\n        /// <summary>\n        /// ソリューション読み込み。\n        /// </summary>\n        /// <param name=\"path\">ソリューションのパス。</param>\n        /// <returns>読み込み結果。</returns>\n        public static async Task<SolutionLoader> LoadAsync(string path)\n        {\n            var w = Microsoft.CodeAnalysis.MSBuild.MSBuildWorkspace.Create();\n            var solution = await w.OpenSolutionAsync(path);\n\n            var solutionName = Path.GetFileName(solution.FilePath);\n\n            return new SolutionLoader(solution);\n        }\n\n        private IEnumerable<SyntaxTree> GetSyntaxTrees(Solution solution)\n        {\n            foreach (var project in solution.Projects)\n            {\n                foreach (var doc in project.Documents)\n                {\n                    var ext = Path.GetExtension(doc.FilePath);\n                    if (ext == \".cs\")\n                    {\n                        var text = File.ReadAllText(doc.FilePath);\n                        yield return CSharpSyntaxTree.ParseText(SourceText.From(text));\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/FindSingleStatementBody/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Microsoft.CodeAnalysis.Analyzers\" version=\"1.0.0-rc1\" targetFramework=\"net45\" />\n  <package id=\"Microsoft.CodeAnalysis.Common\" version=\"1.0.0-rc1\" targetFramework=\"net45\" />\n  <package id=\"Microsoft.CodeAnalysis.CSharp\" version=\"1.0.0-rc1\" targetFramework=\"net45\" />\n  <package id=\"Microsoft.CodeAnalysis.CSharp.Workspaces\" version=\"1.0.0-rc1\" targetFramework=\"net45\" />\n  <package id=\"Microsoft.CodeAnalysis.Workspaces.Common\" version=\"1.0.0-rc1\" targetFramework=\"net45\" />\n  <package id=\"Microsoft.Composition\" version=\"1.0.27\" targetFramework=\"net45\" />\n  <package id=\"System.Collections.Immutable\" version=\"1.1.33-beta\" targetFramework=\"net45\" />\n  <package id=\"System.Reflection.Metadata\" version=\"1.0.18-beta\" targetFramework=\"net45\" />\n</packages>"
  },
  {
    "path": "Scribble/Inventories/DictionaryInventory.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reactive;\nusing System.Reactive.Subjects;\n\nnamespace Inventories\n{\n    /// <summary>\n    /// A simple implementation of <see cref=\"IInventory{T}\"/> by using <see cref=\"Dictionary{TKey, TValue}\"/>.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public class DictionaryInventory<T> : IObservableInventory<T>, IChangeable<T>, IEnumerable<T>\n        where T : IIdentifiable\n    {\n        Dictionary<int, T> _items = new Dictionary<int, T>();\n\n        public T GetItem(int id)\n        {\n            T x;\n            return _items.TryGetValue(id, out x) ? x : default(T);\n        }\n\n        public IEnumerable<T> Items { get { return _items.Values; } }\n        public IEnumerable<int> Ids { get { return _items.Keys; } }\n\n        public IObservable<EventPattern<ItemChangedArgs<T>>> Changed { get { return _Changed; } }\n        private Subject<EventPattern<ItemChangedArgs<T>>> _Changed = new Subject<EventPattern<ItemChangedArgs<T>>>();\n\n        private IEnumerable<T> Except(IEnumerable<T> first, IEnumerable<T> second)\n        {\n            if (first == null && second == null) return null;\n            if (first == null) return second.ToArray();\n            if (second == null) return first.ToArray();\n            return first.Except(second, IdComparer<T>.Singleton).ToArray();\n        }\n\n        public void Change(ItemChangedArgs<T> args)\n        {\n            switch (args.Action)\n            {\n                case ItemChangedAction.Add:\n                    _items.Add(args.Item.Id, args.Item);\n                    break;\n                case ItemChangedAction.Remove:\n                    if (args.Id.HasValue)\n                    {\n                        var id = args.Id.Value;\n                        T removed;\n                        if (_items.TryGetValue(id, out removed))\n                            args = ItemChangedArgs.Remove(removed);\n                        _items.Remove(id);\n                    }\n                    else _items.Remove(args.Item.Id);\n                    break;\n                case ItemChangedAction.Update:\n                    {\n                        T removed;\n                        if (_items.TryGetValue(args.Item.Id, out removed))\n                            args = ItemChangedArgs.Update(args.Item, removed);\n                        _items[args.Item.Id] = args.Item;\n                    }\n                    break;\n                case ItemChangedAction.Reset:\n                    {\n                        var newItems = args.NewItems;\n                        var oldItems = _items.Values;\n                        var removed = Except(oldItems, newItems);\n                        var added = Except(newItems, oldItems);\n\n                        _items.Clear();\n                        if (newItems != null)\n                            foreach (var item in newItems)\n                                _items[item.Id] = item;\n\n                        args = ItemChangedArgs.Reset(newItems, oldItems);\n                    }\n                    break;\n                default:\n                    throw new ArgumentException(\"Invalid arg.Action\");\n            }\n            _Changed.OnNext(this, args);\n        }\n\n        public IEnumerator<T> GetEnumerator() => Items.GetEnumerator();\n        IEnumerator IEnumerable.GetEnumerator() => Items.GetEnumerator();\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventories/Events.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Reactive;\nusing System.Reactive.Linq;\n\nnamespace Inventories\n{\n    /// <summary>\n    /// Extension methods for an event-pttern observable/observer, and repository.\n    /// </summary>\n    public static class Events\n    {\n        /// <summary>\n        /// Subscribes an event without sender.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"e\"></param>\n        /// <param name=\"observer\"></param>\n        /// <returns></returns>\n        public static IDisposable Subscribe<T>(this IObservable<EventPattern<ItemChangedArgs<T>>> e, Action<ItemChangedArgs<T>> observer) =>\n            e.Subscribe(ep => observer(ep.EventArgs));\n\n        /// <summary>\n        /// A shorthand for event-pattern <see cref=\"IObserver{T}.OnNext(T)\"/>.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"observer\"></param>\n        /// <param name=\"sender\"></param>\n        /// <param name=\"args\"></param>\n        public static void OnNext<T>(this IObserver<EventPattern<T>> observer, object sender, T args) =>\n            observer.OnNext(new EventPattern<T>(sender, args));\n\n        /// <summary>\n        /// Creates a new event-pattern observable which raises on an item updated in the repository.\n        /// The observable yields:\n        ///  - the Item on the Add/Update action,\n        ///  - the NewItems the a Reset action,\n        ///  - none on the Remove action.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"r\"></param>\n        /// <returns></returns>\n        public static IObservable<T> ItemUpdated<T>(this IObservableInventory<T> r) where T : IIdentifiable =>\n            Observable.Create<T>(observer =>\n                r.Changed.Subscribe(ep =>\n                {\n                    var action = ep.EventArgs.Action;\n\n                    if (action == ItemChangedAction.Add || action == ItemChangedAction.Update)\n                    {\n                        observer.OnNext(ep.EventArgs.Item);\n                    }\n                    else if (action == ItemChangedAction.Reset && ep.EventArgs.NewItems != null)\n                    {\n                        foreach (var item in ep.EventArgs.NewItems)\n                            observer.OnNext(item);\n                    }\n                }));\n\n        public static void Add<T>(this IChangeable<T> r, T item) => r.Change(ItemChangedArgs.Add(item));\n        public static void Remove<T>(this IChangeable<T> r, T item) => r.Change(ItemChangedArgs.Remove(item));\n        public static void Remove<T>(this IChangeable<T> r, int id) => r.Change(ItemChangedArgs.Remove<T>(id));\n        public static void Update<T>(this IChangeable<T> r, T item) => r.Change(ItemChangedArgs.Update(item));\n        public static void Reset<T>(this IChangeable<T> r, IEnumerable<T> newItems) => r.Change(ItemChangedArgs.Reset(newItems, null));\n\n        /// <summary>\n        /// Projects <see cref=\"IObservableInventory{T}\"/> to <see cref=\"IObservableEnumerable{T}\"/>.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"r\"></param>\n        /// <returns></returns>\n        public static IObservableEnumerable<T> AsObservableEnumerable<T>(this IObservableInventory<T> r) where T : IIdentifiable =>\n            ObservableEnumerable.Create(r.Items, r.ItemUpdated());\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventories/IChangeable.cs",
    "content": "﻿namespace Inventories\n{\n    /// <summary>\n    /// An interface for changing items in a repository.\n    /// </summary>\n    /// <typeparam name=\"T\">Type of items.</typeparam>\n    public interface IChangeable<T>\n    {\n        /// <summary>\n        /// Changes an item.\n        /// </summary>\n        /// <param name=\"args\">変更状況。</param>\n        void Change(ItemChangedArgs<T> args);\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventories/IIdentifiable.cs",
    "content": "﻿namespace Inventories\n{\n    /// <summary>\n    /// An item which has id.\n    /// </summary>\n    public interface IIdentifiable\n    {\n        int Id { get; }\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventories/IInventory.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Inventories\n{\n    /// <summary>\n    /// An item repository.\n    /// Items in the repository must have an id.\n    /// </summary>\n    /// <typeparam name=\"T\">Type of items</typeparam>\n    public interface IInventory<T>\n        where T : IIdentifiable\n    {\n        /// <summary>\n        /// Gets all items in the repository.\n        /// </summary>\n        IEnumerable<T> Items { get; }\n\n        /// <summary>\n        /// Gets Ids of all items in the repository.\n        /// </summary>\n        IEnumerable<int> Ids { get; }\n\n        /// <summary>\n        /// Finds an item by id.\n        /// </summary>\n        /// <returns>The found item. Returns null if not found.</returns>\n        T GetItem(int id);\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventories/IObservableEnumerable.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace Inventories\n{\n    /// <summary>\n    /// An items source which you can get current items and subscribe an item-updated event.\n    /// </summary>\n    /// <typeparam name=\"T\">Type of items.</typeparam>\n    public interface IObservableEnumerable<T>\n    {\n        /// <summary>\n        /// Current items.\n        /// </summary>\n        IEnumerable<T> Items { get; }\n\n        /// <summary>\n        /// An event raised on items updated.\n        /// </summary>\n        IObservable<T> Updated { get; }\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventories/IObservableInventory.cs",
    "content": "﻿using System;\nusing System.Reactive;\n\nnamespace Inventories\n{\n    /// <summary>\n    /// A repository which notifies an item-changed event.\n    /// </summary>\n    /// <typeparam name=\"T\">Type of items</typeparam>\n    public interface IObservableInventory<T> : IInventory<T>\n        where T : IIdentifiable\n    {\n        /// <summary>\n        /// An event raised on any item on the repository changed.\n        /// </summary>\n        IObservable<EventPattern<ItemChangedArgs<T>>> Changed { get; }\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventories/IdComparer.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Inventories\n{\n    class IdComparer<T> : IEqualityComparer<T>\n        where T : IIdentifiable\n    {\n        private IdComparer() { }\n\n        public bool Equals(T x, T y)\n        {\n            if (ReferenceEquals(x, default(T)) && ReferenceEquals(y, default(T))) return true;\n            if (ReferenceEquals(x, default(T)) || ReferenceEquals(y, default(T))) return false;\n            return x.Id == y.Id;\n        }\n\n        public int GetHashCode(T obj)\n        {\n            return obj.GetHashCode();\n        }\n\n        public static readonly IdComparer<T> Singleton = new IdComparer<T>();\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventories/Inventories.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{B4FC97A2-812E-40E8-ABFA-5EECADD60F8A}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Inventories</RootNamespace>\n    <AssemblyName>Inventories</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Reactive.Core\">\n      <HintPath>..\\packages\\Rx-Core.2.2.5\\lib\\net45\\System.Reactive.Core.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Reactive.Interfaces\">\n      <HintPath>..\\packages\\Rx-Interfaces.2.2.5\\lib\\net45\\System.Reactive.Interfaces.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Reactive.Linq\">\n      <HintPath>..\\packages\\Rx-Linq.2.2.5\\lib\\net45\\System.Reactive.Linq.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Reactive.PlatformServices\">\n      <HintPath>..\\packages\\Rx-PlatformServices.2.2.5\\lib\\net45\\System.Reactive.PlatformServices.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"DictionaryInventory.cs\" />\n    <Compile Include=\"Events.cs\" />\n    <Compile Include=\"IChangeable.cs\" />\n    <Compile Include=\"IdComparer.cs\" />\n    <Compile Include=\"IIdentifiable.cs\" />\n    <Compile Include=\"IInventory.cs\" />\n    <Compile Include=\"IObservableEnumerable.cs\" />\n    <Compile Include=\"IObservableInventory.cs\" />\n    <Compile Include=\"ItemChangedAction.cs\" />\n    <Compile Include=\"ItemChangedArgs.cs\" />\n    <Compile Include=\"ObservableEnumerable.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Scribble/Inventories/ItemChangedAction.cs",
    "content": "﻿namespace Inventories\n{\n    /// <summary>\n    /// Type of item-changed event.\n    /// </summary>\n    public enum ItemChangedAction\n    {\n        /// <summary>\n        /// Adds an item. This may throw an exception if a repository has an item of the same id.\n        /// </summary>\n        Add,\n\n        /// <summary>\n        /// Removes an item.\n        /// </summary>\n        Remove,\n\n        /// <summary>\n        /// Updates an item. Replaces an item if it has the same Id as a new one.\n        /// </summary>\n        Update,\n\n        /// <summary>\n        /// Removes all items, and then adds new items.\n        /// </summary>\n        Reset,\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventories/ItemChangedArgs.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace Inventories\n{\n    /// <summary>\n    /// arguments of an item-changed event.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public class ItemChangedArgs<T>\n    {\n        /// <summary>\n        /// Type of the event.\n        /// </summary>\n        public ItemChangedAction Action { get; }\n\n        /// <summary>\n        /// New item for the Add/Update action.\n        /// Removed item for the Remove action.\n        /// Null for the Reset action.\n        /// </summary>\n        public T Item { get; }\n\n        /// <summary>\n        /// An id for the Remove action. This is not used for the other actions.\n        /// The Remove action doesn't need an item instance. It requires only id.\n        /// If this has any value (not null), the Remove action ignores the Item property.\n        /// </summary>\n        public int? Id { get; }\n\n        /// <summary>\n        /// New (added) items for the Update action. This is not used for the other actions.\n        /// </summary>\n        public IEnumerable<T> NewItems { get; }\n\n        /// <summary>\n        /// Old (removed) items for the Update action. This is not used for the other actions.\n        /// </summary>\n        public IEnumerable<T> OldItems { get; }\n\n        public ItemChangedArgs(ItemChangedAction action, T item) { Action = action; Item = item; }\n        public ItemChangedArgs(ItemChangedAction action, int id) { Action = action; Id = id; }\n        public ItemChangedArgs(ItemChangedAction action) { Action = action; }\n        public ItemChangedArgs(ItemChangedAction action, IEnumerable<T> newItems, IEnumerable<T> oldItems) { Action = action; NewItems = newItems; OldItems = oldItems; }\n        public ItemChangedArgs(ItemChangedAction action, T newItem, T oldItem) { Action = action; Item = newItem; OldItems = new[] { oldItem }; }\n    }\n\n    /// <summary>\n    /// Factory for <see cref=\"ItemChangedArgs{T}\"/>.\n    /// </summary>\n    public class ItemChangedArgs\n    {\n        public static ItemChangedArgs<T> Add<T>(T item) { return new ItemChangedArgs<T>(ItemChangedAction.Add, item); }\n        public static ItemChangedArgs<T> Remove<T>(T item) { return new ItemChangedArgs<T>(ItemChangedAction.Remove, item); }\n        public static ItemChangedArgs<T> Remove<T>(int id) { return new ItemChangedArgs<T>(ItemChangedAction.Remove, id); }\n        public static ItemChangedArgs<T> Update<T>(T item) { return new ItemChangedArgs<T>(ItemChangedAction.Update, item); }\n        public static ItemChangedArgs<T> Update<T>(T newItem, T oldItem) { return new ItemChangedArgs<T>(ItemChangedAction.Update, newItem, oldItem); }\n        public static ItemChangedArgs<T> Reset<T>(IEnumerable<T> newItems, IEnumerable<T> oldItems) { return new ItemChangedArgs<T>(ItemChangedAction.Reset, newItems, oldItems); }\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventories/ObservableEnumerable.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reactive.Linq;\n\nnamespace Inventories\n{\n    /// <summary>\n    /// A simple implementation of <see cref=\"IObservableEnumerable{T}\"/>.\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    class ObservableEnumerable<T> : IObservableEnumerable<T>\n    {\n        public IEnumerable<T> Items { get; }\n        public IObservable<T> Updated { get; }\n\n        public ObservableEnumerable(IEnumerable<T> items, IObservable<T> updated)\n        {\n            Items = items;\n            Updated = updated;\n        }\n    }\n\n    /// <summary>\n    /// An implementation of <see cref=\"IObservableEnumerable{T}\"/>.\n    /// </summary>\n    public static class ObservableEnumerable\n    {\n        /// <summary>\n        /// Creates a new <see cref=\"IObservableEnumerable{T}\"/>.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"items\">Current items.</param>\n        /// <param name=\"updated\">Item-updated event.</param>\n        /// <returns></returns>\n        public static IObservableEnumerable<T> Create<T>(IEnumerable<T> items, IObservable<T> updated) => new ObservableEnumerable<T>(items, updated);\n\n        /// <summary>\n        /// Filters items and its updated event based on a predicate.\n        /// </summary>\n        /// <typeparam name=\"TSource\">Type of items.</typeparam>\n        /// <param name=\"source\"></param>\n        /// <param name=\"predicate\"></param>\n        /// <returns></returns>\n        public static IObservableEnumerable<TSource> Where<TSource>(this IObservableEnumerable<TSource> source, Func<TSource, bool> predicate) =>\n            Create(source.Items.Where(predicate), source.Updated.Where(predicate));\n\n        /// <summary>\n        /// Projects items and its updated event into a new form.\n        /// </summary>\n        /// <typeparam name=\"TSource\"></typeparam>\n        /// <typeparam name=\"TResult\"></typeparam>\n        /// <param name=\"source\"></param>\n        /// <param name=\"selector\"></param>\n        /// <returns></returns>\n        public static IObservableEnumerable<TResult> Select<TSource, TResult>(this IObservableEnumerable<TSource> source, Func<TSource, TResult> selector) =>\n            Create(source.Items.Select(selector), source.Updated.Select(selector));\n\n        /// <summary>\n        /// <paramref name=\"observer\"/> is called immediately with a current first item, and then on updated.\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"source\"></param>\n        /// <param name=\"observer\"></param>\n        /// <returns></returns>\n        public static IDisposable Subscribe<T>(this IObservableEnumerable<T> source, Action<T> observer)\n        {\n            foreach (var item in source.Items) observer(item);\n            return source.Updated.Subscribe(observer);\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventories/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Inventories\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Inventories\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"b4fc97a2-812e-40e8-abfa-5eecadd60f8a\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Scribble/Inventories/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Rx-Core\" version=\"2.2.5\" targetFramework=\"net45\" />\n  <package id=\"Rx-Interfaces\" version=\"2.2.5\" targetFramework=\"net45\" />\n  <package id=\"Rx-Linq\" version=\"2.2.5\" targetFramework=\"net45\" />\n  <package id=\"Rx-Main\" version=\"2.2.5\" targetFramework=\"net45\" />\n  <package id=\"Rx-PlatformServices\" version=\"2.2.5\" targetFramework=\"net45\" />\n</packages>"
  },
  {
    "path": "Scribble/Inventory/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Scribble/Inventory/DataModels/IApi.cs",
    "content": "﻿using Inventories;\nusing System.Threading.Tasks;\n\nnamespace InventoriesSample.DataModels\n{\n    /// <summary>\n    /// An api interface to communicate with the server.\n    /// </summary>\n    public interface IApi\n    {\n        /// <summary>\n        /// Logs in and receives all data.\n        /// </summary>\n        /// <param name=\"authToken\">authentication token.</param>\n        /// <returns>received game data.</returns>\n        Task<SyncResult> Login(int authToken);\n\n        /// <summary>\n        /// Gets a new unit.\n        /// </summary>\n        /// <param name=\"masterId\"></param>\n        /// <returns>Difference in the unit inventory.</returns>\n        Task<ItemChangedArgs<Unit>[]> HireUnit(int masterId);\n\n        /// <summary>\n        /// Fires an unit who is no longer needed.\n        /// </summary>\n        /// <param name=\"id\">The unit instance id.</param>\n        /// <returns>Difference in the unit inventory.</returns>\n        Task<ItemChangedArgs<Unit>[]> FireUnit(int id);\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventory/DataModels/SyncResult.cs",
    "content": "﻿namespace InventoriesSample.DataModels\n{\n    /// <summary>\n    /// Contains all game data needed in the Program, used for complete synchronization between the cliant and the server.\n    /// </summary>\n    public class SyncResult\n    {\n        /// <summary>\n        /// Units in the unit inventory.\n        /// </summary>\n        public Unit[] Units { get; set; }\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventory/DataModels/Unit.cs",
    "content": "﻿using Inventories;\nusing System.Collections.Generic;\n\nnamespace InventoriesSample.DataModels\n{\n    /// <summary>\n    /// A battle unit.\n    /// </summary>\n    public class Unit : IIdentifiable\n    {\n        /// <summary>\n        /// The instance id.\n        /// </summary>\n        public int Id { get; set; }\n\n        public int MasterId { get; set; }\n\n        public int Life { get; set; }\n\n        public int Energy { get; set; }\n    }\n\n    /// <summary>\n    /// A leader unit:\n    /// - only one unit is the leader.\n    /// - the leader has special skills effective on the party.\n    /// - the leader is always active.\n    /// </summary>\n    public class LeaderUnit : Unit\n    {\n        public IEnumerable<int> SpecialSkillIds { get; }\n    }\n\n    /// <summary>\n    /// A servant unit:\n    /// - you can pay costs to summon servants to the party.\n    /// - only summoned servants are active.\n    /// </summary>\n    public class ServantUnit : Unit\n    {\n        public bool IsSummoned { get; }\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventory/Dummy/DummyApi.cs",
    "content": "﻿using Inventories;\nusing InventoriesSample.DataModels;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace InventoriesSample.Dummy\n{\n    class DummyApi : IApi\n    {\n        private DummyMasters _dummy = new DummyMasters();\n\n        private List<Unit> _units = new List<Unit>();\n        private int _id;\n\n        public DummyApi()\n        {\n            _units.Add(_dummy.GetRandomLeader().GetInstance(_id++));\n\n            for (int i = 0; i < 5; i++)\n                _units.Add(_dummy.GetRandomServant().GetInstance(_id++));\n        }\n\n        public async Task<SyncResult> Login(int authToken)\n        {\n            await Task.Delay(500);\n\n            return new SyncResult { Units = _units.ToArray() };\n        }\n\n        public async Task<ItemChangedArgs<Unit>[]> HireUnit(int masterId)\n        {\n            await Task.Delay(500);\n\n            return HireUnitInternal(masterId).ToArray();\n        }\n\n        private IEnumerable<ItemChangedArgs<Unit>> HireUnitInternal(int masterId)\n        {\n            // No such unit master.\n            if (!DummyMasters.UnitMasters.ContainsKey(masterId)) yield break;\n\n            // A leader unit must be single.\n            if (DummyMasters.UnitMasters[masterId].IsLeader) yield break;\n\n            // Special offer! Buy one Get one!\n            if (masterId == 1005)\n            {\n                yield return ItemChangedArgs.Add(DummyMasters.UnitMasters[masterId].GetInstance(_id++));\n                yield return ItemChangedArgs.Add(DummyMasters.UnitMasters[masterId].GetInstance(_id++));\n            }\n            else\n            {\n                yield return ItemChangedArgs.Add(DummyMasters.UnitMasters[masterId].GetInstance(_id++));\n            }\n        }\n\n        public async Task<ItemChangedArgs<Unit>[]> FireUnit(int id)\n        {\n            await Task.Delay(500);\n\n            return FireUnitInternal(id).ToArray();\n        }\n\n        private IEnumerable<ItemChangedArgs<Unit>> FireUnitInternal(int id)\n        {\n            var u = _units.FirstOrDefault(x => x.Id == id);\n\n            // No such unit.\n            if (u == null) yield break;\n\n            // Fire!\n            _units.Remove(u);\n            yield return ItemChangedArgs.Remove<Unit>(id);\n\n            // If the leader is fired, a new leader is hired.\n            if (DummyMasters.UnitMasters[u.MasterId].IsLeader)\n            {\n                var newLeader = _dummy.GetRandomLeader().GetInstance(_id++);\n                _units.Add(newLeader);\n                yield return ItemChangedArgs.Add(newLeader);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventory/Dummy/DummyMasters.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace InventoriesSample.Dummy\n{\n    class DummyMasters\n    {\n        public static IReadOnlyDictionary<int, UnitMaster> UnitMasters = new Dictionary<int, UnitMaster>\n        {\n            {  100, new UnitMaster( 100,  true, 1000, 1000) },\n            {  101, new UnitMaster( 101,  true, 1500, 700) },\n            {  102, new UnitMaster( 102,  true, 700, 2000) },\n            { 1000, new UnitMaster(1000, false, 500, 500) },\n            { 1001, new UnitMaster(1001, false, 300, 800) },\n            { 1002, new UnitMaster(1002, false, 450, 500) },\n            { 1003, new UnitMaster(1003, false, 900, 50) },\n            { 1004, new UnitMaster(1004, false, 700, 200) },\n            { 1005, new UnitMaster(1005, false, 1200, 0) },\n        };\n\n        private readonly static IReadOnlyList<UnitMaster> _leaders = UnitMasters.Values.Where(x => x.IsLeader).ToArray();\n        private readonly static IReadOnlyList<UnitMaster> _servants = UnitMasters.Values.Where(x => !x.IsLeader).ToArray();\n\n        private readonly Random _random = new Random();\n\n        private UnitMaster GetRandom(IReadOnlyList<UnitMaster> list)\n        {\n            var i = _random.Next(0, list.Count);\n            return list[i];\n        }\n\n        public UnitMaster GetRandomLeader() => GetRandom(_leaders);\n        public UnitMaster GetRandomServant() => GetRandom(_servants);\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventory/Dummy/UnitMaster.cs",
    "content": "﻿using InventoriesSample.DataModels;\n\nnamespace InventoriesSample.Dummy\n{\n    class UnitMaster\n    {\n        public int MasterId { get; }\n        public bool IsLeader { get; }\n        public int MaxLife { get; }\n        public int MaxEnergy { get; }\n\n        public UnitMaster(int masterId, bool isLeader, int maxLife, int maxEnergy)\n        {\n            MasterId = masterId;\n            IsLeader = isLeader;\n            MaxLife = maxLife;\n            MaxEnergy = maxEnergy;\n        }\n\n        public Unit GetInstance(int id)\n            => IsLeader ?\n            (Unit)new LeaderUnit { Id = id, MasterId = MasterId, Life = MaxLife, Energy = MaxEnergy } :\n            (Unit)new ServantUnit { Id = id, MasterId = MasterId, Life = MaxLife, Energy = MaxEnergy };\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventory/InventoriesSample.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{098B70B7-1F79-45FE-8207-271625511C4E}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>InventoriesSample</RootNamespace>\n    <AssemblyName>InventoriesSample</AssemblyName>\n    <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Reactive.Core\">\n      <HintPath>..\\packages\\Rx-Core.2.2.5\\lib\\net45\\System.Reactive.Core.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Reactive.Interfaces\">\n      <HintPath>..\\packages\\Rx-Interfaces.2.2.5\\lib\\net45\\System.Reactive.Interfaces.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Reactive.Linq\">\n      <HintPath>..\\packages\\Rx-Linq.2.2.5\\lib\\net45\\System.Reactive.Linq.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Reactive.PlatformServices\">\n      <HintPath>..\\packages\\Rx-PlatformServices.2.2.5\\lib\\net45\\System.Reactive.PlatformServices.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"DataModels\\SyncResult.cs\" />\n    <Compile Include=\"DataModels\\IApi.cs\" />\n    <Compile Include=\"Dummy\\DummyApi.cs\" />\n    <Compile Include=\"Dummy\\DummyMasters.cs\" />\n    <Compile Include=\"Dummy\\UnitMaster.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"DataModels\\Unit.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Inventories\\Inventories.csproj\">\n      <Project>{b4fc97a2-812e-40e8-abfa-5eecadd60f8a}</Project>\n      <Name>Inventories</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Scribble/Inventory/Program.cs",
    "content": "﻿using Inventories;\nusing InventoriesSample.DataModels;\nusing System;\nusing System.Linq;\nusing System.Reactive.Linq;\nusing System.Threading.Tasks;\nusing static System.Console;\n\nnamespace InventoriesSample\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var units = new DictionaryInventory<Unit>();\n\n            // subscribe all units.\n            units.Changed\n                .Subscribe(arg => WriteLine($\"{arg.Action} id: {arg.Id ?? arg.Item?.Id}, type: {arg.Item?.GetType()?.Name}, master id: {arg.Item?.MasterId}\"));\n\n            // subscribe the leader.\n            units.AsObservableEnumerable()\n                .Select(u => u as LeaderUnit)\n                .Where(u => u != null)\n                .Subscribe(leader => WriteLine($\"leader updated. current life: {leader.Life}, energy: {leader.Energy}\"));\n\n            RunAsync(units, new Dummy.DummyApi()).Wait();\n        }\n\n        static async Task RunAsync(DictionaryInventory<Unit> units, IApi api)\n        {\n            var sync = await api.Login(0);\n            units.Reset(sync.Units);\n\n            var r = new Random();\n\n            // fires 5 times randomly\n            for (int i = 0; i < 5; i++)\n            {\n                var ids = units.Ids.ToArray();\n                var d = await api.FireUnit(ids[r.Next(0, ids.Length)]);\n                foreach (var x in d) units.Change(x);\n            }\n\n            // hires 5 times randomly\n            for (int i = 0; i < 5; i++)\n            {\n                var d = await api.HireUnit(r.Next(1000, 1006));\n                foreach (var x in d) units.Change(x);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/Inventory/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Inventory\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Inventory\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"098b70b7-1f79-45fe-8207-271625511c4e\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Scribble/Inventory/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Rx-Core\" version=\"2.2.5\" targetFramework=\"net45\" />\n  <package id=\"Rx-Interfaces\" version=\"2.2.5\" targetFramework=\"net45\" />\n  <package id=\"Rx-Linq\" version=\"2.2.5\" targetFramework=\"net45\" />\n  <package id=\"Rx-Main\" version=\"2.2.5\" targetFramework=\"net45\" />\n  <package id=\"Rx-PlatformServices\" version=\"2.2.5\" targetFramework=\"net45\" />\n</packages>"
  },
  {
    "path": "Scribble/MigrateToProjectJson/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Scribble/MigrateToProjectJson/MigrateToProjectJson.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{36C3FAAF-0D75-446E-9940-CF9CEE2B641E}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>MigrateToProjectJson</RootNamespace>\n    <AssemblyName>MigrateToProjectJson</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Newtonsoft.Json.7.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Package.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n    <None Include=\"readme.md\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Scribble/MigrateToProjectJson/Package.cs",
    "content": "﻿using System.Linq;\n\nnamespace MigrateToProjectJson\n{\n    class Package\n    {\n        public string Id { get; set; }\n        public string Version { get; set; }\n\n        public string AnyVersion => string.Join(\".\", Version.Split('.').Take(2)) + \".*\";\n\n        public override string ToString() => $\"{Id}: {Version}\";\n    }\n}\n"
  },
  {
    "path": "Scribble/MigrateToProjectJson/Program.cs",
    "content": "﻿using Newtonsoft.Json;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text.RegularExpressions;\nusing System.Xml.Linq;\nusing D = System.Collections.Generic.Dictionary<string, object>;\n\nnamespace MigrateToProjectJson\n{\n    class Program\n    {\n        const string packagesConf = \"packages.config\";\n        const string projectJson = \"project.json\";\n        static readonly Regex regProject = new Regex(@\" = \"\".*?\"\", \"\"(?<csproj>.*?\\.csproj)\"\"\");\n\n        static void Main(string[] args)\n        {\n            var slnPath =\n                args.Length >= 1 ? args[0]\n                : @\"path to a solution which you want to migrate from packages.config to project.json\";\n\n            var baseFolder = Path.GetDirectoryName(slnPath);\n            var slnLines = File.ReadAllLines(slnPath);\n\n            foreach (var line in slnLines)\n            {\n                var m = regProject.Match(line);\n                if (!m.Success) continue;\n\n                var csprojPath = Path.Combine(baseFolder, m.Groups[\"csproj\"].Value);\n                if (!File.Exists(csprojPath)) continue;\n\n                string targetVersion = ReadTargetFrameworkVersion(csprojPath);\n\n                var csprojFolder = Path.GetDirectoryName(csprojPath);\n                var packagesPath = Path.Combine(csprojFolder, packagesConf);\n\n                if (!File.Exists(packagesPath)) continue;\n\n                var packages = ReadPackages(packagesPath);\n                WriteJson(targetVersion, csprojFolder, packages);\n                RewriteCsproj(csprojPath, packages);\n                File.Delete(packagesPath);\n            }\n        }\n\n        private static void RewriteCsproj(string csprojPath, IEnumerable<Package> packages)\n        {\n            var doc = XDocument.Load(csprojPath);\n            var ns = (XNamespace)\"http://schemas.microsoft.com/developer/msbuild/2003\";\n            var itemGroups = doc.Root.Elements(ns + \"ItemGroup\");\n            var changed = false;\n\n            foreach (var item in itemGroups)\n            {\n                var references = item.Elements(ns + \"Reference\").ToArray();\n\n                foreach (var r in references)\n                {\n                    if (packages.Any(x => r.Attribute(\"Include\").Value.StartsWith(x.Id + \",\")))\n                    {\n                        r.Remove();\n                        changed = true;\n                    }\n                }\n\n                var none = item.Elements(ns + \"None\").ToArray();\n\n                foreach (var n in none)\n                {\n                    var include = n.Attribute(\"Include\");\n                    if (include.Value == packagesConf)\n                    {\n                        n.ReplaceAll(new XAttribute(\"Include\", projectJson));\n                        changed = true;\n                    }\n                }\n            }\n\n            if (changed)\n                doc.Save(csprojPath);\n        }\n\n        private static void WriteJson(string targetVersion, string csprojFolder, IEnumerable<Package> packages)\n        {\n            var json = GetJson(targetVersion, packages);\n            var jsonPath = Path.Combine(csprojFolder, projectJson);\n            File.WriteAllText(jsonPath, json);\n        }\n\n        private static string GetJson(string targetVersion, IEnumerable<Package> packages)\n        {\n            return JsonConvert.SerializeObject(new D\n            {\n                [\"frameworks\"] = new D {[targetVersion] = _empty },\n                [\"runtimes\"] = new D\n                {\n                    [\"win\"] = _empty,\n                    [\"win-anycpu\"] = _empty,\n                },\n                [\"dependencies\"] = ToDictionary(packages),\n            }, Formatting.Indented);\n        }\n\n        private static string ReadTargetFrameworkVersion(string csprojPath)\n        {\n            var targetVersionLine = File.ReadAllLines(csprojPath).First(x => x.Contains(\"TargetFrameworkVersion\"));\n\n            var targetVersion =\n                targetVersionLine.Contains(\"v2.0\") ? \"net20\" :\n                targetVersionLine.Contains(\"v3.0\") ? \"net30\" :\n                targetVersionLine.Contains(\"v3.5\") ? \"net35\" :\n                targetVersionLine.Contains(\"v4.5\") ? \"net45\" :\n                targetVersionLine.Contains(\"v4.6\") ? \"net46\" :\n                \"dotnet\";\n            return targetVersion;\n        }\n\n        private static readonly object _empty = new object();\n\n        private static IEnumerable<Package> ReadPackages(string packagesPath)\n        {\n            var doc = XDocument.Load(packagesPath);\n            var items = doc.Root.Elements(\"package\");\n            var packages = items.Select(x => new Package { Id = (string)x.Attribute(\"id\"), Version = (string)x.Attribute(\"version\") });\n            return packages;\n        }\n\n        private static D ToDictionary(IEnumerable<Package> packages)\n        {\n            var d = new D();\n\n            foreach (var p in packages)\n            {\n                d[p.Id] = p.Version;\n            }\n\n            return d;\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/MigrateToProjectJson/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"MigrateToProjectJson\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"MigrateToProjectJson\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります\n[assembly: Guid(\"36c3faaf-0d75-446e-9940-cf9cee2b641e\")]\n\n// アセンブリのバージョン情報は次の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン\n//      ビルド番号\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Scribble/MigrateToProjectJson/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Newtonsoft.Json\" version=\"13.0.1\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "Scribble/MigrateToProjectJson/readme.md",
    "content": "﻿# packages.config → project.json\n\n要するに NuGet v3 化。\n\n## project.json\n\n元々は ASP.NET 5/.NET Core/.xproj 向けのプロジェクト管理情報が入った JSON ファイル。\n\nNuGet v3 で、その project.json のサブセットを使って、.csproj/.vbproj でも NuGet パッケージ管理を project.json でやるようになった。\n\nただし、公式にサポートするのは以下の3つだけ。\n\n- ASP.NET 5\n- Modern PCL (プロジェクト テンプレートの「Class Library (package)」/「クラス ライブラリ (パッケージ)」で作るやつ)\n- Universal Windows Platform アプリ(以下、UWP)\n\n前2つは元から .xproj 形式。UWP だけがこの新しい仕組み(.csproj + project.json)で動いてる。\n\n## .csproj + project.json\n\nサポート外(自己責任利用)ではあるものの、任意のプロジェクトから project.json を使うことが可能。\n\n例えば、これまでの NuGet パッケージ管理「packages.confing」で、Rx-Main を参照すると以下のようになってたはず。\n\n```xml\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Rx-Core\" version=\"2.3.0-beta2\" targetFramework=\"net46\" />\n  <package id=\"Rx-Interfaces\" version=\"2.3.0-beta2\" targetFramework=\"net46\" />\n  <package id=\"Rx-Linq\" version=\"2.3.0-beta2\" targetFramework=\"net46\" />\n  <package id=\"Rx-Main\" version=\"2.3.0-beta2\" targetFramework=\"net46\" />\n  <package id=\"Rx-PlatformServices\" version=\"2.3.0-beta2\" targetFramework=\"net46\" />\n</packages>\n```\n\nこれを、project.json という名前で、以下のような JSON ファイルに置き替える。\n\n```json\n{\n  \"frameworks\": {\n    \"net46\": {}\n  },\n  \"runtimes\": {\n    \"win\": {},\n    \"win-anycpu\": {}\n  },\n  \"dependencies\": {\n    \"Rx-Main\": \"2.3.0-beta2\"\n  }\n}\n```\n\n手動でファイルの置き換えをした後、プロジェクトを読み込みなおす(ソリューションを閉じて開きなおすとかでも OK)と、NuGet v3 でパッケージ管理される状態になる。\n\n## NuGet v3 で新しくなったこと\n\nNuGet v3 で、.NET Core/.xproj (2015/7/20 の Visual Studio 2015 リリース時点でベータ状態)の一部分を前倒しで先に使えるようになった状態。\n\n### 依存関係を自動で解決\n\nproject.json では、直接依存しているものだけを書けばよくなった。\n\n上記の例の packages.config (NuGet v2)では、Rx-Main を参照するだけで、それが依存している Rx-Core, Rx-Interfaces, Rx-Linq, Rx-PlatformServices が一緒に追加される。\n一方、project.json (NuGet v3)では、直接参照している Rx-Main の1行だけになった。\n\nアップグレードやアンインストールの作業がだいぶ楽になるはず。\n\n### .csproj/.vbproj を汚さなくなった\n\nNuGet v2 では、packages.config にパッケージ情報が入るだけじゃなくて、.csproj 側にダウンロードしてきた DLL への参照情報が入ってた。\nしかも hint path がソリューションを基準とした相対パスなので、1つのプロジェクトを複数のソリューションから参照するとビルドできなくなったりする。\n\nNuGet v3 では、project.json だけで完結して、.csproj/.vbproj には何も書かなくなった。\n1つのプロジェクトを複数のソリューションから参照しても平気に。\nまた、ソースコード バージョン管理での衝突の可能性も減った。\n\n### キャッシュがユーザー単位に\n\nNuGet v2 では、NuGet サーバーから取ってきたパッケージは、ソリューション直下の `packages` フォルダーにキャッシュされてた。\n\n一方、NuGet v3 では、ユーザー フォルダーの下に、`.nuget/packages` というフォルダーを作ってそこにキャッシュされる。\n同じユーザーのすべてのソリューションでキャッシュが共有される。\n\n### まとめ\n\n変更点\n\n- 依存関係を自動解決\n- .csproj/.vbproj を汚さない\n- キャッシュがユーザー単位\n\nその結果得られる利点\n\n- アップグレード/アンインストール作業が楽\n- 1つのプロジェクトを複数のソリューションから参照しても平気\n- キャッシュ効率アップ\n\n## 移行プログラム\n\npackages.config から project.json に自動的に置き替えるプログラム書いてみた。\n\n- packages.config からパッケージ情報を読み取る\n- project.json を作る\n- .csproj から、パッケージのDLLを `Reference` タグで参照してるところを消す\n- .csproj の packages.config 行を project.json に書き替える\n\n### 注意点\n\nVisual Studio Tools for Windows が必須。\n\n[開発者センター ダウンロードページ](https://dev.windows.com/ja-jp/downloads)で、「Windows 開発者ツールが付属した Visual Studio 2015」のところからダウンロード。\n"
  },
  {
    "path": "Scribble/OverloadResolutionWithDefaultParameter/.gitignore",
    "content": "*.dll\n"
  },
  {
    "path": "Scribble/OverloadResolutionWithDefaultParameter/Program.cs",
    "content": "﻿public class Program\n{\n    static void Main()\n    {\n        X.HogeMethod();\n    }\n}\n"
  },
  {
    "path": "Scribble/OverloadResolutionWithDefaultParameter/Run.ps1",
    "content": ". 'C:\\Program Files (x86)\\MSBuild\\14.0\\Bin\\MSBuild.exe' .\\X\\X.sln\ncp .\\X\\bin\\Debug\\X.dll .\n\n$compilers = @(\n    @{ 'compiler' = $env:windir + '\\Microsoft.NET\\Framework64\\v2.0.50727\\csc.exe'; 'color' = 'DarkCyan' }\n    @{ 'compiler' = $env:windir + '\\Microsoft.NET\\Framework64\\v3.5\\csc.exe'      ; 'color' = 'DarkMagenta' }\n    @{ 'compiler' = $env:windir + '\\Microsoft.NET\\Framework64\\v4.0.30319\\csc.exe'; 'color' = 'DarkGreen' }\n    @{ 'compiler' = ${env:ProgramFiles(x86)} + '\\MSBuild\\12.0\\Bin\\csc.exe'       ; 'color' = 'DarkRed' }\n    @{ 'compiler' = ${env:ProgramFiles(x86)} + '\\MSBuild\\14.0\\Bin\\csc.exe'       ; 'color' = 'DarkBlue' }\n)\n\n$line = '' * 40\n\nforeach($item in $compilers)\n{\n    . {\n        $line\n\n        . $item.compiler -out:out.exe Program.cs -r:X.dll\n\n        if(Test-Path out.exe)\n        {\n            .\\out.exe\n            [void](rm out.exe)\n        }\n    } | Write-Host -ForegroundColor $item.color\n}\n"
  },
  {
    "path": "Scribble/OverloadResolutionWithDefaultParameter/X/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"X\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"X\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"3367e3e9-f646-46b2-9590-53579cc3d8fa\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Scribble/OverloadResolutionWithDefaultParameter/X/X.cs",
    "content": "﻿using System;\n\npublic class X\n{\n    public static void HogeMethod(bool isFuga = false) { Console.WriteLine(\"a\"); }\n    public static void HogeMethod(params string[] fugas) { Console.WriteLine(\"b\"); }\n}\n"
  },
  {
    "path": "Scribble/OverloadResolutionWithDefaultParameter/X/X.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{3367E3E9-F646-46B2-9590-53579CC3D8FA}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>X</RootNamespace>\n    <AssemblyName>X</AssemblyName>\n    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"X.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Scribble/OverloadResolutionWithDefaultParameter/X/X.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22728.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"X\", \"X.csproj\", \"{3367E3E9-F646-46B2-9590-53579CC3D8FA}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{3367E3E9-F646-46B2-9590-53579CC3D8FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3367E3E9-F646-46B2-9590-53579CC3D8FA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3367E3E9-F646-46B2-9590-53579CC3D8FA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3367E3E9-F646-46B2-9590-53579CC3D8FA}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Scribble/Scribble.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.23107.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"InventoriesSample\", \"Inventory\\InventoriesSample.csproj\", \"{098B70B7-1F79-45FE-8207-271625511C4E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Inventories\", \"Inventories\\Inventories.csproj\", \"{B4FC97A2-812E-40E8-ABFA-5EECADD60F8A}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CodeAnalysisForCSharp6\", \"FindSingleStatementBody\\CodeAnalysisForCSharp6.csproj\", \"{250D56BB-432A-4CF7-BE6A-6C5FF542D0E6}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MigrateToProjectJson\", \"MigrateToProjectJson\\MigrateToProjectJson.csproj\", \"{36C3FAAF-0D75-446E-9940-CF9CEE2B641E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ValueTuple\", \"ValueTuple\\ValueTuple.csproj\", \"{4F88628E-5E67-43BC-9524-00394127B6C7}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{098B70B7-1F79-45FE-8207-271625511C4E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{098B70B7-1F79-45FE-8207-271625511C4E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{098B70B7-1F79-45FE-8207-271625511C4E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{098B70B7-1F79-45FE-8207-271625511C4E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B4FC97A2-812E-40E8-ABFA-5EECADD60F8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B4FC97A2-812E-40E8-ABFA-5EECADD60F8A}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B4FC97A2-812E-40E8-ABFA-5EECADD60F8A}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B4FC97A2-812E-40E8-ABFA-5EECADD60F8A}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{250D56BB-432A-4CF7-BE6A-6C5FF542D0E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{250D56BB-432A-4CF7-BE6A-6C5FF542D0E6}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{250D56BB-432A-4CF7-BE6A-6C5FF542D0E6}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{250D56BB-432A-4CF7-BE6A-6C5FF542D0E6}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{36C3FAAF-0D75-446E-9940-CF9CEE2B641E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{36C3FAAF-0D75-446E-9940-CF9CEE2B641E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{36C3FAAF-0D75-446E-9940-CF9CEE2B641E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{36C3FAAF-0D75-446E-9940-CF9CEE2B641E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{4F88628E-5E67-43BC-9524-00394127B6C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{4F88628E-5E67-43BC-9524-00394127B6C7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{4F88628E-5E67-43BC-9524-00394127B6C7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{4F88628E-5E67-43BC-9524-00394127B6C7}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/FixedPacker/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/FixedPacker/FixedPacker.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{F3523B22-7548-4286-8F6A-1AD0DCECBBE0}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>FixedPacker</RootNamespace>\n    <AssemblyName>FixedPacker</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Samples\\DefinitionData\\Program.cs\" />\n    <Compile Include=\"Samples\\DefinitionData\\Sample.cs\" />\n    <Compile Include=\"Samples\\GeneratedData\\Program.cs\" />\n    <Compile Include=\"Samples\\GeneratedData\\Sample.cs\" />\n    <Compile Include=\"Packer.cs\" />\n    <Compile Include=\"Unpacker.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/FixedPacker/Packer.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Runtime.CompilerServices;\n\nnamespace FixedPacker\n{\n    public interface IPacker<TDefinition>\n    {\n        void Pack(IReadOnlyList<TDefinition> data, Stream stream);\n    }\n\n    public static class PackerExtensions\n    {\n        public static byte[] Pack<TDefinition>(this IPacker<TDefinition> packer, IReadOnlyList<TDefinition> data)\n        {\n            using (var m = new MemoryStream())\n            {\n                packer.Pack(data, m);\n                return m.ToArray();\n            }\n        }\n    }\n\n    public struct Packer<TDefinition, TGenerated> : IPacker<TDefinition>\n    {\n        public delegate void NewFunction(TDefinition d, Func<int, int> getIndex, ref TGenerated g);\n        public delegate IEnumerable<ReadOnlySpan<byte>> GetBinariesFunction(TDefinition d);\n\n        private NewFunction _new;\n        private GetBinariesFunction _getBinaries;\n\n        public Packer(NewFunction @new, GetBinariesFunction getBinaries)\n        {\n            _new = @new;\n            _getBinaries = getBinaries;\n        }\n\n        public unsafe void Pack(IReadOnlyList<TDefinition> data, Stream stream)\n        {\n            var size = Unsafe.SizeOf<TGenerated>();\n\n            var buffer = stackalloc byte[size];\n            ref var p = ref Unsafe.AsRef<TGenerated>((void*)buffer);\n\n            using (var w = new BinaryWriter(stream))\n            {\n                w.Write((long)data.Count);\n\n                var binaryIndex = 0;\n\n                foreach (var d in data)\n                {\n                    _new(d, len => { var i = binaryIndex; binaryIndex += len + 4; return i; }, ref p);\n\n                    for (int i = 0; i < size; i++)\n                    {\n                        var xx = buffer[i];\n                        w.Write(xx);\n                    }\n                }\n\n                if (binaryIndex != 0)\n                {\n                    foreach (var d in data)\n                    {\n                        foreach (var b in _getBinaries(d))\n                        {\n                            w.Write(b.Length);\n                            w.Write(b.ToArray());\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/FixedPacker/Program.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\nusing System.Text.Utf8;\nusing D = FixedPacker.Samples.DefinitionData;\nusing G = FixedPacker.Samples.GeneratedData;\n\nnamespace FixedPacker\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var rawData = new[]\n            {\n                new D.Sample(0x11111111, 0x11, 0x1111111111111111, 0x1111, new Utf8String(\"abcde\")),\n                new D.Sample(0x22222222, 0x22, 0x2222222222222222, 0x2222, new Utf8String(\"あいうえ\")),\n                new D.Sample(0x33333333, 0x33, 0x3333333333333333, 0x3333, new Utf8String(\"☹☺\")),\n                new D.Sample(0x44444444, 0x44, 0x4444444444444444, 0x4444, new Utf8String(\"🐭🐮🐯\")),\n                new D.Sample(0x55555555, 0x55, 0x5555555555555555, 0x5555, new Utf8String(\"áïûèø\")),\n                new D.Sample(0x66666666, 0x66, 0x6666666666666666, 0x6666, new Utf8String(\"αβγ\")),\n                new D.Sample(0x77777777, 0x77, 0x7777777777777777, 0x7777, new Utf8String(\"aαℵあ亜🐭\")),\n                new D.Sample(0x08888888, 0x88, 0x0888888888888888, 0x0888, new Utf8String(\"БДУ\")),\n            };\n\n            Test(rawData, new Packer<D.Sample, G.Sample>(G.Sample.Pack, G.Sample.GetBinaries), (p, x) => (x.Id, x.A, x.B, x.C, p.GetString(x.DIndex)).ToString());\n            Test(rawData, new Packer<D.Sample, G.Sample_A_B_C>(G.Sample_A_B_C.Pack, G.Sample_A_B_C.GetBinaries), (p, x) => (x.A, x.B, x.C).ToString());\n            Test(rawData, new Packer<D.Sample, G.Sample_Id_B_D>(G.Sample_Id_B_D.Pack, G.Sample_Id_B_D.GetBinaries), (p, x) => (x.Id, x.B, p.GetString(x.DIndex)).ToString());\n        }\n\n        private static void Test<TGen>(D.Sample[] rawData, Packer<D.Sample, TGen> packer, Func<Unpacker<TGen>, TGen, string> toString)\n            where TGen : struct\n        {\n            var size = Unsafe.SizeOf<TGen>();\n            var data = packer.Pack(rawData);\n\n            var i = 0;\n            foreach (var x in data)\n            {\n                if (i % size == 8)\n                    Console.WriteLine();\n                Console.Write(x.ToString(\"X2\"));\n                ++i;\n            }\n            Console.WriteLine();\n\n            var u = new Unpacker<TGen>(data);\n\n            foreach (var x in u)\n            {\n                Console.WriteLine(toString(u, x));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/FixedPacker/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"FixedPacker\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"FixedPacker\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"f3523b22-7548-4286-8f6a-1ad0dcecbbe0\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/FixedPacker/Samples/DefinitionData/Program.cs",
    "content": "﻿using System.Linq;\n\nnamespace FixedPacker.Samples.DefinitionData\n{\n    class Program\n    {\n        static void Query(IQueryable<Sample> dataSource)\n        {\n            var q1 = dataSource.ToArray();\n            var q2 = dataSource.Select(x => new { x.A, x.B, x.C });\n            var q3 = dataSource.Select(x => new { x.Id, x.B, x.D });\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/FixedPacker/Samples/DefinitionData/Sample.cs",
    "content": "﻿using System.Text.Utf8;\n\nnamespace FixedPacker.Samples.DefinitionData\n{\n    public class Sample\n    {\n        public int Id { get; }\n\n        public byte A { get; }\n\n        public long B { get; }\n\n        public short C { get; }\n\n        public Utf8String D { get; }\n\n        public Sample(int id, byte a, long b, short c, Utf8String d)\n        {\n            Id = id;\n            A = a;\n            B = b;\n            C = c;\n            D = d;\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/FixedPacker/Samples/GeneratedData/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace FixedPacker.Samples.GeneratedData\n{\n    class Program\n    {\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/FixedPacker/Samples/GeneratedData/Sample.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.InteropServices;\nusing System.Text.Utf8;\n\nnamespace FixedPacker.Samples.GeneratedData\n{\n    [StructLayout(LayoutKind.Explicit, Pack = 8)]\n    public struct Sample\n    {\n        [FieldOffset(0)]\n        public int Id;\n\n        [FieldOffset(4)]\n        public byte A;\n\n        [FieldOffset(8)]\n        public long B;\n\n        [FieldOffset(6)]\n        public short C;\n\n        [FieldOffset(16)]\n        public int DIndex;\n\n        public static void Pack(DefinitionData.Sample d, Func<int, int> getIndex, ref Sample g)\n        {\n            g.Id = d.Id;\n            g.A = d.A;\n            g.B = d.B;\n            g.C = d.C;\n            g.DIndex = getIndex(d.D.Length);\n        }\n\n        public static IEnumerable<ReadOnlySpan<byte>> GetBinaries(DefinitionData.Sample d)\n        {\n            yield return d.D.Bytes;\n        }\n    }\n\n    [StructLayout(LayoutKind.Explicit, Pack = 8)]\n    public struct Sample_A_B_C\n    {\n        [FieldOffset(0)]\n        public byte A;\n\n        [FieldOffset(8)]\n        public long B;\n\n        [FieldOffset(2)]\n        public short C;\n\n        public static void Pack(DefinitionData.Sample d, Func<int, int> getIndex, ref Sample_A_B_C g)\n        {\n            g.A = d.A;\n            g.B = d.B;\n            g.C = d.C;\n        }\n\n        public static IEnumerable<ReadOnlySpan<byte>> GetBinaries(DefinitionData.Sample d)\n        {\n            yield break;\n        }\n    }\n\n    [StructLayout(LayoutKind.Explicit, Pack = 8)]\n    public struct Sample_Id_B_D\n    {\n        [FieldOffset(0)]\n        public int Id;\n\n        [FieldOffset(8)]\n        public long B;\n\n        [FieldOffset(4)]\n        public int DIndex;\n\n        public static void Pack(DefinitionData.Sample d, Func<int, int> getIndex, ref Sample_Id_B_D g)\n        {\n            g.Id = d.Id;\n            g.B = d.B;\n            g.DIndex = getIndex(d.D.Length);\n        }\n\n        public static IEnumerable<ReadOnlySpan<byte>> GetBinaries(DefinitionData.Sample d)\n        {\n            yield return d.D.Bytes;\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/FixedPacker/Unpacker.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Runtime.CompilerServices;\nusing System.Text.Utf8;\n\nnamespace FixedPacker\n{\n    public struct Unpacker<T>\n        where T : struct\n    {\n        private ReadOnlySpan<byte> _data;\n\n        public Unpacker(ReadOnlySpan<byte> data) { _data = data; }\n\n        public IEnumerator<T> GetEnumerator()\n        {\n            var size = Size;\n            for (int i = 8; i < Length * Size; i += size)\n            {\n                yield return _data.Slice(i, size).Cast<byte, T>()[0];\n            }\n        }\n\n        public int Length => (int)_data.Cast<byte, long>()[0];\n        private int Size => Unsafe.SizeOf<T>();\n\n        public Utf8String GetString(int index)\n        {\n            index += 8;\n            index += Length * Size;\n            var len = _data.Slice(index).Cast<byte, int>()[0];\n            return new Utf8String(_data.Slice(index + 4, len));\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/FixedPacker/project.json",
    "content": "﻿{\n  \"frameworks\": {\n    \"net46\": {}\n  },\n  \"runtimes\": {\n    \"win\": {},\n    \"win-anycpu\": {},\n    \"win-x64\": {}\n  },\n  \"dependencies\": {\n    \"System.Memory\": \"4.4.0-beta-24807-04\",\n    \"System.Runtime.CompilerServices.Unsafe\": \"4.4.0-beta-24807-04\",\n    \"System.Slices\": \"0.1.0-e161207-1\",\n    \"System.Text.Primitives\": \"0.1.0-e161207-1\",\n    \"System.ValueTuple\": \"4.4.0-beta-24807-04\"\n  }\n}"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/App.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\"/>\n    </startup>\n</configuration>\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/Diagnostics/Measure.cs",
    "content": "﻿using System;\nusing System.Diagnostics;\n\nnamespace SampleApp.Diagnostics\n{\n    struct Measure : IDisposable\n    {\n        private readonly string _tag;\n        private readonly long _beginMemory;\n        private readonly Stopwatch _sw;\n        private Measure(string tag)\n        {\n            _tag = tag;\n            _sw = new Stopwatch();\n            _sw.Start();\n            _beginMemory = GC.GetTotalMemory(false);\n        }\n\n        public void Dispose()\n        {\n            var endMemory = GC.GetTotalMemory(false);\n            _sw.Stop();\n            Console.WriteLine($\"{_tag}: {_sw.Elapsed}, {endMemory - _beginMemory}\");\n        }\n        public static Measure Start(string tag) => new Measure(tag);\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/Lib/IMemberAccessor.cs",
    "content": "﻿using System.Text.Utf8;\n\nnamespace SampleApp.Lib\n{\n    interface IMemberAccessor\n    {\n        TypedPointer GetPointer(int index);\n    }\n\n    interface INamedMemberAccessor\n    {\n        int GetIndex(Utf8String name);\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/Lib/IRecordAccessor.cs",
    "content": "﻿using System;\n\nnamespace SampleApp.Lib\n{\n    /// <summary>\n    /// プロパティに名前でアクセスしたり、インデックスでアクセスしたりを、\n    /// リフレクションでなく、事前コード生成でやるためのインターフェイス。\n    /// </summary>\n    /// <remarks>\n    /// 旧式。object を介するのでbox化を避けれずつらい。\n    /// </remarks>\n    public interface IRecordAccessor\n    {\n        /// <summary>\n        /// インデックス指定でフィールドの値を取り出す。\n        /// </summary>\n        /// <param name=\"index\">インデックス</param>\n        /// <returns>取り出した値</returns>\n        Type GetType(int index);\n\n        /// <summary>\n        /// インデックス指定でフィールドの値を取り出す。\n        /// </summary>\n        /// <param name=\"index\">インデックス</param>\n        /// <returns>取り出した値</returns>\n        object Get(int index);\n\n        /// <summary>\n        /// インデックス指定でフィールドの値を設定する。\n        /// </summary>\n        /// <param name=\"index\">インデックス</param>\n        /// <param name=\"value\">設定したい値。</param>\n        void Set(int index, object value);\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/Lib/NameIndexTable.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Text.Utf8;\nusing System.Runtime.CompilerServices;\nusing System;\nusing static System.Reflection.BindingFlags;\n\nnamespace SampleApp.Lib\n{\n    public struct NameIndexTable\n    {\n        private Dictionary<Utf8String, int> _table;\n\n        public bool IsNull => _table == null;\n\n        public NameIndexTable(Type t) : this((TupleElementNamesAttribute)t\n                .GetField(\"_value\", NonPublic | Instance)\n                .GetCustomAttributes(typeof(TupleElementNamesAttribute), false)[0]) { }\n\n        public NameIndexTable(TupleElementNamesAttribute att)\n        {\n            var names = att.TransformNames;\n            _table = new Dictionary<Utf8String, int>();\n            for (int i = 0; i < names.Count; i++)\n                _table.Add(new Utf8String(names[i]), i);\n        }\n\n        public int this[Utf8String name] => _table[name];\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/Lib/TypedPointer.cs",
    "content": "﻿using System;\nusing System.Runtime.CompilerServices;\n\nnamespace SampleApp.Lib\n{\n    public struct TypedPointer\n    {\n        public IntPtr Pointer;\n        public Type Type;\n        public TypedPointer(IntPtr pointer, Type type)\n        {\n            Pointer = pointer;\n            Type = type;\n        }\n\n        public static unsafe TypedPointer Create<T>(ref T value) => new TypedPointer((IntPtr)Unsafe.AsPointer(ref value), typeof(T));\n\n        public ref T Ref<T>() => ref Ref<T>(Pointer, Type);\n\n        private static unsafe ref T Ref<T>(IntPtr pointer, Type type) => ref Unsafe.AsRef<T>((void*)pointer); //todo: 型チェック\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/Lib/ValueTupleAccessor.cs",
    "content": "﻿using System;\n\nnamespace SampleApp.Lib\n{\n    public static class ValueTupleAccessor\n    {\n        public static TypedPointer GetPointer<T1>(ref ValueTuple<T1> v, int index)\n        {\n            switch (index)\n            {\n                case 0: return TypedPointer.Create(ref v.Item1);\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n\n        public static TypedPointer GetPointer<T1, T2>(ref ValueTuple<T1, T2> v, int index)\n        {\n            switch (index)\n            {\n                case 0: return TypedPointer.Create(ref v.Item1);\n                case 1: return TypedPointer.Create(ref v.Item2);\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n        public static TypedPointer GetPointer<T1, T2, T3>(ref ValueTuple<T1, T2, T3> v, int index)\n        {\n            switch (index)\n            {\n                case 0: return TypedPointer.Create(ref v.Item1);\n                case 1: return TypedPointer.Create(ref v.Item2);\n                case 2: return TypedPointer.Create(ref v.Item3);\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n        public static TypedPointer GetPointer<T1, T2, T3, T4>(ref ValueTuple<T1, T2, T3, T4> v, int index)\n        {\n            switch (index)\n            {\n                case 0: return TypedPointer.Create(ref v.Item1);\n                case 1: return TypedPointer.Create(ref v.Item2);\n                case 2: return TypedPointer.Create(ref v.Item3);\n                case 3: return TypedPointer.Create(ref v.Item4);\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n        public static TypedPointer GetPointer<T1, T2, T3, T4, T5>(ref ValueTuple<T1, T2, T3, T4, T5> v, int index)\n        {\n            switch (index)\n            {\n                case 0: return TypedPointer.Create(ref v.Item1);\n                case 1: return TypedPointer.Create(ref v.Item2);\n                case 2: return TypedPointer.Create(ref v.Item3);\n                case 3: return TypedPointer.Create(ref v.Item4);\n                case 4: return TypedPointer.Create(ref v.Item5);\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n        public static TypedPointer GetPointer<T1, T2, T3, T4, T5, T6>(ref ValueTuple<T1, T2, T3, T4, T5, T6> v, int index)\n        {\n            switch (index)\n            {\n                case 0: return TypedPointer.Create(ref v.Item1);\n                case 1: return TypedPointer.Create(ref v.Item2);\n                case 2: return TypedPointer.Create(ref v.Item3);\n                case 3: return TypedPointer.Create(ref v.Item4);\n                case 4: return TypedPointer.Create(ref v.Item5);\n                case 5: return TypedPointer.Create(ref v.Item6);\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n        public static TypedPointer GetPointer<T1, T2, T3, T4, T5, T6, T7>(ref ValueTuple<T1, T2, T3, T4, T5, T6, T7> v, int index)\n        {\n            switch (index)\n            {\n                case 0: return TypedPointer.Create(ref v.Item1);\n                case 1: return TypedPointer.Create(ref v.Item2);\n                case 2: return TypedPointer.Create(ref v.Item3);\n                case 3: return TypedPointer.Create(ref v.Item4);\n                case 4: return TypedPointer.Create(ref v.Item5);\n                case 5: return TypedPointer.Create(ref v.Item6);\n                case 6: return TypedPointer.Create(ref v.Item7);\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n\n        //todo: 今、TRest の再帰がうまく扱えてない。\n        //{\n        //    switch (index)\n        //    {\n        //        case 0: return TypedPointer.Create(ref v.Item1);\n        //        case 1: return TypedPointer.Create(ref v.Item2);\n        //        case 2: return TypedPointer.Create(ref v.Item3);\n        //        case 3: return TypedPointer.Create(ref v.Item4);\n        //        case 4: return TypedPointer.Create(ref v.Item5);\n        //        case 5: return TypedPointer.Create(ref v.Item6);\n        //        case 6: return TypedPointer.Create(ref v.Item7);\n        //        default:\n        //            if(_value.Rest is IMemberAccessor) return \n        //            throw new IndexOutOfRangeException();\n        //    }\n        //}\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/Program.cs",
    "content": "﻿using SampleApp.Lib;\nusing System;\nusing System.Text.Utf8;\nusing System.Text.Json;\nusing SampleApp.Samples;\n\nnamespace SampleApp\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var entryData = new Utf8String(\"{ \\\"Code\\\": 10, \\\"Name\\\": \\\"aiueoあいうえお亜以宇江男\\\", \\\"Id\\\": 1234605616436508552, \\\"Hash\\\": 173 }\");\n            var pointData = new Utf8String(\"{ \\\"X\\\": 1, \\\"Y\\\": 2, \\\"Z\\\": 3 }\");\n\n            var entry = new Entry();\n            Deserialize1(entryData.Bytes, entry);\n            Console.WriteLine(entry);\n\n            entry.Value = default((int, string, long, byte));\n            Deserialize2(entryData.Bytes, entry);\n            Console.WriteLine(entry);\n\n            var point = new Point();\n            Deserialize1(pointData.Bytes, point);\n            Console.WriteLine(point);\n\n            point.Value = default((int, int, int));\n            Deserialize2(pointData.Bytes, point);\n            Console.WriteLine(point);\n\n            const int Loops = 10000000;\n\n            for (int n = 0; n < 2; n++)\n            {\n                using (Diagnostics.Measure.Start(\"entry pointer\"))\n                {\n                    for (int i = 0; i < Loops; i++)\n                        Deserialize1(entryData.Bytes, entry);\n                }\n\n                using (Diagnostics.Measure.Start(\"point pointer\"))\n                {\n                    // アロケーション0！\n                    for (int i = 0; i < Loops; i++)\n                        Deserialize1(pointData.Bytes, point);\n                }\n\n                using (Diagnostics.Measure.Start(\"entry boxing\"))\n                {\n                    for (int i = 0; i < Loops; i++)\n                        Deserialize2(entryData.Bytes, entry);\n                }\n\n                using (Diagnostics.Measure.Start(\"point boxing\"))\n                {\n                    for (int i = 0; i < Loops; i++)\n                        Deserialize2(pointData.Bytes, point);\n                }\n            }\n        }\n\n        private static void Deserialize1<T>(ReadOnlySpan<byte> serialized, T item)\n            where T: IMemberAccessor, INamedMemberAccessor\n        {\n            using (var reader = new JsonReader(new Utf8String(serialized)))\n            {\n                while (reader.Read())\n                {\n                    switch (reader.TokenType)\n                    {\n                        case JsonReader.JsonTokenType.ObjectStart:\n                        case JsonReader.JsonTokenType.ObjectEnd:\n                        case JsonReader.JsonTokenType.ArrayStart:\n                        case JsonReader.JsonTokenType.ArrayEnd:\n                            break;\n                        case JsonReader.JsonTokenType.Property:\n                            var name = reader.GetName();\n                            item.Parse(item.GetIndex(name), reader.GetValue());\n                            break;\n                        case JsonReader.JsonTokenType.Value:\n                            var value = reader.GetValue();\n                            break;\n                        default:\n                            break;\n                    }\n                }\n            }\n        }\n\n        private static void Deserialize2<T>(ReadOnlySpan<byte> serialized, T item)\n            where T : IRecordAccessor, INamedMemberAccessor\n        {\n            using (var reader = new JsonReader(new Utf8String(serialized)))\n            {\n                while (reader.Read())\n                {\n                    switch (reader.TokenType)\n                    {\n                        case JsonReader.JsonTokenType.ObjectStart:\n                        case JsonReader.JsonTokenType.ObjectEnd:\n                        case JsonReader.JsonTokenType.ArrayStart:\n                        case JsonReader.JsonTokenType.ArrayEnd:\n                            break;\n                        case JsonReader.JsonTokenType.Property:\n                            var name = reader.GetName();\n                            item.Parse(item.GetIndex(name), reader.GetValue());\n                            break;\n                        case JsonReader.JsonTokenType.Value:\n                            var value = reader.GetValue();\n                            break;\n                        default:\n                            break;\n                    }\n                }\n            }\n        }\n    }\n\n    static class Extensions\n    {\n        public static void Parse(this IRecordAccessor item, int index, Utf8String value)\n        {\n            item.Set(index, Parse(item.GetType(index), value));\n        }\n\n        public static void Parse(this IMemberAccessor item, int index, Utf8String value)\n        {\n            var p = item.GetPointer(index);\n            p.Parse(value);\n        }\n\n        public static object Parse(Type t, Utf8String s)\n        {\n            if (t == typeof(string)) return s.ToString(); // ここの ToString が唯一のアロケーション\n            else if (t == typeof(int))  return (int)ParseInt(s);\n            else if (t == typeof(long)) return ParseInt(s);\n            else if (t == typeof(byte)) return (byte)ParseInt(s);\n            throw new NotSupportedException();\n            //todo: 対応する型を増やす\n        }\n\n        public static void Parse(this TypedPointer p, Utf8String s)\n        {\n            if (p.Type == typeof(string)) p.Ref<string>() = s.ToString(); // ここの ToString が唯一のアロケーション\n            else if (p.Type == typeof(int)) p.Ref<int>() = (int)ParseInt(s);\n            else if (p.Type == typeof(long)) p.Ref<long>() = ParseInt(s);\n            else if (p.Type == typeof(byte)) p.Ref<byte>() = (byte)ParseInt(s);\n            //todo: 対応する型を増やす\n        }\n\n        private static long ParseInt(Utf8String s)\n        {\n            var v = 0L;\n            for (int i = 0; i < s.Bytes.Length; i++)\n            {\n                var b = s.Bytes[i];\n                v *= 10;\n                v += b - (byte)'0';\n            }\n            return v;\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"SampleApp\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"SampleApp\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"c93ac56b-621f-4acb-bae2-ea30f6faca0c\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/SampleApp.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{C93AC56B-621F-4ACB-BAE2-EA30F6FACA0C}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>SampleApp</RootNamespace>\n    <AssemblyName>SampleApp</AssemblyName>\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Diagnostics\\Measure.cs\" />\n    <Compile Include=\"Lib\\IMemberAccessor.cs\" />\n    <Compile Include=\"Lib\\IRecordAccessor.cs\" />\n    <Compile Include=\"Lib\\NameIndexTable.cs\" />\n    <Compile Include=\"Lib\\TypedPointer.cs\" />\n    <Compile Include=\"Lib\\ValueTupleAccessor.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Samples\\Entry.cs\" />\n    <Compile Include=\"Samples\\Point.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <ItemGroup />\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/Samples/Entry.cs",
    "content": "﻿using SampleApp.Lib;\nusing System;\nusing System.Text.Utf8;\n\nnamespace SampleApp.Samples\n{\n    public class Entry : INamedMemberAccessor, IMemberAccessor, IRecordAccessor\n    {\n        private (int Code, string Name, long Id, byte Hash) _value;\n        public ref (int Code, string Name, long Id, byte Hash) Value => ref _value;\n\n        public int Code { get => _value.Code; set => _value.Code = value; }\n        public string Name { get => _value.Name; set => _value.Name = value; }\n        public long Id { get => _value.Id; set => _value.Id = value; }\n        public byte Hash { get => _value.Hash; set => _value.Hash = value; }\n\n        public override string ToString() => _value.ToString();\n\n        NameIndexTable _table;\n        int INamedMemberAccessor.GetIndex(Utf8String name)\n        {\n            if (_table.IsNull) _table = new NameIndexTable(typeof(Entry));\n            return _table[name];\n        }\n\n        TypedPointer IMemberAccessor.GetPointer(int index) => ValueTupleAccessor.GetPointer(ref _value, index);\n\n        Type IRecordAccessor.GetType(int index)\n        {\n            switch (index)\n            {\n                case 0: return typeof(int);\n                case 1: return typeof(string);\n                case 2: return typeof(long);\n                case 3: return typeof(byte);\n            }\n            throw new IndexOutOfRangeException();\n        }\n\n        object IRecordAccessor.Get(int index)\n        {\n            switch (index)\n            {\n                case 0: return _value.Code;\n                case 1: return _value.Name;\n                case 2: return _value.Id;\n                case 3: return _value.Hash;\n            }\n            throw new IndexOutOfRangeException();\n        }\n\n        void IRecordAccessor.Set(int index, object value)\n        {\n            switch (index)\n            {\n                case 0: _value.Code = (int)value; break;\n                case 1: _value.Name = (string)value; break;\n                case 2: _value.Id = (long)value; break;\n                case 3: _value.Hash = (byte)value; break;\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/Samples/Point.cs",
    "content": "﻿using System;\nusing System.Text.Utf8;\nusing SampleApp.Lib;\n\nnamespace SampleApp.Samples\n{\n    public class Point : INamedMemberAccessor, IMemberAccessor, IRecordAccessor\n    {\n        private (int X, int Y, int Z) _value;\n        public ref (int X, int Y, int Z) Value => ref _value;\n\n        public int X { get => _value.X; set => _value.X = value; }\n        public int Y { get => _value.Y; set => _value.Y = value; }\n        public int Z { get => _value.Z; set => _value.Z = value; }\n\n        public override string ToString() => _value.ToString();\n\n        NameIndexTable _table;\n        int INamedMemberAccessor.GetIndex(Utf8String name)\n        {\n            if (_table.IsNull) _table = new NameIndexTable(typeof(Point));\n            return _table[name];\n        }\n\n        TypedPointer IMemberAccessor.GetPointer(int index) => ValueTupleAccessor.GetPointer(ref _value, index);\n\n        Type IRecordAccessor.GetType(int index)\n        {\n            switch (index)\n            {\n                case 0: return typeof(int);\n                case 1: return typeof(int);\n                case 2: return typeof(int);\n            }\n            throw new IndexOutOfRangeException();\n        }\n\n        object IRecordAccessor.Get(int index)\n        {\n            switch (index)\n            {\n                case 0: return _value.X;\n                case 1: return _value.Y;\n                case 2: return _value.Z;\n            }\n            throw new IndexOutOfRangeException();\n        }\n\n        void IRecordAccessor.Set(int index, object value)\n        {\n            switch (index)\n            {\n                case 0: _value.X = (int)value; break;\n                case 1: _value.Y = (int)value; break;\n                case 2: _value.Z = (int)value; break;\n                default: throw new IndexOutOfRangeException();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/SampleApp/project.json",
    "content": "﻿{\n  \"frameworks\": {\n    \"net462\": {}\n  },\n  \"runtimes\": {\n    \"win\": {},\n    \"win-anycpu\": {},\n    \"win-x64\": {}\n  },\n  \"dependencies\": {\n    \"System.Memory\": \"4.4.0-beta-24807-04\",\n    \"System.Runtime.CompilerServices.Unsafe\": \"4.4.0-beta-24807-04\",\n    \"System.Slices\": \"0.1.0-e161207-1\",\n    \"System.Text.Json\": \"0.1.0-e161207-1\",\n    \"System.Text.Primitives\": \"0.1.0-e161207-1\",\n    \"System.ValueTuple\": \"4.4.0-beta-24807-04\"\n  }\n}"
  },
  {
    "path": "Scribble/UnsafeMamberAccessor/UnsafeMamberAccessor.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.25909.2\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SampleApp\", \"SampleApp\\SampleApp.csproj\", \"{C93AC56B-621F-4ACB-BAE2-EA30F6FACA0C}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"FixedPacker\", \"FixedPacker\\FixedPacker.csproj\", \"{F3523B22-7548-4286-8F6A-1AD0DCECBBE0}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{C93AC56B-621F-4ACB-BAE2-EA30F6FACA0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{C93AC56B-621F-4ACB-BAE2-EA30F6FACA0C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{C93AC56B-621F-4ACB-BAE2-EA30F6FACA0C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{C93AC56B-621F-4ACB-BAE2-EA30F6FACA0C}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F3523B22-7548-4286-8F6A-1AD0DCECBBE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F3523B22-7548-4286-8F6A-1AD0DCECBBE0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F3523B22-7548-4286-8F6A-1AD0DCECBBE0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F3523B22-7548-4286-8F6A-1AD0DCECBBE0}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Scribble/ValueTuple/Program.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Text;\n\nnamespace ValueTuples\n{\n    using Sample;\n    using System.Collections.Generic;\n    using System.Linq;\n\n    class Program\n    {\n        static void Main()\n        {\n            //PackUnpack();\n\n            WriteSerializedData(new Serialization.MyFactory());\n            Console.ReadKey();\n            WriteSerializedData(new Serialization.MyBinaryFactory());\n        }\n\n        private static void PackUnpack()\n        {\n            var packed = Pack();\n\n            foreach (var x in Unpack(packed))\n            {\n                if (x is MiniMessagePack.Number)\n                {\n                    var n = (MiniMessagePack.Number)x;\n                    Console.WriteLine($\"{n.Type}: {n}\");\n                }\n                else\n                {\n                    Console.WriteLine($\"{x.GetType().Name}: {x}\");\n                }\n            }\n        }\n\n        private static IEnumerable<object> Unpack(byte[] packed)\n        {\n            var p = new MiniMessagePack.MiniMessagePacker();\n\n            using (var s = new MemoryStream(packed))\n            {\n                for (int i = 0; i < 29; i++)\n                {\n                    yield return p.UnpackNumber(s);\n                }\n\n                yield return p.Unpack(s);\n            }\n        }\n\n        private static byte[] Pack()\n        {\n            var p = new MiniMessagePack.MiniMessagePacker();\n\n            using (var s = new MemoryStream())\n            {\n                p.Pack(s, (byte)1);\n                p.Pack(s, (sbyte)1);\n                p.Pack(s, (short)1);\n                p.Pack(s, (ushort)1);\n                p.Pack(s, (int)1);\n\n                p.Pack(s, (uint)1);\n                p.Pack(s, (long)1);\n                p.Pack(s, (ulong)1);\n                p.Pack(s, (float)1);\n                p.Pack(s, (double)1);\n\n                p.Pack(s, 0);\n                p.Pack(s, 0xFF);\n                p.Pack(s, 0xFFFF);\n                p.Pack(s, 0xFFFFFFFF);\n                p.Pack(s, 0xFFFFFFFFFFFFFFFF);\n\n                p.Pack(s, -1);\n                p.Pack(s, 0x7F);\n                p.Pack(s, 0x7FFF);\n                p.Pack(s, 0x7FFFFFFF);\n                p.Pack(s, 0x7FFFFFFFFFFFFFFF);\n\n                p.Pack(s, -10);\n                p.Pack(s, -300);\n                p.Pack(s, -70000);\n                p.Pack(s, -3000000000);\n                p.Pack(s, long.MinValue);\n\n                p.Pack(s, 1e8);\n                p.Pack(s, 1e15);\n                p.Pack(s, true);\n                p.Pack(s, false);\n\n                p.Pack(s, \"abc あいう αβγ 亜以宇\");\n\n                return s.ToArray();\n            }\n        }\n\n        private static void WriteSerializedData(Serialization.ISerializerFactory factory)\n        {\n            WriteSerializedData(factory, new PolyLine(new[] { new Point(1, 2), new Point(3, 4) }, new[] { 1.5, 1.41421356 }));\n            WriteSerializedData(factory, new Pair<Point, string>(new Point(10, 20), \"abcd\"));\n            WriteSerializedData(factory, new Point(10, 20));\n            WriteSerializedData(factory, new[] { 1, 2, 3, 4, 5 });\n            WriteSerializedData(factory, new Unit[]\n            {\n                new Fighter(1, \"Duran\", 3.14),\n                new Mage(2, \"Angela\", \"Earthquake\"),\n                new Thief(3, \"Hawk\", 12, 15),\n            });\n        }\n\n        private static byte[] Serialize(Serialization.ISerializerFactory factory, object value)\n        {\n            using (var s = new MemoryStream())\n            {\n                using (var serializer = factory.GetSerializer(s))\n                    serializer.Serialize(value);\n\n                return s.ToArray();\n            }\n        }\n\n        private static object Deserialize(Serialization.ISerializerFactory factory, Type t, byte[] data)\n        {\n            using (var s = new MemoryStream(data))\n            {\n                using (var deserializer = factory.GetDeserializer(s))\n                    return deserializer.Deserialize(t);\n            }\n        }\n\n        private static void WriteSerializedData(Serialization.ISerializerFactory factory, object value)\n        {\n            var data = Serialize(factory, value);\n\n            Console.WriteLine(\"length: \" + data.Length);\n\n            var serialized = Encoding.UTF8.GetString(data);\n            Console.WriteLine(serialized);\n\n            var deserialized = Deserialize(factory, value.GetType(), data);\n\n            var e = deserialized as System.Collections.IEnumerable;\n            if(e == null)\n            {\n                Console.WriteLine(deserialized);\n            }\n            else\n            {\n                Console.WriteLine(string.Join(\", \", e.Cast<object>().Select(x => x.ToString())));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"ValueTuple\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ValueTuple\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります\n[assembly: Guid(\"4f88628e-5e67-43bc-9524-00394127b6c7\")]\n\n// アセンブリのバージョン情報は次の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン\n//      ビルド番号\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Scribble/ValueTuple/Reflection/ArrayTypeInfo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ValueTuples.Reflection\n{\n    public class ArrayTypeInfo : RecordTypeInfo\n    {\n        public RecordTypeInfo ElementType { get; }\n\n        internal ArrayTypeInfo(RecordTypeInfo elementType)\n        {\n            ElementType = elementType;\n        }\n\n        public override bool IsArray => true;\n\n        public override IEnumerable<RecordFieldInfo> Fields => Enumerable.Empty<RecordFieldInfo>();\n\n        public override Type Type => ElementType.Type.MakeArrayType();\n\n        public override IRecordAccessor GetAccessor(object instance)\n        {\n            throw new NotImplementedException();\n        }\n\n        public override Array GetArray(int length) => ElementType.GetArray(length);\n\n        public override object GetInstance() => ElementType.GetInstance();\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Reflection/IRecordAccessor.cs",
    "content": "﻿namespace ValueTuples.Reflection\n{\n    /// <summary>\n    /// プロパティに名前でアクセスしたり、インデックスでアクセスしたりを、\n    /// リフレクションでなく、事前コード生成でやるためのインターフェイス。\n    /// </summary>\n    public interface IRecordAccessor\n    {\n        /// <summary>\n        /// インデックス指定でフィールドの値を取り出す。\n        /// </summary>\n        /// <param name=\"index\">インデックス</param>\n        /// <returns>取り出した値</returns>\n        object Get(int index);\n\n        /// <summary>\n        /// インデックス指定でフィールドの値を設定する。\n        /// </summary>\n        /// <param name=\"index\">インデックス</param>\n        /// <param name=\"value\">設定したい値。</param>\n        void Set(int index, object value);\n\n        /// <summary>\n        /// フィールド名指定でフィールドの値を取り出す。\n        /// </summary>\n        /// <param name=\"key\">フィールド名</param>\n        /// <returns>取り出した値</returns>\n        object Get(string key);\n\n        /// <summary>\n        /// フィールド名指定でフィールドの値を設定する。\n        /// </summary>\n        /// <param name=\"key\">フィールド名</param>\n        /// <param name=\"value\">設定したい値。</param>\n        void Set(string key, object value);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Reflection/Primitives.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace ValueTuples.Reflection\n{\n    class SimpleTypeInfo<T> : RecordTypeInfo\n    {\n        public override Type Type => typeof(T);\n        public override bool IsSimple => true;\n        public override IEnumerable<RecordFieldInfo> Fields => Enumerable.Empty<RecordFieldInfo>();\n        public override object GetInstance() => null;\n        public override Array GetArray(int length) => new T[length];\n        public override IRecordAccessor GetAccessor(object instance) => null;\n    }\n\n    class ByteInfo : SimpleTypeInfo<byte> { }\n    class SByteInfo : SimpleTypeInfo<sbyte> { }\n    class Int16Info : SimpleTypeInfo<short> { }\n    class UInt16Info : SimpleTypeInfo<ushort> { }\n    class Int32Info : SimpleTypeInfo<int> { }\n    class UInt32Info : SimpleTypeInfo<uint> { }\n    class Int64Info : SimpleTypeInfo<long> { }\n    class UInt64Info : SimpleTypeInfo<ulong> { }\n    class BooleanInfo : SimpleTypeInfo<bool> { }\n    class DateTimeInfo : SimpleTypeInfo<DateTime> { }\n    class SingleInfo : SimpleTypeInfo<float> { }\n    class DoubleInfo : SimpleTypeInfo<double> { }\n    class DecimalInfo : SimpleTypeInfo<decimal> { }\n    class StringInfo : SimpleTypeInfo<string> { }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Reflection/RecordFieldInfo.cs",
    "content": "﻿namespace ValueTuples.Reflection\n{\n    /// <summary>\n    /// <see cref=\"RecordTypeInfo\"/> のフィールド情報。\n    /// </summary>\n    public struct RecordFieldInfo\n    {\n        /// <summary>\n        /// フィールドの型。\n        /// </summary>\n        public RecordTypeInfo Type { get; }\n\n        /// <summary>\n        /// フィールド名。\n        /// </summary>\n        public string Name { get; }\n\n        /// <summary>\n        /// フィールドが定義されているインデックス。\n        /// </summary>\n        public int Index { get; }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"type\"><see cref=\"Type\"/></param>\n        /// <param name=\"name\"><see cref=\"Name\"/></param>\n        /// <param name=\"index\"><see cref=\"Index\"/></param>\n        public RecordFieldInfo(RecordTypeInfo type, string name, int index)\n        {\n            Type = type;\n            Name = name;\n            Index = index;\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Reflection/RecordTypeInfo.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ValueTuples.Reflection\n{\n    /// <summary>\n    /// リフレクションを使えない環境で、事前コード生成で作っておく型情報。\n    /// </summary>\n    /// <remarks>\n    /// 継承階層を持ったクラスとかをシリアライズ、デシリアライズしたいという要件があって、\n    /// 一般的なシリアライザーの類が使いにくかったりする。\n    /// </remarks>\n    public abstract class RecordTypeInfo\n    {\n        /// <summary>\n        /// 元の型情報。\n        /// </summary>\n        public abstract Type Type { get; }\n\n        /// <summary>\n        /// 単純型(プリミティブ、文字列、時刻など)かどうか。\n        /// </summary>\n        public virtual bool IsSimple => false;\n\n        /// <summary>\n        /// 配列かどうか。\n        /// </summary>\n        public virtual bool IsArray => false;\n\n        /// <summary>\n        /// 継承階層の親側かどうか。\n        /// </summary>\n        public virtual bool IsBase => false;\n\n        /// <summary>\n        /// 継承階層の子側かどうか。\n        /// この場合、<see cref=\"Discriminator\"/> で具体的な型を弁別する。\n        /// </summary>\n        public bool IsChild => Discriminator != null;\n\n        /// <summary>\n        /// フィールド情報。\n        /// </summary>\n        public abstract IEnumerable<RecordFieldInfo> Fields { get; }\n\n        /// <summary>\n        /// 継承階層を持っているときに、具体的な型を判別するために使う数値。\n        /// </summary>\n        /// <remarks>\n        /// 同じ階層内で一意ならなんでもいい。\n        /// </remarks>\n        public virtual int? Discriminator => null;\n\n        /// <summary>\n        /// 継承階層を持っているときに、<see cref=\"Discriminator\"/> の値から具体的な型を得る。\n        /// </summary>\n        /// <param name=\"discriminator\">型判別用の数値。</param>\n        /// <returns></returns>\n        public virtual RecordTypeInfo GetType(int discriminator) => this;\n\n        /// <summary>\n        /// <see cref=\"Activator.CreateInstance(Type)\"/> 代わり。\n        /// 引数なしのコンストラクターを呼んでインスタンスを作る。\n        /// </summary>\n        /// <returns></returns>\n        public abstract object GetInstance();\n\n        /// <summary>\n        /// <see cref=\"Array.CreateInstance(Type, int)\"/> 代わり。\n        /// 個数を指定して配列を作る。\n        /// </summary>\n        /// <returns></returns>\n        public abstract Array GetArray(int length);\n\n        /// <summary>\n        /// アクセサーを作る。\n        /// </summary>\n        /// <param name=\"instance\">アクセサーをかませたいインスタンス。</param>\n        /// <returns></returns>\n        public abstract IRecordAccessor GetAccessor(object instance);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Reflection/TypeRepository.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace ValueTuples.Reflection\n{\n    public static class TypeRepository\n    {\n        private static Dictionary<Type, RecordTypeInfo> _table = new Dictionary<Type, RecordTypeInfo>();\n\n        static TypeRepository()\n        {\n            _table[typeof(Byte)] = Byte;\n            _table[typeof(SByte)] = SByte;\n            _table[typeof(Int16)] = Int16;\n            _table[typeof(UInt16)] = UInt16;\n            _table[typeof(Int32)] = Int32;\n            _table[typeof(UInt32)] = UInt32;\n            _table[typeof(Int64)] = Int64;\n            _table[typeof(UInt64)] = UInt64;\n            _table[typeof(Boolean)] = Boolean;\n            _table[typeof(DateTime)] = DateTime;\n            _table[typeof(Single)] = Single;\n            _table[typeof(Double)] = Double;\n            _table[typeof(Decimal)] = Decimal;\n            _table[typeof(String)] = String;\n        }\n\n        public static readonly RecordTypeInfo Byte = new ByteInfo();\n        public static readonly RecordTypeInfo SByte = new SByteInfo();\n        public static readonly RecordTypeInfo Int16 = new Int16Info();\n        public static readonly RecordTypeInfo UInt16 = new UInt16Info();\n        public static readonly RecordTypeInfo Int32 = new Int32Info();\n        public static readonly RecordTypeInfo UInt32 = new UInt32Info();\n        public static readonly RecordTypeInfo Int64 = new Int64Info();\n        public static readonly RecordTypeInfo UInt64 = new UInt64Info();\n        public static readonly RecordTypeInfo Boolean = new BooleanInfo();\n        public static readonly RecordTypeInfo DateTime = new DateTimeInfo();\n        public static readonly RecordTypeInfo Single = new SingleInfo();\n        public static readonly RecordTypeInfo Double = new DoubleInfo();\n        public static readonly RecordTypeInfo Decimal = new DecimalInfo();\n        public static readonly RecordTypeInfo String = new StringInfo();\n\n        public static void Register(Type t, RecordTypeInfo info) => _table[t] = info;\n\n        public static RecordTypeInfo Get(Type t)\n        {\n            if(t.IsArray)\n            {\n                var elem = Get(t.GetElementType());\n                return new ArrayTypeInfo(elem);\n            }\n            return _table[t];\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Sample/Fighter.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing ValueTuples.Reflection;\n\nnamespace ValueTuples.Sample\n{\n    public class Fighter : Unit\n    {\n        public double Strength { get; set; }\n\n        public Fighter() { }\n        public Fighter(int id, string name, double strength) : base(id, name) { Strength = strength; }\n\n        static Fighter()\n        {\n            TypeRepository.Register(typeof(Fighter), new FighterInfo());\n        }\n    }\n\n    internal struct FighterAccessor : IRecordAccessor\n    {\n        Fighter _value;\n\n        public FighterAccessor(Fighter value) { _value = value; }\n\n        public object Get(string key)\n        {\n            switch (key)\n            {\n                case \"Id\": return _value.Id;\n                case \"Name\": return _value.Name;\n                case \"Strength\": return _value.Strength;\n                default: return null;\n            }\n        }\n\n        public object Get(int index)\n        {\n            switch (index)\n            {\n                case 0: return _value.Id;\n                case 1: return _value.Name;\n                case 2: return _value.Strength;\n                default: return null;\n            }\n        }\n\n        public void Set(string key, object value)\n        {\n            switch (key)\n            {\n                case \"Id\": _value.Id = (int)value; break;\n                case \"Name\": _value.Name = (string)value; break;\n                case \"Strength\": _value.Strength = (double)value; break;\n            }\n        }\n\n        public void Set(int index, object value)\n        {\n            switch (index)\n            {\n                case 0: _value.Id = (int)value; break;\n                case 1: _value.Name = (string)value; break;\n                case 2: _value.Strength = (double)value; break;\n            }\n        }\n    }\n\n    internal class FighterInfo : RecordTypeInfo\n    {\n        public override Type Type => typeof(Fighter);\n\n        public override int? Discriminator => (int)UnitType.Fighter;\n\n        private static readonly RecordFieldInfo[] _fields =\n        {\n            new RecordFieldInfo(TypeRepository.Int32, \"Id\", 0),\n            new RecordFieldInfo(TypeRepository.String, \"Name\", 1),\n            new RecordFieldInfo(TypeRepository.Double, \"Strength\", 2),\n        };\n\n        public override IEnumerable<RecordFieldInfo> Fields => _fields;\n\n        public override object GetInstance() => new Fighter();\n        public override Array GetArray(int length) => new Fighter[length];\n\n        public override IRecordAccessor GetAccessor(object instance) => new FighterAccessor((Fighter)instance);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Sample/Mage.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing ValueTuples.Reflection;\n\nnamespace ValueTuples.Sample\n{\n    public class Mage : Unit\n    {\n        public string Spell { get; set; }\n\n        public Mage() { }\n        public Mage(int id, string name, string spell) : base(id, name) { Spell = spell; }\n\n        static Mage()\n        {\n            TypeRepository.Register(typeof(Mage), new MageInfo());\n        }\n    }\n\n    internal struct MageAccessor : IRecordAccessor\n    {\n        Mage _value;\n\n        public MageAccessor(Mage value) { _value = value; }\n\n        public object Get(string key)\n        {\n            switch (key)\n            {\n                case \"Id\": return _value.Id;\n                case \"Name\": return _value.Name;\n                case \"Spell\": return _value.Spell;\n                default: return null;\n            }\n        }\n\n        public object Get(int index)\n        {\n            switch (index)\n            {\n                case 0: return _value.Id;\n                case 1: return _value.Name;\n                case 2: return _value.Spell;\n                default: return null;\n            }\n        }\n\n        public void Set(string key, object value)\n        {\n            switch (key)\n            {\n                case \"Id\": _value.Id = (int)value; break;\n                case \"Name\": _value.Name = (string)value; break;\n                case \"Spell\": _value.Spell = (string)value; break;\n            }\n        }\n\n        public void Set(int index, object value)\n        {\n            switch (index)\n            {\n                case 0: _value.Id = (int)value; break;\n                case 1: _value.Name = (string)value; break;\n                case 2: _value.Spell = (string)value; break;\n            }\n        }\n    }\n\n    internal class MageInfo : RecordTypeInfo\n    {\n        public override Type Type => typeof(Mage);\n\n        public override int? Discriminator => (int)UnitType.Mage;\n\n        private static readonly RecordFieldInfo[] _fields =\n        {\n            new RecordFieldInfo(TypeRepository.Int32, \"Id\", 0),\n            new RecordFieldInfo(TypeRepository.String, \"Name\", 1),\n            new RecordFieldInfo(TypeRepository.String, \"Spell\", 2),\n        };\n\n        public override IEnumerable<RecordFieldInfo> Fields => _fields;\n\n        public override object GetInstance() => new Mage();\n        public override Array GetArray(int length) => new Mage[length];\n\n        public override IRecordAccessor GetAccessor(object instance) => new MageAccessor((Mage)instance);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Sample/Pair.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing ValueTuples.Reflection;\n\nnamespace ValueTuples.Sample\n{\n    public partial class Pair<T1, T2>\n    {\n        public override string ToString() => $\"({Item1}, {Item2})\";\n    }\n\n    public partial class Pair<T1, T2>\n    {\n        public T1 Item1 { get; set; }\n        public T2 Item2 { get; set; }\n\n        public Pair() { }\n        public Pair(T1 item1, T2 item2) { Item1 = item1; Item2 = item2; }\n\n        static Pair()\n        {\n            TypeRepository.Register(typeof(Pair<T1, T2>), new PairInfo<T1, T2>());\n        }\n    }\n\n    internal struct PairAccessor<T1, T2> : IRecordAccessor\n    {\n        Pair<T1, T2> _value;\n\n        public PairAccessor(Pair<T1, T2> value) { _value = value; }\n\n        public object Get(string key)\n        {\n            switch (key)\n            {\n                case \"Item1\": return _value.Item1;\n                case \"Item2\": return _value.Item2;\n                default: return null;\n            }\n        }\n\n        public object Get(int index)\n        {\n            switch (index)\n            {\n                case 0: return _value.Item1;\n                case 1: return _value.Item2;\n                default: return null;\n            }\n        }\n\n        public void Set(string key, object value)\n        {\n            switch (key)\n            {\n                case \"Item1\": _value.Item1 = (T1)value; break;\n                case \"Item2\": _value.Item2 = (T2)value; break;\n            }\n        }\n\n        public void Set(int index, object value)\n        {\n            switch (index)\n            {\n                case 0: _value.Item1 = (T1)value; break;\n                case 1: _value.Item2 = (T2)value; break;\n            }\n        }\n    }\n\n\n    internal class PairInfo<T1, T2> : RecordTypeInfo\n    {\n        public override Type Type => typeof(Pair<T1, T2>);\n\n        private static readonly RecordFieldInfo[] _fields =\n        {\n            new RecordFieldInfo(TypeRepository.Get(typeof(T1)), \"Item1\", 0),\n            new RecordFieldInfo(TypeRepository.Get(typeof(T2)), \"Item2\", 1),\n        };\n\n        public override IEnumerable<RecordFieldInfo> Fields => _fields;\n\n        public override object GetInstance() => new Pair<T1, T2>();\n        public override Array GetArray(int length) => new Pair<T1, T2>[length];\n\n        public override IRecordAccessor GetAccessor(object instance) => new PairAccessor<T1, T2>((Pair<T1, T2>)instance);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Sample/Point.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing ValueTuples.Reflection;\n\nnamespace ValueTuples.Sample\n{\n    public partial class Point\n    {\n        public override string ToString() => $\"({X}, {Y})\";\n    }\n\n    public partial class Point\n    {\n        public int X { get; set; }\n\n        public int Y { get; set; }\n\n        public Point() { }\n        public Point(int x, int y) { X = x; Y = y; }\n\n        static Point()\n        {\n            TypeRepository.Register(typeof(Point), new PointInfo());\n        }\n    }\n\n    internal struct PointAccessor : IRecordAccessor\n    {\n        Point _value;\n\n        public PointAccessor(Point value) { _value = value; }\n\n        public object Get(string key)\n        {\n            switch (key)\n            {\n                case \"X\": return _value.X;\n                case \"Y\": return _value.Y;\n                default: return null;\n            }\n        }\n\n        public object Get(int index)\n        {\n            switch (index)\n            {\n                case 0: return _value.X;\n                case 1: return _value.Y;\n                default: return null;\n            }\n        }\n\n        public void Set(string key, object value)\n        {\n            switch (key)\n            {\n                case \"X\": _value.X = (int)value; break;\n                case \"Y\": _value.Y = (int)value; break;\n            }\n        }\n\n        public void Set(int index, object value)\n        {\n            switch (index)\n            {\n                case 0: _value.X = (int)value; break;\n                case 1: _value.Y = (int)value; break;\n            }\n        }\n    }\n\n\n    internal class PointInfo : RecordTypeInfo\n    {\n        public override Type Type => typeof(Point);\n\n        private static readonly RecordFieldInfo[] _fields =\n        {\n            new RecordFieldInfo(TypeRepository.Int32, \"X\", 0),\n            new RecordFieldInfo(TypeRepository.Int32, \"Y\", 1),\n        };\n\n        public override IEnumerable<RecordFieldInfo> Fields => _fields;\n\n        public override object GetInstance() => new Point();\n        public override Array GetArray(int length) => new Point[length];\n\n        public override IRecordAccessor GetAccessor(object instance) => new PointAccessor((Point)instance);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Sample/PolyLine.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing ValueTuples.Reflection;\n\nnamespace ValueTuples.Sample\n{\n    public partial class PolyLine\n    {\n        public override string ToString() => string.Join(\" - \", Points.AsEnumerable()) + \" / \" + string.Join(\", \", Weights.AsEnumerable());\n    }\n\n    public partial class PolyLine\n    {\n        public Point[] Points { get; set; }\n        public double[] Weights { get; set; }\n\n        public PolyLine() { }\n        public PolyLine(Point[] points, double[] weights) { Points = points; Weights = weights; }\n\n        static PolyLine()\n        {\n            TypeRepository.Register(typeof(PolyLine), new PolyLineInfo());\n        }\n    }\n\n    internal struct PolyLineAccessor : IRecordAccessor\n    {\n        PolyLine _value;\n\n        public PolyLineAccessor(PolyLine value) { _value = value; }\n\n        public object Get(string key)\n        {\n            switch (key)\n            {\n                case \"Points\": return _value.Points;\n                case \"Weights\": return _value.Weights;\n                default: return null;\n            }\n        }\n\n        public object Get(int index)\n        {\n            switch (index)\n            {\n                case 0: return _value.Points;\n                case 1: return _value.Weights;\n                default: return null;\n            }\n        }\n\n        public void Set(string key, object value)\n        {\n            switch (key)\n            {\n                case \"Points\": _value.Points = (Point[])value; break;\n                case \"Weights\": _value.Weights = (double[])value; break;\n            }\n        }\n\n        public void Set(int index, object value)\n        {\n            switch (index)\n            {\n                case 0: _value.Points = (Point[])value; break;\n                case 1: _value.Weights = (double[])value; break;\n            }\n        }\n    }\n\n\n    internal class PolyLineInfo : RecordTypeInfo\n    {\n        public override Type Type => typeof(PolyLine);\n\n        private static readonly RecordFieldInfo[] _fields =\n        {\n            new RecordFieldInfo(TypeRepository.Get(typeof(Point[])), \"Points\", 0),\n            new RecordFieldInfo(TypeRepository.Get(typeof(double[])), \"Weights\", 1),\n        };\n\n        public override IEnumerable<RecordFieldInfo> Fields => _fields;\n\n        public override object GetInstance() => new PolyLine();\n        public override Array GetArray(int length) => new PolyLine[length];\n\n        public override IRecordAccessor GetAccessor(object instance) => new PolyLineAccessor((PolyLine)instance);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Sample/Thief.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing ValueTuples.Reflection;\n\nnamespace ValueTuples.Sample\n{\n    public class Thief : Unit\n    {\n        public int Agility { get; set; }\n        public int Skill { get; set; }\n\n        public Thief() { }\n        public Thief(int id, string name, int agility, int skill) : base(id, name) { Agility = agility; Skill = skill; }\n\n        static Thief()\n        {\n            TypeRepository.Register(typeof(Thief), new ThiefInfo());\n        }\n    }\n\n    internal struct ThiefAccessor : IRecordAccessor\n    {\n        Thief _value;\n\n        public ThiefAccessor(Thief value) { _value = value; }\n\n        public object Get(string key)\n        {\n            switch (key)\n            {\n                case \"Id\": return _value.Id;\n                case \"Name\": return _value.Name;\n                case \"Agility\": return _value.Agility;\n                case \"Skill\": return _value.Skill;\n                default: return null;\n            }\n        }\n\n        public object Get(int index)\n        {\n            switch (index)\n            {\n                case 0: return _value.Id;\n                case 1: return _value.Name;\n                case 2: return _value.Agility;\n                case 3: return _value.Skill;\n                default: return null;\n            }\n        }\n\n        public void Set(string key, object value)\n        {\n            switch (key)\n            {\n                case \"Id\": _value.Id = (int)value; break;\n                case \"Name\": _value.Name = (string)value; break;\n                case \"Agility\": _value.Agility = (int)value; break;\n                case \"Skill\": _value.Skill = (int)value; break;\n            }\n        }\n\n        public void Set(int index, object value)\n        {\n            switch (index)\n            {\n                case 0: _value.Id = (int)value; break;\n                case 1: _value.Name = (string)value; break;\n                case 2: _value.Agility = (int)value; break;\n                case 3: _value.Skill = (int)value; break;\n            }\n        }\n    }\n\n    internal class ThiefInfo : RecordTypeInfo\n    {\n        public override Type Type => typeof(Thief);\n\n        public override int? Discriminator => (int)UnitType.Thief;\n\n        private static readonly RecordFieldInfo[] _fields =\n        {\n            new RecordFieldInfo(TypeRepository.Int32, \"Id\", 0),\n            new RecordFieldInfo(TypeRepository.String, \"Name\", 1),\n            new RecordFieldInfo(TypeRepository.Int32, \"Agility\", 2),\n            new RecordFieldInfo(TypeRepository.Int32, \"Skill\", 3),\n        };\n\n        public override IEnumerable<RecordFieldInfo> Fields => _fields;\n\n        public override object GetInstance() => new Thief();\n        public override Array GetArray(int length) => new Thief[length];\n\n        public override IRecordAccessor GetAccessor(object instance) => new ThiefAccessor((Thief)instance);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Sample/Unit.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing ValueTuples.Reflection;\n\nnamespace ValueTuples.Sample\n{\n    public enum UnitType\n    {\n        Fighter,\n        Mage,\n        Thief,\n    }\n\n    public class Unit\n    {\n        public int Id { get; set; }\n        public string Name { get; set; }\n\n        public Unit() { }\n        public Unit(int id, string name) { Id = id; Name = name; }\n\n        static Unit()\n        {\n            TypeRepository.Register(typeof(Unit), new UnitInfo());\n        }\n    }\n\n    internal struct UnitAccessor : IRecordAccessor\n    {\n        Unit _value;\n\n        public UnitAccessor(Unit value) { _value = value; }\n\n        public object Get(string key)\n        {\n            switch (key)\n            {\n                case \"Id\": return _value.Id;\n                case \"Name\": return _value.Name;\n                default: return null;\n            }\n        }\n\n        public object Get(int index)\n        {\n            switch (index)\n            {\n                case 0: return _value.Id;\n                case 1: return _value.Name;\n                default: return null;\n            }\n        }\n\n        public void Set(string key, object value)\n        {\n            switch (key)\n            {\n                case \"Id\": _value.Id = (int)value; break;\n                case \"Name\": _value.Name = (string)value; break;\n            }\n        }\n\n        public void Set(int index, object value)\n        {\n            switch (index)\n            {\n                case 0: _value.Id = (int)value; break;\n                case 1: _value.Name = (string)value; break;\n            }\n        }\n    }\n\n    internal class UnitInfo : RecordTypeInfo\n    {\n        public override Type Type => typeof(Unit);\n\n        public override bool IsBase => true;\n\n        private static readonly RecordFieldInfo[] _fields =\n        {\n            new RecordFieldInfo(TypeRepository.Int32, \"Id\", 0),\n            new RecordFieldInfo(TypeRepository.String, \"Name\", 1),\n        };\n\n        public override IEnumerable<RecordFieldInfo> Fields => _fields;\n\n        public override object GetInstance() => new Unit();\n        public override Array GetArray(int length) => new Unit[length];\n\n        public override IRecordAccessor GetAccessor(object instance) => new UnitAccessor((Unit)instance);\n\n        public override RecordTypeInfo GetType(int discriminator)\n        {\n            switch ((UnitType)discriminator)\n            {\n                case UnitType.Fighter: return TypeRepository.Get(typeof(Fighter));\n                case UnitType.Mage: return TypeRepository.Get(typeof(Mage));\n                case UnitType.Thief: return TypeRepository.Get(typeof(Thief));\n                default: return null; // throw\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Serialization/IDeserializer.cs",
    "content": "﻿using System;\n\nnamespace ValueTuples.Serialization\n{\n    public interface IDeserializer : IDisposable\n    {\n        object Deserialize(Type t);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Serialization/ISerializer.cs",
    "content": "﻿using System;\n\nnamespace ValueTuples.Serialization\n{\n    public interface ISerializer : IDisposable\n    {\n        void Serialize(object value);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Serialization/ISerializerFactory.cs",
    "content": "﻿using System.IO;\n\nnamespace ValueTuples.Serialization\n{\n    public interface ISerializerFactory\n    {\n        ISerializer GetSerializer(Stream stream);\n        IDeserializer GetDeserializer(Stream stream);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Serialization/MiniMessagePack.cs",
    "content": "﻿/* MiniMessagePack - Simple MessagePack(http://msgpack.org/) Parser for C#\n* See https://github.com/shogo82148/MiniMessagePack to get more information.\n* \n*\n* The MIT License (MIT)\n*\n* Copyright (c) 2014 Ichinose Shogo\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in\n* all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n* THE SOFTWARE.\n*/\n\nusing System;\nusing System.Text;\nusing System.IO;\nusing System.Collections.Generic;\nusing System.Collections;\n\nnamespace MiniMessagePack\n{\n    public class MiniMessagePacker\n    {\n        private byte[] tmp0 = new byte[8];\n        private byte[] tmp1 = new byte[8];\n        private byte[] string_buf = new byte[128];\n        private Encoding encoder = Encoding.UTF8;\n\n        public byte[] Pack(object o)\n        {\n            using (MemoryStream ms = new MemoryStream())\n            {\n                Pack(ms, o);\n                return ms.ToArray();\n            }\n        }\n\n        public void Pack(Stream s, object o)\n        {\n            IDictionary asDict;\n            string asStr;\n            IList asList;\n            if (o == null)\n                PackNull(s);\n            else if ((asStr = o as string) != null)\n                Pack(s, asStr);\n            else if ((asList = o as IList) != null)\n                Pack(s, asList);\n            else if ((asDict = o as IDictionary) != null)\n                Pack(s, asDict);\n            else if (o is bool)\n                Pack(s, (bool)o);\n            else if (o is sbyte)\n                Pack(s, (sbyte)o);\n            else if (o is byte)\n                Pack(s, (byte)o);\n            else if (o is short)\n                Pack(s, (short)o);\n            else if (o is ushort)\n                Pack(s, (ushort)o);\n            else if (o is int)\n                Pack(s, (int)o);\n            else if (o is uint)\n                Pack(s, (uint)o);\n            else if (o is long)\n                Pack(s, (long)o);\n            else if (o is ulong)\n                Pack(s, (ulong)o);\n            else if (o is float)\n                Pack(s, (float)o);\n            else if (o is double)\n                Pack(s, (double)o);\n            else\n                Pack(s, o.ToString());\n        }\n\n        private void PackNull(Stream s)\n        {\n            s.WriteByte(0xc0);\n        }\n\n        private void Pack(Stream s, IList list)\n        {\n            int count = list.Count;\n            if (count < 16)\n            {\n                s.WriteByte((byte)(0x90 + count));\n            }\n            else if (count < 0x10000)\n            {\n                s.WriteByte(0xdc);\n                Write(s, (ushort)count);\n            }\n            else\n            {\n                s.WriteByte(0xdd);\n                Write(s, (uint)count);\n            }\n            foreach (object o in list)\n            {\n                Pack(s, o);\n            }\n        }\n\n        private void Pack(Stream s, IDictionary dict)\n        {\n            int count = dict.Count;\n            if (count < 16)\n            {\n                s.WriteByte((byte)(0x80 + count));\n            }\n            else if (count < 0x10000)\n            {\n                s.WriteByte(0xde);\n                Write(s, (ushort)count);\n            }\n            else\n            {\n                s.WriteByte(0xdf);\n                Write(s, (uint)count);\n            }\n            foreach (object key in dict.Keys)\n            {\n                Pack(s, key);\n                Pack(s, dict[key]);\n            }\n        }\n\n        public void Pack(Stream s, bool val)\n        {\n            s.WriteByte(val ? (byte)0xc3 : (byte)0xc2);\n        }\n\n        public void Pack(Stream s, sbyte val)\n        {\n            unchecked\n            {\n                if (val >= -32)\n                {\n                    s.WriteByte((byte)val);\n                }\n                else\n                {\n                    tmp0[0] = 0xd0;\n                    tmp0[1] = (byte)val;\n                    s.Write(tmp0, 0, 2);\n                }\n            }\n        }\n\n        public void Pack(Stream s, byte val)\n        {\n            if (val <= 0x7f)\n            {\n                s.WriteByte(val);\n            }\n            else\n            {\n                tmp0[0] = 0xcc;\n                tmp0[1] = val;\n                s.Write(tmp0, 0, 2);\n            }\n        }\n\n        public void Pack(Stream s, short val)\n        {\n            unchecked\n            {\n                if (val >= 0)\n                {\n                    Pack(s, (ushort)val);\n                }\n                else if (val >= -128)\n                {\n                    Pack(s, (sbyte)val);\n                }\n                else\n                {\n                    s.WriteByte(0xd1);\n                    Write(s, (ushort)val);\n                }\n            }\n        }\n\n        public void Pack(Stream s, ushort val)\n        {\n            unchecked\n            {\n                if (val < 0x100)\n                {\n                    Pack(s, (byte)val);\n                }\n                else\n                {\n                    s.WriteByte(0xcd);\n                    Write(s, (ushort)val);\n                }\n            }\n        }\n\n        public void Pack(Stream s, int val)\n        {\n            unchecked\n            {\n                if (val >= 0)\n                {\n                    Pack(s, (uint)val);\n                }\n                else if (val >= -128)\n                {\n                    Pack(s, (sbyte)val);\n                }\n                else if (val >= -0x8000)\n                {\n                    s.WriteByte(0xd1);\n                    Write(s, (ushort)val);\n                }\n                else\n                {\n                    s.WriteByte(0xd2);\n                    Write(s, (uint)val);\n                }\n            }\n        }\n\n        public void Pack(Stream s, uint val)\n        {\n            unchecked\n            {\n                if (val < 0x100)\n                {\n                    Pack(s, (byte)val);\n                }\n                else if (val < 0x10000)\n                {\n                    s.WriteByte(0xcd);\n                    Write(s, (ushort)val);\n                }\n                else\n                {\n                    s.WriteByte(0xce);\n                    Write(s, (uint)val);\n                }\n            }\n        }\n\n        public void Pack(Stream s, long val)\n        {\n            unchecked\n            {\n                if (val >= 0)\n                {\n                    Pack(s, (ulong)val);\n                }\n                else if (val >= -128)\n                {\n                    Pack(s, (sbyte)val);\n                }\n                else if (val >= -0x8000)\n                {\n                    s.WriteByte(0xd1);\n                    Write(s, (ushort)val);\n                }\n                else if (val >= -0x80000000)\n                {\n                    s.WriteByte(0xd2);\n                    Write(s, (uint)val);\n                }\n                else\n                {\n                    s.WriteByte(0xd3);\n                    Write(s, (ulong)val);\n                }\n            }\n        }\n\n        public void Pack(Stream s, ulong val)\n        {\n            unchecked\n            {\n                if (val < 0x100)\n                {\n                    Pack(s, (byte)val);\n                }\n                else if (val < 0x10000)\n                {\n                    s.WriteByte(0xcd);\n                    Write(s, (ushort)val);\n                }\n                else if (val < 0x100000000)\n                {\n                    s.WriteByte(0xce);\n                    Write(s, (uint)val);\n                }\n                else\n                {\n                    s.WriteByte(0xcf);\n                    Write(s, val);\n                }\n            }\n        }\n\n        public void Pack(Stream s, float val)\n        {\n            var bytes = BitConverter.GetBytes(val);\n            s.WriteByte(0xca);\n            if (BitConverter.IsLittleEndian)\n            {\n                tmp0[0] = bytes[3];\n                tmp0[1] = bytes[2];\n                tmp0[2] = bytes[1];\n                tmp0[3] = bytes[0];\n                s.Write(tmp0, 0, 4);\n            }\n            else\n            {\n                s.Write(bytes, 0, 4);\n            }\n        }\n\n        public void Pack(Stream s, double val)\n        {\n            var bytes = BitConverter.GetBytes(val);\n            s.WriteByte(0xcb);\n            if (BitConverter.IsLittleEndian)\n            {\n                tmp0[0] = bytes[7];\n                tmp0[1] = bytes[6];\n                tmp0[2] = bytes[5];\n                tmp0[3] = bytes[4];\n                tmp0[4] = bytes[3];\n                tmp0[5] = bytes[2];\n                tmp0[6] = bytes[1];\n                tmp0[7] = bytes[0];\n                s.Write(tmp0, 0, 8);\n            }\n            else\n            {\n                s.Write(bytes, 0, 8);\n            }\n        }\n\n        public void Pack(Stream s, string val)\n        {\n            var bytes = encoder.GetBytes(val);\n            if (bytes.Length < 0x20)\n            {\n                s.WriteByte((byte)(0xa0 + bytes.Length));\n            }\n            else if (bytes.Length < 0x100)\n            {\n                s.WriteByte(0xd9);\n                s.WriteByte((byte)(bytes.Length));\n            }\n            else if (bytes.Length < 0x10000)\n            {\n                s.WriteByte(0xda);\n                Write(s, (ushort)(bytes.Length));\n            }\n            else\n            {\n                s.WriteByte(0xdb);\n                Write(s, (uint)(bytes.Length));\n            }\n            s.Write(bytes, 0, bytes.Length);\n        }\n\n        public void Write(Stream s, ushort val)\n        {\n            unchecked\n            {\n                tmp0[0] = (byte)(val >> 8);\n                tmp0[1] = (byte)val;\n                s.Write(tmp0, 0, 2);\n            }\n        }\n\n        public void Write(Stream s, uint val)\n        {\n            unchecked\n            {\n                tmp0[0] = (byte)(val >> 24);\n                tmp0[1] = (byte)(val >> 16);\n                tmp0[2] = (byte)(val >> 8);\n                tmp0[3] = (byte)val;\n                s.Write(tmp0, 0, 4);\n            }\n        }\n\n        public void Write(Stream s, ulong val)\n        {\n            unchecked\n            {\n                tmp0[0] = (byte)(val >> 56);\n                tmp0[1] = (byte)(val >> 48);\n                tmp0[2] = (byte)(val >> 40);\n                tmp0[3] = (byte)(val >> 32);\n                tmp0[4] = (byte)(val >> 24);\n                tmp0[5] = (byte)(val >> 16);\n                tmp0[6] = (byte)(val >> 8);\n                tmp0[7] = (byte)val;\n                s.Write(tmp0, 0, 8);\n            }\n        }\n\n        public object Unpack(byte[] buf, int offset, int size)\n        {\n            using (MemoryStream ms = new MemoryStream(buf, offset, size))\n            {\n                return Unpack(ms);\n            }\n        }\n\n        public object Unpack(byte[] buf)\n        {\n            return Unpack(buf, 0, buf.Length);\n        }\n\n        public object Unpack(Stream s)\n        {\n            int b = s.ReadByte();\n            if (b < 0)\n            {\n                throw new FormatException();\n            }\n            else if (b <= 0x7f)\n            { // positive fixint\n                return (long)b;\n            }\n            else if (b <= 0x8f)\n            { // fixmap\n                return UnpackMap(s, b & 0x0f);\n            }\n            else if (b <= 0x9f)\n            { // fixarray\n                return UnpackArray(s, b & 0x0f);\n            }\n            else if (b <= 0xbf)\n            { // fixstr\n                return UnpackString(s, b & 0x1f);\n            }\n            else if (b >= 0xe0)\n            { // negative fixint\n                return (long)unchecked((sbyte)b);\n            }\n            switch (b)\n            {\n                case 0xc0:\n                    return null;\n                case 0xc2:\n                    return false;\n                case 0xc3:\n                    return true;\n                case 0xcc: // uint8\n                    return (long)s.ReadByte();\n                case 0xcd: // uint16\n                    return UnpackUint16(s);\n                case 0xce: // uint32\n                    return UnpackUint32(s);\n                case 0xcf: // uint64\n                    if (s.Read(tmp0, 0, 8) != 8)\n                    {\n                        throw new FormatException();\n                    }\n                    return ((long)tmp0[0] << 56) | ((long)tmp0[1] << 48) | ((long)tmp0[2] << 40) | ((long)tmp0[3] << 32)\n                        + ((long)tmp0[4] << 24) | ((long)tmp0[5] << 16) | ((long)tmp0[6] << 8) | (long)tmp0[7];\n                case 0xd0: // int8\n                    return (long)unchecked((sbyte)s.ReadByte());\n                case 0xd1: // int16\n                    if (s.Read(tmp0, 0, 2) != 2)\n                    {\n                        throw new FormatException();\n                    }\n                    return (((long)unchecked((sbyte)tmp0[0])) << 8) | (long)tmp0[1];\n                case 0xd2: // int32\n                    if (s.Read(tmp0, 0, 4) != 4)\n                    {\n                        throw new FormatException();\n                    }\n                    return ((long)unchecked((sbyte)tmp0[0]) << 24) | ((long)tmp0[1] << 16) | ((long)tmp0[2] << 8) | (long)tmp0[3];\n                case 0xd3: // int64\n                    if (s.Read(tmp0, 0, 8) != 8)\n                    {\n                        throw new FormatException();\n                    }\n                    return ((long)unchecked((sbyte)tmp0[0]) << 56) | ((long)tmp0[1] << 48) | ((long)tmp0[2] << 40) | ((long)tmp0[3] << 32)\n                        + ((long)tmp0[4] << 24) | ((long)tmp0[5] << 16) | ((long)tmp0[6] << 8) | (long)tmp0[7];\n                case 0xca: // float32\n                    s.Read(tmp0, 0, 4);\n                    if (BitConverter.IsLittleEndian)\n                    {\n                        tmp1[0] = tmp0[3];\n                        tmp1[1] = tmp0[2];\n                        tmp1[2] = tmp0[1];\n                        tmp1[3] = tmp0[0];\n                        return (double)BitConverter.ToSingle(tmp1, 0);\n                    }\n                    else\n                    {\n                        return (double)BitConverter.ToSingle(tmp0, 0);\n                    }\n                case 0xcb: // float64\n                    s.Read(tmp0, 0, 8);\n                    if (BitConverter.IsLittleEndian)\n                    {\n                        tmp1[0] = tmp0[7];\n                        tmp1[1] = tmp0[6];\n                        tmp1[2] = tmp0[5];\n                        tmp1[3] = tmp0[4];\n                        tmp1[4] = tmp0[3];\n                        tmp1[5] = tmp0[2];\n                        tmp1[6] = tmp0[1];\n                        tmp1[7] = tmp0[0];\n                        return BitConverter.ToDouble(tmp1, 0);\n                    }\n                    else\n                    {\n                        return BitConverter.ToDouble(tmp0, 0);\n                    }\n                case 0xd9: // str8\n                    return UnpackString(s, s.ReadByte());\n                case 0xda: // str16\n                    return UnpackString(s, UnpackUint16(s));\n                case 0xdb: // str32\n                    return UnpackString(s, UnpackUint32(s));\n\n                case 0xc4: // bin8\n                    return UnpackBinary(s, s.ReadByte());\n                case 0xc5: // bin16\n                    return UnpackBinary(s, UnpackUint16(s));\n                case 0xc6: // bin32\n                    return UnpackBinary(s, UnpackUint32(s));\n\n                case 0xdc: // array16\n                    return UnpackArray(s, UnpackUint16(s));\n                case 0xdd: // array32\n                    return UnpackArray(s, UnpackUint32(s));\n\n                case 0xde: // map16\n                    return UnpackMap(s, UnpackUint16(s));\n                case 0xdf: // map32\n                    return UnpackMap(s, UnpackUint32(s));\n            }\n            return null;\n        }\n\n        public Number UnpackNumber(Stream s)\n        {\n            int b = s.ReadByte();\n            if (b < 0)\n            {\n                throw new FormatException();\n            }\n            else if (b <= 0x7f)\n            { // positive fixint\n                return (Number)(sbyte)b;\n            }\n            else if (b >= 0xe0)\n            { // negative fixint\n                return (Number)unchecked((sbyte)b);\n            }\n            switch (b)\n            {\n                case 0xc2:\n                    return (Number)false;\n                case 0xc3:\n                    return (Number)true;\n                case 0xcc: // uint8\n                    return (Number)(byte)s.ReadByte();\n                case 0xcd: // uint16\n                    return (Number)(ushort)UnpackUint16(s);\n                case 0xce: // uint32\n                    return (Number)(uint)UnpackUint32(s);\n                case 0xcf: // uint64\n                    if (s.Read(tmp0, 0, 8) != 8)\n                    {\n                        throw new FormatException();\n                    }\n                    return (Number)(((ulong)tmp0[0] << 56) | ((ulong)tmp0[1] << 48) | ((ulong)tmp0[2] << 40) | ((ulong)tmp0[3] << 32)\n                        + ((ulong)tmp0[4] << 24) | ((ulong)tmp0[5] << 16) | ((ulong)tmp0[6] << 8) | (ulong)tmp0[7]);\n                case 0xd0: // int8\n                    return (Number)unchecked((sbyte)s.ReadByte());\n                case 0xd1: // int16\n                    if (s.Read(tmp0, 0, 2) != 2)\n                    {\n                        throw new FormatException();\n                    }\n                    return (Number)(short)(((unchecked((sbyte)tmp0[0])) << 8) | tmp0[1]);\n                case 0xd2: // int32\n                    if (s.Read(tmp0, 0, 4) != 4)\n                    {\n                        throw new FormatException();\n                    }\n                    return (Number)((unchecked((sbyte)tmp0[0]) << 24) | (tmp0[1] << 16) | (tmp0[2] << 8) | tmp0[3]);\n                case 0xd3: // int64\n                    if (s.Read(tmp0, 0, 8) != 8)\n                    {\n                        throw new FormatException();\n                    }\n                    return (Number)(((long)unchecked((sbyte)tmp0[0]) << 56) | ((long)tmp0[1] << 48) | ((long)tmp0[2] << 40) | ((long)tmp0[3] << 32)\n                        + ((long)tmp0[4] << 24) | ((long)tmp0[5] << 16) | ((long)tmp0[6] << 8) | (long)tmp0[7]);\n                case 0xca: // float32\n                    s.Read(tmp0, 0, 4);\n                    if (BitConverter.IsLittleEndian)\n                    {\n                        tmp1[0] = tmp0[3];\n                        tmp1[1] = tmp0[2];\n                        tmp1[2] = tmp0[1];\n                        tmp1[3] = tmp0[0];\n                        return (Number)BitConverter.ToSingle(tmp1, 0);\n                    }\n                    else\n                    {\n                        return (Number)BitConverter.ToSingle(tmp0, 0);\n                    }\n                case 0xcb: // float64\n                    s.Read(tmp0, 0, 8);\n                    if (BitConverter.IsLittleEndian)\n                    {\n                        tmp1[0] = tmp0[7];\n                        tmp1[1] = tmp0[6];\n                        tmp1[2] = tmp0[5];\n                        tmp1[3] = tmp0[4];\n                        tmp1[4] = tmp0[3];\n                        tmp1[5] = tmp0[2];\n                        tmp1[6] = tmp0[1];\n                        tmp1[7] = tmp0[0];\n                        return (Number)BitConverter.ToDouble(tmp1, 0);\n                    }\n                    else\n                    {\n                        return (Number)BitConverter.ToDouble(tmp0, 0);\n                    }\n            }\n\n            throw new InvalidOperationException();\n        }\n\n        private long UnpackUint16(Stream s)\n        {\n            if (s.Read(tmp0, 0, 2) != 2)\n            {\n                throw new FormatException();\n            }\n            return (long)((tmp0[0] << 8) | tmp0[1]);\n        }\n\n        private long UnpackUint32(Stream s)\n        {\n            if (s.Read(tmp0, 0, 4) != 4)\n            {\n                throw new FormatException();\n            }\n            return ((long)tmp0[0] << 24) | ((long)tmp0[1] << 16) | ((long)tmp0[2] << 8) | (long)tmp0[3];\n        }\n\n        private string UnpackString(Stream s, long len)\n        {\n            if (string_buf.Length < len)\n            {\n                string_buf = new byte[len];\n            }\n            s.Read(string_buf, 0, (int)len);\n            return encoder.GetString(string_buf, 0, (int)len);\n        }\n\n        private byte[] UnpackBinary(Stream s, long len)\n        {\n            byte[] buf = new byte[len];\n            s.Read(buf, 0, (int)len);\n            return buf;\n        }\n\n        private List<object> UnpackArray(Stream s, long len)\n        {\n            var list = new List<object>((int)len);\n            for (long i = 0; i < len; i++)\n            {\n                list.Add(Unpack(s));\n            }\n            return list;\n        }\n\n        private Dictionary<string, object> UnpackMap(Stream s, long len)\n        {\n            var dict = new Dictionary<string, object>((int)len);\n            for (long i = 0; i < len; i++)\n            {\n                string key = Unpack(s) as string;\n                object value = Unpack(s);\n                if (key != null)\n                {\n                    dict.Add(key, value);\n                }\n            }\n            return dict;\n        }\n\n    }\n}\n\n"
  },
  {
    "path": "Scribble/ValueTuple/Serialization/MyBinarySerializer.cs",
    "content": "﻿using MiniMessagePack;\nusing System;\nusing System.Collections;\nusing System.IO;\nusing System.Linq;\nusing ValueTuples.Reflection;\n\nnamespace ValueTuples.Serialization\n{\n    //todo: DateTime\n    // decimal はどうしよう？\n\n    //todo: 型情報のハッシュ値くらいは取れる仕組みを用意してないと、送信側・受信側で型が狂ってた時の判定難しくなるかも。\n\n    //todo: エラー処理。try-catch して、その時unpackしてるRecordFieldInfoが何かを詰めた例外を再throwする\n\n    /// <summary>\n    /// 送信側・受信側の双方で同じ型情報を持っている前提で、\n    /// メンバー名とかの型情報一切なしで、\n    /// ・何番目のフィールドが値を持っているかだけフラグ化して最初に詰める。\n    /// ・フィールドを前から順に、値を持っている箇所だけ、値を再帰的にシリアライズする。\n    /// という方式でシリアライズする。\n    /// </summary>\n    /// <remarks>\n    /// メンバーが32個以上ある型のシリアライズはできない。\n    /// (64個までは増やせるけどそこまでする必要もないと判断。演算をケチった。)\n    ///\n    /// 内部的に MessagePack を使っているものの、数値と文字列(UTF8)のpack/unpackしか使ってない。\n    /// 複合型とか配列の詰め方は自前実装。\n    /// </remarks>\n    public class MyBinaryFactory : ISerializerFactory\n    {\n        public IDeserializer GetDeserializer(Stream stream) => new MyBinaryDeserializer(stream);\n\n        public ISerializer GetSerializer(Stream stream) => new MyBinarySerializer(stream);\n    }\n\n    internal class MyBinarySerializer : ISerializer\n    {\n        MiniMessagePacker _packer = new MiniMessagePacker();\n        Stream _s;\n\n        public MyBinarySerializer(Stream s)\n        {\n            _s = s;\n        }\n\n        private void Pack(int val) => _packer.Pack(_s, val);\n        private void Pack(uint val) => _packer.Pack(_s, val);\n        private void Pack(object val) => _packer.Pack(_s, val);\n\n        public void Dispose() => _s.Dispose();\n\n        public void Serialize(object value)\n        {\n            if (value == null) return;\n\n            var info = TypeRepository.Get(value.GetType());\n\n            if(info.IsSimple)\n            {\n                Pack(value);\n                return;\n            }\n\n            if (info.IsArray)\n            {\n                var array = (IList)value;\n                Pack(array.Count);\n                foreach (var item in array)\n                {\n                    Serialize(item);\n                }\n                return;\n            }\n\n            if(info.IsChild)\n            {\n                Pack(info.Discriminator.Value);\n            }\n\n            var accessor = info.GetAccessor(value);\n\n            var flags = 0u;\n            var i = 1u;\n            foreach (var f in info.Fields)\n            {\n                var x = accessor.Get(f.Index);\n                if (x != null) flags |= i;\n                i <<= 1;\n            }\n            Pack(flags);\n\n            foreach (var f in info.Fields)\n            {\n                var x = accessor.Get(f.Index);\n                Serialize(x);\n            }\n        }\n    }\n\n    internal class MyBinaryDeserializer : IDeserializer\n    {\n        MiniMessagePacker _packer = new MiniMessagePacker();\n        Stream _s;\n\n        public MyBinaryDeserializer(Stream s)\n        {\n            _s = s;\n        }\n\n        private Number UnpackNumber() => _packer.UnpackNumber(_s);\n        private string UnpackString() => (string)_packer.Unpack(_s);\n\n        public void Dispose() => _s.Dispose();\n\n        public object Deserialize(Type t)\n        {\n            if(t.IsPrimitive)\n            {\n                if (t == typeof(int)) { return (int)UnpackNumber(); }\n                if (t == typeof(double)) { return (double)UnpackNumber(); }\n                if (t == typeof(bool)) { return (bool)UnpackNumber(); }\n                if (t == typeof(long)) { return (long)UnpackNumber(); }\n                if (t == typeof(byte)) { return (byte)UnpackNumber(); }\n                if (t == typeof(sbyte)) { return (sbyte)UnpackNumber(); }\n                if (t == typeof(short)) { return (short)UnpackNumber(); }\n                if (t == typeof(ushort)) { return (ushort)UnpackNumber(); }\n                if (t == typeof(uint)) { return (uint)UnpackNumber(); }\n                if (t == typeof(ulong)) { return (ulong)UnpackNumber(); }\n                if (t == typeof(float)) { return (float)UnpackNumber(); }\n            }\n            else if (t == typeof(string)) { return UnpackString(); }\n\n            var info = TypeRepository.Get(t);\n\n            if(info.IsArray)\n            {\n                var length = (int)UnpackNumber();\n                var array = info.GetArray(length);\n                var elem = ((ArrayTypeInfo)info).ElementType.Type;\n\n                for (int i = 0; i < length; i++)\n                {\n                    var item = Deserialize(elem);\n                    array.SetValue(item, i);\n                }\n                return array;\n            }\n\n            if(info.IsBase)\n            {\n                var discriminator = (int)UnpackNumber();\n                info = info.GetType(discriminator);\n            }\n\n            var value = info.GetInstance();\n            var accessor = info.GetAccessor(value);\n            var count = info.Fields.Count();\n\n            var flags = (uint)UnpackNumber();\n\n            foreach (var field in info.Fields)\n            {\n                if ((flags & 1) == 0) continue;\n\n                flags >>= 1;\n\n                var x = Deserialize(field.Type.Type);\n                accessor.Set(field.Index, x);\n            }\n\n            return value;\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Serialization/MySerializer.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.IO;\nusing System.Linq;\nusing ValueTuples.Reflection;\n\nnamespace ValueTuples.Serialization\n{\n    public class MyFactory : ISerializerFactory\n    {\n        public IDeserializer GetDeserializer(Stream stream) => new MyDeserializer(new StreamReader(stream));\n\n        public ISerializer GetSerializer(Stream stream) => new MySerializer(new StreamWriter(stream));\n    }\n\n    internal class MySerializer : ISerializer\n    {\n        StreamWriter _s;\n\n        public MySerializer(StreamWriter s)\n        {\n            _s = s;\n        }\n\n        public void Dispose() => _s.Dispose();\n\n        public void Serialize(object value)\n        {\n            if (value == null) return;\n\n            var info = TypeRepository.Get(value.GetType());\n\n            if(info.IsSimple)\n            {\n                _s.WriteLine(value.ToString());\n                return;\n            }\n\n            if (info.IsArray)\n            {\n                var array = (IList)value;\n                _s.WriteLine(array.Count);\n                foreach (var item in array)\n                {\n                    Serialize(item);\n                }\n                return;\n            }\n\n            if(info.IsChild)\n            {\n                _s.WriteLine(info.Discriminator.Value);\n            }\n\n            var accessor = info.GetAccessor(value);\n\n            foreach (var f in info.Fields)\n            {\n                _s.WriteLine(f.Name);\n\n                var x = accessor.Get(f.Index);\n                Serialize(x);\n            }\n        }\n    }\n\n    internal class MyDeserializer : IDeserializer\n    {\n        StreamReader _s;\n\n        public MyDeserializer(StreamReader s)\n        {\n            _s = s;\n        }\n\n        public void Dispose() => _s.Dispose();\n\n        public object Deserialize(Type t)\n        {\n            if (t == typeof(int)) { return int.Parse(_s.ReadLine()); }\n            if (t == typeof(double)) { return double.Parse(_s.ReadLine()); }\n            if (t == typeof(string)) { return _s.ReadLine(); }\n\n            var info = TypeRepository.Get(t);\n\n            if(info.IsArray)\n            {\n                var length = int.Parse(_s.ReadLine());\n                var array = info.GetArray(length);\n                var elem = ((ArrayTypeInfo)info).ElementType.Type;\n\n                for (int i = 0; i < length; i++)\n                {\n                    var item = Deserialize(elem);\n                    array.SetValue(item, i);\n                }\n                return array;\n            }\n\n            if(info.IsBase)\n            {\n                var line = _s.ReadLine();\n                var discriminator = int.Parse(line);\n                info = info.GetType(discriminator);\n            }\n\n            var value = info.GetInstance();\n            var accessor = info.GetAccessor(value);\n            var count = info.Fields.Count();\n\n            while (true)\n            {\n                var line = _s.ReadLine();\n                if (line == null) break;\n\n                var field = info.Fields.First(f => f.Name == line);\n                var x = Deserialize(field.Type.Type);\n                accessor.Set(field.Index, x);\n\n                --count;\n                if (count == 0) break;\n            }\n\n            return value;\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Serialization/Number.tt",
    "content": "﻿<#@ template debug=\"false\" hostspecific=\"false\" language=\"C#\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ import namespace=\"System.Text\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n<#@ output extension=\".cs\" #>\n<#\nvar types = new[]\n{\n    \"bool\",\n    \"byte\",\n    \"sbyte\",\n    \"short\",\n    \"ushort\",\n    \"int\",\n    \"uint\",\n    \"long\",\n    \"ulong\",\n    \"float\",\n    \"double\",\n};\n\nvar integers = new[]\n{\n    \"byte\",\n    \"sbyte\",\n    \"short\",\n    \"ushort\",\n    \"int\",\n    \"uint\",\n    \"long\",\n    \"ulong\",\n};\n\nvar floats = new[]\n{\n    \"float\",\n    \"double\",\n};\n#>\nusing System;\nusing System.Runtime.InteropServices;\n\nnamespace MiniMessagePack\n{\n    public enum NumberType : byte\n    {\n<#\nforeach (var t in types)\n{\n#>\n        _<#= t #>,\n<#\n}\n#>\n    }\n\n    [StructLayout(LayoutKind.Explicit)]\n    public struct Number\n    {\n<#\nforeach (var t in types)\n{\n#>\n        [FieldOffset(0)] <#= t #> _<#= t #>;\n        public Number(<#= t #> b) : this() { _<#= t #> = b; _type = NumberType._<#= t #>; }\n        public static explicit operator Number (<#= t #> n) => new Number(n);\n<#\n}\n#>\n<#\nforeach (var dst in integers)\n{\n#>\n        public static explicit operator <#= dst #> (Number n)\n        {\n            switch (n._type)\n            {\n<#\n    foreach (var src in integers)\n    {\n#>\n            case NumberType._<#= src #>: return unchecked((<#= dst #>)n._<#= src #>);\n<#\n    }\n#>\n            }\n            throw new InvalidCastException();\n        }\n\n<#\n}\n#>\n<#\nforeach (var dst in floats)\n{\n#>\n        public static explicit operator <#= dst #> (Number n)\n        {\n            switch (n._type)\n            {\n<#\n    foreach (var src in floats)\n    {\n#>\n            case NumberType._<#= src #>: return unchecked((<#= dst #>)n._<#= src #>);\n<#\n    }\n#>\n            }\n            throw new InvalidCastException();\n        }\n\n<#\n}\n#>\n\n        public static explicit operator bool (Number n)\n        {\n            if (n._type != NumberType._byte)\n                throw new InvalidCastException();\n            return n._bool;\n        }\n\n        public override string ToString()\n        {\n            switch (_type)\n            {\n            default:\n<#\n    foreach (var t in types)\n    {\n#>\n            case NumberType._<#= t #>: return _<#= t #>.ToString();\n<#\n    }\n#>\n            }\n        }\n\n        [FieldOffset(8)]\n        NumberType _type;\n\n        public NumberType Type => _type;\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/Serialization/Number1.cs",
    "content": "﻿using System;\nusing System.Runtime.InteropServices;\n\nnamespace MiniMessagePack\n{\n    public enum NumberType : byte\n    {\n        _bool,\n        _byte,\n        _sbyte,\n        _short,\n        _ushort,\n        _int,\n        _uint,\n        _long,\n        _ulong,\n        _float,\n        _double,\n    }\n\n    [StructLayout(LayoutKind.Explicit)]\n    public struct Number\n    {\n        [FieldOffset(0)] bool _bool;\n        public Number(bool b) : this() { _bool = b; _type = NumberType._bool; }\n        public static explicit operator Number (bool n) => new Number(n);\n        [FieldOffset(0)] byte _byte;\n        public Number(byte b) : this() { _byte = b; _type = NumberType._byte; }\n        public static explicit operator Number (byte n) => new Number(n);\n        [FieldOffset(0)] sbyte _sbyte;\n        public Number(sbyte b) : this() { _sbyte = b; _type = NumberType._sbyte; }\n        public static explicit operator Number (sbyte n) => new Number(n);\n        [FieldOffset(0)] short _short;\n        public Number(short b) : this() { _short = b; _type = NumberType._short; }\n        public static explicit operator Number (short n) => new Number(n);\n        [FieldOffset(0)] ushort _ushort;\n        public Number(ushort b) : this() { _ushort = b; _type = NumberType._ushort; }\n        public static explicit operator Number (ushort n) => new Number(n);\n        [FieldOffset(0)] int _int;\n        public Number(int b) : this() { _int = b; _type = NumberType._int; }\n        public static explicit operator Number (int n) => new Number(n);\n        [FieldOffset(0)] uint _uint;\n        public Number(uint b) : this() { _uint = b; _type = NumberType._uint; }\n        public static explicit operator Number (uint n) => new Number(n);\n        [FieldOffset(0)] long _long;\n        public Number(long b) : this() { _long = b; _type = NumberType._long; }\n        public static explicit operator Number (long n) => new Number(n);\n        [FieldOffset(0)] ulong _ulong;\n        public Number(ulong b) : this() { _ulong = b; _type = NumberType._ulong; }\n        public static explicit operator Number (ulong n) => new Number(n);\n        [FieldOffset(0)] float _float;\n        public Number(float b) : this() { _float = b; _type = NumberType._float; }\n        public static explicit operator Number (float n) => new Number(n);\n        [FieldOffset(0)] double _double;\n        public Number(double b) : this() { _double = b; _type = NumberType._double; }\n        public static explicit operator Number (double n) => new Number(n);\n        public static explicit operator byte (Number n)\n        {\n            switch (n._type)\n            {\n            case NumberType._byte: return unchecked((byte)n._byte);\n            case NumberType._sbyte: return unchecked((byte)n._sbyte);\n            case NumberType._short: return unchecked((byte)n._short);\n            case NumberType._ushort: return unchecked((byte)n._ushort);\n            case NumberType._int: return unchecked((byte)n._int);\n            case NumberType._uint: return unchecked((byte)n._uint);\n            case NumberType._long: return unchecked((byte)n._long);\n            case NumberType._ulong: return unchecked((byte)n._ulong);\n            }\n            throw new InvalidCastException();\n        }\n\n        public static explicit operator sbyte (Number n)\n        {\n            switch (n._type)\n            {\n            case NumberType._byte: return unchecked((sbyte)n._byte);\n            case NumberType._sbyte: return unchecked((sbyte)n._sbyte);\n            case NumberType._short: return unchecked((sbyte)n._short);\n            case NumberType._ushort: return unchecked((sbyte)n._ushort);\n            case NumberType._int: return unchecked((sbyte)n._int);\n            case NumberType._uint: return unchecked((sbyte)n._uint);\n            case NumberType._long: return unchecked((sbyte)n._long);\n            case NumberType._ulong: return unchecked((sbyte)n._ulong);\n            }\n            throw new InvalidCastException();\n        }\n\n        public static explicit operator short (Number n)\n        {\n            switch (n._type)\n            {\n            case NumberType._byte: return unchecked((short)n._byte);\n            case NumberType._sbyte: return unchecked((short)n._sbyte);\n            case NumberType._short: return unchecked((short)n._short);\n            case NumberType._ushort: return unchecked((short)n._ushort);\n            case NumberType._int: return unchecked((short)n._int);\n            case NumberType._uint: return unchecked((short)n._uint);\n            case NumberType._long: return unchecked((short)n._long);\n            case NumberType._ulong: return unchecked((short)n._ulong);\n            }\n            throw new InvalidCastException();\n        }\n\n        public static explicit operator ushort (Number n)\n        {\n            switch (n._type)\n            {\n            case NumberType._byte: return unchecked((ushort)n._byte);\n            case NumberType._sbyte: return unchecked((ushort)n._sbyte);\n            case NumberType._short: return unchecked((ushort)n._short);\n            case NumberType._ushort: return unchecked((ushort)n._ushort);\n            case NumberType._int: return unchecked((ushort)n._int);\n            case NumberType._uint: return unchecked((ushort)n._uint);\n            case NumberType._long: return unchecked((ushort)n._long);\n            case NumberType._ulong: return unchecked((ushort)n._ulong);\n            }\n            throw new InvalidCastException();\n        }\n\n        public static explicit operator int (Number n)\n        {\n            switch (n._type)\n            {\n            case NumberType._byte: return unchecked((int)n._byte);\n            case NumberType._sbyte: return unchecked((int)n._sbyte);\n            case NumberType._short: return unchecked((int)n._short);\n            case NumberType._ushort: return unchecked((int)n._ushort);\n            case NumberType._int: return unchecked((int)n._int);\n            case NumberType._uint: return unchecked((int)n._uint);\n            case NumberType._long: return unchecked((int)n._long);\n            case NumberType._ulong: return unchecked((int)n._ulong);\n            }\n            throw new InvalidCastException();\n        }\n\n        public static explicit operator uint (Number n)\n        {\n            switch (n._type)\n            {\n            case NumberType._byte: return unchecked((uint)n._byte);\n            case NumberType._sbyte: return unchecked((uint)n._sbyte);\n            case NumberType._short: return unchecked((uint)n._short);\n            case NumberType._ushort: return unchecked((uint)n._ushort);\n            case NumberType._int: return unchecked((uint)n._int);\n            case NumberType._uint: return unchecked((uint)n._uint);\n            case NumberType._long: return unchecked((uint)n._long);\n            case NumberType._ulong: return unchecked((uint)n._ulong);\n            }\n            throw new InvalidCastException();\n        }\n\n        public static explicit operator long (Number n)\n        {\n            switch (n._type)\n            {\n            case NumberType._byte: return unchecked((long)n._byte);\n            case NumberType._sbyte: return unchecked((long)n._sbyte);\n            case NumberType._short: return unchecked((long)n._short);\n            case NumberType._ushort: return unchecked((long)n._ushort);\n            case NumberType._int: return unchecked((long)n._int);\n            case NumberType._uint: return unchecked((long)n._uint);\n            case NumberType._long: return unchecked((long)n._long);\n            case NumberType._ulong: return unchecked((long)n._ulong);\n            }\n            throw new InvalidCastException();\n        }\n\n        public static explicit operator ulong (Number n)\n        {\n            switch (n._type)\n            {\n            case NumberType._byte: return unchecked((ulong)n._byte);\n            case NumberType._sbyte: return unchecked((ulong)n._sbyte);\n            case NumberType._short: return unchecked((ulong)n._short);\n            case NumberType._ushort: return unchecked((ulong)n._ushort);\n            case NumberType._int: return unchecked((ulong)n._int);\n            case NumberType._uint: return unchecked((ulong)n._uint);\n            case NumberType._long: return unchecked((ulong)n._long);\n            case NumberType._ulong: return unchecked((ulong)n._ulong);\n            }\n            throw new InvalidCastException();\n        }\n\n        public static explicit operator float (Number n)\n        {\n            switch (n._type)\n            {\n            case NumberType._float: return unchecked((float)n._float);\n            case NumberType._double: return unchecked((float)n._double);\n            }\n            throw new InvalidCastException();\n        }\n\n        public static explicit operator double (Number n)\n        {\n            switch (n._type)\n            {\n            case NumberType._float: return unchecked((double)n._float);\n            case NumberType._double: return unchecked((double)n._double);\n            }\n            throw new InvalidCastException();\n        }\n\n\n        public static explicit operator bool (Number n)\n        {\n            if (n._type != NumberType._byte)\n                throw new InvalidCastException();\n            return n._bool;\n        }\n\n        public override string ToString()\n        {\n            switch (_type)\n            {\n            default:\n            case NumberType._bool: return _bool.ToString();\n            case NumberType._byte: return _byte.ToString();\n            case NumberType._sbyte: return _sbyte.ToString();\n            case NumberType._short: return _short.ToString();\n            case NumberType._ushort: return _ushort.ToString();\n            case NumberType._int: return _int.ToString();\n            case NumberType._uint: return _uint.ToString();\n            case NumberType._long: return _long.ToString();\n            case NumberType._ulong: return _ulong.ToString();\n            case NumberType._float: return _float.ToString();\n            case NumberType._double: return _double.ToString();\n            }\n        }\n\n        [FieldOffset(8)]\n        NumberType _type;\n\n        public NumberType Type => _type;\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/ValueTuple.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{4F88628E-5E67-43BC-9524-00394127B6C7}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ValueTuples</RootNamespace>\n    <AssemblyName>ValueTuple</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <StartupObject />\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Serialization\\MiniMessagePack.cs\" />\n    <Compile Include=\"Serialization\\MyBinarySerializer.cs\" />\n    <Compile Include=\"Serialization\\Number1.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Number.tt</DependentUpon>\n    </Compile>\n    <Compile Include=\"旧\\IDeepCloneable.cs\" />\n    <Compile Include=\"旧\\IRecord.cs\" />\n    <Compile Include=\"Reflection\\ArrayTypeInfo.cs\" />\n    <Compile Include=\"Reflection\\IRecordAccessor.cs\" />\n    <Compile Include=\"Reflection\\RecordFieldInfo.cs\" />\n    <Compile Include=\"Reflection\\RecordTypeInfo.cs\" />\n    <Compile Include=\"Reflection\\Primitives.cs\" />\n    <Compile Include=\"Reflection\\TypeRepository.cs\" />\n    <Compile Include=\"Sample\\Thief.cs\" />\n    <Compile Include=\"Sample\\Mage.cs\" />\n    <Compile Include=\"Sample\\Pair.cs\" />\n    <Compile Include=\"Sample\\Point.cs\" />\n    <Compile Include=\"Sample\\PolyLine.cs\" />\n    <Compile Include=\"Sample\\Fighter.cs\" />\n    <Compile Include=\"Sample\\Unit.cs\" />\n    <Compile Include=\"Serialization\\IDeserializer.cs\" />\n    <Compile Include=\"Serialization\\ISerializer.cs\" />\n    <Compile Include=\"Serialization\\ISerializerFactory.cs\" />\n    <Compile Include=\"Serialization\\MySerializer.cs\" />\n    <Compile Include=\"旧\\Serialization旧\\IDeserializer.cs\" />\n    <Compile Include=\"旧\\Serialization旧\\ISerializer.cs\" />\n    <Compile Include=\"旧\\ITuple.cs\" />\n    <Compile Include=\"旧\\Person.cs\" />\n    <Compile Include=\"旧\\Line.cs\" />\n    <Compile Include=\"旧\\Point.cs\" />\n    <Compile Include=\"旧\\Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"旧\\Serialization旧\\MySerializer.cs\" />\n    <Compile Include=\"旧\\Student.cs\" />\n    <Compile Include=\"旧\\ValueTuple.cs\" />\n    <Compile Include=\"旧\\ValueTuples.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>ValueTuples.tt</DependentUpon>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Serialization\\Number.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>Number1.cs</LastGenOutput>\n    </Content>\n    <Content Include=\"旧\\ValueTuples.tt\">\n      <Generator>TextTemplatingFileGenerator</Generator>\n      <LastGenOutput>ValueTuples.cs</LastGenOutput>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Service Include=\"{508349B6-6B84-4DF5-91F0-309BEEBAD82D}\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Scribble/ValueTuple/旧/IDeepCloneable.cs",
    "content": "﻿namespace ValueTuples.旧\n{\n    /// <summary>\n    /// ディープ クローンできる型。\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public interface IDeepCloneable<T>\n    {\n        /// <summary>\n        /// ディープ クローンを作る。\n        /// </summary>\n        /// <returns></returns>\n        T Clone();\n    }\n\n    public static class DeepCloneableExtensions\n    {\n        /// <summary>\n        /// <see cref=\"IDeepCloneable{T}\"/> 実装クラスの場合は <see cref=\"IDeepCloneable{T}.Clone\"/> の結果を返して、\n        /// そうでない場合は素通し。\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"x\"></param>\n        /// <returns></returns>\n        public static T DeepClone<T>(this T x)\n        {\n            var dc = x as IDeepCloneable<T>;\n            return dc == null ? x : dc.Clone();\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/IRecord.cs",
    "content": "﻿namespace ValueTuples.旧\n{\n    /// <summary>\n    /// レコード。\n    /// 1. シリアライズしたいフィールドを <see cref=\"ValueTuple\"/> で持っている。\n    /// </summary>\n    public interface IRecord\n    {\n        ITuple Value { get; set; }\n    }\n\n    //todo: Type GetFieldType(int index) みたいなのも必要そう。ITuple に持たせるべきか、こっちに持たせるべきか。\n\n    // というか、今の作りだと、ITuple.this[index] の計算量が O(n), n はメンバー数で、結構非効率。どうしたものか。\n    // ITuple.Values が struct TypeValuePair { Type Type; object Value; } みたいなの返すべきか。\n\n    /// <summary>\n    /// レコードの型情報。\n    /// リフレクションが使えない環境向けに、ビルド前のコード生成で作る。\n    /// <see cref=\"ITuple\"/>自体が各フィールドの型だけは持ってる(名前は Item1 とかになって紛失する)ので、その差分だけ。\n    ///\n    /// 1. JSON みたいな形式のために、各フィールドの名前を返せる。(必ずしもフィールド名そのまま返さない。場合によっては、snake_case化した名前とかを返すとかする。)\n    /// 2. フィールドの名前からフィールドのインデックス(<see cref=\"ITuple\"/>に渡す)を返せる。\n    /// 3. デシリアライズ用に、フィールドのインスタンスを new できる。\n    /// 4. 派生クラスの場合は、元の型を判別するための値(<see cref=\"Discriminator\"/>)を返せる。\n    /// </summary>\n    public interface IRecordInfo\n    {\n        string GetKey(int index);\n\n        int GetIndex(string key);\n\n        object NewInstance(int index, int? discriminator);\n\n        int? Discriminator { get; }\n    }\n\n    public interface ITypedRecord : IRecord\n    {\n        IRecordInfo GetInfo();\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/ITuple.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ValueTuples.旧\n{\n    /// <summary>\n    /// loosely-typed タプル。\n    /// </summary>\n    /// <remarks>\n    /// <see cref=\"ValueTuple\"/> は strongly-typed で、リフレクションなしでのシリアライズが結構きつい。\n    /// このインターフェイスを介することで、<see cref=\"ValueTuple\"/> を loosely に使う。\n    /// object なので boxing 起きまくりなのがちょっと懸念。\n    ///\n    /// <![CDATA[ ValueTuple<ValueTuple<T1, T2>, ValueTuple<T3, T4>> ]]> みたいな奴は再帰的に展開する。\n    /// この例だと、<see cref=\"Count\"/> は4、<see cref=\"Values\"/> は { T1, T2, T3, T4 } 的な1次元リストが返る。\n    /// </remarks>\n    public interface ITuple\n    {\n        /// <summary>\n        /// 要素数。\n        /// </summary>\n        int Count { get; }\n\n        IEnumerable<object> Values { get; }\n\n        object this[int index] { get; set; }\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/Line.cs",
    "content": "﻿namespace ValueTuples.旧\n{\n    public partial class Line : ITypedRecord, IDeepCloneable<Line>\n    {\n        ValueTuple<Point, Point> _value;\n\n        public ValueTuple<Point, Point> Value => _value;\n\n        ITuple IRecord.Value { get { return _value; } set { _value = (ValueTuple<Point, Point>)value; } }\n        IRecordInfo ITypedRecord.GetInfo() => LineInfo.Instance;\n\n        Line IDeepCloneable<Line>.Clone() => new Line(_value.DeepClone());\n\n        public Line() { }\n        public Line(Point a, Point b) { A = a; B = b; }\n        public Line(ValueTuple<Point, Point> value) { _value = value; }\n\n        public Point A { get { return _value.Item1; } set { _value.Item1 = value; } }\n        public Point B { get { return _value.Item2; } set { _value.Item2 = value; } }\n\n        public override string ToString() => $\"{A} - {B}\";\n    }\n\n\n    internal class LineInfo : IRecordInfo\n    {\n        public static readonly IRecordInfo Instance = new LineInfo();\n\n        private static readonly string[] _keys = new[] { \"a\", \"b\" };\n\n        string IRecordInfo.GetKey(int index) => _keys[index];\n\n        int IRecordInfo.GetIndex(string key)\n        {\n            switch (key)\n            {\n                default: return -1;\n                case \"a\": return 0;\n                case \"b\": return 1;\n            }\n        }\n\n        object IRecordInfo.NewInstance(int index, int? discriminator)\n        {\n            switch (index)\n            {\n                default: return null;\n                case 0: return new Point();\n                case 1: return new Point();\n            }\n        }\n\n        int? IRecordInfo.Discriminator => null;\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/Person.cs",
    "content": "﻿namespace ValueTuples.旧\n{\n    public class Person : ITypedRecord, IDeepCloneable<Person>\n    {\n        protected ValueTuple<int, string, string> _value;\n\n        public ValueTuple<int, string, string> Value => _value;\n\n        ITuple IRecord.Value { get { return _value; } set { _value = (ValueTuple<int, string, string>)value; } }\n        IRecordInfo ITypedRecord.GetInfo() => PersonInfo.Instance;\n\n        Person IDeepCloneable<Person>.Clone() => new Person(Value.DeepClone());\n\n        public Person() { }\n        public Person(int id, string name, string address) { Id = id; Name = name; Address = address; }\n        public Person(ValueTuple<int, string, string> value) { _value = value; }\n\n        public int Id { get { return _value.Item1; } set { _value.Item1 = value; } }\n        public string Name { get { return _value.Item2; } set { _value.Item2 = value; } }\n        public string Address { get { return _value.Item3; } set { _value.Item3 = value; } }\n    }\n\n    internal class PersonInfo : IRecordInfo\n    {\n        public static readonly IRecordInfo Instance = new PersonInfo();\n\n        private static readonly string[] _keys = new[] { \"id\", \"name\", \"address\" };\n\n        string IRecordInfo.GetKey(int index) => _keys[index];\n\n        int IRecordInfo.GetIndex(string key)\n        {\n            switch (key)\n            {\n                default: return -1;\n                case \"id\": return 0;\n                case \"name\": return 1;\n                case \"address\": return 2;\n            }\n        }\n\n        object IRecordInfo.NewInstance(int index, int? discriminator) => null;\n\n        int? IRecordInfo.Discriminator => null;\n    }\n\n    public enum PersonType\n    {\n        Student = 1,\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/Point.cs",
    "content": "﻿namespace ValueTuples.旧\n{\n    public partial class Point : ITypedRecord, IDeepCloneable<Point>\n    {\n        ValueTuple<int, int> _value;\n\n        public ValueTuple<int, int> Value => _value;\n\n        ITuple IRecord.Value { get { return _value; } set { _value = (ValueTuple<int, int>)value; } }\n        IRecordInfo ITypedRecord.GetInfo() => PointInfo.Instance;\n\n        Point IDeepCloneable<Point>.Clone() => new Point(_value.DeepClone());\n\n        public Point() { }\n        public Point(int x, int y) { X = x; Y = y; }\n        public Point(ValueTuple<int, int> value) { _value = value; }\n\n        public int X { get { return _value.Item1; } set { _value.Item1 = value; } }\n        public int Y { get { return _value.Item2; } set { _value.Item2 = value; } }\n\n        public override string ToString() => $\"({X}, {Y})\";\n    }\n\n    internal class PointInfo : IRecordInfo\n    {\n        public static readonly IRecordInfo Instance = new PointInfo();\n\n        private static readonly string[] _keys = new[] { \"x\", \"y\" };\n\n        string IRecordInfo.GetKey(int index) => _keys[index];\n\n        int IRecordInfo.GetIndex(string key)\n        {\n            switch (key)\n            {\n                default: return -1;\n                case \"x\": return 0;\n                case \"y\": return 1;\n            }\n        }\n\n        object IRecordInfo.NewInstance(int index, int? discriminator) => null;\n\n        int? IRecordInfo.Discriminator => null;\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/Program.cs",
    "content": "﻿using System;\nusing System.IO;\nusing System.Text;\n\nnamespace ValueTuples.旧\n{\n    class Program\n    {\n        public static void Main_()\n        {\n            WriteTuples();\n            WriteSerializedData();\n        }\n\n        private static void WriteSerializedData()\n        {\n            WriteSerializedData(new Person(123, \"abc def\", \"東京都千代田区千代田1-1\"));\n            WriteSerializedData(new Student(999, \"あｗせｄｒｆｔｇｙ ふじこ\", \"千葉県浦安市舞浜1-1\", 5, 2));\n            WriteSerializedData(new Point(10, 20));\n            WriteSerializedData(new Line(new Point(1, 2), new Point(3, 4)));\n        }\n\n        private static void WriteSerializedData(IRecord record)\n        {\n            byte[] buffer;\n            using (var s = new MemoryStream())\n            using (var sw = new StreamWriter(s))\n            {\n                var serializer = new Serialization.MySerializer(sw);\n                serializer.Serialize(record);\n                sw.Flush();\n\n                var len = s.Length;\n                s.Seek(0, SeekOrigin.Begin);\n                buffer = new byte[len];\n                s.Read(buffer, 0, (int)len);\n            }\n\n            var serialized = Encoding.UTF8.GetString(buffer);\n            Console.WriteLine(serialized);\n        }\n\n        private static void WriteTuples()\n        {\n            Write(ValueTuple.Create(1, 2, 3, \"abc\", \"def\"));\n            Console.WriteLine();\n\n            Write(new Point(10, 20));\n            Console.WriteLine();\n\n            Write(new Person(123, \"abc def\", \"東京都千代田区千代田1-1\"));\n            Console.WriteLine();\n\n            var x = (ITuple)new Student(999, \"あｗせｄｒｆｔｇｙ ふじこ\", \"千葉県浦安市舞浜1-1\", 5, 2).Value;\n\n            Write(x);\n            Console.WriteLine();\n\n            x[0] = 1;\n            x[1] = \"a\";\n            x[2] = \"b\";\n            x[3] = 2;\n            x[4] = 3;\n            Write(x);\n            Console.WriteLine();\n\n            var line = new Line(new Point(1, 2), new Point(3, 4));\n            var lineClone = line.DeepClone();\n\n            line.A.X = 10;\n            line.A.Y = 20;\n            line.B.X = 30;\n            line.B.Y = 40;\n\n            Write(line);\n            Write(lineClone);\n        }\n\n        private static void Write(IRecord record) => Write(record.Value);\n\n        private static void Write(ITuple tuple)\n        {\n            foreach (var item in tuple.Values)\n            {\n                Console.WriteLine(item);\n            }\n\n            for (int i = 0; i < tuple.Count; i++)\n            {\n                Console.WriteLine(tuple[i]);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/Serialization旧/IDeserializer.cs",
    "content": "﻿namespace ValueTuples.旧.Serialization\n{\n    public interface IDeserializer\n    {\n        void Deserialize(IRecord record);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/Serialization旧/ISerializer.cs",
    "content": "﻿namespace ValueTuples.旧.Serialization\n{\n    public interface ISerializer\n    {\n        void Serialize(IRecord record);\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/Serialization旧/MySerializer.cs",
    "content": "﻿using System;\nusing System.IO;\n\nnamespace ValueTuples.旧.Serialization\n{\n    public class MySerializer : ISerializer\n    {\n        StreamWriter _s;\n\n        public MySerializer(StreamWriter s)\n        {\n            _s = s;\n        }\n\n        public void Serialize(IRecord record)\n        {\n            var tr = record as ITypedRecord;\n            if (tr == null) throw new NotSupportedException();\n            var info = tr.GetInfo();\n            var value = record.Value;\n            var count = value.Count;\n\n            //_s.WriteLine(count);\n\n            for (int i = 0; i < count; i++)\n            {\n                _s.Write(info.GetKey(i));\n\n                var x = value[i];\n                if(x != null)\n                {\n                    var xr = x as IRecord;\n                    if(xr == null)\n                    {\n                        _s.Write('\\t');\n                        _s.Write(x.ToString());\n                        _s.WriteLine();\n                    }\n                    else\n                    {\n                        _s.WriteLine('\\\\');\n                        Serialize(xr);\n                    }\n                }\n            }\n        }\n    }\n\n    public class MyDeserializer : IDeserializer\n    {\n        StreamReader _s;\n\n        public MyDeserializer(StreamReader s)\n        {\n            _s = s;\n        }\n\n        public void Deserialize(IRecord record)\n        {\n            var tr = record as ITypedRecord;\n            if (tr == null) throw new NotSupportedException();\n            var info = tr.GetInfo();\n            var value = record.Value;\n            var count = value.Count;\n\n            for (int i = 0; i < count; i++)\n            {\n                var line = _s.ReadLine();\n                var tab = line.IndexOf('\\t');\n                if(tab >0)\n                {\n\n                }\n\n                //_s.Write(info.GetKey(i));\n\n                //var x = value[i];\n                //if (x != null)\n                //{\n                //    var xr = x as IRecord;\n                //    if (xr == null)\n                //    {\n                //        _s.Write('/');\n                //        _s.Write(x.ToString());\n                //        _s.WriteLine();\n                //    }\n                //    else\n                //    {\n                //        _s.WriteLine('\\\\');\n                //        Serialize(xr);\n                //    }\n                //}\n            }\n\n            record.Value = value;\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/Student.cs",
    "content": "﻿namespace ValueTuples.旧\n{\n    public class Student : Person, ITypedRecord, IDeepCloneable<Student>\n    {\n        new ValueTuple<int, int> _value;\n\n        public new ValueTuple<ValueTuple<int, string, string>, ValueTuple<int, int>> Value => ValueTuple.Create(base._value, _value);\n\n        ITuple IRecord.Value { get { return Value; } set { base._value = ((ValueTuple<ValueTuple<int, string, string>, ValueTuple<int, int>>)value).Item1; _value = ((ValueTuple<ValueTuple<int, string, string>, ValueTuple<int, int>>)value).Item2; } }\n        IRecordInfo ITypedRecord.GetInfo() => StudentInfo.Instance;\n\n        Student IDeepCloneable<Student>.Clone() => new Student(Value.DeepClone());\n\n        public Student() { }\n        public Student(int id, string name, string address, int grade, int room) : base(id, name, address) { Grade = grade; Room = room; }\n        public Student(ValueTuple<ValueTuple<int, string, string>, ValueTuple<int, int>> value) { _value = value.Item2; }\n\n        public int Grade { get { return _value.Item1; } set { _value.Item1 = value; } }\n        public int Room { get { return _value.Item2; } set { _value.Item2 = value; } }\n    }\n\n    internal class StudentInfo : IRecordInfo\n    {\n        public static readonly IRecordInfo Instance = new StudentInfo();\n\n        private static readonly string[] _keys = new[] { \"id\", \"name\", \"address\", \"grade\", \"room\" };\n\n        string IRecordInfo.GetKey(int index) => _keys[index];\n\n        int IRecordInfo.GetIndex(string key)\n        {\n            switch (key)\n            {\n                default: return -1;\n                case \"id\": return 0;\n                case \"name\": return 1;\n                case \"address\": return 2;\n                case \"grade\": return 3;\n                case \"room\": return 4;\n            }\n        }\n\n        object IRecordInfo.NewInstance(int index, int? discriminator) => null;\n\n        int? IRecordInfo.Discriminator => (int)PersonType.Student;\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/ValueTuple.cs",
    "content": "﻿namespace ValueTuples.旧\n{\n    /// <summary>\n    /// <see cref=\"ValueTuple{T1, T2}\"/> とかのファクトリ。\n    /// </summary>\n    public static partial class ValueTuple\n    {\n        /// <summary>\n        /// 再帰カウント用。\n        /// </summary>\n        /// <typeparam name=\"T\">要素の型。</typeparam>\n        /// <param name=\"store\">要素。</param>\n        /// <returns></returns>\n        internal static int Count<T>(ref T store)\n        {\n            var x = store as ITuple;\n            return x == null ? 1 : x.Count;\n        }\n\n        /// <summary>\n        /// 再帰 get。\n        /// </summary>\n        /// <typeparam name=\"T\">要素の型。</typeparam>\n        /// <param name=\"store\">要素。</param>\n        /// <param name=\"index\">get したい位置のインデックス。</param>\n        /// <param name=\"output\">取りだした値。インデックスが範囲内の時だけ値が入る。</param>\n        /// <returns>インデックスが範囲内のときにtrue。</returns>\n        internal static bool Get<T>(ref T store, ref int index, out object output)\n        {\n            var x = store as ITuple;\n            if (x == null)\n            {\n                if (index == 0)\n                {\n                    output = store;\n                    return true;\n                }\n                else\n                {\n                    index--;\n                    output = null;\n                    return false;\n                }\n            }\n            else\n            {\n                if (index < x.Count)\n                {\n                    output = x[index];\n                    return true;\n                }\n                else\n                {\n                    index -= x.Count;\n                    output = null;\n                    return false;\n                }\n            }\n        }\n\n        /// <summary>\n        /// 再帰 set。\n        /// </summary>\n        /// <typeparam name=\"T\">要素の型。</typeparam>\n        /// <param name=\"store\">要素。</param>\n        /// <param name=\"index\">get したい位置のインデックス。</param>\n        /// <param name=\"input\">設定したい値。インデックスが範囲内の時だけ<paramref name=\"store\"/>が上書かれる。</param>\n        /// <returns>インデックスが範囲内のときにtrue。</returns>\n        internal static bool Set<T>(ref T store, ref int index, object input)\n        {\n            var x = store as ITuple;\n            if (x == null)\n            {\n                if (index == 0)\n                {\n                    store = (T)input;\n                    return true;\n                }\n                else\n                {\n                    index--;\n                    return false;\n                }\n            }\n            else\n            {\n                if (index < x.Count)\n                {\n                    x[index] = input;\n                    store = (T)x; // boxing 起きてるので書き戻し必要\n                    return true;\n                }\n                else\n                {\n                    index -= x.Count;\n                    return false;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/ValueTuples.cs",
    "content": "﻿using System.Collections.Generic;\n\nnamespace ValueTuples.旧\n{\n    using static ValueTuple;\n\n    public static partial class ValueTuple\n    {\n        public static ValueTuple<T1> Create<T1>(T1 item1) => new ValueTuple<T1>(item1);\n        public static ValueTuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) => new ValueTuple<T1, T2>(item1, item2);\n        public static ValueTuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3) => new ValueTuple<T1, T2, T3>(item1, item2, item3);\n        public static ValueTuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4) => new ValueTuple<T1, T2, T3, T4>(item1, item2, item3, item4);\n        public static ValueTuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5) => new ValueTuple<T1, T2, T3, T4, T5>(item1, item2, item3, item4, item5);\n        public static ValueTuple<T1, T2, T3, T4, T5, T6> Create<T1, T2, T3, T4, T5, T6>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6) => new ValueTuple<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, item6);\n        public static ValueTuple<T1, T2, T3, T4, T5, T6, T7> Create<T1, T2, T3, T4, T5, T6, T7>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7) => new ValueTuple<T1, T2, T3, T4, T5, T6, T7>(item1, item2, item3, item4, item5, item6, item7);\n        public static ValueTuple<T1, T2, T3, T4, T5, T6, T7, T8> Create<T1, T2, T3, T4, T5, T6, T7, T8>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8) => new ValueTuple<T1, T2, T3, T4, T5, T6, T7, T8>(item1, item2, item3, item4, item5, item6, item7, item8);\n    }\n\n    public struct ValueTuple<T1> : ITuple, IDeepCloneable<ValueTuple<T1>>\n    {\n        public T1 Item1;\n\n        public ValueTuple(T1 item1)\n        {\n            Item1 = item1;\n        }\n\n        int ITuple.Count => Count(ref Item1);\n\n        IEnumerable<object> ITuple.Values\n        {\n            get\n            {\n                { var x = Item1 as ITuple; if (x == null) yield return Item1; else foreach (var y in x.Values) yield return y; }\n            }\n        }\n\n        object ITuple.this[int index]\n        {\n            get\n            {\n                object output;\n                if (Get(ref Item1, ref index, out output)) return output;\n                return output;\n            }\n            set\n            {\n                if (Set(ref Item1, ref index, value)) return;\n            }\n        }\n\n        ValueTuple<T1> IDeepCloneable<ValueTuple<T1>>.Clone() => Create(Item1.DeepClone());\n    }\n    public struct ValueTuple<T1, T2> : ITuple, IDeepCloneable<ValueTuple<T1, T2>>\n    {\n        public T1 Item1;\n        public T2 Item2;\n\n        public ValueTuple(T1 item1, T2 item2)\n        {\n            Item1 = item1;\n            Item2 = item2;\n        }\n\n        int ITuple.Count => Count(ref Item1) + Count(ref Item2);\n\n        IEnumerable<object> ITuple.Values\n        {\n            get\n            {\n                { var x = Item1 as ITuple; if (x == null) yield return Item1; else foreach (var y in x.Values) yield return y; }\n                { var x = Item2 as ITuple; if (x == null) yield return Item2; else foreach (var y in x.Values) yield return y; }\n            }\n        }\n\n        object ITuple.this[int index]\n        {\n            get\n            {\n                object output;\n                if (Get(ref Item1, ref index, out output)) return output;\n                if (Get(ref Item2, ref index, out output)) return output;\n                return output;\n            }\n            set\n            {\n                if (Set(ref Item1, ref index, value)) return;\n                if (Set(ref Item2, ref index, value)) return;\n            }\n        }\n\n        ValueTuple<T1, T2> IDeepCloneable<ValueTuple<T1, T2>>.Clone() => Create(Item1.DeepClone(), Item2.DeepClone());\n    }\n    public struct ValueTuple<T1, T2, T3> : ITuple, IDeepCloneable<ValueTuple<T1, T2, T3>>\n    {\n        public T1 Item1;\n        public T2 Item2;\n        public T3 Item3;\n\n        public ValueTuple(T1 item1, T2 item2, T3 item3)\n        {\n            Item1 = item1;\n            Item2 = item2;\n            Item3 = item3;\n        }\n\n        int ITuple.Count => Count(ref Item1) + Count(ref Item2) + Count(ref Item3);\n\n        IEnumerable<object> ITuple.Values\n        {\n            get\n            {\n                { var x = Item1 as ITuple; if (x == null) yield return Item1; else foreach (var y in x.Values) yield return y; }\n                { var x = Item2 as ITuple; if (x == null) yield return Item2; else foreach (var y in x.Values) yield return y; }\n                { var x = Item3 as ITuple; if (x == null) yield return Item3; else foreach (var y in x.Values) yield return y; }\n            }\n        }\n\n        object ITuple.this[int index]\n        {\n            get\n            {\n                object output;\n                if (Get(ref Item1, ref index, out output)) return output;\n                if (Get(ref Item2, ref index, out output)) return output;\n                if (Get(ref Item3, ref index, out output)) return output;\n                return output;\n            }\n            set\n            {\n                if (Set(ref Item1, ref index, value)) return;\n                if (Set(ref Item2, ref index, value)) return;\n                if (Set(ref Item3, ref index, value)) return;\n            }\n        }\n\n        ValueTuple<T1, T2, T3> IDeepCloneable<ValueTuple<T1, T2, T3>>.Clone() => Create(Item1.DeepClone(), Item2.DeepClone(), Item3.DeepClone());\n    }\n    public struct ValueTuple<T1, T2, T3, T4> : ITuple, IDeepCloneable<ValueTuple<T1, T2, T3, T4>>\n    {\n        public T1 Item1;\n        public T2 Item2;\n        public T3 Item3;\n        public T4 Item4;\n\n        public ValueTuple(T1 item1, T2 item2, T3 item3, T4 item4)\n        {\n            Item1 = item1;\n            Item2 = item2;\n            Item3 = item3;\n            Item4 = item4;\n        }\n\n        int ITuple.Count => Count(ref Item1) + Count(ref Item2) + Count(ref Item3) + Count(ref Item4);\n\n        IEnumerable<object> ITuple.Values\n        {\n            get\n            {\n                { var x = Item1 as ITuple; if (x == null) yield return Item1; else foreach (var y in x.Values) yield return y; }\n                { var x = Item2 as ITuple; if (x == null) yield return Item2; else foreach (var y in x.Values) yield return y; }\n                { var x = Item3 as ITuple; if (x == null) yield return Item3; else foreach (var y in x.Values) yield return y; }\n                { var x = Item4 as ITuple; if (x == null) yield return Item4; else foreach (var y in x.Values) yield return y; }\n            }\n        }\n\n        object ITuple.this[int index]\n        {\n            get\n            {\n                object output;\n                if (Get(ref Item1, ref index, out output)) return output;\n                if (Get(ref Item2, ref index, out output)) return output;\n                if (Get(ref Item3, ref index, out output)) return output;\n                if (Get(ref Item4, ref index, out output)) return output;\n                return output;\n            }\n            set\n            {\n                if (Set(ref Item1, ref index, value)) return;\n                if (Set(ref Item2, ref index, value)) return;\n                if (Set(ref Item3, ref index, value)) return;\n                if (Set(ref Item4, ref index, value)) return;\n            }\n        }\n\n        ValueTuple<T1, T2, T3, T4> IDeepCloneable<ValueTuple<T1, T2, T3, T4>>.Clone() => Create(Item1.DeepClone(), Item2.DeepClone(), Item3.DeepClone(), Item4.DeepClone());\n    }\n    public struct ValueTuple<T1, T2, T3, T4, T5> : ITuple, IDeepCloneable<ValueTuple<T1, T2, T3, T4, T5>>\n    {\n        public T1 Item1;\n        public T2 Item2;\n        public T3 Item3;\n        public T4 Item4;\n        public T5 Item5;\n\n        public ValueTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)\n        {\n            Item1 = item1;\n            Item2 = item2;\n            Item3 = item3;\n            Item4 = item4;\n            Item5 = item5;\n        }\n\n        int ITuple.Count => Count(ref Item1) + Count(ref Item2) + Count(ref Item3) + Count(ref Item4) + Count(ref Item5);\n\n        IEnumerable<object> ITuple.Values\n        {\n            get\n            {\n                { var x = Item1 as ITuple; if (x == null) yield return Item1; else foreach (var y in x.Values) yield return y; }\n                { var x = Item2 as ITuple; if (x == null) yield return Item2; else foreach (var y in x.Values) yield return y; }\n                { var x = Item3 as ITuple; if (x == null) yield return Item3; else foreach (var y in x.Values) yield return y; }\n                { var x = Item4 as ITuple; if (x == null) yield return Item4; else foreach (var y in x.Values) yield return y; }\n                { var x = Item5 as ITuple; if (x == null) yield return Item5; else foreach (var y in x.Values) yield return y; }\n            }\n        }\n\n        object ITuple.this[int index]\n        {\n            get\n            {\n                object output;\n                if (Get(ref Item1, ref index, out output)) return output;\n                if (Get(ref Item2, ref index, out output)) return output;\n                if (Get(ref Item3, ref index, out output)) return output;\n                if (Get(ref Item4, ref index, out output)) return output;\n                if (Get(ref Item5, ref index, out output)) return output;\n                return output;\n            }\n            set\n            {\n                if (Set(ref Item1, ref index, value)) return;\n                if (Set(ref Item2, ref index, value)) return;\n                if (Set(ref Item3, ref index, value)) return;\n                if (Set(ref Item4, ref index, value)) return;\n                if (Set(ref Item5, ref index, value)) return;\n            }\n        }\n\n        ValueTuple<T1, T2, T3, T4, T5> IDeepCloneable<ValueTuple<T1, T2, T3, T4, T5>>.Clone() => Create(Item1.DeepClone(), Item2.DeepClone(), Item3.DeepClone(), Item4.DeepClone(), Item5.DeepClone());\n    }\n    public struct ValueTuple<T1, T2, T3, T4, T5, T6> : ITuple, IDeepCloneable<ValueTuple<T1, T2, T3, T4, T5, T6>>\n    {\n        public T1 Item1;\n        public T2 Item2;\n        public T3 Item3;\n        public T4 Item4;\n        public T5 Item5;\n        public T6 Item6;\n\n        public ValueTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)\n        {\n            Item1 = item1;\n            Item2 = item2;\n            Item3 = item3;\n            Item4 = item4;\n            Item5 = item5;\n            Item6 = item6;\n        }\n\n        int ITuple.Count => Count(ref Item1) + Count(ref Item2) + Count(ref Item3) + Count(ref Item4) + Count(ref Item5) + Count(ref Item6);\n\n        IEnumerable<object> ITuple.Values\n        {\n            get\n            {\n                { var x = Item1 as ITuple; if (x == null) yield return Item1; else foreach (var y in x.Values) yield return y; }\n                { var x = Item2 as ITuple; if (x == null) yield return Item2; else foreach (var y in x.Values) yield return y; }\n                { var x = Item3 as ITuple; if (x == null) yield return Item3; else foreach (var y in x.Values) yield return y; }\n                { var x = Item4 as ITuple; if (x == null) yield return Item4; else foreach (var y in x.Values) yield return y; }\n                { var x = Item5 as ITuple; if (x == null) yield return Item5; else foreach (var y in x.Values) yield return y; }\n                { var x = Item6 as ITuple; if (x == null) yield return Item6; else foreach (var y in x.Values) yield return y; }\n            }\n        }\n\n        object ITuple.this[int index]\n        {\n            get\n            {\n                object output;\n                if (Get(ref Item1, ref index, out output)) return output;\n                if (Get(ref Item2, ref index, out output)) return output;\n                if (Get(ref Item3, ref index, out output)) return output;\n                if (Get(ref Item4, ref index, out output)) return output;\n                if (Get(ref Item5, ref index, out output)) return output;\n                if (Get(ref Item6, ref index, out output)) return output;\n                return output;\n            }\n            set\n            {\n                if (Set(ref Item1, ref index, value)) return;\n                if (Set(ref Item2, ref index, value)) return;\n                if (Set(ref Item3, ref index, value)) return;\n                if (Set(ref Item4, ref index, value)) return;\n                if (Set(ref Item5, ref index, value)) return;\n                if (Set(ref Item6, ref index, value)) return;\n            }\n        }\n\n        ValueTuple<T1, T2, T3, T4, T5, T6> IDeepCloneable<ValueTuple<T1, T2, T3, T4, T5, T6>>.Clone() => Create(Item1.DeepClone(), Item2.DeepClone(), Item3.DeepClone(), Item4.DeepClone(), Item5.DeepClone(), Item6.DeepClone());\n    }\n    public struct ValueTuple<T1, T2, T3, T4, T5, T6, T7> : ITuple, IDeepCloneable<ValueTuple<T1, T2, T3, T4, T5, T6, T7>>\n    {\n        public T1 Item1;\n        public T2 Item2;\n        public T3 Item3;\n        public T4 Item4;\n        public T5 Item5;\n        public T6 Item6;\n        public T7 Item7;\n\n        public ValueTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)\n        {\n            Item1 = item1;\n            Item2 = item2;\n            Item3 = item3;\n            Item4 = item4;\n            Item5 = item5;\n            Item6 = item6;\n            Item7 = item7;\n        }\n\n        int ITuple.Count => Count(ref Item1) + Count(ref Item2) + Count(ref Item3) + Count(ref Item4) + Count(ref Item5) + Count(ref Item6) + Count(ref Item7);\n\n        IEnumerable<object> ITuple.Values\n        {\n            get\n            {\n                { var x = Item1 as ITuple; if (x == null) yield return Item1; else foreach (var y in x.Values) yield return y; }\n                { var x = Item2 as ITuple; if (x == null) yield return Item2; else foreach (var y in x.Values) yield return y; }\n                { var x = Item3 as ITuple; if (x == null) yield return Item3; else foreach (var y in x.Values) yield return y; }\n                { var x = Item4 as ITuple; if (x == null) yield return Item4; else foreach (var y in x.Values) yield return y; }\n                { var x = Item5 as ITuple; if (x == null) yield return Item5; else foreach (var y in x.Values) yield return y; }\n                { var x = Item6 as ITuple; if (x == null) yield return Item6; else foreach (var y in x.Values) yield return y; }\n                { var x = Item7 as ITuple; if (x == null) yield return Item7; else foreach (var y in x.Values) yield return y; }\n            }\n        }\n\n        object ITuple.this[int index]\n        {\n            get\n            {\n                object output;\n                if (Get(ref Item1, ref index, out output)) return output;\n                if (Get(ref Item2, ref index, out output)) return output;\n                if (Get(ref Item3, ref index, out output)) return output;\n                if (Get(ref Item4, ref index, out output)) return output;\n                if (Get(ref Item5, ref index, out output)) return output;\n                if (Get(ref Item6, ref index, out output)) return output;\n                if (Get(ref Item7, ref index, out output)) return output;\n                return output;\n            }\n            set\n            {\n                if (Set(ref Item1, ref index, value)) return;\n                if (Set(ref Item2, ref index, value)) return;\n                if (Set(ref Item3, ref index, value)) return;\n                if (Set(ref Item4, ref index, value)) return;\n                if (Set(ref Item5, ref index, value)) return;\n                if (Set(ref Item6, ref index, value)) return;\n                if (Set(ref Item7, ref index, value)) return;\n            }\n        }\n\n        ValueTuple<T1, T2, T3, T4, T5, T6, T7> IDeepCloneable<ValueTuple<T1, T2, T3, T4, T5, T6, T7>>.Clone() => Create(Item1.DeepClone(), Item2.DeepClone(), Item3.DeepClone(), Item4.DeepClone(), Item5.DeepClone(), Item6.DeepClone(), Item7.DeepClone());\n    }\n    public struct ValueTuple<T1, T2, T3, T4, T5, T6, T7, T8> : ITuple, IDeepCloneable<ValueTuple<T1, T2, T3, T4, T5, T6, T7, T8>>\n    {\n        public T1 Item1;\n        public T2 Item2;\n        public T3 Item3;\n        public T4 Item4;\n        public T5 Item5;\n        public T6 Item6;\n        public T7 Item7;\n        public T8 Item8;\n\n        public ValueTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8)\n        {\n            Item1 = item1;\n            Item2 = item2;\n            Item3 = item3;\n            Item4 = item4;\n            Item5 = item5;\n            Item6 = item6;\n            Item7 = item7;\n            Item8 = item8;\n        }\n\n        int ITuple.Count => Count(ref Item1) + Count(ref Item2) + Count(ref Item3) + Count(ref Item4) + Count(ref Item5) + Count(ref Item6) + Count(ref Item7) + Count(ref Item8);\n\n        IEnumerable<object> ITuple.Values\n        {\n            get\n            {\n                { var x = Item1 as ITuple; if (x == null) yield return Item1; else foreach (var y in x.Values) yield return y; }\n                { var x = Item2 as ITuple; if (x == null) yield return Item2; else foreach (var y in x.Values) yield return y; }\n                { var x = Item3 as ITuple; if (x == null) yield return Item3; else foreach (var y in x.Values) yield return y; }\n                { var x = Item4 as ITuple; if (x == null) yield return Item4; else foreach (var y in x.Values) yield return y; }\n                { var x = Item5 as ITuple; if (x == null) yield return Item5; else foreach (var y in x.Values) yield return y; }\n                { var x = Item6 as ITuple; if (x == null) yield return Item6; else foreach (var y in x.Values) yield return y; }\n                { var x = Item7 as ITuple; if (x == null) yield return Item7; else foreach (var y in x.Values) yield return y; }\n                { var x = Item8 as ITuple; if (x == null) yield return Item8; else foreach (var y in x.Values) yield return y; }\n            }\n        }\n\n        object ITuple.this[int index]\n        {\n            get\n            {\n                object output;\n                if (Get(ref Item1, ref index, out output)) return output;\n                if (Get(ref Item2, ref index, out output)) return output;\n                if (Get(ref Item3, ref index, out output)) return output;\n                if (Get(ref Item4, ref index, out output)) return output;\n                if (Get(ref Item5, ref index, out output)) return output;\n                if (Get(ref Item6, ref index, out output)) return output;\n                if (Get(ref Item7, ref index, out output)) return output;\n                if (Get(ref Item8, ref index, out output)) return output;\n                return output;\n            }\n            set\n            {\n                if (Set(ref Item1, ref index, value)) return;\n                if (Set(ref Item2, ref index, value)) return;\n                if (Set(ref Item3, ref index, value)) return;\n                if (Set(ref Item4, ref index, value)) return;\n                if (Set(ref Item5, ref index, value)) return;\n                if (Set(ref Item6, ref index, value)) return;\n                if (Set(ref Item7, ref index, value)) return;\n                if (Set(ref Item8, ref index, value)) return;\n            }\n        }\n\n        ValueTuple<T1, T2, T3, T4, T5, T6, T7, T8> IDeepCloneable<ValueTuple<T1, T2, T3, T4, T5, T6, T7, T8>>.Clone() => Create(Item1.DeepClone(), Item2.DeepClone(), Item3.DeepClone(), Item4.DeepClone(), Item5.DeepClone(), Item6.DeepClone(), Item7.DeepClone(), Item8.DeepClone());\n    }\n}\n"
  },
  {
    "path": "Scribble/ValueTuple/旧/ValueTuples.tt",
    "content": "﻿<#@ template debug=\"false\" hostspecific=\"false\" language=\"C#\" #>\n<#@ assembly name=\"System.Core\" #>\n<#@ import namespace=\"System.Linq\" #>\n<#@ import namespace=\"System.Text\" #>\n<#@ import namespace=\"System.Collections.Generic\" #>\n<#@ output extension=\".cs\" #>\nusing System.Collections.Generic;\n\nnamespace ValueTuples.旧\n{\n    using static ValueTuple;\n\n    public static partial class ValueTuple\n    {\n<#\n    for (var arity = 1; arity <= 8; arity++)\n    {\n        var nums = Enumerable.Range(1, arity);\n        var typeParameters = string.Join(\", \", nums.Select(i => \"T\" + i));\n        var parameters = string.Join(\", \", nums.Select(i => \"T\" + i + \" item\" + i));\n        var arguments = string.Join(\", \", nums.Select(i => \"item\" + i));\n#>\n        public static ValueTuple<<#= typeParameters #>> Create<<#= typeParameters #>>(<#= parameters #>) => new ValueTuple<<#= typeParameters #>>(<#= arguments #>);\n<#\n    }\n#>\n    }\n\n<#\n    for (var arity = 1; arity <= 8; arity++)\n    {\n        var nums = Enumerable.Range(1, arity);\n        var typeParameters = string.Join(\", \", nums.Select(i => \"T\" + i));\n        var parameters = string.Join(\", \", nums.Select(i => \"T\" + i + \" item\" + i));\n        var clones = string.Join(\", \", nums.Select(i => \"Item\" + i + \".DeepClone()\"));\n        var count = string.Join(\" + \", nums.Select(i => \"Count(ref Item\" + i + \")\"));\n#>\n    public struct ValueTuple<<#= typeParameters #>> : ITuple, IDeepCloneable<ValueTuple<<#= typeParameters #>>>\n    {\n<#\n        foreach (var num in nums)\n        {\n#>\n        public T<#= num #> Item<#= num #>;\n<#\n        }\n#>\n\n        public ValueTuple(<#= parameters #>)\n        {\n<#\n        foreach (var num in nums)\n        {\n#>\n            Item<#= num #> = item<#= num #>;\n<#\n        }\n#>\n        }\n\n        int ITuple.Count => <#= count #>;\n\n        IEnumerable<object> ITuple.Values\n        {\n            get\n            {\n<#\n        foreach (var num in nums)\n        {\n#>\n                { var x = Item<#= num #> as ITuple; if (x == null) yield return Item<#= num #>; else foreach (var y in x.Values) yield return y; }\n<#\n        }\n#>\n            }\n        }\n\n        object ITuple.this[int index]\n        {\n            get\n            {\n                object output;\n<#\n        foreach (var num in nums)\n        {\n#>\n                if (Get(ref Item<#= num #>, ref index, out output)) return output;\n<#\n        }\n#>\n                return output;\n            }\n            set\n            {\n<#\n        foreach (var num in nums)\n        {\n#>\n                if (Set(ref Item<#= num #>, ref index, value)) return;\n<#\n        }\n#>\n            }\n        }\n\n        ValueTuple<<#= typeParameters #>> IDeepCloneable<ValueTuple<<#= typeParameters #>>>.Clone() => Create(<#= clones #>);\n    }\n<#\n    }\n#>\n}\n"
  },
  {
    "path": "Scribble/WhereNonNull/NullableExtensions.AsEnumerable.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace WhereNonNull\n{\n    public static partial class NullableExtensions\n    {\n        /// <summary>\n        /// <see cref=\"Nullable{T}\"/>は、長さが0か1の<see cref=\"IEnumerable{T}\"/>である。\n        /// </summary>\n        public static NullableEnumerable<T> AsEnumerable<T>(this T? item) where T : struct => new NullableEnumerable<T>(item);\n\n        public struct NullableEnumerable<T> : IEnumerable<T>\n            where T : struct\n        {\n            T? _item;\n            public NullableEnumerable(T? item) { _item = item; }\n\n            NullableEnumerator<T> GetEnumerator() => new NullableEnumerator<T>(_item);\n            IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n            IEnumerator<T> IEnumerable<T>.GetEnumerator() => GetEnumerator();\n        }\n\n        public struct NullableEnumerator<T> : IEnumerator<T>\n            where T : struct\n        {\n            bool _hasValue;\n            public NullableEnumerator(T? value)\n            {\n                _hasValue = value.HasValue;\n                Current = value.GetValueOrDefault();\n            }\n\n            public T Current { get; private set; }\n\n            public bool MoveNext()\n            {\n                var temp = _hasValue;\n                _hasValue = false;\n                return temp;\n            }\n\n            object IEnumerator.Current => Current;\n            void IDisposable.Dispose() { }\n            void IEnumerator.Reset() { throw new NotImplementedException(); }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/WhereNonNull/NullableExtensions.NonNullIterator.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\n\nnamespace WhereNonNull\n{\n    public static partial class NullableExtensions\n    {\n        /// <summary>\n        /// 非nullをはじく。Where(x => x.HasValue).Select(x => x.GetValueOrDefault())相当。\n        /// イテレーター実装。\n        /// </summary>\n        public static IEnumerable<T> NonNull1<T>(this IEnumerable<T?> source)\n            where T : struct\n        {\n            if (source == null) throw new ArgumentNullException(nameof(source));\n            return NonNullInternal(source);\n        }\n\n        private static IEnumerable<T> NonNullInternal<T>(IEnumerable<T?> source)\n            where T : struct\n        {\n            foreach (var x in source)\n            {\n                if (x.HasValue) yield return x.Value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/WhereNonNull/NullableExtensions.NonNullStruct.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace WhereNonNull\n{\n    public static partial class NullableExtensions\n    {\n        /// <summary>\n        /// 非nullをはじく。Where(x => x.HasValue).Select(x => x.GetValueOrDefault())相当。\n        /// イテレーターも使わず、構造体で最適化実装をやってみたもの。\n        /// </summary>\n        public static NonNullEnumerable<T> NonNull<T>(this IEnumerable<T?> source)\n            where T : struct\n        {\n            if (source == null) throw new ArgumentNullException(nameof(source));\n            return new NonNullEnumerable<T>(source);\n        }\n\n        public struct NonNullEnumerable<T> : IEnumerable<T>\n            where T : struct\n        {\n            IEnumerable<T?> _source;\n            internal NonNullEnumerable(IEnumerable<T?> source){_source = source;}\n            public NonNullEnumerator<T> GetEnumerator() => new NonNullEnumerator<T>(_source.GetEnumerator());\n\n            IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();\n            IEnumerator<T> IEnumerable<T>.GetEnumerator() => GetEnumerator();\n        }\n\n        public struct NonNullEnumerator<T> : IEnumerator<T>\n            where T : struct\n        {\n            IEnumerator<T?> _e;\n            internal NonNullEnumerator(IEnumerator<T?> e) { _e = e; Current = default(T); }\n\n            public T Current { get; private set; }\n\n            public bool MoveNext()\n            {\n                while(_e.MoveNext())\n                {\n                    var c = _e.Current;\n                    if(c.HasValue)\n                    {\n                        Current = c.GetValueOrDefault();\n                        return true;\n                    }\n                }\n                return false;\n            }\n\n            object IEnumerator.Current => _e.Current;\n\n            T IEnumerator<T>.Current\n            {\n                get\n                {\n                    throw new NotImplementedException();\n                }\n            }\n\n            void IDisposable.Dispose() { }\n            void IEnumerator.Reset() { throw new NotImplementedException(); }\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/WhereNonNull/OfTypeBenchmark.cs",
    "content": "﻿using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Attributes.Jobs;\nusing System;\nusing System.Linq;\n\nnamespace WhereNonNull\n{\n    /* 参考までに、1回実行してみた結果。\n                       Method |           Mean |      StdDev |         Median |\n----------------------------- |--------------- |------------ |--------------- |\n            OfTypeEnumeration | 19,039.9305 ns | 287.1109 ns | 19,050.3596 ns |\n        SelectManyEnumeration |  9,994.0711 ns | 121.4594 ns |  9,962.7680 ns |\n       SelectManyEnumeration2 |  9,618.4544 ns | 168.9270 ns |  9,555.7751 ns |\n       SelectWhereEnumeration |  3,507.6555 ns |  56.6892 ns |  3,478.8764 ns |\n DedicatedIteratorEnumeration |  2,621.3351 ns |  39.6181 ns |  2,608.8703 ns |\n   DedicatedStructEnumeration |  1,822.5345 ns |  22.6200 ns |  1,819.7174 ns |\n            NoLinqEnumeration |    347.4957 ns |   2.7167 ns |    347.7183 ns |\n    */\n    [RyuJitX64Job]\n    public class OfTypeBenchmark\n    {\n        int?[] data;\n\n        [Setup]\n        public void Setup()\n        {\n            data = new int?[] { 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, 1, null, 2, null, 3, null, 4, null, 5, null, };\n        }\n\n        /// <summary>\n        /// <see cref=\"Enumerable.OfType{TResult}(IEnumerable)\"/>で T? → T 変換。\n        /// 案外遅い。\n        /// 本来、nullのフィルタリングに使うもんじゃない。\n        /// 19,039.9305 ns\n        /// </summary>\n        [Benchmark]\n        public int OfTypeEnumeration()\n        {\n            var sum = 0;\n            foreach (var x in data.OfType<int>())\n            {\n                sum += x;\n            }\n            return sum;\n        }\n\n        /// <summary>\n        /// <see cref=\"Nullable{T}\"/> → <see cref=\"IEnumerable{T}\"/> 変換コードを書いて、\n        /// それを<see cref=\"Enumerable.SelectMany{TSource, TResult}(IEnumerable{TSource}, Func{TSource, IEnumerable{TResult}})\"/>と組み合わせたもの。\n        /// まあ、無駄な処理してる。\n        /// それでもOfTypeよりはマシ。\n        /// 9,994.0711 ns\n        /// </summary>\n        [Benchmark]\n        public int SelectManyEnumeration()\n        {\n            var sum = 0;\n            foreach (var x in data.SelectMany(x => x.AsEnumerable()))\n            {\n                sum += x;\n            }\n            return sum;\n        }\n\n        /// <summary>\n        /// SelectManyな実装で手を抜いて、new T[]{} しちゃうパターン。\n        /// どうせLINQを介する時点で<see cref=\"NullableEnumerable{T}\"/>構造体がボックス化しちゃうんで、あんまり<see cref=\"SelectManyEnumeration\"/>と大差ない。\n        /// 9,618.4544 ns\n        /// </summary>\n        [Benchmark]\n        public int SelectManyEnumeration2()\n        {\n            var sum = 0;\n            foreach (var x in data.SelectMany(x => x.HasValue ? new[] { x.GetValueOrDefault() } : Array.Empty<int>()))\n            {\n                sum += x;\n            }\n            return sum;\n        }\n\n        /// <summary>\n        /// まあ、素直にSelectManyあきらめろってこった。\n        /// <see cref=\"Enumerable.Where{TSource}(IEnumerable{TSource}, Func{TSource, bool})\"/>でnullをはじく作り。\n        /// 3,507.6555 ns\n        /// </summary>\n        [Benchmark]\n        public int SelectWhereEnumeration()\n        {\n            var sum = 0;\n            foreach (var x in data.Where(x => x.HasValue).Select(x => x.GetValueOrDefault()))\n            {\n                sum += x;\n            }\n            return sum;\n        }\n\n        /// <summary>\n        /// 非nullなものだけ取り出す専用の関数を書いたもの。\n        /// 専用化するとさすがに速い。\n        /// 2,621.3351 ns\n        /// </summary>\n        [Benchmark]\n        public int DedicatedIteratorEnumeration()\n        {\n            var sum = 0;\n            foreach (var x in data.NonNull1())\n            {\n                sum += x;\n            }\n            return sum;\n        }\n\n        /// <summary>\n        /// 非nullなものだけ取り出す専用の関数を書いたもの。\n        /// イテレーターすら使うのをやめて、structでenumerable/enumeratorを実装したもの。\n        /// 1,822.5345 ns\n        /// </summary>\n        [Benchmark]\n        public int DedicatedStructEnumeration()\n        {\n            var sum = 0;\n            foreach (var x in data.NonNull())\n            {\n                sum += x;\n            }\n            return sum;\n        }\n\n        /// <summary>\n        /// まあ、メソッドチェーンしなければ最速なんだけど…\n        /// というか、これが文字通り「桁違い」に早い…\n        /// 347.4957 ns\n        /// </summary>\n        [Benchmark]\n        public int NoLinqEnumeration()\n        {\n            var sum = 0;\n            foreach (var x in data)\n            {\n                if (x.HasValue)\n                    sum += x.GetValueOrDefault();\n            }\n            return sum;\n        }\n    }\n}"
  },
  {
    "path": "Scribble/WhereNonNull/Program.cs",
    "content": "﻿using BenchmarkDotNet.Running;\n\nnamespace WhereNonNull\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            BenchmarkRunner.Run<OfTypeBenchmark>();\n        }\n    }\n}\n"
  },
  {
    "path": "Scribble/WhereNonNull/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"WhereNonNull\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"WhereNonNull\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2016\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"45f8f1aa-1c38-4257-939d-088771a8c30e\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Scribble/WhereNonNull/WhereNonNull.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{45F8F1AA-1C38-4257-939D-088771A8C30E}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>WhereNonNull</RootNamespace>\n    <AssemblyName>WhereNonNull</AssemblyName>\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"NullableExtensions.NonNullStruct.cs\" />\n    <Compile Include=\"NullableExtensions.NonNullIterator.cs\" />\n    <Compile Include=\"NullableExtensions.AsEnumerable.cs\" />\n    <Compile Include=\"OfTypeBenchmark.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "Scribble/WhereNonNull/project.json",
    "content": "﻿{\n  \"frameworks\": {\n    \"net462\": {}\n  },\n  \"runtimes\": {\n    \"win\": {},\n    \"win-anycpu\": {},\n    \"win-x64\": {}\n  },\n  \"dependencies\": {\n    \"BenchmarkDotNet\": \"0.10.0\",\n    \"System.Reflection.Metadata\": \"1.2.0\"\n  }\n}"
  },
  {
    "path": "Scribble/WhereNonNull.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.25909.2\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WhereNonNull\", \"WhereNonNull\\WhereNonNull.csproj\", \"{45F8F1AA-1C38-4257-939D-088771A8C30E}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{45F8F1AA-1C38-4257-939D-088771A8C30E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{45F8F1AA-1C38-4257-939D-088771A8C30E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{45F8F1AA-1C38-4257-939D-088771A8C30E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{45F8F1AA-1C38-4257-939D-088771A8C30E}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Scribble/readme.md",
    "content": "# 書き捨てコード置き場\n\nここにあるコード:\n\n- http://ufcpp.net のサンプルに使うわけでもない\n- どこかの登壇資料に使うわけでもない\n- 保守しない\n"
  },
  {
    "path": "Style/code.css",
    "content": "pre {\n    border: 2px solid #ccf;\n    font-family: Consolas, \"Courier New\", Courier, Monospace;\n    font-size: 14px;\n    line-height: 1.3em !important;\n    padding: .2em;\n    overflow: auto\n}\n\npre code {\n    border: 0;\n    margin: 0;\n    padding: 0\n}\n\npre.source, pre.source code {\n    color: #000;\n    margin: 1em 0;\n    background-color: #fff;\n}\n\npre.source.partial, pre.source.partial code {\n    border-style: dashed solid dashed solid;\n}\n\npre.console, pre.console code {\n    color: #fff;\n    margin: 1em 0;\n    background-color: #606060;\n    border: 1px solid transparent\n}\n\npre.console em, pre.console code em {\n    color: #fff;\n    background-color: #606060 !important;\n    border-bottom: 1pt solid #ff8080 !important\n}\n\n.static { font-weight: bold; }\n.reserved{color:#0000e1}\n.control{color:#8f08c4}\n.inactive{color:#808080}\n.comment{color:#008000}\n.type{color:#2b91af}\n.type.struct{color:#007ACC;}\n.method{color:#74531F}\n.variable{color:#1f377f}\n.string{color:#a31515}\n.literal{color:#a52a2a}\n.input{color:#ff8030;font-weight:bold}\n.excluded{color:#686868;}\n.preprocess{color:#686868;}\n.number{color:#254370}\n.operator{color:#000080}\n.warning{border-bottom:dotted medium #008000}\n.error{border-bottom:dotted medium #f00}\n.suggestion{opacity:.7}\n.element{color:#a51410}\n.attribute{color:#f00}\n.attvalue{color:#00f}\n.bracket{color:#00f}\n.prompt{color:#60ff60}\n.console .comment{color:#ffa0a0}\n\n.version{display:flexbox;margin-left:8px;border-left:8px solid #b0b0c0;padding-left:8px}\n.version2{color:#f00;border-color:#ff8e8e}\n.version3{color:#0c0;border-color:#8ecc8e}\n.version4{color:#00c;border-color:#8e8ecc}\n.version5{color:#c0c;border-color:#dd8ecc}\n.version6{color:#bb0;border-color:#dddd66}\n.version7{color:#0ac;border-color:#66ccdd}\n.version7_1{color:#00f;border-color:#66ccdd}\n.version7_2{color:#0c0;border-color:#66ccdd}\n.version7_3{color:#a00;border-color:#66ccdd}\n.version8{color:#f00;border-color:#ff8e8e;border-left-style:ridge}\n.version9{color:#0c0;border-color:#8ecc8e;border-left-style:ridge}\n.version10{color:#00c;border-color:#8e8ecc;border-left-style:ridge}\n.version11{color:#c0c;border-color:#dd8ecc;border-left-style:ridge}\n.version12{color:#bb0;border-color:#dddd66;border-left-style:ridge}\n.version13{color:#0ac;border-color:#66ccdd;border-left-style:ridge}\n.version14{color:#f00;border-color:#ff8e8e;border-left-style:double}\n.version15{color:#0c0;border-color:#8ecc8e;border-left-style:double}\n.version16{color:#00c;border-color:#8e8ecc;border-left-style:double}\n.version17{color:#c0c;border-color:#dd8ecc;border-left-style:double}\n.version18{color:#bb0;border-color:#dddd66;border-left-style:double}\n.version19{color:#0ac;border-color:#66ccdd;border-left-style:double}\n"
  },
  {
    "path": "Tools/DnxMigration/DnxMigration.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.26228.4\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MigrateToProjectJson\", \"MigrateToProjectJson\\MigrateToProjectJson.csproj\", \"{CB43C05A-D575-452B-A4D4-B4CD5E44568D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProjectModels\", \"ProjectModels\\ProjectModels.csproj\", \"{CCC0BBF4-60C5-48F6-822C-BC437CE6B6D9}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Test\", \"Test\\Test.csproj\", \"{EF6E62AE-32B0-488D-B5AB-5E15EF556F1E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"GenerateWrapJson\", \"GenerateWrapJson\\GenerateWrapJson.csproj\", \"{3D9D9C41-3955-423E-9B9F-FE0FAA162F1D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"MigrateToMsbuild15\", \"MigrateToMsbuild15\\MigrateToMsbuild15.csproj\", \"{361E3785-C3D9-462D-A94E-50CF1A394CB2}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{CB43C05A-D575-452B-A4D4-B4CD5E44568D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CB43C05A-D575-452B-A4D4-B4CD5E44568D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CB43C05A-D575-452B-A4D4-B4CD5E44568D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CB43C05A-D575-452B-A4D4-B4CD5E44568D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CCC0BBF4-60C5-48F6-822C-BC437CE6B6D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CCC0BBF4-60C5-48F6-822C-BC437CE6B6D9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CCC0BBF4-60C5-48F6-822C-BC437CE6B6D9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CCC0BBF4-60C5-48F6-822C-BC437CE6B6D9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{EF6E62AE-32B0-488D-B5AB-5E15EF556F1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EF6E62AE-32B0-488D-B5AB-5E15EF556F1E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EF6E62AE-32B0-488D-B5AB-5E15EF556F1E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EF6E62AE-32B0-488D-B5AB-5E15EF556F1E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{3D9D9C41-3955-423E-9B9F-FE0FAA162F1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{3D9D9C41-3955-423E-9B9F-FE0FAA162F1D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{3D9D9C41-3955-423E-9B9F-FE0FAA162F1D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{3D9D9C41-3955-423E-9B9F-FE0FAA162F1D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{361E3785-C3D9-462D-A94E-50CF1A394CB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{361E3785-C3D9-462D-A94E-50CF1A394CB2}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{361E3785-C3D9-462D-A94E-50CF1A394CB2}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{361E3785-C3D9-462D-A94E-50CF1A394CB2}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Tools/DnxMigration/GenerateWrapJson/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Tools/DnxMigration/GenerateWrapJson/GenerateWrapJson.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{3D9D9C41-3955-423E-9B9F-FE0FAA162F1D}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>GenerateWrapJson</RootNamespace>\n    <AssemblyName>GenerateWrapJson</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProjectModels\\ProjectModels.csproj\">\n      <Project>{ccc0bbf4-60c5-48f6-822c-bc437ce6b6d9}</Project>\n      <Name>ProjectModels</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/GenerateWrapJson/Program.cs",
    "content": "﻿using ProjectModels;\n\nnamespace GenerateWrapJson\n{\n    class Program\n    {\n        /// <summary>\n        /// Generate folders and project.json's to wrap csproj's for xproj-csproj interop.\n        /// </summary>\n        /// <param name=\"args\">\n        /// args[0]: path to a target solution\n        /// </param>\n        static void Main(string[] args)\n        {\n            var slnPath =\n                args.Length >= 1 ? args[0]\n                : @\"path to a solution which you want to migrate from packages.config to project.json\";\n\n            var sln = new Solution(slnPath);\n            sln.GenerateWrapJson();\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/GenerateWrapJson/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"GenerateWrapJson\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"GenerateWrapJson\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"3d9d9c41-3955-423e-9b9f-fe0faa162f1d\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Tools/DnxMigration/MigrateToMsbuild15/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Tools/DnxMigration/MigrateToMsbuild15/MigrateToMsbuild15.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{361E3785-C3D9-462D-A94E-50CF1A394CB2}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>MigrateToMsbuild15</RootNamespace>\n    <AssemblyName>MigrateToMsbuild15</AssemblyName>\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProjectModels\\ProjectModels.csproj\">\n      <Project>{ccc0bbf4-60c5-48f6-822c-bc437ce6b6d9}</Project>\n      <Name>ProjectModels</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/MigrateToMsbuild15/Program.cs",
    "content": "﻿using ProjectModels;\n\nnamespace MigrateToMsbuild15\n{\n    /// <summary>\n    /// Convert packages.config and project.json in all projects in a solution to the new csproj format (PackageReference tags) in msbuild 15 (VS 2017).\n    /// </summary>\n    /// <param name=\"args\">\n    /// args[0]: path to a target solution\n    /// </param>\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var slnPath =\n                args.Length >= 1 ? args[0]\n                : @\"path to a solution which you want to migrate from packages.config and project.json to PackageReference tags\";\n\n            var sln = new Solution(slnPath);\n            sln.MigrateToMsbuild15();\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/MigrateToMsbuild15/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"MigrateToMsbuild15\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"MigrateToMsbuild15\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"361e3785-c3d9-462d-a94e-50cf1a394cb2\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Tools/DnxMigration/MigrateToProjectJson/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Tools/DnxMigration/MigrateToProjectJson/MigrateToProjectJson.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{CB43C05A-D575-452B-A4D4-B4CD5E44568D}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>MigrateToProjectJson</RootNamespace>\n    <AssemblyName>MigrateToProjectJson</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL\">\n      <HintPath>packages\\Newtonsoft.Json.7.0.1\\lib\\net45\\Newtonsoft.Json.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProjectModels\\ProjectModels.csproj\">\n      <Project>{ccc0bbf4-60c5-48f6-822c-bc437ce6b6d9}</Project>\n      <Name>ProjectModels</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/MigrateToProjectJson/Program.cs",
    "content": "﻿using ProjectModels;\n\nnamespace MigrateToProjectJson\n{\n    class Program\n    {\n        /// <summary>\n        /// Convert packages.config's in all projects in a solution to project.json.\n        /// </summary>\n        /// <param name=\"args\">\n        /// args[0]: path to a target solution\n        /// </param>\n        static void Main(string[] args)\n        {\n            var slnPath =\n                args.Length >= 1 ? args[0]\n                : @\"path to a solution which you want to migrate from packages.config to project.json\";\n\n            var sln = new Solution(slnPath);\n            sln.MigrateToProjectJson();\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/MigrateToProjectJson/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"MigrateToProjectJson\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"MigrateToProjectJson\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから \n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n// このプロジェクトが COM に公開される場合、次の GUID が typelib の ID になります\n[assembly: Guid(\"cb43c05a-d575-452b-a4d4-b4cd5e44568d\")]\n\n// アセンブリのバージョン情報は次の 4 つの値で構成されています:\n//\n//      メジャー バージョン\n//      マイナー バージョン\n//      ビルド番号\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Tools/DnxMigration/MigrateToProjectJson/project.json",
    "content": "{\n  \"frameworks\": {\n    \"net46\": { }\n  },\n  \"runtimes\": {\n    \"win\": { },\n    \"win-anycpu\": { }\n  },\n  \"dependencies\": {\n    \"Newtonsoft.Json\": \"7.0.1\"\n  }\n}"
  },
  {
    "path": "Tools/DnxMigration/MigrateToProjectJson/readme.md",
    "content": "﻿# packages.config → project.json\n\n要するに NuGet v3 化。\n\n## project.json\n\n元々は ASP.NET 5/.NET Core/.xproj 向けのプロジェクト管理情報が入った JSON ファイル。\n\nNuGet v3 で、その project.json のサブセットを使って、.csproj/.vbproj でも NuGet パッケージ管理を project.json でやるようになった。\n\nただし、公式にサポートするのは以下の3つだけ。\n\n- ASP.NET 5\n- Modern PCL (プロジェクト テンプレートの「Class Library (package)」/「クラス ライブラリ (パッケージ)」で作るやつ)\n- Universal Windows Platform アプリ(以下、UWP)\n\n前2つは元から .xproj 形式。UWP だけがこの新しい仕組み(.csproj + project.json)で動いてる。\n\n## .csproj + project.json\n\nサポート外(自己責任利用)ではあるものの、任意のプロジェクトから project.json を使うことが可能。\n\n例えば、これまでの NuGet パッケージ管理「packages.confing」で、Rx-Main を参照すると以下のようになってたはず。\n\n```xml\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Rx-Core\" version=\"2.3.0-beta2\" targetFramework=\"net46\" />\n  <package id=\"Rx-Interfaces\" version=\"2.3.0-beta2\" targetFramework=\"net46\" />\n  <package id=\"Rx-Linq\" version=\"2.3.0-beta2\" targetFramework=\"net46\" />\n  <package id=\"Rx-Main\" version=\"2.3.0-beta2\" targetFramework=\"net46\" />\n  <package id=\"Rx-PlatformServices\" version=\"2.3.0-beta2\" targetFramework=\"net46\" />\n</packages>\n```\n\nこれを、project.json という名前で、以下のような JSON ファイルに置き替える。\n\n```json\n{\n  \"frameworks\": {\n    \"net46\": {}\n  },\n  \"runtimes\": {\n    \"win\": {},\n    \"win-anycpu\": {}\n  },\n  \"dependencies\": {\n    \"Rx-Main\": \"2.3.0-beta2\"\n  }\n}\n```\n\n手動でファイルの置き換えをした後、プロジェクトを読み込みなおす(ソリューションを閉じて開きなおすとかでも OK)と、NuGet v3 でパッケージ管理される状態になる。\n\n## NuGet v3 で新しくなったこと\n\nNuGet v3 で、.NET Core/.xproj (2015/7/20 の Visual Studio 2015 リリース時点でベータ状態)の一部分を前倒しで先に使えるようになった状態。\n\n### 依存関係を自動で解決\n\nproject.json では、直接依存しているものだけを書けばよくなった。\n\n上記の例の packages.config (NuGet v2)では、Rx-Main を参照するだけで、それが依存している Rx-Core, Rx-Interfaces, Rx-Linq, Rx-PlatformServices が一緒に追加される。\n一方、project.json (NuGet v3)では、直接参照している Rx-Main の1行だけになった。\n\nアップグレードやアンインストールの作業がだいぶ楽になるはず。\n\n### .csproj/.vbproj を汚さなくなった\n\nNuGet v2 では、packages.config にパッケージ情報が入るだけじゃなくて、.csproj 側にダウンロードしてきた DLL への参照情報が入ってた。\nしかも hint path がソリューションを基準とした相対パスなので、1つのプロジェクトを複数のソリューションから参照するとビルドできなくなったりする。\n\nNuGet v3 では、project.json だけで完結して、.csproj/.vbproj には何も書かなくなった。\n1つのプロジェクトを複数のソリューションから参照しても平気に。\nまた、ソースコード バージョン管理での衝突の可能性も減った。\n\n### キャッシュがユーザー単位に\n\nNuGet v2 では、NuGet サーバーから取ってきたパッケージは、ソリューション直下の `packages` フォルダーにキャッシュされてた。\n\n一方、NuGet v3 では、ユーザー フォルダーの下に、`.nuget/packages` というフォルダーを作ってそこにキャッシュされる。\n同じユーザーのすべてのソリューションでキャッシュが共有される。\n\n### まとめ\n\n変更点\n\n- 依存関係を自動解決\n- .csproj/.vbproj を汚さない\n- キャッシュがユーザー単位\n\nその結果得られる利点\n\n- アップグレード/アンインストール作業が楽\n- 1つのプロジェクトを複数のソリューションから参照しても平気\n- キャッシュ効率アップ\n\n## 移行プログラム\n\npackages.config から project.json に自動的に置き替えるプログラム書いてみた。\n\n- packages.config からパッケージ情報を読み取る\n- project.json を作る\n- .csproj から、パッケージのDLLを `Reference` タグで参照してるところを消す\n- .csproj の packages.config 行を project.json に書き替える\n\n### 注意点\n\nVisual Studio Tools for Windows が必須。\n\n[開発者センター ダウンロードページ](https://dev.windows.com/ja-jp/downloads)で、「Windows 開発者ツールが付属した Visual Studio 2015」のところからダウンロード。\n"
  },
  {
    "path": "Tools/DnxMigration/ProjectModels/Csproj.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Xml.Linq;\n\nnamespace ProjectModels\n{\n    /// <summary>\n    /// Manipulate a *.csproj file.\n    /// </summary>\n    public class Csproj\n    {\n        private const string PackagesConfName = \"packages.config\";\n        private const string ProjectJsonName = \"project.json\";\n\n        public static readonly XNamespace DefaultNamespace = \"http://schemas.microsoft.com/developer/msbuild/2003\";\n        private XNamespace Namespace;\n\n        /// <summary>\n        /// *.csproj path.\n        /// </summary>\n        public string Path { get; }\n\n        /// <summary>\n        /// relative path from sln to csproj\n        /// </summary>\n        public string RelativePath { get; }\n\n        public Csproj(string basePath, string relativePath)\n        {\n            Path = System.IO.Path.Combine(basePath, relativePath);\n            RelativePath = relativePath.Replace(\"\\\\\", \"/\");\n        }\n\n        /// <summary>\n        /// A folder which contains this *.csproj file.\n        /// </summary>\n        public string Folder => System.IO.Path.GetDirectoryName(Path);\n\n        /// <summary>\n        /// Get moniker of Target Framework Version.\n        /// </summary>\n        public string TargetFrameworkVersion => _target ?? (_target = ReadTargetFrameworkVersion(Path));\n        private string _target;\n\n        private static string ReadTargetFrameworkVersion(string csprojPath)\n        {\n            var targetVersionLine = File.ReadAllLines(csprojPath).First(x => x.Contains(\"TargetFrameworkVersion\"));\n\n            var targetVersion =\n                targetVersionLine.Contains(\"v2.0\") ? \"net20\" :\n                targetVersionLine.Contains(\"v3.0\") ? \"net30\" :\n                targetVersionLine.Contains(\"v3.5\") ? \"net35\" :\n                targetVersionLine.Contains(\"v4.5\") ? \"net45\" :\n                targetVersionLine.Contains(\"v4.6\") ? \"net46\" :\n                \"dotnet\";\n            return targetVersion;\n        }\n\n        /// <summary>\n        /// Save changes in <see cref=\"Content\"/>\n        /// </summary>\n        public void Save()\n        {\n            if (_content != null)\n            {\n                _content.Save(Path);\n            }\n        }\n\n        private string PackagesConfigPath => System.IO.Path.Combine(Folder, PackagesConfName);\n\n        /// <summary>\n        /// true if this csproj contains a packages.config file.\n        /// </summary>\n        public bool HasPackagesConfig => File.Exists(PackagesConfigPath);\n\n        /// <summary>\n        /// Content in packages.config\n        /// </summary>\n        public PackagesConfig PackagesConfig => _config ?? (_config = new PackagesConfig(PackagesConfigPath));\n        private PackagesConfig _config;\n\n        private string ProjectJsonPath => System.IO.Path.Combine(Folder, ProjectJson.ProjectJsonName);\n\n        /// <summary>\n        /// true if this csproj contains a packages.config file.\n        /// </summary>\n        public bool HasProjectJson => File.Exists(ProjectJsonPath);\n\n        /// <summary>\n        /// Content in packages.config\n        /// </summary>\n        public ProjectJson ProjectJson => _proj ?? (_proj = new ProjectJson(ProjectJsonPath));\n        private ProjectJson _proj;\n\n        /// <summary>\n        /// Contents in this csproj file.\n        /// </summary>\n        public XDocument Content\n        {\n            get\n            {\n                if (_content == null)\n                {\n                    _content = XDocument.Load(Path);\n                    Namespace = _content.Root.Name.Namespace;\n                }\n                return _content;\n            }\n        }\n\n        private XDocument _content;\n\n        public CsprojOutputType OutputType\n        {\n            get\n            {\n                var type = Content.Root.Elements(Namespace + \"PropertyGroup\").SelectMany(x => x.Elements(Namespace + \"OutputType\")).FirstOrDefault()?.Value;\n\n                switch (type)\n                {\n                    default:\n                    case \"Exe\": return CsprojOutputType.Exe;\n                    case \"WinExe\": return CsprojOutputType.WinExe;\n                    case \"Library\": return CsprojOutputType.Library;\n                }\n            }\n        }\n\n        public IEnumerable<XElement> GetItemGroups() => Content.Root.Elements(Namespace + \"ItemGroup\");\n\n        public IEnumerable<XElement> GetElementsInItemGroups(string elementName) => GetItemGroups().SelectMany(g => g.Elements(Namespace + elementName)).ToArray();\n\n        /// <summary>\n        /// Enumerate depenndencies:\n        /// - <see cref=\"ProjectReferences\"/>\n        /// - <see cref=\"ProjectJson.Packages\"/>\n        /// - <see cref=\"PackagesConfig.Packages\"/>\n        /// </summary>\n        public IEnumerable<Package> Dependencies => _dependencies ?? (_dependencies = GetDependencies());\n        private IEnumerable<Package> _dependencies;\n\n        private IEnumerable<Package> GetDependencies()\n        {\n            foreach (var r in ProjectReferences)\n            {\n                yield return new Package(r, \"1.0.0-*\");\n            }\n\n            if (HasPackagesConfig)\n                foreach (var p in PackagesConfig.Packages)\n                    yield return p;\n\n            if (HasProjectJson)\n                foreach (var p in ProjectJson.Packages)\n                    yield return p;\n        }\n\n        /// <summary>\n        /// Enumerate project references.\n        /// </summary>\n        public IEnumerable<string> ProjectReferences => _references ?? (_references = GetProjectReferences());\n        private IEnumerable<string> _references;\n\n        private IEnumerable<string> GetProjectReferences()\n        {\n            foreach (var r in GetElementsInItemGroups(\"ProjectReference\"))\n            {\n                var path = r.Attribute(\"Include\").Value;\n                var name = System.IO.Path.GetFileNameWithoutExtension(path);\n                yield return name;\n            }\n        }\n\n        /// <summary>\n        /// Rewrite this csproj file to migrate from packages.config to project.json:\n        /// - Generate project.json\n        /// - Replace {None Include=\"packages.confing\"} to {None Include=\"project.json\"}\n        /// - Remove {References} reletated to NuGet packages\n        /// - Remove packages.config files\n        /// </summary>\n        /// <returns>true if any change</returns>\n        public bool MigrateToProjectJson()\n        {\n            if (!HasPackagesConfig)\n                return false;\n\n            ProjectJson.GeneratePackageJson(TargetFrameworkVersion, Folder, PackagesConfig.Packages);\n\n            foreach (var r in GetElementsInItemGroups(\"Reference\"))\n            {\n                if (PackagesConfig.Packages.Any(x => r.Attribute(\"Include\").Value.StartsWith(x.Id + \",\")))\n                {\n                    r.Remove();\n                }\n            }\n\n            foreach (var n in GetElementsInItemGroups(\"None\"))\n            {\n                var include = n.Attribute(\"Include\");\n                if (include.Value == PackagesConfName)\n                {\n                    n.ReplaceAll(new XAttribute(\"Include\", ProjectJson.ProjectJsonName));\n                }\n            }\n\n            File.Delete(PackagesConfig.Path);\n\n            return true;\n        }\n\n        /// <summary>\n        /// Rewrite this csproj file to migrate from packages.config and project.json to PackageReference tags:\n        /// - Generate project.json\n        /// - Remove {None Include=\"packages.confing\"} and {None Include=\"project.json\"}\n        /// - Remove {References} reletated to NuGet packages\n        /// - Add {PackageReference}\n        /// - Change {Project} ToolsVersion attribute to 15.0\n        /// - Remove packages.config and project.json files\n        /// </summary>\n        /// <returns>true if any change</returns>\n        public bool MigrateToMsbuild15()\n        {\n            if (!HasPackagesConfig && !HasProjectJson)\n                return false;\n\n            var packages1 = HasPackagesConfig ? PackagesConfig.Packages : Enumerable.Empty<Package>();\n            var packages2 = HasProjectJson ? ProjectJson.Packages : Enumerable.Empty<Package>();\n            var packages = packages1.Concat(packages2);\n\n            GeneratePackageReferences(packages);\n\n            if (HasPackagesConfig)\n            {\n                foreach (var r in GetElementsInItemGroups(\"Reference\"))\n                {\n                    if (PackagesConfig.Packages.Any(x => r.Attribute(\"Include\").Value.StartsWith(x.Id + \",\")))\n                    {\n                        r.Remove();\n                    }\n                }\n\n                File.Delete(PackagesConfig.Path);\n            }\n\n            if (HasProjectJson)\n            {\n                File.Delete(ProjectJsonPath);\n\n                var lockJsonPath = ProjectJsonPath.Replace(\".json\", \".lock.json\");\n                if (File.Exists(lockJsonPath))\n                    File.Delete(lockJsonPath);\n            }\n\n            foreach (var n in GetElementsInItemGroups(\"None\"))\n            {\n                var include = n.Attribute(\"Include\");\n                if (include.Value == PackagesConfName || include.Value == ProjectJsonName)\n                {\n                    n.Remove();\n                }\n            }\n\n            var version = Content.Root.Attribute(\"ToolsVersion\");\n            version.Value = \"15.0\";\n\n            return true;\n        }\n\n        public void GenerateWrapJson(string wrapFolder)\n        {\n            ProjectJson.GenerateWrapJson(TargetFrameworkVersion, wrapFolder, RelativePath, Dependencies);\n        }\n\n        /// <summary>\n        /// Package infomations from PackageReference tags.\n        /// </summary>\n        /// <param name=\"packagesPath\"></param>\n        /// <returns></returns>\n        public IEnumerable<Package> PackageTags => _packageTags ?? (_packageTags = GetPackages());\n        private IEnumerable<Package> _packageTags;\n\n        /// <summary>\n        /// Package references (any of <see cref=\"PackageTags\"/>, <see cref=\"PackagesConfig.Packages\"/>, <see cref=\"ProjectJson.Packages\"/>)\n        /// </summary>\n        public IEnumerable<Package> PackageReferences =>\n            HasPackagesConfig ? PackagesConfig.Packages :\n            HasProjectJson ? ProjectJson.Packages :\n            PackageTags;\n\n        private IEnumerable<Package> GetPackages()\n        {\n            foreach (var n in GetElementsInItemGroups(\"PackageReference\"))\n            {\n                var include = n.Attribute(\"Include\").Value;\n                var version = n.Attribute(\"Version\")?.Value ?? n.Element(Namespace + \"Version\").Value;\n                yield return new Package(include, version);\n            }\n        }\n\n        private void GeneratePackageReferences(IEnumerable<Package> packages)\n        {\n            var itemGroup = new XElement(Namespace + \"ItemGroup\");\n\n            foreach (var package in packages)\n            {\n                itemGroup.Add(new XElement(Namespace + \"PackageReference\",\n                    new XAttribute(\"Include\", package.Id),\n                    new XElement(Namespace + \"Version\", package.Version)\n                ));\n            }\n\n            Content.Root.Add(itemGroup);\n        }\n\n        public bool IsNewSdk => Content.Root.Attribute(\"Sdk\") != null;\n        public string RootNamespace => GetElementsInPropertyGroups(\"RootNamespace\").FirstOrDefault()?.Value;\n        public string AssemblyName => GetElementsInPropertyGroups(\"AssemblyName\").FirstOrDefault()?.Value;\n\n        public IEnumerable<XElement> GetPropertyGroups() => Content.Root.Elements(Namespace + \"PropertyGroup\");\n\n        public IEnumerable<XElement> GetElementsInPropertyGroups(string elementName) => GetPropertyGroups().SelectMany(g => g.Elements(Namespace + elementName)).ToArray();\n\n        public IEnumerable<string> TTFiles => GetElementsInItemGroups(\"None\").Select(e => e.Attribute(\"Update\")?.Value).Where(a => a != null);// && a.EndsWith(\".tt\"));\n\n        /// <summary>\n        /// references to .NET assemblies。\n        /// </summary>\n        public IEnumerable<string> References => GetElementsInItemGroups(\"Reference\").Select(e => e.Attribute(\"Include\")?.Value).Where(a => a != null);// && a.EndsWith(\".tt\"));\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/ProjectModels/CsprojOutputType.cs",
    "content": "﻿namespace ProjectModels\n{\n    public enum CsprojOutputType\n    {\n        Library,\n        Exe,\n        WinExe,\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/ProjectModels/Package.cs",
    "content": "﻿using System.Linq;\n\nnamespace ProjectModels\n{\n    public class Package\n    {\n        public string Id { get; }\n        public string Version { get; }\n\n        /// <summary></summary>\n        /// <param name=\"id\"><see cref=\"Id\"/></param>\n        /// <param name=\"version\"><see cref=\"Version\"/></param>\n        public Package(string id, string version)\n        {\n            Id = id;\n            Version = version;\n        }\n\n        public string AnyVersion => string.Join(\".\", Version.Split('.').Take(2)) + \".*\";\n\n        public override string ToString() => $\"{Id}: {Version}\";\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/ProjectModels/PackagesConfig.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq;\nusing System.Xml.Linq;\n\nnamespace ProjectModels\n{\n    /// <summary>\n    /// Manipulate a packages.config file.\n    /// </summary>\n    public class PackagesConfig\n    {\n        /// <summary>\n        /// packages.config path.\n        /// </summary>\n        public string Path { get; }\n\n        public PackagesConfig(string confitPath)\n        {\n            Path = confitPath;\n        }\n\n        /// <summary>\n        /// Package infomations from a packages.config file.\n        /// </summary>\n        /// <param name=\"packagesPath\"></param>\n        /// <returns></returns>\n        public IEnumerable<Package> Packages => _packages ?? (_packages = GetPackages());\n        private IEnumerable<Package> _packages;\n\n        private IEnumerable<Package> GetPackages()\n        {\n            var doc = XDocument.Load(Path);\n            var items = doc.Root.Elements(\"package\");\n            var packages = items.Select(x => new Package((string)x.Attribute(\"id\"), (string)x.Attribute(\"version\")));\n            return packages;\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/ProjectModels/ProjectJson.cs",
    "content": "﻿using Newtonsoft.Json;\nusing Newtonsoft.Json.Linq;\nusing System.Collections.Generic;\nusing System.IO;\nusing D = System.Collections.Generic.Dictionary<string, object>;\n\nnamespace ProjectModels\n{\n    /// <summary>\n    /// Manipulate a project.json file.\n    /// </summary>\n    public class ProjectJson\n    {\n        internal const string ProjectJsonName = \"project.json\";\n\n        /// <summary>\n        /// project.json path.\n        /// </summary>\n        public string Path { get; }\n\n        public ProjectJson(string confitPath)\n        {\n            Path = confitPath;\n        }\n\n        /// <summary>\n        /// Package infomations from a packages.config file.\n        /// </summary>\n        /// <param name=\"packagesPath\"></param>\n        /// <returns></returns>\n        public IEnumerable<Package> Packages => _packages ?? (_packages = GetPackages());\n        private IEnumerable<Package> _packages;\n\n        private IEnumerable<Package> GetPackages()\n        {\n            var json = File.ReadAllText(Path);\n            var obj = JsonConvert.DeserializeObject<JObject>(json);\n            return GetPackagesRecursive(obj);\n        }\n\n        private IEnumerable<Package> GetPackagesRecursive(JObject obj)\n        {\n            foreach (var item in obj)\n            {\n                if (item.Key == \"dependencies\")\n                {\n                    var dependencies = (JObject)item.Value;\n                    foreach (var d in dependencies)\n                    {\n                        yield return new Package(d.Key, (string)d.Value);\n                    }\n                }\n                else\n                {\n                    var child = item.Value as JObject;\n                    if(child != null)\n                    {\n                        foreach (var c in GetPackagesRecursive(child))\n                        {\n                            yield return c;\n                        }\n                    }\n                }\n            }\n\n        }\n\n        /// <summary>\n        /// Generate a project.json file for csproj + NuGet 3.*.\n        /// </summary>\n        /// <param name=\"targetVersion\"></param>\n        /// <param name=\"csprojFolder\"></param>\n        /// <param name=\"dependencies\"></param>\n        public static void GeneratePackageJson(string targetVersion, string csprojFolder, IEnumerable<Package> dependencies)\n        {\n            var json = GetPackageJson(targetVersion, dependencies);\n            var jsonPath = System.IO.Path.Combine(csprojFolder, ProjectJsonName);\n            File.WriteAllText(jsonPath, json);\n        }\n\n        private static string GetPackageJson(string targetVersion, IEnumerable<Package> dependencies)\n        {\n            return JsonConvert.SerializeObject(new D\n            {\n                [\"frameworks\"] = new D { [targetVersion] = _empty },\n                [\"runtimes\"] = new D\n                {\n                    [\"win\"] = _empty,\n                    [\"win-anycpu\"] = _empty,\n                },\n                [\"dependencies\"] = ToDictionary(dependencies),\n            }, Formatting.Indented);\n        }\n\n        /// <summary>\n        /// Generate a project.json file for csproj + NuGet 3.*.\n        /// </summary>\n        /// <param name=\"targetVersion\"></param>\n        /// <param name=\"csprojFolder\"></param>\n        /// <param name=\"packages\"></param>\n        public static void GenerateWrapJson(string targetVersion, string wrapFolder, string projectPath, IEnumerable<Package> packages)\n        {\n            var name = System.IO.Path.GetFileNameWithoutExtension(projectPath);\n            var projectFolder = System.IO.Path.GetDirectoryName(projectPath).Replace(\"\\\\\", \"/\");\n\n            var destinationFolder = System.IO.Path.Combine(wrapFolder, name);\n            Directory.CreateDirectory(destinationFolder);\n\n            var json = GetWrapJson(targetVersion, projectFolder, name, packages);\n            var jsonPath = System.IO.Path.Combine(destinationFolder, ProjectJsonName);\n            File.WriteAllText(jsonPath, json);\n        }\n\n        private static string GetWrapJson(string targetVersion, string projectFolder, string projectName, IEnumerable<Package> packages)\n        {\n            return JsonConvert.SerializeObject(new D\n            {\n                [\"version\"] = \"1.0.0-*\",\n                [\"frameworks\"] = new D\n                {\n                    [targetVersion] = new D\n                    {\n                        [\"wrappedProject\"] = $\"../../{projectFolder}/{projectName}.csproj\",\n                        [\"bin\"] = new D\n                        {\n                            [\"assembly\"] = $\"../../{projectFolder}/obj/{{configuration}}/{projectName}.dll\",\n                            [\"pdb\"] = $\"../../{projectFolder}/obj/{{configuration}}/{projectName}.pdb\",\n                        },\n                    },\n                },\n                [\"dependencies\"] = ToDictionary(packages),\n            }, Formatting.Indented);\n        }\n\n        private static readonly object _empty = new object();\n\n        private static D ToDictionary(IEnumerable<Package> packages)\n        {\n            var d = new D();\n\n            foreach (var p in packages)\n            {\n                d[p.Id] = p.Version;\n            }\n\n            return d;\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/ProjectModels/ProjectModels.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{CCC0BBF4-60C5-48F6-822C-BC437CE6B6D9}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ProjectModels</RootNamespace>\n    <AssemblyName>ProjectModels</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Csproj.cs\" />\n    <Compile Include=\"CsprojOutputType.cs\" />\n    <Compile Include=\"Package.cs\" />\n    <Compile Include=\"PackagesConfig.cs\" />\n    <Compile Include=\"ProjectJson.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Solution.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/ProjectModels/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ProjectModels\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ProjectModels\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"ccc0bbf4-60c5-48f6-822c-bc437ce6b6d9\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Tools/DnxMigration/ProjectModels/Solution.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Text.RegularExpressions;\n\nnamespace ProjectModels\n{\n    /// <summary>\n    /// Manipulate a *.sln file.\n    /// </summary>\n    public class Solution\n    {\n        /// <summary>\n        /// *.sln path.\n        /// </summary>\n        public string Path { get; }\n\n        public Solution(string slnPath)\n        {\n            Path = slnPath;\n        }\n\n        /// <summary>\n        /// A folder which contains this *.sln file.\n        /// </summary>\n        public string Folder => System.IO.Path.GetDirectoryName(Path);\n\n        public IEnumerable<Csproj> CsharpProjcts => _csprojs ?? (_csprojs = GetProjectPaths(Path).ToArray());\n        private IEnumerable<Csproj> _csprojs;\n\n        private static readonly Regex regProject = new Regex(@\" = \"\".*?\"\", \"\"(?<csproj>.*?\\.csproj)\"\"\");\n\n        /// <summary>\n        /// Enumerate all projects in a solution.\n        /// </summary>\n        /// <param name=\"slnPath\"></param>\n        /// <returns></returns>\n        private static IEnumerable<Csproj> GetProjectPaths(string slnPath)\n        {\n            var baseFolder = System.IO.Path.GetDirectoryName(slnPath);\n            var slnLines = File.ReadAllLines(slnPath);\n\n            foreach (var line in slnLines)\n            {\n                var m = regProject.Match(line);\n                if (!m.Success) continue;\n\n                var relative = m.Groups[\"csproj\"].Value;\n                var csprojPath = System.IO.Path.Combine(baseFolder, relative);\n                if (!File.Exists(csprojPath)) continue;\n\n                yield return new Csproj(baseFolder, relative);\n            }\n        }\n\n        public void MigrateToProjectJson()\n        {\n            foreach (var csproj in CsharpProjcts.Where(p => p.HasPackagesConfig))\n            {\n                if (csproj.MigrateToProjectJson())\n                    csproj.Save();\n            }\n        }\n\n        public void MigrateToMsbuild15()\n        {\n            foreach (var csproj in CsharpProjcts.Where(p => p.HasPackagesConfig || p.HasProjectJson))\n            {\n                if (csproj.MigrateToMsbuild15())\n                    csproj.Save();\n            }\n        }\n\n        private string WrapFolder => System.IO.Path.Combine(Folder, \"wrap\");\n\n        public void GenerateWrapJson()\n        {\n            var wrapFolder = WrapFolder;\n            Directory.CreateDirectory(wrapFolder);\n\n            foreach (var csproj in CsharpProjcts.Where(p => p.OutputType == CsprojOutputType.Library))\n            {\n                csproj.GenerateWrapJson(wrapFolder);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/ProjectModels/project.json",
    "content": "{\n  \"frameworks\": {\n    \"net46\": { }\n  },\n  \"runtimes\": {\n    \"win\": { },\n    \"win-anycpu\": { }\n  },\n  \"dependencies\": {\n    \"Newtonsoft.Json\": \"7.0.1\"\n  }\n}"
  },
  {
    "path": "Tools/DnxMigration/Test/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6\" />\n    </startup>\n</configuration>"
  },
  {
    "path": "Tools/DnxMigration/Test/Program.cs",
    "content": "﻿using ProjectModels;\nusing System;\nusing System.Diagnostics;\nusing System.IO;\nusing System.Linq;\n\nnamespace Test\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            var repositoryNames = new[]\n            {\n                \"...\",\n            };\n\n            var root = @\"...\";\n\n            var csprojs = (\n                from r in repositoryNames\n                from f in Directory.GetFiles(root + r, \"*.csproj\", SearchOption.AllDirectories)\n                select new Csproj(root, f.Replace(root, \"\"))\n                ).ToArray();\n\n            var groups = csprojs.GroupBy(x =>\n                x.HasPackagesConfig ? \"packages.config\" :\n                x.HasProjectJson? \"project.json\" :\n                x.IsNewSdk ? \"new sdk\" :\n                \"no packages\"\n            );\n\n            foreach (var g in groups)\n            {\n                Console.WriteLine(\"--- \" + g.Key + \" ---\");\n\n                foreach (var p in g)\n                {\n                    var references = p.References.Count();\n                    var projects = p.ProjectReferences.Count();\n                    var packages = p.PackageReferences.Count();\n                    Console.WriteLine($\"\\t {references}, {projects}, {packages} {p.RelativePath}\");\n                }\n            }\n#if true\n            var hasPackagesConfig = 0;\n            var hasProjectJson = 0;\n            var hasTT = 0;\n            var isNewSdk = 0;\n            var winExe = 0;\n\n            foreach (var x in csprojs)\n            {\n                if (x.IsNewSdk) isNewSdk++;\n                if (x.HasPackagesConfig) hasPackagesConfig++;\n                if (x.HasProjectJson) hasProjectJson++;\n                if (x.TTFiles.Any()) hasTT++;\n                if (x.OutputType == CsprojOutputType.WinExe) winExe++;\n\n                //Console.WriteLine(new { x.AssemblyName, x.RootNamespace });\n            }\n\n            Console.WriteLine(new { total = csprojs.Length, isNewSdk, hasPackagesConfig, hasProjectJson, hasTT, winExe });\n#endif\n\n            return;\n\n            var testDataPath = @\"..\\..\\..\\TestData\";\n            var sourcePath = Path.Combine(testDataPath, \"Source\");\n            var tempPath = Path.Combine(testDataPath, \"Temp\");\n\n            Prepare(sourcePath, tempPath);\n\n            var slnPath = Path.Combine(tempPath, \"XprojInterop.sln\");\n            var sln = new Solution(slnPath);\n\n            sln.MigrateToProjectJson();\n            sln.GenerateWrapJson();\n\n            //Dump(sln);\n        }\n\n        private static void Dump(Solution sln)\n        {\n            foreach (var proj in sln.CsharpProjcts)\n            {\n                Console.WriteLine(proj.Path);\n\n                if (proj.HasPackagesConfig)\n                {\n                    Console.WriteLine(\"---- packages.config\");\n                    foreach (var p in proj.PackagesConfig.Packages)\n                    {\n                        Console.WriteLine(p);\n                    }\n                }\n\n                if (proj.HasProjectJson)\n                {\n                    Console.WriteLine(\"---- project.json\");\n                    foreach (var p in proj.ProjectJson.Packages)\n                    {\n                        Console.WriteLine(p);\n                    }\n                }\n\n                if (proj.PackageTags.Any())\n                {\n                    Console.WriteLine(\"---- msbuild 15\");\n                    foreach (var p in proj.PackageTags)\n                    {\n                        Console.WriteLine(p);\n                    }\n                }\n            }\n        }\n\n        private static void Prepare(string sourcePath, string tempPath)\n        {\n            if (Directory.Exists(tempPath))\n            {\n                Directory.Delete(tempPath, true);\n                Directory.CreateDirectory(tempPath);\n            }\n            Xcopy(sourcePath, tempPath);\n\n            Delete(tempPath, \"wrap\");\n            Delete(tempPath, \"packages\");\n            Delete(tempPath, \"artifacts\");\n        }\n\n        private static void Delete(string tempPath, string folderName)\n        {\n            var path = Path.Combine(tempPath, folderName);\n            if (Directory.Exists(path))\n                Directory.Delete(path, true);\n        }\n\n        /// <summary>\n        /// Method to Perform Xcopy to copy files/folders from Source machine to Target Machine\n        /// </summary>\n        /// <param name=\"sourcePath\"></param>\n        /// <param name=\"destinationPath\"></param>\n        private static void Xcopy(string sourcePath, string destinationPath)\n        {\n            // Use ProcessStartInfo class\n            var startInfo = new ProcessStartInfo();\n            startInfo.CreateNoWindow = true;\n            startInfo.UseShellExecute = false;\n            startInfo.FileName = \"xcopy\";\n            startInfo.Arguments = \"\\\"\" + sourcePath + \"\\\"\" + \" \" + \"\\\"\" + destinationPath + \"\\\"\" + @\" /e /y /I\";\n\n            using (var exeProcess = Process.Start(startInfo))\n            {\n                exeProcess.WaitForExit();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/Test/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Test\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"Test\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"ef6e62ae-32b0-488d-b5ab-5e15ef556f1e\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Tools/DnxMigration/Test/Test.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{EF6E62AE-32B0-488D-B5AB-5E15EF556F1E}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Test</RootNamespace>\n    <AssemblyName>Test</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\ProjectModels\\ProjectModels.csproj\">\n      <Project>{ccc0bbf4-60c5-48f6-822c-bc437ce6b6d9}</Project>\n      <Name>ProjectModels</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/TestData/.gitignore",
    "content": "Temp"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/.gitignore",
    "content": ".vs\nartifacts\npackages\nwrap\n*.lock.json"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet35/Class1.cs",
    "content": "﻿using System.Threading.Tasks;\n\nnamespace ClassLibraryNet35\n{\n    public class Class1 : Common.IInterface1\n    {\n        public string Name => \"net35/packages.config\";\n\n        public async Task<int> GetAsync()\n        {\n            await Task.Delay(1);\n            return 350;\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet35/ClassLibraryNet35.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{DF3E7566-1DB6-455F-BF72-76CFFCA5D3BE}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibraryNet35</RootNamespace>\n    <AssemblyName>ClassLibraryNet35</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"MinimumAsyncBridge, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\MinimumAsyncBridge.0.9.20.1\\lib\\net35\\MinimumAsyncBridge.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"MinimumThreadingBridge, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\MinimumThreadingBridge.0.9.8.0\\lib\\net35\\MinimumThreadingBridge.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\CommonNet35\\CommonNet35.csproj\">\n      <Project>{e16a6915-ff45-42a4-9862-15733d6f1d29}</Project>\n      <Name>CommonNet35</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet35/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClassLibraryNet35\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibraryNet35\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"df3e7566-1db6-455f-bf72-76cffca5d3be\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet35/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"MinimumAsyncBridge\" version=\"0.9.20.1\" targetFramework=\"net35\" />\n  <package id=\"MinimumThreadingBridge\" version=\"0.9.8.0\" targetFramework=\"net35\" />\n</packages>"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet35X/Class1.cs",
    "content": "﻿using System.Threading.Tasks;\n\nnamespace ClassLibraryNet35X\n{\n    public class Class1 : Common.IInterface1\n    {\n        public string Name => \"net35/project.json\";\n\n        public async Task<int> GetAsync()\n        {\n            await Task.Delay(1);\n            return 351;\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet35X/ClassLibraryNet35X.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{CD4D79ED-DE16-4B61-8539-3AECE56E664D}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibraryNet35X</RootNamespace>\n    <AssemblyName>ClassLibraryNet35X</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\CommonNet35\\CommonNet35.csproj\">\n      <Project>{e16a6915-ff45-42a4-9862-15733d6f1d29}</Project>\n      <Name>CommonNet35</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet35X/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClassLibraryNet35X\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibraryNet35X\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"cd4d79ed-de16-4b61-8539-3aece56e664d\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet35X/project.json",
    "content": "{\n  \"frameworks\": {\n    \"net35\": { }\n  },\n  \"runtimes\": {\n    \"win\": { },\n    \"win-anycpu\": { }\n  },\n  \"dependencies\": {\n    \"MinimumAsyncBridge\": \"0.9.20.1\"\n  }\n}"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet46/Class1.cs",
    "content": "﻿using System.Threading.Tasks;\n\nnamespace ClassLibraryNet46\n{\n    public class Class1 : Common.IInterface1\n    {\n        public string Name => \"net46/packages.config\";\n\n        public async Task<int> GetAsync()\n        {\n            await Task.Delay(1);\n            return 460;\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet46/ClassLibraryNet46.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{FA5F395A-FA4C-4561-A490-66C47A6ACC31}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibraryNet46</RootNamespace>\n    <AssemblyName>ClassLibraryNet46</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"MinimumAsyncBridge, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\MinimumAsyncBridge.0.9.20.1\\lib\\net45\\MinimumAsyncBridge.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"MinimumThreadingBridge, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\MinimumThreadingBridge.0.9.8.0\\lib\\net45\\MinimumThreadingBridge.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\CommonNet35\\CommonNet35.csproj\">\n      <Project>{e16a6915-ff45-42a4-9862-15733d6f1d29}</Project>\n      <Name>CommonNet35</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet46/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClassLibraryNet46\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibraryNet46\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"fa5f395a-fa4c-4561-a490-66c47a6acc31\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet46/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"MinimumAsyncBridge\" version=\"0.9.20.1\" targetFramework=\"net46\" />\n  <package id=\"MinimumThreadingBridge\" version=\"0.9.8.0\" targetFramework=\"net46\" />\n</packages>"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet46X/Class1.cs",
    "content": "﻿using System.Threading.Tasks;\n\nnamespace ClassLibraryNet46X\n{\n    public class Class1 : Common.IInterface1\n    {\n        public string Name => \"net46/project.json\";\n\n        public async Task<int> GetAsync()\n        {\n            await Task.Delay(1);\n            return 461;\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet46X/ClassLibraryNet46X.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{2D0383CD-42A9-44BA-B265-F78308A2DBD9}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>ClassLibraryNet46X</RootNamespace>\n    <AssemblyName>ClassLibraryNet46X</AssemblyName>\n    <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Class1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"project.json\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\CommonNet35\\CommonNet35.csproj\">\n      <Project>{e16a6915-ff45-42a4-9862-15733d6f1d29}</Project>\n      <Name>CommonNet35</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet46X/ClassLibraryNet46X.xproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0.24720\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">14.0.24720</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(VSToolsPath)\\DNX\\Microsoft.DNX.Props\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>8dc528cc-2393-4301-8403-a9e7ff740f65</ProjectGuid>\n    <RootNamespace>ClassLibraryNet46X</RootNamespace>\n    <BaseIntermediateOutputPath Condition=\"'$(BaseIntermediateOutputPath)'=='' \">..\\artifacts\\obj\\$(MSBuildProjectName)</BaseIntermediateOutputPath>\n    <OutputPath Condition=\"'$(OutputPath)'=='' \">..\\artifacts\\bin\\$(MSBuildProjectName)\\</OutputPath>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <SchemaVersion>2.0</SchemaVersion>\n  </PropertyGroup>\n  <Import Project=\"$(VSToolsPath)\\DNX\\Microsoft.DNX.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet46X/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ClassLibraryNet46X\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ClassLibraryNet46X\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"2d0383cd-42a9-44ba-b265-f78308a2dbd9\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/ClassLibraryNet46X/project.json",
    "content": "{\n  \"frameworks\": {\n    \"net46\": { }\n    },\n  \"runtimes\": {\n    \"win\": { },\n    \"win-anycpu\": { }\n  },\n  \"dependencies\": {\n    \"MinimumAsyncBridge\": \"0.9.20.1\"\n  }\n}"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/CommonNet35/CommonNet35.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{E16A6915-FF45-42A4-9862-15733D6F1D29}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Common</RootNamespace>\n    <AssemblyName>CommonNet35</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"MinimumAsyncBridge, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\MinimumAsyncBridge.0.9.20.1\\lib\\net35\\MinimumAsyncBridge.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"MinimumThreadingBridge, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\MinimumThreadingBridge.0.9.8.0\\lib\\net35\\MinimumThreadingBridge.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"IInterface1.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/CommonNet35/IInterface1.cs",
    "content": "﻿using System.Threading.Tasks;\n\nnamespace Common\n{\n    public interface IInterface1\n    {\n        string Name { get; }\n\n        Task<int> GetAsync();\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/CommonNet35/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"CommonNet35\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"CommonNet35\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"e16a6915-ff45-42a4-9862-15733d6f1d29\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/CommonNet35/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"MinimumAsyncBridge\" version=\"0.9.20.1\" targetFramework=\"net35\" />\n  <package id=\"MinimumThreadingBridge\" version=\"0.9.8.0\" targetFramework=\"net35\" />\n</packages>"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/XprojInterop.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.24720.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"src\", \"src\", \"{0FA47834-343F-48FE-96D3-BDE17C80D2EC}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{84482CD0-3CF4-4333-B468-EBEC83442767}\"\n\tProjectSection(SolutionItems) = preProject\n\t\tglobal.json = global.json\n\tEndProjectSection\nEndProject\nProject(\"{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}\") = \"XprojLibrary\", \"src\\XprojLibrary\\XprojLibrary.xproj\", \"{25667A67-CC6E-4922-B879-DBEF38EEA18F}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibraryNet35\", \"ClassLibraryNet35\\ClassLibraryNet35.csproj\", \"{DF3E7566-1DB6-455F-BF72-76CFFCA5D3BE}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibraryNet35X\", \"ClassLibraryNet35X\\ClassLibraryNet35X.csproj\", \"{CD4D79ED-DE16-4B61-8539-3AECE56E664D}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibraryNet46\", \"ClassLibraryNet46\\ClassLibraryNet46.csproj\", \"{FA5F395A-FA4C-4561-A490-66C47A6ACC31}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ClassLibraryNet46X\", \"ClassLibraryNet46X\\ClassLibraryNet46X.csproj\", \"{2D0383CD-42A9-44BA-B265-F78308A2DBD9}\"\nEndProject\nProject(\"{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}\") = \"WebApplication1\", \"src\\WebApplication1\\WebApplication1.xproj\", \"{E251217B-B85A-453E-8A2A-DC51D2A65FEE}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"csprojs\", \"csprojs\", \"{84F2B0C5-7560-4FA8-82B0-81FBD71D2578}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"CommonNet35\", \"CommonNet35\\CommonNet35.csproj\", \"{E16A6915-FF45-42A4-9862-15733D6F1D29}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{25667A67-CC6E-4922-B879-DBEF38EEA18F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{25667A67-CC6E-4922-B879-DBEF38EEA18F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{25667A67-CC6E-4922-B879-DBEF38EEA18F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{25667A67-CC6E-4922-B879-DBEF38EEA18F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{DF3E7566-1DB6-455F-BF72-76CFFCA5D3BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{DF3E7566-1DB6-455F-BF72-76CFFCA5D3BE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{DF3E7566-1DB6-455F-BF72-76CFFCA5D3BE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{DF3E7566-1DB6-455F-BF72-76CFFCA5D3BE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CD4D79ED-DE16-4B61-8539-3AECE56E664D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CD4D79ED-DE16-4B61-8539-3AECE56E664D}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CD4D79ED-DE16-4B61-8539-3AECE56E664D}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CD4D79ED-DE16-4B61-8539-3AECE56E664D}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{FA5F395A-FA4C-4561-A490-66C47A6ACC31}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{FA5F395A-FA4C-4561-A490-66C47A6ACC31}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{FA5F395A-FA4C-4561-A490-66C47A6ACC31}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{FA5F395A-FA4C-4561-A490-66C47A6ACC31}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2D0383CD-42A9-44BA-B265-F78308A2DBD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2D0383CD-42A9-44BA-B265-F78308A2DBD9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2D0383CD-42A9-44BA-B265-F78308A2DBD9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2D0383CD-42A9-44BA-B265-F78308A2DBD9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E251217B-B85A-453E-8A2A-DC51D2A65FEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E251217B-B85A-453E-8A2A-DC51D2A65FEE}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E251217B-B85A-453E-8A2A-DC51D2A65FEE}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E251217B-B85A-453E-8A2A-DC51D2A65FEE}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{E16A6915-FF45-42A4-9862-15733D6F1D29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{E16A6915-FF45-42A4-9862-15733D6F1D29}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{E16A6915-FF45-42A4-9862-15733D6F1D29}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{E16A6915-FF45-42A4-9862-15733D6F1D29}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{25667A67-CC6E-4922-B879-DBEF38EEA18F} = {0FA47834-343F-48FE-96D3-BDE17C80D2EC}\n\t\t{DF3E7566-1DB6-455F-BF72-76CFFCA5D3BE} = {84F2B0C5-7560-4FA8-82B0-81FBD71D2578}\n\t\t{CD4D79ED-DE16-4B61-8539-3AECE56E664D} = {84F2B0C5-7560-4FA8-82B0-81FBD71D2578}\n\t\t{FA5F395A-FA4C-4561-A490-66C47A6ACC31} = {84F2B0C5-7560-4FA8-82B0-81FBD71D2578}\n\t\t{2D0383CD-42A9-44BA-B265-F78308A2DBD9} = {84F2B0C5-7560-4FA8-82B0-81FBD71D2578}\n\t\t{E251217B-B85A-453E-8A2A-DC51D2A65FEE} = {0FA47834-343F-48FE-96D3-BDE17C80D2EC}\n\t\t{E16A6915-FF45-42A4-9862-15733D6F1D29} = {84F2B0C5-7560-4FA8-82B0-81FBD71D2578}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/global.json",
    "content": "{\n  \"projects\": [\n    \"src\",\n    \"test\",\n    \"wrap\"\n  ],\n  \"sdk\": {\n    \"version\": \"1.0.0-rc1-final\"\n  }\n}"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/src/WebApplication1/Properties/launchSettings.json",
    "content": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:36745/\",\n      \"sslPort\": 0\n    }\n  },\n  \"profiles\": {\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"Hosting:Environment\": \"Development\"\n      }\n    },\n    \"web\": {\n      \"commandName\": \"web\",\n      \"environmentVariables\": {\n        \"Hosting:Environment\": \"Development\"\n      }\n    }\n  }\n}"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/src/WebApplication1/Startup.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.AspNet.Builder;\nusing Microsoft.AspNet.Hosting;\nusing Microsoft.AspNet.Http;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace WebApplication1\n{\n    public class Startup\n    {\n        // This method gets called by the runtime. Use this method to add services to the container.\n        // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940\n        public void ConfigureServices(IServiceCollection services)\n        {\n        }\n\n        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\n        public void Configure(IApplicationBuilder app)\n        {\n            Xproj();\n            Config46();\n            Json46();\n            Config35();\n            Json35();\n\n            app.UseIISPlatformHandler();\n\n            app.Run(async (context) =>\n            {\n                var message = $@\"Hello World!\n{Json46()}\n{Config46()}\n{Json35()}\n{Config35()}\n{Xproj()}\n\";\n\n                await context.Response.WriteAsync(message);\n            });\n        }\n\n        private static string Json46() => new ClassLibraryNet46X.Class1().Name;\n        private static string Config46() => new ClassLibraryNet46.Class1().Name;\n        private static string Json35() => new ClassLibraryNet35X.Class1().Name;\n        private static string Config35() => new ClassLibraryNet35.Class1().Name;\n        private static string Xproj() => new XprojLibrary.Class1().Name;\n\n        // Entry point for the application.\n        public static void Main(string[] args) => WebApplication.Run<Startup>(args);\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/src/WebApplication1/WebApplication1.xproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">14.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(VSToolsPath)\\DNX\\Microsoft.DNX.Props\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>e251217b-b85a-453e-8a2a-dc51d2a65fee</ProjectGuid>\n    <RootNamespace>WebApplication1</RootNamespace>\n    <BaseIntermediateOutputPath Condition=\"'$(BaseIntermediateOutputPath)'=='' \">..\\..\\artifacts\\obj\\$(MSBuildProjectName)</BaseIntermediateOutputPath>\n    <OutputPath Condition=\"'$(OutputPath)'=='' \">..\\..\\artifacts\\bin\\$(MSBuildProjectName)\\</OutputPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <SchemaVersion>2.0</SchemaVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <ProduceOutputsOnBuild>True</ProduceOutputsOnBuild>\n  </PropertyGroup>\n  <ItemGroup>\n    <DnxInvisibleContent Include=\"bower.json\" />\n    <DnxInvisibleContent Include=\".bowerrc\" />\n    <DnxInvisibleContent Include=\"package.json\" />\n  </ItemGroup>\n  <Import Project=\"$(VSToolsPath)\\DNX\\Microsoft.DNX.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/src/WebApplication1/project.json",
    "content": "﻿{\n  \"version\": \"1.0.0-*\",\n  \"compilationOptions\": {\n    \"emitEntryPoint\": true\n  },\n\n  \"dependencies\": {\n    \"Microsoft.AspNet.IISPlatformHandler\": \"1.0.0-rc1-final\",\n    \"Microsoft.AspNet.Server.Kestrel\": \"1.0.0-rc1-final\"\n  },\n\n  \"commands\": {\n    \"web\": \"Microsoft.AspNet.Server.Kestrel\"\n  },\n\n  \"frameworks\": {\n    \"dnx46\": {\n\n      \"dependencies\": {\n        \"MinimumAsyncBridge\": \"0.9.20.1\",\n        \"XprojLibrary\": \"\",\n        \"ClassLibraryNet35\": \"\",\n        \"ClassLibraryNet35X\": \"\",\n        \"ClassLibraryNet46\": \"\",\n        \"ClassLibraryNet46X\": \"\"\n      }\n    }\n  },\n\n  \"exclude\": [\n    \"wwwroot\",\n    \"node_modules\"\n  ],\n  \"publishExclude\": [\n    \"**.user\",\n    \"**.vspscc\"\n  ]\n}\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/src/WebApplication1/wwwroot/web.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <system.webServer>\n    <handlers>\n      <add name=\"httpPlatformHandler\" path=\"*\" verb=\"*\" modules=\"httpPlatformHandler\" resourceType=\"Unspecified\"/>\n    </handlers>\n    <httpPlatform processPath=\"%DNX_PATH%\" arguments=\"%DNX_ARGS%\" stdoutLogEnabled=\"false\" startupTimeLimit=\"3600\"/>\n  </system.webServer>\n</configuration>\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/src/XprojLibrary/Class1.cs",
    "content": "﻿using System.Threading.Tasks;\n\nnamespace XprojLibrary\n{\n    public class Class1 : Common.IInterface1\n    {\n        public string Name => \"net46/xproj\";\n\n        public async Task<int> GetAsync()\n        {\n            await Task.Delay(1);\n            return 462;\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/src/XprojLibrary/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"XprojLibrary\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"XprojLibrary\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2015\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"25667a67-cc6e-4922-b879-dbef38eea18f\")]\n"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/src/XprojLibrary/XprojLibrary.xproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">14.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(VSToolsPath)\\DNX\\Microsoft.DNX.Props\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>25667a67-cc6e-4922-b879-dbef38eea18f</ProjectGuid>\n    <RootNamespace>XprojLibrary</RootNamespace>\n    <BaseIntermediateOutputPath Condition=\"'$(BaseIntermediateOutputPath)'=='' \">..\\..\\artifacts\\obj\\$(MSBuildProjectName)</BaseIntermediateOutputPath>\n    <OutputPath Condition=\"'$(OutputPath)'=='' \">..\\..\\artifacts\\bin\\$(MSBuildProjectName)\\</OutputPath>\n  </PropertyGroup>\n  <PropertyGroup>\n    <SchemaVersion>2.0</SchemaVersion>\n  </PropertyGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\ClassLibraryNet35X\\ClassLibraryNet35X.csproj\" />\n    <ProjectReference Include=\"..\\..\\ClassLibraryNet35\\ClassLibraryNet35.csproj\" />\n    <ProjectReference Include=\"..\\..\\ClassLibraryNet46X\\ClassLibraryNet46X.csproj\" />\n    <ProjectReference Include=\"..\\..\\ClassLibraryNet46\\ClassLibraryNet46.csproj\" />\n  </ItemGroup>\n  <Import Project=\"$(VSToolsPath)\\DNX\\Microsoft.DNX.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n</Project>"
  },
  {
    "path": "Tools/DnxMigration/TestData/Source/src/XprojLibrary/project.json",
    "content": "﻿{\n  \"version\": \"1.0.0-*\",\n  \"description\": \"XprojLibrary Class Library\",\n  \"authors\": [ \"iwanaga\" ],\n  \"tags\": [ \"\" ],\n  \"projectUrl\": \"\",\n  \"licenseUrl\": \"\",\n\n  \"frameworks\": {\n    \"net46\": {\n      \"dependencies\": {\n        \"MinimumAsyncBridge\": \"0.9.20.1\",\n        \"CommonNet35\": \"\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tools/KeyLogger/Gma.UserActivityMonitor/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\n\n// Information about this assembly is defined by the following\n// attributes.\n//\n// change them to the information which is associated with the assembly\n// you compile.\n\n[assembly: AssemblyTitle(\"Gma.UserActivity\")]\n[assembly: AssemblyDescription(\"This class library contains components which monitor all mouse and keyboard activities globally (also outside of the application) and provides appropriate events.\")]\n[assembly: AssemblyCompany(\"George Mamaladze\")]\n[assembly: AssemblyProduct(\"Gma.UserActivity\")]\n[assembly: AssemblyCopyright(\"Free to use, copy, modify and redistribute\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// The assembly version has following format :\n//\n// Major.Minor.Build.Revision\n//\n// You can specify all values by your own or you can build default build and revision\n// numbers with the '*' character (the default):\n\n[assembly: AssemblyVersion(\"1.0.0\")]\n\n// The following attributes specify the key for the sign of your assembly. See the\n// .NET Framework documentation for more information about signing.\n// This is not required, if you don't want signing let these attributes like they're.\n[assembly: AssemblyDelaySign(false)]\n[assembly: AssemblyKeyFile(\"\")]\n"
  },
  {
    "path": "Tools/KeyLogger/Gma.UserActivityMonitor/GlobalEventProvider.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Windows.Forms;\n\nnamespace Gma.UserActivityMonitor\n{\n    /// <summary>\n    /// This component monitors all mouse activities globally (also outside of the application) \n    /// and provides appropriate events.\n    /// </summary>\n    public class GlobalEventProvider : Component\n    {\n        /// <summary>\n        /// This component raises events. The value is always true.\n        /// </summary>\n        protected override bool CanRaiseEvents\n        {\n            get\n            {\n                return true;\n            }\n        }\n\n        //################################################################\n        #region Mouse events\n\n        private event MouseEventHandler m_MouseMove;\n\n        /// <summary>\n        /// Occurs when the mouse pointer is moved. \n        /// </summary>\n        public event MouseEventHandler MouseMove\n        {\n            add\n            {\n                if (m_MouseMove == null)\n                {\n                    HookManager.MouseMove += HookManager_MouseMove;\n                }\n                m_MouseMove += value;\n            }\n\n            remove\n            {\n                m_MouseMove -= value;\n                if (m_MouseMove == null)\n                {\n                    HookManager.MouseMove -= HookManager_MouseMove;\n                }\n            }\n        }\n\n        void HookManager_MouseMove(object sender, MouseEventArgs e)\n        {\n            if (m_MouseMove != null)\n            {\n                m_MouseMove.Invoke(this, e);\n            }\n        }\n\n        private event MouseEventHandler m_MouseClick;\n        /// <summary>\n        /// Occurs when a click was performed by the mouse. \n        /// </summary>\n        public event MouseEventHandler MouseClick\n        {\n            add\n            {\n                if (m_MouseClick == null)\n                {\n                    HookManager.MouseClick += HookManager_MouseClick;\n                }\n                m_MouseClick += value;\n            }\n\n            remove\n            {\n                m_MouseClick -= value;\n                if (m_MouseClick == null)\n                {\n                    HookManager.MouseClick -= HookManager_MouseClick;\n                }\n            }\n        }\n\n        void HookManager_MouseClick(object sender, MouseEventArgs e)\n        {\n            if (m_MouseClick != null)\n            {\n                m_MouseClick.Invoke(this, e);\n            }\n        }\n\n        private event MouseEventHandler m_MouseDown;\n\n        /// <summary>\n        /// Occurs when the mouse a mouse button is pressed. \n        /// </summary>\n        public event MouseEventHandler MouseDown\n        {\n            add\n            {\n                if (m_MouseDown == null)\n                {\n                    HookManager.MouseDown += HookManager_MouseDown;\n                }\n                m_MouseDown += value;\n            }\n\n            remove\n            {\n                m_MouseDown -= value;\n                if (m_MouseDown == null)\n                {\n                    HookManager.MouseDown -= HookManager_MouseDown;\n                }\n            }\n        }\n\n        void HookManager_MouseDown(object sender, MouseEventArgs e)\n        {\n            if (m_MouseDown != null)\n            {\n                m_MouseDown.Invoke(this, e);\n            }\n        }\n\n\n        private event MouseEventHandler m_MouseUp;\n\n        /// <summary>\n        /// Occurs when a mouse button is released. \n        /// </summary>\n        public event MouseEventHandler MouseUp\n        {\n            add\n            {\n                if (m_MouseUp == null)\n                {\n                    HookManager.MouseUp += HookManager_MouseUp;\n                }\n                m_MouseUp += value;\n            }\n\n            remove\n            {\n                m_MouseUp -= value;\n                if (m_MouseUp == null)\n                {\n                    HookManager.MouseUp -= HookManager_MouseUp;\n                }\n            }\n        }\n\n        void HookManager_MouseUp(object sender, MouseEventArgs e)\n        {\n            if (m_MouseUp != null)\n            {\n                m_MouseUp.Invoke(this, e);\n            }\n        }\n\n        private event MouseEventHandler m_MouseDoubleClick;\n\n        /// <summary>\n        /// Occurs when a double clicked was performed by the mouse. \n        /// </summary>\n        public event MouseEventHandler MouseDoubleClick\n        {\n            add\n            {\n                if (m_MouseDoubleClick == null)\n                {\n                    HookManager.MouseDoubleClick += HookManager_MouseDoubleClick;\n                }\n                m_MouseDoubleClick += value;\n            }\n\n            remove\n            {\n                m_MouseDoubleClick -= value;\n                if (m_MouseDoubleClick == null)\n                {\n                    HookManager.MouseDoubleClick -= HookManager_MouseDoubleClick;\n                }\n            }\n        }\n\n        void HookManager_MouseDoubleClick(object sender, MouseEventArgs e)\n        {\n            if (m_MouseDoubleClick != null)\n            {\n                m_MouseDoubleClick.Invoke(this, e);\n            }\n        }\n\n\n        private event EventHandler<MouseEventExtArgs> m_MouseMoveExt;\n\n        /// <summary>\n        /// Occurs when the mouse pointer is moved. \n        /// </summary>\n        /// <remarks>\n        /// This event provides extended arguments of type <see cref=\"MouseEventArgs\"/> enabling you to \n        /// supress further processing of mouse movement in other applications.\n        /// </remarks>\n        public event EventHandler<MouseEventExtArgs> MouseMoveExt\n        {\n            add\n            {\n                if (m_MouseMoveExt == null)\n                {\n                    HookManager.MouseMoveExt += HookManager_MouseMoveExt;\n                }\n                m_MouseMoveExt += value;\n            }\n\n            remove\n            {\n                m_MouseMoveExt -= value;\n                if (m_MouseMoveExt == null)\n                {\n                    HookManager.MouseMoveExt -= HookManager_MouseMoveExt;\n                }\n            }\n        }\n\n        void HookManager_MouseMoveExt(object sender, MouseEventExtArgs e)\n        {\n            if (m_MouseMoveExt != null)\n            {\n                m_MouseMoveExt.Invoke(this, e);\n            }\n        }\n\n        private event EventHandler<MouseEventExtArgs> m_MouseClickExt;\n\n        /// <summary>\n        /// Occurs when a click was performed by the mouse. \n        /// </summary>\n        /// <remarks>\n        /// This event provides extended arguments of type <see cref=\"MouseEventArgs\"/> enabling you to \n        /// supress further processing of mouse click in other applications.\n        /// </remarks>\n        public event EventHandler<MouseEventExtArgs> MouseClickExt\n        {\n            add\n            {\n                if (m_MouseClickExt == null)\n                {\n                    HookManager.MouseClickExt += HookManager_MouseClickExt;\n                }\n                m_MouseClickExt += value;\n            }\n\n            remove\n            {\n                m_MouseClickExt -= value;\n                if (m_MouseClickExt == null)\n                {\n                    HookManager.MouseClickExt -= HookManager_MouseClickExt;\n                }\n            }\n        }\n\n        void HookManager_MouseClickExt(object sender, MouseEventExtArgs e)\n        {\n            if (m_MouseClickExt != null)\n            {\n                m_MouseClickExt.Invoke(this, e);\n            }\n        }\n\n\n        #endregion\n\n        //################################################################\n        #region Keyboard events\n\n        private event KeyPressEventHandler m_KeyPress;\n\n        /// <summary>\n        /// Occurs when a key is pressed.\n        /// </summary>\n        /// <remarks>\n        /// Key events occur in the following order: \n        /// <list type=\"number\">\n        /// <item>KeyDown</item>\n        /// <item>KeyPress</item>\n        /// <item>KeyUp</item>\n        /// </list>\n        ///The KeyPress event is not raised by noncharacter keys; however, the noncharacter keys do raise the KeyDown and KeyUp events. \n        ///Use the KeyChar property to sample keystrokes at run time and to consume or modify a subset of common keystrokes. \n        ///To handle keyboard events only in your application and not enable other applications to receive keyboard events, \n        /// set the KeyPressEventArgs.Handled property in your form's KeyPress event-handling method to <b>true</b>. \n        /// </remarks>\n        public event KeyPressEventHandler KeyPress\n        {\n            add\n            {\n                if (m_KeyPress==null)\n                {\n                    HookManager.KeyPress +=HookManager_KeyPress;\n                }\n                m_KeyPress += value;\n            }\n            remove\n            {\n                m_KeyPress -= value;\n                if (m_KeyPress == null)\n                {\n                    HookManager.KeyPress -= HookManager_KeyPress;\n                }\n            }\n        }\n\n        void HookManager_KeyPress(object sender, KeyPressEventArgs e)\n        {\n            if (m_KeyPress != null)\n            {\n                m_KeyPress.Invoke(this, e);\n            }\n        }\n\n        private event KeyEventHandler m_KeyUp;\n\n        /// <summary>\n        /// Occurs when a key is released. \n        /// </summary>\n        public event KeyEventHandler KeyUp\n        {\n            add\n            {\n                if (m_KeyUp == null)\n                {\n                    HookManager.KeyUp += HookManager_KeyUp;\n                }\n                m_KeyUp += value;\n            }\n            remove\n            {\n                m_KeyUp -= value;\n                if (m_KeyUp == null)\n                {\n                    HookManager.KeyUp -= HookManager_KeyUp;\n                }\n            }\n        }\n\n        private void HookManager_KeyUp(object sender, KeyEventArgs e)\n        {\n            if (m_KeyUp != null)\n            {\n                m_KeyUp.Invoke(this, e);\n            }\n        }\n\n        private event KeyEventHandler m_KeyDown;\n\n        /// <summary>\n        /// Occurs when a key is preseed. \n        /// </summary>\n        public event KeyEventHandler KeyDown\n        {\n            add\n            {\n                if (m_KeyDown == null)\n                {\n                    HookManager.KeyDown += HookManager_KeyDown;\n                }\n                m_KeyDown += value;\n            }\n            remove\n            {\n                m_KeyDown -= value;\n                if (m_KeyDown == null)\n                {\n                    HookManager.KeyDown -= HookManager_KeyDown;\n                }\n            }\n        }\n\n        private void HookManager_KeyDown(object sender, KeyEventArgs e)\n        {\n            m_KeyDown.Invoke(this, e);\n        }\n\n        #endregion\n\n        \n    }\n}\n"
  },
  {
    "path": "Tools/KeyLogger/Gma.UserActivityMonitor/Gma.UserActivityMonitor.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\" ToolsVersion=\"14.0\">\n  <PropertyGroup>\n    <ProjectType>Local</ProjectType>\n    <ProductVersion>9.0.21022</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{F52AA97E-180A-40ED-8F2B-09080171D6C7}</ProjectGuid>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ApplicationIcon>\n    </ApplicationIcon>\n    <AssemblyKeyContainerName>\n    </AssemblyKeyContainerName>\n    <AssemblyName>Gma.UserActivityMonitor</AssemblyName>\n    <AssemblyOriginatorKeyFile>\n    </AssemblyOriginatorKeyFile>\n    <DefaultClientScript>JScript</DefaultClientScript>\n    <DefaultHTMLPageLayout>Grid</DefaultHTMLPageLayout>\n    <DefaultTargetSchema>IE50</DefaultTargetSchema>\n    <DelaySign>false</DelaySign>\n    <OutputType>Library</OutputType>\n    <RootNamespace>Gma.UserActivityMonitor</RootNamespace>\n    <RunPostBuildEvent>OnBuildSuccess</RunPostBuildEvent>\n    <StartupObject>\n    </StartupObject>\n    <FileUpgradeFlags>\n    </FileUpgradeFlags>\n    <UpgradeBackupLocation>\n    </UpgradeBackupLocation>\n    <IsWebBootstrapper>true</IsWebBootstrapper>\n    <OldToolsVersion>3.5</OldToolsVersion>\n    <PublishUrl>http://localhost/GlobalHookDemo/</PublishUrl>\n    <Install>true</Install>\n    <InstallFrom>Web</InstallFrom>\n    <UpdateEnabled>true</UpdateEnabled>\n    <UpdateMode>Foreground</UpdateMode>\n    <UpdateInterval>7</UpdateInterval>\n    <UpdateIntervalUnits>Days</UpdateIntervalUnits>\n    <UpdatePeriodically>false</UpdatePeriodically>\n    <UpdateRequired>false</UpdateRequired>\n    <MapFileExtensions>true</MapFileExtensions>\n    <ApplicationRevision>0</ApplicationRevision>\n    <ApplicationVersion>2.0.0.%2a</ApplicationVersion>\n    <UseApplicationTrust>false</UseApplicationTrust>\n    <BootstrapperEnabled>true</BootstrapperEnabled>\n    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>\n    <BaseAddress>285212672</BaseAddress>\n    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>\n    <ConfigurationOverrideFile>\n    </ConfigurationOverrideFile>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <DocumentationFile>bin\\Debug\\Gma.xml</DocumentationFile>\n    <DebugSymbols>true</DebugSymbols>\n    <FileAlignment>4096</FileAlignment>\n    <NoStdLib>false</NoStdLib>\n    <NoWarn>\n    </NoWarn>\n    <Optimize>false</Optimize>\n    <RegisterForComInterop>false</RegisterForComInterop>\n    <RemoveIntegerChecks>false</RemoveIntegerChecks>\n    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\n    <WarningLevel>4</WarningLevel>\n    <DebugType>full</DebugType>\n    <ErrorReport>prompt</ErrorReport>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <OutputPath>bin\\Release\\</OutputPath>\n    <AllowUnsafeBlocks>false</AllowUnsafeBlocks>\n    <BaseAddress>285212672</BaseAddress>\n    <CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>\n    <ConfigurationOverrideFile>\n    </ConfigurationOverrideFile>\n    <DefineConstants>TRACE</DefineConstants>\n    <DocumentationFile>\n    </DocumentationFile>\n    <DebugSymbols>false</DebugSymbols>\n    <FileAlignment>4096</FileAlignment>\n    <NoStdLib>false</NoStdLib>\n    <NoWarn>\n    </NoWarn>\n    <Optimize>true</Optimize>\n    <RegisterForComInterop>false</RegisterForComInterop>\n    <RemoveIntegerChecks>false</RemoveIntegerChecks>\n    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>\n    <WarningLevel>4</WarningLevel>\n    <DebugType>none</DebugType>\n    <ErrorReport>prompt</ErrorReport>\n    <UseVSHostingProcess>false</UseVSHostingProcess>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\">\n      <Name>System</Name>\n    </Reference>\n    <Reference Include=\"System.Data\">\n      <Name>System.Data</Name>\n    </Reference>\n    <Reference Include=\"System.Drawing\">\n      <Name>System.Drawing</Name>\n    </Reference>\n    <Reference Include=\"System.Windows.Forms\">\n      <Name>System.Windows.Forms</Name>\n    </Reference>\n    <Reference Include=\"System.Xml\">\n      <Name>System.XML</Name>\n    </Reference>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"GlobalEventProvider.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Include=\"HookManager.Callbacks.cs\" />\n    <Compile Include=\"HookManager.cs\" />\n    <Compile Include=\"HookManager.Structures.cs\" />\n    <Compile Include=\"HookManager.Windows.cs\" />\n    <Compile Include=\"MouseEventExtArgs.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <BootstrapperPackage Include=\"Microsoft.Net.Framework.2.0\">\n      <Visible>False</Visible>\n      <ProductName>.NET Framework 2.0 %28x86%29</ProductName>\n      <Install>true</Install>\n    </BootstrapperPackage>\n    <BootstrapperPackage Include=\"Microsoft.Net.Framework.3.0\">\n      <Visible>False</Visible>\n      <ProductName>.NET Framework 3.0 %28x86%29</ProductName>\n      <Install>false</Install>\n    </BootstrapperPackage>\n    <BootstrapperPackage Include=\"Microsoft.Net.Framework.3.5\">\n      <Visible>False</Visible>\n      <ProductName>.NET Framework 3.5</ProductName>\n      <Install>false</Install>\n    </BootstrapperPackage>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <PropertyGroup>\n    <PreBuildEvent>\n    </PreBuildEvent>\n    <PostBuildEvent>\n    </PostBuildEvent>\n  </PropertyGroup>\n</Project>"
  },
  {
    "path": "Tools/KeyLogger/Gma.UserActivityMonitor/HookManager.Callbacks.cs",
    "content": "﻿using System;\nusing System.ComponentModel;\nusing System.Reflection;\nusing System.Runtime.InteropServices;\nusing System.Windows.Forms;\n\nnamespace Gma.UserActivityMonitor\n{\n    public static partial class HookManager\n    {\n        /// <summary>\n        /// The CallWndProc hook procedure is an application-defined or library-defined callback \n        /// function used with the SetWindowsHookEx function. The HOOKPROC type defines a pointer \n        /// to this callback function. CallWndProc is a placeholder for the application-defined \n        /// or library-defined function name.\n        /// </summary>\n        /// <param name=\"nCode\">\n        /// [in] Specifies whether the hook procedure must process the message. \n        /// If nCode is HC_ACTION, the hook procedure must process the message. \n        /// If nCode is less than zero, the hook procedure must pass the message to the \n        /// CallNextHookEx function without further processing and must return the \n        /// value returned by CallNextHookEx.\n        /// </param>\n        /// <param name=\"wParam\">\n        /// [in] Specifies whether the message was sent by the current thread. \n        /// If the message was sent by the current thread, it is nonzero; otherwise, it is zero. \n        /// </param>\n        /// <param name=\"lParam\">\n        /// [in] Pointer to a CWPSTRUCT structure that contains details about the message. \n        /// </param>\n        /// <returns>\n        /// If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx. \n        /// If nCode is greater than or equal to zero, it is highly recommended that you call CallNextHookEx \n        /// and return the value it returns; otherwise, other applications that have installed WH_CALLWNDPROC \n        /// hooks will not receive hook notifications and may behave incorrectly as a result. If the hook \n        /// procedure does not call CallNextHookEx, the return value should be zero. \n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/callwndproc.asp\n        /// </remarks>\n        private delegate int HookProc(int nCode, int wParam, IntPtr lParam);\n\n        //##############################################################################\n        #region Mouse hook processing\n\n        /// <summary>\n        /// This field is not objectively needed but we need to keep a reference on a delegate which will be \n        /// passed to unmanaged code. To avoid GC to clean it up.\n        /// When passing delegates to unmanaged code, they must be kept alive by the managed application \n        /// until it is guaranteed that they will never be called.\n        /// </summary>\n        private static HookProc s_MouseDelegate;\n\n        /// <summary>\n        /// Stores the handle to the mouse hook procedure.\n        /// </summary>\n        private static int s_MouseHookHandle;\n\n        private static int m_OldX;\n        private static int m_OldY;\n\n        /// <summary>\n        /// A callback function which will be called every Time a mouse activity detected.\n        /// </summary>\n        /// <param name=\"nCode\">\n        /// [in] Specifies whether the hook procedure must process the message. \n        /// If nCode is HC_ACTION, the hook procedure must process the message. \n        /// If nCode is less than zero, the hook procedure must pass the message to the \n        /// CallNextHookEx function without further processing and must return the \n        /// value returned by CallNextHookEx.\n        /// </param>\n        /// <param name=\"wParam\">\n        /// [in] Specifies whether the message was sent by the current thread. \n        /// If the message was sent by the current thread, it is nonzero; otherwise, it is zero. \n        /// </param>\n        /// <param name=\"lParam\">\n        /// [in] Pointer to a CWPSTRUCT structure that contains details about the message. \n        /// </param>\n        /// <returns>\n        /// If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx. \n        /// If nCode is greater than or equal to zero, it is highly recommended that you call CallNextHookEx \n        /// and return the value it returns; otherwise, other applications that have installed WH_CALLWNDPROC \n        /// hooks will not receive hook notifications and may behave incorrectly as a result. If the hook \n        /// procedure does not call CallNextHookEx, the return value should be zero. \n        /// </returns>\n        private static int MouseHookProc(int nCode, int wParam, IntPtr lParam)\n        {\n            if (nCode >= 0)\n            {\n                //Marshall the data from callback.\n                MouseLLHookStruct mouseHookStruct = (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));\n\n                //detect button clicked\n                MouseButtons button = MouseButtons.None;\n                short mouseDelta = 0;\n                int clickCount = 0;\n                bool mouseDown = false;\n                bool mouseUp = false;\n\n                switch (wParam)\n                {\n                    case WM_LBUTTONDOWN:\n                        mouseDown = true;\n                        button = MouseButtons.Left;\n                        clickCount = 1;\n                        break;\n                    case WM_LBUTTONUP:\n                        mouseUp = true;\n                        button = MouseButtons.Left;\n                        clickCount = 1;\n                        break;\n                    case WM_LBUTTONDBLCLK: \n                        button = MouseButtons.Left;\n                        clickCount = 2;\n                        break;\n                    case WM_RBUTTONDOWN:\n                        mouseDown = true;\n                        button = MouseButtons.Right;\n                        clickCount = 1;\n                        break;\n                    case WM_RBUTTONUP:\n                        mouseUp = true;\n                        button = MouseButtons.Right;\n                        clickCount = 1;\n                        break;\n                    case WM_RBUTTONDBLCLK: \n                        button = MouseButtons.Right;\n                        clickCount = 2;\n                        break;\n                    case WM_MOUSEWHEEL:\n                        //If the message is WM_MOUSEWHEEL, the high-order word of MouseData member is the wheel delta. \n                        //One wheel click is defined as WHEEL_DELTA, which is 120. \n                        //(value >> 16) & 0xffff; retrieves the high-order word from the given 32-bit value\n                        mouseDelta = (short)((mouseHookStruct.MouseData >> 16) & 0xffff);\n                       \n                    //TODO: X BUTTONS (I havent them so was unable to test)\n                        //If the message is WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP, \n                        //or WM_NCXBUTTONDBLCLK, the high-order word specifies which X button was pressed or released, \n                        //and the low-order word is reserved. This value can be one or more of the following values. \n                        //Otherwise, MouseData is not used. \n                        break;\n                }\n\n                //generate event \n                MouseEventExtArgs e = new MouseEventExtArgs(\n                                                   button,\n                                                   clickCount,\n                                                   mouseHookStruct.Point.X,\n                                                   mouseHookStruct.Point.Y,\n                                                   mouseDelta);\n\n                //Mouse up\n                if (s_MouseUp!=null && mouseUp)\n                {\n                    s_MouseUp.Invoke(null, e);\n                }\n\n                //Mouse down\n                if (s_MouseDown != null && mouseDown)\n                {\n                    s_MouseDown.Invoke(null, e);\n                }\n\n                //If someone listens to click and a click is heppened\n                if (s_MouseClick != null && clickCount>0)\n                {\n                    s_MouseClick.Invoke(null, e);\n                }\n\n                //If someone listens to click and a click is heppened\n                if (s_MouseClickExt != null && clickCount > 0)\n                {\n                    s_MouseClickExt.Invoke(null, e);\n                }\n\n                //If someone listens to double click and a click is heppened\n                if (s_MouseDoubleClick != null && clickCount == 2)\n                {\n                    s_MouseDoubleClick.Invoke(null, e);\n                }\n\n                //Wheel was moved\n                if (s_MouseWheel!=null && mouseDelta!=0)\n                {\n                    s_MouseWheel.Invoke(null, e);\n                }\n\n                //If someone listens to move and there was a change in coordinates raise move event\n                if ((s_MouseMove!=null || s_MouseMoveExt!=null) && (m_OldX != mouseHookStruct.Point.X || m_OldY != mouseHookStruct.Point.Y))\n                {\n                    m_OldX = mouseHookStruct.Point.X;\n                    m_OldY = mouseHookStruct.Point.Y;\n                    if (s_MouseMove != null)\n                    {\n                        s_MouseMove.Invoke(null, e);\n                    }\n\n                    if (s_MouseMoveExt != null)\n                    {\n                        s_MouseMoveExt.Invoke(null, e);\n                    }\n                }\n\n                if (e.Handled)\n                {\n                    return -1;\n                }\n            }\n\n            //call next hook\n            return CallNextHookEx(s_MouseHookHandle, nCode, wParam, lParam);\n        }\n\n        private static void EnsureSubscribedToGlobalMouseEvents()\n        {\n            // install Mouse hook only if it is not installed and must be installed\n            if (s_MouseHookHandle == 0)\n            {\n                //See comment of this field. To avoid GC to clean it up.\n                s_MouseDelegate = MouseHookProc;\n                //install hook\n                s_MouseHookHandle = SetWindowsHookEx(\n                    WH_MOUSE_LL,\n                    s_MouseDelegate,\n                    Marshal.GetHINSTANCE(\n                        Assembly.GetExecutingAssembly().GetModules()[0]),\n                    0);\n                //If SetWindowsHookEx fails.\n                if (s_MouseHookHandle == 0)\n                {\n                    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. \n                    int errorCode = Marshal.GetLastWin32Error();\n                    //do cleanup\n\n                    //Initializes and throws a new instance of the Win32Exception class with the specified error. \n                    throw new Win32Exception(errorCode);\n                }\n            }\n        }\n\n        private static void TryUnsubscribeFromGlobalMouseEvents()\n        {\n            //if no subsribers are registered unsubsribe from hook\n            if (s_MouseClick == null &&\n                s_MouseDown == null &&\n                s_MouseMove == null &&\n                s_MouseUp == null &&\n                s_MouseClickExt == null &&\n                s_MouseMoveExt == null &&\n                s_MouseWheel == null)\n            {\n                ForceUnsunscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static void ForceUnsunscribeFromGlobalMouseEvents()\n        {\n            if (s_MouseHookHandle != 0)\n            {\n                //uninstall hook\n                int result = UnhookWindowsHookEx(s_MouseHookHandle);\n                //reset invalid handle\n                s_MouseHookHandle = 0;\n                //Free up for GC\n                s_MouseDelegate = null;\n                //if failed and exception must be thrown\n                if (result == 0)\n                {\n                    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. \n                    int errorCode = Marshal.GetLastWin32Error();\n                    //Initializes and throws a new instance of the Win32Exception class with the specified error. \n                    throw new Win32Exception(errorCode);\n                }\n            }\n        }\n        \n        #endregion\n\n        //##############################################################################\n        #region Keyboard hook processing\n\n        /// <summary>\n        /// This field is not objectively needed but we need to keep a reference on a delegate which will be \n        /// passed to unmanaged code. To avoid GC to clean it up.\n        /// When passing delegates to unmanaged code, they must be kept alive by the managed application \n        /// until it is guaranteed that they will never be called.\n        /// </summary>\n        private static HookProc s_KeyboardDelegate;\n\n        /// <summary>\n        /// Stores the handle to the Keyboard hook procedure.\n        /// </summary>\n        private static int s_KeyboardHookHandle;\n\n        /// <summary>\n        /// A callback function which will be called every Time a keyboard activity detected.\n        /// </summary>\n        /// <param name=\"nCode\">\n        /// [in] Specifies whether the hook procedure must process the message. \n        /// If nCode is HC_ACTION, the hook procedure must process the message. \n        /// If nCode is less than zero, the hook procedure must pass the message to the \n        /// CallNextHookEx function without further processing and must return the \n        /// value returned by CallNextHookEx.\n        /// </param>\n        /// <param name=\"wParam\">\n        /// [in] Specifies whether the message was sent by the current thread. \n        /// If the message was sent by the current thread, it is nonzero; otherwise, it is zero. \n        /// </param>\n        /// <param name=\"lParam\">\n        /// [in] Pointer to a CWPSTRUCT structure that contains details about the message. \n        /// </param>\n        /// <returns>\n        /// If nCode is less than zero, the hook procedure must return the value returned by CallNextHookEx. \n        /// If nCode is greater than or equal to zero, it is highly recommended that you call CallNextHookEx \n        /// and return the value it returns; otherwise, other applications that have installed WH_CALLWNDPROC \n        /// hooks will not receive hook notifications and may behave incorrectly as a result. If the hook \n        /// procedure does not call CallNextHookEx, the return value should be zero. \n        /// </returns>\n        private static int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)\n        {\n            //indicates if any of underlaing events set e.Handled flag\n            bool handled = false;\n\n            if (nCode >= 0)\n            {\n                //read structure KeyboardHookStruct at lParam\n                KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));\n                //raise KeyDown\n                if (s_KeyDown != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))\n                {\n                    Keys keyData = (Keys)MyKeyboardHookStruct.VirtualKeyCode;\n                    KeyEventArgs e = new KeyEventArgs(keyData);\n                    s_KeyDown.Invoke(null, e);\n                    handled = e.Handled;\n                }\n\n                // raise KeyPress\n                if (s_KeyPress != null && wParam == WM_KEYDOWN)\n                {\n                    bool isDownShift = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? true : false);\n                    bool isDownCapslock = (GetKeyState(VK_CAPITAL) != 0 ? true : false);\n\n                    byte[] keyState = new byte[256];\n                    GetKeyboardState(keyState);\n                    byte[] inBuffer = new byte[2];\n                    if (ToAscii(MyKeyboardHookStruct.VirtualKeyCode,\n                              MyKeyboardHookStruct.ScanCode,\n                              keyState,\n                              inBuffer,\n                              MyKeyboardHookStruct.Flags) == 1)\n                    {\n                        char key = (char)inBuffer[0];\n                        if ((isDownCapslock ^ isDownShift) && Char.IsLetter(key)) key = Char.ToUpper(key);\n                        KeyPressEventArgs e = new KeyPressEventArgs(key);\n                        s_KeyPress.Invoke(null, e);\n                        handled = handled || e.Handled;\n                    }\n                }\n\n                // raise KeyUp\n                if (s_KeyUp != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))\n                {\n                    Keys keyData = (Keys)MyKeyboardHookStruct.VirtualKeyCode;\n                    KeyEventArgs e = new KeyEventArgs(keyData);\n                    s_KeyUp.Invoke(null, e);\n                    handled = handled || e.Handled;\n                }\n\n            }\n\n            //if event handled in application do not handoff to other listeners\n            if (handled)\n                return -1;\n\n            //forward to other application\n            return CallNextHookEx(s_KeyboardHookHandle, nCode, wParam, lParam);\n        }\n\n        private static void EnsureSubscribedToGlobalKeyboardEvents()\n        {\n            // install Keyboard hook only if it is not installed and must be installed\n            if (s_KeyboardHookHandle == 0)\n            {\n                //See comment of this field. To avoid GC to clean it up.\n                s_KeyboardDelegate = KeyboardHookProc;\n                //install hook\n                s_KeyboardHookHandle = SetWindowsHookEx(\n                    WH_KEYBOARD_LL,\n                    s_KeyboardDelegate,\n                    Marshal.GetHINSTANCE(\n                        Assembly.GetExecutingAssembly().GetModules()[0]),\n                    0);\n                //If SetWindowsHookEx fails.\n                if (s_KeyboardHookHandle == 0)\n                {\n                    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. \n                    int errorCode = Marshal.GetLastWin32Error();\n                    //do cleanup\n\n                    //Initializes and throws a new instance of the Win32Exception class with the specified error. \n                    throw new Win32Exception(errorCode);\n                }\n            }\n        }\n\n        private static void TryUnsubscribeFromGlobalKeyboardEvents()\n        {\n            //if no subsribers are registered unsubsribe from hook\n            if (s_KeyDown == null &&\n                s_KeyUp == null &&\n                s_KeyPress == null)\n            {\n                ForceUnsunscribeFromGlobalKeyboardEvents();\n            }\n        }\n\n        private static void ForceUnsunscribeFromGlobalKeyboardEvents()\n        {\n            if (s_KeyboardHookHandle != 0)\n            {\n                //uninstall hook\n                int result = UnhookWindowsHookEx(s_KeyboardHookHandle);\n                //reset invalid handle\n                s_KeyboardHookHandle = 0;\n                //Free up for GC\n                s_KeyboardDelegate = null;\n                //if failed and exception must be thrown\n                if (result == 0)\n                {\n                    //Returns the error code returned by the last unmanaged function called using platform invoke that has the DllImportAttribute.SetLastError flag set. \n                    int errorCode = Marshal.GetLastWin32Error();\n                    //Initializes and throws a new instance of the Win32Exception class with the specified error. \n                    throw new Win32Exception(errorCode);\n                }\n            }\n        }\n\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "Tools/KeyLogger/Gma.UserActivityMonitor/HookManager.Structures.cs",
    "content": "﻿using System.Runtime.InteropServices;\n\nnamespace Gma.UserActivityMonitor {\n\n    public static partial class HookManager {\n        /// <summary>\n        /// The Point structure defines the X- and Y- coordinates of a point. \n        /// </summary>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/rectangl_0tiq.asp\n        /// </remarks>\n        [StructLayout(LayoutKind.Sequential)]\n        private struct Point {\n            /// <summary>\n            /// Specifies the X-coordinate of the point. \n            /// </summary>\n            public int X;\n            /// <summary>\n            /// Specifies the Y-coordinate of the point. \n            /// </summary>\n            public int Y;\n        }\n\n        /// <summary>\n        /// The MSLLHOOKSTRUCT structure contains information about a low-level keyboard input event. \n        /// </summary>\n        [StructLayout(LayoutKind.Sequential)]\n        private struct MouseLLHookStruct {\n            /// <summary>\n            /// Specifies a Point structure that contains the X- and Y-coordinates of the cursor, in screen coordinates. \n            /// </summary>\n            public Point Point;\n            /// <summary>\n            /// If the message is WM_MOUSEWHEEL, the high-order word of this member is the wheel delta. \n            /// The low-order word is reserved. A positive value indicates that the wheel was rotated forward, \n            /// away from the user; a negative value indicates that the wheel was rotated backward, toward the user. \n            /// One wheel click is defined as WHEEL_DELTA, which is 120. \n            ///If the message is WM_XBUTTONDOWN, WM_XBUTTONUP, WM_XBUTTONDBLCLK, WM_NCXBUTTONDOWN, WM_NCXBUTTONUP,\n            /// or WM_NCXBUTTONDBLCLK, the high-order word specifies which X button was pressed or released, \n            /// and the low-order word is reserved. This value can be one or more of the following values. Otherwise, MouseData is not used. \n            ///XBUTTON1\n            ///The first X button was pressed or released.\n            ///XBUTTON2\n            ///The second X button was pressed or released.\n            /// </summary>\n            public int MouseData;\n            /// <summary>\n            /// Specifies the event-injected flag. An application can use the following value to test the mouse Flags. Value Purpose \n            ///LLMHF_INJECTED Test the event-injected flag.  \n            ///0\n            ///Specifies whether the event was injected. The value is 1 if the event was injected; otherwise, it is 0.\n            ///1-15\n            ///Reserved.\n            /// </summary>\n            public int Flags;\n            /// <summary>\n            /// Specifies the Time stamp for this message.\n            /// </summary>\n            public int Time;\n            /// <summary>\n            /// Specifies extra information associated with the message. \n            /// </summary>\n            public int ExtraInfo;\n        }\n\n        /// <summary>\n        /// The KBDLLHOOKSTRUCT structure contains information about a low-level keyboard input event. \n        /// </summary>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookstructures/cwpstruct.asp\n        /// </remarks>\n        [StructLayout(LayoutKind.Sequential)]\n        private struct KeyboardHookStruct\n        {\n            /// <summary>\n            /// Specifies a virtual-key code. The code must be a value in the range 1 to 254. \n            /// </summary>\n            public int VirtualKeyCode;\n            /// <summary>\n            /// Specifies a hardware scan code for the key. \n            /// </summary>\n            public int ScanCode;\n            /// <summary>\n            /// Specifies the extended-key flag, event-injected flag, context code, and transition-state flag.\n            /// </summary>\n            public int Flags;\n            /// <summary>\n            /// Specifies the Time stamp for this message.\n            /// </summary>\n            public int Time;\n            /// <summary>\n            /// Specifies extra information associated with the message. \n            /// </summary>\n            public int ExtraInfo;\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/KeyLogger/Gma.UserActivityMonitor/HookManager.Windows.cs",
    "content": "using System;\nusing System.Runtime.InteropServices;\n\nnamespace Gma.UserActivityMonitor\n{\n    public static partial class HookManager\n    {\n        #region Windows constants\n\n        //values from Winuser.h in Microsoft SDK.\n        /// <summary>\n        /// Windows NT/2000/XP: Installs a hook procedure that monitors low-level mouse input events.\n        /// </summary>\n        private const int WH_MOUSE_LL = 14;\n\n        /// <summary>\n        /// Windows NT/2000/XP: Installs a hook procedure that monitors low-level keyboard  input events.\n        /// </summary>\n        private const int WH_KEYBOARD_LL = 13;\n\n        /// <summary>\n        /// Installs a hook procedure that monitors mouse messages. For more information, see the MouseProc hook procedure. \n        /// </summary>\n        private const int WH_MOUSE = 7;\n\n        /// <summary>\n        /// Installs a hook procedure that monitors keystroke messages. For more information, see the KeyboardProc hook procedure. \n        /// </summary>\n        private const int WH_KEYBOARD = 2;\n\n        /// <summary>\n        /// The WM_MOUSEMOVE message is posted to a window when the cursor moves. \n        /// </summary>\n        private const int WM_MOUSEMOVE = 0x200;\n\n        /// <summary>\n        /// The WM_LBUTTONDOWN message is posted when the user presses the left mouse button \n        /// </summary>\n        private const int WM_LBUTTONDOWN = 0x201;\n\n        /// <summary>\n        /// The WM_RBUTTONDOWN message is posted when the user presses the right mouse button\n        /// </summary>\n        private const int WM_RBUTTONDOWN = 0x204;\n\n        /// <summary>\n        /// The WM_MBUTTONDOWN message is posted when the user presses the middle mouse button \n        /// </summary>\n        private const int WM_MBUTTONDOWN = 0x207;\n\n        /// <summary>\n        /// The WM_LBUTTONUP message is posted when the user releases the left mouse button \n        /// </summary>\n        private const int WM_LBUTTONUP = 0x202;\n\n        /// <summary>\n        /// The WM_RBUTTONUP message is posted when the user releases the right mouse button \n        /// </summary>\n        private const int WM_RBUTTONUP = 0x205;\n\n        /// <summary>\n        /// The WM_MBUTTONUP message is posted when the user releases the middle mouse button \n        /// </summary>\n        private const int WM_MBUTTONUP = 0x208;\n\n        /// <summary>\n        /// The WM_LBUTTONDBLCLK message is posted when the user double-clicks the left mouse button \n        /// </summary>\n        private const int WM_LBUTTONDBLCLK = 0x203;\n\n        /// <summary>\n        /// The WM_RBUTTONDBLCLK message is posted when the user double-clicks the right mouse button \n        /// </summary>\n        private const int WM_RBUTTONDBLCLK = 0x206;\n\n        /// <summary>\n        /// The WM_RBUTTONDOWN message is posted when the user presses the right mouse button \n        /// </summary>\n        private const int WM_MBUTTONDBLCLK = 0x209;\n\n        /// <summary>\n        /// The WM_MOUSEWHEEL message is posted when the user presses the mouse wheel. \n        /// </summary>\n        private const int WM_MOUSEWHEEL = 0x020A;\n\n        /// <summary>\n        /// The WM_KEYDOWN message is posted to the window with the keyboard focus when a nonsystem \n        /// key is pressed. A nonsystem key is a key that is pressed when the ALT key is not pressed.\n        /// </summary>\n        private const int WM_KEYDOWN = 0x100;\n\n        /// <summary>\n        /// The WM_KEYUP message is posted to the window with the keyboard focus when a nonsystem \n        /// key is released. A nonsystem key is a key that is pressed when the ALT key is not pressed, \n        /// or a keyboard key that is pressed when a window has the keyboard focus.\n        /// </summary>\n        private const int WM_KEYUP = 0x101;\n\n        /// <summary>\n        /// The WM_SYSKEYDOWN message is posted to the window with the keyboard focus when the user \n        /// presses the F10 key (which activates the menu bar) or holds down the ALT key and then \n        /// presses another key. It also occurs when no window currently has the keyboard focus; \n        /// in this case, the WM_SYSKEYDOWN message is sent to the active window. The window that \n        /// receives the message can distinguish between these two contexts by checking the context \n        /// code in the lParam parameter. \n        /// </summary>\n        private const int WM_SYSKEYDOWN = 0x104;\n\n        /// <summary>\n        /// The WM_SYSKEYUP message is posted to the window with the keyboard focus when the user \n        /// releases a key that was pressed while the ALT key was held down. It also occurs when no \n        /// window currently has the keyboard focus; in this case, the WM_SYSKEYUP message is sent \n        /// to the active window. The window that receives the message can distinguish between \n        /// these two contexts by checking the context code in the lParam parameter. \n        /// </summary>\n        private const int WM_SYSKEYUP = 0x105;\n\n        private const byte VK_SHIFT = 0x10;\n        private const byte VK_CAPITAL = 0x14;\n        private const byte VK_NUMLOCK = 0x90;\n\n        #endregion\n\n        #region Windows function imports\n\n        /// <summary>\n        /// The CallNextHookEx function passes the hook information to the next hook procedure in the current hook chain. \n        /// A hook procedure can call this function either before or after processing the hook information. \n        /// </summary>\n        /// <param name=\"idHook\">Ignored.</param>\n        /// <param name=\"nCode\">\n        /// [in] Specifies the hook code passed to the current hook procedure. \n        /// The next hook procedure uses this code to determine how to process the hook information.\n        /// </param>\n        /// <param name=\"wParam\">\n        /// [in] Specifies the wParam value passed to the current hook procedure. \n        /// The meaning of this parameter depends on the type of hook associated with the current hook chain. \n        /// </param>\n        /// <param name=\"lParam\">\n        /// [in] Specifies the lParam value passed to the current hook procedure. \n        /// The meaning of this parameter depends on the type of hook associated with the current hook chain. \n        /// </param>\n        /// <returns>\n        /// This value is returned by the next hook procedure in the chain. \n        /// The current hook procedure must also return this value. The meaning of the return value depends on the hook type. \n        /// For more information, see the descriptions of the individual hook procedures.\n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp\n        /// </remarks>\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto,\n            CallingConvention = CallingConvention.StdCall)]\n        private static extern int CallNextHookEx(\n            int idHook,\n            int nCode,\n            int wParam,\n            IntPtr lParam);\n\n\n        /// <summary>\n        /// The SetWindowsHookEx function installs an application-defined hook procedure into a hook chain. \n        /// You would install a hook procedure to monitor the system for certain types of events. These events \n        /// are associated either with a specific thread or with all threads in the same desktop as the calling thread. \n        /// </summary>\n        /// <param name=\"idHook\">\n        /// [in] Specifies the type of hook procedure to be installed. This parameter can be one of the following values.\n        /// </param>\n        /// <param name=\"lpfn\">\n        /// [in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a \n        /// thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link \n        /// library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process.\n        /// </param>\n        /// <param name=\"hMod\">\n        /// [in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. \n        /// The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by \n        /// the current process and if the hook procedure is within the code associated with the current process. \n        /// </param>\n        /// <param name=\"dwThreadId\">\n        /// [in] Specifies the identifier of the thread with which the hook procedure is to be associated. \n        /// If this parameter is zero, the hook procedure is associated with all existing threads running in the \n        /// same desktop as the calling thread. \n        /// </param>\n        /// <returns>\n        /// If the function succeeds, the return value is the handle to the hook procedure.\n        /// If the function fails, the return value is NULL. To get extended error information, call GetLastError.\n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp\n        /// </remarks>\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto,\n            CallingConvention = CallingConvention.StdCall, SetLastError = true)]\n        private static extern int SetWindowsHookEx(\n            int idHook,\n            HookProc lpfn,\n            IntPtr hMod,\n            int dwThreadId);\n\n        /// <summary>\n        /// The UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function. \n        /// </summary>\n        /// <param name=\"idHook\">\n        /// [in] Handle to the hook to be removed. This parameter is a hook handle obtained by a previous call to SetWindowsHookEx. \n        /// </param>\n        /// <returns>\n        /// If the function succeeds, the return value is nonzero.\n        /// If the function fails, the return value is zero. To get extended error information, call GetLastError.\n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp\n        /// </remarks>\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto,\n            CallingConvention = CallingConvention.StdCall, SetLastError = true)]\n        private static extern int UnhookWindowsHookEx(int idHook);\n\n        /// <summary>\n        /// The GetDoubleClickTime function retrieves the current double-click time for the mouse. A double-click is a series of two clicks of the \n        /// mouse button, the second occurring within a specified time after the first. The double-click time is the maximum number of \n        /// milliseconds that may occur between the first and second click of a double-click. \n        /// </summary>\n        /// <returns>\n        /// The return value specifies the current double-click time, in milliseconds. \n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/en-us/library/ms646258(VS.85).aspx\n        /// </remarks>\n        [DllImport(\"user32\")]\n        public static extern int GetDoubleClickTime();\n\n        /// <summary>\n        /// The ToAscii function translates the specified virtual-key code and keyboard \n        /// state to the corresponding character or characters. The function translates the code \n        /// using the input language and physical keyboard layout identified by the keyboard layout handle.\n        /// </summary>\n        /// <param name=\"uVirtKey\">\n        /// [in] Specifies the virtual-key code to be translated. \n        /// </param>\n        /// <param name=\"uScanCode\">\n        /// [in] Specifies the hardware scan code of the key to be translated. \n        /// The high-order bit of this value is set if the key is up (not pressed). \n        /// </param>\n        /// <param name=\"lpbKeyState\">\n        /// [in] Pointer to a 256-byte array that contains the current keyboard state. \n        /// Each element (byte) in the array contains the state of one key. \n        /// If the high-order bit of a byte is set, the key is down (pressed). \n        /// The low bit, if set, indicates that the key is toggled on. In this function, \n        /// only the toggle bit of the CAPS LOCK key is relevant. The toggle state \n        /// of the NUM LOCK and SCROLL LOCK keys is ignored.\n        /// </param>\n        /// <param name=\"lpwTransKey\">\n        /// [out] Pointer to the buffer that receives the translated character or characters. \n        /// </param>\n        /// <param name=\"fuState\">\n        /// [in] Specifies whether a menu is active. This parameter must be 1 if a menu is active, or 0 otherwise. \n        /// </param>\n        /// <returns>\n        /// If the specified key is a dead key, the return value is negative. Otherwise, it is one of the following values. \n        /// Value Meaning \n        /// 0 The specified virtual key has no translation for the current state of the keyboard. \n        /// 1 One character was copied to the buffer. \n        /// 2 Two characters were copied to the buffer. This usually happens when a dead-key character \n        /// (accent or diacritic) stored in the keyboard layout cannot be composed with the specified \n        /// virtual key to form a single character. \n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/toascii.asp\n        /// </remarks>\n        [DllImport(\"user32\")]\n        private static extern int ToAscii(\n            int uVirtKey,\n            int uScanCode,\n            byte[] lpbKeyState,\n            byte[] lpwTransKey,\n            int fuState);\n\n        /// <summary>\n        /// The GetKeyboardState function copies the status of the 256 virtual keys to the \n        /// specified buffer. \n        /// </summary>\n        /// <param name=\"pbKeyState\">\n        /// [in] Pointer to a 256-byte array that contains keyboard key states. \n        /// </param>\n        /// <returns>\n        /// If the function succeeds, the return value is nonzero.\n        /// If the function fails, the return value is zero. To get extended error information, call GetLastError. \n        /// </returns>\n        /// <remarks>\n        /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/toascii.asp\n        /// </remarks>\n        [DllImport(\"user32\")]\n        private static extern int GetKeyboardState(byte[] pbKeyState);\n\n        /// <summary>\n        /// The GetKeyState function retrieves the status of the specified virtual key. The status specifies whether the key is up, down, or toggled \n        /// (on, offalternating each time the key is pressed). \n        /// </summary>\n        /// <param name=\"vKey\">\n        /// [in] Specifies a virtual key. If the desired virtual key is a letter or digit (A through Z, a through z, or 0 through 9), nVirtKey must be set to the ASCII value of that character. For other keys, it must be a virtual-key code. \n        /// </param>\n        /// <returns>\n        /// The return value specifies the status of the specified virtual key, as follows: \n        ///If the high-order bit is 1, the key is down; otherwise, it is up.\n        ///If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, is toggled if it is turned on. The key is off and untoggled if the low-order bit is 0. A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.\n        /// </returns>\n        /// <remarks>http://msdn.microsoft.com/en-us/library/ms646301.aspx</remarks>\n        [DllImport(\"user32.dll\", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]\n        private static extern short GetKeyState(int vKey);\n\n        #endregion\n    }\n}"
  },
  {
    "path": "Tools/KeyLogger/Gma.UserActivityMonitor/HookManager.cs",
    "content": "﻿using System;\nusing System.Windows.Forms;\n\nnamespace Gma.UserActivityMonitor {\n\n    /// <summary>\n    /// This class monitors all mouse activities globally (also outside of the application) \n    /// and provides appropriate events.\n    /// </summary>\n    public static partial class HookManager\n    {\n        //################################################################\n        #region Mouse events\n\n        private static event MouseEventHandler s_MouseMove;\n\n        /// <summary>\n        /// Occurs when the mouse pointer is moved. \n        /// </summary>\n        public static event MouseEventHandler MouseMove\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseMove += value;\n            }\n\n            remove\n            {\n                s_MouseMove -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static event EventHandler<MouseEventExtArgs> s_MouseMoveExt;\n\n        /// <summary>\n        /// Occurs when the mouse pointer is moved. \n        /// </summary>\n        /// <remarks>\n        /// This event provides extended arguments of type <see cref=\"MouseEventArgs\"/> enabling you to \n        /// supress further processing of mouse movement in other applications.\n        /// </remarks>\n        public static event EventHandler<MouseEventExtArgs> MouseMoveExt\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseMoveExt += value;\n            }\n\n            remove\n            {\n\n                s_MouseMoveExt -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static event MouseEventHandler s_MouseClick;\n\n        /// <summary>\n        /// Occurs when a click was performed by the mouse. \n        /// </summary>\n        public static event MouseEventHandler MouseClick\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseClick += value;\n            }\n            remove\n            {\n                s_MouseClick -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static event EventHandler<MouseEventExtArgs> s_MouseClickExt;\n\n        /// <summary>\n        /// Occurs when a click was performed by the mouse. \n        /// </summary>\n        /// <remarks>\n        /// This event provides extended arguments of type <see cref=\"MouseEventArgs\"/> enabling you to \n        /// supress further processing of mouse click in other applications.\n        /// </remarks>\n        public static event EventHandler<MouseEventExtArgs> MouseClickExt\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseClickExt += value;\n            }\n            remove\n            {\n                s_MouseClickExt -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static event MouseEventHandler s_MouseDown;\n\n        /// <summary>\n        /// Occurs when the mouse a mouse button is pressed. \n        /// </summary>\n        public static event MouseEventHandler  MouseDown\n        {\n            add \n            { \n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseDown += value;\n            }\n            remove\n            {\n                s_MouseDown -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static event MouseEventHandler s_MouseUp;\n\n        /// <summary>\n        /// Occurs when a mouse button is released. \n        /// </summary>\n        public static event MouseEventHandler MouseUp\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseUp += value;\n            }\n            remove\n            {\n                s_MouseUp -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        private static event MouseEventHandler s_MouseWheel;\n\n        /// <summary>\n        /// Occurs when the mouse wheel moves. \n        /// </summary>\n        public static event MouseEventHandler MouseWheel\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                s_MouseWheel += value;\n            }\n            remove\n            {\n                s_MouseWheel -= value;\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n\n        private static event MouseEventHandler s_MouseDoubleClick;\n\n        //The double click event will not be provided directly from hook.\n        //To fire the double click event wee need to monitor mouse up event and when it occures \n        //Two times during the time interval which is defined in Windows as a doble click time\n        //we fire this event.\n\n        /// <summary>\n        /// Occurs when a double clicked was performed by the mouse. \n        /// </summary>\n        public static event MouseEventHandler MouseDoubleClick\n        {\n            add\n            {\n                EnsureSubscribedToGlobalMouseEvents();\n                if (s_MouseDoubleClick == null)\n                {\n                    //We create a timer to monitor interval between two clicks\n                    s_DoubleClickTimer = new Timer\n                    {\n                        //This interval will be set to the value we retrive from windows. This is a windows setting from contro planel.\n                        Interval = GetDoubleClickTime(),\n                        //We do not start timer yet. It will be start when the click occures.\n                        Enabled = false\n                    };\n                    //We define the callback function for the timer\n                    s_DoubleClickTimer.Tick += DoubleClickTimeElapsed;\n                    //We start to monitor mouse up event.\n                    MouseUp += OnMouseUp;\n                }\n                s_MouseDoubleClick += value;\n            }\n            remove\n            {\n                if (s_MouseDoubleClick != null)\n                {\n                    s_MouseDoubleClick -= value;\n                    if (s_MouseDoubleClick == null)\n                    {\n                        //Stop monitoring mouse up\n                        MouseUp -= OnMouseUp;\n                        //Dispose the timer\n                        s_DoubleClickTimer.Tick -= DoubleClickTimeElapsed;\n                        s_DoubleClickTimer = null;\n                    }\n                }\n                TryUnsubscribeFromGlobalMouseEvents();\n            }\n        }\n\n        //This field remembers mouse button pressed because in addition to the short interval it must be also the same button.\n        private static MouseButtons s_PrevClickedButton;\n        //The timer to monitor time interval between two clicks.\n        private static Timer s_DoubleClickTimer;\n\n        private static void DoubleClickTimeElapsed(object sender, EventArgs e)\n        {\n            //Timer is alapsed and no second click ocuured\n            s_DoubleClickTimer.Enabled = false;\n            s_PrevClickedButton = MouseButtons.None;\n        }\n\n        /// <summary>\n        /// This method is designed to monitor mouse clicks in order to fire a double click event if interval between \n        /// clicks was short enaugh.\n        /// </summary>\n        /// <param name=\"sender\">Is always null</param>\n        /// <param name=\"e\">Some information about click heppened.</param>\n        private static void OnMouseUp(object sender, MouseEventArgs e)\n        {\n            //This should not heppen\n            if (e.Clicks < 1) { return;}\n            //If the secon click heppened on the same button\n            if (e.Button.Equals(s_PrevClickedButton))\n            {\n                if (s_MouseDoubleClick!=null)\n                {\n                    //Fire double click\n                    s_MouseDoubleClick.Invoke(null, e);\n                }\n                //Stop timer\n                s_DoubleClickTimer.Enabled = false;\n                s_PrevClickedButton = MouseButtons.None;\n            }\n            else\n            {\n                //If it was the firts click start the timer\n                s_DoubleClickTimer.Enabled = true;\n                s_PrevClickedButton = e.Button;\n            }\n        }\n        #endregion\n\n        //################################################################\n        #region Keyboard events\n\n        private static event KeyPressEventHandler s_KeyPress;\n\n        /// <summary>\n        /// Occurs when a key is pressed.\n        /// </summary>\n        /// <remarks>\n        /// Key events occur in the following order: \n        /// <list type=\"number\">\n        /// <item>KeyDown</item>\n        /// <item>KeyPress</item>\n        /// <item>KeyUp</item>\n        /// </list>\n        ///The KeyPress event is not raised by noncharacter keys; however, the noncharacter keys do raise the KeyDown and KeyUp events. \n        ///Use the KeyChar property to sample keystrokes at run time and to consume or modify a subset of common keystrokes. \n        ///To handle keyboard events only in your application and not enable other applications to receive keyboard events, \n        /// set the KeyPressEventArgs.Handled property in your form's KeyPress event-handling method to <b>true</b>. \n        /// </remarks>\n        public static event KeyPressEventHandler KeyPress\n        {\n            add\n            {\n                EnsureSubscribedToGlobalKeyboardEvents();\n                s_KeyPress += value;\n            }\n            remove\n            {\n                s_KeyPress -= value;\n                TryUnsubscribeFromGlobalKeyboardEvents();\n            }\n        }\n\n        private static event KeyEventHandler s_KeyUp;\n\n        /// <summary>\n        /// Occurs when a key is released. \n        /// </summary>\n        public static event KeyEventHandler KeyUp\n        {\n            add\n            {\n                EnsureSubscribedToGlobalKeyboardEvents();\n                s_KeyUp += value;\n            }\n            remove\n            {\n                s_KeyUp -= value;\n                TryUnsubscribeFromGlobalKeyboardEvents();\n            }\n        }\n\n        private static event KeyEventHandler s_KeyDown;\n\n        /// <summary>\n        /// Occurs when a key is preseed. \n        /// </summary>\n        public static event KeyEventHandler KeyDown\n        {\n            add\n            {\n                EnsureSubscribedToGlobalKeyboardEvents();\n                s_KeyDown += value;\n            }\n            remove\n            {\n                s_KeyDown -= value;\n                TryUnsubscribeFromGlobalKeyboardEvents();\n            }\n        }\n\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "Tools/KeyLogger/Gma.UserActivityMonitor/MouseEventExtArgs.cs",
    "content": "﻿using System.Windows.Forms;\n\nnamespace Gma.UserActivityMonitor\n{\n    /// <summary>\n    /// Provides data for the MouseClickExt and MouseMoveExt events. It also provides a property Handled.\n    /// Set this property to <b>true</b> to prevent further processing of the event in other applications.\n    /// </summary>\n    public class MouseEventExtArgs : MouseEventArgs\n    {\n        /// <summary>\n        /// Initializes a new instance of the MouseEventArgs class. \n        /// </summary>\n        /// <param name=\"buttons\">One of the MouseButtons values indicating which mouse button was pressed.</param>\n        /// <param name=\"clicks\">The number of times a mouse button was pressed.</param>\n        /// <param name=\"x\">The x-coordinate of a mouse click, in pixels.</param>\n        /// <param name=\"y\">The y-coordinate of a mouse click, in pixels.</param>\n        /// <param name=\"delta\">A signed count of the number of detents the wheel has rotated.</param>\n        public MouseEventExtArgs(MouseButtons buttons, int clicks, int x, int y, int delta)\n            : base(buttons, clicks, x, y, delta)\n        {}\n\n        /// <summary>\n        /// Initializes a new instance of the MouseEventArgs class. \n        /// </summary>\n        /// <param name=\"e\">An ordinary <see cref=\"MouseEventArgs\"/> argument to be extended.</param>\n        internal MouseEventExtArgs(MouseEventArgs e) : base(e.Button, e.Clicks, e.X, e.Y, e.Delta)\n        {}\n\n        private bool m_Handled;\n\n        /// <summary>\n        /// Set this property to <b>true</b> inside your event handler to prevent further processing of the event in other applications.\n        /// </summary>\n        public bool Handled\n        {\n            get { return m_Handled; }\n            set { m_Handled = value; }\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/KeyLogger/KeyLogger/App.xaml",
    "content": "﻿<Application x:Class=\"KeyLogger.App\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    StartupUri=\"Window1.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Tools/KeyLogger/KeyLogger/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Windows;\n\nnamespace KeyLogger\n{\n    /// <summary>\n    /// App.xaml の相互作用ロジック\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Tools/KeyLogger/KeyLogger/KeyLogger.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>9.0.30729</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{EC788AB9-5BB2-4628-B4A5-66540790588E}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>KeyLogger</RootNamespace>\n    <AssemblyName>KeyLogger</AssemblyName>\n    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <WarningLevel>4</WarningLevel>\n    <FileUpgradeFlags>\n    </FileUpgradeFlags>\n    <UpgradeBackupLocation>\n    </UpgradeBackupLocation>\n    <OldToolsVersion>3.5</OldToolsVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\n    <DebugSymbols>true</DebugSymbols>\n    <OutputPath>bin\\x86\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <DebugType>full</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <ErrorReport>prompt</ErrorReport>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\n    <OutputPath>bin\\x86\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <Optimize>true</Optimize>\n    <DebugType>pdbonly</DebugType>\n    <PlatformTarget>x86</PlatformTarget>\n    <CodeAnalysisUseTypeNameInSuppression>true</CodeAnalysisUseTypeNameInSuppression>\n    <CodeAnalysisModuleSuppressionsFile>GlobalSuppressions.cs</CodeAnalysisModuleSuppressionsFile>\n    <ErrorReport>prompt</ErrorReport>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\">\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"System.Windows.Forms\" />\n    <Reference Include=\"System.Xml.Linq\">\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"System.Data.DataSetExtensions\">\n      <RequiredTargetFramework>3.5</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Page Include=\"Window1.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Window1.xaml.cs\">\n      <DependentUpon>Window1.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"NativeWin32.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <AppDesigner Include=\"Properties\\\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Gma.UserActivityMonitor\\Gma.UserActivityMonitor.csproj\">\n      <Project>{F52AA97E-180A-40ED-8F2B-09080171D6C7}</Project>\n      <Name>Gma.UserActivityMonitor</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "Tools/KeyLogger/KeyLogger/NativeWin32.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Runtime.InteropServices;\n\nnamespace KeyLogger\n{\n    public class Win32\n    {\n        /// <summary>\n        /// SendInput Win32APIをラップしたメソッド\n        /// </summary>\n        /// <param name=\"inputs\"></param>\n        public static void SendInput(INPUT[] inputs)\n        {\n            for (Int32 i = 0; i < inputs.Length; i++)\n            {\n                INPUT input = inputs[i];\n                if (input.type == type.INPUT_KEYBOARD)\n                {\n                    //キーボードの時は変換が必要らしい\n                    //input.ki.wScan = (Int16)input.ki.wVk;//(Int16)(MapVirtualKey((Int32)input.ki.wVk, 0));\n                    input.ki.dwExtraInfo = GetMessageExtraInfo();\n                    input.ki.dwFlags = ExtendedKeyFlagW(input.ki.wVk) | input.ki.dwFlags;\n                }\n            }\n            SendInput(inputs.Length, inputs, Marshal.SizeOf(inputs[0]));\n        }\n\n        public static void SendInput(INPUT input)\n        {\n            input.ki.dwExtraInfo = GetMessageExtraInfo();\n            input.ki.dwFlags = ExtendedKeyFlagW(input.ki.wVk) | input.ki.dwFlags;\n            SendInput(1, ref input, Marshal.SizeOf(input));\n        }\n\n        private static dwFlags ExtendedKeyFlagW(wVk key)\n        {\n            dwFlags flag = 0;\n            if (key == wVk.VK_CONTROL)\n            {//とりあえずControlだけ\n                flag = dwFlags.KEYEVENTF_EXTENDEDKEY;\n            }\n            return flag;\n        }\n        //SendInput Function\n        //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/sendinput.asp\n        [DllImport(\"user32.dll\")]\n        private extern static Int32 SendInput(Int32 nInputs, INPUT[] pInputs, Int32 cbSize);\n\n        [DllImport(\"user32.dll\")]\n        public static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);\n\n        //GetMessageExtraInfo Function\n        //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/getmessageextrainfo.asp\n        [DllImport(\"user32.dll\")]\n        private extern static IntPtr GetMessageExtraInfo();\n\n        //MapVirtualKey Function\n        //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputfunctions/mapvirtualkey.asp\n        [DllImport(\"user32.dll\")]\n        private extern static Int32 MapVirtualKey(Int32 uCode, Int32 uMapType);\n\n        [DllImport(\"user32.dll\")]\n        public extern static IntPtr GetForegroundWindow();\n\n        [DllImport(\"user32.dll\")]\n        public extern static int SetForegroundWindow(IntPtr hWnd);\n\n        [DllImport(\"user32.dll\")]\n        public extern static int GetWindowThreadProcessId(IntPtr hWnd, ref int lpdwProcessId);\n\n        [DllImport(\"user32.dll\")]\n        public extern static bool AttachThreadInput(int idAttach, int idAttachTo, bool fAttach);\n    }\n\n    //for KEYBDINPUT /MOUSEINPUT Structure\n    public enum dwFlags\n    {\n        KEYEVENTF_KEYDOWN = 0,\n        KEYEVENTF_EXTENDEDKEY = 0x1,\n        KEYEVENTF_KEYUP = 0x2,\n        KEYEVENTF_SCANCODE = 0x8,\n        KEYEVENTF_UNICODE = 0x4,\n\n        MOUSEEVENTF_MOVED = 0x0001,\n        MOUSEEVENTF_LEFTDOWN = 0x0002,  // 左ボタン Down\n        MOUSEEVENTF_LEFTUP = 0x0004,  // 左ボタン Up\n        MOUSEEVENTF_RIGHTDOWN = 0x0008,  // 右ボタン Down\n        MOUSEEVENTF_RIGHTUP = 0x0010,  // 右ボタン Up\n        MOUSEEVENTF_MIDDLEDOWN = 0x0020,  // 中ボタン Down\n        MOUSEEVENTF_MIDDLEUP = 0x0040,  // 中ボタン Up\n        MOUSEEVENTF_WHEEL = 0x0080,\n        MOUSEEVENTF_XDOWN = 0x0100,\n        MOUSEEVENTF_XUP = 0x0200,\n        MOUSEEVENTF_ABSOLUTE = 0x8000\n\n    }\n\n    //for INPUT Structure\n    public enum type\n    {\n        INPUT_MOUSE = 0,\n        INPUT_KEYBOARD = 1,\n        INPUT_HARDWARE = 2\n    }\n\n    //INPUT struct\n    //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputstructs/input.asp\n    [StructLayout(LayoutKind.Explicit)]\n    public struct INPUT\n    {\n        [FieldOffset(0)]\n        public type type;\n        [FieldOffset(4)]\n        public MOUSEINPUT mi;\n        [FieldOffset(4)]\n        public KEYBDINPUT ki;\n        [FieldOffset(4)]\n        public HARDWAREINPUT hi;\n    }\n\n    //MOUSEINPUT struct\n    //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputstructs/mouseinput.asp\n    [StructLayout(LayoutKind.Explicit)]\n    public struct MOUSEINPUT\n    {\n        [FieldOffset(0)]\n        public Int32 dx;\n        [FieldOffset(4)]\n        public Int32 dy;\n        [FieldOffset(8)]\n        public Int32 mouseData;\n        [FieldOffset(12)]\n        public dwFlags dwFlags;\n        [FieldOffset(16)]\n        public Int32 time;\n        [FieldOffset(20)]\n        public IntPtr dwExtraInfo;\n    }\n\n    //KEYBDINPUT struct\n    //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputstructs/keybdinput.asp\n    [StructLayout(LayoutKind.Explicit)]\n    public struct KEYBDINPUT\n    {\n        [FieldOffset(0)]\n        public wVk wVk;\n        [FieldOffset(2)]\n        public Int16 wScan;\n        [FieldOffset(4)]\n        public dwFlags dwFlags;\n        [FieldOffset(8)]\n        public Int32 time;\n        [FieldOffset(12)]\n        public IntPtr dwExtraInfo;\n    }\n\n    //HARDWAREINPUT struct\n    //http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/keyboardinput/keyboardinputreference/keyboardinputstructs/hardwareinput.asp\n    [StructLayout(LayoutKind.Explicit)]\n    public struct HARDWAREINPUT\n    {\n        [FieldOffset(0)]\n        public Int32 uMsg;\n        [FieldOffset(4)]\n        public Int16 wParamL;\n        [FieldOffset(6)]\n        public Int16 wParamH;\n    }\n\n    public enum wVk : short\n    {\n        VK_CANCEL = 0x3, //BREAK(Control+Pause) key(ExtendedKey)\n        VK_BACK = 0x8, //BACKSPACE key\n        VK_TAB = 0x9, //TAB key\n        VK_CLEAR = 0xC,\n        VK_RETURN = 0xD, //ENTER key\n        VK_SHIFT = 0x10, //SHIFT key\n        VK_CONTROL = 0x11, //CTRL key\n        VK_MENU = 0x12, //ALT key\n        VK_PAUSE = 0x13, //PAUSE key\n        VK_CAPITAL = 0x14, //CAPS LOCK key\n        VK_KANA = 0x15, //IME かな mode\n        VK_JUNJA = 0x17,\n        VK_FINAL = 0x18,\n        VK_KANJI = 0x19, //IME 漢字 mode\n        VK_ESCAPE = 0x1B, //ESC key\n        VK_CONVERT = 0x1C, //IME 変換 key\n        VK_NONCONVERT = 0x1D, //IME 無変換 key\n        VK_ACCEPT = 0x1E,\n        VK_MODECHANGE = 0x1F,\n        VK_SPACE = 0x20,//SPACEBAR\n        VK_PRIOR = 0x21, //PAGE UP key(ExtendedKey)\n        VK_NEXT = 0x22, //PAGE DOWN key(ExtendedKey)\n        VK_END = 0x23,//END key(ExtendedKey)\n        VK_HOME = 0x24, //HOME key(ExtendedKey)\n        VK_LEFT = 0x25, //← key(ExtendedKey)\n        VK_UP = 0x26, //↑ key(ExtendedKey)\n        VK_RIGHT = 0x27, //→ key(ExtendedKey)\n        VK_DOWN = 0x28, //↓ key(ExtendedKey)\n        VK_SELECT = 0x29,\n        VK_PRINT = 0x2A,\n        VK_EXECUTE = 0x2B,\n        VK_SNAPSHOT = 0x2C, //PRINT SCREEN key(ExtendedKey)\n        VK_INSERT = 0x2D, //INS key(ExtendedKey)\n        VK_DELETE = 0x2E, //DEL key(ExtendedKey)\n        VK_HELP = 0x2F,\n        VK_0 = 0x30,//0 key\n        VK_1 = 0x31, //1 key\n        VK_2 = 0x32, //2 key\n        VK_3 = 0x33, //3 key\n        VK_4 = 0x34, //4 key\n        VK_5 = 0x35, //5 key\n        VK_6 = 0x36, //6 key\n        VK_7 = 0x37, //7 key\n        VK_8 = 0x38, //8 key\n        VK_9 = 0x39, //9 key\n        VK_A = 0x41, //A key\n        VK_B = 0x42, //B key\n        VK_C = 0x43, //C key\n        VK_D = 0x44, //D key\n        VK_E = 0x45, //E key\n        VK_F = 0x46, //F key\n        VK_G = 0x47, //G key\n        VK_H = 0x48, //H key\n        VK_I = 0x49, //I key\n        VK_J = 0x4A, //J key\n        VK_K = 0x4B, //K key\n        VK_L = 0x4C, //L key\n        VK_M = 0x4D, //M key\n        VK_N = 0x4E, //N key\n        VK_O = 0x4F, //O key\n        VK_P = 0x50, //P key\n        VK_Q = 0x51, //Q key\n        VK_R = 0x52, //R key\n        VK_S = 0x53, //S key\n        VK_T = 0x54, //T key\n        VK_U = 0x55, //U key\n        VK_V = 0x56, //V key\n        VK_W = 0x57, //W key\n        VK_X = 0x58, //X key\n        VK_Y = 0x59, //Y key\n        VK_Z = 0x5A, //Z key\n        VK_LWIN = 0x5B, //Left Windows key\n        VK_RWIN = 0x5C, //Right Windows key\n        VK_APPS = 0x5D, // Applications key\n        VK_NUMPAD0 = 0x60, //Numeric keypad 0 key\n        VK_NUMPAD1 = 0x61, //Numeric keypad 1 key\n        VK_NUMPAD2 = 0x62, //Numeric keypad 2 key\n        VK_NUMPAD3 = 0x63, //Numeric keypad 3 key\n        VK_NUMPAD4 = 0x64, //Numeric keypad 4 key\n        VK_NUMPAD5 = 0x65, //Numeric keypad 5 key\n        VK_NUMPAD6 = 0x66, //Numeric keypad 6 key\n        VK_NUMPAD7 = 0x67, //Numeric keypad 7 key\n        VK_NUMPAD8 = 0x68, //Numeric keypad 8 key\n        VK_NUMPAD9 = 0x69, //Numeric keypad 9 key\n        VK_MULTIPLY = 0x6A, //* key\n        VK_ADD = 0x6B, //+ key\n        VK_SEPERATOR = 0x6C, //\n        VK_SUBTRACT = 0x6D, //- key\n        VK_DECIMAL = 0x6E, //テンキーの . key\n        VK_DEVIDE = 0x6F, /// key(ExtendedKey)\n        VK_F1 = 0x70, //F1 key\n        VK_F2 = 0x71, //F2 key\n        VK_F3 = 0x72, //F3 key\n        VK_F4 = 0x73, //F4 key\n        VK_F5 = 0x74,//F5 key\n        VK_F6 = 0x75, //F6 key\n        VK_F7 = 0x76, //F7 key\n        VK_F8 = 0x77, //F8 key\n        VK_F9 = 0x78, //F9 key\n        VK_F10 = 0x79, //F10 key\n        VK_F11 = 0x7A, //F11 key\n        VK_F12 = 0x7B, //F12 key\n        VK_F13 = 0x7C, //F13 key\n        VK_F14 = 0x7D, //F14 key\n        VK_F15 = 0x7E, //F15 key\n        VK_F16 = 0x7F, //F16 key\n        VK_F17 = 0x80, //F17 key\n        VK_F18 = 0x81, //F18 key\n        VK_F19 = 0x82, //F19 key\n        VK_F20 = 0x83, //F20 key\n        VK_F21 = 0x84, //F21 key\n        VK_F22 = 0x85, //F22 key\n        VK_F23 = 0x86, //F23 key\n        VK_F24 = 0x87, //F24 key\n        VK_NUMLOCK = 0x90, //NUM LOCK key(ExtendedKey)\n        VK_SCROLL = 0x91, //SCROLL LOCK key\n        VK_LSHIFT = 0xA0, //Left SHIFT key\n        VK_RSHIFT = 0xA1, // Right SHIFT key(ExtendedKey)\n        VK_LCONTROL = 0xA2, //Left CONTROL key\n        VK_RCONTROL = 0xA3, //Right CONTROL key(ExtendedKey)\n        VK_LMENU = 0xA4, //Left MENU key\n        VK_RMENU = 0xA5, //Right MENU key(ExtendedKey)\n        VK_BROWSER_BACK = 0xA6, //Browser Back key\n        VK_BROWSER_FORWARD = 0xA7, //Browser Forward key\n        VK_BROWSER_REFRESH = 0xA8, //Browser Refresh key\n        VK_BROWSER_STOP = 0xA9, //Browser Stop key\n        VK_BROWSER_SEARCH = 0xAA, //Browser Search key\n        VK_BROWSER_FAVORITES = 0xAB, //Browser Favorites key\n        VK_BROWSER_HOME = 0xA6, //Browser Start and Home key\n        VK_VOLUME_MUTE = 0xAD, //Volume Mute key\n        VK_VOLUME_DOWN = 0xAE, //Volume Down key\n        VK_VOLUME_UP = 0xAF, //Volume Up key\n        VK_MEDIA_NEXT_TRACK = 0xB0, //Next Track key\n        VK_MEDIA_PREV_TRACK = 0xB1, //Previous Track key\n        VK_MEDIA_STOP = 0xB2, //Stop Media key\n        VK_MEDIA_PLAY_PAUSE = 0xB3, //Play/Pause Media key\n        VK_LAUNCH_MAIL = 0xB4, //Start Mail key\n        VK_LAUNCH_MEDIA_SELECT = 0xB5, //Select Media Key\n        VK_LAUNCH_APP1 = 0xB6, //Start Application 1 key\n        VK_LAUNCH_APP2 = 0xB7, //Start Application 2 key\n        VK_OEM_1 = 0xBA, //: *  key\n        VK_OEM_PLUS = 0xBB, //; + key\n        VK_OEM_COMMA = 0xBC, //, < key\n        VK_OEM_MINUS = 0xBD, //- = key\n        VK_OEM_PERIOD = 0xBE, //. > key\n        VK_OEM_2 = 0xBF, /// ? key\n        VK_OEM_3 = 0xC0, //@ ` key\n        VK_OEM_4 = 0xDB, //[ { key\n        VK_OEM_5 = 0xDC, //\\ | key\n        VK_OEM_6 = 0xDD, //] } key\n        VK_OEM_7 = 0xDE, //^ ~ key\n        VK_OEM_8 = 0xDF,\n        VK_PROCESSKEY = 0xE5,\n        VK_OEM_ATTN = 0xF0, //英数\n        VK_OEM_102 = 0xE2, //\\ _ key\n        VK_OEM_COPY = 0xF2, //カタカナひらがな\n        VK_OEM_AUTO = 0xF3, //全角/半角\n        VK_OEM_ENLW = 0xF4,//全角/半角\n        VK_OEM_BACKTAB = 0xF5, //ローマ字\n        VK_PACKET = 0xE7,\n        VK_ATTN = 0xF6,\n        VK_CRSEL = 0xF7,\n        VK_EXSEL = 0xF8,\n        VK_EREOF = 0xF9,\n        VK_PLAY = 0xFA,\n        VK_ZOOM = 0xFB,\n        VK_NONAME = 0xFC,\n        VK_PA1 = 0xFD,\n        VK_OEM_CLEAR = 0xFE\n    }\n}\n"
  },
  {
    "path": "Tools/KeyLogger/KeyLogger/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// アセンブリに関する一般情報は以下の属性セットをとおして制御されます。\n// アセンブリに関連付けられている情報を変更するには、\n// これらの属性値を変更してください。\n[assembly: AssemblyTitle(\"KeyLogger\")]\n[assembly: AssemblyDescription(\"キーボードからの入力を記録・再生\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"++C++;\")]\n[assembly: AssemblyProduct(\"KeyLogger\")]\n[assembly: AssemblyCopyright(\"Copyright © ++C++; 2009\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// ComVisible を false に設定すると、その型はこのアセンブリ内で COM コンポーネントから\n// 参照不可能になります。COM からこのアセンブリ内の型にアクセスする場合は、\n// その型の ComVisible 属性を true に設定してください。\n[assembly: ComVisible(false)]\n\n//ローカライズ可能なアプリケーションのビルドを開始するには、\n//.csproj ファイルの <UICulture>CultureYouAreCodingWith</UICulture> を\n//<PropertyGroup> 内部で設定します。たとえば、\n//ソース ファイルで英語を使用している場合、<UICulture> を en-US に設定します。次に、\n//下の NeutralResourceLanguage 属性のコメントを解除します。下の行の \"en-US\" を\n//プロジェクト ファイルの UICulture 設定と一致するよう更新します。\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //テーマ固有のリソース ディクショナリが置かれている場所\n    //(リソースがページ、\n    //またはアプリケーション リソース ディクショナリに見つからない場合に使用されます)\n    ResourceDictionaryLocation.SourceAssembly //汎用リソース ディクショナリが置かれている場所\n    //(リソースがページ、\n    //アプリケーション、またはいずれのテーマ固有のリソース ディクショナリにも見つからない場合に使用されます)\n)]\n\n\n// アセンブリのバージョン情報は、以下の 4 つの値で構成されています:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \n// 既定値にすることができます:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "Tools/KeyLogger/KeyLogger/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     このコードはツールによって生成されました。\n//     ランタイム バージョン:4.0.30319.42000\n//\n//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、\n//     コードが再生成されるときに損失したりします。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace KeyLogger.Properties {\n    using System;\n    \n    \n    /// <summary>\n    ///   ローカライズされた文字列などを検索するための、厳密に型指定されたリソース クラスです。\n    /// </summary>\n    // このクラスは StronglyTypedResourceBuilder クラスが ResGen\n    // または Visual Studio のようなツールを使用して自動生成されました。\n    // メンバーを追加または削除するには、.ResX ファイルを編集して、/str オプションと共に\n    // ResGen を実行し直すか、または VS プロジェクトをビルドし直します。\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   このクラスで使用されているキャッシュされた ResourceManager インスタンスを返します。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"KeyLogger.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   厳密に型指定されたこのリソース クラスを使用して、すべての検索リソースに対し、\n        ///   現在のスレッドの CurrentUICulture プロパティをオーバーライドします。\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/KeyLogger/KeyLogger/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "Tools/KeyLogger/KeyLogger/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     このコードはツールによって生成されました。\n//     ランタイム バージョン:4.0.30319.42000\n//\n//     このファイルへの変更は、以下の状況下で不正な動作の原因になったり、\n//     コードが再生成されるときに損失したりします。\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace KeyLogger.Properties {\n    \n    \n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"14.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n        \n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n        \n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/KeyLogger/KeyLogger/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "Tools/KeyLogger/KeyLogger/Window1.xaml",
    "content": "﻿<Window x:Class=\"KeyLogger.Window1\"\n    xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n    Title=\"Key Logger\" Height=\"300\" Width=\"300\">\n    <Grid>\n        <Grid.RowDefinitions>\n            <RowDefinition Height=\"*\" />\n            <RowDefinition Height=\"30\" />\n            <RowDefinition Height=\"30\" />\n            <!--<RowDefinition Height=\"30\" />-->\n        </Grid.RowDefinitions>\n        <ListBox Name=\"listHistory\"/>\n        <StackPanel Orientation=\"Horizontal\" Grid.Row=\"1\">\n            <Button Name=\"buttonRecord\">記録開始（右Ctrl）</Button>\n            <Button Name=\"buttonReplay\" ToolTip=\"F12 キーでも再生できるよ\" >再生（右Alt）</Button>\n            <TextBlock Text=\" リピート回数\" />\n            <TextBox Name=\"textRepeat\" Width=\"50\" />\n        </StackPanel>\n        <StackPanel Orientation=\"Horizontal\" Grid.Row=\"2\">\n            <CheckBox Name=\"checkShowLog\" VerticalAlignment=\"Center\">ログの表示</CheckBox>\n            <Button Name=\"buttonSave\" ToolTip=\"記録をファイルに書き出します\" >Save</Button>\n            <Button Name=\"buttonLoad\" ToolTip=\"記録をファイルから読み込みます\">Load</Button>\n            <Button Name=\"buttonClear\" ToolTip=\"記録をクリアします\" >Clear</Button>\n            <Button Name=\"buttonReduce\" ToolTip=\"余計な KeyDown イベントを削除します\">Reduce</Button>\n            <!--<Label Name=\"labelDebug\"></Label>-->\n        </StackPanel>\n        <!--<TextBox Name=\"textResult\" Grid.Row=\"3\"></TextBox>-->\n    </Grid>\n</Window>\n"
  },
  {
    "path": "Tools/KeyLogger/KeyLogger/Window1.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Windows;\nusing System.Windows.Controls;\nusing System.Windows.Data;\nusing System.Windows.Documents;\nusing System.Windows.Input;\nusing System.Windows.Media;\nusing System.Windows.Media.Imaging;\nusing System.Windows.Navigation;\nusing System.Windows.Shapes;\nusing System.Diagnostics;\nusing System.Xml.Serialization;\nusing System.IO;\nusing System.Threading;\n\nusing Key = System.Windows.Forms.Keys;\nusing System.Runtime.InteropServices;\nusing System.Windows.Interop;\n\nnamespace KeyLogger\n{\n    public enum EventType\n    {\n        KeyDown,\n        KeyUp,\n        MouseDown,\n        MouseUp,\n    }\n\n    [Serializable]\n    public struct KeyEvent\n    {\n        public EventType Type;\n        public int Code;\n        public int X;\n        public int Y;\n        public long Elapsed;\n    }\n\n    public static class KeyEventExtensions\n    {\n        public static string ToHistoryString(this KeyEvent x)\n        {\n            switch (x.Type)\n            {\n                case EventType.KeyDown:\n                    return $\"KeyDown, {(Key)x.Code}, {x.Elapsed}\";\n                case EventType.KeyUp:\n                    return $\"KeyUp  , {(Key)x.Code}, {x.Elapsed}\";\n                case EventType.MouseDown:\n                    return $\"MouseDown, {(System.Windows.Forms.MouseButtons)x.Code}, ({x.X}, {x.Y}), {x.Elapsed}\";\n                case EventType.MouseUp:\n                    return $\"MouseUp  , {(System.Windows.Forms.MouseButtons)x.Code}, ({x.X}, {x.Y}), {x.Elapsed}\";\n                default:\n                    return \"\";\n            }\n        }\n\n        public static INPUT ToInput(this KeyEvent x)\n        {\n            switch (x.Type)\n            {\n                default:\n                case EventType.KeyDown:\n                case EventType.KeyUp:\n                    return new INPUT\n                    {\n                        type = type.INPUT_KEYBOARD,\n                        ki = new KEYBDINPUT\n                        {\n                            time = (int)x.Elapsed,\n                            wVk = (wVk)x.Code,\n                            dwFlags = x.Type == EventType.KeyDown ? dwFlags.KEYEVENTF_KEYDOWN : dwFlags.KEYEVENTF_KEYUP,\n                        },\n                    };\n                case EventType.MouseDown:\n                case EventType.MouseUp:\n                    dwFlags f = 0;\n\n                    switch ((System.Windows.Forms.MouseButtons)x.Code)\n                    {\n                        case System.Windows.Forms.MouseButtons.Left:\n                            f = x.Type == EventType.MouseDown ? dwFlags.MOUSEEVENTF_LEFTDOWN : dwFlags.MOUSEEVENTF_LEFTUP;\n                            break;\n                        case System.Windows.Forms.MouseButtons.Right:\n                            f = x.Type == EventType.MouseDown ? dwFlags.MOUSEEVENTF_RIGHTDOWN : dwFlags.MOUSEEVENTF_RIGHTUP;\n                            break;\n                        case System.Windows.Forms.MouseButtons.Middle:\n                            f = x.Type == EventType.MouseDown ? dwFlags.MOUSEEVENTF_MIDDLEDOWN : dwFlags.MOUSEEVENTF_MIDDLEUP;\n                            break;\n                        default:\n                            break;\n                    }\n\n                    return new INPUT\n                    {\n                        type = type.INPUT_MOUSE,\n                        mi = new MOUSEINPUT\n                        {\n                            time = (int)x.Elapsed,\n                            dx = x.X,\n                            dy = x.Y,\n                            dwFlags = f,\n                        },\n                    };\n            }\n        }\n    }\n\n    /// <summary>\n    /// Window1.xaml の相互作用ロジック\n    /// </summary>\n    public partial class Window1 : Window\n    {\n        public Window1()\n        {\n            InitializeComponent();\n\n            Gma.UserActivityMonitor.HookManager.KeyDown += new System.Windows.Forms.KeyEventHandler(HookManager_KeyDown);\n            //Gma.UserActivityMonitor.HookManager.KeyPress += new System.Windows.Forms.KeyPressEventHandler(HookManager_KeyPress);\n            Gma.UserActivityMonitor.HookManager.KeyUp += new System.Windows.Forms.KeyEventHandler(HookManager_KeyUp);\n            Gma.UserActivityMonitor.HookManager.MouseDown += HookManager_MouseDown;\n            Gma.UserActivityMonitor.HookManager.MouseUp += HookManager_MouseUp; ;\n\n            this.buttonRecord.Click += new RoutedEventHandler(buttonRecord_Click);\n            this.buttonClear.Click += new RoutedEventHandler(buttonClear_Click);\n            this.buttonReduce.Click += new RoutedEventHandler(buttonReduce_Click);\n            this.buttonSave.Click += new RoutedEventHandler(buttonSave_Click);\n            this.buttonLoad.Click += new RoutedEventHandler(buttonLoad_Click);\n            this.buttonReplay.Click += new RoutedEventHandler(buttonReplay_Click);\n        }\n\n        void buttonReduce_Click(object sender, RoutedEventArgs e)\n        {\n            var reduced = new List<KeyEvent>();\n\n            KeyEvent prev = new KeyEvent { Type = (EventType)(-1) };\n            foreach (var k in keys)\n            {\n                if (prev.Type == k.Type\n                    && k.Type == EventType.KeyDown\n                    && prev.Code == k.Code)\n                {\n                    prev = k;\n                    continue;\n                }\n\n                reduced.Add(k);\n                prev = k;\n            }\n\n            this.keys = reduced;\n\n            this.ShowHistory();\n        }\n\n        #region 再生\n\n        Thread replay = null;\n        bool isReplayAlive;\n\n        void Dispatch(Action a)\n        {\n            this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, a);\n        }\n\n        void ReplayThread()\n        {\n            var inputs =\n                from x in this.keys\n                select x.ToInput();\n\n            Stopwatch sw = new Stopwatch();\n\n            sw.Start();\n\n            foreach (var input in inputs)\n            {\n                while (input.ki.time > sw.ElapsedMilliseconds)\n                {\n                    Thread.Sleep(1);\n                    //this.Dispatch(() => { this.labelDebug.Content = string.Format(\"{0} : {1}\", input.ki.time, sw.ElapsedMilliseconds); });\n                }\n\n                Win32.SendInput(input);\n\n                if (!this.isReplayAlive)\n                    break;\n            }\n\n            sw.Stop();\n\n            this.Dispatch(() =>\n            {\n                this.buttonReplay.IsEnabled = true;\n                this.replay = null;\n                this.isReplayAlive = false;\n            });\n        }\n\n        void Replay()\n        {\n            if (this.isReplayAlive)\n            {\n                this.isReplayAlive = false;\n                return;\n            }\n\n            this.isReplayAlive = true;\n            this.replay = new Thread(this.ReplayThread)\n            {\n                Priority = ThreadPriority.AboveNormal,\n            };\n\n            this.buttonReplay.IsEnabled = false;\n            this.replay.Start();\n        }\n\n        void buttonReplay_Click(object sender, RoutedEventArgs e)\n        {\n            //Keyboard.Focus(this.textResult);\n            int repeat;\n            if (!int.TryParse(textRepeat.Text, out repeat)) repeat = 1;\n\n            for (int i = 0; i < repeat; i++)\n            {\n                this.Replay();\n            }\n        }\n\n        #endregion\n        #region シリアライズ\n\n        XmlSerializer serializer = null;\n        XmlSerializer Serializer\n        {\n            get\n            {\n                if (this.serializer == null)\n                {\n                    this.serializer = new XmlSerializer(typeof(List<KeyEvent>));\n                }\n                return this.serializer;\n            }\n        }\n\n        void Serialize(Stream stream)\n        {\n            this.Serializer.Serialize(stream, this.keys);\n        }\n\n        void Deserialize(Stream stream)\n        {\n            this.keys = (List<KeyEvent>)this.Serializer.Deserialize(stream);\n\n            this.ShowHistory();\n        }\n\n        void Serialize()\n        {\n            var dlg = new Microsoft.Win32.OpenFileDialog\n            {\n                Multiselect = false,\n                Filter = \"XML|*.xml\",\n                AddExtension = true,\n                CheckFileExists = false,\n            };\n\n            if (dlg.ShowDialog() ?? false)\n            {\n                using (var stream = File.Open(dlg.FileName, FileMode.Create))\n                {\n                    this.Serialize(stream);\n                }\n            }\n        }\n\n        void Deserialize()\n        {\n            var dlg = new Microsoft.Win32.OpenFileDialog\n            {\n                Multiselect = false,\n                Filter = \"XML|*.xml\",\n                AddExtension = true,\n                CheckFileExists = true,\n            };\n\n            if (dlg.ShowDialog() ?? false)\n            {\n                using (var stream = File.OpenRead(dlg.FileName))\n                {\n                    this.Deserialize(stream);\n                }\n            }\n        }\n\n        void buttonLoad_Click(object sender, RoutedEventArgs e)\n        {\n            this.Deserialize();\n        }\n\n        void buttonSave_Click(object sender, RoutedEventArgs e)\n        {\n            this.Serialize();\n        }\n\n        void buttonClear_Click(object sender, RoutedEventArgs e)\n        {\n            this.keys.Clear();\n            this.ShowHistory();\n        }\n\n        #endregion\n        #region 記録開始/停止\n\n        bool isRecording = false;\n        Stopwatch stopwatch = new Stopwatch();\n        List<KeyEvent> keys = new List<KeyEvent>();\n\n        void SwitchRecording()\n        {\n            if (this.isRecording)\n            {\n                this.isRecording = false;\n                this.buttonRecord.Content = \"記録開始（右Ctrl）\";\n            }\n            else\n            {\n                this.isRecording = true;\n                this.stopwatch.Reset();\n                this.stopwatch.Start();\n                this.buttonRecord.Content = \"記録停止（右Ctrl）\";\n            }\n        }\n\n        void buttonRecord_Click(object sender, RoutedEventArgs e)\n        {\n            this.SwitchRecording();\n        }\n\n        #endregion\n        #region ログの表示\n\n        void ShowHistory()\n        {\n            this.listHistory.ItemsSource = keys.Select(x => x.ToHistoryString());\n        }\n\n        #endregion\n        #region フック\n\n        void HookManager_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)\n        {\n            if (e.KeyCode == System.Windows.Forms.Keys.RControlKey\n                || e.KeyCode == System.Windows.Forms.Keys.RMenu\n                || e.KeyCode == System.Windows.Forms.Keys.F12)\n            {\n                e.Handled = true;\n                return;\n            }\n\n            if (this.replay != null && this.replay.IsAlive)\n            {\n                //this.labelDebug.Content = string.Format(\"{0}\", e.KeyCode);\n                return;\n            }\n\n            if (!this.isRecording)\n                return;\n\n            this.keys.Add(new KeyEvent\n            {\n                Type = EventType.KeyDown,\n                Code = (int)e.KeyCode,\n                Elapsed = this.stopwatch.ElapsedMilliseconds,\n            });\n\n            //this.ShowHistory();\n        }\n\n        void HookManager_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)\n        {\n            if (e.KeyCode == System.Windows.Forms.Keys.RMenu\n                || e.KeyCode == System.Windows.Forms.Keys.F12)\n            {\n                this.Replay();\n                e.Handled = true;\n                return;\n            }\n\n            if (this.replay != null && this.replay.IsAlive)\n            {\n                e.Handled = false;\n                return;\n            }\n\n            if (e.KeyCode == System.Windows.Forms.Keys.RControlKey)\n            {\n                this.SwitchRecording();\n                this.ShowHistory();\n                e.Handled = true;\n                return;\n            }\n\n            if (!this.isRecording)\n                return;\n\n            this.keys.Add(new KeyEvent\n            {\n                Type = EventType.KeyUp,\n                Code = (int)e.KeyCode,\n                Elapsed = this.stopwatch.ElapsedMilliseconds,\n            });\n\n            //this.ShowHistory();\n        }\n\n        private void HookManager_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)\n        {\n            if (this.replay != null && this.replay.IsAlive)\n            {\n                return;\n            }\n\n            if (!this.isRecording)\n                return;\n\n            this.keys.Add(new KeyEvent\n            {\n                Type = EventType.MouseDown,\n                Code = (int)e.Button,\n                X = e.X,\n                Y = e.Y,\n                Elapsed = this.stopwatch.ElapsedMilliseconds,\n            });\n        }\n\n        private void HookManager_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)\n        {\n            if (this.replay != null && this.replay.IsAlive)\n            {\n                return;\n            }\n\n            if (!this.isRecording)\n                return;\n\n            this.keys.Add(new KeyEvent\n            {\n                Type = EventType.MouseUp,\n                Code = (int)e.Button,\n                X = e.X,\n                Y = e.Y,\n                Elapsed = this.stopwatch.ElapsedMilliseconds,\n            });\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "Tools/KeyLogger/KeyLogger.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.25115.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"KeyLogger\", \"KeyLogger\\KeyLogger.csproj\", \"{EC788AB9-5BB2-4628-B4A5-66540790588E}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Gma.UserActivityMonitor\", \"Gma.UserActivityMonitor\\Gma.UserActivityMonitor.csproj\", \"{F52AA97E-180A-40ED-8F2B-09080171D6C7}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Debug|x86.Build.0 = Debug|x86\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Release|x86.ActiveCfg = Release|x86\n\t\t{EC788AB9-5BB2-4628-B4A5-66540790588E}.Release|x86.Build.0 = Release|x86\n\t\t{F52AA97E-180A-40ED-8F2B-09080171D6C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F52AA97E-180A-40ED-8F2B-09080171D6C7}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F52AA97E-180A-40ED-8F2B-09080171D6C7}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{F52AA97E-180A-40ED-8F2B-09080171D6C7}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F52AA97E-180A-40ED-8F2B-09080171D6C7}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F52AA97E-180A-40ED-8F2B-09080171D6C7}.Release|x86.ActiveCfg = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Tools/ProjectReferenceGraph/Program.cs",
    "content": "﻿using ProjectReferenceGraph;\n\nvar slnPath = args[0];\n\nwriteMermaid(new(slnPath));\n\nstatic void writeMermaid(Solution sln)\n{\n    Console.WriteLine(\"\"\"\n        ```mermaid\n        graph LR\n\n        \"\"\");\n\n    foreach (var p in sln.Projects)\n    {\n        foreach (var r in p.ProjectReferences)\n        {\n            Console.WriteLine($\"{p.Name} --> {r.Name}\");\n        }\n    }\n\n    Console.WriteLine(\"\"\"\n        ```\n        \"\"\");\n}\n"
  },
  {
    "path": "Tools/ProjectReferenceGraph/Project.cs",
    "content": "﻿using System.Text.RegularExpressions;\n\nnamespace ProjectReferenceGraph;\n\npublic partial class Project\n{\n    public Solution Solution { get; }\n    public string Name { get; }\n    public string FullPath { get; }\n\n    public Project(Solution solution, string name, string projectRelativePath)\n    {\n        Solution = solution;\n        Name = name;\n        FullPath = Path.GetFullPath(projectRelativePath, solution.Directory);\n    }\n\n    public string Directory => _directory ??= Path.GetDirectoryName(FullPath)!;\n    private string? _directory;\n\n    public IEnumerable<Project> ProjectReferences => _projectReferences ??= GetProjectReferences().ToArray();\n    private Project[]? _projectReferences;\n\n    private IEnumerable<Project> GetProjectReferences()\n    {\n        foreach (var projPath in GetProjectReferences(FullPath))\n        {\n            if (Solution.GetProjectFromFullPath(projPath) is { } p)\n                yield return p;\n        }\n    }\n\n    private static IEnumerable<string> GetProjectReferences(string fullPath)\n    {\n        var directory = Path.GetDirectoryName(fullPath)!;\n\n        var lines = File.ReadAllLines(fullPath);\n\n        // ProjectReference\n        var reg = ProjectReferenceRegex();\n        foreach (var line in lines)\n        {\n            var m = reg.Match(line);\n            if (!m.Success) continue;\n\n            var relativePath = m.Groups[\"path\"].Value;\n            var refFullPath = Path.GetFullPath(relativePath, directory);\n            yield return refFullPath;\n        }\n\n        // Import\n        reg = ImportRegex();\n        foreach (var line in lines)\n        {\n            var m = reg.Match(line);\n            if (!m.Success) continue;\n\n            var relativePath = m.Groups[\"path\"].Value;\n            var importFullPath = Path.GetFullPath(relativePath, directory);\n\n            foreach (var sub in GetProjectReferences(importFullPath))\n            {\n                yield return sub;\n            }\n        }\n    }\n\n    [RegexGenerator(\"\"\"\n        ProjectReference\\s+Include=\"(?<path>.*?)\"\n        \"\"\")]\n    public static partial Regex ProjectReferenceRegex();\n\n    [RegexGenerator(\"\"\"\n        Import\\s+Project=\"(?<path>.*?)\"\n        \"\"\")]\n    public static partial Regex ImportRegex();\n}\n"
  },
  {
    "path": "Tools/ProjectReferenceGraph/ProjectReferenceGraph.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net7.0</TargetFramework>\n    <LangVersion>preview</LangVersion>\n  </PropertyGroup>\n\n</Project>\n"
  },
  {
    "path": "Tools/ProjectReferenceGraph/ProjectReferenceGraph.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.3.32611.2\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"ProjectReferenceGraph\", \"ProjectReferenceGraph.csproj\", \"{9D68BDA5-D8DE-4B9F-959E-2D74831BD513}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{9D68BDA5-D8DE-4B9F-959E-2D74831BD513}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{9D68BDA5-D8DE-4B9F-959E-2D74831BD513}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{9D68BDA5-D8DE-4B9F-959E-2D74831BD513}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{9D68BDA5-D8DE-4B9F-959E-2D74831BD513}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {55044CBB-CBFD-4324-87DF-C1F2E6E2B97D}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Tools/ProjectReferenceGraph/Solution.cs",
    "content": "﻿using System.Text.RegularExpressions;\n\nnamespace ProjectReferenceGraph;\n\npublic partial class Solution\n{\n    public string FullPath { get; }\n\n    public Solution(string path)\n    {\n        FullPath = Path.GetFullPath(path);\n    }\n\n    public string Directory => _directory ??= Path.GetDirectoryName(FullPath)!;\n    private string? _directory;\n\n    public IEnumerable<Project> Projects => _projects ??= GetProjects(this).ToArray();\n    private Project[]? _projects;\n\n    private static IEnumerable<Project> GetProjects(Solution sln, string extension = \".csproj\")\n    {\n        var lines = File.ReadAllLines(sln.FullPath)\n            .Where(l => l.StartsWith(\"Project\") && l.Contains(extension));\n\n        var reg = ProjectRegex();\n\n        foreach (var line in lines)\n        {\n            var m = reg.Match(line);\n            yield return new(sln, m.Groups[\"name\"].Value, m.Groups[\"csproj\"].Value);\n        }\n    }\n\n    [RegexGenerator(\"\"\"\n        =\\s+\"(?<name>.*?)\",\\s+\"(?<csproj>.*?\\.csproj)\"\n        \"\"\")]\n    public static partial Regex ProjectRegex();\n\n    private Dictionary<string, Project>? _pathToProject;\n\n    public Project? GetProjectFromFullPath(string projectFullPath)\n    {\n        _pathToProject ??= Projects.ToDictionary(p => p.FullPath);\n        return _pathToProject.TryGetValue(projectFullPath, out var p) ? p : null;\n    }\n}\n"
  },
  {
    "path": "Tools/RoslynClassifier/readme.md",
    "content": "独立した public リポジトリに移動しました。\n\n[RoslynCsharpToHtml](https://github.com/ufcpp/RoslynCsharpToHtml)\n"
  },
  {
    "path": "Tools/SyntaxHighlighter/App.xaml",
    "content": "﻿<Application x:Class=\"SyntaxHighlighter.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n         \n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "Tools/SyntaxHighlighter/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Windows;\n\nnamespace SyntaxHighlighter\n{\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application\n    {\n    }\n}\n"
  },
  {
    "path": "Tools/SyntaxHighlighter/AsmFormatter.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Text;\n\nnamespace SyntaxHighlighter\n{\n    public class AsmFormatter\n    {\n        /// <summary>\n        /// IL/x86 コード用。\n        /// こいつはプレーンテキストで来ることを想定して、\n        /// ラベル、命令、コメントだけ色付け。\n        /// </summary>\n        public static string MakeHtml(string asmCode)\n        {\n            var sb = new StringBuilder();\n\n            var lines = asmCode.Split('\\n');\n\n            sb.Append(@\"<pre class=\"\"source\"\">\n<code>\");\n\n            foreach (var line in lines)\n            {\n                var trimmed = line.TrimEnd('\\r');\n                var token = trimmed.Split(' ');\n\n                if (token.Length < 2)\n                {\n                    sb.Append(trimmed);\n                    sb.Append(Environment.NewLine);\n                    continue;\n                }\n\n                sb.Append(\"<span style=\\\"color:purple\\\">\");\n                sb.Append(token[0]);\n                sb.Append(\"</span> <span style=\\\"color:blue\\\">\");\n                sb.Append(token[1]);\n                sb.Append(\"</span>\");\n                var hasComment = false;\n                foreach (var t in token.Skip(2))\n                {\n                    if (t == \"//\" || t == \";\")\n                    {\n                        hasComment = true;\n                        sb.Append(\"<span style=\\\"color:green\\\">\");\n                    }\n                    sb.Append(' ');\n                    sb.Append(t);\n                }\n                if (hasComment) sb.Append(\"</span>\");\n                sb.Append(Environment.NewLine);\n            }\n            sb.Append(\"</code></pre>\");\n\n            return sb.ToString();\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/SyntaxHighlighter/Color.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace SyntaxHighlighter\n{\n    /// <summary>\n    /// RGB。\n    /// System.Windows.Color とか使えばよかったかもしれない。\n    /// A が要らないから自作。\n    /// </summary>\n    [Serializable]\n    public struct Color\n    {\n        private uint v_;\n\n        public byte R\n        {\n            get { return (byte)((v_ >> 0) & 0xff); }\n            set { v_ = (v_ & 0x00ffff) | (((uint)value) << 0); }\n        }\n        public byte G\n        {\n            get { return (byte)((v_ >> 8) & 0xff); }\n            set { v_ = (v_ & 0x00ffff) | (((uint)value) << 8); }\n        }\n        public byte B\n        {\n            get { return (byte)((v_ >> 16) & 0xff); }\n            set { v_ = (v_ & 0x00ffff) | (((uint)value) << 16); }\n        }\n\n        public override bool Equals(object? obj)\n        {\n            if (!(obj is Color))\n                return false;\n            var other = (Color)obj;\n            return v_ == other.v_;\n        }\n\n        public override int GetHashCode()\n        {\n            return v_.GetHashCode();\n        }\n\n        public static bool operator ==(Color left, Color right) => left.Equals(right);\n        public static bool operator !=(Color left, Color right) => !(left == right);\n    }\n}\n"
  },
  {
    "path": "Tools/SyntaxHighlighter/HtmlParser.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace SyntaxHighlighter\n{\n    /// <summary>\n    /// HTML → ufcpp.net で使ってる XML に変換。\n    /// Productivity Power Tool が出力する HTML を読み込む。\n    /// 改行文字は &lt;br/&gt; タグになってる前提。\n    /// </summary>\n    /// <remarks>\n    /// https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.CopyAsHtml\n    /// こいつをインストールしてる前提。\n    /// </remarks>\n    internal class HtmlParser : IParser\n    {\n        public static IDictionary<string, string> ColorToTagNameCsharp = new Dictionary<string, string>\n        {\n            { \"blue\", \"reserved\" },\n            { \"green\", \"comment\" },\n            { \"#2b91af\", \"type\" },\n            { \"#a31515\", \"string\" },\n            { \"gray\", \"inactive\" },\n            { \"maroon\", \"string\" },\n            { \"#74531f\", \"method\" },\n            { \"#1f377f\", \"variable\" },\n            { \"#8f08c4\", \"control\" },\n        };\n\n        public static IDictionary<string, string> ColorToTagNameXml = new Dictionary<string, string>\n        {\n            { \"blue\", \"attvalue\" },\n            { \"red\", \"attribute\" },\n            { \"gray\", \"inactive\" },\n            { \"green\", \"comment\" },\n            { \"#2b91af\", \"xsl\" },\n            { \"#a31515\", \"element\" },\n        };\n\n        private readonly IDictionary<string, string> ColorToTagNameMap;\n\n        public HtmlParser(Mode mode)\n        {\n            if (mode == Mode.Csharp) ColorToTagNameMap = ColorToTagNameCsharp;\n            else if (mode == Mode.Xml) ColorToTagNameMap = ColorToTagNameXml;\n            else throw new InvalidOperationException();\n        }\n\n        private static readonly Regex regPre = new(@\"\\<pre(.|\\s)*?\\>(?<body>(.|\\s)*)\\</pre\", RegexOptions.Compiled | RegexOptions.Multiline);\n        private static readonly Regex regColorSpan = new(@\"\\<span style=\"\"color:(?<color>(.|\\s)*?);\"\">(?<body>(.|\\s)*?)\\</span\\>\", RegexOptions.Compiled | RegexOptions.Multiline);\n        private static readonly Regex regEmptySpan = new(@\"\\<span style=\"\"\"\">(?<body>(.|\\s)*?)\\</span\\>\", RegexOptions.Compiled | RegexOptions.Multiline);\n\n        public string Parse(string text)\n        {\n            var mBody = regPre.Match(text);\n            if (!mBody.Success)\n            {\n                return string.Empty;\n            }\n\n            string converted = mBody.Groups[\"body\"].Value\n                .Replace(\"font-weight:bold;\", \"\")\n                ;\n\n            converted = regColorSpan.Replace(converted, m =>\n            {\n                var c = m.Groups[\"color\"].Value;\n                var body = m.Groups[\"body\"].Value;\n                if (ColorToTagNameMap.TryGetValue(c, out var tag))\n                {\n                    return $\"<span class=\\\"{tag}\\\">{body}</span>\";\n                }\n                // VS 2019 から、エスケープシーケンスとかがかなりカラフルに表示されるようになった。\n                // そこまで class を用意するのもしんどいので、とりあえず素通しすることに。\n                return m.Value;\n            });\n\n            converted = regEmptySpan.Replace(converted, m => m.Groups[\"body\"].Value);\n\n            converted = converted\n                .Replace(\" <br/>\", Environment.NewLine)\n                .Replace(\"&nbsp;\", \" \")\n                .Replace(\"\\t\", \"    \")\n                .Replace(\"<br/>\", Environment.NewLine)\n                ;\n\n            return converted;\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/SyntaxHighlighter/MainWindow.xaml",
    "content": "﻿<Window x:Class=\"SyntaxHighlighter.MainWindow\"\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        Title=\"Visual Studio からソースをコピぺしてね\" Height=\"350\" Width=\"525\">\n    <Window.CommandBindings>\n        <CommandBinding Command=\"ApplicationCommands.Paste\" Executed=\"CommandBinding_Executed\" />\n    </Window.CommandBindings>\n    <DockPanel>\n        <StackPanel Orientation=\"Horizontal\" DockPanel.Dock=\"Bottom\">\n            <Button Content=\"貼り付け\" Click=\"Button_Click\" Padding=\"10 2 10 2\" Margin=\"2\"/>\n            <ComboBox x:Name=\"comboType\" ItemsSource=\"{Binding}\" SelectedIndex=\"0\" Width=\"60\" Margin=\"2\">\n                <ComboBox.ItemTemplate>\n                    <DataTemplate>\n                        <TextBlock Text=\"{Binding Name}\" />\n                    </DataTemplate>\n                </ComboBox.ItemTemplate>\n            </ComboBox>\n        </StackPanel>\n        <TextBox x:Name=\"block\" />\n    </DockPanel>\n</Window>\n"
  },
  {
    "path": "Tools/SyntaxHighlighter/MainWindow.xaml.cs",
    "content": "﻿using System;\nusing System.Windows;\nusing System.Windows.Input;\n\nnamespace SyntaxHighlighter\n{\n    public partial class MainWindow\n    {\n        public MainWindow()\n        {\n            InitializeComponent();\n\n            DataContext = new[]\n            {\n                Mode.Csharp,\n                Mode.Xml,\n                Mode.Asm,\n            };\n        }\n\n        private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)\n        {\n            ParseClipboard();\n        }\n\n        private void ParseClipboard()\n        {\n            var data = Clipboard.GetDataObject();\n\n            var mode = (Mode)comboType.SelectedItem;\n\n            var converted = Parse(data, mode);\n\n            if (converted != null)\n            {\n                var tag = mode.Tag;\n\n                var source = string.Format(\"<pre class=\\\"{0}\\\" title=\\\"\\\">{1}<code>{2}{3}</code></pre>\",\n                        tag,\n                        Environment.NewLine,\n                        converted,\n                        Environment.NewLine);\n\n                block.Text = source;\n                Clipboard.SetDataObject(source);\n            }\n        }\n\n        private static string? Parse(IDataObject data, Mode mode)\n        {\n#pragma warning disable IDE0059\n            var xxx = data.GetFormats();\n            var yyy = data.GetData(DataFormats.Text);\n#pragma warning restore IDE0059\n\n            if (mode == Mode.Asm)\n            {\n                if (data.GetData(DataFormats.Text) is string text)\n                {\n                    return AsmFormatter.MakeHtml(text);\n                }\n                return null;\n            }\n\n            if (data.GetData(DataFormats.Html) is string html)\n            {\n                var p = new HtmlParser(mode);\n                return p.Parse(html);\n            }\n\n            if (data.GetData(DataFormats.Rtf) is string rtf)\n            {\n                var p = new RtfParser(mode);\n                return p.Parse(rtf);\n            }\n\n            return null;\n        }\n\n        private void Button_Click(object sender, RoutedEventArgs e)\n        {\n            ParseClipboard();\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/SyntaxHighlighter/Mode.cs",
    "content": "﻿namespace SyntaxHighlighter\n{\n    public class Mode\n    {\n        public string Name { get; }\n        public string Tag { get; }\n        private Mode(string name, string tag) => (Name, Tag) = (name, tag);\n\n        public static readonly Mode Csharp = new Mode(\"C#\", \"source\");\n        public static readonly Mode Xml = new Mode(\"XML\", \"xsource\");\n        public static readonly Mode Asm = new Mode(\"Asm\", \"source\");\n    }\n}\n"
  },
  {
    "path": "Tools/SyntaxHighlighter/RtfParser.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Text.RegularExpressions;\n\nnamespace SyntaxHighlighter\n{\n    internal interface IParser\n    {\n        string Parse(string text);\n    }\n\n    /// <summary>\n    /// 簡易 RTF パーサー。\n    /// ぶっちゃけ、Visual Studio のテキストエディターが出力する RTF 以外対応する気まるでなし。\n    /// </summary>\n    internal class RtfParser : IParser\n    {\n        #region public メソッド\n\n        /// <summary>\n        /// Visual Studio のソースエディターからコピった RTF 文章を、ufcpp で使ってる XML 形式に変換する。\n        /// </summary>\n        /// <param name=\"text\">RTF 文章</param>\n        /// <returns>XML 化したもの</returns>\n        public string Parse(string text)\n        {\n            ReadHeader(text);\n            return TagReplace(text);\n        }\n\n        #endregion\n        #region 変換に使う設定\n\n        public static IDictionary<Color, string> ColorToTagNameCsharp = new Dictionary<Color, string>\n        {\n            { new Color { R =   0, G =   0, B = 255}, \"reserved\" },\n            { new Color { R = 128, G = 128, B = 128}, \"inactive\" },\n            { new Color { R =   0, G = 128, B =   0}, \"comment\" },\n            { new Color { R =  43, G = 145, B = 175}, \"type\" },\n            { new Color { R = 163, G =  21, B =  21}, \"string\" },\n            { new Color { R = 165, G =  42, B =  42}, \"literal\" },\n        };\n\n        public static IDictionary<Color, string> ColorToTagNameXml = new Dictionary<Color, string>\n        {\n            { new Color { R =   0, G =   0, B = 255}, \"attvalue\" },\n            { new Color { R = 255, G =   0, B =   0}, \"attribute\" },\n            { new Color { R = 128, G = 128, B = 128}, \"inactive\" },\n            { new Color { R =   0, G = 128, B =   0}, \"comment\" },\n            { new Color { R =  43, G = 145, B = 175}, \"xsl\" },\n            { new Color { R = 163, G =  21, B =  21}, \"element\" },\n        };\n\n        public RtfParser(Mode mode)\n        {\n            if (mode == Mode.Csharp) ColorToTagNameMap = ColorToTagNameCsharp;\n            else if (mode == Mode.Xml) ColorToTagNameMap = ColorToTagNameXml;\n            else throw new InvalidOperationException();\n        }\n\n        /// <summary>\n        /// 色と XML タグの対応表。\n        /// </summary>\n        private readonly IDictionary<Color, string> ColorToTagNameMap;\n\n        // ↑シリアライズできるようにしといた方がいいかも。\n\n        #endregion\n        #region 処理本体\n        #region ヘッダー\n\n        /// <summary>\n        /// RTF の {\\colortbl ...} を抽出。\n        /// </summary>\n        private readonly Regex regColortbl = new Regex(@\"\\{\\\\colortbl\\s*;(?<items>.*?)\\}\", RegexOptions.Compiled);\n\n        /// <summary>\n        /// RTF の {\\colortbl ...} の中身から色情報を抽出。\n        /// </summary>\n        private readonly Regex regColortblItem = new Regex(@\"\\\\red(?<r>\\d*)\\\\green(?<g>\\d*)\\\\blue(?<b>\\d*)\", RegexOptions.Compiled);\n\n        /// <summary>\n        /// RTF のヘッダー情報を読み込む。\n        /// </summary>\n        /// <param name=\"text\">RTF</param>\n        private void ReadHeader(string text)\n        {\n            var m = regColortbl.Match(text);\n            var items = m.Groups[\"items\"].Value;\n\n            m = regColortblItem.Match(items);\n\n            List<Color> colors = new List<Color>();\n            for (int i = 0; m.Success; m = m.NextMatch(), ++i)\n            {\n                colors.Add(new Color\n                {\n                    R = byte.Parse(m.Groups[\"r\"].Value),\n                    G = byte.Parse(m.Groups[\"g\"].Value),\n                    B = byte.Parse(m.Groups[\"b\"].Value),\n                });\n            }\n\n            colorTable_ = new string[colors.Count + 1];\n            for (int i = 0; i < colors.Count; i++)\n            {\n                if (ColorToTagNameMap.ContainsKey(colors[i]))\n                    colorTable_[i + 1] = ColorToTagNameMap[colors[i]];\n            }\n        }\n\n        #endregion\n        #region 単純な置き換え用の正規表現\n\n        /// <summary>\n        /// VS のはきだす RTF は日本語が \\input2\\u***** ** みたいな変な状態になってるのでそれをもとに戻す。\n        /// </summary>\n        private readonly Regex regU = new Regex(@\"\\\\uinput2\\\\u(?<code>-?\\d*)\\s..\", RegexOptions.Compiled);\n\n        private string DecodeU(Match m)\n        {\n            return new string((char)int.Parse(m.Groups[\"code\"].Value), 1);\n        }\n\n        /// <summary>\n        /// 改行文字のところが \\par になってるので、それを抽出。\n        /// </summary>\n        private readonly Regex regPar = new Regex(@\"(?<=[^\\\\])\\\\par\\s?\", RegexOptions.Compiled);\n\n        /// <summary>\n        /// 末尾の空白。\n        /// </summary>\n        private readonly Regex regTailWhite = new Regex(@\"\\s*$\", RegexOptions.Singleline | RegexOptions.Compiled);\n\n        /// <summary>\n        /// 未対応のタグ削除用。\n        /// </summary>\n        private readonly Regex regOther = new Regex(@\"\\\\\\w+\\s\", RegexOptions.Singleline | RegexOptions.Compiled);\n\n        #endregion\n        #region RTF の \\cf* → XML タグ\n\n        /// <summary>\n        /// RTF の \\cf* の色番号をどの XML タグに変換するかの一覧。\n        /// </summary>\n        private string[]? colorTable_;\n\n        private string GetTag(Match m)\n        {\n            var i = GetCfNumber(m);\n            System.Diagnostics.Debug.Assert(colorTable_ is not null);\n            var tag = colorTable_[i];\n            return tag;\n        }\n\n        private static int GetCfNumber(Match m)\n        {\n            var i = int.Parse(m.Groups[\"n\"].Value);\n            return i;\n        }\n\n        #endregion\n        #region 本文\n\n        /// <summary>\n        /// RTF のうち、文章本体を抽出。\n        /// </summary>\n        private readonly Regex regBody = new Regex(@\"\\\\f0\\s*\\\\fs\\d*\\s?(?<body>.*?)(?<=[^\\\\])\\}\", RegexOptions.Singleline | RegexOptions.Compiled);\n        private string? prevTag_ = null;\n\n        /// <summary>\n        /// &lt; &gt; &amp; にしたり、\n        /// \\par を消したり、\n        /// \\cf* を XML タグに変換したり。\n        /// </summary>\n        /// <param name=\"text\">変換元</param>\n        /// <returns>変換結果</returns>\n        private string TagReplace(string text)\n        {\n            text = regU.Replace(text, DecodeU);\n            var body = regBody.Match(text).Groups[\"body\"].Value;\n\n            body = body.Replace(\"&\", \"&amp;\");\n            body = body.Replace(\"<\", \"&lt;\");\n            body = body.Replace(\">\", \"&gt;\");\n            body = regPar.Replace(body, Environment.NewLine);\n            body = body.Replace(@\"\\{\", \"{\");\n            body = body.Replace(@\"\\}\", \"}\");\n\n            body = regCf.Replace(body, InsertTag);\n            body = regPairTag1.Replace(body, RemoveWhiteSpaceElement);\n            body = regPairTag2.Replace(body, RemoveWhiteSpaceElement);\n            body = regTailWhite.Replace(body, \"\");\n            body = ReplaceUnicodeEscape(body);\n            body = regOther.Replace(body, \"\");\n\n            body = body.Replace(@\"\\\\\", @\"\\\");\n\n            return body;\n        }\n\n        #endregion\n        #region Unicode Escape\n\n        private static readonly Regex regUnicodeEscape = new Regex(@\"\\\\uc1\\\\u(?<code>-?\\d+)\\?\", RegexOptions.Singleline | RegexOptions.Compiled);\n\n        private static string ReplaceUnicodeEscape(string s)\n        {\n            return regUnicodeEscape.Replace(s, ReplaceUnicodeEscape);\n        }\n\n        private static string ReplaceUnicodeEscape(Match m)\n        {\n            var code = int.Parse(m.Groups[\"code\"].ToString());\n            if (code < 0) code += 65536; // サロゲートペア文字の時、なぜかマイナスの値になってるっぽい。65536足したらちゃんとした Unicode (UTF16)になるみたい。\n            return ((char)code).ToString();\n        }\n\n        #endregion\n        #region 空白の除去\n\n        /// <summary>\n        /// <![CDATA[\n        /// <tag>   </tag>\n        /// ]]>\n        /// みたいな構造を抽出。\n        /// </summary>\n        private readonly Regex regPairTag1 = new Regex(@\"<(?<open>[^>]*?)>(?<content>\\s*?)</(?<close>[^>]*?)>\", RegexOptions.Singleline | RegexOptions.Compiled);\n\n        /// <summary>\n        /// <![CDATA[\n        /// </tag>   <tag>\n        /// ]]>\n        /// みたいな構造を抽出。\n        /// </summary>\n        private readonly Regex regPairTag2 = new Regex(@\"</(?<close>[^>]*?)>(?<content>\\s*?)<(?<open>[^>]*?)>\", RegexOptions.Singleline | RegexOptions.Compiled);\n\n        /// <summary>\n        /// 中に空白文字しかないタグを消す。\n        /// </summary>\n        /// <param name=\"m\">マッチ結果</param>\n        /// <returns>変換結果</returns>\n        private string RemoveWhiteSpaceElement(Match m)\n        {\n            if (m.Groups[\"open\"].Value == m.Groups[\"close\"].Value)\n                return m.Groups[\"content\"].Value;\n            else\n                return m.Value;\n        }\n\n        #endregion\n        #region \\cf → XML タグ\n\n        /// <summary>\n        /// RTF の \\cf* を抽出。\n        /// </summary>\n        private static readonly Regex regCf = new Regex(@\"(^|(?<=[^\\\\]))\\\\cf(?<n>\\d+)? \", RegexOptions.Singleline | RegexOptions.Compiled);\n\n\n\n        /// <summary>\n        /// RTF の \\cf* を XML タグに置き換える。\n        /// </summary>\n        /// <param name=\"m\">マッチ結果</param>\n        /// <returns>変換結果</returns>\n        private string InsertTag(Match m)\n        {\n            var tag = GetTag(m);\n\n            string ret;\n\n            if (string.IsNullOrEmpty(prevTag_))\n                if (string.IsNullOrEmpty(tag))\n                    ret = string.Empty;\n                else\n                    ret = FormatTag(tag);\n            else\n                if (string.IsNullOrEmpty(tag))\n                    ret = \"</span>\";\n                else\n                    ret = \"</span>\" + FormatTag(tag);\n\n            prevTag_ = tag;\n            return ret;\n        }\n\n        private static string FormatTag(string tag) => string.Format(\"<span class=\\\"{0}\\\">\", tag);\n\n        #endregion\n        #endregion\n    }\n}\n"
  },
  {
    "path": "Tools/SyntaxHighlighter/SyntaxHighlighter.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>WinExe</OutputType>\n    <TargetFramework>net6.0-windows</TargetFramework>\n    <UseWPF>true</UseWPF>\n  </PropertyGroup>\n\n</Project>"
  },
  {
    "path": "Tools/Tools.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.22129.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"SyntaxHighlighter\", \"SyntaxHighlighter\\SyntaxHighlighter.csproj\", \"{EF01F61E-FB41-4578-9F21-0B86DE28C40C}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{EF01F61E-FB41-4578-9F21-0B86DE28C40C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{EF01F61E-FB41-4578-9F21-0B86DE28C40C}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{EF01F61E-FB41-4578-9F21-0B86DE28C40C}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{EF01F61E-FB41-4578-9F21-0B86DE28C40C}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Tools/UnicodeService/UnicodeService/Pages/Extensions.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Text;\n\nnamespace UnicodeService.Pages\n{\n    public static class Extensions\n    {\n        public static IEnumerable<(bool first, T item)> IsFirst<T>(this IEnumerable<T> source)\n        {\n            bool first = true;\n            foreach (var item in source)\n            {\n                yield return (first, item);\n                first = false;\n            }\n        }\n\n        public static byte[] GetBytes(this string s) => Encoding.UTF8.GetBytes(s);\n\n        public static string Hex(this byte x) => x.ToString(\"X\");\n        public static string Hex(this uint x) => x.ToString(\"X\");\n    }\n}\n"
  },
  {
    "path": "Tools/UnicodeService/UnicodeService/Pages/Grapheme.cshtml",
    "content": "﻿@page\n@{\n    Layout = null;\n}\n@using GraphemeSplitter;\n@using UnicodeService.Pages;\n\n@functions\n{\n    public string Text { get; private set; }\n    public string[] SplittedTexts { get; private set; }\n\n    public void OnGet(string s)\n    {\n        if (s == null) return;\n\n        Text = s;\n        SplittedTexts = s.GetGraphemes()\n            .Select(x => x.ToString())\n            .ToArray();\n    }\n}\n\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"~/css/site.css\" />\n    <title>Grapheme Splitter</title>\n</head>\n<body>\n\n    <form method=\"GET\" action=\"Grapheme\">\n        <label>characters:</label>\n        <input type=\"text\" name=\"s\" />\n        <input type=\"submit\" value=\"OK\" />\n    </form>\n\n    @if (Model.Text == null)\n    {\n        <p>\n            Split Unicode text into grapheme clusters.\n            Powered by: <a href=\"https://github.com/ufcpp/GraphemeSplitter\">GraphemeSplitter</a>\n        </p>\n        <p>\n            samples:\n        </p>\n        <ul>\n            <li><a href=\"?s=🐁🐄🐅🐇🐊🐍🐎🐏🐒🐓🐕🐖\">🐁🐄🐅🐇🐊🐍🐎🐏🐒🐓🐕🐖</a></li>\n            <li><a href=\"?s=👨‍👨‍👧‍👦👩‍👩‍👧‍👦👨‍👨‍👧‍👦\">👨‍👨‍👧‍👦👩‍👩‍👧‍👦👨‍👨‍👧‍👦</a></li>\n            <li><a href=\"?s=👩🏻‍👦🏼👨🏽‍👦🏾‍👦🏿👩🏼‍👨🏽‍👦🏼‍👧🏽👩🏻‍👩🏿‍👧🏼‍👧🏾\">👩🏻‍👦🏼👨🏽‍👦🏾‍👦🏿👩🏼‍👨🏽‍👦🏼‍👧🏽👩🏻‍👩🏿‍👧🏼‍👧🏾</a></li>\n            <li><a href=\"?s=👩🏻‍🌾👨🏼‍💼👩🏽‍💻👨🏾‍🏫👩🏿‍🚀\">👩🏻‍🌾👨🏼‍💼👩🏽‍💻👨🏾‍🏫👩🏿‍🚀</a></li>\n            <li><a href=\"?s=à̠b̡́ĉ̢ḍ̃ē̤\">à̠b̡́ĉ̢ḍ̃ē̤</a></li>\n            <li><a href=\"?s=%23️⃣%2A️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣\">#️⃣*️⃣0️⃣1️⃣2️⃣3️⃣4️⃣5️⃣6️⃣7️⃣8️⃣9️⃣</a></li>\n            <li><a href=\"?s=(´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥｀)\">(´°̥̥̥̥̥̥̥̥ω°̥̥̥̥̥̥̥̥｀)</a></li>\n            <li><a href=\"?s=नमस्ते\">नमस्ते</a></li>\n            <li><a href=\"?s=안녕하세요\">안녕하세요</a></li>\n            <li><a href=\"?s=あ゙か゚\">あ゙か゚</a></li>\n            <li><a href=\"?s=斎斎󠄁葛󠄀葛󠄁真真󠄁\">斎斎󠄁葛󠄀葛󠄁真真󠄁</a></li>\n        </ul>\n    }\n    else\n    {\n        <p>\n            original text: @Model.Text\n        </p>\n        <table border=\"1\">\n            <caption>graphemes</caption>\n            <tr>\n                <th>grapheme</th>\n                <th>UTF-32 sequence</th>\n                <th>UTF-16/UTF-8 sequence</th>\n            </tr>\n            @foreach (var grapheme in Model.SplittedTexts)\n            {\n                var bytes = grapheme.GetBytes();\n                <tr>\n                    <td rowspan=\"2\">@grapheme</td>\n                    <td>\n                        @foreach (var (first, (index, count, _)) in grapheme.GetCodePoints().IsFirst())\n                        {\n                            if (!first)\n                            {<span>&#8204; / &#8204;</span>}\n                            @grapheme.Substring(index, count)\n                        }\n                    </td>\n                    <td>@string.Join(\" \", grapheme.Select(c => ((uint)c).Hex()))</td>\n                </tr>\n                <tr>\n                    <td>\n                        @foreach (var (first, (_, _, cp)) in grapheme.GetCodePoints().IsFirst())\n                        {\n                            if (!first)\n                            {<span> </span>}\n                            var hex = cp.Hex();\n                            <a href=\"https://www.google.co.jp/search?q=U%2B@(hex)\">@hex</a>\n                        }\n                    </td>\n                    <td>@string.Join(\" \", bytes.Select(c => c.Hex())) (@bytes.Length bytes)</td>\n                </tr>\n            }\n        </table>\n    }\n</body>\n</html>\n"
  },
  {
    "path": "Tools/UnicodeService/UnicodeService/Pages/Index.cshtml",
    "content": "﻿@page\n@{\n    Layout = null;\n}\n\n<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\" />\n    <link rel=\"stylesheet\" href=\"~/css/site.css\" />\n</head>\n<body>\n    <p>pages</p>\n    <ul>\n        <li><a href=\"Grapheme\">Grapheme Splitter</a></li>\n    </ul>\n\n    <p>source code: <a href=\"https://github.com/ufcpp/UfcppSample/tree/master/Tools/UnicodeService\">UfcppSample</a></p>\n</body>\n</html>\n"
  },
  {
    "path": "Tools/UnicodeService/UnicodeService/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.AspNetCore;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.Logging;\n\nnamespace UnicodeService\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            BuildWebHost(args).Run();\n        }\n\n        public static IWebHost BuildWebHost(string[] args) =>\n            WebHost.CreateDefaultBuilder(args)\n                .UseStartup<Startup>()\n                .Build();\n    }\n}\n"
  },
  {
    "path": "Tools/UnicodeService/UnicodeService/Properties/launchSettings.json",
    "content": "{\n  \"iisSettings\": {\n    \"windowsAuthentication\": false,\n    \"anonymousAuthentication\": true,\n    \"iisExpress\": {\n      \"applicationUrl\": \"http://localhost:62792/\",\n      \"sslPort\": 0\n    }\n  },\n  \"profiles\": {\n    \"IIS Express\": {\n      \"commandName\": \"IISExpress\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      }\n    },\n    \"UnicodeService\": {\n      \"commandName\": \"Project\",\n      \"launchBrowser\": true,\n      \"environmentVariables\": {\n        \"ASPNETCORE_ENVIRONMENT\": \"Development\"\n      },\n      \"applicationUrl\": \"http://localhost:62793/\"\n    }\n  }\n}\n"
  },
  {
    "path": "Tools/UnicodeService/UnicodeService/Startup.cs",
    "content": "﻿using Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace UnicodeService\n{\n    public class Startup\n    {\n        public Startup(IConfiguration configuration)\n        {\n            Configuration = configuration;\n        }\n\n        public IConfiguration Configuration { get; }\n\n        // This method gets called by the runtime. Use this method to add services to the container.\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddMvc();\n        }\n\n        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.\n        public void Configure(IApplicationBuilder app, IHostingEnvironment env)\n        {\n            if (env.IsDevelopment())\n            {\n                app.UseDeveloperExceptionPage();\n            }\n            else\n            {\n                app.UseExceptionHandler(\"/Error\");\n            }\n\n            app.UseStaticFiles();\n\n            app.UseMvc(routes =>\n            {\n                routes.MapRoute(\n                    name: \"default\",\n                    template: \"{controller}/{action=Index}/{id?}\");\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "Tools/UnicodeService/UnicodeService/UnicodeService.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk.Web\">\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.1</TargetFramework>\n    <UserSecretsId>89c35890-905a-421b-b335-8fdd0859397c</UserSecretsId>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageReference Include=\"GraphemeSplitter\" Version =\"1.0.1\"/>\n    <PackageReference Include=\"Microsoft.AspNetCore.App\" />\n    <PackageReference Include=\"Microsoft.AspNetCore.Razor.Design\" Version=\"2.1.2\" PrivateAssets=\"All\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "Tools/UnicodeService/UnicodeService/appsettings.Development.json",
    "content": "﻿{\n  \"Logging\": {\n    \"IncludeScopes\": false,\n    \"LogLevel\": {\n      \"Default\": \"Debug\",\n      \"System\": \"Information\",\n      \"Microsoft\": \"Information\"\n    }\n  }\n}\n"
  },
  {
    "path": "Tools/UnicodeService/UnicodeService/appsettings.json",
    "content": "﻿{\n  \"Logging\": {\n    \"IncludeScopes\": false,\n    \"LogLevel\": {\n      \"Default\": \"Warning\"\n    }\n  }\n}\n"
  },
  {
    "path": "Tools/UnicodeService/UnicodeService/wwwroot/css/site.css",
    "content": "body {\n    padding-top: 10px;\n    padding-bottom: 10px;\n}\n\ntable {\n    border: 1px solid gray;\n}\n"
  },
  {
    "path": "Tools/UnicodeService/UnicodeService.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27019.1\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"UnicodeService\", \"UnicodeService\\UnicodeService.csproj\", \"{93DFC3C9-B3EE-44A6-A2E4-E1BA3C63A906}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{93DFC3C9-B3EE-44A6-A2E4-E1BA3C63A906}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{93DFC3C9-B3EE-44A6-A2E4-E1BA3C63A906}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{93DFC3C9-B3EE-44A6-A2E4-E1BA3C63A906}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{93DFC3C9-B3EE-44A6-A2E4-E1BA3C63A906}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {C1A4CAD5-A0CE-4338-9EF2-A57F3E920471}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Tools/UnicodeService/readme.md",
    "content": "http://ufcppfree.azurewebsites.net でホスト。"
  },
  {
    "path": "_config.yml",
    "content": "theme: jekyll-theme-minimal"
  },
  {
    "path": "docs/canvas-fill-text.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n<title>テキスト Canvas レンダリング</title>\n<script src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js\"></script>\n</head>\n<body>\n\n    <table title=\"テキストを Canvas にレンダリングします\">\n        <tr>\n            <td title=\"レンダリングしたい文字を直接入力します\">直接入力</td>\n            <td><input type=\"text\" id=\"rawText\" size=\"70\" onfocus=\"this.select()\" value=\"👨‍👩‍👧‍👦\"></td>\n            <td><input type=\"button\" id=\"rawButton\" value=\"run\"></td>\n        </tr>\n        <tr title=\"スペース区切りの16進数でコードポイントを並べて入力します\">\n            <td>コードポイント</td>\n            <td><input type=\"text\" id=\"cpText\" size=\"70\" onfocus=\"this.select()\" value=\"\"></td>\n            <td><input type=\"button\" id=\"cpButton\" value=\"run\"></td>\n        </tr>\n    </table>\n    <div title=\"Canvas 背景を transparent にしてあるので、「画像をコピー」で透過画像化できます\">\n        <canvas id=\"canvas\" width=\"150\" height=\"120\" style=\"background-color: transparent; padding: 0; margin: 0; font-size: 80px;\"></canvas>\n    </div>\n\n    <script>\n        var canvas = document.getElementById('canvas');\n        var context = canvas.getContext('2d');\n        context.font = \"80px sans-serif\";\n\n        function runRaw(){\n            var raw = $(\"#rawText\").val();\n            var codePoints = [...raw];\n\n            var encoded = \"\";\n            codePoints.forEach(x => {\n                if (encoded != \"\") { encoded += ' '; }\n                encoded += x.codePointAt().toString(16);\n            });\n\n            context.clearRect(0, 0, 150, 120);\n            context.fillText(raw, 0, 90);\n\n            $(\"#cpText\").val(encoded);\n        }\n\n        function runCp(){\n            var s = $(\"#cpText\").val();\n            var seq = s.split(' ');\n            var codePoints = [];\n\n            seq.forEach(x => {\n                codePoints.push(parseInt(x, 16));\n            });\n            var decoded = String.fromCodePoint(...codePoints);\n\n            context.clearRect(0, 0, 150, 120);\n            context.fillText(decoded, 0, 90);\n\n            $(\"#rawText\").val(decoded);\n        }\n\n        $(\"#rawText\").keydown(() => { if( window.event.keyCode == 13 ) { runRaw(); } });\n        $(\"#cpText\").keydown(() => { if( window.event.keyCode == 13 ) { runCp(); } });\n        $(\"#rawButton\").click(runRaw);\n        $(\"#cpButton\").click(runCp);\n\n        runRaw();\n    </script>\n</body>\n</html>\n"
  }
]